diff --git a/configure.ac b/configure.ac
index a180abc..e44f280 100644
--- a/configure.ac
+++ b/configure.ac
@@ -35,28 +35,26 @@ FOLKS_REQUIRED=0.1.15
 GCONF_REQUIRED=1.2.0
 GLIB_REQUIRED=2.25.9
 GNUTLS_REQUIRED=2.8.5
-GTK_REQUIRED=2.22.0
+GTK_REQUIRED=2.90.8
 KEYRING_REQUIRED=2.26.0
 LIBCANBERRA_GTK_REQUIRED=0.4
-LIBNOTIFY_REQUIRED=0.4.4
-LIBNOTIFY_REQUIRED_GTK3=0.5.1
+LIBNOTIFY_REQUIRED=0.5.1
 TELEPATHY_FARSIGHT_REQUIRED=0.0.14
 TELEPATHY_GLIB_REQUIRED=0.11.16
 TELEPATHY_LOGGER=0.1.5
 UNIQUE_REQUIRED=1.1.2
 
 # Optionnal deps
-CLUTTER_GTK_REQUIRED=0.10
+CLUTTER_GTK_REQUIRED=0.90.3
 ENCHANT_REQUIRED=1.2.0
 GEOCLUE_REQUIRED=0.11
 ISO_CODES_REQUIRED=0.35
 LIBCHAMPLAIN_GTK_REQUIRED=0.7.1
 LIBCHAMPLAIN_REQUIRED=0.7.1
-NAUTILUS_SENDTO_REQUIRED=2.31.7
-NAUTILUS_SENDTO_REQUIRED_GTK3=2.90.0
+NAUTILUS_SENDTO_REQUIRED=2.90.0
 NETWORK_MANAGER_REQUIRED=0.7.0
 WEBKIT_REQUIRED=1.1.15
-GNOME_CONTROL_CENTER_GTK3_REQUIRED=2.31.4
+GNOME_CONTROL_CENTER_REQUIRED=2.31.4
 
 # Use --enable-maintainer-mode to disable deprecated symbols,
 # disable single include and enable GSEAL. If this is not a released empathy,
@@ -180,47 +178,12 @@ fi
 # -----------------------------------------------------------
 # GTK+
 # -----------------------------------------------------------
-AC_ARG_ENABLE(gtk3,
-              AS_HELP_STRING([--enable-gtk3=@<:@no/yes/auto@:>@],
-                             [build with GTK+3]), ,
-                             enable_gtk3=auto)
-
-# Try to use GTK+3 if available
-if test "x$enable_gtk3" != "xno"; then
-   PKG_CHECK_MODULES(GTK,
-   [
-      gtk+-3.0 >= $GTK_REQUIRED
-   ], have_gtk3="yes", have_gtk3="no")
-else
-   have_gtk3="no"
-fi
-
-if test "x$enable_gtk3" = "xyes" -a "x$have_gtk3" != "xyes"; then
-   AC_MSG_ERROR([Could not find gtk3 dependencies.])
-fi
-
-if test "x$have_gtk3" == "xyes"; then
-   # GTK3 specific deps
-   PKG_CHECK_MODULES(CANBERRA, libcanberra-gtk3 >= $LIBCANBERRA_GTK_REQUIRED)
-   PKG_CHECK_MODULES(LIBNOTIFY, libnotify >= $LIBNOTIFY_REQUIRED_GTK3)
-   PKG_CHECK_MODULES(UNIQUE, unique-3.0 >= $UNIQUE_REQUIRED)
-   PKG_CHECK_MODULES(GCR, gcr-3 >= $KEYRING_REQUIRED)
-
-   AC_DEFINE(HAVE_GTK3, 1, [Define if we're compiling against GTK+ 3])
-else
-   PKG_CHECK_MODULES(GTK, gtk+-2.0 >= $GTK_REQUIRED)
-
-   # GTK2 specific deps
-   PKG_CHECK_MODULES(CANBERRA, libcanberra-gtk >= $LIBCANBERRA_GTK_REQUIRED)
-   PKG_CHECK_MODULES(LIBNOTIFY, libnotify >= $LIBNOTIFY_REQUIRED)
-   PKG_CHECK_MODULES(UNIQUE, unique-1.0 >= $UNIQUE_REQUIRED)
-   PKG_CHECK_MODULES(GCR, gcr-0 >= $KEYRING_REQUIRED)
+PKG_CHECK_MODULES(GTK, gtk+-3.0 >= $GTK_REQUIRED)
 
-   # Enable GSEAL checks if needed
-   if test $USE_MAINTAINER_MODE = yes; then
-      AC_DEFINE(GSEAL_ENABLE, [], [Seal public structs to force usage of accessors])
-   fi
-fi
+PKG_CHECK_MODULES(CANBERRA, libcanberra-gtk3 >= $LIBCANBERRA_GTK_REQUIRED)
+PKG_CHECK_MODULES(LIBNOTIFY, libnotify >= $LIBNOTIFY_REQUIRED)
+PKG_CHECK_MODULES(UNIQUE, unique-3.0 >= $UNIQUE_REQUIRED)
+PKG_CHECK_MODULES(GCR, gcr-3 >= $KEYRING_REQUIRED)
 
 # -----------------------------------------------------------
 # Enable debug
@@ -301,14 +264,8 @@ AC_ARG_ENABLE(webkit,
                              enable_webkit=auto)
 
 if test "x$enable_webkit" != "xno"; then
-
-   if test "x$have_gtk3" == "xno"; then
-      PKG_CHECK_MODULES(WEBKIT, [webkit-1.0 >= $WEBKIT_REQUIRED],
-          have_webkit="yes", have_webkit="no")
-   else
-      PKG_CHECK_MODULES(WEBKIT, [webkitgtk-3.0 >= $WEBKIT_REQUIRED],
-          have_webkit="yes", have_webkit="no")
-   fi
+   PKG_CHECK_MODULES(WEBKIT, [webkitgtk-3.0 >= $WEBKIT_REQUIRED],
+        have_webkit="yes", have_webkit="no")
 
    if test "x$have_webkit" = "xyes"; then
       AC_DEFINE(HAVE_WEBKIT, 1, [Define if you have libwebkitgtk])
@@ -370,17 +327,13 @@ AC_ARG_ENABLE(map,
 
 if test "x$enable_map" != "xno"; then
 
-   if test "x$have_gtk3" == "xno"; then
-      PKG_CHECK_MODULES(LIBCHAMPLAIN,
-      [
-         champlain-0.8 >= $LIBCHAMPLAIN_REQUIRED,
-         champlain-gtk-0.8 >= $LIBCHAMPLAIN_GTK_REQUIRED
-         clutter-gtk-0.10 >= $CLUTTER_GTK_REQUIRED
-      ], have_libchamplain="yes", have_libchamplain="no")
-   else
-      # FIXME: check deps once clutter-gtk and champlain have been ported to GTK3
-      have_libchamplain="no"
-   fi
+   PKG_CHECK_MODULES(LIBCHAMPLAIN,
+    [
+       champlain-0.8 >= $LIBCHAMPLAIN_REQUIRED,
+# champplain-gtk3 doesn't exist. Fix the name once bgo #631009
+       champlain-gtk3-0.8 >= $LIBCHAMPLAIN_GTK_REQUIRED
+       clutter-gtk >= $CLUTTER_GTK_REQUIRED
+    ], have_libchamplain="yes", have_libchamplain="no")
 
    if test "x$have_libchamplain" = "xyes"; then
       AC_DEFINE(HAVE_LIBCHAMPLAIN, 1, [Define if you have libchamplain])
@@ -462,19 +415,10 @@ AC_ARG_ENABLE(nautilus-sendto,
                              enable_nautilus_sendto=auto)
 
 if test "x$enable_nautilus_sendto" != "xno"; then
-   if test "x$have_gtk3" == "xno"; then
-      # Newer NST requires GTK+3 so we can't use it
-      PKG_CHECK_MODULES(NST,
-      [
-         nautilus-sendto >= $NAUTILUS_SENDTO_REQUIRED
-         nautilus-sendto < 2.90.0
-      ], have_nst="yes", have_nst="no")
-   else
-      PKG_CHECK_MODULES(NST,
-      [
-         nautilus-sendto >= $NAUTILUS_SENDTO_REQUIRED_GTK3
-      ], have_nst="yes", have_nst="no")
-   fi
+   PKG_CHECK_MODULES(NST,
+    [
+       nautilus-sendto >= $NAUTILUS_SENDTO_REQUIRED
+    ], have_nst="yes", have_nst="no")
 else
    have_nst=no
 fi
@@ -495,13 +439,8 @@ AC_ARG_ENABLE(control_center_embedding,
 
 if test "x$enable_control_center_embedding" != "xno"; then
 
-   if test "x$have_gtk3" == "xno"; then
-      PKG_CHECK_MODULES(CONTROL_CENTER_EMBEDDING, [libgnome-control-center < GNOME_CONTROL_CENTER_GTK3_REQUIRED],
-          have_control_center_embedding="yes", have_control_center_embedding="no")
-   else
-      PKG_CHECK_MODULES(CONTROL_CENTER_EMBEDDING, [libgnome-control-center >= GNOME_CONTROL_CENTER_GTK3_REQUIRED],
-          have_control_center_embedding="yes", have_control_center_embedding="no")
-   fi
+   PKG_CHECK_MODULES(CONTROL_CENTER_EMBEDDING, [libgnome-control-center >= GNOME_CONTROL_CENTER_REQUIRED],
+        have_control_center_embedding="yes", have_control_center_embedding="no")
 
    if test "x$have_control_center_embedding" = "xyes"; then
       AC_DEFINE(HAVE_CONTROL_CENTER_EMBEDDING, 1, [Define if you have the single-window control center])
@@ -564,7 +503,6 @@ Configure summary:
 	Compiler Flags..............:  ${CFLAGS} ${ERROR_CFLAGS}
 	Prefix......................:  ${prefix}
 	Coding style checks.........:  ${ENABLE_CODING_STYLE_CHECKS}
-	Use GTK+3...................:  ${have_gtk3}
 
     Features:
 	Spell checking (enchant)....:  ${have_enchant}
diff --git a/libempathy-gtk/Makefile.am b/libempathy-gtk/Makefile.am
index 1cc6553..6cc6c09 100644
--- a/libempathy-gtk/Makefile.am
+++ b/libempathy-gtk/Makefile.am
@@ -67,7 +67,6 @@ libempathy_gtk_handwritten_source =            	\
 	empathy-irc-network-chooser.c \
 	empathy-irc-network-chooser-dialog.c \
 	empathy-irc-network-dialog.c		\
-	empathy-kludge-label.c			\
 	empathy-log-window.c			\
 	empathy-new-message-dialog.c		\
 	empathy-new-call-dialog.c		\
@@ -129,7 +128,6 @@ libempathy_gtk_headers =			\
 	empathy-irc-network-chooser.h \
 	empathy-irc-network-chooser-dialog.h \
 	empathy-irc-network-dialog.h		\
-	empathy-kludge-label.h			\
 	empathy-log-window.h			\
 	empathy-new-message-dialog.h		\
 	empathy-new-call-dialog.h		\
diff --git a/libempathy-gtk/empathy-account-widget-irc.ui b/libempathy-gtk/empathy-account-widget-irc.ui
index 545fe67..559e080 100644
--- a/libempathy-gtk/empathy-account-widget-irc.ui
+++ b/libempathy-gtk/empathy-account-widget-irc.ui
@@ -10,7 +10,6 @@
     <property name="type_hint">dialog</property>
     <property name="skip_taskbar_hint">True</property>
     <property name="skip_pager_hint">True</property>
-    <property name="has_separator">False</property>
     <child internal-child="vbox">
       <object class="GtkVBox" id="dialog-vbox10">
         <property name="visible">True</property>
diff --git a/libempathy-gtk/empathy-avatar-image.c b/libempathy-gtk/empathy-avatar-image.c
index c74557f..a8041d2 100644
--- a/libempathy-gtk/empathy-avatar-image.c
+++ b/libempathy-gtk/empathy-avatar-image.c
@@ -166,7 +166,7 @@ avatar_image_add_filter (EmpathyAvatarImage *avatar_image)
 
 	XSelectInput (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), window, mask);
 
-	gdk_error_trap_pop ();
+	gdk_error_trap_pop_ignored ();
 
 	gdk_window_add_filter (NULL, avatar_image_filter_func, avatar_image);
 }
diff --git a/libempathy-gtk/empathy-cell-renderer-activatable.c b/libempathy-gtk/empathy-cell-renderer-activatable.c
index 6aedb03..d24f178 100644
--- a/libempathy-gtk/empathy-cell-renderer-activatable.c
+++ b/libempathy-gtk/empathy-cell-renderer-activatable.c
@@ -145,13 +145,12 @@ cell_renderer_activatable_activate (GtkCellRenderer      *cell,
 
 static void
 cell_renderer_activatable_render (
-    GtkCellRenderer      *cell,
-    GdkWindow            *window,
-    GtkWidget            *widget,
-    GdkRectangle         *background_area,
-    GdkRectangle         *cell_area,
-    GdkRectangle         *expose_area,
-    GtkCellRendererState  flags)
+    GtkCellRenderer *cell,
+    cairo_t *cr,
+    GtkWidget *widget,
+    const GdkRectangle *background_area,
+    const GdkRectangle *cell_area,
+    GtkCellRendererState flags)
 {
   EmpathyCellRendererActivatablePriv *priv = GET_PRIV (cell);
 
@@ -160,7 +159,7 @@ cell_renderer_activatable_render (
 
   GTK_CELL_RENDERER_CLASS
     (empathy_cell_renderer_activatable_parent_class)->render (
-        cell, window, widget, background_area, cell_area, expose_area, flags);
+        cell, cr, widget, background_area, cell_area, flags);
 }
 
 static void
diff --git a/libempathy-gtk/empathy-cell-renderer-expander.c b/libempathy-gtk/empathy-cell-renderer-expander.c
index fb36043..d9067e0 100644
--- a/libempathy-gtk/empathy-cell-renderer-expander.c
+++ b/libempathy-gtk/empathy-cell-renderer-expander.c
@@ -73,11 +73,10 @@ static void     empathy_cell_renderer_expander_get_size     (GtkCellRenderer
 							    gint                            *width,
 							    gint                            *height);
 static void     empathy_cell_renderer_expander_render       (GtkCellRenderer                 *cell,
-							    GdkWindow                       *window,
+							    cairo_t *cr,
 							    GtkWidget                       *widget,
-							    GdkRectangle                    *background_area,
-							    GdkRectangle                    *cell_area,
-							    GdkRectangle                    *expose_area,
+							    const GdkRectangle              *background_area,
+							    const GdkRectangle              *cell_area,
 							    GtkCellRendererState             flags);
 static gboolean empathy_cell_renderer_expander_activate     (GtkCellRenderer                 *cell,
 							    GdkEvent                        *event,
@@ -294,11 +293,10 @@ empathy_cell_renderer_expander_get_size (GtkCellRenderer *cell,
 
 static void
 empathy_cell_renderer_expander_render (GtkCellRenderer      *cell,
-				      GdkWindow            *window,
+				      cairo_t *cr,
 				      GtkWidget            *widget,
-				      GdkRectangle         *background_area,
-				      GdkRectangle         *cell_area,
-				      GdkRectangle         *expose_area,
+				      const GdkRectangle   *background_area,
+				      const GdkRectangle   *cell_area,
 				      GtkCellRendererState  flags)
 {
 	EmpathyCellRendererExpander     *expander;
@@ -328,7 +326,8 @@ empathy_cell_renderer_expander_render (GtkCellRenderer      *cell,
 	} else
 		expander_style = priv->expander_style;
 
-	empathy_cell_renderer_expander_get_size (cell, widget, cell_area,
+	empathy_cell_renderer_expander_get_size (cell, widget,
+						(GdkRectangle *) cell_area,
 						&x_offset, &y_offset,
 						NULL, NULL);
 
@@ -338,9 +337,8 @@ empathy_cell_renderer_expander_render (GtkCellRenderer      *cell,
 		      NULL);
 
 	gtk_paint_expander (gtk_widget_get_style (widget),
-			    window,
+			    cr,
 			    GTK_STATE_NORMAL,
-			    expose_area,
 			    widget,
 			    "treeview",
 			    cell_area->x + x_offset + xpad + priv->expander_size / 2,
diff --git a/libempathy-gtk/empathy-cell-renderer-text.c b/libempathy-gtk/empathy-cell-renderer-text.c
index eb4ccb0..321b710 100644
--- a/libempathy-gtk/empathy-cell-renderer-text.c
+++ b/libempathy-gtk/empathy-cell-renderer-text.c
@@ -58,11 +58,10 @@ static void cell_renderer_text_get_size          (GtkCellRenderer             *c
 						  gint                        *width,
 						  gint                        *height);
 static void cell_renderer_text_render            (GtkCellRenderer             *cell,
-						  GdkDrawable                 *window,
+						  cairo_t *cr,
 						  GtkWidget                   *widget,
-						  GdkRectangle                *background_area,
-						  GdkRectangle                *cell_area,
-						  GdkRectangle                *expose_area,
+						  const GdkRectangle          *background_area,
+						  const GdkRectangle          *cell_area,
 						  GtkCellRendererState         flags);
 static void cell_renderer_text_update_text       (EmpathyCellRendererText      *cell,
 						  GtkWidget                   *widget,
@@ -266,11 +265,10 @@ cell_renderer_text_get_size (GtkCellRenderer *cell,
 
 static void
 cell_renderer_text_render (GtkCellRenderer      *cell,
-			   GdkWindow            *window,
+			   cairo_t *cr,
 			   GtkWidget            *widget,
-			   GdkRectangle         *background_area,
-			   GdkRectangle         *cell_area,
-			   GdkRectangle         *expose_area,
+			   const GdkRectangle   *background_area,
+			   const GdkRectangle   *cell_area,
 			   GtkCellRendererState  flags)
 {
 	EmpathyCellRendererText *celltext;
@@ -282,11 +280,11 @@ cell_renderer_text_render (GtkCellRenderer      *cell,
 					(flags & GTK_CELL_RENDERER_SELECTED));
 
 	(GTK_CELL_RENDERER_CLASS (empathy_cell_renderer_text_parent_class)->render) (
-		cell, window,
+		cell, cr,
 		widget,
 		background_area,
 		cell_area,
-		expose_area, flags);
+		flags);
 }
 
 static void
diff --git a/libempathy-gtk/empathy-chat.c b/libempathy-gtk/empathy-chat.c
index c14e315..295ee6a 100644
--- a/libempathy-gtk/empathy-chat.c
+++ b/libempathy-gtk/empathy-chat.c
@@ -2536,29 +2536,6 @@ chat_create_ui (EmpathyChat *chat)
 }
 
 static void
-chat_size_request (GtkWidget      *widget,
-		   GtkRequisition *requisition)
-{
-  GtkBin *bin = GTK_BIN (widget);
-  GtkWidget *child;
-
-  requisition->width = gtk_container_get_border_width (GTK_CONTAINER (widget)) * 2;
-  requisition->height = gtk_container_get_border_width (GTK_CONTAINER (widget)) * 2;
-
-  child = gtk_bin_get_child (bin);
-
-  if (child && gtk_widget_get_visible (child))
-    {
-      GtkRequisition child_requisition;
-
-      gtk_widget_size_request (child, &child_requisition);
-
-      requisition->width += child_requisition.width;
-      requisition->height += child_requisition.height;
-    }
-}
-
-static void
 chat_size_allocate (GtkWidget     *widget,
 		    GtkAllocation *allocation)
 {
@@ -2674,7 +2651,6 @@ empathy_chat_class_init (EmpathyChatClass *klass)
 	object_class->set_property = chat_set_property;
 	object_class->constructed = chat_constructed;
 
-	widget_class->size_request = chat_size_request;
 	widget_class->size_allocate = chat_size_allocate;
 
 	g_object_class_install_property (object_class,
diff --git a/libempathy-gtk/empathy-contact-dialogs.ui b/libempathy-gtk/empathy-contact-dialogs.ui
index 0986de1..c18bfab 100644
--- a/libempathy-gtk/empathy-contact-dialogs.ui
+++ b/libempathy-gtk/empathy-contact-dialogs.ui
@@ -8,7 +8,6 @@
     <property name="resizable">False</property>
     <property name="window_position">GTK_WIN_POS_CENTER_ON_PARENT</property>
     <property name="type_hint">GDK_WINDOW_TYPE_HINT_DIALOG</property>
-    <property name="has_separator">False</property>
     <child internal-child="vbox">
       <object class="GtkVBox" id="dialog-vbox4">
         <property name="visible">True</property>
diff --git a/libempathy-gtk/empathy-contact-list-view.c b/libempathy-gtk/empathy-contact-list-view.c
index ce58642..f7a946a 100644
--- a/libempathy-gtk/empathy-contact-list-view.c
+++ b/libempathy-gtk/empathy-contact-list-view.c
@@ -856,7 +856,7 @@ contact_list_view_key_press_event_cb (EmpathyContactListView *view,
 				      GdkEventKey	     *event,
 				      gpointer		      user_data)
 {
-	if (event->keyval == GDK_Menu) {
+	if (event->keyval == GDK_KEY_Menu) {
 		MenuPopupData *data;
 
 		data = g_slice_new (MenuPopupData);
@@ -1282,7 +1282,7 @@ contact_list_view_search_key_navigation_cb (GtkWidget *search,
 	GdkEventKey *eventkey = ((GdkEventKey *) event);
 	gboolean ret = FALSE;
 
-	if (eventkey->keyval == GDK_Up || eventkey->keyval == GDK_Down) {
+	if (eventkey->keyval == GDK_KEY_Up || eventkey->keyval == GDK_KEY_Down) {
 		GdkEvent *new_event;
 
 		new_event = gdk_event_copy (event);
diff --git a/libempathy-gtk/empathy-contact-widget.c b/libempathy-gtk/empathy-contact-widget.c
index a02b083..eaacc63 100644
--- a/libempathy-gtk/empathy-contact-widget.c
+++ b/libempathy-gtk/empathy-contact-widget.c
@@ -50,7 +50,6 @@
 #include "empathy-groups-widget.h"
 #include "empathy-ui-utils.h"
 #include "empathy-string-parser.h"
-#include "empathy-kludge-label.h"
 
 #define DEBUG_FLAG EMPATHY_DEBUG_CONTACT
 #include <libempathy/empathy-debug.h>
@@ -1428,8 +1427,7 @@ favourite_toggled_cb (GtkToggleButton *button,
 static void
 contact_widget_contact_setup (EmpathyContactWidget *information)
 {
-  /* Setup label_status as a KludgeLabel */
-  information->label_status = empathy_kludge_label_new ("");
+  information->label_status = gtk_label_new ("");
   gtk_label_set_line_wrap_mode (GTK_LABEL (information->label_status),
                                 PANGO_WRAP_WORD_CHAR);
   gtk_label_set_line_wrap (GTK_LABEL (information->label_status),
diff --git a/libempathy-gtk/empathy-individual-linker.c b/libempathy-gtk/empathy-individual-linker.c
index 8da4569..3aee55d 100644
--- a/libempathy-gtk/empathy-individual-linker.c
+++ b/libempathy-gtk/empathy-individual-linker.c
@@ -566,31 +566,6 @@ finalize (GObject *object)
 }
 
 static void
-size_request (GtkWidget *widget,
-    GtkRequisition *requisition)
-{
-  GtkBin *bin = GTK_BIN (widget);
-  GtkWidget *child;
-
-  requisition->width =
-      gtk_container_get_border_width (GTK_CONTAINER (widget)) * 2;
-  requisition->height =
-      gtk_container_get_border_width (GTK_CONTAINER (widget)) * 2;
-
-  child = gtk_bin_get_child (bin);
-
-  if (child && gtk_widget_get_visible (child))
-    {
-      GtkRequisition child_requisition;
-
-      gtk_widget_size_request (child, &child_requisition);
-
-      requisition->width += child_requisition.width;
-      requisition->height += child_requisition.height;
-    }
-}
-
-static void
 size_allocate (GtkWidget *widget,
     GtkAllocation *allocation)
 {
@@ -628,7 +603,6 @@ empathy_individual_linker_class_init (EmpathyIndividualLinkerClass *klass)
   object_class->dispose = dispose;
   object_class->finalize = finalize;
 
-  widget_class->size_request = size_request;
   widget_class->size_allocate = size_allocate;
 
   /**
diff --git a/libempathy-gtk/empathy-individual-view.c b/libempathy-gtk/empathy-individual-view.c
index 9079303..ee0e06c 100644
--- a/libempathy-gtk/empathy-individual-view.c
+++ b/libempathy-gtk/empathy-individual-view.c
@@ -882,7 +882,7 @@ individual_view_key_press_event_cb (EmpathyIndividualView *view,
     GdkEventKey *event,
     gpointer user_data)
 {
-  if (event->keyval == GDK_Menu)
+  if (event->keyval == GDK_KEY_Menu)
     {
       MenuPopupData *data;
 
@@ -1314,7 +1314,7 @@ individual_view_search_key_navigation_cb (GtkWidget *search,
   GdkEventKey *eventkey = ((GdkEventKey *) event);
   gboolean ret = FALSE;
 
-  if (eventkey->keyval == GDK_Up || eventkey->keyval == GDK_Down)
+  if (eventkey->keyval == GDK_KEY_Up || eventkey->keyval == GDK_KEY_Down)
     {
       GdkEvent *new_event;
 
diff --git a/libempathy-gtk/empathy-individual-widget.c b/libempathy-gtk/empathy-individual-widget.c
index 36cea8a..f303436 100644
--- a/libempathy-gtk/empathy-individual-widget.c
+++ b/libempathy-gtk/empathy-individual-widget.c
@@ -45,7 +45,6 @@
 #include "empathy-groups-widget.h"
 #include "empathy-gtk-enum-types.h"
 #include "empathy-individual-widget.h"
-#include "empathy-kludge-label.h"
 #include "empathy-string-parser.h"
 #include "empathy-ui-utils.h"
 
@@ -1267,8 +1266,7 @@ alias_presence_avatar_favourite_set_up (EmpathyIndividualWidget *self,
       FALSE, 0);
   gtk_widget_show (image);
 
-  /* Set up status_label as a KludgeLabel */
-  label = empathy_kludge_label_new ("");
+  label = gtk_label_new ("");
   gtk_label_set_line_wrap_mode (GTK_LABEL (label), PANGO_WRAP_WORD_CHAR);
   gtk_label_set_line_wrap (GTK_LABEL (label), TRUE);
 
diff --git a/libempathy-gtk/empathy-kludge-label.c b/libempathy-gtk/empathy-kludge-label.c
deleted file mode 100644
index 7ed4be6..0000000
--- a/libempathy-gtk/empathy-kludge-label.c
+++ /dev/null
@@ -1,92 +0,0 @@
-/* vim: set ts=4 sts=4 sw=4 et: */
-/*
- * Copyright (C) 2009 Collabora Ltd.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- * Authors: Davyd Madeley <davyd.madeley@collabora.co.uk>
- */
-
-#include "empathy-kludge-label.h"
-
-G_DEFINE_TYPE (EmpathyKludgeLabel, empathy_kludge_label, GTK_TYPE_LABEL);
-
-static void
-empathy_kludge_label_size_allocate (GtkWidget     *self,
-                                    GtkAllocation *allocation)
-{
-    PangoLayout *layout;
-
-    GTK_WIDGET_CLASS (empathy_kludge_label_parent_class)->size_allocate (
-            self, allocation);
-
-    /* force the width of the PangoLayout to be the width of the allocation */
-    layout = gtk_label_get_layout (GTK_LABEL (self));
-    pango_layout_set_width (layout, allocation->width * PANGO_SCALE);
-}
-
-static gboolean
-empathy_kludge_label_expose_event (GtkWidget      *self,
-                                   GdkEventExpose *event)
-{
-    PangoLayout *layout;
-    PangoRectangle rect;
-    GtkAllocation real_allocation;
-    GtkAllocation allocation;
-    gboolean r;
-
-    layout = gtk_label_get_layout (GTK_LABEL (self));
-    pango_layout_get_pixel_extents (layout, NULL, &rect);
-
-    /* this is mind-bendingly evil:
-     * get_layout_location() is going to remove rect.x from the position of the
-     * layout when painting it. This really sucks. We're going to compensate by
-     * adding this value to the allocation.
-     */
-    gtk_widget_get_allocation (self, &allocation);
-    real_allocation = allocation;
-    allocation.x += rect.x;
-    gtk_widget_set_allocation (self, &allocation);
-
-    r = GTK_WIDGET_CLASS (empathy_kludge_label_parent_class)->expose_event (
-            self, event);
-
-    gtk_widget_set_allocation (self, &real_allocation);
-
-    return r;
-}
-
-static void
-empathy_kludge_label_class_init (EmpathyKludgeLabelClass *klass)
-{
-    GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
-
-    widget_class->size_allocate = empathy_kludge_label_size_allocate;
-    widget_class->expose_event = empathy_kludge_label_expose_event;
-}
-
-static void
-empathy_kludge_label_init (EmpathyKludgeLabel *self)
-{
-}
-
-GtkWidget *
-empathy_kludge_label_new (const char *str)
-{
-    return g_object_new (EMPATHY_TYPE_KLUDGE_LABEL,
-            "label", str,
-            "xalign", 0.,
-            NULL);
-}
diff --git a/libempathy-gtk/empathy-kludge-label.h b/libempathy-gtk/empathy-kludge-label.h
deleted file mode 100644
index f2ea1e9..0000000
--- a/libempathy-gtk/empathy-kludge-label.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2009 Collabora Ltd.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- *
- * Authors: Davyd Madeley <davyd.madeley@collabora.co.uk>
- */
-
-#ifndef __EMPATHY_KLUDGE_LABEL_H__
-#define __EMPATHY_KLUDGE_LABEL_H__
-
-#include <gtk/gtk.h>
-
-G_BEGIN_DECLS
-
-#define EMPATHY_TYPE_KLUDGE_LABEL	(empathy_kludge_label_get_type ())
-#define EMPATHY_KLUDGE_LABEL(obj)	(G_TYPE_CHECK_INSTANCE_CAST ((obj), EMPATHY_TYPE_KLUDGE_LABEL, EmpathyKludgeLabel))
-#define EMPATHY_KLUDGE_LABEL_CLASS(obj)	(G_TYPE_CHECK_CLASS_CAST ((obj), EMPATHY_TYPE_KLUDGE_LABEL, EmpathyKludgeLabelClass))
-#define EMPATHY_IS_KLUDGE_LABEL(obj)	(G_TYPE_CHECK_INSTANCE_TYPE ((obj), EMPATHY_TYPE_KLUDGE_LABEL))
-#define EMPATHY_IS_KLUDGE_LABEL_CLASS(obj)	(G_TYPE_CHECK_CLASS_TYPE ((obj), EMPATHY_TYPE_KLUDGE_LABEL))
-#define EMPATHY_KLUDGE_LABEL_GET_CLASS(obj)	(G_TYPE_INSTANCE_GET_CLASS ((obj), EMPATHY_TYPE_KLUDGE_LABEL, EmpathyKludgeLabelClass))
-
-typedef struct _EmpathyKludgeLabel EmpathyKludgeLabel;
-typedef struct _EmpathyKludgeLabelClass EmpathyKludgeLabelClass;
-
-struct _EmpathyKludgeLabel
-{
-	GtkLabel parent;
-};
-
-struct _EmpathyKludgeLabelClass
-{
-	GtkLabelClass parent_class;
-};
-
-GType empathy_kludge_label_get_type (void);
-GtkWidget *empathy_kludge_label_new (const char *str);
-
-G_END_DECLS
-
-#endif
diff --git a/libempathy-gtk/empathy-live-search.c b/libempathy-gtk/empathy-live-search.c
index 2b5f54f..a607939 100644
--- a/libempathy-gtk/empathy-live-search.c
+++ b/libempathy-gtk/empathy-live-search.c
@@ -60,7 +60,7 @@ enum
 
 static guint signals[LAST_SIGNAL];
 
-static void live_search_hook_widget_destroy_cb (GtkObject *object,
+static void live_search_hook_widget_destroy_cb (GtkWidget *object,
     gpointer user_data);
 
 /**
@@ -255,15 +255,15 @@ live_search_entry_key_pressed_cb (GtkEntry *entry,
   gboolean ret;
 
   /* if esc key pressed, hide the search */
-  if (event->keyval == GDK_Escape)
+  if (event->keyval == GDK_KEY_Escape)
     {
       gtk_widget_hide (GTK_WIDGET (self));
       return TRUE;
     }
 
   /* emit key navigation signal, so other widgets can respond to it properly */
-  if (event->keyval == GDK_Up || event->keyval == GDK_Down
-      || event->keyval == GDK_Left || event->keyval == GDK_Right)
+  if (event->keyval == GDK_KEY_Up || event->keyval == GDK_KEY_Down
+      || event->keyval == GDK_KEY_Left || event->keyval == GDK_KEY_Right)
      {
        g_signal_emit (self, signals[KEYNAV], 0, event, &ret);
        return ret;
@@ -319,20 +319,20 @@ live_search_key_press_event_cb (GtkWidget *widget,
   /* dont forward this event to the entry, else the event is consumed by the
    * entry and does not close the window */
   if (!gtk_widget_get_visible (GTK_WIDGET (self)) &&
-      event->keyval == GDK_Escape)
+      event->keyval == GDK_KEY_Escape)
     return FALSE;
 
   /* do not show the search if CTRL and/or ALT are pressed with a key
    * this is needed, because otherwise the CTRL + F accel would not work,
    * because the entry consumes it */
   if (event->state & (GDK_MOD1_MASK | GDK_CONTROL_MASK) ||
-      event->keyval == GDK_Control_L ||
-      event->keyval == GDK_Control_R)
+      event->keyval == GDK_KEY_Control_L ||
+      event->keyval == GDK_KEY_Control_R)
     return FALSE;
 
   /* dont forward the up and down arrow keys to the entry, they are needed for
    * navigation in the treeview and are not needed in the search entry */
-   if (event->keyval == GDK_Up || event->keyval == GDK_Down)
+   if (event->keyval == GDK_KEY_Up || event->keyval == GDK_KEY_Down)
      return FALSE;
 
   /* realize the widget if it is not realized yet */
@@ -376,7 +376,7 @@ live_search_release_hook_widget (EmpathyLiveSearch *self)
 }
 
 static void
-live_search_hook_widget_destroy_cb (GtkObject *object,
+live_search_hook_widget_destroy_cb (GtkWidget *object,
     gpointer user_data)
 {
   EmpathyLiveSearch *self = EMPATHY_LIVE_SEARCH (user_data);
diff --git a/libempathy-gtk/empathy-presence-chooser.c b/libempathy-gtk/empathy-presence-chooser.c
index cd9b455..8258688 100644
--- a/libempathy-gtk/empathy-presence-chooser.c
+++ b/libempathy-gtk/empathy-presence-chooser.c
@@ -525,12 +525,12 @@ presence_chooser_entry_key_press_event_cb (EmpathyPresenceChooser *self,
 {
 	EmpathyPresenceChooserPriv *priv = GET_PRIV (self);
 
-	if (priv->editing_status && event->keyval == GDK_Escape) {
+	if (priv->editing_status && event->keyval == GDK_KEY_Escape) {
 		/* the user pressed Escape, undo the editing */
 		presence_chooser_reset_status (self);
 		return TRUE;
 	}
-	else if (event->keyval == GDK_Up || event->keyval == GDK_Down) {
+	else if (event->keyval == GDK_KEY_Up || event->keyval == GDK_KEY_Down) {
 		/* ignore */
 		return TRUE;
 	}
diff --git a/libempathy-gtk/empathy-search-bar.c b/libempathy-gtk/empathy-search-bar.c
index 2116d59..9a27795 100644
--- a/libempathy-gtk/empathy-search-bar.c
+++ b/libempathy-gtk/empathy-search-bar.c
@@ -58,27 +58,6 @@ empathy_search_bar_new (EmpathyChatView *view)
 }
 
 static void
-empathy_search_bar_size_request (GtkWidget *widget,
-    GtkRequisition *requisition)
-{
-  GtkBin *bin;
-  GtkWidget *child;
-
-  bin = GTK_BIN (widget);
-  child = gtk_bin_get_child (bin);
-
-  if (child && gtk_widget_get_visible (child))
-    {
-      GtkRequisition child_requisition;
-
-      gtk_widget_size_request (child, &child_requisition);
-
-      requisition->width = child_requisition.width;
-      requisition->height = child_requisition.height;
-    }
-}
-
-static void
 empathy_search_bar_size_allocate (GtkWidget *widget,
     GtkAllocation *allocation)
 {
@@ -230,7 +209,7 @@ empathy_search_bar_key_pressed (GtkWidget   *widget,
     GdkEventKey *event,
     gpointer user_data)
 {
-  if (event->keyval == GDK_Escape)
+  if (event->keyval == GDK_KEY_Escape)
     {
       empathy_search_bar_hide (EMPATHY_SEARCH_BAR (widget));
       return TRUE;
@@ -311,7 +290,6 @@ empathy_search_bar_class_init (EmpathySearchBarClass *class)
   g_type_class_add_private (gobject_class, sizeof (EmpathySearchBarPriv));
 
   /* Neither GtkBin nor GtkContainer seems to do this for us :( */
-  widget_class->size_request = empathy_search_bar_size_request;
   widget_class->size_allocate = empathy_search_bar_size_allocate;
 }
 
diff --git a/libempathy-gtk/empathy-ui-utils.c b/libempathy-gtk/empathy-ui-utils.c
index 4014f92..667c110 100644
--- a/libempathy-gtk/empathy-ui-utils.c
+++ b/libempathy-gtk/empathy-ui-utils.c
@@ -1570,7 +1570,7 @@ empathy_window_iconify (GtkWindow *window, GtkStatusIcon *status_icon)
 	XChangeProperty (dpy,
 			 GDK_WINDOW_XID (gdk_window),
 			 gdk_x11_get_xatom_by_name_for_display (
-				gdk_drawable_get_display (gdk_window),
+				gdk_window_get_display (gdk_window),
 			 "_NET_WM_ICON_GEOMETRY"),
 			 XA_CARDINAL, 32, PropModeReplace,
 			 (guchar *)&data, 4);
diff --git a/libempathy-gtk/empathy-video-widget.c b/libempathy-gtk/empathy-video-widget.c
index a3b13fd..26cc878 100644
--- a/libempathy-gtk/empathy-video-widget.c
+++ b/libempathy-gtk/empathy-video-widget.c
@@ -170,8 +170,10 @@ empathy_video_widget_constructed (GObject *object)
 static void empathy_video_widget_dispose (GObject *object);
 static void empathy_video_widget_finalize (GObject *object);
 
-static gboolean empathy_video_widget_expose_event (GtkWidget *widget,
-  GdkEventExpose *event);
+
+static gboolean empathy_video_widget_draw (GtkWidget *widget,
+  cairo_t *cr);
+
 static void
 empathy_video_widget_element_set_sink_properties (EmpathyVideoWidget *self);
 
@@ -258,7 +260,7 @@ empathy_video_widget_class_init (
   object_class->set_property = empathy_video_widget_set_property;
   object_class->get_property = empathy_video_widget_get_property;
 
-  widget_class->expose_event = empathy_video_widget_expose_event;
+  widget_class->draw = empathy_video_widget_draw;
 
   param_spec = g_param_spec_object ("gst-element",
     "gst-element", "The underlaying gstreamer element",
@@ -421,20 +423,22 @@ empathy_video_widget_sync_message_cb (GstBus *bus, GstMessage *message,
 }
 
 static gboolean
-empathy_video_widget_expose_event (GtkWidget *widget, GdkEventExpose *event)
+empathy_video_widget_draw (GtkWidget *widget,
+    cairo_t *cr)
 {
   EmpathyVideoWidget *self = EMPATHY_VIDEO_WIDGET (widget);
   EmpathyVideoWidgetPriv *priv = GET_PRIV (self);
   GtkAllocation allocation;
 
-  if (event != NULL && event->count > 0)
-    return TRUE;
-
   if (priv->overlay == NULL)
     {
       gtk_widget_get_allocation (widget, &allocation);
-      gdk_window_clear_area (gtk_widget_get_window (widget), 0, 0,
-                             allocation.width, allocation.height);
+
+      gtk_paint_flat_box (gtk_widget_get_style (widget), cr,
+          GTK_STATE_NORMAL, GTK_SHADOW_NONE, widget, NULL,
+          0, 0,
+          gtk_widget_get_allocated_width (widget),
+          gtk_widget_get_allocated_height (widget));
       return TRUE;
     }
 
diff --git a/src/Makefile.am b/src/Makefile.am
index c77b63a..6807515 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -106,13 +106,16 @@ empathy_debugger_SOURCES =						\
 	empathy-debugger.c		 				\
 	$(NULL)
 
-empathy_av_SOURCES =						\
+empathy_handwritten_av_source = \
 	empathy-av.c \
 	empathy-call-window-fullscreen.c empathy-call-window-fullscreen.h \
 	empathy-call-window.c empathy-call-window.h	 \
-	empathy-sidebar.c empathy-sidebar.h \
 	$(NULL)
 
+empathy_av_SOURCES =						\
+	$(empathy_handwritten_av_source) \
+	ev-sidebar.c ev-sidebar.h
+
 empathy_auth_client_SOURCES =						\
 	empathy-auth-client.c
 
@@ -129,6 +132,7 @@ empathy_handwritten_source = \
 	empathy-preferences.c empathy-preferences.h			\
 	empathy-status-icon.c empathy-status-icon.h			\
 	empathy-chat-manager.c empathy-chat-manager.h			\
+	empathy-chat-notebook.c empathy-chat-notebook.h			\
 	empathy.c
 
 empathy_SOURCES =							\
@@ -152,7 +156,7 @@ nodist_empathy_SOURCES = $(BUILT_SOURCES)
 check_c_sources = \
     $(empathy_handwritten_source) \
     $(empathy_logs_SOURCES) \
-    $(empathy_av_SOURCES)
+    $(empathy_handwritten_av_source)
 
 include $(top_srcdir)/tools/check-coding-style.mk
 check-local: check-coding-style
diff --git a/src/empathy-about-dialog.c b/src/empathy-about-dialog.c
index e3176c0..c1e1848 100644
--- a/src/empathy-about-dialog.c
+++ b/src/empathy-about-dialog.c
@@ -33,10 +33,6 @@
 
 #define WEB_SITE "http://live.gnome.org/Empathy"
 
-static void about_dialog_activate_link_cb (GtkAboutDialog  *about,
-					   const gchar     *link,
-					   gpointer         data);
-
 static const char *authors[] = {
 	"Alban Crequy",
 	"Andreas Lööw",
@@ -95,21 +91,11 @@ static const char *license[] = {
 	   "51 Franklin Street, Fifth Floor, Boston, MA 02110-130159 USA")
 };
 
-static void
-about_dialog_activate_link_cb (GtkAboutDialog *about,
-			       const gchar    *link_,
-			       gpointer        data)
-{
-	empathy_url_show (GTK_WIDGET (about), link_);
-}
-
 void
 empathy_about_dialog_new (GtkWindow *parent)
 {
 	gchar *license_trans;
 
-	gtk_about_dialog_set_url_hook (about_dialog_activate_link_cb, NULL, NULL);
-
 	license_trans = g_strconcat (_(license[0]), "\n\n",
 				     _(license[1]), "\n\n",
 				     _(license[2]), "\n\n",
diff --git a/src/empathy-call-window.c b/src/empathy-call-window.c
index c2dbebb..00ea567 100644
--- a/src/empathy-call-window.c
+++ b/src/empathy-call-window.c
@@ -53,7 +53,7 @@
 
 #include "empathy-call-window.h"
 #include "empathy-call-window-fullscreen.h"
-#include "empathy-sidebar.h"
+#include "ev-sidebar.h"
 
 #define BUTTON_ID "empathy-call-dtmf-button-id"
 
@@ -245,10 +245,10 @@ static void empathy_call_window_set_send_video (EmpathyCallWindow *window,
 static void empathy_call_window_mic_toggled_cb (
   GtkToggleToolButton *toggle, EmpathyCallWindow *window);
 
-static void empathy_call_window_sidebar_hidden_cb (EmpathySidebar *sidebar,
+static void empathy_call_window_sidebar_hidden_cb (EvSidebar *sidebar,
   EmpathyCallWindow *window);
 
-static void empathy_call_window_sidebar_shown_cb (EmpathySidebar *sidebar,
+static void empathy_call_window_sidebar_shown_cb (EvSidebar *sidebar,
   EmpathyCallWindow *window);
 
 static void empathy_call_window_hangup_cb (gpointer object,
@@ -603,17 +603,8 @@ empathy_call_window_create_audio_input (EmpathyCallWindow *self)
 
   priv->volume_progress_bar = gtk_progress_bar_new ();
 
-  /* FIXME: Once we unconditionally depend on GTK+ 3, we can remove the fallback
-   * for GTK+ 2 here. GtkProgressBar doesn't implement GtkOrientable in GTK+ 2,
-   * unfortunately. */
-#ifndef HAVE_GTK3
-  gtk_progress_bar_set_orientation (
-      GTK_PROGRESS_BAR (priv->volume_progress_bar),
-      GTK_PROGRESS_BOTTOM_TO_TOP);
-#else
   gtk_orientable_set_orientation (GTK_ORIENTABLE (priv->volume_progress_bar),
       GTK_ORIENTATION_VERTICAL);
-#endif
 
   gtk_progress_bar_set_fraction (GTK_PROGRESS_BAR (priv->volume_progress_bar),
       0);
@@ -1183,7 +1174,7 @@ empathy_call_window_init (EmpathyCallWindow *self)
   gtk_box_pack_end (GTK_BOX (priv->vbox), h, FALSE, FALSE, 3);
   gtk_box_pack_end (GTK_BOX (h), priv->sidebar_button, FALSE, FALSE, 3);
 
-  priv->sidebar = empathy_sidebar_new ();
+  priv->sidebar = ev_sidebar_new ();
   g_signal_connect (G_OBJECT (priv->sidebar),
     "hide", G_CALLBACK (empathy_call_window_sidebar_hidden_cb), self);
   g_signal_connect (G_OBJECT (priv->sidebar),
@@ -1191,21 +1182,21 @@ empathy_call_window_init (EmpathyCallWindow *self)
   gtk_paned_pack2 (GTK_PANED (priv->pane), priv->sidebar, FALSE, FALSE);
 
   page = empathy_call_window_create_audio_input (self);
-  empathy_sidebar_add_page (EMPATHY_SIDEBAR (priv->sidebar), _("Audio input"),
-    page);
+  ev_sidebar_add_page (EV_SIDEBAR (priv->sidebar), "audio-input",
+      _("Audio input"), page);
 
   page = empathy_call_window_create_video_input (self);
-  empathy_sidebar_add_page (EMPATHY_SIDEBAR (priv->sidebar), _("Video input"),
-    page);
+  ev_sidebar_add_page (EV_SIDEBAR (priv->sidebar), "video-input",
+      _("Video input"), page);
 
   priv->dtmf_panel = empathy_call_window_create_dtmf (self);
-  empathy_sidebar_add_page (EMPATHY_SIDEBAR (priv->sidebar), _("Dialpad"),
-    priv->dtmf_panel);
+  ev_sidebar_add_page (EV_SIDEBAR (priv->sidebar), "dialpad",
+      _("Dialpad"), priv->dtmf_panel);
 
   gtk_widget_set_sensitive (priv->dtmf_panel, FALSE);
 
-  empathy_sidebar_add_page (EMPATHY_SIDEBAR (priv->sidebar), _("Details"),
-    priv->details_vbox);
+  ev_sidebar_add_page (EV_SIDEBAR (priv->sidebar), "details",
+      _("Details"), priv->details_vbox);
 
   gtk_widget_show_all (top_vbox);
 
@@ -3100,7 +3091,7 @@ empathy_call_window_mic_toggled_cb (GtkToggleToolButton *toggle,
 }
 
 static void
-empathy_call_window_sidebar_hidden_cb (EmpathySidebar *sidebar,
+empathy_call_window_sidebar_hidden_cb (EvSidebar *sidebar,
   EmpathyCallWindow *window)
 {
   EmpathyCallWindowPriv *priv = GET_PRIV (window);
@@ -3110,7 +3101,7 @@ empathy_call_window_sidebar_hidden_cb (EmpathySidebar *sidebar,
 }
 
 static void
-empathy_call_window_sidebar_shown_cb (EmpathySidebar *sidebar,
+empathy_call_window_sidebar_shown_cb (EvSidebar *sidebar,
   EmpathyCallWindow *window)
 {
   EmpathyCallWindowPriv *priv = GET_PRIV (window);
@@ -3218,7 +3209,7 @@ empathy_call_window_key_press_cb (GtkWidget *video_output,
 {
   EmpathyCallWindowPriv *priv = GET_PRIV (window);
 
-  if (priv->is_fullscreen && event->keyval == GDK_Escape)
+  if (priv->is_fullscreen && event->keyval == GDK_KEY_Escape)
     {
       /* Since we are in fullscreen mode, toggling will bring us back to
          normal mode. */
diff --git a/src/empathy-chat-notebook.c b/src/empathy-chat-notebook.c
new file mode 100644
index 0000000..6f17ba0
--- /dev/null
+++ b/src/empathy-chat-notebook.c
@@ -0,0 +1,56 @@
+/*
+ * empathy-chat-notebook.c - Source for EmpathyChatNotebook
+ * Copyright (C) 2010 Collabora Ltd.
+ * @author Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#include "empathy-chat-notebook.h"
+
+#define DEBUG_FLAG EMPATHY_DEBUG_CHAT
+#include <libempathy/empathy-debug.h>
+
+#include "empathy-chat-window.h"
+
+G_DEFINE_TYPE (EmpathyChatNotebook, empathy_chat_notebook, GTK_TYPE_NOTEBOOK);
+
+static void
+empathy_chat_notebook_init (EmpathyChatNotebook *self)
+{
+}
+
+static GtkNotebook *
+chat_notebook_create_window (GtkNotebook *notebook,
+    GtkWidget *page,
+    gint x,
+    gint y)
+{
+  return empathy_chat_window_create_window (notebook, page, x, y);
+}
+
+static void
+empathy_chat_notebook_class_init (EmpathyChatNotebookClass *klass)
+{
+  GtkNotebookClass *notebook_class = GTK_NOTEBOOK_CLASS (klass);
+
+  notebook_class->create_window = chat_notebook_create_window;
+}
+
+GtkWidget *
+empathy_chat_notebook_new (void)
+{
+  return g_object_new (EMPATHY_TYPE_CHAT_NOTEBOOK, NULL);
+}
diff --git a/src/empathy-chat-notebook.h b/src/empathy-chat-notebook.h
new file mode 100644
index 0000000..fb8af8f
--- /dev/null
+++ b/src/empathy-chat-notebook.h
@@ -0,0 +1,63 @@
+/*
+ * empathy-chat-notebook.h - Header for EmpathyChatNotebook
+ * Copyright (C) 2010 Collabora Ltd.
+ * @author Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
+ */
+
+#ifndef __EMPATHY_CHAT_NOTEBOOK_H__
+#define __EMPATHY_CHAT_NOTEBOOK_H__
+
+#include <glib-object.h>
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+typedef struct _EmpathyChatNotebook EmpathyChatNotebook;
+typedef struct _EmpathyChatNotebookClass EmpathyChatNotebookClass;
+
+struct _EmpathyChatNotebookClass {
+    GtkNotebookClass parent_class;
+};
+
+struct _EmpathyChatNotebook {
+    GtkNotebook parent;
+};
+
+GType empathy_chat_notebook_get_type (void);
+
+/* TYPE MACROS */
+#define EMPATHY_TYPE_CHAT_NOTEBOOK \
+  (empathy_chat_notebook_get_type ())
+#define EMPATHY_CHAT_NOTEBOOK(obj) \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj), EMPATHY_TYPE_CHAT_NOTEBOOK, \
+    EmpathyChatNotebook))
+#define EMPATHY_CHAT_NOTEBOOK_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_CAST((klass), EMPATHY_TYPE_CHAT_NOTEBOOK, \
+    EmpathyChatNotebookClass))
+#define EMPATHY_IS_CHAT_NOTEBOOK(obj) \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj), EMPATHY_TYPE_CHAT_NOTEBOOK))
+#define EMPATHY_IS_CHAT_NOTEBOOK_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_TYPE((klass), EMPATHY_TYPE_CHAT_NOTEBOOK))
+#define EMPATHY_CHAT_NOTEBOOK_GET_CLASS(obj) \
+  (G_TYPE_INSTANCE_GET_CLASS ((obj), EMPATHY_TYPE_CHAT_NOTEBOOK, \
+    EmpathyChatNotebookClass))
+
+GtkWidget * empathy_chat_notebook_new (void);
+
+G_END_DECLS
+
+#endif /* #ifndef __EMPATHY_CHAT_NOTEBOOK_H__*/
diff --git a/src/empathy-chat-window.c b/src/empathy-chat-window.c
index 66c4e96..1bb88ab 100644
--- a/src/empathy-chat-window.c
+++ b/src/empathy-chat-window.c
@@ -56,6 +56,7 @@
 #include <libempathy-gtk/empathy-notify-manager.h>
 
 #include "empathy-chat-manager.h"
+#include "empathy-chat-notebook.h"
 #include "empathy-chat-window.h"
 #include "empathy-about-dialog.h"
 #include "empathy-invite-participant-dialog.h"
@@ -116,8 +117,8 @@ typedef struct {
 static GList *chat_windows = NULL;
 
 static const guint tab_accel_keys[] = {
-	GDK_1, GDK_2, GDK_3, GDK_4, GDK_5,
-	GDK_6, GDK_7, GDK_8, GDK_9, GDK_0
+	GDK_KEY_1, GDK_KEY_2, GDK_KEY_3, GDK_KEY_4, GDK_KEY_5,
+	GDK_KEY_6, GDK_KEY_7, GDK_KEY_8, GDK_KEY_9, GDK_KEY_0
 };
 
 typedef enum {
@@ -1468,12 +1469,11 @@ chat_window_new_message_cb (EmpathyChat       *chat,
 	chat_window_icon_update (priv);
 }
 
-static GtkNotebook *
-chat_window_detach_hook (GtkNotebook *source,
+GtkNotebook *
+empathy_chat_window_create_window (GtkNotebook *source,
 			 GtkWidget   *page,
 			 gint         x,
-			 gint         y,
-			 gpointer     user_data)
+			 gint         y)
 {
 	EmpathyChatWindowPriv *priv;
 	EmpathyChatWindow     *window, *new_window;
@@ -1919,8 +1919,6 @@ empathy_chat_window_class_init (EmpathyChatWindowClass *klass)
 		"  ythickness = 0\n"
 		"}\n"
 		"widget \"*.empathy-close-button\" style \"empathy-close-button-style\"");
-
-	gtk_notebook_set_window_creation_hook (chat_window_detach_hook, NULL, NULL);
 }
 
 static void
@@ -1989,8 +1987,8 @@ empathy_chat_window_init (EmpathyChatWindow *window)
 
 	priv->chatroom_manager = empathy_chatroom_manager_dup_singleton (NULL);
 
-	priv->notebook = gtk_notebook_new ();
-	gtk_notebook_set_group (GTK_NOTEBOOK (priv->notebook), "EmpathyChatWindow");
+	priv->notebook = empathy_chat_notebook_new ();
+	gtk_notebook_set_group_name (GTK_NOTEBOOK (priv->notebook), "EmpathyChatWindow");
 	gtk_notebook_set_scrollable (GTK_NOTEBOOK (priv->notebook), TRUE);
 	gtk_notebook_popup_enable (GTK_NOTEBOOK (priv->notebook));
 	gtk_box_pack_start (GTK_BOX (chat_vbox), priv->notebook, TRUE, TRUE, 0);
diff --git a/src/empathy-chat-window.h b/src/empathy-chat-window.h
index 5477479..ee3db6a 100644
--- a/src/empathy-chat-window.h
+++ b/src/empathy-chat-window.h
@@ -63,6 +63,11 @@ EmpathyChat *      empathy_chat_window_find_chat      (TpAccount        *account
 void               empathy_chat_window_present_chat   (EmpathyChat      *chat,
 						       gint64 timestamp);
 
+GtkNotebook * empathy_chat_window_create_window (GtkNotebook *source,
+			 GtkWidget   *page,
+			 gint         x,
+			 gint         y);
+
 G_END_DECLS
 
 #endif /* __EMPATHY_CHAT_WINDOW_H__ */
diff --git a/src/empathy-debug-window.c b/src/empathy-debug-window.c
index affb259..ddebf23 100644
--- a/src/empathy-debug-window.c
+++ b/src/empathy-debug-window.c
@@ -1328,8 +1328,8 @@ debug_window_key_press_event_cb (GtkWidget *widget,
     GdkEventKey *event,
     gpointer user_data)
 {
-  if ((event->state & GDK_CONTROL_MASK && event->keyval == GDK_w)
-      || event->keyval == GDK_Escape)
+  if ((event->state & GDK_CONTROL_MASK && event->keyval == GDK_KEY_w)
+      || event->keyval == GDK_KEY_Escape)
     {
       gtk_widget_destroy (widget);
       return TRUE;
diff --git a/src/empathy-ft-manager.c b/src/empathy-ft-manager.c
index 6b9e537..126ad87 100644
--- a/src/empathy-ft-manager.c
+++ b/src/empathy-ft-manager.c
@@ -927,8 +927,8 @@ ft_manager_key_press_event_cb (GtkWidget *widget,
                                GdkEventKey *event,
                                gpointer user_data)
 {
-  if ((event->state & GDK_CONTROL_MASK && event->keyval == GDK_w)
-      || event->keyval == GDK_Escape)
+  if ((event->state & GDK_CONTROL_MASK && event->keyval == GDK_KEY_w)
+      || event->keyval == GDK_KEY_Escape)
     {
       gtk_widget_destroy (widget);
       return TRUE;
diff --git a/src/empathy-ft-manager.ui b/src/empathy-ft-manager.ui
index fa72af9..fe8a18a 100644
--- a/src/empathy-ft-manager.ui
+++ b/src/empathy-ft-manager.ui
@@ -9,7 +9,6 @@
     <property name="role">empathy-ft-manager</property>
     <property name="icon_name">document-send</property>
     <property name="type_hint">GDK_WINDOW_TYPE_HINT_NORMAL</property>
-    <property name="has_separator">False</property>
     <child internal-child="vbox">
       <object class="GtkVBox" id="dialog-vbox31">
         <property name="visible">True</property>
diff --git a/src/empathy-main-window.c b/src/empathy-main-window.c
index 9a336a3..6519a50 100644
--- a/src/empathy-main-window.c
+++ b/src/empathy-main-window.c
@@ -725,7 +725,7 @@ main_window_key_press_event_cb  (GtkWidget   *window,
 {
 	EmpathyChatManager *chat_manager;
 
-	if (event->keyval == GDK_T
+	if (event->keyval == GDK_KEY_T
 	    && event->state & GDK_SHIFT_MASK
 	    && event->state & GDK_CONTROL_MASK) {
 		chat_manager = empathy_chat_manager_dup_singleton ();
@@ -1661,7 +1661,6 @@ empathy_main_window_init (EmpathyMainWindow *window)
 	priv->throbber = gtk_spinner_new ();
 	gtk_widget_set_size_request (priv->throbber, 16, -1);
 	gtk_widget_set_tooltip_text (priv->throbber, _("Show and edit accounts"));
-	gtk_widget_set_has_window (GTK_WIDGET (priv->throbber), TRUE);
 	gtk_widget_set_events (priv->throbber, GDK_BUTTON_PRESS_MASK);
 	g_signal_connect (priv->throbber, "button-press-event",
 		G_CALLBACK (main_window_throbber_button_press_event_cb),
diff --git a/src/empathy-new-chatroom-dialog.ui b/src/empathy-new-chatroom-dialog.ui
index 6162d52..e2b6a81 100644
--- a/src/empathy-new-chatroom-dialog.ui
+++ b/src/empathy-new-chatroom-dialog.ui
@@ -12,7 +12,6 @@
     <property name="role">join_new_chatroom</property>
     <property name="default_width">350</property>
     <property name="type_hint">dialog</property>
-    <property name="has_separator">False</property>
     <child internal-child="vbox">
       <object class="GtkVBox" id="dialog-vbox4">
         <property name="visible">True</property>
diff --git a/src/empathy-sidebar.c b/src/empathy-sidebar.c
deleted file mode 100644
index 8c97921..0000000
--- a/src/empathy-sidebar.c
+++ /dev/null
@@ -1,608 +0,0 @@
-/*
- * Copyright (C) 2004 Red Hat, Inc.
- * Copyright (C) 2007 The Free Software Foundation
- * Copyright (C) 2008 Marco Barisione <marco@barisione.org>
- *
- * Based on evince code (shell/ev-sidebar.c) by:
- * 	- Jonathan Blandford <jrb@alum.mit.edu>
- *
- * Base on eog code (src/eog-sidebar.c) by:
- *      - Lucas Rocha <lucasr@gnome.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <string.h>
-#include <gtk/gtk.h>
-#include <gdk/gdkkeysyms.h>
-
-#include "empathy-sidebar.h"
-
-enum
-{
-    PROP_0,
-    PROP_CURRENT_PAGE
-};
-
-enum
-{
-    PAGE_COLUMN_TITLE,
-    PAGE_COLUMN_MENU_ITEM,
-    PAGE_COLUMN_MAIN_WIDGET,
-    PAGE_COLUMN_NOTEBOOK_INDEX,
-    PAGE_COLUMN_NUM_COLS
-};
-
-enum
-{
-    SIGNAL_PAGE_ADDED,
-    SIGNAL_PAGE_REMOVED,
-    SIGNAL_LAST
-};
-
-static gint signals[SIGNAL_LAST];
-
-struct _EmpathySidebarPrivate
-{
-    GtkWidget *notebook;
-    GtkWidget *select_button;
-    GtkWidget *menu;
-    GtkWidget *hbox;
-    GtkWidget *label;
-
-    GtkTreeModel *page_model;
-};
-
-G_DEFINE_TYPE (EmpathySidebar, empathy_sidebar, GTK_TYPE_VBOX)
-
-#define EMPATHY_SIDEBAR_GET_PRIVATE(object) \
-    (G_TYPE_INSTANCE_GET_PRIVATE ((object), EMPATHY_TYPE_SIDEBAR, EmpathySidebarPrivate))
-
-static void
-empathy_sidebar_destroy (GtkObject *object)
-{
-  EmpathySidebar *sidebar = EMPATHY_SIDEBAR (object);
-
-  if (sidebar->priv->menu)
-    {
-      gtk_menu_detach (GTK_MENU (sidebar->priv->menu));
-      sidebar->priv->menu = NULL;
-    }
-
-  if (sidebar->priv->page_model)
-    {
-      g_object_unref (sidebar->priv->page_model);
-      sidebar->priv->page_model = NULL;
-    }
-
-  (* GTK_OBJECT_CLASS (empathy_sidebar_parent_class)->destroy) (object);
-}
-
-static void
-empathy_sidebar_select_page (EmpathySidebar *sidebar,
-                                GtkTreeIter *iter)
-{
-  gchar *title;
-  gint index_;
-
-  gtk_tree_model_get (sidebar->priv->page_model, iter,
-      PAGE_COLUMN_TITLE, &title,
-      PAGE_COLUMN_NOTEBOOK_INDEX, &index_,
-      -1);
-
-  gtk_notebook_set_current_page (GTK_NOTEBOOK (sidebar->priv->notebook),
-      index_);
-  gtk_label_set_text (GTK_LABEL (sidebar->priv->label), title);
-
-  g_free (title);
-}
-
-void
-empathy_sidebar_set_page (EmpathySidebar *sidebar,
-                             GtkWidget *main_widget)
-{
-  GtkTreeIter iter;
-  gboolean valid;
-
-  valid = gtk_tree_model_get_iter_first (sidebar->priv->page_model, &iter);
-
-  while (valid)
-    {
-      GtkWidget *widget;
-
-      gtk_tree_model_get (sidebar->priv->page_model, &iter,
-          PAGE_COLUMN_MAIN_WIDGET, &widget,
-          -1);
-
-      if (widget == main_widget)
-        {
-          empathy_sidebar_select_page (sidebar, &iter);
-          valid = FALSE;
-        }
-      else
-        {
-          valid = gtk_tree_model_iter_next (sidebar->priv->page_model, &iter);
-        }
-
-      g_object_unref (widget);
-  }
-
-  g_object_notify (G_OBJECT (sidebar), "current-page");
-}
-
-static GtkWidget *
-empathy_sidebar_get_current_page (EmpathySidebar *sidebar)
-{
-  GtkNotebook *notebook = GTK_NOTEBOOK (sidebar->priv->notebook);
-
-  return gtk_notebook_get_nth_page (
-    notebook, gtk_notebook_get_current_page (notebook));
-}
-
-static void
-empathy_sidebar_set_property (GObject *object,
-                                 guint prop_id,
-                                 const GValue *value,
-                                 GParamSpec *pspec)
-{
-  EmpathySidebar *sidebar = EMPATHY_SIDEBAR (object);
-
-  switch (prop_id)
-    {
-      case PROP_CURRENT_PAGE:
-        empathy_sidebar_set_page (sidebar, g_value_get_object (value));
-        break;
-      default:
-        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-    }
-}
-
-static void
-empathy_sidebar_get_property (GObject *object,
-                                 guint prop_id,
-                                 GValue *value,
-                                 GParamSpec *pspec)
-{
-  EmpathySidebar *sidebar = EMPATHY_SIDEBAR (object);
-
-  switch (prop_id)
-    {
-      case PROP_CURRENT_PAGE:
-        g_value_set_object (value,
-            empathy_sidebar_get_current_page (sidebar));
-        break;
-      default:
-        G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-    }
-}
-
-static void
-empathy_sidebar_class_init (EmpathySidebarClass *empathy_sidebar_class)
-{
-  GObjectClass *g_object_class;
-  GtkWidgetClass *widget_class;
-  GtkObjectClass *gtk_object_klass;
-
-  g_object_class = G_OBJECT_CLASS (empathy_sidebar_class);
-  widget_class = GTK_WIDGET_CLASS (empathy_sidebar_class);
-  gtk_object_klass = GTK_OBJECT_CLASS (empathy_sidebar_class);
-
-  g_type_class_add_private (g_object_class, sizeof (EmpathySidebarPrivate));
-
-  gtk_object_klass->destroy = empathy_sidebar_destroy;
-  g_object_class->get_property = empathy_sidebar_get_property;
-  g_object_class->set_property = empathy_sidebar_set_property;
-
-  g_object_class_install_property (g_object_class,
-      PROP_CURRENT_PAGE,
-      g_param_spec_object ("current-page",
-          "Current page",
-          "The currently visible page",
-          GTK_TYPE_WIDGET,
-          G_PARAM_READWRITE));
-
-  signals[SIGNAL_PAGE_ADDED] = g_signal_new ("page-added",
-      EMPATHY_TYPE_SIDEBAR, G_SIGNAL_RUN_FIRST,
-      G_STRUCT_OFFSET (EmpathySidebarClass, page_added),
-      NULL, NULL, g_cclosure_marshal_VOID__OBJECT,
-      G_TYPE_NONE, 1, GTK_TYPE_WIDGET);
-
-  signals[SIGNAL_PAGE_REMOVED] = g_signal_new ("page-removed",
-      EMPATHY_TYPE_SIDEBAR, G_SIGNAL_RUN_FIRST,
-      G_STRUCT_OFFSET (EmpathySidebarClass, page_removed),
-      NULL, NULL, g_cclosure_marshal_VOID__OBJECT,
-      G_TYPE_NONE, 1, GTK_TYPE_WIDGET);
-}
-
-static void
-empathy_sidebar_menu_position_under (GtkMenu *menu,
-                                         gint *x,
-                                         gint *y,
-                                         gboolean *push_in,
-                                         gpointer user_data)
-{
-  GtkWidget *widget;
-  GtkAllocation allocation;
-
-  g_return_if_fail (GTK_IS_BUTTON (user_data));
-  g_return_if_fail (!gtk_widget_get_has_window (user_data));
-
-  widget = GTK_WIDGET (user_data);
-
-  gdk_window_get_origin (gtk_widget_get_window (widget), x, y);
-
-  gtk_widget_get_allocation (widget, &allocation);
-  *x += allocation.x;
-  *y += allocation.y + allocation.height;
-
-  *push_in = FALSE;
-}
-
-static gboolean
-empathy_sidebar_select_button_press_cb (GtkWidget *widget,
-                                           GdkEventButton *event,
-                                           gpointer user_data)
-{
-  EmpathySidebar *sidebar = EMPATHY_SIDEBAR (user_data);
-
-  if (event->button == 1)
-    {
-      GtkRequisition requisition;
-      gint width;
-      GtkAllocation allocation;
-
-      gtk_widget_get_allocation (widget, &allocation);
-      width = allocation.width;
-
-      gtk_widget_set_size_request (sidebar->priv->menu, -1, -1);
-      gtk_widget_size_request (sidebar->priv->menu, &requisition);
-      gtk_widget_set_size_request (sidebar->priv->menu,
-          MAX (width, requisition.width), -1);
-
-      gtk_widget_grab_focus (widget);
-
-      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);
-
-      gtk_menu_popup (GTK_MENU (sidebar->priv->menu),
-          NULL, NULL, empathy_sidebar_menu_position_under, widget,
-          event->button, event->time);
-
-      return TRUE;
-    }
-
-  return FALSE;
-}
-
-static gboolean
-empathy_sidebar_select_button_key_press_cb (GtkWidget *widget,
-                                               GdkEventKey *event,
-                                               gpointer user_data)
-{
-  EmpathySidebar *sidebar = EMPATHY_SIDEBAR (user_data);
-
-  if (event->keyval == GDK_space ||
-      event->keyval == GDK_KP_Space ||
-      event->keyval == GDK_Return ||
-      event->keyval == GDK_KP_Enter)
-    {
-      gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (widget), TRUE);
-
-      gtk_menu_popup (GTK_MENU (sidebar->priv->menu),
-          NULL, NULL, empathy_sidebar_menu_position_under, widget,
-          1, event->time);
-
-      return TRUE;
-    }
-
-  return FALSE;
-}
-
-static void
-empathy_sidebar_close_clicked_cb (GtkWidget *widget,
-                                     gpointer user_data)
-{
-  EmpathySidebar *sidebar = EMPATHY_SIDEBAR (user_data);
-
-  gtk_widget_hide (GTK_WIDGET (sidebar));
-}
-
-static void
-empathy_sidebar_menu_deactivate_cb (GtkWidget *widget,
-                                       gpointer user_data)
-{
-  GtkWidget *menu_button;
-
-  menu_button = GTK_WIDGET (user_data);
-
-  gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (menu_button), FALSE);
-}
-
-static void
-empathy_sidebar_menu_detach_cb (GtkWidget *widget,
-                                   GtkMenu *menu)
-{
-  EmpathySidebar *sidebar = EMPATHY_SIDEBAR (widget);
-
-  sidebar->priv->menu = NULL;
-}
-
-static void
-empathy_sidebar_menu_item_activate_cb (GtkWidget *widget,
-                                          gpointer user_data)
-{
-  EmpathySidebar *sidebar = EMPATHY_SIDEBAR (user_data);
-  GtkTreeIter iter;
-  GtkWidget *menu_item, *item;
-  gboolean valid;
-
-  menu_item = gtk_menu_get_active (GTK_MENU (sidebar->priv->menu));
-  valid = gtk_tree_model_get_iter_first (sidebar->priv->page_model, &iter);
-
-  while (valid)
-    {
-      gtk_tree_model_get (sidebar->priv->page_model, &iter,
-          PAGE_COLUMN_MENU_ITEM, &item,
-          -1);
-
-      if (item == menu_item)
-        {
-          empathy_sidebar_select_page (sidebar, &iter);
-          valid = FALSE;
-        }
-      else
-        {
-          valid = gtk_tree_model_iter_next (sidebar->priv->page_model, &iter);
-        }
-
-      g_object_unref (item);
-    }
-
-  g_object_notify (G_OBJECT (sidebar), "current-page");
-}
-
-static void
-empathy_sidebar_init (EmpathySidebar *sidebar)
-{
-  GtkWidget *hbox;
-  GtkWidget *close_button;
-  GtkWidget *select_hbox;
-  GtkWidget *arrow;
-  GtkWidget *image;
-
-  sidebar->priv = EMPATHY_SIDEBAR_GET_PRIVATE (sidebar);
-
-  /* data model */
-  sidebar->priv->page_model = (GtkTreeModel *) gtk_list_store_new (
-      PAGE_COLUMN_NUM_COLS,
-      G_TYPE_STRING,
-      GTK_TYPE_WIDGET,
-      GTK_TYPE_WIDGET,
-      G_TYPE_INT);
-
-  /* top option menu */
-  hbox = gtk_hbox_new (FALSE, 0);
-  sidebar->priv->hbox = hbox;
-  gtk_box_pack_start (GTK_BOX (sidebar), hbox, FALSE, FALSE, 0);
-  gtk_widget_show (hbox);
-
-  sidebar->priv->select_button = gtk_toggle_button_new ();
-  gtk_button_set_relief (GTK_BUTTON (sidebar->priv->select_button),
-      GTK_RELIEF_NONE);
-
-  g_signal_connect (sidebar->priv->select_button, "button_press_event",
-      G_CALLBACK (empathy_sidebar_select_button_press_cb),
-      sidebar);
-
-  g_signal_connect (sidebar->priv->select_button, "key_press_event",
-      G_CALLBACK (empathy_sidebar_select_button_key_press_cb),
-      sidebar);
-
-  select_hbox = gtk_hbox_new (FALSE, 0);
-
-  sidebar->priv->label = gtk_label_new (NULL);
-
-  gtk_box_pack_start (GTK_BOX (select_hbox),
-      sidebar->priv->label,
-      FALSE, FALSE, 0);
-
-  gtk_widget_show (sidebar->priv->label);
-
-  arrow = gtk_arrow_new (GTK_ARROW_DOWN, GTK_SHADOW_NONE);
-  gtk_box_pack_end (GTK_BOX (select_hbox), arrow, FALSE, FALSE, 0);
-  gtk_widget_show (arrow);
-
-  gtk_container_add (GTK_CONTAINER (sidebar->priv->select_button), select_hbox);
-  gtk_widget_show (select_hbox);
-
-  gtk_box_pack_start (GTK_BOX (hbox), sidebar->priv->select_button, TRUE, TRUE, 0);
-  gtk_widget_show (sidebar->priv->select_button);
-
-  close_button = gtk_button_new ();
-
-  gtk_button_set_relief (GTK_BUTTON (close_button), GTK_RELIEF_NONE);
-
-  g_signal_connect (close_button, "clicked",
-      G_CALLBACK (empathy_sidebar_close_clicked_cb),
-      sidebar);
-
-  image = gtk_image_new_from_stock (GTK_STOCK_CLOSE,
-      GTK_ICON_SIZE_MENU);
-  gtk_container_add (GTK_CONTAINER (close_button), image);
-  gtk_widget_show (image);
-
-  gtk_box_pack_end (GTK_BOX (hbox), close_button, FALSE, FALSE, 0);
-  gtk_widget_show (close_button);
-
-  sidebar->priv->menu = gtk_menu_new ();
-
-  g_signal_connect (sidebar->priv->menu, "deactivate",
-      G_CALLBACK (empathy_sidebar_menu_deactivate_cb),
-      sidebar->priv->select_button);
-
-  gtk_menu_attach_to_widget (GTK_MENU (sidebar->priv->menu),
-      GTK_WIDGET (sidebar),
-      empathy_sidebar_menu_detach_cb);
-
-  gtk_widget_show (sidebar->priv->menu);
-
-  sidebar->priv->notebook = gtk_notebook_new ();
-
-  gtk_notebook_set_show_border (GTK_NOTEBOOK (sidebar->priv->notebook), FALSE);
-  gtk_notebook_set_show_tabs (GTK_NOTEBOOK (sidebar->priv->notebook), FALSE);
-
-  gtk_box_pack_start (GTK_BOX (sidebar), sidebar->priv->notebook,
-      TRUE, TRUE, 0);
-
-  gtk_widget_show (sidebar->priv->notebook);
-}
-
-GtkWidget *
-empathy_sidebar_new (void)
-{
-  GtkWidget *sidebar;
-
-  sidebar = g_object_new (EMPATHY_TYPE_SIDEBAR, NULL);
-
-  return sidebar;
-}
-
-void
-empathy_sidebar_add_page (EmpathySidebar *sidebar,
-                             const gchar *title,
-                             GtkWidget *main_widget)
-{
-  GtkTreeIter iter;
-  GtkWidget *menu_item;
-  gchar *label_title;
-  gint index_;
-
-  g_return_if_fail (EMPATHY_IS_SIDEBAR (sidebar));
-  g_return_if_fail (GTK_IS_WIDGET (main_widget));
-
-  index_ = gtk_notebook_append_page (GTK_NOTEBOOK (sidebar->priv->notebook),
-      main_widget, NULL);
-
-  menu_item = gtk_image_menu_item_new_with_label (title);
-
-  g_signal_connect (menu_item, "activate",
-      G_CALLBACK (empathy_sidebar_menu_item_activate_cb),
-      sidebar);
-
-  gtk_widget_show (menu_item);
-
-  gtk_menu_shell_append (GTK_MENU_SHELL (sidebar->priv->menu),
-      menu_item);
-
-  /* Insert and move to end */
-  gtk_list_store_insert_with_values (GTK_LIST_STORE (sidebar->priv->page_model),
-      &iter, 0,
-      PAGE_COLUMN_TITLE, title,
-      PAGE_COLUMN_MENU_ITEM, menu_item,
-      PAGE_COLUMN_MAIN_WIDGET, main_widget,
-      PAGE_COLUMN_NOTEBOOK_INDEX, index_,
-      -1);
-
-  gtk_list_store_move_before (GTK_LIST_STORE(sidebar->priv->page_model),
-      &iter,
-      NULL);
-
-  /* Set the first item added as active */
-  gtk_tree_model_get_iter_first (sidebar->priv->page_model, &iter);
-  gtk_tree_model_get (sidebar->priv->page_model,
-      &iter,
-      PAGE_COLUMN_TITLE, &label_title,
-      PAGE_COLUMN_NOTEBOOK_INDEX, &index_,
-      -1);
-
-  gtk_menu_set_active (GTK_MENU (sidebar->priv->menu), index_);
-
-  gtk_label_set_text (GTK_LABEL (sidebar->priv->label), label_title);
-
-  gtk_notebook_set_current_page (GTK_NOTEBOOK (sidebar->priv->notebook),
-      index_);
-
-  g_free (label_title);
-
-  g_signal_emit (G_OBJECT (sidebar), signals[SIGNAL_PAGE_ADDED],
-      0, main_widget);
-}
-
-void
-empathy_sidebar_remove_page (EmpathySidebar *sidebar,
-                                GtkWidget *main_widget)
-{
-  GtkTreeIter iter;
-  GtkWidget *widget, *menu_item;
-  gboolean valid;
-  gint index_;
-
-  g_return_if_fail (EMPATHY_IS_SIDEBAR (sidebar));
-  g_return_if_fail (GTK_IS_WIDGET (main_widget));
-
-  valid = gtk_tree_model_get_iter_first (sidebar->priv->page_model, &iter);
-
-  while (valid)
-    {
-      gtk_tree_model_get (sidebar->priv->page_model, &iter,
-          PAGE_COLUMN_NOTEBOOK_INDEX, &index_,
-          PAGE_COLUMN_MENU_ITEM, &menu_item,
-          PAGE_COLUMN_MAIN_WIDGET, &widget,
-          -1);
-
-      if (widget == main_widget)
-          break;
-      else
-          valid = gtk_tree_model_iter_next (sidebar->priv->page_model, &iter);
-
-      g_object_unref (menu_item);
-      g_object_unref (widget);
-    }
-
-  if (valid)
-    {
-      gtk_notebook_remove_page (GTK_NOTEBOOK (sidebar->priv->notebook),
-          index_);
-
-      gtk_container_remove (GTK_CONTAINER (sidebar->priv->menu), menu_item);
-
-      gtk_list_store_remove (GTK_LIST_STORE (sidebar->priv->page_model),
-          &iter);
-
-      g_signal_emit (G_OBJECT (sidebar),
-          signals[SIGNAL_PAGE_REMOVED], 0, main_widget);
-    }
-}
-
-gint
-empathy_sidebar_get_n_pages (EmpathySidebar *sidebar)
-{
-  g_return_val_if_fail (EMPATHY_IS_SIDEBAR (sidebar), TRUE);
-
-  return gtk_tree_model_iter_n_children (
-      GTK_TREE_MODEL (sidebar->priv->page_model), NULL);
-}
-
-gboolean
-empathy_sidebar_is_empty (EmpathySidebar *sidebar)
-{
-  g_return_val_if_fail (EMPATHY_IS_SIDEBAR (sidebar), TRUE);
-
-  return gtk_tree_model_iter_n_children (
-      GTK_TREE_MODEL (sidebar->priv->page_model), NULL) == 0;
-}
diff --git a/src/empathy-sidebar.h b/src/empathy-sidebar.h
deleted file mode 100644
index 095336f..0000000
--- a/src/empathy-sidebar.h
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (C) 2004 Red Hat, Inc.
- * Copyright (C) 2007 The Free Software Foundation
- * Copyright (C) 2008 Marco Barisione <marco@barisione.org>
- *
- * Based on evince code (shell/ev-sidebar.h) by:
- * 	- Jonathan Blandford <jrb@alum.mit.edu>
- *
- * Base on eog code (src/eog-sidebar.c) by:
- *      - Lucas Rocha <lucasr@gnome.org>
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation; either version 2 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
- */
-
-#ifndef __EMPATHY_SIDEBAR_H__
-#define __EMPATHY_SIDEBAR_H__
-
-#include <gtk/gtk.h>
-
-G_BEGIN_DECLS
-
-typedef struct _EmpathySidebar EmpathySidebar;
-typedef struct _EmpathySidebarClass EmpathySidebarClass;
-typedef struct _EmpathySidebarPrivate EmpathySidebarPrivate;
-
-#define EMPATHY_TYPE_SIDEBAR            (empathy_sidebar_get_type())
-#define EMPATHY_SIDEBAR(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj), EMPATHY_TYPE_SIDEBAR, EmpathySidebar))
-#define EMPATHY_SIDEBAR_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass),  EMPATHY_TYPE_SIDEBAR, EmpathySidebarClass))
-#define EMPATHY_IS_SIDEBAR(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj), EMPATHY_TYPE_SIDEBAR))
-#define EMPATHY_IS_SIDEBAR_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),  EMPATHY_TYPE_SIDEBAR))
-#define EMPATHY_SIDEBAR_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj),  EMPATHY_TYPE_SIDEBAR, EmpathySidebarClass))
-
-struct _EmpathySidebar
-{
-  GtkVBox base_instance;
-
-  EmpathySidebarPrivate *priv;
-};
-
-struct _EmpathySidebarClass
-{
-  GtkVBoxClass base_class;
-
-  void (* page_added)   (EmpathySidebar *sidebar,
-                         GtkWidget *main_widget);
-
-  void (* page_removed) (EmpathySidebar *sidebar,
-                         GtkWidget *main_widget);
-};
-
-GType      empathy_sidebar_get_type     (void);
-
-GtkWidget *empathy_sidebar_new          (void);
-
-void       empathy_sidebar_add_page     (EmpathySidebar *sidebar,
-                                            const gchar *title,
-                                            GtkWidget *main_widget);
-
-void       empathy_sidebar_remove_page  (EmpathySidebar *sidebar,
-                                            GtkWidget *main_widget);
-
-void       empathy_sidebar_set_page     (EmpathySidebar *sidebar,
-                                            GtkWidget *main_widget);
-
-gint       empathy_sidebar_get_n_pages  (EmpathySidebar *sidebar);
-
-gboolean   empathy_sidebar_is_empty     (EmpathySidebar *sidebar);
-
-G_END_DECLS
-
-#endif /* __EMPATHY_SIDEBAR_H__ */
-
-
diff --git a/src/empathy-status-icon.c b/src/empathy-status-icon.c
index 97ab255..a062f51 100644
--- a/src/empathy-status-icon.c
+++ b/src/empathy-status-icon.c
@@ -466,7 +466,7 @@ status_icon_key_press_event_cb  (GtkWidget *window,
 				 GdkEventKey *event,
 				 EmpathyStatusIcon *icon)
 {
-	if (event->keyval == GDK_Escape) {
+	if (event->keyval == GDK_KEY_Escape) {
 		status_icon_set_visibility (icon, FALSE, TRUE);
 	}
 	return FALSE;
diff --git a/src/ev-sidebar.c b/src/ev-sidebar.c
new file mode 100644
index 0000000..d0dd2b6
--- /dev/null
+++ b/src/ev-sidebar.c
@@ -0,0 +1,338 @@
+/* this file is part of evince, a gnome document viewer
+ *
+ *  Copyright (C) 2004 Red Hat, Inc.
+ *            (C) 2007 Jan Arne Petersen
+ *
+ *  Authors:
+ *    Jonathan Blandford <jrb@alum.mit.edu>
+ *    Jan Arne Petersen <jpetersen@jpetersen.org>
+ *
+ * Evince is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Evince is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02110-1301  USA.
+ *
+ * Thursday 03 May 2007: Bastien Nocera: Add exception clause.
+ * See license_change file for details.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+#include <gtk/gtk.h>
+#include <gdk/gdkkeysyms.h>
+
+#include "ev-sidebar.h"
+
+enum
+{
+	PAGE_COLUMN_ID,
+	PAGE_COLUMN_TITLE,
+	PAGE_COLUMN_NUM_COLS
+};
+
+struct _EvSidebarPrivate {
+	GtkWidget *combobox;
+	GtkWidget *notebook;
+};
+
+enum {
+	CLOSED,
+	LAST_SIGNAL
+};
+
+static int ev_sidebar_table_signals[LAST_SIGNAL] = { 0 };
+
+G_DEFINE_TYPE (EvSidebar, ev_sidebar, GTK_TYPE_VBOX)
+
+#define EV_SIDEBAR_GET_PRIVATE(object) \
+		(G_TYPE_INSTANCE_GET_PRIVATE ((object), EV_TYPE_SIDEBAR, EvSidebarPrivate))
+
+static void
+ev_sidebar_class_init (EvSidebarClass *ev_sidebar_class)
+{
+	GObjectClass *g_object_class;
+	GtkWidgetClass *widget_class;
+ 
+	g_object_class = G_OBJECT_CLASS (ev_sidebar_class);
+	widget_class = GTK_WIDGET_CLASS (ev_sidebar_class);
+	   
+	g_type_class_add_private (g_object_class, sizeof (EvSidebarPrivate));
+
+	ev_sidebar_table_signals[CLOSED] =
+		g_signal_new ("closed",
+				G_TYPE_FROM_CLASS (g_object_class),
+				G_SIGNAL_RUN_LAST,
+				G_STRUCT_OFFSET (EvSidebarClass, closed),
+				NULL, NULL,
+				g_cclosure_marshal_VOID__VOID,
+				G_TYPE_NONE, 0);
+
+}
+
+static void
+ev_sidebar_close_clicked_cb (GtkWidget *widget,
+			     gpointer   user_data)
+{
+	EvSidebar *ev_sidebar = EV_SIDEBAR (user_data);
+
+	g_signal_emit (G_OBJECT (ev_sidebar),
+			ev_sidebar_table_signals[CLOSED], 0, NULL);
+	gtk_widget_hide (GTK_WIDGET (ev_sidebar));
+}
+
+static void
+ev_sidebar_combobox_changed_cb (GtkComboBox *combo_box,
+				gpointer   user_data)
+{
+	EvSidebar *ev_sidebar = EV_SIDEBAR (user_data);
+	GtkTreeModel *model;
+	GtkTreeIter iter;
+
+	model = gtk_combo_box_get_model (combo_box);
+
+	if (gtk_combo_box_get_active_iter (combo_box, &iter)) {
+		GtkTreePath *path;
+		gint *indices;
+
+		path = gtk_tree_model_get_path (model, &iter);
+		indices = gtk_tree_path_get_indices (path);
+
+		if (indices != NULL) {
+			gtk_notebook_set_current_page (GTK_NOTEBOOK (ev_sidebar->priv->notebook), indices[0]);
+		}
+
+		gtk_tree_path_free (path);
+	}
+}
+
+static void
+ev_sidebar_init (EvSidebar *ev_sidebar)
+{
+	GtkTreeModel *page_model;
+	GtkWidget *vbox, *hbox;
+	GtkWidget *close_button;
+	GtkCellRenderer *renderer;
+	GtkWidget *image;
+
+	ev_sidebar->priv = EV_SIDEBAR_GET_PRIVATE (ev_sidebar);
+
+	/* data model */
+	page_model = (GtkTreeModel *)
+			gtk_list_store_new (PAGE_COLUMN_NUM_COLS,
+					    G_TYPE_STRING,
+					    G_TYPE_STRING,
+					    GTK_TYPE_WIDGET,
+					    G_TYPE_INT);
+
+	/* create a 6 6 6 0 border with GtkBoxes */
+	hbox = gtk_hbox_new (FALSE, 6);
+	gtk_box_pack_start (GTK_BOX (ev_sidebar), hbox, TRUE, TRUE, 6);
+
+	vbox = gtk_vbox_new (FALSE, 6);
+	gtk_box_pack_start (GTK_BOX (hbox), vbox, TRUE, TRUE, 0);
+	gtk_box_pack_start (GTK_BOX (hbox), gtk_vbox_new (FALSE, 0), FALSE, FALSE, 0);
+
+	/* top option menu */
+	hbox = gtk_hbox_new (FALSE, 6);
+	gtk_box_pack_start (GTK_BOX (vbox), hbox, FALSE, FALSE, 0);
+	gtk_widget_show (hbox);
+
+	ev_sidebar->priv->combobox = gtk_combo_box_new_with_model (page_model);
+	g_signal_connect (ev_sidebar->priv->combobox, "changed",
+			  G_CALLBACK (ev_sidebar_combobox_changed_cb),
+			  ev_sidebar);
+
+	renderer = gtk_cell_renderer_text_new ();
+	gtk_cell_layout_pack_start (GTK_CELL_LAYOUT (ev_sidebar->priv->combobox), renderer, TRUE);
+	gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (ev_sidebar->priv->combobox), renderer, "text", PAGE_COLUMN_TITLE);
+
+	gtk_box_pack_start (GTK_BOX (hbox), ev_sidebar->priv->combobox, TRUE, TRUE, 0);
+	gtk_widget_show (ev_sidebar->priv->combobox);
+
+	g_object_unref (G_OBJECT (page_model));
+
+	close_button = gtk_button_new ();
+	gtk_button_set_relief (GTK_BUTTON (close_button), GTK_RELIEF_NONE);
+	g_signal_connect (close_button, "clicked",
+			  G_CALLBACK (ev_sidebar_close_clicked_cb),
+			  ev_sidebar);
+
+	image = gtk_image_new_from_stock (GTK_STOCK_CLOSE,
+					  GTK_ICON_SIZE_MENU);
+	gtk_container_add (GTK_CONTAINER (close_button), image);
+	gtk_widget_show (image);
+   
+	gtk_box_pack_end (GTK_BOX (hbox), close_button, FALSE, FALSE, 0);
+	gtk_widget_show (close_button);
+   
+	ev_sidebar->priv->notebook = gtk_notebook_new ();
+	gtk_notebook_set_show_border (GTK_NOTEBOOK (ev_sidebar->priv->notebook), FALSE);
+	gtk_notebook_set_show_tabs (GTK_NOTEBOOK (ev_sidebar->priv->notebook), FALSE);
+	gtk_box_pack_start (GTK_BOX (vbox), ev_sidebar->priv->notebook,
+			    TRUE, TRUE, 0);
+	gtk_widget_show (ev_sidebar->priv->notebook);
+}
+
+/* Public functions */
+
+GtkWidget *
+ev_sidebar_new (void)
+{
+	GtkWidget *ev_sidebar;
+
+	ev_sidebar = g_object_new (EV_TYPE_SIDEBAR, NULL);
+
+	return ev_sidebar;
+}
+
+/* NOTE: Return values from this have to be g_free()d */
+char *
+ev_sidebar_get_current_page (EvSidebar *ev_sidebar)
+{
+	GtkTreeModel *model;
+	GtkTreeIter iter;
+	char *id;
+
+	g_return_val_if_fail (EV_IS_SIDEBAR (ev_sidebar), NULL);
+	g_return_val_if_fail (ev_sidebar->priv != NULL, NULL);
+
+	model = gtk_combo_box_get_model (GTK_COMBO_BOX (ev_sidebar->priv->combobox));
+
+	if (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (ev_sidebar->priv->combobox), &iter)) {
+		gtk_tree_model_get (model, &iter, PAGE_COLUMN_ID, &id, -1);
+
+		return id;
+	}
+
+	return NULL;
+}
+
+static gboolean
+ev_sidebar_get_iter_for_page_id (EvSidebar *ev_sidebar,
+				 const char *new_page_id,
+				 GtkTreeIter *iter)
+{
+	GtkTreeModel *model;
+	gboolean valid;
+	gchar *page_id;
+
+	g_return_val_if_fail (EV_IS_SIDEBAR (ev_sidebar), FALSE);
+	g_return_val_if_fail (ev_sidebar->priv != NULL, FALSE);
+	g_return_val_if_fail (iter != NULL, FALSE);
+
+	model = gtk_combo_box_get_model (GTK_COMBO_BOX (ev_sidebar->priv->combobox));
+
+	valid = gtk_tree_model_get_iter_first (model, iter);
+
+	while (valid) {
+		gtk_tree_model_get (model, iter, PAGE_COLUMN_ID, &page_id, -1);
+
+		if (page_id != NULL && strcmp (new_page_id, page_id) == 0) {
+			g_free (page_id);
+			return TRUE;
+		}
+		g_free (page_id);
+
+		valid = gtk_tree_model_iter_next (model, iter);
+	}
+
+	return FALSE;
+}
+
+void
+ev_sidebar_set_current_page (EvSidebar *ev_sidebar, const char *new_page_id)
+{
+	GtkTreeIter iter;
+
+	g_return_if_fail (EV_IS_SIDEBAR (ev_sidebar));
+	g_return_if_fail (new_page_id != NULL);
+
+
+	if (ev_sidebar_get_iter_for_page_id (ev_sidebar, new_page_id, &iter)) {
+		gtk_combo_box_set_active_iter (GTK_COMBO_BOX (ev_sidebar->priv->combobox), &iter);
+	}
+}
+
+void
+ev_sidebar_add_page (EvSidebar   *ev_sidebar,
+		     const gchar *page_id,
+		     const gchar *title,
+		     GtkWidget   *main_widget)
+{
+	GtkTreeIter iter, iter2;
+	GtkTreeModel *model;
+	   
+	g_return_if_fail (EV_IS_SIDEBAR (ev_sidebar));
+	g_return_if_fail (page_id != NULL);
+	g_return_if_fail (title != NULL);
+	g_return_if_fail (GTK_IS_WIDGET (main_widget));
+
+	model = gtk_combo_box_get_model (GTK_COMBO_BOX (ev_sidebar->priv->combobox));
+
+	gtk_widget_set_sensitive (GTK_WIDGET (ev_sidebar), TRUE);
+
+	gtk_widget_show (main_widget);	
+	gtk_notebook_append_page (GTK_NOTEBOOK (ev_sidebar->priv->notebook), main_widget, NULL);
+
+	gtk_list_store_append (GTK_LIST_STORE (model), &iter);
+	gtk_list_store_set (GTK_LIST_STORE (model), &iter,
+			    PAGE_COLUMN_ID, page_id,
+			    PAGE_COLUMN_TITLE, title,
+			    -1);
+
+	if (!gtk_combo_box_get_active_iter (GTK_COMBO_BOX (ev_sidebar->priv->combobox), &iter2)) {
+		gtk_combo_box_set_active_iter (GTK_COMBO_BOX (ev_sidebar->priv->combobox), &iter);
+	}
+}
+
+void
+ev_sidebar_remove_page (EvSidebar   *ev_sidebar,
+			const gchar *page_id)
+{
+	GtkTreeIter iter;
+	GtkTreeModel *model;
+	   
+	g_return_if_fail (EV_IS_SIDEBAR (ev_sidebar));
+	g_return_if_fail (page_id != NULL);
+
+	model = gtk_combo_box_get_model (GTK_COMBO_BOX (ev_sidebar->priv->combobox));
+
+	if (ev_sidebar_get_iter_for_page_id (ev_sidebar, page_id, &iter)) {
+		GtkTreePath *path;
+		gint *indices;
+
+		path = gtk_tree_model_get_path (model, &iter);
+		indices = gtk_tree_path_get_indices (path);
+
+		g_assert (indices != NULL);
+		gtk_notebook_remove_page (GTK_NOTEBOOK (ev_sidebar->priv->notebook), indices[0]);
+
+		gtk_list_store_remove (GTK_LIST_STORE (model), &iter);
+
+		if (gtk_tree_model_iter_n_children (model, NULL) != 0) {
+			gtk_tree_path_prev (path);
+
+			if (gtk_tree_model_get_iter (model, &iter, path)) {
+				gtk_combo_box_set_active_iter (GTK_COMBO_BOX (ev_sidebar->priv->combobox), &iter);
+			}
+		} else {
+			gtk_widget_set_sensitive (GTK_WIDGET (ev_sidebar), FALSE);
+		}
+
+		gtk_tree_path_free (path);
+	}
+}
+
diff --git a/src/ev-sidebar.h b/src/ev-sidebar.h
new file mode 100644
index 0000000..cfb57f2
--- /dev/null
+++ b/src/ev-sidebar.h
@@ -0,0 +1,76 @@
+/* ev-sidebar.h
+ *  this file is part of evince, a gnome document viewer
+ * 
+ * Copyright (C) 2004 Red Hat, Inc.
+ *
+ * Author:
+ *   Jonathan Blandford <jrb@alum.mit.edu>
+ *
+ * Evince is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * Evince is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02110-1301  USA.
+ *
+ * Thursday 03 May 2007: Bastien Nocera: Add exception clause.
+ * See license_change file for details.
+ *
+ */
+
+#ifndef __EV_SIDEBAR_H__
+#define __EV_SIDEBAR_H__
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+typedef struct _EvSidebar EvSidebar;
+typedef struct _EvSidebarClass EvSidebarClass;
+typedef struct _EvSidebarPrivate EvSidebarPrivate;
+
+#define EV_TYPE_SIDEBAR		     (ev_sidebar_get_type())
+#define EV_SIDEBAR(object)	     (G_TYPE_CHECK_INSTANCE_CAST((object), EV_TYPE_SIDEBAR, EvSidebar))
+#define EV_SIDEBAR_CLASS(klass)	     (G_TYPE_CHECK_CLASS_CAST((klass), EV_TYPE_SIDEBAR, EvSidebarClass))
+#define EV_IS_SIDEBAR(object)	     (G_TYPE_CHECK_INSTANCE_TYPE((object), EV_TYPE_SIDEBAR))
+#define EV_IS_SIDEBAR_CLASS(klass)   (G_TYPE_CHECK_CLASS_TYPE((klass), EV_TYPE_SIDEBAR))
+#define EV_SIDEBAR_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS((object), EV_TYPE_SIDEBAR, EvSidebarClass))
+
+struct _EvSidebar {
+	GtkVBox base_instance;
+
+	EvSidebarPrivate *priv;
+};
+
+struct _EvSidebarClass {
+	GtkVBoxClass base_class;
+
+	void (*closed) (EvSidebar *sidebar);
+};
+
+GType      ev_sidebar_get_type     (void);
+GtkWidget *ev_sidebar_new          (void);
+void       ev_sidebar_add_page     (EvSidebar   *ev_sidebar,
+				    const gchar *page_id,
+				    const gchar *title,
+				    GtkWidget   *main_widget);
+void       ev_sidebar_set_current_page
+				   (EvSidebar *ev_sidebar,
+				    const char *page_id);
+char      *ev_sidebar_get_current_page
+				   (EvSidebar *ev_sidebar);
+void        ev_sidebar_remove_page (EvSidebar   *ev_sidebar,
+				    const gchar *page_id);
+
+G_END_DECLS
+
+#endif /* __EV_SIDEBAR_H__ */
+
+
