[libgda] Tools: modifications to get rid of deprecated API



commit 50c989b57bc53211008f79266d1e7d32e1717d1d
Author: Vivien Malerba <malerba gnome-db org>
Date:   Wed Jul 8 15:21:37 2015 +0200

    Tools: modifications to get rid of deprecated API

 control-center/gdaui-bar.c                         |   13 +
 control-center/gdaui-bar.h                         |    3 +-
 tools/browser/Makefile.am                          |    4 +-
 tools/browser/browser-page.c                       |   52 ++--
 tools/browser/browser-page.h                       |   12 +-
 tools/browser/browser-perspective.c                |  238 ++++++++---------
 tools/browser/browser-perspective.h                |   32 +--
 tools/browser/browser-window.c                     |   47 +---
 tools/browser/browser-window.h                     |    4 -
 tools/browser/canvas/browser-canvas-db-relations.c |   16 +-
 tools/browser/canvas/browser-canvas-text.c         |   12 +-
 tools/browser/canvas/browser-canvas.c              |   15 +-
 tools/browser/data-manager/data-console.c          |  110 ++++-----
 .../browser/data-manager/data-favorite-selector.c  |    2 -
 .../data-manager/data-manager-perspective.c        |   81 ++-----
 tools/browser/data-manager/data-source.c           |    2 +-
 .../browser/dummy-perspective/dummy-perspective.c  |  113 +++------
 tools/browser/ldap-browser/entry-properties.c      |    8 +-
 .../ldap-browser/ldap-browser-perspective.c        |   86 ++-----
 tools/browser/ldap-browser/ldap-classes-page.c     |  150 +++++------
 tools/browser/ldap-browser/ldap-entries-page.c     |  150 +++++------
 tools/browser/ldap-browser/ldap-search-page.c      |  223 +++--------------
 tools/browser/ldap-browser/vtable-dialog.c         |    6 +-
 tools/browser/query-exec/query-console-page.c      |  130 ++++------
 tools/browser/query-exec/query-exec-perspective.c  |   82 ++-----
 tools/browser/query-exec/query-result.c            |    6 +-
 tools/browser/schema-browser/relations-diagram.c   |   77 +++----
 .../schema-browser/schema-browser-perspective.c    |   85 ++-----
 tools/browser/schema-browser/table-info.c          |  134 ++++++-----
 tools/browser/text-search.c                        |   10 +-
 tools/browser/ui-customize.c                       |  269 ++++++++++++++++++++
 tools/browser/ui-customize.h                       |   39 +++
 tools/browser/ui-formgrid.c                        |    3 +-
 tools/browser/ui-support.c                         |    2 +-
 tools/browser/widget-overlay.c                     |    9 +-
 35 files changed, 1018 insertions(+), 1207 deletions(-)
---
diff --git a/control-center/gdaui-bar.c b/control-center/gdaui-bar.c
index cb9bc2d..60574ad 100644
--- a/control-center/gdaui-bar.c
+++ b/control-center/gdaui-bar.c
@@ -413,6 +413,19 @@ gdaui_bar_set_icon_from_pixbuf (GdauiBar *bar, GdkPixbuf *pixbuf)
 }
 
 /**
+ * gdaui_bar_set_icon_from_icon_name:
+ */
+void
+gdaui_bar_set_icon_from_icon_name (GdauiBar *bar, const gchar *icon_name)
+{
+       g_return_if_fail (GDAUI_IS_BAR (bar));
+       g_return_if_fail (icon_name);
+
+       gtk_image_set_from_icon_name (GTK_IMAGE (bar->priv->icon), icon_name, GTK_ICON_SIZE_SMALL_TOOLBAR);
+       gdaui_bar_set_show_icon (bar, TRUE);
+}
+
+/**
  * gdaui_bar_set_show_icon
  * @bar: a #GdauiBar widget.
  * @show: whether to show the icon or not.
diff --git a/control-center/gdaui-bar.h b/control-center/gdaui-bar.h
index 704ddd7..91f8a44 100644
--- a/control-center/gdaui-bar.h
+++ b/control-center/gdaui-bar.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2012 - 2014 Vivien Malerba <malerba gnome-db org>
+ * Copyright (C) 2009 - 2015 Vivien Malerba <malerba gnome-db org>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -59,6 +59,7 @@ void         gdaui_bar_set_text                  (GdauiBar *bar, const gchar *te
 void         gdaui_bar_set_icon_from_file        (GdauiBar *bar, const gchar *file);
 void         gdaui_bar_set_icon_from_resource    (GdauiBar *bar, const gchar *resource_name);
 void         gdaui_bar_set_icon_from_pixbuf      (GdauiBar *bar, GdkPixbuf *pixbuf);
+void         gdaui_bar_set_icon_from_icon_name   (GdauiBar *bar, const gchar *icon_name);
 void         gdaui_bar_set_show_icon             (GdauiBar *bar, gboolean show);
 gboolean     gdaui_bar_get_show_icon             (GdauiBar *bar);
 
diff --git a/tools/browser/Makefile.am b/tools/browser/Makefile.am
index 8e706a2..ca9ebe4 100644
--- a/tools/browser/Makefile.am
+++ b/tools/browser/Makefile.am
@@ -75,7 +75,9 @@ libbrowsercore_la_SOURCES=\
        ui-formgrid.h \
        ui-formgrid.c \
        text-search.h \
-       text-search.c
+       text-search.c \
+       ui-customize.h \
+       ui-customize.c
 
 $(OBJECTS): marshal.c marshal.h
 
diff --git a/tools/browser/browser-page.c b/tools/browser/browser-page.c
index b95ccae..fb8e3d6 100644
--- a/tools/browser/browser-page.c
+++ b/tools/browser/browser-page.c
@@ -19,6 +19,8 @@
 
 #include "browser-page.h"
 #include "browser-perspective.h"
+#include "ui-customize.h"
+
 static GRecMutex init_rmutex;
 #define MUTEX_LOCK() g_rec_mutex_lock(&init_rmutex)
 #define MUTEX_UNLOCK() g_rec_mutex_unlock(&init_rmutex)
@@ -66,43 +68,41 @@ browser_page_class_init (G_GNUC_UNUSED gpointer g_class)
 }
 
 /**
- * browser_page_get_actions_group
+ * browser_page_customize:
  * @page: an object implementing the #BrowserPage interface
+ * @toolbar: (allow-none):
+ * @header: (allow-none):
  *
- * Get the #GtkActionGroup from a @page to represent its specific actions.
- *
- * Returns: a new #GtkActionGroup
+ * Add optional custom UI elements to @toolbar, @header and @menu. any call to the
+ * browser_page_uncustomize() function will undo all the customizations to
+ * these elements.
  */
-GtkActionGroup *
-browser_page_get_actions_group (BrowserPage *page)
+void
+browser_page_customize (BrowserPage *page, GtkToolbar *toolbar, GtkHeaderBar *header)
 {
-       g_return_val_if_fail (IS_BROWSER_PAGE (page), NULL);
-       
-       if (BROWSER_PAGE_GET_CLASS (page)->i_get_actions_group)
-               return (BROWSER_PAGE_GET_CLASS (page)->i_get_actions_group) (page);
-       else
-               return NULL;
+       g_return_if_fail (IS_BROWSER_PAGE (page));
+       if (BROWSER_PAGE_GET_CLASS (page)->i_customize)
+               (BROWSER_PAGE_GET_CLASS (page)->i_customize) (page, toolbar, header);
 }
 
 /**
- * browser_page_get_actions_ui
+ * browser_page_uncustomize:
  * @page: an object implementing the #BrowserPage interface
  *
- * Get the UI definition from @page to represent how its specific actions (obtained
- * using browser_page_get_actions_group()) are to be integrated in a #BrowserWindow's menu
- * and toolbar.
- *
- * Returns: a read-only string
+ * Remove any optional custom UI elements which have been added
+ * when browser_page_customize() was called.
  */
-const gchar *
-browser_page_get_actions_ui (BrowserPage *page)
+void
+browser_page_uncustomize (BrowserPage *page)
 {
-       g_return_val_if_fail (IS_BROWSER_PAGE (page), NULL);
-       
-       if (BROWSER_PAGE_GET_CLASS (page)->i_get_actions_ui)
-               return (BROWSER_PAGE_GET_CLASS (page)->i_get_actions_ui) (page);
-       else
-               return NULL;
+       g_return_if_fail (IS_BROWSER_PAGE (page));
+       if (BROWSER_PAGE_GET_CLASS (page)->i_uncustomize)
+               (BROWSER_PAGE_GET_CLASS (page)->i_uncustomize) (page);
+       else {
+               g_print ("Default browser_page_uncustomize for %s\n", G_OBJECT_CLASS_NAME (G_OBJECT_GET_CLASS 
(page)));
+               if (customization_data_exists (G_OBJECT (page)))
+                       customization_data_release (G_OBJECT (page));
+       }
 }
 
 /**
diff --git a/tools/browser/browser-page.h b/tools/browser/browser-page.h
index aa67856..49b95ca 100644
--- a/tools/browser/browser-page.h
+++ b/tools/browser/browser-page.h
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 - 2014 Vivien Malerba <malerba gnome-db org>
+ * Copyright (C) 2009 - 2015 Vivien Malerba <malerba gnome-db org>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -34,8 +34,9 @@ struct _BrowserPageIface {
        GTypeInterface           g_iface;
 
        /* virtual table */
-       GtkActionGroup      *(* i_get_actions_group) (BrowserPage *page);
-       const gchar         *(* i_get_actions_ui) (BrowserPage *page);
+       void                 (* i_customize) (BrowserPage *page, GtkToolbar *toolbar, GtkHeaderBar *header);
+        void                 (* i_uncustomize) (BrowserPage *page);
+
        GtkWidget           *(* i_get_tab_label) (BrowserPage *page, GtkWidget **out_close_button);
 };
 
@@ -54,8 +55,9 @@ struct _BrowserPageIface {
 
 GType               browser_page_get_type          (void) G_GNUC_CONST;
 
-GtkActionGroup     *browser_page_get_actions_group (BrowserPage *page);
-const gchar        *browser_page_get_actions_ui    (BrowserPage *page);
+void                browser_page_customize         (BrowserPage *page, GtkToolbar *toolbar, GtkHeaderBar 
*header);
+void                browser_page_uncustomize       (BrowserPage *page);
+
 
 BrowserPerspective *browser_page_get_perspective   (BrowserPage *page);
 GtkWidget          *browser_page_get_tab_label     (BrowserPage *page, GtkWidget **out_close_button);
diff --git a/tools/browser/browser-perspective.c b/tools/browser/browser-perspective.c
index 50b3243..02be830 100644
--- a/tools/browser/browser-perspective.c
+++ b/tools/browser/browser-perspective.c
@@ -22,6 +22,7 @@
 #include "browser-page.h"
 #include "browser-window.h"
 #include "ui-support.h"
+#include "ui-customize.h"
 #include <string.h>
 
 #include "schema-browser/perspective-main.h"
@@ -83,196 +84,181 @@ browser_perspective_class_init (G_GNUC_UNUSED gpointer g_class)
  * @perspective: an object implementing the #BrowserPerspective interface
  * @toolbar: (allow-none):
  * @header: (allow-none):
- * @menu: (allow-none):
  *
  * Add optional custom UI elements to @toolbar, @header and @menu. any call to the
  * browser_perspective_uncustomize() function will undo all the customizations to
  * these elements
  */
 void
-browser_perspective_customize (BrowserPerspective *perspective, GtkToolbar *toolbar,
-                              GtkHeaderBar *header, GMenu *menu)
+browser_perspective_customize (BrowserPerspective *perspective, GtkToolbar *toolbar, GtkHeaderBar *header)
 {
        g_return_if_fail (IS_BROWSER_PERSPECTIVE (perspective));
-       g_print ("%s (%p)\n", __FUNCTION__, perspective);
        if (BROWSER_PERSPECTIVE_GET_CLASS (perspective)->i_customize)
-               (BROWSER_PERSPECTIVE_GET_CLASS (perspective)->i_customize) (perspective, toolbar, header, 
menu);
+               (BROWSER_PERSPECTIVE_GET_CLASS (perspective)->i_customize) (perspective, toolbar, header);
+
+       /* Current BrowserPage */
+       GtkNotebook *nb;
+       nb = (GtkNotebook*) browser_perspective_get_notebook (perspective);
+       if (nb) {
+               gint current_index;
+               current_index = gtk_notebook_get_current_page (nb);
+               if (current_index >= 0) {
+                       GtkWidget *current_page;
+                       current_page = gtk_notebook_get_nth_page (nb, current_index);
+                       if (current_page && IS_BROWSER_PAGE (current_page))
+                               browser_page_customize (BROWSER_PAGE (current_page), toolbar, header);
+               }
+       }
 }
 
 /**
  * browser_perspective_uncustomize:
  * @perspective: an object implementing the #BrowserPerspective interface
- * @toolbar: (allow-none):
- * @header: (allow-none):
- * @menu: (allow-none):
  *
- * Remove any optional custom UI elements to @toolbar, @header and @menu which have been added
+ * Remove any optional custom UI elements  which have been added
  * when browser_perspective_customize() was called.
  */
 void
-browser_perspective_uncustomize (BrowserPerspective *perspective, GtkToolbar *toolbar,
-                                GtkHeaderBar *header, GMenu *menu)
+browser_perspective_uncustomize (BrowserPerspective *perspective)
 {
        g_return_if_fail (IS_BROWSER_PERSPECTIVE (perspective));
-       g_print ("%s (%p)\n", __FUNCTION__, perspective);
+
+       /* Current BrowserPage */
+       GtkNotebook *nb;
+       nb = (GtkNotebook*) browser_perspective_get_notebook (perspective);
+       if (nb) {
+               gint current_index;
+               current_index = gtk_notebook_get_current_page (nb);
+               if (current_index >= 0) {
+                       GtkWidget *current_page;
+                       current_page = gtk_notebook_get_nth_page (nb, current_index);
+                       if (current_page && IS_BROWSER_PAGE (current_page))
+                               browser_page_uncustomize (BROWSER_PAGE (current_page));
+               }
+       }
+
        if (BROWSER_PERSPECTIVE_GET_CLASS (perspective)->i_uncustomize)
-               (BROWSER_PERSPECTIVE_GET_CLASS (perspective)->i_uncustomize) (perspective, toolbar, header, 
menu);
+               (BROWSER_PERSPECTIVE_GET_CLASS (perspective)->i_uncustomize) (perspective);
+       else {
+               g_print ("Default browser_perspective_uncustomize for %s\n",
+                        G_OBJECT_CLASS_NAME (G_OBJECT_GET_CLASS (perspective)));
+               if (customization_data_exists (G_OBJECT (perspective)))
+                       customization_data_release (G_OBJECT (perspective));
+       }
 }
 
 /**
- * browser_perspective_page_tab_label_change:
+ * browser_perspective_get_window:
  * @perspective: an object implementing the #BrowserPerspective interface
- * @page: an object implementing the #BrowserPage interface
  *
- * When @perspective organizes its contents as pages in a notebook, each page may
- * request that the tab's label may be changed, and the purpose of this method
- * is to request that @perspective update the tab's label associated to @page.
+ * Returns: (transfer none): the #BrowserWindow @perspective is in
  */
-void
-browser_perspective_page_tab_label_change (BrowserPerspective *perspective, BrowserPage *page)
+BrowserWindow *
+browser_perspective_get_window (BrowserPerspective *perspective)
 {
-       g_return_if_fail (IS_BROWSER_PERSPECTIVE (perspective));
-       g_return_if_fail (IS_BROWSER_PAGE (page));
-
-       if (BROWSER_PERSPECTIVE_GET_CLASS (perspective)->i_page_tab_label_change)
-               (BROWSER_PERSPECTIVE_GET_CLASS (perspective)->i_page_tab_label_change) (perspective, page);
+       g_return_val_if_fail (IS_BROWSER_PERSPECTIVE (perspective), NULL);
+       return (BrowserWindow*) ui_find_parent_widget (GTK_WIDGET (perspective), BROWSER_TYPE_WINDOW);
 }
 
 /**
- * browser_perspective_get_window:
+ * browser_perspective_get_notebook:
  * @perspective: an object implementing the #BrowserPerspective interface
  *
- * Returns: (transfer none): the #BrowserWindow @perspective is in
+ * Returns: (transfer none): the #GtkWidget which acts a a notebook for #BrowserPage widgets
  */
-BrowserWindow *
-browser_perspective_get_window (BrowserPerspective *perspective)
+GtkWidget *
+browser_perspective_get_notebook (BrowserPerspective *perspective)
 {
        g_return_val_if_fail (IS_BROWSER_PERSPECTIVE (perspective), NULL);
-       if (BROWSER_PERSPECTIVE_GET_CLASS (perspective)->i_get_window)
-               return (BROWSER_PERSPECTIVE_GET_CLASS (perspective)->i_get_window) (perspective);
+       if (BROWSER_PERSPECTIVE_GET_CLASS (perspective)->i_get_notebook)
+               return (BROWSER_PERSPECTIVE_GET_CLASS (perspective)->i_get_notebook) (perspective);
        else
-               return (BrowserWindow*) ui_find_parent_widget (GTK_WIDGET (perspective), BROWSER_TYPE_WINDOW);
+               return NULL;
 }
 
-static void nb_page_added_or_removed_cb (GtkNotebook *nb, GtkWidget *child, guint page_num,
-                                        BrowserPerspective *perspective);
-static void nb_switch_page_cb (GtkNotebook *nb, GtkWidget *page, gint page_num,
-                              BrowserPerspective *perspective);
-static void adapt_notebook_for_fullscreen (BrowserPerspective *perspective);;
-static void fullscreen_changed_cb (BrowserWindow *bwin, gboolean fullscreen, BrowserPerspective 
*perspective);
+static void notebook_switch_page_cb (GtkNotebook *nb, GtkWidget *page, gint pagenb, BrowserPerspective 
*bpers);
+static void notebook_remove_page_cb (GtkNotebook *nb, GtkWidget *page, gint pagenb, BrowserPerspective 
*bpers);
+static void notebook_destroy_cb (GtkNotebook *nb, BrowserPerspective *bpers);
 
 /**
- * browser_perspective_declare_notebook:
- * @pers: an object implementing the #BrowserPerspective interface
- * @nb: a #GtkNotebook
+ * browser_perspective_create_notebook:
+ * @perspective: an object implementing the #BrowserPerspective interface
  *
- * Internally used by browser's perspectives to declare they internally use a notebook
- * which state is modified when switching to and from fullscreen
+ * Creates a #GtkNotebook to hold #BrowserPage widgets in each page. It handles the customization (header 
and tool bars)
+ * when pages are toggles.
+ *
+ * Returns: (transfer full):  a new #GtkNotebook
  */
-void
-browser_perspective_declare_notebook (BrowserPerspective *perspective, GtkNotebook *nb)
+GtkWidget *
+browser_perspective_create_notebook (BrowserPerspective *perspective)
 {
-       BrowserWindow *bwin;
-       g_return_if_fail (IS_BROWSER_PERSPECTIVE (perspective));
-       g_return_if_fail (! nb || GTK_IS_NOTEBOOK (nb));
-       
-       bwin = browser_perspective_get_window (perspective);
-       if (!bwin)
-               return;
+       g_return_val_if_fail (IS_BROWSER_PERSPECTIVE (perspective), NULL);
 
-       g_print ("REMOVE THIS FUNCTION: %s()\n", __FUNCTION__);
-       GtkNotebook *onb;
-       onb = g_object_get_data (G_OBJECT (perspective), "fullscreen_nb");
-       if (onb) {
-               g_signal_handlers_disconnect_by_func (onb,
-                                                     G_CALLBACK (nb_page_added_or_removed_cb),
-                                                     perspective);
-               g_signal_handlers_disconnect_by_func (onb,
-                                                     G_CALLBACK (nb_switch_page_cb),
-                                                     perspective);
-               g_signal_handlers_disconnect_by_func (bwin,
-                                                     G_CALLBACK (fullscreen_changed_cb), perspective);
+       GtkWidget *nb;
+       nb = gtk_notebook_new ();
+       gtk_notebook_set_scrollable (GTK_NOTEBOOK (nb), TRUE);
+       gtk_notebook_popup_enable (GTK_NOTEBOOK (nb));
 
-       }
+       g_signal_connect (nb, "destroy",
+                         G_CALLBACK (notebook_destroy_cb), perspective);
+       g_signal_connect (nb, "switch-page",
+                         G_CALLBACK (notebook_switch_page_cb), perspective);
+       g_signal_connect (nb, "page-removed",
+                         G_CALLBACK (notebook_remove_page_cb), perspective);
 
-       g_object_set_data (G_OBJECT (perspective), "fullscreen_nb", nb);
-       if (nb) {
-               g_signal_connect (bwin, "fullscreen-changed",
-                                 G_CALLBACK (fullscreen_changed_cb), perspective);
-               g_signal_connect (nb, "page-added",
-                                 G_CALLBACK (nb_page_added_or_removed_cb), perspective);
-               g_signal_connect (nb, "page-removed",
-                                 G_CALLBACK (nb_page_added_or_removed_cb), perspective);
-               g_signal_connect (nb, "switch-page",
-                                 G_CALLBACK (nb_switch_page_cb), perspective);
-               adapt_notebook_for_fullscreen (perspective);
-       }
+       return nb;
 }
 
 static void
-nb_switch_page_cb (GtkNotebook *nb, G_GNUC_UNUSED GtkWidget *page, gint page_num, BrowserPerspective 
*perspective)
+notebook_destroy_cb (GtkNotebook *nb, BrowserPerspective *bpers)
 {
-       GtkWidget *page_contents;
-       GtkActionGroup *actions = NULL;
-       const gchar *ui = NULL;
-       BrowserWindow *bwin;
-
-       page_contents = gtk_notebook_get_nth_page (nb, page_num);
-       if (IS_BROWSER_PAGE (page_contents)) {
-               actions = browser_page_get_actions_group (BROWSER_PAGE (page_contents));
-               ui = browser_page_get_actions_ui (BROWSER_PAGE (page_contents));
-       }
-
-       bwin = browser_perspective_get_window (perspective);
-       if (bwin)
-               browser_window_customize_perspective_ui (bwin, perspective, actions, ui);
-       if (actions)
-               g_object_unref (actions);
+       g_signal_handlers_disconnect_by_func (nb,
+                                             G_CALLBACK (notebook_switch_page_cb), bpers);
+       g_signal_handlers_disconnect_by_func (nb,
+                                             G_CALLBACK (notebook_remove_page_cb), bpers);
+       g_print ("==== %s\n", __FUNCTION__);
 }
 
 static void
-nb_page_added_or_removed_cb (GtkNotebook *nb, G_GNUC_UNUSED GtkWidget *child, G_GNUC_UNUSED guint page_num,
-                            BrowserPerspective *perspective)
+notebook_switch_page_cb (GtkNotebook *nb, GtkWidget *page, gint pagenb, BrowserPerspective *bpers)
 {
-       adapt_notebook_for_fullscreen (perspective);
-       if (gtk_notebook_get_n_pages (nb) == 0) {
-               BrowserWindow *bwin;
-               bwin = browser_perspective_get_window (perspective);
-               if (!bwin)
-                       return;
-               browser_window_customize_perspective_ui (bwin,
-                                                        BROWSER_PERSPECTIVE (perspective),
-                                                        NULL, NULL);
+       if (customization_data_exists (G_OBJECT (bpers))) {
+               gint current_index;
+               current_index = gtk_notebook_get_current_page (nb);
+               g_print ("\tNotebook, current page %d switching to %d\n", current_index, pagenb);
+               if (current_index >= 0) {
+                       GtkWidget *current_page;
+                       current_page = gtk_notebook_get_nth_page (nb, current_index);
+                       if (current_page && IS_BROWSER_PAGE (current_page))
+                               browser_page_uncustomize (BROWSER_PAGE (current_page));
+               }
+               if (pagenb >= 0) {
+                       GtkWidget *next_page;
+                       next_page = gtk_notebook_get_nth_page (nb, pagenb);
+                       if (next_page && IS_BROWSER_PAGE (next_page))
+                               browser_page_customize (BROWSER_PAGE (next_page),
+                                                       customization_data_get_toolbar (G_OBJECT (bpers)),
+                                                       customization_data_get_header_bar (G_OBJECT (bpers)));
+               }
        }
 }
 
 static void
-fullscreen_changed_cb (G_GNUC_UNUSED BrowserWindow *bwin, G_GNUC_UNUSED gboolean fullscreen,
-                      BrowserPerspective *perspective)
+notebook_remove_page_cb (GtkNotebook *nb, GtkWidget *page, gint pagenb, BrowserPerspective *bpers)
 {
-       adapt_notebook_for_fullscreen (perspective);
+       if (customization_data_exists (G_OBJECT (bpers))) {
+               g_print ("\tNotebook, removing page %d\n", pagenb);
+               if (pagenb >= 0) {
+                       GtkWidget *current_page;
+                       current_page = gtk_notebook_get_nth_page (nb, pagenb);
+                       if (current_page && IS_BROWSER_PAGE (current_page))
+                               browser_page_uncustomize (BROWSER_PAGE (current_page));
+               }
+       }
 }
 
-static void
-adapt_notebook_for_fullscreen (BrowserPerspective *perspective)
-{
-       gboolean showtabs = TRUE;
-       gboolean fullscreen;
-       BrowserWindow *bwin;
-       GtkNotebook *nb;
 
-       bwin = browser_perspective_get_window (perspective);
-       if (!bwin)
-               return;
-       nb = g_object_get_data (G_OBJECT (perspective), "fullscreen_nb");
-       if (!nb)
-               return;
 
-       fullscreen = browser_window_is_fullscreen (bwin);
-       if (fullscreen && gtk_notebook_get_n_pages (nb) == 1)
-               showtabs = FALSE;
-       gtk_notebook_set_show_tabs (nb, showtabs);
-}
 
 /*
  * All perspectives information
diff --git a/tools/browser/browser-perspective.h b/tools/browser/browser-perspective.h
index 71021cd..33873a6 100644
--- a/tools/browser/browser-perspective.h
+++ b/tools/browser/browser-perspective.h
@@ -34,20 +34,13 @@ typedef struct _BrowserPerspective        BrowserPerspective;
 
 /* struct for the interface */
 struct _BrowserPerspectiveIface {
-       GTypeInterface           g_iface;
+       GTypeInterface          g_iface;
 
        /* virtual table */
-       BrowserWindow       *(* i_get_window) (BrowserPerspective *perspective);
-       void                 (* i_customize) (BrowserPerspective *perspective, GtkToolbar *toolbar,
-                                             GtkHeaderBar *header, GMenu *menu);
-       void                 (* i_uncustomize) (BrowserPerspective *perspective, GtkToolbar *toolbar,
-                                               GtkHeaderBar *header, GMenu *menu);
-       GtkActionGroup      *(* i_get_actions_group) (BrowserPerspective *perspective);
-       const gchar         *(* i_get_actions_ui) (BrowserPerspective *perspective);
-       void                 (* i_get_current_customization) (BrowserPerspective *perspective,
-                                                             GtkActionGroup **out_agroup,
-                                                             const gchar **out_ui);
-       void                 (* i_page_tab_label_change) (BrowserPerspective *perspective, BrowserPage *page);
+       GtkWidget           *(* i_get_notebook) (BrowserPerspective *perspective);
+
+       void                 (* i_customize) (BrowserPerspective *perspective, GtkToolbar *toolbar, 
GtkHeaderBar *header);
+       void                 (* i_uncustomize) (BrowserPerspective *perspective);
 };
 
 /**
@@ -63,16 +56,15 @@ struct _BrowserPerspectiveIface {
 
 GType           browser_perspective_get_type          (void) G_GNUC_CONST;
 
-void            browser_perspective_customize             (BrowserPerspective *perspective,
-                                                          GtkToolbar *toolbar, GtkHeaderBar *header, GMenu 
*menu);
-void            browser_perspective_uncustomize           (BrowserPerspective *perspective,
-                                                          GtkToolbar *toolbar, GtkHeaderBar *header, GMenu 
*menu);
+void            browser_perspective_customize         (BrowserPerspective *perspective,
+                                                      GtkToolbar *toolbar, GtkHeaderBar *header);
+void            browser_perspective_uncustomize       (BrowserPerspective *perspective);
 
-void            browser_perspective_page_tab_label_change (BrowserPerspective *perspective,
-                                                          BrowserPage *page);
+BrowserWindow  *browser_perspective_get_window        (BrowserPerspective *perspective);
+GtkWidget      *browser_perspective_get_notebook      (BrowserPerspective *perspective);
 
-BrowserWindow  *browser_perspective_get_window (BrowserPerspective *perspective);
-void            browser_perspective_declare_notebook (BrowserPerspective *perspective, GtkNotebook *nb);
+/* reserved for BrowserPerspective implementations */
+GtkWidget      *browser_perspective_create_notebook   (BrowserPerspective *perspective);
 
 /*
  * All perspectives information
diff --git a/tools/browser/browser-window.c b/tools/browser/browser-window.c
index 5e38988..458cae5 100644
--- a/tools/browser/browser-window.c
+++ b/tools/browser/browser-window.c
@@ -29,8 +29,6 @@
 #include <thread-wrapper/gda-connect.h>
 #include "browser-connections-list.h"
 
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-
 /*
  * structure representing a 'tab' in a window
  *
@@ -467,8 +465,7 @@ browser_window_new (TConnection *tcnc, BrowserPerspectiveFactory *factory)
 
        /* customize currect perspective */
        browser_perspective_customize (bwin->priv->current_perspective->perspective_widget,
-                                      bwin->priv->toolbar, bwin->priv->header,
-                                      G_MENU (gtk_application_get_menubar (GTK_APPLICATION (t_app_get ()))));
+                                      bwin->priv->toolbar, bwin->priv->header);
 
        return bwin;
 }
@@ -496,7 +493,6 @@ fullscreen_cb (G_GNUC_UNUSED GSimpleAction *action, GVariant *state, gpointer da
 static void
 cnc_status_changed_cb (TConnection *tcnc, GdaConnectionStatus status, BrowserWindow *bwin)
 {
-       GtkAction *action;
        gchar *reason = "AAAA";
        gboolean is_busy;
        is_busy = (status == GDA_CONNECTION_STATUS_IDLE) ? FALSE : TRUE;
@@ -1009,7 +1005,7 @@ browser_window_show_notice (BrowserWindow *bwin, GtkMessageType type, const gcha
                /* use a GtkInfoBar */
                GtkWidget *ibar, *content_area, *label;
                
-               ibar = gtk_info_bar_new_with_buttons (GTK_STOCK_CLOSE, 1, NULL);
+               ibar = gtk_info_bar_new_with_buttons (_("_Close"), 1, NULL);
                if (context)
                        g_object_set_data_full (G_OBJECT (ibar), "context", g_strdup (context), g_free);
                if (text)
@@ -1045,38 +1041,6 @@ browser_window_show_notice (BrowserWindow *bwin, GtkMessageType type, const gcha
        }
 }
 
-
-/**
- * browser_window_customize_perspective_ui
- * @bwin: a #BrowserWindow
- * @bpers: the #BrowserPerspective concerned
- * @actions_group: (allow-none): a #GtkActionGroup object, or %NULL
- * @ui_info: (allow-none): a merge UI string, or %NULL. See gtk_ui_manager_add_ui_from_string()
- *
- * Customizes a UI specific to the @bpers perspective. Any
- * previous customization is removed, replaced by the new requested one.
- *
- * If @actions_group is %NULL then any it simply removes the customization.
- */
-void
-browser_window_customize_perspective_ui (BrowserWindow *bwin, BrowserPerspective *bpers,
-                                        GtkActionGroup *actions_group,
-                                        const gchar *ui_info)
-{
-       PerspectiveData *pdata = NULL;
-       GSList *list;
-
-       g_return_if_fail (BROWSER_IS_WINDOW (bwin));
-       g_return_if_fail (IS_BROWSER_PERSPECTIVE (bpers));
-
-       for (list = bwin->priv->pers_list; list; list = list->next) {
-               if (PERSPECTIVE_DATA (list->data)->perspective_widget == bpers) {
-                       pdata = PERSPECTIVE_DATA (list->data);
-                       break;
-               }
-       }
-}
-
 /**
  * browser_window_change_perspective
  * @bwin: a #BrowserWindow
@@ -1103,9 +1067,7 @@ browser_window_change_perspective (BrowserWindow *bwin, const gchar *perspective
                        return current_pdata->perspective_widget;
 
                /* clean ups for current perspective */
-               browser_perspective_uncustomize (bwin->priv->current_perspective->perspective_widget,
-                                                bwin->priv->toolbar, bwin->priv->header,
-                                                G_MENU (gtk_application_get_menubar (GTK_APPLICATION 
(t_app_get ()))));
+               browser_perspective_uncustomize (bwin->priv->current_perspective->perspective_widget);
        }
 
        /* find factory */
@@ -1137,8 +1099,7 @@ browser_window_change_perspective (BrowserWindow *bwin, const gchar *perspective
        }
        gtk_stack_set_visible_child (bwin->priv->pers_stack, GTK_WIDGET (bpers));
        browser_perspective_customize (bpers,
-                                      bwin->priv->toolbar, bwin->priv->header,
-                                      G_MENU (gtk_application_get_menubar (GTK_APPLICATION (t_app_get ()))));
+                                      bwin->priv->toolbar, bwin->priv->header);
        bwin->priv->current_perspective = pdata;
 
        /* setup for the new perspective */
diff --git a/tools/browser/browser-window.h b/tools/browser/browser-window.h
index a1a2c2b..360aa18 100644
--- a/tools/browser/browser-window.h
+++ b/tools/browser/browser-window.h
@@ -75,10 +75,6 @@ void                browser_window_show_notice            (BrowserWindow *bwin,
 void                browser_window_show_notice_printf     (BrowserWindow *bwin, GtkMessageType type,
                                                           const gchar *context, const gchar *format, ...);
 
-void                browser_window_customize_perspective_ui (BrowserWindow *bwin, BrowserPerspective *bpers,
-                                                            GtkActionGroup *actions_group,
-                                                            const gchar *ui_info);
-
 BrowserPerspective *browser_window_change_perspective     (BrowserWindow *bwin, const gchar *perspective);
 
 void                browser_window_set_fullscreen         (BrowserWindow *bwin, gboolean fullscreen);
diff --git a/tools/browser/canvas/browser-canvas-db-relations.c 
b/tools/browser/canvas/browser-canvas-db-relations.c
index 249bcaa..8fcffe7 100644
--- a/tools/browser/canvas/browser-canvas-db-relations.c
+++ b/tools/browser/canvas/browser-canvas-db-relations.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 - 2014 Vivien Malerba <malerba gnome-db org>
+ * Copyright (C) 2009 - 2015 Vivien Malerba <malerba gnome-db org>
  * Copyright (C) 2010 David King <davidk openismus com>
  * Copyright (C) 2011 Murray Cumming <murrayc murrayc com>
  *
@@ -31,7 +31,6 @@
 #include <libgda-ui/internal/popup-container.h>
 #include "../browser-window.h"
 #include "../ui-support.h"
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
 
 static void browser_canvas_db_relations_class_init (BrowserCanvasDbRelationsClass *class);
 static void browser_canvas_db_relations_init       (BrowserCanvasDbRelations *canvas);
@@ -651,7 +650,6 @@ build_context_menu (BrowserCanvas *canvas)
 
        for (list = all_dbo; list; list = list->next) {
                GdaMetaDbObject *dbo = GDA_META_DB_OBJECT (list->data);
-               GtkWidget *img;
                if (dbo->obj_type != GDA_META_DB_TABLE)
                        continue;
                if (g_hash_table_lookup (dbrel->priv->hash_tables, dbo))
@@ -659,9 +657,7 @@ build_context_menu (BrowserCanvas *canvas)
                        continue;
                
                if (strcmp (dbo->obj_short_name, dbo->obj_full_name)) {
-                       mitem = gtk_image_menu_item_new_with_label (dbo->obj_short_name);
-                       img = gtk_image_new_from_pixbuf (ui_get_pixbuf_icon (UI_ICON_TABLE));
-                       gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mitem), img);
+                       mitem = gtk_menu_item_new_with_label (dbo->obj_short_name);
                        g_object_set_data (G_OBJECT (mitem), "dbtable", GDA_META_TABLE (dbo));
                        gtk_menu_shell_prepend (GTK_MENU_SHELL (submenu), mitem);
                        g_signal_connect (mitem, "activate",
@@ -671,9 +667,7 @@ build_context_menu (BrowserCanvas *canvas)
                GtkWidget *schema_menu;
                schema_menu = g_hash_table_lookup (schemas, dbo->obj_schema);
                if (!schema_menu) {
-                       mitem = gtk_image_menu_item_new_with_label (dbo->obj_schema);
-                       img = gtk_image_new_from_pixbuf (ui_get_pixbuf_icon (UI_ICON_SCHEMA));
-                       gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mitem), img);
+                       mitem = gtk_menu_item_new_with_label (dbo->obj_schema);
                        gtk_menu_shell_append (GTK_MENU_SHELL (submenu), mitem);
 
                        schema_menu = gtk_menu_new ();
@@ -683,9 +677,7 @@ build_context_menu (BrowserCanvas *canvas)
                        added_schemas = g_slist_prepend (added_schemas, schema_menu);
                }
                
-               mitem = gtk_image_menu_item_new_with_label (dbo->obj_short_name);
-               img = gtk_image_new_from_pixbuf (ui_get_pixbuf_icon (UI_ICON_TABLE));
-               gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (mitem), img);
+               mitem = gtk_menu_item_new_with_label (dbo->obj_short_name);
                g_object_set_data (G_OBJECT (mitem), "dbtable", GDA_META_TABLE (dbo));
                gtk_menu_shell_prepend (GTK_MENU_SHELL (schema_menu), mitem);
                g_signal_connect (mitem, "activate",
diff --git a/tools/browser/canvas/browser-canvas-text.c b/tools/browser/canvas/browser-canvas-text.c
index b1b1679..e3724db 100644
--- a/tools/browser/canvas/browser-canvas-text.c
+++ b/tools/browser/canvas/browser-canvas-text.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 - 2014 Vivien Malerba <malerba gnome-db org>
+ * Copyright (C) 2009 - 2015 Vivien Malerba <malerba gnome-db org>
  * Copyright (C) 2010 David King <davidk openismus com>
  * Copyright (C) 2012 Murray Cumming <murrayc murrayc com>
  *
@@ -449,7 +449,7 @@ void
 browser_canvas_text_set_highlight (BrowserCanvasText *ct, gboolean highlight)
 {
        gchar *str_color;
-       GdkColor gdk_color;
+       GdkRGBA gdk_rgba;
 
        g_return_if_fail (ct && IS_BROWSER_CANVAS_TEXT (ct));
        g_return_if_fail (ct->priv);
@@ -463,14 +463,14 @@ browser_canvas_text_set_highlight (BrowserCanvasText *ct, gboolean highlight)
        }
 
        str_color = highlight ? ct->priv->highlight_color : BROWSER_CANVAS_OBJ_BG_COLOR;
-       if (gdk_color_parse (str_color, &gdk_color)) {
+       if (gdk_rgba_parse (&gdk_rgba, str_color)) {
                guint col;
 
-               col = ((guint) (gdk_color.red * 255. / 65535.0));
+               col = ((guint) (gdk_rgba.red * 255.));
                ct->priv->end_anim_rgba = col << 24;
-               col = ((guint) (gdk_color.green * 255. / 65535.0));
+               col = ((guint) (gdk_rgba.green * 255.));
                ct->priv->end_anim_rgba += col << 16;
-               col = ((guint) (gdk_color.blue * 255. / 65535.0));
+               col = ((guint) (gdk_rgba.blue * 255.));
                ct->priv->end_anim_rgba += col << 8;
                if (!ct->priv->current_anim_rgba)
                        ct->priv->current_anim_rgba = ct->priv->end_anim_rgba;
diff --git a/tools/browser/canvas/browser-canvas.c b/tools/browser/canvas/browser-canvas.c
index 955fc74..aabd494 100644
--- a/tools/browser/canvas/browser-canvas.c
+++ b/tools/browser/canvas/browser-canvas.c
@@ -27,7 +27,6 @@
 #include "browser-canvas-print.h"
 #include <libgda/libgda.h>
 #include <libgda-ui/libgda-ui.h>
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
 
 #define DEFAULT_SCALE .8
 #ifdef HAVE_GRAPHVIZ
@@ -334,15 +333,15 @@ canvas_event_cb (BrowserCanvas *canvas, GdkEvent *event, GooCanvas *gcanvas)
                                        gtk_widget_show (mitem);
                                        gtk_menu_shell_append (GTK_MENU_SHELL (menu), mitem);
                                }
-                               mitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_ZOOM_IN, NULL);
+                               mitem = gtk_menu_item_new_with_label (_("Zoom in"));
                                gtk_widget_show (mitem);
                                gtk_menu_shell_append (GTK_MENU_SHELL (menu), mitem);
                                g_signal_connect (G_OBJECT (mitem), "activate", G_CALLBACK 
(popup_zoom_in_cb), canvas);
-                               mitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_ZOOM_OUT, NULL);
+                               mitem = gtk_menu_item_new_with_label (_("Zoom out"));
                                gtk_widget_show (mitem);
                                gtk_menu_shell_append (GTK_MENU_SHELL (menu), mitem);
                                g_signal_connect (G_OBJECT (mitem), "activate", G_CALLBACK 
(popup_zoom_out_cb), canvas);
-                               mitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_ZOOM_FIT, NULL);
+                               mitem = gtk_menu_item_new_with_label (_("Adjusted zoom"));
                                gtk_widget_show (mitem);
                                gtk_menu_shell_append (GTK_MENU_SHELL (menu), mitem);
                                g_signal_connect (G_OBJECT (mitem), "activate", G_CALLBACK 
(popup_zoom_fit_cb), canvas);
@@ -367,12 +366,12 @@ canvas_event_cb (BrowserCanvas *canvas, GdkEvent *event, GooCanvas *gcanvas)
                                gtk_menu_shell_append (GTK_MENU_SHELL (menu), mitem);
 #endif
                                
-                               mitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_SAVE_AS, NULL);
+                               mitem = gtk_menu_item_new_with_label (_("Save as"));
                                gtk_widget_show (mitem);
                                gtk_menu_shell_append (GTK_MENU_SHELL (menu), mitem);
                                g_signal_connect (G_OBJECT (mitem), "activate", G_CALLBACK (popup_export_cb), 
canvas);
 
-                               mitem = gtk_image_menu_item_new_from_stock (GTK_STOCK_PRINT, NULL);
+                               mitem = gtk_menu_item_new_with_label (_("Print"));
                                gtk_widget_show (mitem);
                                g_signal_connect (G_OBJECT (mitem), "activate", G_CALLBACK (popup_print_cb), 
canvas);
                                gtk_menu_shell_append (GTK_MENU_SHELL (menu), mitem);
@@ -466,8 +465,8 @@ popup_export_cb (G_GNUC_UNUSED GtkMenuItem *mitem, BrowserCanvas *canvas)
 
        dlg = gtk_file_chooser_dialog_new (_("Save diagram as"), (GtkWindow*) toplevel,
                                           GTK_FILE_CHOOSER_ACTION_SAVE, 
-                                          GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-                                          GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
+                                          _("_Cancel"), GTK_RESPONSE_CANCEL,
+                                          _("_Save"), GTK_RESPONSE_ACCEPT,
                                           NULL);
        gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dlg),
                                             gdaui_get_default_path ());
diff --git a/tools/browser/data-manager/data-console.c b/tools/browser/data-manager/data-console.c
index 7414d9f..d8ccc23 100644
--- a/tools/browser/data-manager/data-console.c
+++ b/tools/browser/data-manager/data-console.c
@@ -26,6 +26,7 @@
 #include "ui-spec-editor.h"
 #include "../dnd.h"
 #include "../ui-support.h"
+#include "../ui-customize.h"
 #include "../gdaui-bar.h"
 #include "../browser-window.h"
 #include "../browser-page.h"
@@ -36,8 +37,7 @@
 #include "data-source-manager.h"
 #include <gdk/gdkkeysyms.h>
 #include "analyser.h"
-
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
+#include <libgda/gda-debug-macros.h>
 
 #define MAIN_PAGE_EDITORS 0
 #define MAIN_PAGE_DATA 1
@@ -66,8 +66,6 @@ struct _DataConsolePrivate {
        GtkWidget *xml_sped; /* in editors_notebook */
        GtkWidget *ui_sped; /* in editors_notebook */
 
-       GtkActionGroup *agroup;
-
        gboolean toggling;
        GtkToggleButton *params_toggle;
        GtkWidget *params_top;
@@ -100,9 +98,8 @@ static void data_source_source_changed_cb (DataSourceManager *mgr, DataSource *s
 
 /* BrowserPage interface */
 static void                 data_console_page_init (BrowserPageIface *iface);
-static GtkActionGroup      *data_console_page_get_actions_group (BrowserPage *page);
-static const gchar         *data_console_page_get_actions_ui (BrowserPage *page);
-static GtkWidget           *data_console_page_get_tab_label (BrowserPage *page, GtkWidget 
**out_close_button);
+static void                 data_console_customize (BrowserPage *page, GtkToolbar *toolbar, GtkHeaderBar 
*header);
+static GtkWidget           *data_console_get_tab_label (BrowserPage *page, GtkWidget **out_close_button);
 
 static GObjectClass *parent_class = NULL;
 
@@ -149,12 +146,14 @@ key_press_event (GtkWidget *widget, GdkEventKey *event)
        dconsole = DATA_CONSOLE (widget);
        if ((event->keyval == GDK_KEY_Escape) &&
            (gtk_notebook_get_current_page (GTK_NOTEBOOK (dconsole->priv->main_notebook)) == MAIN_PAGE_DATA)) 
{
-               if (dconsole->priv->agroup) {
-                       GtkAction *action;
-                       action = gtk_action_group_get_action (dconsole->priv->agroup, "ComposeMode");
-                       gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), TRUE);
-                       return TRUE;
+               GAction *action;
+               action = customization_data_get_action (G_OBJECT (dconsole), "ComposeMode");
+               if (action) {
+                       GVariant *value;
+                       value = g_variant_new_boolean (TRUE);
+                       g_simple_action_set_state (G_SIMPLE_ACTION (action), value);
                }
+               return TRUE;
        }
 
        /* parent class */
@@ -164,9 +163,9 @@ key_press_event (GtkWidget *widget, GdkEventKey *event)
 static void
 data_console_page_init (BrowserPageIface *iface)
 {
-       iface->i_get_actions_group = data_console_page_get_actions_group;
-       iface->i_get_actions_ui = data_console_page_get_actions_ui;
-       iface->i_get_tab_label = data_console_page_get_tab_label;
+       iface->i_customize = data_console_customize;
+       iface->i_uncustomize = NULL;
+       iface->i_get_tab_label = data_console_get_tab_label;
 }
 
 static void
@@ -197,8 +196,6 @@ data_console_dispose (GObject *object)
                         gtk_widget_destroy (dconsole->priv->popup_container);
                if (dconsole->priv->tcnc)
                        g_object_unref (dconsole->priv->tcnc);
-               if (dconsole->priv->agroup)
-                       g_object_unref (dconsole->priv->agroup);
                if (dconsole->priv->mgr) {
                        g_signal_handlers_disconnect_by_func (dconsole->priv->mgr,
                                                              G_CALLBACK (data_source_mgr_changed_cb),
@@ -520,12 +517,6 @@ data_console_set_fav_id (DataConsole *dconsole, gint fav_id, GError **error)
                g_free (str);
                dconsole->priv->fav_id = -1;
        }
-
-       /* update notebook's tab label */
-       BrowserPerspective *pers;
-       pers = browser_page_get_perspective (BROWSER_PAGE (dconsole));
-       if (pers)
-               browser_perspective_page_tab_label_change (pers, BROWSER_PAGE (dconsole));
 }
 
 /*
@@ -860,20 +851,23 @@ add_source_clicked_cb (G_GNUC_UNUSED GtkButton *button, DataConsole *dconsole)
  * UI actions
  */
 static void
-compose_mode_toggled_cb (G_GNUC_UNUSED GtkToggleAction *action, DataConsole *dconsole)
+compose_mode_toggled_cb (GSimpleAction *action, GVariant *state, gpointer data)
 {
-       gint pagenb;
+       DataConsole *dconsole;
+       dconsole = DATA_CONSOLE (data);
 
        /* show variables if necessary */
        gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (dconsole->priv->params_toggle),
                                      dconsole->priv->params_form &&
                                      GDAUI_IS_BASIC_FORM (dconsole->priv->params_form) ? TRUE : FALSE);
 
+       g_simple_action_set_state (action, state);
        if (dconsole->priv->toggling) {
                dconsole->priv->toggling = FALSE;
                return;
        }
 
+       gint pagenb;
        pagenb = gtk_notebook_get_current_page (GTK_NOTEBOOK (dconsole->priv->main_notebook));
        if (pagenb == MAIN_PAGE_EDITORS) {
                /* Get Data sources */
@@ -920,47 +914,33 @@ compose_mode_toggled_cb (G_GNUC_UNUSED GtkToggleAction *action, DataConsole *dco
        gtk_notebook_set_current_page (GTK_NOTEBOOK (dconsole->priv->main_notebook), pagenb);
 }
 
-static GtkToggleActionEntry ui_actions[] = {
-       { "ComposeMode", NULL /*BROWSER_STOCK_BUILDER*/, N_("_Toggle mode"), NULL, N_("Switch between compose 
and execute modes"),
-         G_CALLBACK (compose_mode_toggled_cb), TRUE},
+static GActionEntry win_entries[] = {
+       { "ComposeMode", NULL, NULL, "false",  compose_mode_toggled_cb},
 };
-static const gchar *ui_actions_console =
-       "<ui>"
-        "  <menubar name='MenuBar'>"
-       "    <placeholder name='MenuExtension'>"
-        "      <menu name='Data manager' action='DataManagerMenu'>"
-        "        <menuitem name='ComposeMode' action= 'ComposeMode'/>"
-        "      </menu>"
-       "    </placeholder>"
-        "  </menubar>"
-       "  <toolbar name='ToolBar'>"
-       "    <separator/>"
-       "    <toolitem action='ComposeMode'/>"
-       "  </toolbar>"
-       "</ui>";
-
-static GtkActionGroup *
-data_console_page_get_actions_group (BrowserPage *page)
-{
-       DataConsole *dconsole;
-       dconsole = DATA_CONSOLE (page);
-       if (! dconsole->priv->agroup) {
-               dconsole->priv->agroup = gtk_action_group_new ("DataManagerConsoleActions");
-               gtk_action_group_set_translation_domain (dconsole->priv->agroup, GETTEXT_PACKAGE);
-               gtk_action_group_add_toggle_actions (dconsole->priv->agroup,
-                                                    ui_actions, G_N_ELEMENTS (ui_actions), page);
-       }
-       return g_object_ref (dconsole->priv->agroup);
-}
 
-static const gchar *
-data_console_page_get_actions_ui (G_GNUC_UNUSED BrowserPage *page)
+static void
+data_console_customize (BrowserPage *page, GtkToolbar *toolbar, GtkHeaderBar *header)
 {
-       return ui_actions_console;
+       g_print ("%s ()\n", __FUNCTION__);
+
+       customization_data_init (G_OBJECT (page), toolbar, header);
+
+       /* add page's actions */
+       customization_data_add_actions (G_OBJECT (page), win_entries, G_N_ELEMENTS (win_entries));
+
+       /* add to toolbar */
+       GtkToolItem *titem;
+       titem = gtk_toggle_tool_button_new ();
+       gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (titem), "applications-engineering-symbolic");
+       gtk_widget_set_tooltip_text (GTK_WIDGET (titem), _("Switch between compose and execute modes"));
+       gtk_toolbar_insert (GTK_TOOLBAR (toolbar), titem, -1);
+       gtk_actionable_set_action_name (GTK_ACTIONABLE (titem), "win.ComposeMode");
+       gtk_widget_show (GTK_WIDGET (titem));
+       customization_data_add_part (G_OBJECT (page), G_OBJECT (titem));
 }
 
 static GtkWidget *
-data_console_page_get_tab_label (BrowserPage *page, GtkWidget **out_close_button)
+data_console_get_tab_label (BrowserPage *page, GtkWidget **out_close_button)
 {
        const gchar *tab_name;
 
@@ -1023,9 +1003,11 @@ void
 data_console_execute (DataConsole *console)
 {
        g_return_if_fail (IS_DATA_CONSOLE (console));
-       if (console->priv->agroup) {
-               GtkAction *action;
-               action = gtk_action_group_get_action (console->priv->agroup, "ComposeMode");
-               gtk_toggle_action_set_active (GTK_TOGGLE_ACTION (action), FALSE);
+       GAction *action;
+       action = customization_data_get_action (G_OBJECT (console), "ComposeMode");
+       if (action) {
+               GVariant *value;
+               value = g_variant_new_boolean (FALSE);
+               g_simple_action_set_state (G_SIMPLE_ACTION (action), value);
        }
 }
diff --git a/tools/browser/data-manager/data-favorite-selector.c 
b/tools/browser/data-manager/data-favorite-selector.c
index 8455d52..e3def2c 100644
--- a/tools/browser/data-manager/data-favorite-selector.c
+++ b/tools/browser/data-manager/data-favorite-selector.c
@@ -44,8 +44,6 @@
   #include <gtksourceview/gtksourcestylescheme.h>
 #endif
 
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-
 struct _DataFavoriteSelectorPrivate {
        TConnection *tcnc;
        GdaTree *tree;
diff --git a/tools/browser/data-manager/data-manager-perspective.c 
b/tools/browser/data-manager/data-manager-perspective.c
index e165a81..9ea63b4 100644
--- a/tools/browser/data-manager/data-manager-perspective.c
+++ b/tools/browser/data-manager/data-manager-perspective.c
@@ -22,6 +22,7 @@
 #include <glib/gi18n-lib.h>
 #include "data-manager-perspective.h"
 #include "data-console.h"
+#include "../ui-customize.h"
 #include "../browser-window.h"
 #include "../browser-page.h"
 #include "data-favorite-selector.h"
@@ -36,10 +37,9 @@ static void data_manager_perspective_grab_focus (GtkWidget *widget);
 
 /* BrowserPerspective interface */
 static void                 data_manager_perspective_perspective_init (BrowserPerspectiveIface *iface);
+static GtkWidget           *data_manager_perspective_get_notebook (BrowserPerspective *perspective);
 static void                 data_manager_perspective_customize (BrowserPerspective *perspective,
-                                                               GtkToolbar *toolbar, GtkHeaderBar *header, 
GMenu *menu);
-static void                 data_manager_perspective_uncustomize (BrowserPerspective *perspective,
-                                                                 GtkToolbar *toolbar, GtkHeaderBar *header, 
GMenu *menu);
+                                                               GtkToolbar *toolbar, GtkHeaderBar *header);
 
 /* get a pointer to the parents to be able to call their destructor */
 static GObjectClass  *parent_class = NULL;
@@ -50,8 +50,6 @@ struct _DataManagerPerspectivePriv {
        gboolean favorites_shown;
        BrowserWindow *bwin;
         TConnection *tcnc;
-
-       GArray *custom_parts;
 };
 
 GType
@@ -113,8 +111,9 @@ data_manager_perspective_grab_focus (GtkWidget *widget)
 static void
 data_manager_perspective_perspective_init (BrowserPerspectiveIface *iface)
 {
+       iface->i_get_notebook = data_manager_perspective_get_notebook;
        iface->i_customize = data_manager_perspective_customize;
-        iface->i_uncustomize = data_manager_perspective_uncustomize;
+        iface->i_uncustomize = NULL;
 }
 
 
@@ -123,7 +122,6 @@ data_manager_perspective_init (DataManagerPerspective *perspective)
 {
        perspective->priv = g_new0 (DataManagerPerspectivePriv, 1);
        perspective->priv->favorites_shown = TRUE;
-       perspective->priv->custom_parts = NULL;
 
        gtk_orientable_set_orientation (GTK_ORIENTABLE (perspective), GTK_ORIENTATION_VERTICAL);
 }
@@ -165,11 +163,9 @@ data_manager_perspective_new (BrowserWindow *bwin)
                perspective->priv->favorites = wid;
        }
 
-       nb = gtk_notebook_new ();
+       nb = browser_perspective_create_notebook (bpers);
         perspective->priv->notebook = nb;
         gtk_paned_pack2 (GTK_PANED (paned), nb, TRUE, TRUE);
-        gtk_notebook_set_scrollable (GTK_NOTEBOOK (nb), TRUE);
-        gtk_notebook_popup_enable (GTK_NOTEBOOK (nb));
 
        GtkWidget *page, *tlabel, *button;
        page = data_console_new (tcnc);
@@ -195,8 +191,6 @@ data_manager_perspective_new (BrowserWindow *bwin)
 
        gtk_widget_grab_focus (page);
 
-       browser_perspective_declare_notebook (bpers, GTK_NOTEBOOK (perspective->priv->notebook));
-
        return bpers;
 }
 
@@ -293,7 +287,9 @@ data_manager_perspective_dispose (GObject *object)
 
        perspective = DATA_MANAGER_PERSPECTIVE (object);
        if (perspective->priv) {
-               browser_perspective_declare_notebook ((BrowserPerspective*) perspective, NULL);
+               if (customization_data_exists (object))
+                       customization_data_release (object);
+
                 if (perspective->priv->tcnc)
                         g_object_unref (perspective->priv->tcnc);
 
@@ -331,29 +327,27 @@ favorites_toggle_cb (GSimpleAction *action, GVariant *state, gpointer data)
        g_simple_action_set_state (action, state);
 }
 
+static GtkWidget *
+data_manager_perspective_get_notebook (BrowserPerspective *perspective)
+{
+       g_return_val_if_fail (IS_DATA_MANAGER_PERSPECTIVE (perspective), NULL);
+       return DATA_MANAGER_PERSPECTIVE (perspective)->priv->notebook;
+}
+
 static GActionEntry win_entries[] = {
         { "show-favorites", NULL, NULL, "true", favorites_toggle_cb },
         { "data-manager-new", manager_new_cb, NULL, NULL, NULL },
 };
 
 static void
-data_manager_perspective_customize (BrowserPerspective *perspective,
-                                   GtkToolbar *toolbar, GtkHeaderBar *header, GMenu *menu)
+data_manager_perspective_customize (BrowserPerspective *perspective, GtkToolbar *toolbar, GtkHeaderBar 
*header)
 {
        g_print ("%s ()\n", __FUNCTION__);
-       DataManagerPerspective *persp;
-       persp = DATA_MANAGER_PERSPECTIVE (perspective);
 
-       BrowserWindow *bwin;
-       bwin = browser_perspective_get_window (perspective);
+       customization_data_init (G_OBJECT (perspective), toolbar, header);
 
        /* add perspective's actions */
-       g_action_map_add_action_entries (G_ACTION_MAP (bwin),
-                                        win_entries, G_N_ELEMENTS (win_entries),
-                                        perspective);
-
-       g_assert (! persp->priv->custom_parts);
-       persp->priv->custom_parts = g_array_new (FALSE, FALSE, sizeof (gpointer));
+       customization_data_add_actions (G_OBJECT (perspective), win_entries, G_N_ELEMENTS (win_entries));
 
        /* add to toolbar */
        GtkToolItem *titem;
@@ -363,7 +357,7 @@ data_manager_perspective_customize (BrowserPerspective *perspective,
        gtk_toolbar_insert (GTK_TOOLBAR (toolbar), titem, -1);
        gtk_actionable_set_action_name (GTK_ACTIONABLE (titem), "win.show-favorites");
        gtk_widget_show (GTK_WIDGET (titem));
-       g_array_append_val (persp->priv->custom_parts, titem);
+       customization_data_add_part (G_OBJECT (perspective), G_OBJECT (titem));
 
        titem = gtk_tool_button_new (NULL, NULL);
        gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (titem), "tab-new-symbolic");
@@ -371,40 +365,7 @@ data_manager_perspective_customize (BrowserPerspective *perspective,
        gtk_toolbar_insert (GTK_TOOLBAR (toolbar), titem, -1);
        gtk_actionable_set_action_name (GTK_ACTIONABLE (titem), "win.data-manager-new");
        gtk_widget_show (GTK_WIDGET (titem));
-       g_array_append_val (persp->priv->custom_parts, titem);
-}
-
-static void
-data_manager_perspective_uncustomize (BrowserPerspective *perspective,
-                                     GtkToolbar *toolbar, GtkHeaderBar *header, GMenu *menu)
-{
-       g_print ("%s ()\n", __FUNCTION__);
-       DataManagerPerspective *persp;
-       persp = DATA_MANAGER_PERSPECTIVE (perspective);
-
-       BrowserWindow *bwin;
-       bwin = browser_perspective_get_window (perspective);
-
-       /* remove perspective's actions */
-       guint i;
-       for (i = 0; i < G_N_ELEMENTS (win_entries); i++) {
-               GActionEntry *entry;
-               entry = &win_entries [i];
-               g_action_map_remove_action (G_ACTION_MAP (bwin), entry->name);
-       }
-
-       /* cleanups, headerbar and toolbar */
-       g_assert (persp->priv->custom_parts);
-       for (i = 0; i < persp->priv->custom_parts->len; i++) {
-               GObject *obj;
-               obj = g_array_index (persp->priv->custom_parts, GObject*, i);
-               if (GTK_IS_WIDGET (obj))
-                       gtk_widget_destroy (GTK_WIDGET (obj));
-               else
-                       g_warning ("Unknown type to uncustomize: %s\n", G_OBJECT_CLASS_NAME 
(G_OBJECT_GET_CLASS (obj)));
-       }
-       g_array_free (persp->priv->custom_parts, TRUE);
-       persp->priv->custom_parts = NULL;
+       customization_data_add_part (G_OBJECT (perspective), G_OBJECT (titem));
 }
 
 /**
diff --git a/tools/browser/data-manager/data-source.c b/tools/browser/data-manager/data-source.c
index f6acf3f..0fde2ed 100644
--- a/tools/browser/data-manager/data-source.c
+++ b/tools/browser/data-manager/data-source.c
@@ -942,7 +942,7 @@ data_source_execute (DataSource *source, GError **error)
 }
 
 static void
-action_refresh_cb (GtkAction *action, DataSource *source)
+action_refresh_cb (GtkButton *button, DataSource *source)
 {
        source->priv->need_rerun = TRUE;
        data_source_execute (source, NULL);
diff --git a/tools/browser/dummy-perspective/dummy-perspective.c 
b/tools/browser/dummy-perspective/dummy-perspective.c
index 20deb8f..daf131b 100644
--- a/tools/browser/dummy-perspective/dummy-perspective.c
+++ b/tools/browser/dummy-perspective/dummy-perspective.c
@@ -20,12 +20,12 @@
 
 #include <string.h>
 #include <glib/gi18n-lib.h>
+#include "../ui-customize.h"
 #include "dummy-perspective.h"
 #include "dummy-perspective.gresources.h"
 
 struct _DummyPerspectivePriv {
-       GArray *custom_parts;
-       gint    custom_menu_pos;
+       GtkWidget *notebook;
 };
 /* 
  * Main static functions 
@@ -36,10 +36,9 @@ static void dummy_perspective_dispose (GObject *object);
 
 /* BrowserPerspective interface */
 static void                 dummy_perspective_perspective_init (BrowserPerspectiveIface *iface);
+static GtkWidget           *dummy_perspective_get_notebook (BrowserPerspective *perspective);
 static void                 dummy_perspective_customize (BrowserPerspective *perspective,
-                                                        GtkToolbar *toolbar, GtkHeaderBar *header, GMenu 
*menu);
-static void                 dummy_perspective_uncustomize (BrowserPerspective *perspective,
-                                                          GtkToolbar *toolbar, GtkHeaderBar *header, GMenu 
*menu);
+                                                        GtkToolbar *toolbar, GtkHeaderBar *header);
 /* get a pointer to the parents to be able to call their destructor */
 static GObjectClass  *parent_class = NULL;
 
@@ -95,28 +94,32 @@ dummy_perspective_class_init (DummyPerspectiveClass * klass)
 static void
 dummy_perspective_perspective_init (BrowserPerspectiveIface *iface)
 {
+       iface->i_get_notebook = dummy_perspective_get_notebook;
        iface->i_customize = dummy_perspective_customize;
-       iface->i_uncustomize = dummy_perspective_uncustomize;
+       iface->i_uncustomize = NULL;
 }
 
 
 static void
 dummy_perspective_init (DummyPerspective *perspective)
 {
-       GtkWidget *wid;
+       GtkWidget *wid, *nb;
 
        perspective->priv = g_new0 (DummyPerspectivePriv, 1);
-       perspective->priv->custom_parts = NULL;
-       perspective->priv->custom_menu_pos = -1;
 
        gtk_orientable_set_orientation (GTK_ORIENTABLE (perspective), GTK_ORIENTATION_VERTICAL);
+
+       nb = browser_perspective_create_notebook (BROWSER_PERSPECTIVE (perspective));
+       perspective->priv->notebook = nb;
+       gtk_box_pack_start (GTK_BOX (perspective), nb, TRUE, TRUE, 0);
        
        wid = gtk_label_new ("");
        gtk_label_set_markup (GTK_LABEL (wid),
                              "<big><b>Dummy perspective</b></big>\n"
                              "Use this as a starting point for your own perspective...");
-       gtk_box_pack_start (GTK_BOX (perspective), wid, TRUE, TRUE, 0);
-       gtk_widget_show (wid);
+       gtk_notebook_append_page (GTK_NOTEBOOK (nb), wid, NULL);
+
+       gtk_widget_show_all (nb);
 }
 
 /**
@@ -129,12 +132,6 @@ dummy_perspective_new (BrowserWindow *bwin)
 {
        BrowserPerspective *bpers;
        bpers = (BrowserPerspective*) g_object_new (TYPE_DUMMY_PERSPECTIVE, NULL);
-       DummyPerspective *dpers;
-       dpers = (DummyPerspective *) bpers;
-
-       /* if there is a notebook to store pages, use: 
-       browser_perspective_declare_notebook (bpers, GTK_NOTEBOOK (perspective->priv->notebook));
-       */
 
        return bpers;
 }
@@ -149,8 +146,10 @@ dummy_perspective_dispose (GObject *object)
        g_return_if_fail (IS_DUMMY_PERSPECTIVE (object));
 
        perspective = DUMMY_PERSPECTIVE (object);
-       browser_perspective_declare_notebook ((BrowserPerspective*) perspective, NULL);
        if (perspective->priv) {
+               if (customization_data_exists (object))
+                       customization_data_release (object);
+
                g_free (perspective->priv);
                perspective->priv = NULL;
        }
@@ -159,6 +158,13 @@ dummy_perspective_dispose (GObject *object)
        parent_class->dispose (object);
 }
 
+static GtkWidget *
+dummy_perspective_get_notebook (BrowserPerspective *perspective)
+{
+       g_return_val_if_fail (IS_DUMMY_PERSPECTIVE (perspective), NULL);
+       return DUMMY_PERSPECTIVE (perspective)->priv->notebook;
+}
+
 static void
 dummy1_cb (GSimpleAction *action, GVariant *state, gpointer data)
 {
@@ -183,34 +189,14 @@ static GActionEntry win_entries[] = {
 };
 
 static void
-dummy_perspective_customize (BrowserPerspective *perspective,
-                            GtkToolbar *toolbar, GtkHeaderBar *header, GMenu *menu)
+dummy_perspective_customize (BrowserPerspective *perspective, GtkToolbar *toolbar, GtkHeaderBar *header)
 {
        g_print ("%s ()\n", __FUNCTION__);
-       DummyPerspective *dpers;
-       dpers = DUMMY_PERSPECTIVE (perspective);
 
-       BrowserWindow *bwin;
-       bwin = browser_perspective_get_window (perspective);
+       customization_data_init (G_OBJECT (perspective), toolbar, header);
 
        /* add perspective's actions */
-       g_action_map_add_action_entries (G_ACTION_MAP (bwin),
-                                        win_entries, G_N_ELEMENTS (win_entries),
-                                        dpers);
-
-       g_assert (! dpers->priv->custom_parts);
-       dpers->priv->custom_parts = g_array_new (FALSE, FALSE, sizeof (gpointer));
-       g_assert (dpers->priv->custom_menu_pos == -1);
-
-       /* add menu */
-       GtkBuilder *builder;
-       builder = gtk_builder_new ();
-       gtk_builder_add_from_resource (builder, "/dummy-perspective/perspective-menus.ui", NULL);
-       GMenuModel *menumodel;
-       menumodel = G_MENU_MODEL (gtk_builder_get_object (builder, "menubar"));
-       dpers->priv->custom_menu_pos = g_menu_model_get_n_items (G_MENU_MODEL (menu));
-       g_menu_append_submenu (menu, "Dummy", menumodel);
-       g_object_unref (builder);
+       customization_data_add_actions (G_OBJECT (perspective), win_entries, G_N_ELEMENTS (win_entries));
 
        /* add to toolbar */
        GtkToolItem *titem;
@@ -220,7 +206,7 @@ dummy_perspective_customize (BrowserPerspective *perspective,
        gtk_toolbar_insert (GTK_TOOLBAR (toolbar), titem, -1);
        gtk_actionable_set_action_name (GTK_ACTIONABLE (titem), "win.dummy1");
        gtk_widget_show (GTK_WIDGET (titem));
-       g_array_append_val (dpers->priv->custom_parts, titem);
+       customization_data_add_part (G_OBJECT (perspective), G_OBJECT (titem));
 
        titem = gtk_tool_button_new (NULL, NULL);
        gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (titem), "process-stop-symbolic");
@@ -228,12 +214,12 @@ dummy_perspective_customize (BrowserPerspective *perspective,
        gtk_toolbar_insert (GTK_TOOLBAR (toolbar), titem, -1);
        gtk_actionable_set_action_name (GTK_ACTIONABLE (titem), "win.dummy2");
        gtk_widget_show (GTK_WIDGET (titem));
-       g_array_append_val (dpers->priv->custom_parts, titem);
+       customization_data_add_part (G_OBJECT (perspective), G_OBJECT (titem));
 
        /* add to header bar */
        GtkWidget *img, *button;
        button = gtk_menu_button_new ();
-       g_array_append_val (dpers->priv->custom_parts, button);
+       customization_data_add_part (G_OBJECT (perspective), G_OBJECT (button));
        img = gtk_image_new_from_icon_name ("start-here-symbolic", GTK_ICON_SIZE_MENU);
        gtk_button_set_image (GTK_BUTTON (button), img);
        gtk_header_bar_pack_end (GTK_HEADER_BAR (header), button);
@@ -249,42 +235,3 @@ dummy_perspective_customize (BrowserPerspective *perspective,
        mitem = g_menu_item_new ("Dummy 2", "win.dummy2");
        g_menu_insert_item (smenu, -1, mitem);
 }
-
-static void
-dummy_perspective_uncustomize (BrowserPerspective *perspective,
-                              GtkToolbar *toolbar, GtkHeaderBar *header, GMenu *menu)
-{
-       g_print ("%s ()\n", __FUNCTION__);
-       DummyPerspective *dpers;
-       dpers = DUMMY_PERSPECTIVE (perspective);
-
-       BrowserWindow *bwin;
-       bwin = browser_perspective_get_window (perspective);
-
-       /* remove perspective's actions */
-       guint i;
-       for (i = 0; i < G_N_ELEMENTS (win_entries); i++) {
-               GActionEntry *entry;
-               entry = &win_entries [i];
-               g_action_map_remove_action (G_ACTION_MAP (bwin), entry->name);
-       }
-
-       /* cleanups, headerbar and toolbar */
-       g_assert (dpers->priv->custom_parts);
-       for (i = 0; i < dpers->priv->custom_parts->len; i++) {
-               GObject *obj;
-               obj = g_array_index (dpers->priv->custom_parts, GObject*, i);
-               if (GTK_IS_WIDGET (obj))
-                       gtk_widget_destroy (GTK_WIDGET (obj));
-               else
-                       g_warning ("Unknown type to uncustomize: %s\n", G_OBJECT_CLASS_NAME 
(G_OBJECT_GET_CLASS (obj)));
-       }
-       g_array_free (dpers->priv->custom_parts, TRUE);
-       dpers->priv->custom_parts = NULL;
-
-       /* cleanups, menu */
-       if (dpers->priv->custom_menu_pos >= 0) {
-               g_menu_remove (menu, dpers->priv->custom_menu_pos);
-               dpers->priv->custom_menu_pos = -1;
-       }
-}
diff --git a/tools/browser/ldap-browser/entry-properties.c b/tools/browser/ldap-browser/entry-properties.c
index d16c3e6..393ad49 100644
--- a/tools/browser/ldap-browser/entry-properties.c
+++ b/tools/browser/ldap-browser/entry-properties.c
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2011 Murray Cumming <murrayc murrayc com>
- * Copyright (C) 2011 - 2014 Vivien Malerba <malerba gnome-db org>
+ * Copyright (C) 2011 - 2015 Vivien Malerba <malerba gnome-db org>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -27,8 +27,6 @@
 #include "../ui-support.h"
 #include "../text-search.h"
 
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-
 struct _EntryPropertiesPrivate {
        TConnection *tcnc;
 
@@ -225,8 +223,8 @@ data_save_cb (GtkWidget *mitem, EntryProperties *eprop)
        dialog = gtk_file_chooser_dialog_new (_("Select the file to save data to"),
                                              (GtkWindow*) gtk_widget_get_toplevel (GTK_WIDGET (eprop)),
                                              GTK_FILE_CHOOSER_ACTION_SAVE,
-                                             GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-                                             GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT,
+                                             _("_Cancel"), GTK_RESPONSE_CANCEL,
+                                             _("_Save"), GTK_RESPONSE_ACCEPT,
                                              NULL);
        gtk_file_chooser_set_current_folder (GTK_FILE_CHOOSER (dialog),
                                             gdaui_get_default_path ());
diff --git a/tools/browser/ldap-browser/ldap-browser-perspective.c 
b/tools/browser/ldap-browser/ldap-browser-perspective.c
index f84c1d4..21518bb 100644
--- a/tools/browser/ldap-browser/ldap-browser-perspective.c
+++ b/tools/browser/ldap-browser/ldap-browser-perspective.c
@@ -25,6 +25,7 @@
 #include "ldap-classes-page.h"
 #include "ldap-search-page.h"
 #include "../ui-support.h"
+#include "../ui-customize.h"
 #include "../browser-page.h"
 #include "ldap-favorite-selector.h"
 
@@ -37,10 +38,9 @@ static void ldap_browser_perspective_dispose (GObject *object);
 
 /* BrowserPerspective interface */
 static void                 ldap_browser_perspective_perspective_init (BrowserPerspectiveIface *iface);
+static GtkWidget           *ldap_browser_perspective_get_notebook (BrowserPerspective *perspective);
 static void                 ldap_browser_perspective_customize (BrowserPerspective *perspective,
-                                                               GtkToolbar *toolbar, GtkHeaderBar *header, 
GMenu *menu);
-static void                 ldap_browser_perspective_uncustomize (BrowserPerspective *perspective,
-                                                                 GtkToolbar *toolbar, GtkHeaderBar *header, 
GMenu *menu);
+                                                               GtkToolbar *toolbar, GtkHeaderBar *header);
 
 /* get a pointer to the parents to be able to call their destructor */
 static GObjectClass  *parent_class = NULL;
@@ -50,8 +50,6 @@ struct _LdapBrowserPerspectivePrivate {
        GtkWidget *favorites;
        gboolean favorites_shown;
        BrowserWindow *bwin;
-
-       GArray *custom_parts;
 };
 
 GType
@@ -102,8 +100,9 @@ ldap_browser_perspective_class_init (LdapBrowserPerspectiveClass * klass)
 static void
 ldap_browser_perspective_perspective_init (BrowserPerspectiveIface *iface)
 {
+       iface->i_get_notebook = ldap_browser_perspective_get_notebook;
        iface->i_customize = ldap_browser_perspective_customize;
-        iface->i_uncustomize = ldap_browser_perspective_uncustomize;
+        iface->i_uncustomize = NULL;
 }
 
 
@@ -112,7 +111,6 @@ ldap_browser_perspective_init (LdapBrowserPerspective *perspective)
 {
        perspective->priv = g_new0 (LdapBrowserPerspectivePrivate, 1);
        perspective->priv->favorites_shown = TRUE;
-       perspective->priv->custom_parts = NULL;
 
        gtk_orientable_set_orientation (GTK_ORIENTABLE (perspective), GTK_ORIENTATION_VERTICAL);
 }
@@ -153,11 +151,9 @@ ldap_browser_perspective_new (BrowserWindow *bwin)
        gtk_paned_set_position (GTK_PANED (paned), DEFAULT_FAVORITES_SIZE);
        perspective->priv->favorites = wid;
 
-       nb = gtk_notebook_new ();
+       nb = browser_perspective_create_notebook (bpers);
        perspective->priv->notebook = nb;
        gtk_paned_add2 (GTK_PANED (paned), nb);
-       gtk_notebook_set_scrollable (GTK_NOTEBOOK (nb), TRUE);
-       gtk_notebook_popup_enable (GTK_NOTEBOOK (nb));
 
        wid = ldap_entries_page_new (tcnc, NULL);
        tlabel = browser_page_get_tab_label (BROWSER_PAGE (wid), &button);
@@ -174,8 +170,6 @@ ldap_browser_perspective_new (BrowserWindow *bwin)
        if (!perspective->priv->favorites_shown)
                gtk_widget_hide (perspective->priv->favorites);
 
-       browser_perspective_declare_notebook (bpers, GTK_NOTEBOOK (perspective->priv->notebook));
-
        return bpers;
 }
 
@@ -205,7 +199,9 @@ ldap_browser_perspective_dispose (GObject *object)
 
        perspective = LDAP_BROWSER_PERSPECTIVE (object);
        if (perspective->priv) {
-               browser_perspective_declare_notebook ((BrowserPerspective*) perspective, NULL);
+               if (customization_data_exists (object))
+                       customization_data_release (object);
+
                g_free (perspective->priv);
                perspective->priv = NULL;
        }
@@ -328,6 +324,13 @@ ldab_search_add_cb (G_GNUC_UNUSED GSimpleAction *action, G_GNUC_UNUSED GVariant
         gtk_widget_grab_focus (page);
 }
 
+static GtkWidget *
+ldap_browser_perspective_get_notebook (BrowserPerspective *perspective)
+{
+       g_return_val_if_fail (IS_LDAP_BROWSER_PERSPECTIVE (perspective), NULL);
+       return LDAP_BROWSER_PERSPECTIVE (perspective)->priv->notebook;
+}
+
 static GActionEntry win_entries[] = {
         { "show-favorites", NULL, NULL, "true", favorites_toggle_cb },
         { "entries-page-new", ldab_ldap_entries_page_add_cb, NULL, NULL, NULL },
@@ -336,23 +339,12 @@ static GActionEntry win_entries[] = {
 };
 
 static void
-ldap_browser_perspective_customize (BrowserPerspective *perspective,
-                                   GtkToolbar *toolbar, GtkHeaderBar *header, GMenu *menu)
+ldap_browser_perspective_customize (BrowserPerspective *perspective, GtkToolbar *toolbar, GtkHeaderBar 
*header)
 {
        g_print ("%s ()\n", __FUNCTION__);
-       LdapBrowserPerspective *persp;
-       persp = LDAP_BROWSER_PERSPECTIVE (perspective);
-
-       BrowserWindow *bwin;
-       bwin = browser_perspective_get_window (perspective);
 
        /* add perspective's actions */
-       g_action_map_add_action_entries (G_ACTION_MAP (bwin),
-                                        win_entries, G_N_ELEMENTS (win_entries),
-                                        perspective);
-
-       g_assert (! persp->priv->custom_parts);
-       persp->priv->custom_parts = g_array_new (FALSE, FALSE, sizeof (gpointer));
+       customization_data_add_actions (G_OBJECT (perspective), win_entries, G_N_ELEMENTS (win_entries));
 
        /* add to toolbar */
        GtkToolItem *titem;
@@ -362,7 +354,7 @@ ldap_browser_perspective_customize (BrowserPerspective *perspective,
        gtk_toolbar_insert (GTK_TOOLBAR (toolbar), titem, -1);
        gtk_actionable_set_action_name (GTK_ACTIONABLE (titem), "win.show-favorites");
        gtk_widget_show (GTK_WIDGET (titem));
-       g_array_append_val (persp->priv->custom_parts, titem);
+       customization_data_add_part (G_OBJECT (perspective), G_OBJECT (titem));
 
        GdkPixbuf *pix;
        GtkWidget *img;
@@ -375,7 +367,7 @@ ldap_browser_perspective_customize (BrowserPerspective *perspective,
        gtk_toolbar_insert (GTK_TOOLBAR (toolbar), titem, -1);
        gtk_actionable_set_action_name (GTK_ACTIONABLE (titem), "win.entries-page-new");
        gtk_widget_show (GTK_WIDGET (titem));
-       g_array_append_val (persp->priv->custom_parts, titem);
+       customization_data_add_part (G_OBJECT (perspective), G_OBJECT (titem));
 
        pix = ui_get_pixbuf_icon (UI_ICON_LDAP_CLASS_STRUCTURAL);
        img = gtk_image_new_from_pixbuf (pix);
@@ -386,7 +378,7 @@ ldap_browser_perspective_customize (BrowserPerspective *perspective,
        gtk_toolbar_insert (GTK_TOOLBAR (toolbar), titem, -1);
        gtk_actionable_set_action_name (GTK_ACTIONABLE (titem), "win.classes-page-new");
        gtk_widget_show (GTK_WIDGET (titem));
-       g_array_append_val (persp->priv->custom_parts, titem);
+       customization_data_add_part (G_OBJECT (perspective), G_OBJECT (titem));
 
        titem = gtk_tool_button_new (NULL, NULL);
        gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (titem), "edit-find");
@@ -394,43 +386,9 @@ ldap_browser_perspective_customize (BrowserPerspective *perspective,
        gtk_toolbar_insert (GTK_TOOLBAR (toolbar), titem, -1);
        gtk_actionable_set_action_name (GTK_ACTIONABLE (titem), "win.search-page-new");
        gtk_widget_show (GTK_WIDGET (titem));
-       g_array_append_val (persp->priv->custom_parts, titem);
-}
-
-static void
-ldap_browser_perspective_uncustomize (BrowserPerspective *perspective,
-                                     GtkToolbar *toolbar, GtkHeaderBar *header, GMenu *menu)
-{
-       g_print ("%s ()\n", __FUNCTION__);
-       LdapBrowserPerspective *persp;
-       persp = LDAP_BROWSER_PERSPECTIVE (perspective);
-
-       BrowserWindow *bwin;
-       bwin = browser_perspective_get_window (perspective);
-
-       /* remove perspective's actions */
-       guint i;
-       for (i = 0; i < G_N_ELEMENTS (win_entries); i++) {
-               GActionEntry *entry;
-               entry = &win_entries [i];
-               g_action_map_remove_action (G_ACTION_MAP (bwin), entry->name);
-       }
-
-       /* cleanups, headerbar and toolbar */
-       g_assert (persp->priv->custom_parts);
-       for (i = 0; i < persp->priv->custom_parts->len; i++) {
-               GObject *obj;
-               obj = g_array_index (persp->priv->custom_parts, GObject*, i);
-               if (GTK_IS_WIDGET (obj))
-                       gtk_widget_destroy (GTK_WIDGET (obj));
-               else
-                       g_warning ("Unknown type to uncustomize: %s\n", G_OBJECT_CLASS_NAME 
(G_OBJECT_GET_CLASS (obj)));
-       }
-       g_array_free (persp->priv->custom_parts, TRUE);
-       persp->priv->custom_parts = NULL;
+       customization_data_add_part (G_OBJECT (perspective), G_OBJECT (titem));
 }
 
-
 /**
  * ldap_browser_perspective_display_ldap_entry
  *
diff --git a/tools/browser/ldap-browser/ldap-classes-page.c b/tools/browser/ldap-browser/ldap-classes-page.c
index cc06bcd..e20e0c9 100644
--- a/tools/browser/ldap-browser/ldap-classes-page.c
+++ b/tools/browser/ldap-browser/ldap-classes-page.c
@@ -24,6 +24,7 @@
 #include "class-properties.h"
 #include "../dnd.h"
 #include "../ui-support.h"
+#include "../ui-customize.h"
 #include "../gdaui-bar.h"
 #include "../browser-page.h"
 #include "../browser-window.h"
@@ -33,8 +34,6 @@
 #include <libgda-ui/gdaui-tree-store.h>
 #include <libgda/gda-debug-macros.h>
 
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-
 typedef struct {
        gchar *classname;
        GtkTreeRowReference *reference;
@@ -54,7 +53,6 @@ struct _LdapClassesPagePrivate {
        GtkWidget *classes_view;
        GtkWidget *entry_props;
 
-       GtkActionGroup *agroup;
        GArray *history_items; /* array of @HistoryItem */
        guint history_max_len; /* max allowed length of @history_items */
        gint current_hitem; /* index in @history_items, or -1 */
@@ -67,9 +65,8 @@ static void ldap_classes_page_dispose   (GObject *object);
 
 /* BrowserPage interface */
 static void                 ldap_classes_page_page_init (BrowserPageIface *iface);
-static GtkActionGroup      *ldap_classes_page_page_get_actions_group (BrowserPage *page);
-static const gchar         *ldap_classes_page_page_get_actions_ui (BrowserPage *page);
-static GtkWidget           *ldap_classes_page_page_get_tab_label (BrowserPage *page, GtkWidget 
**out_close_button);
+static void                 ldap_classes_customize (BrowserPage *page, GtkToolbar *toolbar, GtkHeaderBar 
*header);
+static GtkWidget           *ldap_classes_page_get_tab_label (BrowserPage *page, GtkWidget 
**out_close_button);
 
 static GObjectClass *parent_class = NULL;
 
@@ -91,9 +88,9 @@ ldap_classes_page_class_init (LdapClassesPageClass *klass)
 static void
 ldap_classes_page_page_init (BrowserPageIface *iface)
 {
-       iface->i_get_actions_group = ldap_classes_page_page_get_actions_group;
-       iface->i_get_actions_ui = ldap_classes_page_page_get_actions_ui;
-       iface->i_get_tab_label = ldap_classes_page_page_get_tab_label;
+       iface->i_customize = ldap_classes_customize;
+       iface->i_uncustomize = NULL;
+       iface->i_get_tab_label = ldap_classes_page_get_tab_label;
 }
 
 static void
@@ -116,8 +113,6 @@ ldap_classes_page_dispose (GObject *object)
        if (ebrowser->priv) {
                if (ebrowser->priv->tcnc)
                        g_object_unref (ebrowser->priv->tcnc);
-               if (ebrowser->priv->agroup)
-                       g_object_unref (ebrowser->priv->agroup);
                if (ebrowser->priv->history_items) {
                        guint i;
                        for (i = 0; i < ebrowser->priv->history_items->len; i++) {
@@ -205,7 +200,7 @@ source_drag_data_get_cb (G_GNUC_UNUSED GtkWidget *widget, G_GNUC_UNUSED GdkDragC
 static void
 update_history_actions (LdapClassesPage *ebrowser)
 {
-       if (!ebrowser->priv->agroup)
+       if (!customization_data_exists (G_OBJECT (ebrowser)))
                return;
 
        gboolean is_first = TRUE;
@@ -229,11 +224,13 @@ update_history_actions (LdapClassesPage *ebrowser)
                }
        }
 
-       GtkAction *action;
-       action = gtk_action_group_get_action (ebrowser->priv->agroup, "DnBack");
-       gtk_action_set_sensitive (action, !is_first);
-       action = gtk_action_group_get_action (ebrowser->priv->agroup, "DnForward");
-       gtk_action_set_sensitive (action, !is_last);
+       GAction *action;
+        action = customization_data_get_action (G_OBJECT (ebrowser), "ClassBack");
+        if (action)
+                g_simple_action_set_enabled (G_SIMPLE_ACTION (action), !is_first);
+       action = customization_data_get_action (G_OBJECT (ebrowser), "ClassForward");
+        if (action)
+                g_simple_action_set_enabled (G_SIMPLE_ACTION (action), !is_last);
 }
 
 static void
@@ -246,11 +243,12 @@ selection_changed_cb (GtkTreeSelection *sel, LdapClassesPage *ebrowser)
        if (!current_classname)
                return;
 
-       if (ebrowser->priv->agroup) {
-               GtkAction *action;
-               action = gtk_action_group_get_action (ebrowser->priv->agroup, "AddToFav");
+       GAction *action;
+       action = customization_data_get_action (G_OBJECT (ebrowser), "AddToFav");
+       if (action) {
                current_classname = ldap_classes_page_get_current_class (ebrowser);
-               gtk_action_set_sensitive (action, (current_classname && *current_classname) ? TRUE : FALSE);
+               g_simple_action_set_enabled (G_SIMPLE_ACTION (action),
+                                            (current_classname && *current_classname) ? TRUE : FALSE);
        }
 
        GtkTreeModel *model;
@@ -409,8 +407,11 @@ ldap_classes_page_set_current_class (LdapClassesPage *ldap_classes_page, const g
  * UI actions
  */
 static void
-action_add_to_fav_cb (G_GNUC_UNUSED GtkAction *action, LdapClassesPage *ebrowser)
+action_add_to_fav_cb (G_GNUC_UNUSED GSimpleAction *action, G_GNUC_UNUSED GVariant *state, gpointer data)
 {
+       LdapClassesPage *ebrowser;
+       ebrowser = LDAP_CLASSES_PAGE (data);
+
        TFavorites *bfav;
         TFavoritesAttributes fav;
         GError *error = NULL;
@@ -435,8 +436,11 @@ action_add_to_fav_cb (G_GNUC_UNUSED GtkAction *action, LdapClassesPage *ebrowser
 }
 
 static void
-action_class_back_cb (G_GNUC_UNUSED GtkAction *action, LdapClassesPage *ebrowser)
+action_class_back_cb (G_GNUC_UNUSED GSimpleAction *action, G_GNUC_UNUSED GVariant *state, gpointer data)
 {
+       LdapClassesPage *ebrowser;
+       ebrowser = LDAP_CLASSES_PAGE (data);
+
        ebrowser->priv->add_hist_item = FALSE;
        if (ebrowser->priv->current_hitem > 0) {
                HistoryItem *hitem = NULL;
@@ -468,8 +472,11 @@ action_class_back_cb (G_GNUC_UNUSED GtkAction *action, LdapClassesPage *ebrowser
 }
 
 static void
-action_class_forward_cb (G_GNUC_UNUSED GtkAction *action, LdapClassesPage *ebrowser)
+action_class_forward_cb (G_GNUC_UNUSED GSimpleAction *action, G_GNUC_UNUSED GVariant *state, gpointer data)
 {
+       LdapClassesPage *ebrowser;
+       ebrowser = LDAP_CLASSES_PAGE (data);
+
        ebrowser->priv->add_hist_item = FALSE;
        if ((ebrowser->priv->current_hitem >=0) &&
            ((guint) ebrowser->priv->current_hitem < ebrowser->priv->history_items->len)) {
@@ -501,68 +508,51 @@ action_class_forward_cb (G_GNUC_UNUSED GtkAction *action, LdapClassesPage *ebrow
        ebrowser->priv->add_hist_item = TRUE;
 }
 
-static GtkActionEntry ui_actions[] = {
-       { "LDAP", NULL, N_("_LDAP"), NULL, N_("LDAP"), NULL },
-       { "AddToFav", /*STOCK_ADD_BOOKMARK*/ NULL, N_("Add to _Favorites"), NULL, N_("Add class to 
favorites"),
-         G_CALLBACK (action_add_to_fav_cb)},
-       { "DnBack", GTK_STOCK_GO_BACK, N_("Previous Class"), NULL, N_("Move back to previous LDAP class"),
-         G_CALLBACK (action_class_back_cb)},
-       { "DnForward", GTK_STOCK_GO_FORWARD, N_("Next Class"), NULL, N_("Move to next LDAP class"),
-         G_CALLBACK (action_class_forward_cb)},
+static GActionEntry win_entries[] = {
+        { "AddToFav", action_add_to_fav_cb, NULL, NULL, NULL },
+       { "ClassBack", action_class_back_cb, NULL, NULL, NULL },
+       { "ClassForward", action_class_forward_cb, NULL, NULL, NULL },
 };
-static const gchar *ui_actions_browser =
-       "<ui>"
-       "  <menubar name='MenuBar'>"
-       "    <placeholder name='MenuExtension'>"
-        "      <menu name='LDAP' action='LDAP'>"
-        "        <menuitem name='AddToFav' action= 'AddToFav'/>"
-       "        <separator/>"
-        "        <menuitem name='DnBack' action= 'DnBack'/>"
-        "        <menuitem name='DnForward' action= 'DnForward'/>"
-        "      </menu>"
-        "    </placeholder>"
-       "  </menubar>"
-       "  <toolbar name='ToolBar'>"
-       "    <separator/>"
-       "    <toolitem action='AddToFav'/>"
-       "    <toolitem action='DnBack'/>"
-       "    <toolitem action='DnForward'/>"
-       "  </toolbar>"
-       "</ui>";
-
-static GtkActionGroup *
-ldap_classes_page_page_get_actions_group (BrowserPage *page)
-{
-       LdapClassesPage *ebrowser;
-
-       ebrowser = LDAP_CLASSES_PAGE (page);
-       if (! ebrowser->priv->agroup) {
-               GtkActionGroup *agroup;
-               agroup = gtk_action_group_new ("LdapLdapClassesPageActions");
-               gtk_action_group_set_translation_domain (agroup, GETTEXT_PACKAGE);
-               gtk_action_group_add_actions (agroup, ui_actions, G_N_ELEMENTS (ui_actions), page);
-               ebrowser->priv->agroup = agroup;
-
-               GtkAction *action;
-               const gchar *current_classname;
-               action = gtk_action_group_get_action (agroup, "AddToFav");
-               current_classname = ldap_classes_page_get_current_class (ebrowser);
-               gtk_action_set_sensitive (action, (current_classname && *current_classname) ? TRUE : FALSE);
-
-               update_history_actions (ebrowser);
-       }
-       
-       return g_object_ref (ebrowser->priv->agroup);
-}
 
-static const gchar *
-ldap_classes_page_page_get_actions_ui (G_GNUC_UNUSED BrowserPage *page)
+static void
+ldap_classes_customize (BrowserPage *page, GtkToolbar *toolbar, GtkHeaderBar *header)
 {
-       return ui_actions_browser;
+       g_print ("%s ()\n", __FUNCTION__);
+
+       customization_data_init (G_OBJECT (page), toolbar, header);
+
+       /* add perspective's actions */
+       customization_data_add_actions (G_OBJECT (page), win_entries, G_N_ELEMENTS (win_entries));
+
+       /* add to toolbar */
+       GtkToolItem *titem;
+       titem = gtk_tool_button_new (NULL, NULL);
+       gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (titem), "bookmark-new-symbolic");
+       gtk_widget_set_tooltip_text (GTK_WIDGET (titem), _("Add class Favorites"));
+       gtk_toolbar_insert (GTK_TOOLBAR (toolbar), titem, -1);
+       gtk_actionable_set_action_name (GTK_ACTIONABLE (titem), "win.AddToFav");
+       gtk_widget_show (GTK_WIDGET (titem));
+       customization_data_add_part (G_OBJECT (page), G_OBJECT (titem));
+
+       titem = gtk_tool_button_new (NULL, NULL);
+       gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (titem), "go-previous-symbolic");
+       gtk_widget_set_tooltip_text (GTK_WIDGET (titem), _("Move back to previous LDAP class"));
+       gtk_toolbar_insert (GTK_TOOLBAR (toolbar), titem, -1);
+       gtk_actionable_set_action_name (GTK_ACTIONABLE (titem), "win.ClassBack");
+       gtk_widget_show (GTK_WIDGET (titem));
+       customization_data_add_part (G_OBJECT (page), G_OBJECT (titem));
+
+       titem = gtk_tool_button_new (NULL, NULL);
+       gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (titem), "go-next-symbolic");
+       gtk_widget_set_tooltip_text (GTK_WIDGET (titem), _("Move to next LDAP class"));
+       gtk_toolbar_insert (GTK_TOOLBAR (toolbar), titem, -1);
+       gtk_actionable_set_action_name (GTK_ACTIONABLE (titem), "win.ClassForward");
+       gtk_widget_show (GTK_WIDGET (titem));
+       customization_data_add_part (G_OBJECT (page), G_OBJECT (titem));
 }
 
 static GtkWidget *
-ldap_classes_page_page_get_tab_label (BrowserPage *page, GtkWidget **out_close_button)
+ldap_classes_page_get_tab_label (BrowserPage *page, GtkWidget **out_close_button)
 {
        const gchar *tab_name;
        GdkPixbuf *classes_pixbuf;
diff --git a/tools/browser/ldap-browser/ldap-entries-page.c b/tools/browser/ldap-browser/ldap-entries-page.c
index 0904ce7..2599084 100644
--- a/tools/browser/ldap-browser/ldap-entries-page.c
+++ b/tools/browser/ldap-browser/ldap-entries-page.c
@@ -24,6 +24,7 @@
 #include "entry-properties.h"
 #include "../dnd.h"
 #include "../ui-support.h"
+#include "../ui-customize.h"
 #include "../gdaui-bar.h"
 #include "../browser-page.h"
 #include "../browser-window.h"
@@ -34,8 +35,6 @@
 #include "ldap-browser-perspective.h"
 #include <libgda/gda-debug-macros.h>
 
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-
 typedef struct {
        gchar *dn;
        GtkTreeRowReference *reference;
@@ -55,7 +54,6 @@ struct _LdapEntriesPagePrivate {
        GtkWidget *entries_view;
        GtkWidget *entry_props;
 
-       GtkActionGroup *agroup;
        GArray *history_items; /* array of @HistoryItem */
        guint history_max_len; /* max allowed length of @history_items */
        gint current_hitem; /* index in @history_items, or -1 */
@@ -68,9 +66,8 @@ static void ldap_entries_page_dispose   (GObject *object);
 
 /* BrowserPage interface */
 static void                 ldap_entries_page_page_init (BrowserPageIface *iface);
-static GtkActionGroup      *ldap_entries_page_page_get_actions_group (BrowserPage *page);
-static const gchar         *ldap_entries_page_page_get_actions_ui (BrowserPage *page);
-static GtkWidget           *ldap_entries_page_page_get_tab_label (BrowserPage *page, GtkWidget 
**out_close_button);
+static void                 ldap_entries_customize (BrowserPage *page, GtkToolbar *toolbar, GtkHeaderBar 
*header);
+static GtkWidget           *ldap_entries_page_get_tab_label (BrowserPage *page, GtkWidget 
**out_close_button);
 
 static GObjectClass *parent_class = NULL;
 
@@ -92,9 +89,9 @@ ldap_entries_page_class_init (LdapEntriesPageClass *klass)
 static void
 ldap_entries_page_page_init (BrowserPageIface *iface)
 {
-       iface->i_get_actions_group = ldap_entries_page_page_get_actions_group;
-       iface->i_get_actions_ui = ldap_entries_page_page_get_actions_ui;
-       iface->i_get_tab_label = ldap_entries_page_page_get_tab_label;
+       iface->i_customize = ldap_entries_customize;
+       iface->i_uncustomize = NULL;
+       iface->i_get_tab_label = ldap_entries_page_get_tab_label;
 }
 
 static void
@@ -117,8 +114,6 @@ ldap_entries_page_dispose (GObject *object)
        if (ebrowser->priv) {
                if (ebrowser->priv->tcnc)
                        g_object_unref (ebrowser->priv->tcnc);
-               if (ebrowser->priv->agroup)
-                       g_object_unref (ebrowser->priv->agroup);
                if (ebrowser->priv->history_items) {
                        guint i;
                        for (i = 0; i < ebrowser->priv->history_items->len; i++) {
@@ -206,7 +201,7 @@ source_drag_data_get_cb (G_GNUC_UNUSED GtkWidget *widget, G_GNUC_UNUSED GdkDragC
 static void
 update_history_actions (LdapEntriesPage *ebrowser)
 {
-       if (!ebrowser->priv->agroup)
+       if (!customization_data_exists (G_OBJECT (ebrowser)))
                return;
 
        gboolean is_first = TRUE;
@@ -230,11 +225,13 @@ update_history_actions (LdapEntriesPage *ebrowser)
                }
        }
 
-       GtkAction *action;
-       action = gtk_action_group_get_action (ebrowser->priv->agroup, "DnBack");
-       gtk_action_set_sensitive (action, !is_first);
-       action = gtk_action_group_get_action (ebrowser->priv->agroup, "DnForward");
-       gtk_action_set_sensitive (action, !is_last);
+       GAction *action;
+        action = customization_data_get_action (G_OBJECT (ebrowser), "DnBack");
+        if (action)
+                g_simple_action_set_enabled (G_SIMPLE_ACTION (action), !is_first);
+       action = customization_data_get_action (G_OBJECT (ebrowser), "DnForward");
+        if (action)
+                g_simple_action_set_enabled (G_SIMPLE_ACTION (action), !is_last);
 }
 
 static void
@@ -244,11 +241,12 @@ selection_changed_cb (GtkTreeSelection *sel, LdapEntriesPage *ebrowser)
        current_dn = hierarchy_view_get_current_dn (HIERARCHY_VIEW (ebrowser->priv->entries_view), NULL);
        entry_properties_set_dn (ENTRY_PROPERTIES (ebrowser->priv->entry_props), current_dn);
 
-       if (ebrowser->priv->agroup) {
-               GtkAction *action;
-               action = gtk_action_group_get_action (ebrowser->priv->agroup, "AddToFav");
+       GAction *action;
+       action = customization_data_get_action (G_OBJECT (ebrowser), "AddToFav");
+       if (action) {
                current_dn = ldap_entries_page_get_current_dn (ebrowser);
-               gtk_action_set_sensitive (action, (current_dn && *current_dn) ? TRUE : FALSE);
+               g_simple_action_set_enabled (G_SIMPLE_ACTION (action),
+                                            (current_dn && *current_dn) ? TRUE : FALSE);
        }
 
        GtkTreeModel *model;
@@ -414,8 +412,11 @@ ldap_entries_page_set_current_dn (LdapEntriesPage *ldap_entries_page, const gcha
  * UI actions
  */
 static void
-action_add_to_fav_cb (G_GNUC_UNUSED GtkAction *action, LdapEntriesPage *ebrowser)
+action_add_to_fav_cb (G_GNUC_UNUSED GSimpleAction *action, G_GNUC_UNUSED GVariant *state, gpointer data)
 {
+       LdapEntriesPage *ebrowser;
+       ebrowser = LDAP_ENTRIES_PAGE (data);
+
        TFavorites *bfav;
         TFavoritesAttributes fav;
         GError *error = NULL;
@@ -441,8 +442,11 @@ action_add_to_fav_cb (G_GNUC_UNUSED GtkAction *action, LdapEntriesPage *ebrowser
 }
 
 static void
-action_dn_back_cb (G_GNUC_UNUSED GtkAction *action, LdapEntriesPage *ebrowser)
+action_dn_back_cb (G_GNUC_UNUSED GSimpleAction *action, G_GNUC_UNUSED GVariant *state, gpointer data)
 {
+       LdapEntriesPage *ebrowser;
+       ebrowser = LDAP_ENTRIES_PAGE (data);
+
        ebrowser->priv->add_hist_item = FALSE;
        if (ebrowser->priv->current_hitem > 0) {
                HistoryItem *hitem = NULL;
@@ -474,8 +478,11 @@ action_dn_back_cb (G_GNUC_UNUSED GtkAction *action, LdapEntriesPage *ebrowser)
 }
 
 static void
-action_dn_forward_cb (G_GNUC_UNUSED GtkAction *action, LdapEntriesPage *ebrowser)
+action_dn_forward_cb (G_GNUC_UNUSED GSimpleAction *action, G_GNUC_UNUSED GVariant *state, gpointer data)
 {
+       LdapEntriesPage *ebrowser;
+       ebrowser = LDAP_ENTRIES_PAGE (data);
+
        ebrowser->priv->add_hist_item = FALSE;
        if ((ebrowser->priv->current_hitem >=0) &&
            ((guint) ebrowser->priv->current_hitem < ebrowser->priv->history_items->len)) {
@@ -507,68 +514,51 @@ action_dn_forward_cb (G_GNUC_UNUSED GtkAction *action, LdapEntriesPage *ebrowser
        ebrowser->priv->add_hist_item = TRUE;
 }
 
-static GtkActionEntry ui_actions[] = {
-       { "LDAP", NULL, N_("_LDAP"), NULL, N_("LDAP"), NULL },
-       { "AddToFav", /*STOCK_ADD_BOOKMARK*/ NULL, N_("Add to _Favorites"), NULL, N_("Add entry to 
favorites"),
-         G_CALLBACK (action_add_to_fav_cb)},
-       { "DnBack", GTK_STOCK_GO_BACK, N_("Previous Entry"), NULL, N_("Move back to previous LDAP entry"),
-         G_CALLBACK (action_dn_back_cb)},
-       { "DnForward", GTK_STOCK_GO_FORWARD, N_("Next Entry"), NULL, N_("Move to next LDAP entry"),
-         G_CALLBACK (action_dn_forward_cb)},
+static GActionEntry win_entries[] = {
+        { "AddToFav", action_add_to_fav_cb, NULL, NULL, NULL },
+       { "DnBack", action_dn_back_cb, NULL, NULL, NULL },
+       { "DnForward", action_dn_forward_cb, NULL, NULL, NULL },
 };
-static const gchar *ui_actions_browser =
-       "<ui>"
-       "  <menubar name='MenuBar'>"
-       "    <placeholder name='MenuExtension'>"
-        "      <menu name='LDAP' action='LDAP'>"
-        "        <menuitem name='AddToFav' action= 'AddToFav'/>"
-       "        <separator/>"
-        "        <menuitem name='DnBack' action= 'DnBack'/>"
-        "        <menuitem name='DnForward' action= 'DnForward'/>"
-        "      </menu>"
-        "    </placeholder>"
-       "  </menubar>"
-       "  <toolbar name='ToolBar'>"
-       "    <separator/>"
-       "    <toolitem action='AddToFav'/>"
-       "    <toolitem action='DnBack'/>"
-       "    <toolitem action='DnForward'/>"
-       "  </toolbar>"
-       "</ui>";
-
-static GtkActionGroup *
-ldap_entries_page_page_get_actions_group (BrowserPage *page)
-{
-       LdapEntriesPage *ebrowser;
-
-       ebrowser = LDAP_ENTRIES_PAGE (page);
-       if (! ebrowser->priv->agroup) {
-               GtkActionGroup *agroup;
-               agroup = gtk_action_group_new ("LdapLdapEntriesPageActions");
-               gtk_action_group_set_translation_domain (agroup, GETTEXT_PACKAGE);
-               gtk_action_group_add_actions (agroup, ui_actions, G_N_ELEMENTS (ui_actions), page);
-               ebrowser->priv->agroup = agroup;
-
-               GtkAction *action;
-               const gchar *current_dn;
-               action = gtk_action_group_get_action (agroup, "AddToFav");
-               current_dn = ldap_entries_page_get_current_dn (ebrowser);
-               gtk_action_set_sensitive (action, (current_dn && *current_dn) ? TRUE : FALSE);
-
-               update_history_actions (ebrowser);
-       }
-       
-       return g_object_ref (ebrowser->priv->agroup);
-}
 
-static const gchar *
-ldap_entries_page_page_get_actions_ui (G_GNUC_UNUSED BrowserPage *page)
+static void
+ldap_entries_customize (BrowserPage *page, GtkToolbar *toolbar, GtkHeaderBar *header)
 {
-       return ui_actions_browser;
+       g_print ("%s ()\n", __FUNCTION__);
+
+       customization_data_init (G_OBJECT (page), toolbar, header);
+
+       /* add perspective's actions */
+       customization_data_add_actions (G_OBJECT (page), win_entries, G_N_ELEMENTS (win_entries));
+
+       /* add to toolbar */
+       GtkToolItem *titem;
+       titem = gtk_tool_button_new (NULL, NULL);
+       gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (titem), "bookmark-new-symbolic");
+       gtk_widget_set_tooltip_text (GTK_WIDGET (titem), _("Add entry to Favorites"));
+       gtk_toolbar_insert (GTK_TOOLBAR (toolbar), titem, -1);
+       gtk_actionable_set_action_name (GTK_ACTIONABLE (titem), "win.AddToFav");
+       gtk_widget_show (GTK_WIDGET (titem));
+       customization_data_add_part (G_OBJECT (page), G_OBJECT (titem));
+
+       titem = gtk_tool_button_new (NULL, NULL);
+       gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (titem), "go-previous-symbolic");
+       gtk_widget_set_tooltip_text (GTK_WIDGET (titem), _("Move back to previous LDAP entry"));
+       gtk_toolbar_insert (GTK_TOOLBAR (toolbar), titem, -1);
+       gtk_actionable_set_action_name (GTK_ACTIONABLE (titem), "win.DnBack");
+       gtk_widget_show (GTK_WIDGET (titem));
+       customization_data_add_part (G_OBJECT (page), G_OBJECT (titem));
+
+       titem = gtk_tool_button_new (NULL, NULL);
+       gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (titem), "go-next-symbolic");
+       gtk_widget_set_tooltip_text (GTK_WIDGET (titem), _("Move to next LDAP entry"));
+       gtk_toolbar_insert (GTK_TOOLBAR (toolbar), titem, -1);
+       gtk_actionable_set_action_name (GTK_ACTIONABLE (titem), "win.DnForward");
+       gtk_widget_show (GTK_WIDGET (titem));
+       customization_data_add_part (G_OBJECT (page), G_OBJECT (titem));
 }
 
 static GtkWidget *
-ldap_entries_page_page_get_tab_label (BrowserPage *page, GtkWidget **out_close_button)
+ldap_entries_page_get_tab_label (BrowserPage *page, GtkWidget **out_close_button)
 {
        const gchar *tab_name;
        GdkPixbuf *entries_pixbuf;
diff --git a/tools/browser/ldap-browser/ldap-search-page.c b/tools/browser/ldap-browser/ldap-search-page.c
index 973faf7..7277886 100644
--- a/tools/browser/ldap-browser/ldap-search-page.c
+++ b/tools/browser/ldap-browser/ldap-search-page.c
@@ -23,6 +23,7 @@
 #include "filter-editor.h"
 #include "../gdaui-bar.h"
 #include "../ui-support.h"
+#include "../ui-customize.h"
 #include "../browser-page.h"
 #include "../browser-window.h"
 #include "common/t-connection.h"
@@ -31,8 +32,6 @@
 #include "vtable-dialog.h"
 #include <libgda/gda-debug-macros.h>
 
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-
 typedef struct {
        gchar              *base_dn;
        gchar              *filter;
@@ -58,7 +57,6 @@ struct _LdapSearchPagePrivate {
        GtkWidget *search_entry;
        GtkWidget *result_view;
 
-       GtkActionGroup *agroup;
        GArray *history_items; /* array of @HistoryItem */
        guint history_max_len; /* max allowed length of @history_items */
        gint current_hitem; /* index in @history_items, or -1 */
@@ -71,9 +69,8 @@ static void ldap_search_page_dispose   (GObject *object);
 
 /* BrowserPage interface */
 static void                 ldap_search_page_page_init (BrowserPageIface *iface);
-static GtkActionGroup      *ldap_search_page_page_get_actions_group (BrowserPage *page);
-static const gchar         *ldap_search_page_page_get_actions_ui (BrowserPage *page);
-static GtkWidget           *ldap_search_page_page_get_tab_label (BrowserPage *page, GtkWidget 
**out_close_button);
+static void                 ldap_search_customize (BrowserPage *page, GtkToolbar *toolbar, GtkHeaderBar 
*header);
+static GtkWidget           *ldap_search_page_get_tab_label (BrowserPage *page, GtkWidget **out_close_button);
 
 static GObjectClass *parent_class = NULL;
 
@@ -95,9 +92,9 @@ ldap_search_page_class_init (LdapSearchPageClass *klass)
 static void
 ldap_search_page_page_init (BrowserPageIface *iface)
 {
-       iface->i_get_actions_group = ldap_search_page_page_get_actions_group;
-       iface->i_get_actions_ui = ldap_search_page_page_get_actions_ui;
-       iface->i_get_tab_label = ldap_search_page_page_get_tab_label;
+       iface->i_customize = ldap_search_customize;
+       iface->i_uncustomize = NULL;
+       iface->i_get_tab_label = ldap_search_page_get_tab_label;
 }
 
 static void
@@ -120,8 +117,6 @@ ldap_search_page_dispose (GObject *object)
        if (epage->priv) {
                if (epage->priv->tcnc)
                        g_object_unref (epage->priv->tcnc);
-               if (epage->priv->agroup)
-                       g_object_unref (epage->priv->agroup);
                if (epage->priv->history_items) {
                        guint i;
                        for (i = 0; i < epage->priv->history_items->len; i++) {
@@ -170,41 +165,6 @@ ldap_search_page_get_type (void)
 }
 
 static void
-update_history_actions (LdapSearchPage *epage)
-{
-       if (!epage->priv->agroup)
-               return;
-       /*
-       gboolean is_first = TRUE;
-       gboolean is_last = TRUE;
-       const gchar *current_classname;
-       epage->priv->current_hitem = -1;
-       current_classname = ldap_search_page_get_current_class (epage);
-       if (current_classname) {
-               guint i;
-               for (i = 0; i < epage->priv->history_items->len; i++) {
-                       HistoryItem *hitem;
-                       hitem = g_array_index (epage->priv->history_items, HistoryItem*, i);
-                       if (!strcmp (hitem->classname, current_classname)) {
-                               if (i != 0)
-                                       is_first = FALSE;
-                               if (i+1 < epage->priv->history_items->len)
-                                       is_last = FALSE;
-                               epage->priv->current_hitem = (gint) i;
-                               break;
-                       }
-               }
-       }
-
-       GtkAction *action;
-       action = gtk_action_group_get_action (epage->priv->agroup, "DnBack");
-       gtk_action_set_sensitive (action, !is_first);
-       action = gtk_action_group_get_action (epage->priv->agroup, "DnForward");
-       gtk_action_set_sensitive (action, !is_last);
-       */
-}
-
-static void
 filter_exec_clicked_cb (G_GNUC_UNUSED GtkWidget *button, LdapSearchPage *epage)
 {
        guint id;
@@ -307,13 +267,13 @@ ldap_search_page_new (TConnection *tcnc, const gchar *base_dn)
        gtk_box_pack_start (GTK_BOX (hb), bb, FALSE, FALSE, 5);
 
        button = ui_make_small_button (FALSE, FALSE, _("Clear"),
-                                      GTK_STOCK_CLEAR, _("Clear the search settings"));
+                                      "edit-clear-symbolic", _("Clear the search settings"));
        gtk_box_pack_start (GTK_BOX (bb), button, TRUE, TRUE, 0);
        g_signal_connect (button, "clicked",
                          G_CALLBACK (filter_clear_clicked_cb), epage);
 
        button = ui_make_small_button (FALSE, FALSE, _("Execute"),
-                                      GTK_STOCK_EXECUTE, _("Execute LDAP search"));
+                                      "system-run-symbolic", _("Execute LDAP search"));
        gtk_box_pack_start (GTK_BOX (bb), button, TRUE, TRUE, 0);
        g_signal_connect (button, "clicked",
                          G_CALLBACK (filter_exec_clicked_cb), epage);
@@ -340,8 +300,11 @@ ldap_search_page_new (TConnection *tcnc, const gchar *base_dn)
  * UI actions
  */
 static void
-action_define_as_table_cb (G_GNUC_UNUSED GtkAction *action, LdapSearchPage *epage)
+action_define_as_table_cb (G_GNUC_UNUSED GSimpleAction *action, G_GNUC_UNUSED GVariant *state, gpointer data)
 {
+       LdapSearchPage *epage;
+       epage = LDAP_SEARCH_PAGE (data);
+
        GtkWidget *dlg;
        gint res;
        GtkWindow *parent;
@@ -377,153 +340,39 @@ action_define_as_table_cb (G_GNUC_UNUSED GtkAction *action, LdapSearchPage *epag
        }
        gtk_widget_destroy (dlg);
 }
-/*
-static void
-action_class_back_cb (G_GNUC_UNUSED GtkAction *action, LdapSearchPage *epage)
-{
-       epage->priv->add_hist_item = FALSE;
-       if (epage->priv->current_hitem > 0) {
-               HistoryItem *hitem = NULL;
-               gboolean use_dn = TRUE;
-               hitem = g_array_index (epage->priv->history_items, HistoryItem*,
-                                      epage->priv->current_hitem - 1);
-               if (hitem->reference) {
-                       if (gtk_tree_row_reference_valid (hitem->reference)) {
-                               GtkTreeSelection *sel;
-                               GtkTreePath *path;
-                               path = gtk_tree_row_reference_get_path (hitem->reference);
-                               sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (epage->priv->search_view));
-                               gtk_tree_selection_select_path (sel, path);
-                               gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (epage->priv->search_view),
-                                                             path, NULL, TRUE, 0.5, 0.5);
-                               gtk_tree_path_free (path);
-                               use_dn = FALSE;
-                       }
-                       else {
-                               gtk_tree_row_reference_free (hitem->reference);
-                               hitem->reference = NULL;
-                       }
-               }
-               if (use_dn)
-                       search_view_set_current_class (SEARCH_VIEW (epage->priv->search_view),
-                                                      hitem->classname);
-       }
-       epage->priv->add_hist_item = TRUE;
-}
-
-static void
-action_class_forward_cb (G_GNUC_UNUSED GtkAction *action, LdapSearchPage *epage)
-{
-       epage->priv->add_hist_item = FALSE;
-       if ((epage->priv->current_hitem >=0) &&
-           ((guint) epage->priv->current_hitem < epage->priv->history_items->len)) {
-               HistoryItem *hitem = NULL;
-               gboolean use_dn = TRUE;
-               hitem = g_array_index (epage->priv->history_items, HistoryItem*,
-                                      epage->priv->current_hitem + 1);
-               if (hitem->reference) {
-                       if (gtk_tree_row_reference_valid (hitem->reference)) {
-                               GtkTreeSelection *sel;
-                               GtkTreePath *path;
-                               path = gtk_tree_row_reference_get_path (hitem->reference);
-                               sel = gtk_tree_view_get_selection (GTK_TREE_VIEW (epage->priv->search_view));
-                               gtk_tree_selection_select_path (sel, path);
-                               gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (epage->priv->search_view),
-                                                             path, NULL, TRUE, 0.5, 0.5);
-                               gtk_tree_path_free (path);
-                               use_dn = FALSE;
-                       }
-                       else {
-                               gtk_tree_row_reference_free (hitem->reference);
-                               hitem->reference = NULL;
-                       }
-               }
-               if (use_dn)
-                       search_view_set_current_class (SEARCH_VIEW (epage->priv->search_view),
-                                                      hitem->classname);
-       }
-       epage->priv->add_hist_item = TRUE;
-}
 
-*/
-static GtkActionEntry ui_actions[] = {
-       { "LDAP", NULL, N_("_LDAP"), NULL, N_("LDAP"), NULL },
-       { "DefineAsTable", /*BROWSER_STOCK_TABLE_ADD*/ NULL, N_("Define as Table"), NULL, N_("Define search 
as a virtual table"),
-         G_CALLBACK (action_define_as_table_cb)},
-       /*
-       { "DnBack", GTK_STOCK_GO_BACK, N_("Previous class"), NULL, N_("Move back to previous LDAP class"),
-         G_CALLBACK (action_class_back_cb)},
-       { "DnForward", GTK_STOCK_GO_FORWARD, N_("Next class"), NULL, N_("Move to next LDAP class"),
-         G_CALLBACK (action_class_forward_cb)},
-       */
+static GActionEntry win_entries[] = {
+        { "DefineAsTable", action_define_as_table_cb, NULL, NULL, NULL },
 };
-static const gchar *ui_actions_page =
-       "<ui>"
-       "  <menubar name='MenuBar'>"
-       "    <placeholder name='MenuExtension'>"
-        "      <menu name='LDAP' action='LDAP'>"
-        "        <menuitem name='DefineAsTable' action= 'DefineAsTable'/>"
-       /*"        <separator/>"
-        "        <menuitem name='DnBack' action= 'DnBack'/>"
-         "        <menuitem name='DnForward' action= 'DnForward'/>"*/
-        "      </menu>"
-        "    </placeholder>"
-       "  </menubar>"
-       "  <toolbar name='ToolBar'>"
-       "    <separator/>"
-       "    <toolitem action='DefineAsTable'/>"
-       /*"    <toolitem action='DnBack'/>"
-         "    <toolitem action='DnForward'/>"*/
-       "  </toolbar>"
-       "</ui>";
-
-static GtkActionGroup *
-ldap_search_page_page_get_actions_group (BrowserPage *page)
-{
-       LdapSearchPage *epage;
-
-       epage = LDAP_SEARCH_PAGE (page);
-       if (! epage->priv->agroup) {
-               GtkActionGroup *agroup;
-               agroup = gtk_action_group_new ("LdapLdapSearchPageActions");
-               gtk_action_group_set_translation_domain (agroup, GETTEXT_PACKAGE);
-               gtk_action_group_add_actions (agroup, ui_actions, G_N_ELEMENTS (ui_actions), page);
-               epage->priv->agroup = agroup;
 
-               GtkAction *action;
-               gchar *base_dn, *filter, *attributes;
-               gboolean act = FALSE;
-               action = gtk_action_group_get_action (agroup, "DefineAsTable");
-               filter_editor_get_settings (FILTER_EDITOR (epage->priv->search_entry),
-                                           &base_dn, &filter, &attributes, NULL);
-               if ((base_dn && *base_dn) || (filter && *filter) || (attributes && *attributes))
-                       act = TRUE;
-               g_free (base_dn);
-               g_free (filter);
-               g_free (attributes);
-               gtk_action_set_sensitive (action, act);
-
-               update_history_actions (epage);
-       }
-       
-       return g_object_ref (epage->priv->agroup);
-}
-
-static const gchar *
-ldap_search_page_page_get_actions_ui (G_GNUC_UNUSED BrowserPage *page)
+static void
+ldap_search_customize (BrowserPage *page, GtkToolbar *toolbar, GtkHeaderBar *header)
 {
-       return ui_actions_page;
+       g_print ("%s ()\n", __FUNCTION__);
+
+       customization_data_init (G_OBJECT (page), toolbar, header);
+
+       /* add perspective's actions */
+       customization_data_add_actions (G_OBJECT (page), win_entries, G_N_ELEMENTS (win_entries));
+
+       /* add to toolbar */
+       GtkToolItem *titem;
+       titem = gtk_tool_button_new (NULL, NULL);
+       gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (titem), "star-new-symbolic");
+       gtk_widget_set_tooltip_text (GTK_WIDGET (titem), _("Define search as a virtual table"));
+       gtk_toolbar_insert (GTK_TOOLBAR (toolbar), titem, -1);
+       gtk_actionable_set_action_name (GTK_ACTIONABLE (titem), "win.DefineAsTable");
+       gtk_widget_show (GTK_WIDGET (titem));
+       customization_data_add_part (G_OBJECT (page), G_OBJECT (titem));
 }
 
 static GtkWidget *
-ldap_search_page_page_get_tab_label (BrowserPage *page, GtkWidget **out_close_button)
+ldap_search_page_get_tab_label (BrowserPage *page, GtkWidget **out_close_button)
 {
        const gchar *tab_name;
-       GdkPixbuf *search_pixbuf;
 
-       search_pixbuf = gtk_widget_render_icon_pixbuf (GTK_WIDGET (page), GTK_STOCK_FIND, GTK_ICON_SIZE_MENU);
        tab_name = _("LDAP search");
-       return ui_make_tab_label_with_pixbuf (tab_name,
-                                                  search_pixbuf,
-                                                  out_close_button ? TRUE : FALSE, out_close_button);
+       return ui_make_tab_label_with_icon (tab_name,
+                                           "edit-find-symbolic",
+                                           out_close_button ? TRUE : FALSE, out_close_button);
 }
diff --git a/tools/browser/ldap-browser/vtable-dialog.c b/tools/browser/ldap-browser/vtable-dialog.c
index 7b64d5e..938abd8 100644
--- a/tools/browser/ldap-browser/vtable-dialog.c
+++ b/tools/browser/ldap-browser/vtable-dialog.c
@@ -21,8 +21,6 @@
 #include <gtk/gtk.h>
 #include "vtable-dialog.h"
 
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-
 #define SPACING 3
 
 struct _VtableDialogPrivate {
@@ -156,8 +154,8 @@ vtable_dialog_new (GtkWindow *parent, TConnection *tcnc)
 
        gtk_widget_show_all (dcontents);
        gtk_dialog_add_buttons (GTK_DIALOG (dlg),
-                               GTK_STOCK_OK, GTK_RESPONSE_OK,
-                               GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, NULL);
+                               _("_Ok"), GTK_RESPONSE_OK,
+                               _("_Cancel"), GTK_RESPONSE_CANCEL, NULL);
 
        return (GtkWidget*) dlg;
 }
diff --git a/tools/browser/query-exec/query-console-page.c b/tools/browser/query-exec/query-console-page.c
index ba7d048..2146b80 100644
--- a/tools/browser/query-exec/query-console-page.c
+++ b/tools/browser/query-exec/query-console-page.c
@@ -23,6 +23,7 @@
 #include "query-console-page.h"
 #include "../dnd.h"
 #include "../ui-support.h"
+#include "../ui-customize.h"
 #include "../gdaui-bar.h"
 #include "query-exec-perspective.h"
 #include "../browser-window.h"
@@ -34,14 +35,10 @@
 #include <libgda-ui/libgda-ui.h>
 #include <libgda/gda-debug-macros.h>
 
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-
 struct _QueryConsolePagePrivate {
        TConnection *tcnc;
        GdaSqlParser *parser;
 
-       GtkActionGroup *agroup;
-
        GdauiBar *header;
        GtkWidget *vpaned; /* top=>query editor, bottom=>results */
 
@@ -77,9 +74,8 @@ static void query_console_page_grab_focus (GtkWidget *widget);
 
 /* BrowserPage interface */
 static void                 query_console_page_page_init (BrowserPageIface *iface);
-static GtkActionGroup      *query_console_page_page_get_actions_group (BrowserPage *page);
-static const gchar         *query_console_page_page_get_actions_ui (BrowserPage *page);
-static GtkWidget           *query_console_page_page_get_tab_label (BrowserPage *page, GtkWidget 
**out_close_button);
+static void                 query_console_customize (BrowserPage *page, GtkToolbar *toolbar, GtkHeaderBar 
*header);
+static GtkWidget           *query_console_page_get_tab_label (BrowserPage *page, GtkWidget 
**out_close_button);
 
 static GObjectClass *parent_class = NULL;
 
@@ -114,9 +110,9 @@ query_console_page_show_all (GtkWidget *widget)
 static void
 query_console_page_page_init (BrowserPageIface *iface)
 {
-       iface->i_get_actions_group = query_console_page_page_get_actions_group;
-       iface->i_get_actions_ui = query_console_page_page_get_actions_ui;
-       iface->i_get_tab_label = query_console_page_page_get_tab_label;
+       iface->i_customize = query_console_customize;
+       iface->i_uncustomize = NULL;
+       iface->i_get_tab_label = query_console_page_get_tab_label;
 }
 
 static void
@@ -127,14 +123,12 @@ query_console_page_init (QueryConsolePage *tconsole, G_GNUC_UNUSED QueryConsoleP
        tconsole->priv->params_compute_id = 0;
        tconsole->priv->params = NULL;
        tconsole->priv->params_popup = NULL;
-       tconsole->priv->agroup = NULL;
        tconsole->priv->fav_id = -1;
 
        gtk_orientable_set_orientation (GTK_ORIENTABLE (tconsole), GTK_ORIENTATION_VERTICAL);
 }
 
-static void connection_busy_cb (TConnection *tcnc, gboolean is_busy,
-                               gchar *reason, QueryConsolePage *tconsole);
+static void connection_status_changed_cb (TConnection *tcnc, GdaConnectionStatus status, QueryConsolePage 
*tconsole);
 static void
 query_console_page_dispose (GObject *object)
 {
@@ -144,7 +138,7 @@ query_console_page_dispose (GObject *object)
        if (tconsole->priv) {
                if (tconsole->priv->tcnc) {
                        g_signal_handlers_disconnect_by_func (tconsole->priv->tcnc,
-                                                             G_CALLBACK (connection_busy_cb), tconsole);
+                                                             G_CALLBACK (connection_status_changed_cb), 
tconsole);
                        g_object_unref (tconsole->priv->tcnc);
                }
                if (tconsole->priv->parser)
@@ -155,8 +149,6 @@ query_console_page_dispose (GObject *object)
                        g_source_remove (tconsole->priv->params_compute_id);
                if (tconsole->priv->params_popup)
                        gtk_widget_destroy (tconsole->priv->params_popup);
-               if (tconsole->priv->agroup)
-                       g_object_unref (tconsole->priv->agroup);
                if (tconsole->priv->favorites_menu)
                        gtk_widget_destroy (tconsole->priv->favorites_menu);
 
@@ -405,28 +397,29 @@ query_console_page_new (TConnection *tcnc)
        gtk_widget_hide (tconsole->priv->params_top);
 
        /* busy connection handling */
-       gchar *reason = NULL;
-       if (t_connection_is_busy (tconsole->priv->tcnc, &reason)) {
-               connection_busy_cb (tconsole->priv->tcnc, TRUE, reason, tconsole);
-               g_free (reason);
-       }
-       g_signal_connect (tconsole->priv->tcnc, "busy",
-                         G_CALLBACK (connection_busy_cb), tconsole);
+       connection_status_changed_cb (tconsole->priv->tcnc,
+                                     gda_connection_get_status (t_connection_get_cnc (tconsole->priv->tcnc)),
+                                     tconsole);
+
+       g_signal_connect (tconsole->priv->tcnc, "status-changed",
+                         G_CALLBACK (connection_status_changed_cb), tconsole);
 
        return (GtkWidget*) tconsole;
 }
 
 static void
-connection_busy_cb (G_GNUC_UNUSED TConnection *tcnc, gboolean is_busy, G_GNUC_UNUSED gchar *reason, 
QueryConsolePage *tconsole)
+connection_status_changed_cb (G_GNUC_UNUSED TConnection *tcnc, GdaConnectionStatus status, QueryConsolePage 
*tconsole)
 {
+       gboolean is_busy;
+       is_busy = (status == GDA_CONNECTION_STATUS_IDLE) ? FALSE : TRUE;
+
        gtk_widget_set_sensitive (tconsole->priv->exec_button, !is_busy);
        gtk_widget_set_sensitive (tconsole->priv->indent_button, !is_busy);
 
-       if (tconsole->priv->agroup) {
-               GtkAction *action;
-               action = gtk_action_group_get_action (tconsole->priv->agroup, "ExecuteQuery");
-               gtk_action_set_sensitive (action, !is_busy);
-       }
+       GAction *action;
+       action = customization_data_get_action (G_OBJECT (tconsole), "ExecuteQuery");
+       if (action)
+               g_simple_action_set_enabled (G_SIMPLE_ACTION (action), !is_busy);
 }
 
 static void
@@ -881,7 +874,7 @@ sql_execute_clicked_cb (G_GNUC_UNUSED GtkButton *button, QueryConsolePage *tcons
                                gtk_box_pack_start (GTK_BOX (vbox), bbox, FALSE, FALSE, 10);
                                gtk_button_box_set_layout (GTK_BUTTON_BOX (bbox), GTK_BUTTONBOX_END);
                                
-                               button = gtk_button_new_from_stock (GTK_STOCK_EXECUTE);
+                               button = gtk_button_new_from_icon_name ("system-run-symbolic", 
GTK_ICON_SIZE_BUTTON);
                                gtk_box_pack_start (GTK_BOX (bbox), button, TRUE, TRUE, 0);
                                g_signal_connect_swapped (button, "clicked",
                                                          G_CALLBACK (gtk_widget_hide), 
tconsole->priv->params_popup);
@@ -890,7 +883,7 @@ sql_execute_clicked_cb (G_GNUC_UNUSED GtkButton *button, QueryConsolePage *tcons
                                gtk_widget_set_sensitive (button, FALSE);
                                g_object_set_data (G_OBJECT (tconsole->priv->params_popup), "exec", button);
 
-                               button = gtk_button_new_from_stock (GTK_STOCK_CANCEL);
+                               button = gtk_button_new_with_mnemonic (_("_Cancel"));
                                gtk_box_pack_start (GTK_BOX (bbox), button, TRUE, TRUE, 0);
                                g_signal_connect_swapped (button, "clicked",
                                                          G_CALLBACK (gtk_widget_hide), 
tconsole->priv->params_popup);
@@ -1062,66 +1055,41 @@ query_console_page_set_text (QueryConsolePage *console, const gchar *text, gint
  * UI actions
  */
 static void
-query_execute_cb (G_GNUC_UNUSED GtkAction *action, QueryConsolePage *tconsole)
+query_execute_cb (G_GNUC_UNUSED GSimpleAction *action, G_GNUC_UNUSED GVariant *state, gpointer data)
 {
+       QueryConsolePage *tconsole;
+       tconsole = QUERY_CONSOLE_PAGE (data);
+
        sql_execute_clicked_cb (NULL, tconsole);
 }
 
-#ifdef HAVE_GTKSOURCEVIEW
-static void
-editor_undo_cb (G_GNUC_UNUSED GtkAction *action, G_GNUC_UNUSED QueryConsolePage *tconsole)
-{
-       TO_IMPLEMENT;
-}
-#endif
-
-static GtkActionEntry ui_actions[] = {
-       { "ExecuteQuery", GTK_STOCK_EXECUTE, N_("_Execute"), NULL, N_("Execute query"),
-         G_CALLBACK (query_execute_cb)},
-#ifdef HAVE_GTKSOURCEVIEW
-       { "EditorUndo", GTK_STOCK_UNDO, N_("_Undo"), NULL, N_("Undo last change"),
-         G_CALLBACK (editor_undo_cb)},
-#endif
+static GActionEntry win_entries[] = {
+        { "ExecuteQuery", query_execute_cb, NULL, NULL, NULL },
 };
-static const gchar *ui_actions_console =
-       "<ui>"
-       "  <menubar name='MenuBar'>"
-       "      <menu name='Edit' action='Edit'>"
-        "        <menuitem name='EditorUndo' action= 'EditorUndo'/>"
-        "      </menu>"
-       "  </menubar>"
-       "  <toolbar name='ToolBar'>"
-       "    <separator/>"
-       "    <toolitem action='ExecuteQuery'/>"
-       "  </toolbar>"
-       "</ui>";
-
-static GtkActionGroup *
-query_console_page_page_get_actions_group (BrowserPage *page)
-{
-       QueryConsolePage *tconsole;
-       tconsole = QUERY_CONSOLE_PAGE (page);
-       if (! tconsole->priv->agroup) {
-               tconsole->priv->agroup = gtk_action_group_new ("QueryExecConsoleActions");
-               gtk_action_group_set_translation_domain (tconsole->priv->agroup, GETTEXT_PACKAGE);
-               gtk_action_group_add_actions (tconsole->priv->agroup,
-                                             ui_actions, G_N_ELEMENTS (ui_actions), page);
-
-               GtkAction *action;
-               action = gtk_action_group_get_action (tconsole->priv->agroup, "ExecuteQuery");
-               gtk_action_set_sensitive (action, !t_connection_is_busy (tconsole->priv->tcnc, NULL));
-       }
-       return g_object_ref (tconsole->priv->agroup);
-}
 
-static const gchar *
-query_console_page_page_get_actions_ui (G_GNUC_UNUSED BrowserPage *page)
+static void
+query_console_customize (BrowserPage *page, GtkToolbar *toolbar, GtkHeaderBar *header)
 {
-       return ui_actions_console;
+       g_print ("%s ()\n", __FUNCTION__);
+
+       customization_data_init (G_OBJECT (page), toolbar, header);
+
+       /* add perspective's actions */
+       customization_data_add_actions (G_OBJECT (page), win_entries, G_N_ELEMENTS (win_entries));
+
+       /* add to toolbar */
+       GtkToolItem *titem;
+       titem = gtk_tool_button_new (NULL, NULL);
+       gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (titem), "system-run-symbolic");
+       gtk_widget_set_tooltip_text (GTK_WIDGET (titem), _("Execute query"));
+       gtk_toolbar_insert (GTK_TOOLBAR (toolbar), titem, -1);
+       gtk_actionable_set_action_name (GTK_ACTIONABLE (titem), "win.ExecuteQuery");
+       gtk_widget_show (GTK_WIDGET (titem));
+       customization_data_add_part (G_OBJECT (page), G_OBJECT (titem));
 }
 
 static GtkWidget *
-query_console_page_page_get_tab_label (BrowserPage *page, GtkWidget **out_close_button)
+query_console_page_get_tab_label (BrowserPage *page, GtkWidget **out_close_button)
 {
        const gchar *tab_name;
 
diff --git a/tools/browser/query-exec/query-exec-perspective.c 
b/tools/browser/query-exec/query-exec-perspective.c
index a816f11..4b70197 100644
--- a/tools/browser/query-exec/query-exec-perspective.c
+++ b/tools/browser/query-exec/query-exec-perspective.c
@@ -25,6 +25,7 @@
 #include "../browser-page.h"
 #include "query-console-page.h"
 #include "../ui-support.h"
+#include "../ui-customize.h"
 #include "query-favorite-selector.h"
 #include "query-editor.h"
 #include <libgda/gda-debug-macros.h>
@@ -41,10 +42,9 @@ static void query_exec_new_cb (G_GNUC_UNUSED GSimpleAction *action, G_GNUC_UNUSE
 
 /* BrowserPerspective interface */
 static void                 query_exec_perspective_perspective_init (BrowserPerspectiveIface *iface);
+static GtkWidget           *query_exec_perspective_get_notebook (BrowserPerspective *perspective);
 static void                 query_exec_perspective_customize (BrowserPerspective *perspective,
-                                                             GtkToolbar *toolbar, GtkHeaderBar *header, 
GMenu *menu);
-static void                 query_exec_perspective_uncustomize (BrowserPerspective *perspective,
-                                                               GtkToolbar *toolbar, GtkHeaderBar *header, 
GMenu *menu);
+                                                             GtkToolbar *toolbar, GtkHeaderBar *header);
 
 /* get a pointer to the parents to be able to call their destructor */
 static GObjectClass  *parent_class = NULL;
@@ -55,8 +55,6 @@ struct _QueryExecPerspectivePrivate {
        gboolean favorites_shown;
        BrowserWindow *bwin;
        TConnection *tcnc;
-
-       GArray *custom_parts;
 };
 
 GType
@@ -117,8 +115,9 @@ query_exec_perspective_grab_focus (GtkWidget *widget)
 static void
 query_exec_perspective_perspective_init (BrowserPerspectiveIface *iface)
 {
+       iface->i_get_notebook = query_exec_perspective_get_notebook;
        iface->i_customize = query_exec_perspective_customize;
-        iface->i_uncustomize = query_exec_perspective_uncustomize;
+        iface->i_uncustomize = NULL;
 }
 
 static void
@@ -167,11 +166,9 @@ query_exec_perspective_new (BrowserWindow *bwin)
                perspective->priv->favorites = wid;
        }
 
-       nb = gtk_notebook_new ();
+       nb = browser_perspective_create_notebook (bpers);
        perspective->priv->notebook = nb;
        gtk_paned_pack2 (GTK_PANED (paned), nb, TRUE, TRUE);
-       gtk_notebook_set_scrollable (GTK_NOTEBOOK (nb), TRUE);
-       gtk_notebook_popup_enable (GTK_NOTEBOOK (nb));
 
        GtkWidget *page, *tlabel, *button;
 
@@ -197,8 +194,6 @@ query_exec_perspective_new (BrowserWindow *bwin)
                gtk_widget_hide (perspective->priv->favorites);
        gtk_widget_grab_focus (page);
 
-       browser_perspective_declare_notebook (bpers, GTK_NOTEBOOK (perspective->priv->notebook));
-
        return bpers;
 }
 
@@ -244,7 +239,9 @@ query_exec_perspective_dispose (GObject *object)
 
        perspective = QUERY_EXEC_PERSPECTIVE (object);
        if (perspective->priv) {
-               browser_perspective_declare_notebook ((BrowserPerspective*) perspective, NULL);
+               if (customization_data_exists (object))
+                       customization_data_release (object);
+
                if (perspective->priv->tcnc)
                        g_object_unref (perspective->priv->tcnc);
 
@@ -305,30 +302,28 @@ favorites_toggle_cb (GSimpleAction *action, GVariant *state, gpointer data)
        g_simple_action_set_state (action, state);
 }
 
+static GtkWidget *
+query_exec_perspective_get_notebook (BrowserPerspective *perspective)
+{
+       g_return_val_if_fail (IS_QUERY_EXEC_PERSPECTIVE (perspective), NULL);
+       return QUERY_EXEC_PERSPECTIVE (perspective)->priv->notebook;
+}
+
 static GActionEntry win_entries[] = {
         { "show-favorites", NULL, NULL, "true", favorites_toggle_cb },
         { "query-exec-new", query_exec_new_cb, NULL, NULL, NULL },
 };
 
 static void
-query_exec_perspective_customize (BrowserPerspective *perspective,
-                                 GtkToolbar *toolbar, GtkHeaderBar *header, GMenu *menu)
+query_exec_perspective_customize (BrowserPerspective *perspective, GtkToolbar *toolbar, GtkHeaderBar *header)
 {
        g_print ("%s ()\n", __FUNCTION__);
-       QueryExecPerspective *persp;
-       persp = QUERY_EXEC_PERSPECTIVE (perspective);
 
-       BrowserWindow *bwin;
-       bwin = browser_perspective_get_window (perspective);
+       customization_data_init (G_OBJECT (perspective), toolbar, header);
 
        /* add perspective's actions */
-       g_action_map_add_action_entries (G_ACTION_MAP (bwin),
-                                        win_entries, G_N_ELEMENTS (win_entries),
-                                        perspective);
-
-       g_assert (! persp->priv->custom_parts);
-       persp->priv->custom_parts = g_array_new (FALSE, FALSE, sizeof (gpointer));
-
+       customization_data_add_actions (G_OBJECT (perspective), win_entries, G_N_ELEMENTS (win_entries));
+       
        /* add to toolbar */
        GtkToolItem *titem;
        titem = gtk_toggle_tool_button_new ();
@@ -337,7 +332,7 @@ query_exec_perspective_customize (BrowserPerspective *perspective,
        gtk_toolbar_insert (GTK_TOOLBAR (toolbar), titem, -1);
        gtk_actionable_set_action_name (GTK_ACTIONABLE (titem), "win.show-favorites");
        gtk_widget_show (GTK_WIDGET (titem));
-       g_array_append_val (persp->priv->custom_parts, titem);
+       customization_data_add_part (G_OBJECT (perspective), G_OBJECT (titem));
 
        titem = gtk_tool_button_new (NULL, NULL);
        gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (titem), "tab-new-symbolic");
@@ -345,38 +340,5 @@ query_exec_perspective_customize (BrowserPerspective *perspective,
        gtk_toolbar_insert (GTK_TOOLBAR (toolbar), titem, -1);
        gtk_actionable_set_action_name (GTK_ACTIONABLE (titem), "win.query-exec-new");
        gtk_widget_show (GTK_WIDGET (titem));
-       g_array_append_val (persp->priv->custom_parts, titem);
-}
-
-static void
-query_exec_perspective_uncustomize (BrowserPerspective *perspective,
-                                     GtkToolbar *toolbar, GtkHeaderBar *header, GMenu *menu)
-{
-       g_print ("%s ()\n", __FUNCTION__);
-       QueryExecPerspective *persp;
-       persp = QUERY_EXEC_PERSPECTIVE (perspective);
-
-       BrowserWindow *bwin;
-       bwin = browser_perspective_get_window (perspective);
-
-       /* remove perspective's actions */
-       guint i;
-       for (i = 0; i < G_N_ELEMENTS (win_entries); i++) {
-               GActionEntry *entry;
-               entry = &win_entries [i];
-               g_action_map_remove_action (G_ACTION_MAP (bwin), entry->name);
-       }
-
-       /* cleanups, headerbar and toolbar */
-       g_assert (persp->priv->custom_parts);
-       for (i = 0; i < persp->priv->custom_parts->len; i++) {
-               GObject *obj;
-               obj = g_array_index (persp->priv->custom_parts, GObject*, i);
-               if (GTK_IS_WIDGET (obj))
-                       gtk_widget_destroy (GTK_WIDGET (obj));
-               else
-                       g_warning ("Unknown type to uncustomize: %s\n", G_OBJECT_CLASS_NAME 
(G_OBJECT_GET_CLASS (obj)));
-       }
-       g_array_free (persp->priv->custom_parts, TRUE);
-       persp->priv->custom_parts = NULL;
+       customization_data_add_part (G_OBJECT (perspective), G_OBJECT (titem));
 }
diff --git a/tools/browser/query-exec/query-result.c b/tools/browser/query-exec/query-result.c
index c0e6770..52815dd 100644
--- a/tools/browser/query-exec/query-result.c
+++ b/tools/browser/query-exec/query-result.c
@@ -357,7 +357,7 @@ make_widget_for_notice (void)
 }
 
 static void
-action_refresh_cb (GtkAction *action, QueryResult *qres)
+action_refresh_cb (G_GNUC_UNUSED GtkWidget *button, QueryResult *qres)
 {
        QueryEditorHistoryBatch *batch;
        QueryEditorHistoryItem *item;
@@ -399,7 +399,7 @@ make_widget_for_set (GdaSet *set)
        GtkWidget *hbox, *img;
        hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
        
-       img = gtk_image_new_from_stock (GTK_STOCK_DIALOG_INFO, GTK_ICON_SIZE_DIALOG);
+       img = gtk_image_new_from_icon_name ("dialog-information", GTK_ICON_SIZE_DIALOG);
        gtk_widget_set_halign (img, GTK_ALIGN_START);
        gtk_box_pack_start (GTK_BOX (hbox), img, FALSE, FALSE, 0);
 
@@ -462,7 +462,7 @@ make_widget_for_error (GError *error)
        GtkWidget *hbox, *img;
        hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5);
        
-       img = gtk_image_new_from_stock (GTK_STOCK_DIALOG_ERROR, GTK_ICON_SIZE_DIALOG);
+       img = gtk_image_new_from_icon_name ("dialog-error", GTK_ICON_SIZE_DIALOG);
        gtk_widget_set_halign (img, GTK_ALIGN_START);
        gtk_box_pack_start (GTK_BOX (hbox), img, FALSE, FALSE, 0);
 
diff --git a/tools/browser/schema-browser/relations-diagram.c 
b/tools/browser/schema-browser/relations-diagram.c
index 3adfe9c..bf61f16 100644
--- a/tools/browser/schema-browser/relations-diagram.c
+++ b/tools/browser/schema-browser/relations-diagram.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 - 2014 Vivien Malerba <malerba gnome-db org>
+ * Copyright (C) 2009 - 2015 Vivien Malerba <malerba gnome-db org>
  * Copyright (C) 2010 David King <davidk openismus com>
  * Copyright (C) 2011 Murray Cumming <murrayc murrayc com>
  *
@@ -22,6 +22,7 @@
 #include <string.h>
 #include "t-app.h"
 #include "relations-diagram.h"
+#include "../ui-customize.h"
 #include "../gdaui-bar.h"
 #include "../canvas/browser-canvas-db-relations.h"
 #include <gdk/gdkkeysyms.h>
@@ -31,7 +32,6 @@
 #include "../browser-window.h"
 #include "../data-manager/data-manager-perspective.h"
 #include "../ui-support.h"
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
 
 struct _RelationsDiagramPrivate {
        TConnection *tcnc;
@@ -60,9 +60,9 @@ static void relations_diagram_get_property (GObject *object,
 
 /* BrowserPage interface */
 static void                 relations_diagram_page_init (BrowserPageIface *iface);
-static GtkActionGroup      *relations_diagram_page_get_actions_group (BrowserPage *page);
-static const gchar         *relations_diagram_page_get_actions_ui (BrowserPage *page);
-static GtkWidget           *relations_diagram_page_get_tab_label (BrowserPage *page, GtkWidget 
**out_close_button);
+static void                 relations_diagram_customize (BrowserPage *page, GtkToolbar *toolbar,
+                                                        GtkHeaderBar *header);
+static GtkWidget           *relations_diagram_get_tab_label (BrowserPage *page, GtkWidget 
**out_close_button);
 
 static void meta_changed_cb (TConnection *tcnc, GdaMetaStruct *mstruct, RelationsDiagram *diagram);
 static void favorites_changed_cb (TConnection *tcnc, RelationsDiagram *diagram);
@@ -97,9 +97,9 @@ relations_diagram_class_init (RelationsDiagramClass *klass)
 static void
 relations_diagram_page_init (BrowserPageIface *iface)
 {
-       iface->i_get_actions_group = relations_diagram_page_get_actions_group;
-       iface->i_get_actions_ui = relations_diagram_page_get_actions_ui;
-       iface->i_get_tab_label = relations_diagram_page_get_tab_label;
+       iface->i_customize = relations_diagram_customize;
+       iface->i_uncustomize = NULL;
+       iface->i_get_tab_label = relations_diagram_get_tab_label;
 }
 
 static void
@@ -476,12 +476,6 @@ relations_diagram_set_fav_id (RelationsDiagram *diagram, gint fav_id, GError **e
                g_free (str);
                diagram->priv->fav_id = -1;
        }
-
-       /* update notebook's tab label */
-       BrowserPerspective *pers;
-       pers = browser_page_get_perspective (BROWSER_PAGE (diagram));
-       if (pers)
-               browser_perspective_page_tab_label_change (pers, BROWSER_PAGE (diagram));
 }
 
 /**
@@ -496,8 +490,11 @@ relations_diagram_get_fav_id (RelationsDiagram *diagram)
 }
 
 static void
-action_view_contents_cb  (G_GNUC_UNUSED GtkAction *action, RelationsDiagram *diagram)
+action_view_contents_cb  (G_GNUC_UNUSED GSimpleAction *action, G_GNUC_UNUSED GVariant *state, gpointer data)
 {
+       RelationsDiagram *diagram;
+       diagram = RELATIONS_DIAGRAM (data);
+
        gchar *str;
        str = browser_canvas_db_relations_items_to_data_manager (BROWSER_CANVAS_DB_RELATIONS 
(diagram->priv->canvas));
        g_print ("%s\n", str);
@@ -513,41 +510,33 @@ action_view_contents_cb  (G_GNUC_UNUSED GtkAction *action, RelationsDiagram *dia
        }
 }
 
-
-static GtkActionEntry ui_actions[] = {
-       { "ViewContents", GTK_STOCK_EDIT, N_("_Contents"), NULL, N_("View contents"),
-         G_CALLBACK (action_view_contents_cb)},
+static GActionEntry win_entries[] = {
+       { "ViewContents", action_view_contents_cb, NULL, NULL, NULL },
 };
-static const gchar *ui_actions_info =
-       "<ui>"
-       "  <menubar name='MenuBar'>"
-       "  </menubar>"
-       "  <toolbar name='ToolBar'>"
-       "    <separator/>"
-       "    <toolitem action='ViewContents'/>"
-       "  </toolbar>"
-       "</ui>";
-
-static GtkActionGroup *
-relations_diagram_page_get_actions_group (BrowserPage *page)
-{
-       GtkActionGroup *agroup;
-       agroup = gtk_action_group_new ("SchemaBrowserRelationsDiagramActions");
-       gtk_action_group_set_translation_domain (agroup, GETTEXT_PACKAGE);
-       gtk_action_group_add_actions (agroup, ui_actions, G_N_ELEMENTS (ui_actions), page);
-       
-       return agroup;
-}
 
-static const gchar *
-relations_diagram_page_get_actions_ui (G_GNUC_UNUSED BrowserPage *page)
+static void
+relations_diagram_customize (BrowserPage *page, GtkToolbar *toolbar, GtkHeaderBar *header)
 {
-       return ui_actions_info;
+       g_print ("%s ()\n", __FUNCTION__);
+
+       customization_data_init (G_OBJECT (page), toolbar, header);
+
+       /* add perspective's actions */
+       customization_data_add_actions (G_OBJECT (page), win_entries, G_N_ELEMENTS (win_entries));
+
+       /* add to toolbar */
+       GtkToolItem *titem;
+       titem = gtk_tool_button_new (NULL, NULL);
+       gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (titem), "go-jump-symbolic");
+       gtk_widget_set_tooltip_text (GTK_WIDGET (titem), _("Manage data in selected tables"));
+       gtk_toolbar_insert (GTK_TOOLBAR (toolbar), titem, -1);
+       gtk_actionable_set_action_name (GTK_ACTIONABLE (titem), "win.ViewContents");
+       gtk_widget_show (GTK_WIDGET (titem));
+       customization_data_add_part (G_OBJECT (page), G_OBJECT (titem));
 }
 
-
 static GtkWidget *
-relations_diagram_page_get_tab_label (BrowserPage *page, GtkWidget **out_close_button)
+relations_diagram_get_tab_label (BrowserPage *page, GtkWidget **out_close_button)
 {
        GtkWidget *wid;
        RelationsDiagram *diagram;
diff --git a/tools/browser/schema-browser/schema-browser-perspective.c 
b/tools/browser/schema-browser/schema-browser-perspective.c
index 4bfc152..adae26d 100644
--- a/tools/browser/schema-browser/schema-browser-perspective.c
+++ b/tools/browser/schema-browser/schema-browser-perspective.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 - 2015 Vivien Malerba <malerba gnome-db org>
+5 4* Copyright (C) 2009 - 2015 Vivien Malerba <malerba gnome-db org>
  * Copyright (C) 2010 David King <davidk openismus com>
  * Copyright (C) 2011 Murray Cumming <murrayc murrayc com>
  *
@@ -26,6 +26,7 @@
 #include "../browser-window.h"
 #include "table-info.h"
 #include "../ui-support.h"
+#include "../ui-customize.h"
 #include "../browser-page.h"
 #ifdef HAVE_GOOCANVAS
 #include "relations-diagram.h"
@@ -41,10 +42,10 @@ static void schema_browser_perspective_dispose (GObject *object);
 
 /* BrowserPerspective interface */
 static void                 schema_browser_perspective_perspective_init (BrowserPerspectiveIface *iface);
+static GtkWidget           *schema_browser_perspective_get_notebook (BrowserPerspective *perspective);
 static void                 schema_browser_perspective_customize (BrowserPerspective *perspective,
-                                                                 GtkToolbar *toolbar, GtkHeaderBar *header, 
GMenu *menu);
-static void                 schema_browser_perspective_uncustomize (BrowserPerspective *perspective,
-                                                                   GtkToolbar *toolbar, GtkHeaderBar 
*header, GMenu *menu);
+                                                                 GtkToolbar *toolbar, GtkHeaderBar *header);
+
 
 /* get a pointer to the parents to be able to call their destructor */
 static GObjectClass  *parent_class = NULL;
@@ -54,8 +55,6 @@ struct _SchemaBrowserPerspectivePrivate {
        GtkWidget *favorites;
        gboolean favorites_shown;
        BrowserWindow *bwin;
-
-       GArray *custom_parts;
 };
 
 GType
@@ -106,8 +105,9 @@ schema_browser_perspective_class_init (SchemaBrowserPerspectiveClass * klass)
 static void
 schema_browser_perspective_perspective_init (BrowserPerspectiveIface *iface)
 {
+       iface->i_get_notebook = schema_browser_perspective_get_notebook;
        iface->i_customize = schema_browser_perspective_customize;
-        iface->i_uncustomize = schema_browser_perspective_uncustomize;
+        iface->i_uncustomize = NULL;
 }
 
 
@@ -116,7 +116,6 @@ schema_browser_perspective_init (SchemaBrowserPerspective *perspective)
 {
        perspective->priv = g_new0 (SchemaBrowserPerspectivePrivate, 1);
        perspective->priv->favorites_shown = TRUE;
-       perspective->priv->custom_parts = NULL;
 
        gtk_orientable_set_orientation (GTK_ORIENTABLE (perspective), GTK_ORIENTATION_VERTICAL);
 }
@@ -156,11 +155,9 @@ schema_browser_perspective_new (BrowserWindow *bwin)
                perspective->priv->favorites = wid;
        }
 
-       nb = gtk_notebook_new ();
+       nb = browser_perspective_create_notebook (bpers);
        perspective->priv->notebook = nb;
        gtk_paned_add2 (GTK_PANED (paned), nb);
-       gtk_notebook_set_scrollable (GTK_NOTEBOOK (nb), TRUE);
-       gtk_notebook_popup_enable (GTK_NOTEBOOK (nb));
 
        wid = objects_index_new (tcnc);
        g_signal_connect (wid, "selection-changed",
@@ -178,8 +175,6 @@ schema_browser_perspective_new (BrowserWindow *bwin)
        if (perspective->priv->favorites && !perspective->priv->favorites_shown)
                gtk_widget_hide (perspective->priv->favorites);
 
-       browser_perspective_declare_notebook (bpers, GTK_NOTEBOOK (perspective->priv->notebook));
-
        return bpers;
 }
 
@@ -267,7 +262,9 @@ schema_browser_perspective_dispose (GObject *object)
 
        perspective = SCHEMA_BROWSER_PERSPECTIVE (object);
        if (perspective->priv) {
-               browser_perspective_declare_notebook ((BrowserPerspective*) perspective, NULL);
+               if (customization_data_exists (object))
+                       customization_data_release (object);
+
                g_free (perspective->priv);
                perspective->priv = NULL;
        }
@@ -304,6 +301,13 @@ favorites_toggle_cb (GSimpleAction *action, GVariant *state, gpointer data)
        g_simple_action_set_state (action, state);
 }
 
+static GtkWidget *
+schema_browser_perspective_get_notebook (BrowserPerspective *perspective)
+{
+       g_return_val_if_fail (IS_SCHEMA_BROWSER_PERSPECTIVE (perspective), NULL);
+       return SCHEMA_BROWSER_PERSPECTIVE (perspective)->priv->notebook;
+}
+
 static GActionEntry win_entries[] = {
         { "show-favorites", NULL, NULL, "true", favorites_toggle_cb },
 #ifdef HAVE_GOOCANVAS
@@ -312,23 +316,14 @@ static GActionEntry win_entries[] = {
 };
 
 static void
-schema_browser_perspective_customize (BrowserPerspective *perspective,
-                                   GtkToolbar *toolbar, GtkHeaderBar *header, GMenu *menu)
+schema_browser_perspective_customize (BrowserPerspective *perspective, GtkToolbar *toolbar, GtkHeaderBar 
*header)
 {
        g_print ("%s ()\n", __FUNCTION__);
-       SchemaBrowserPerspective *persp;
-       persp = SCHEMA_BROWSER_PERSPECTIVE (perspective);
 
-       BrowserWindow *bwin;
-       bwin = browser_perspective_get_window (perspective);
+       customization_data_init (G_OBJECT (perspective), toolbar, header);
 
        /* add perspective's actions */
-       g_action_map_add_action_entries (G_ACTION_MAP (bwin),
-                                        win_entries, G_N_ELEMENTS (win_entries),
-                                        perspective);
-
-       g_assert (! persp->priv->custom_parts);
-       persp->priv->custom_parts = g_array_new (FALSE, FALSE, sizeof (gpointer));
+       customization_data_add_actions (G_OBJECT (perspective), win_entries, G_N_ELEMENTS (win_entries));
 
        /* add to toolbar */
        GtkToolItem *titem;
@@ -338,7 +333,7 @@ schema_browser_perspective_customize (BrowserPerspective *perspective,
        gtk_toolbar_insert (GTK_TOOLBAR (toolbar), titem, -1);
        gtk_actionable_set_action_name (GTK_ACTIONABLE (titem), "win.show-favorites");
        gtk_widget_show (GTK_WIDGET (titem));
-       g_array_append_val (persp->priv->custom_parts, titem);
+       customization_data_add_part (G_OBJECT (perspective), G_OBJECT (titem));
 
 #ifdef HAVE_GOOCANVAS
        titem = gtk_tool_button_new (NULL, NULL);
@@ -347,44 +342,10 @@ schema_browser_perspective_customize (BrowserPerspective *perspective,
        gtk_toolbar_insert (GTK_TOOLBAR (toolbar), titem, -1);
        gtk_actionable_set_action_name (GTK_ACTIONABLE (titem), "win.action-diagram-new");
        gtk_widget_show (GTK_WIDGET (titem));
-       g_array_append_val (persp->priv->custom_parts, titem);
+       customization_data_add_part (G_OBJECT (perspective), G_OBJECT (titem));
 #endif
 }
 
-static void
-schema_browser_perspective_uncustomize (BrowserPerspective *perspective,
-                                     GtkToolbar *toolbar, GtkHeaderBar *header, GMenu *menu)
-{
-       g_print ("%s ()\n", __FUNCTION__);
-       SchemaBrowserPerspective *persp;
-       persp = SCHEMA_BROWSER_PERSPECTIVE (perspective);
-
-       BrowserWindow *bwin;
-       bwin = browser_perspective_get_window (perspective);
-
-       /* remove perspective's actions */
-       guint i;
-       for (i = 0; i < G_N_ELEMENTS (win_entries); i++) {
-               GActionEntry *entry;
-               entry = &win_entries [i];
-               g_action_map_remove_action (G_ACTION_MAP (bwin), entry->name);
-       }
-
-       /* cleanups, headerbar and toolbar */
-       g_assert (persp->priv->custom_parts);
-       for (i = 0; i < persp->priv->custom_parts->len; i++) {
-               GObject *obj;
-               obj = g_array_index (persp->priv->custom_parts, GObject*, i);
-               if (GTK_IS_WIDGET (obj))
-                       gtk_widget_destroy (GTK_WIDGET (obj));
-               else
-                       g_warning ("Unknown type to uncustomize: %s\n", G_OBJECT_CLASS_NAME 
(G_OBJECT_GET_CLASS (obj)));
-       }
-       g_array_free (persp->priv->custom_parts, TRUE);
-       persp->priv->custom_parts = NULL;
-}
-
-
 #ifdef HAVE_GOOCANVAS
 /**
  * schema_browser_perspective_display_diagram
diff --git a/tools/browser/schema-browser/table-info.c b/tools/browser/schema-browser/table-info.c
index 5da9382..d574d0c 100644
--- a/tools/browser/schema-browser/table-info.c
+++ b/tools/browser/schema-browser/table-info.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2009 - 2014 Vivien Malerba <malerba gnome-db org>
+ * Copyright (C) 2009 - 2015 Vivien Malerba <malerba gnome-db org>
  * Copyright (C) 2010 David King <davidk openismus com>
  * Copyright (C) 2011 Murray Cumming <murrayc murrayc com>
  *
@@ -23,6 +23,7 @@
 #include "table-info.h"
 #include "../dnd.h"
 #include "../ui-support.h"
+#include "../ui-customize.h"
 #include "../gdaui-bar.h"
 #include "table-columns.h"
 #include "table-preferences.h"
@@ -40,8 +41,6 @@
 #include "../fk-declare.h"
 #include <libgda/gda-debug-macros.h>
 
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-
 struct _TableInfoPrivate {
        TConnection *tcnc;
 
@@ -72,9 +71,8 @@ static void table_info_get_property (GObject *object,
                                     GParamSpec *pspec);
 /* BrowserPage interface */
 static void                 table_info_page_init (BrowserPageIface *iface);
-static GtkActionGroup      *table_info_page_get_actions_group (BrowserPage *page);
-static const gchar         *table_info_page_get_actions_ui (BrowserPage *page);
-static GtkWidget           *table_info_page_get_tab_label (BrowserPage *page, GtkWidget **out_close_button);
+static void                 table_info_customize (BrowserPage *page, GtkToolbar *toolbar, GtkHeaderBar 
*header);
+static GtkWidget           *table_info_get_tab_label (BrowserPage *page, GtkWidget **out_close_button);
 
 static void meta_changed_cb (TConnection *tcnc, GdaMetaStruct *mstruct, TableInfo *tinfo);
 
@@ -107,9 +105,9 @@ table_info_class_init (TableInfoClass *klass)
 static void
 table_info_page_init (BrowserPageIface *iface)
 {
-       iface->i_get_actions_group = table_info_page_get_actions_group;
-       iface->i_get_actions_ui = table_info_page_get_actions_ui;
-       iface->i_get_tab_label = table_info_page_get_tab_label;
+       iface->i_customize = table_info_customize;
+       iface->i_uncustomize = NULL;
+       iface->i_get_tab_label = table_info_get_tab_label;
 }
 
 static void
@@ -451,8 +449,11 @@ table_info_get_connection (TableInfo *tinfo)
  * UI actions
  */
 static void
-action_add_to_fav_cb (G_GNUC_UNUSED GtkAction *action, TableInfo *tinfo)
+action_add_to_fav_cb (G_GNUC_UNUSED GSimpleAction *action, G_GNUC_UNUSED GVariant *state, gpointer data)
 {
+       TableInfo *tinfo;
+       tinfo = TABLE_INFO (data);
+
        TFavorites *bfav;
         TFavoritesAttributes fav;
         GError *error = NULL;
@@ -476,8 +477,10 @@ action_add_to_fav_cb (G_GNUC_UNUSED GtkAction *action, TableInfo *tinfo)
 }
 
 static void
-action_view_contents_cb (G_GNUC_UNUSED GtkAction *action, TableInfo *tinfo)
+action_view_contents_cb (G_GNUC_UNUSED GSimpleAction *action, G_GNUC_UNUSED GVariant *state, gpointer data)
 {
+       TableInfo *tinfo;
+       tinfo = TABLE_INFO (data);
        if (! tinfo->priv->table_short_name)
                return;
 
@@ -630,8 +633,11 @@ fkdata_list_free (GSList *fkdata_list)
 }
 
 static void
-action_insert_cb (G_GNUC_UNUSED GtkAction *action, TableInfo *tinfo)
+action_insert_cb (G_GNUC_UNUSED GSimpleAction *action, G_GNUC_UNUSED GVariant *state, gpointer data)
 {
+       TableInfo *tinfo;
+       tinfo = TABLE_INFO (data);
+
        /* init */
        if (! tinfo->priv->table_short_name)
                return;
@@ -884,10 +890,10 @@ action_insert_cb (G_GNUC_UNUSED GtkAction *action, TableInfo *tinfo)
        popup = gtk_dialog_new_with_buttons (_("Values to insert into table"), GTK_WINDOW (bwin),
                                             0,
 #ifdef HAVE_GDU
-                                            GTK_STOCK_HELP, GTK_RESPONSE_HELP,
+                                            _("Help"), GTK_RESPONSE_HELP,
 #endif
-                                            GTK_STOCK_EXECUTE, GTK_RESPONSE_ACCEPT,
-                                            GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
+                                            _("Execute"), GTK_RESPONSE_ACCEPT,
+                                            _("Cancel"), GTK_RESPONSE_REJECT,
                                             NULL);
        tinfo->priv->insert_popup = popup;
        g_object_set_data_full (G_OBJECT (popup), "stmt", stmt, g_object_unref);
@@ -926,8 +932,11 @@ action_insert_cb (G_GNUC_UNUSED GtkAction *action, TableInfo *tinfo)
 }
 
 static void
-action_declarefk_cb (G_GNUC_UNUSED GtkAction *action, TableInfo *tinfo)
+action_declarefk_cb (G_GNUC_UNUSED GSimpleAction *action, G_GNUC_UNUSED GVariant *state, gpointer data)
 {
+       TableInfo *tinfo;
+       tinfo = TABLE_INFO (data);
+
        GtkWidget *dlg, *parent;
        GdaMetaStruct *mstruct;
        GdaMetaDbObject *dbo;
@@ -970,57 +979,60 @@ action_declarefk_cb (G_GNUC_UNUSED GtkAction *action, TableInfo *tinfo)
        gtk_widget_destroy (dlg);
 }
 
-static GtkActionEntry ui_actions[] = {
-       { "Table", NULL, N_("_Table"), NULL, N_("Table"), NULL },
-       { "AddToFav", NULL, N_("Add to _Favorites"), NULL, N_("Add table to favorites"),
-         G_CALLBACK (action_add_to_fav_cb)},
-       { "ViewContents", GTK_STOCK_EDIT, N_("_Contents"), NULL, N_("View table's contents"),
-         G_CALLBACK (action_view_contents_cb)},
-       { "InsertData", GTK_STOCK_ADD, N_("_Insert Data"), NULL, N_("Insert data into table"),
-         G_CALLBACK (action_insert_cb)},
-       { "KfDeclare", NULL, N_("_Declare Foreign Key"), NULL, N_("Declare a foreign key for table"),
-         G_CALLBACK (action_declarefk_cb)},
+static GActionEntry win_entries[] = {
+        { "AddToFav", action_add_to_fav_cb, NULL, NULL, NULL },
+       { "ViewContents", action_view_contents_cb, NULL, NULL, NULL },
+       { "InsertData", action_insert_cb, NULL, NULL, NULL },
+       { "KfDeclare", action_declarefk_cb, NULL, NULL, NULL }
 };
-static const gchar *ui_actions_info =
-       "<ui>"
-       "  <menubar name='MenuBar'>"
-       "    <placeholder name='MenuExtension'>"
-        "      <menu name='Table' action='Table'>"
-        "        <menuitem name='AddToFav' action= 'AddToFav'/>"
-        "        <menuitem name='InsertData' action= 'InsertData'/>"
-        "        <menuitem name='ViewContents' action= 'ViewContents'/>"
-        "        <separator/>"
-        "        <menuitem name='KfDeclare' action= 'KfDeclare'/>"
-        "      </menu>"
-        "    </placeholder>"
-       "  </menubar>"
-       "  <toolbar name='ToolBar'>"
-       "    <separator/>"
-       "    <toolitem action='AddToFav'/>"
-       "    <toolitem action='ViewContents'/>"
-       "    <toolitem action='InsertData'/>"
-       "  </toolbar>"
-       "</ui>";
-
-static GtkActionGroup *
-table_info_page_get_actions_group (BrowserPage *page)
-{
-       GtkActionGroup *agroup;
-       agroup = gtk_action_group_new ("SchemaBrowserTableInfoActions");
-       gtk_action_group_set_translation_domain (agroup, GETTEXT_PACKAGE);
-       gtk_action_group_add_actions (agroup, ui_actions, G_N_ELEMENTS (ui_actions), page);
-       
-       return agroup;
-}
 
-static const gchar *
-table_info_page_get_actions_ui (G_GNUC_UNUSED BrowserPage *page)
+static void
+table_info_customize (BrowserPage *page, GtkToolbar *toolbar, GtkHeaderBar *header)
 {
-       return ui_actions_info;
+       g_print ("%s ()\n", __FUNCTION__);
+
+       customization_data_init (G_OBJECT (page), toolbar, header);
+
+       /* add perspective's actions */
+       customization_data_add_actions (G_OBJECT (page), win_entries, G_N_ELEMENTS (win_entries));
+
+       /* add to toolbar */
+       GtkToolItem *titem;
+       titem = gtk_tool_button_new (NULL, NULL);
+       gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (titem), "bookmark-new-symbolic");
+       gtk_widget_set_tooltip_text (GTK_WIDGET (titem), _("Add to Favorites"));
+       gtk_toolbar_insert (GTK_TOOLBAR (toolbar), titem, -1);
+       gtk_actionable_set_action_name (GTK_ACTIONABLE (titem), "win.AddToFav");
+       gtk_widget_show (GTK_WIDGET (titem));
+       customization_data_add_part (G_OBJECT (page), G_OBJECT (titem));
+
+       titem = gtk_tool_button_new (NULL, NULL);
+       gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (titem), "go-jump-symbolic");
+       gtk_widget_set_tooltip_text (GTK_WIDGET (titem), _("View table's contents"));
+       gtk_toolbar_insert (GTK_TOOLBAR (toolbar), titem, -1);
+       gtk_actionable_set_action_name (GTK_ACTIONABLE (titem), "win.ViewContents");
+       gtk_widget_show (GTK_WIDGET (titem));
+       customization_data_add_part (G_OBJECT (page), G_OBJECT (titem));
+
+       titem = gtk_tool_button_new (NULL, NULL);
+       gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (titem), "document-new-symbolic");
+       gtk_widget_set_tooltip_text (GTK_WIDGET (titem), _("Insert data into table"));
+       gtk_toolbar_insert (GTK_TOOLBAR (toolbar), titem, -1);
+       gtk_actionable_set_action_name (GTK_ACTIONABLE (titem), "win.InsertData");
+       gtk_widget_show (GTK_WIDGET (titem));
+       customization_data_add_part (G_OBJECT (page), G_OBJECT (titem));
+
+       titem = gtk_tool_button_new (NULL, NULL);
+       gtk_tool_button_set_icon_name (GTK_TOOL_BUTTON (titem), "insert-link-symbolic");
+       gtk_widget_set_tooltip_text (GTK_WIDGET (titem), _("Declare Foreign Key"));
+       gtk_toolbar_insert (GTK_TOOLBAR (toolbar), titem, -1);
+       gtk_actionable_set_action_name (GTK_ACTIONABLE (titem), "win.KfDeclare");
+       gtk_widget_show (GTK_WIDGET (titem));
+       customization_data_add_part (G_OBJECT (page), G_OBJECT (titem));
 }
 
 static GtkWidget *
-table_info_page_get_tab_label (BrowserPage *page, GtkWidget **out_close_button)
+table_info_get_tab_label (BrowserPage *page, GtkWidget **out_close_button)
 {
        TableInfo *tinfo;
        const gchar *tab_name;
diff --git a/tools/browser/text-search.c b/tools/browser/text-search.c
index b18e002..d1b4b2e 100644
--- a/tools/browser/text-search.c
+++ b/tools/browser/text-search.c
@@ -1,6 +1,6 @@
 /*
  * Copyright (C) 2011 Murray Cumming <murrayc murrayc com>
- * Copyright (C) 2011 - 2014 Vivien Malerba <malerba gnome-db org>
+ * Copyright (C) 2011 - 2015 Vivien Malerba <malerba gnome-db org>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -22,8 +22,6 @@
 #include "text-search.h"
 #include "ui-support.h"
 
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-
 struct _TextSearchPrivate {
        GtkTextView *view;
        GtkTextBuffer *text;
@@ -263,7 +261,7 @@ text_search_new (GtkTextView *view)
        gtk_text_buffer_create_tag (tsearch->priv->text, "search",
                                     "background", "yellow", NULL);
 
-       wid = ui_make_small_button (FALSE, FALSE, NULL, GTK_STOCK_CLOSE,
+       wid = ui_make_small_button (FALSE, FALSE, NULL, "window-close-symbolic",
                                    _("Hide search toolbar"));
        gtk_box_pack_start (GTK_BOX (tsearch), wid, FALSE, FALSE, 0);
        g_signal_connect_swapped (wid, "clicked",
@@ -279,12 +277,12 @@ text_search_new (GtkTextView *view)
        g_signal_connect (wid, "changed",
                          G_CALLBACK (search_text_changed_cb), tsearch);
        
-       wid = ui_make_small_button (FALSE, FALSE, NULL, GTK_STOCK_GO_BACK, NULL);
+       wid = ui_make_small_button (FALSE, FALSE, NULL, "go-previous-symbolic", NULL);
        gtk_box_pack_start (GTK_BOX (tsearch), wid, FALSE, FALSE, 0);
        g_signal_connect (wid, "clicked",
                          G_CALLBACK (go_back_search_cb), tsearch);
        
-       wid = ui_make_small_button (FALSE, FALSE, NULL, GTK_STOCK_GO_FORWARD, NULL);
+       wid = ui_make_small_button (FALSE, FALSE, NULL, "go-next-symbolic", NULL);
        gtk_box_pack_start (GTK_BOX (tsearch), wid, FALSE, FALSE, 0);
        g_signal_connect (wid, "clicked",
                          G_CALLBACK (go_forward_search_cb), tsearch);
diff --git a/tools/browser/ui-customize.c b/tools/browser/ui-customize.c
new file mode 100644
index 0000000..514ee83
--- /dev/null
+++ b/tools/browser/ui-customize.c
@@ -0,0 +1,269 @@
+/*
+ * Copyright (C) 2015 Vivien Malerba <malerba gnome-db 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 Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+#include "ui-customize.h"
+#include <browser-perspective.h>
+#include <browser-page.h>
+
+/*
+ * UI customization management (toolbar, top level window header, and top level menu
+ */
+typedef struct {
+       GtkToolbar *toolbar;
+       GtkHeaderBar *header;
+       GArray *custom_parts;
+
+       BrowserWindow *bwin;
+       GActionEntry  *actions;
+       guint          n_actions;
+} CustomizationData;
+
+static GHashTable *cust_hash = NULL; /* key = a #GObject, value = a #CustomizationData (owned) */
+static void
+customization_data_free (CustomizationData *cust_data)
+{
+       g_assert (cust_data);
+       if (cust_data->custom_parts) {
+               guint i;
+               for (i = 0; i < cust_data->custom_parts->len; i++) {
+                       GWeakRef *wref;
+                       wref = g_array_index (cust_data->custom_parts, GWeakRef*, i);
+                       GObject *obj;
+                       obj = g_weak_ref_get (wref);
+                       g_weak_ref_clear (wref);
+                       if (obj) {
+                               if (GTK_IS_WIDGET (obj))
+                                       gtk_widget_destroy (GTK_WIDGET (obj));
+                               else
+                                       g_warning ("Unknown type to uncustomize: %s\n",
+                                                  G_OBJECT_CLASS_NAME (G_OBJECT_GET_CLASS (obj)));
+                               g_object_unref (obj);
+                       }
+                       g_free (wref);
+               }
+               g_array_free (cust_data->custom_parts, TRUE);
+       }
+
+       if (cust_data->actions) {
+               guint i;
+               for (i = 0; i < cust_data->n_actions; i++) {
+                       GActionEntry *entry;
+                       entry = &cust_data->actions [i];
+                       g_action_map_remove_action (G_ACTION_MAP (cust_data->bwin), entry->name);
+               }
+       }
+       g_free (cust_data);
+}
+
+/**
+ * customization_data_release:
+ * @object: an object being customized (#BrowserPerspective or #BrowserPage)
+ *
+ * Removes any customization done for @object
+ */
+void
+customization_data_release (GObject *object)
+{
+       g_return_if_fail (G_IS_OBJECT (object));
+       if (cust_hash) {
+               if (g_hash_table_lookup (cust_hash, object))
+                       g_hash_table_remove (cust_hash, object);
+       }
+}
+
+static CustomizationData *
+customization_data_get (GObject *object)
+{
+       if (cust_hash)
+               return g_hash_table_lookup (cust_hash, object);
+       else
+               return NULL;
+}
+
+/**
+ * customization_data_init:
+ * @object: an object being customized (#BrowserPerspective or #BrowserPage)
+ * @toolbar: (allow-none): a #GtkToolbar
+ * @header: (allow-none): a #GtkHeaderBar
+ *
+ * Initializes the customization for @object
+ */
+void
+customization_data_init (GObject *object, GtkToolbar *toolbar, GtkHeaderBar *header)
+{
+       g_return_val_if_fail (G_IS_OBJECT (object), NULL);
+       if (customization_data_get (object)) {
+               g_warning ("Customization for %p already exists", object);
+               customization_data_release (object);
+       }
+       if (!cust_hash)
+               cust_hash = g_hash_table_new_full (NULL, NULL, NULL, (GDestroyNotify) 
customization_data_free);
+
+       CustomizationData *cust_data;
+       cust_data = g_new0 (CustomizationData, 1);
+       cust_data->toolbar = toolbar;
+       cust_data->header = header;
+       cust_data->custom_parts = g_array_new (FALSE, FALSE, sizeof (gpointer));
+       g_hash_table_insert (cust_hash, object, cust_data);
+}
+
+/**
+ * customization_data_exists:
+ * @object: an object being customized (#BrowserPerspective or #BrowserPage)
+ *
+ * Tells if some customization data exists for @object
+ */
+gboolean
+customization_data_exists (GObject *object)
+{
+       g_return_val_if_fail (G_IS_OBJECT (object), NULL);
+       return customization_data_get (object) ? TRUE : FALSE;
+}
+
+/**
+ * customization_data_add_part:
+ * @object: an object being customized (#BrowserPerspective or #BrowserPage)
+ * @part: a #GObject object part of the customization
+ *
+ * Declares that @part is part of the customization (and will be removed when customization_data_release() 
is called)
+ */
+void
+customization_data_add_part (GObject *object, GObject *part)
+{
+       g_return_if_fail (G_IS_OBJECT (object));
+       g_return_if_fail (G_IS_OBJECT (part));
+
+       CustomizationData *cust_data;
+       cust_data = customization_data_get (object);
+       if (!cust_data)
+               return;
+
+       GWeakRef *wref;
+       wref = g_new0 (GWeakRef, 1);
+       g_weak_ref_init (wref, part);
+       g_array_append_val (cust_data->custom_parts, wref);
+}
+
+/**
+ * customization_data_add_actions:
+ * @object: an object being customized (#BrowserPerspective or #BrowserPage)
+ * @entries: a list of actions
+ * @n_entries: the size of @entries
+ *
+ * Adds some actions (which will be removed when customization_data_release() is called)
+ */
+void
+customization_data_add_actions (GObject *object, GActionEntry *entries, guint n_entries)
+{
+       g_return_if_fail (G_IS_OBJECT (object));
+       g_return_if_fail (entries);
+
+       CustomizationData *cust_data;
+       cust_data = customization_data_get (object);
+       if (!cust_data)
+               return;
+
+       BrowserWindow *bwin;
+       if (IS_BROWSER_PERSPECTIVE (object))
+               bwin = browser_perspective_get_window (BROWSER_PERSPECTIVE (object));
+       else if (IS_BROWSER_PAGE (object))
+               bwin = browser_perspective_get_window (browser_page_get_perspective (BROWSER_PAGE (object)));
+       else {
+               g_warning ("Unhandled object type for %s", __FUNCTION__);
+               return;
+       }
+       g_action_map_add_action_entries (G_ACTION_MAP (bwin), entries, n_entries, object);
+
+       cust_data->bwin = bwin;
+       cust_data->actions = entries;
+       cust_data->n_actions = n_entries;
+}
+
+/**
+ * customization_data_get_toolbar:
+ * @object: an object being customized (#BrowserPerspective or #BrowserPage)
+ *
+ * Retreive the toolbar used in @cust_data
+ *
+ * Returns: (transfer none): the requested data
+ */
+GtkToolbar *
+customization_data_get_toolbar (GObject *object)
+{
+       g_return_val_if_fail (G_IS_OBJECT (object), NULL);
+
+       CustomizationData *cust_data;
+       cust_data = customization_data_get (object);
+       if (!cust_data)
+               return NULL;
+       else
+               return cust_data->toolbar;
+}
+
+/**
+ * customization_data_get_header_bar:
+ * @object: an object being customized (#BrowserPerspective or #BrowserPage)
+ *
+ * Retreive the header bar used in @cust_data
+ *
+ * Returns: (transfer none): the requested data
+ */
+GtkHeaderBar *
+customization_data_get_header_bar (GObject *object)
+{
+       g_return_val_if_fail (G_IS_OBJECT (object), NULL);
+
+       CustomizationData *cust_data;
+       cust_data = customization_data_get (object);
+       if (!cust_data)
+               return NULL;
+       else
+               return cust_data->header;
+}
+
+/**
+ * customization_data_get_action:
+ * @object: an object being customized (#BrowserPerspective or #BrowserPage)
+ * @action_name: the name of the action to retreive
+ *
+ * Get a pointer to the #GAction names @action_name.
+ *
+ * Returns: (transfer none): the requested #Gaction, or %NULL if not found (not existant,
+ *          or no customization data for @object)
+ */
+GAction *
+customization_data_get_action (GObject *object, const gchar *action_name)
+{
+       g_return_val_if_fail (G_IS_OBJECT (object), NULL);
+       g_return_val_if_fail (action_name && *action_name, NULL);
+
+       if (customization_data_exists (object)) {
+               BrowserWindow *bwin;
+               if (IS_BROWSER_PERSPECTIVE (object))
+                       bwin = browser_perspective_get_window (BROWSER_PERSPECTIVE (object));
+               else if (IS_BROWSER_PAGE (object))
+                       bwin = browser_perspective_get_window (browser_page_get_perspective (BROWSER_PAGE 
(object)));
+               else {
+                       g_warning ("Unhandled object type for %s", __FUNCTION__);
+                       return NULL;
+               }
+
+               return g_action_map_lookup_action (G_ACTION_MAP (bwin), action_name);
+       }
+       return NULL;
+}
diff --git a/tools/browser/ui-customize.h b/tools/browser/ui-customize.h
new file mode 100644
index 0000000..7c31458
--- /dev/null
+++ b/tools/browser/ui-customize.h
@@ -0,0 +1,39 @@
+/*
+ * Copyright (C) 2015 Vivien Malerba <malerba gnome-db 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 Street, Fifth Floor, Boston, MA  02110-1301, USA.
+ */
+
+
+#ifndef __UI_CUSTOMIZE_H_
+#define __UI_CUSTOMIZE_H_
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS
+
+void               customization_data_release        (GObject *object);
+void               customization_data_init           (GObject *object, GtkToolbar *toolbar, GtkHeaderBar 
*header);
+gboolean           customization_data_exists         (GObject *object);
+void               customization_data_add_part       (GObject *object, GObject *part);
+void               customization_data_add_actions    (GObject *object, GActionEntry *entries, guint 
n_entries);
+
+GtkToolbar        *customization_data_get_toolbar    (GObject *object);
+GtkHeaderBar      *customization_data_get_header_bar (GObject *object);
+GAction           *customization_data_get_action     (GObject *object, const gchar *action_name);
+
+G_END_DECLS
+
+#endif
diff --git a/tools/browser/ui-formgrid.c b/tools/browser/ui-formgrid.c
index 41d9df1..ded67e5 100644
--- a/tools/browser/ui-formgrid.c
+++ b/tools/browser/ui-formgrid.c
@@ -1116,7 +1116,8 @@ compute_modification_statements (UiFormGrid *formgrid, GdaDataModel *model)
  * @user_data: (allow-none): a pointer passed to the @callback function, or %NULL
  *
  * If @callback is not %NULL, then a "Refresh" button is added to @formgrid which, when clicked,
- * calls @callback.
+ * calls @callback. The callback function will have a first argument which is a button, and a second argument
+ * which is @user_data
  *
  * If @callback is %NULL, then the "Refresh" button (if there was any) is removed.
  */
diff --git a/tools/browser/ui-support.c b/tools/browser/ui-support.c
index 4ae01f6..1389000 100644
--- a/tools/browser/ui-support.c
+++ b/tools/browser/ui-support.c
@@ -453,7 +453,7 @@ _make_tab_label (const gchar *label,
        gtk_box_pack_start (GTK_BOX (hbox), wid, TRUE, TRUE, 0);
 
        if (with_close) {
-               image = gtk_image_new_from_icon_name ("window-close", GTK_ICON_SIZE_MENU);
+               image = gtk_image_new_from_icon_name ("window-close-symbolic", GTK_ICON_SIZE_MENU);
                close_button = gtk_button_new ();
                gtk_button_set_relief (GTK_BUTTON (close_button), GTK_RELIEF_NONE);
                gtk_button_set_focus_on_click (GTK_BUTTON (close_button), FALSE);
diff --git a/tools/browser/widget-overlay.c b/tools/browser/widget-overlay.c
index 8d95acb..4383549 100644
--- a/tools/browser/widget-overlay.c
+++ b/tools/browser/widget-overlay.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 - 2014 Vivien Malerba <malerba gnome-db org>
+ * Copyright (C) 2011 - 2015 Vivien Malerba <malerba gnome-db org>
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -19,8 +19,6 @@
 #include <stdarg.h>
 #include <glib/gi18n-lib.h>
 
-#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
-
 #define SCALE_MIN .6
 #define SCALE_MAX 1.
 #define SCALE_MAX_SCALE 1.5
@@ -253,7 +251,7 @@ widget_overlay_set_property (GObject *object,
                                gtk_box_pack_start (GTK_BOX (box), wid, TRUE, TRUE, 0);
 
                                button = gtk_button_new ();
-                               image = gtk_image_new_from_stock (GTK_STOCK_CLOSE,
+                               image = gtk_image_new_from_icon_name ("window-close-symbolic",
                                                                  GTK_ICON_SIZE_MENU);
                                gtk_container_add (GTK_CONTAINER (button), image);
                                gtk_container_add (GTK_CONTAINER (box), button);
@@ -636,8 +634,7 @@ widget_overlay_realize (GtkWidget *widget)
                        attributes.height = allocation.height;
                }
 
-               cd->offscreen_window = gdk_window_new (gtk_widget_get_root_window (widget),
-                                                      &attributes, attributes_mask);
+               cd->offscreen_window = gdk_window_new (NULL, &attributes, attributes_mask);
                gdk_window_set_user_data (cd->offscreen_window, widget);
                gtk_widget_set_parent_window (cd->child, cd->offscreen_window);
                gdk_offscreen_window_set_embedder (cd->offscreen_window, win);


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