diff -u /home/alex/devel/gdl/gdl/gdl-dock-bar.c src/libgdl//gdl-dock-bar.c
--- /home/alex/devel/gdl/gdl/gdl-dock-bar.c	2011-12-22 16:14:27.740702752 +0000
+++ src/libgdl//gdl-dock-bar.c	2011-12-22 16:00:21.928701278 +0000
@@ -267,6 +268,7 @@
     GtkWidget *button;
     gchar *stock_id;
     gchar *name;
+    GdkPixbuf *pixbuf_icon;
     GtkWidget *image, *box, *label;
 
     g_return_if_fail (GDL_IS_DOCK_BAR (dockbar));
@@ -290,7 +292,8 @@
     else
         box = gtk_vbox_new (FALSE, 0);
     
-    g_object_get (item, "stock-id", &stock_id, "long-name", &name, NULL);
+    g_object_get (item, "stock-id", &stock_id, "pixbuf-icon", &pixbuf_icon,
+                  "long-name", &name, NULL);
 
     if (dockbar->_priv->dockbar_style == GDL_DOCK_BAR_TEXT ||
         dockbar->_priv->dockbar_style == GDL_DOCK_BAR_BOTH) {
@@ -309,6 +312,8 @@
             image = gtk_image_new_from_stock (stock_id,
                                               GTK_ICON_SIZE_SMALL_TOOLBAR);
             g_free (stock_id);
+        } else if (pixbuf_icon) {
+            image = gtk_image_new_from_pixbuf (pixbuf_icon);
         } else {
             image = gtk_image_new_from_stock (GTK_STOCK_NEW,
                                               GTK_ICON_SIZE_SMALL_TOOLBAR);
diff -u /home/alex/devel/gdl/gdl/gdl-dock.c src/libgdl//gdl-dock.c
--- /home/alex/devel/gdl/gdl/gdl-dock.c	2011-12-22 16:14:27.752702752 +0000
+++ src/libgdl//gdl-dock.c	2011-12-22 16:01:05.596701354 +0000
@@ -36,9 +36,6 @@
 
 #include "libgdlmarshal.h"
 
-#ifndef __FUNCTION__
-#define __FUNCTION__ __func__
-#endif
 
 /* ----- Private prototypes ----- */
 
@@ -325,6 +324,9 @@
                                          dock->_priv->height);
             gtk_window_set_type_hint (GTK_WINDOW (dock->_priv->window),
                                       GDK_WINDOW_TYPE_HINT_NORMAL);
+            
+            gtk_window_set_skip_taskbar_hint (GTK_WINDOW (dock->_priv->window), 
+                                              TRUE);
 
             /* metacity ignores this */
             gtk_window_move (GTK_WINDOW (dock->_priv->window),
@@ -1066,14 +1077,10 @@
     if (placement == GDL_DOCK_LEFT || placement == GDL_DOCK_RIGHT) {
         /* Check if dock_object touches center in terms of width */
         if (allocation.width/2 > object_size.width) {
-            return GDL_DOCK_CENTER;
+            return GDL_DOCK_TOP;
         }
-    } else if (placement == GDL_DOCK_TOP || placement == GDL_DOCK_BOTTOM) {
-        /* Check if dock_object touches center in terms of height */
-        if (allocation.height/2 > object_size.height) {
-            return GDL_DOCK_CENTER;
-        }
-    }
+    } 
+
     return placement;
 }
 
@@ -1212,7 +1221,7 @@
         /* Non-floating item. */
         if (dock->root) {
             GdlDockPlacement local_placement;
-            GtkRequisition preferred_size;
+            /* GtkRequisition preferred_size; */
             
             best_dock_item =
                 gdl_dock_find_best_placement_item (GDL_DOCK_ITEM (dock->root),
diff -u /home/alex/devel/gdl/gdl/gdl-dock-item.c src/libgdl//gdl-dock-item.c
--- /home/alex/devel/gdl/gdl/gdl-dock-item.c	2011-12-22 16:14:27.744702753 +0000
+++ src/libgdl//gdl-dock-item.c	2011-12-22 16:08:20.396702112 +0000
@@ -79,6 +79,9 @@
                                           gpointer      callback_data);
 static GType gdl_dock_item_child_type  (GtkContainer *container);
 
+static void  gdl_dock_item_set_focus_child (GtkContainer *container,
+                                            GtkWidget    *widget);
+
 static void  gdl_dock_item_size_request  (GtkWidget *widget,
                                           GtkRequisition *requisition);
 static void  gdl_dock_item_size_allocate (GtkWidget *widget,
@@ -91,6 +94,9 @@
 static gint  gdl_dock_item_expose        (GtkWidget *widget,
                                           GdkEventExpose *event);
 
+static void  gdl_dock_item_move_focus_child (GdlDockItem      *item,
+                                             GtkDirectionType  dir);
+
 static gint  gdl_dock_item_button_changed (GtkWidget *widget,
                                            GdkEventButton *event);
 static gint  gdl_dock_item_motion         (GtkWidget *widget,
@@ -156,6 +162,7 @@
     DOCK_DRAG_MOTION,
     DOCK_DRAG_END,
     SELECTED,
+    MOVE_FOCUS_CHILD,
     LAST_SIGNAL
 };
 
@@ -194,6 +201,40 @@
 G_DEFINE_TYPE (GdlDockItem, gdl_dock_item, GDL_TYPE_DOCK_OBJECT);
 
 static void
+add_tab_bindings (GtkBindingSet    *binding_set,
+		  GdkModifierType   modifiers,
+		  GtkDirectionType  direction)
+{
+    gtk_binding_entry_add_signal (binding_set, GDK_Tab, modifiers,
+                                  "move_focus_child", 1,
+                                  GTK_TYPE_DIRECTION_TYPE, direction);
+    gtk_binding_entry_add_signal (binding_set, GDK_KP_Tab, modifiers,
+                                  "move_focus_child", 1,
+                                  GTK_TYPE_DIRECTION_TYPE, direction);
+}
+
+static void
+add_arrow_bindings (GtkBindingSet    *binding_set,
+		    guint             keysym,
+		    GtkDirectionType  direction)
+{
+    guint keypad_keysym = keysym - GDK_Left + GDK_KP_Left;
+
+    gtk_binding_entry_add_signal (binding_set, keysym, 0,
+                                  "move_focus_child", 1,
+                                  GTK_TYPE_DIRECTION_TYPE, direction);
+    gtk_binding_entry_add_signal (binding_set, keysym, GDK_CONTROL_MASK,
+                                  "move_focus_child", 1,
+                                  GTK_TYPE_DIRECTION_TYPE, direction);
+    gtk_binding_entry_add_signal (binding_set, keysym, GDK_CONTROL_MASK,
+                                  "move_focus_child", 1,
+                                  GTK_TYPE_DIRECTION_TYPE, direction);
+    gtk_binding_entry_add_signal (binding_set, keypad_keysym, GDK_CONTROL_MASK,
+                                  "move_focus_child", 1,
+                                  GTK_TYPE_DIRECTION_TYPE, direction);
+}
+
+static void
 gdl_dock_item_class_init (GdlDockItemClass *klass)
 {
     static gboolean style_initialized = FALSE;
@@ -203,6 +244,7 @@
     GtkWidgetClass     *widget_class;
     GtkContainerClass  *container_class;
     GdlDockObjectClass *object_class;
+    GtkBindingSet      *binding_set;
     
     g_object_class = G_OBJECT_CLASS (klass);
     gtk_object_class = GTK_OBJECT_CLASS (klass);
@@ -232,6 +274,7 @@
     container_class->remove = gdl_dock_item_remove;
     container_class->forall = gdl_dock_item_forall;
     container_class->child_type = gdl_dock_item_child_type;
+    container_class->set_focus_child = gdl_dock_item_set_focus_child;
     
     object_class->is_compound = FALSE;
 
@@ -381,11 +424,39 @@
                       g_cclosure_marshal_VOID__VOID,
                       G_TYPE_NONE,
                       0);
+    
+    gdl_dock_item_signals [MOVE_FOCUS_CHILD] =
+        g_signal_new ("move_focus_child",
+                      G_TYPE_FROM_CLASS (klass),
+                      G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+                      G_STRUCT_OFFSET (GdlDockItemClass, move_focus_child),
+                      NULL, /* accumulator */
+                      NULL, /* accu_data */
+                      gdl_marshal_VOID__ENUM,
+                      G_TYPE_NONE,
+                      1,
+                      GTK_TYPE_DIRECTION_TYPE);
+
+
+    /* key bindings */
+
+    binding_set = gtk_binding_set_by_class (klass);
+
+    add_arrow_bindings (binding_set, GDK_Up, GTK_DIR_UP);
+    add_arrow_bindings (binding_set, GDK_Down, GTK_DIR_DOWN);
+    add_arrow_bindings (binding_set, GDK_Left, GTK_DIR_LEFT);
+    add_arrow_bindings (binding_set, GDK_Right, GTK_DIR_RIGHT);
+
+    add_tab_bindings (binding_set, 0, GTK_DIR_TAB_FORWARD);
+    add_tab_bindings (binding_set, GDK_CONTROL_MASK, GTK_DIR_TAB_FORWARD);
+    add_tab_bindings (binding_set, GDK_SHIFT_MASK, GTK_DIR_TAB_BACKWARD);
+    add_tab_bindings (binding_set, GDK_CONTROL_MASK | GDK_SHIFT_MASK, GTK_DIR_TAB_BACKWARD);
 
     klass->has_grip = TRUE;
     klass->dock_drag_begin = NULL;
     klass->dock_drag_motion = NULL;
     klass->dock_drag_end = NULL;
+    klass->move_focus_child = gdl_dock_item_move_focus_child;
     klass->set_orientation = gdl_dock_item_real_set_orientation;
 
     if (!style_initialized)
@@ -405,6 +476,7 @@
 gdl_dock_item_init (GdlDockItem *item)
 {
     gtk_widget_set_has_window (GTK_WIDGET (item), TRUE);
+    gtk_widget_set_can_focus (GTK_WIDGET (item), TRUE);
 
     item->child = NULL;
     
@@ -724,6 +796,19 @@
 }
 
 static void
+gdl_dock_item_set_focus_child (GtkContainer *container,
+                               GtkWidget    *child)
+{
+    g_return_if_fail (GDL_IS_DOCK_ITEM (container));
+    
+    if (GTK_CONTAINER_CLASS (gdl_dock_item_parent_class)->set_focus_child) {
+        (* GTK_CONTAINER_CLASS (gdl_dock_item_parent_class)->set_focus_child) (container, child);
+    }
+
+    gdl_dock_item_showhide_grip (GDL_DOCK_ITEM (container));
+}
+
+static void
 gdl_dock_item_size_request (GtkWidget      *widget,
                             GtkRequisition *requisition)
 {
@@ -998,6 +1084,14 @@
     return FALSE;
 }
 
+static void
+gdl_dock_item_move_focus_child (GdlDockItem      *item,
+                                GtkDirectionType  dir)
+{
+    g_return_if_fail (GDL_IS_DOCK_ITEM (item));
+    gtk_widget_child_focus (GTK_WIDGET (item->child), dir);
+}
+
 #define EVENT_IN_GRIP_EVENT_WINDOW(ev,gr) \
     ((gr) != NULL && (ev)->window == GDL_DOCK_ITEM_GRIP (gr)->title_window)
 
@@ -1045,6 +1139,10 @@
 
     /* Left mousebutton click on dockitem. */
     if (!locked && event->button == 1 && event->type == GDK_BUTTON_PRESS) {
+
+        if (!gdl_dock_item_or_child_has_focus (item))
+            gtk_widget_grab_focus (GTK_WIDGET (item));
+            
         /* Set in_drag flag, grab pointer and call begin drag operation. */      
         if (in_handle) {
             item->_priv->start_x = event->x;
@@ -1065,6 +1163,7 @@
         if (GDL_DOCK_ITEM_IN_DRAG (item)) {
             /* User dropped widget somewhere. */
             gdl_dock_item_drag_end (item, FALSE);
+            gtk_widget_grab_focus (GTK_WIDGET (item));
             event_handled = TRUE;
         }
         else if (GDL_DOCK_ITEM_IN_PREDRAG (item)) {
@@ -1137,7 +1236,6 @@
                          GdkEventKey *event)
 {
     gboolean event_handled = FALSE;
-    
     if (GDL_DOCK_ITEM_IN_DRAG (widget)) {
         if (event->keyval == GDK_Escape) {
             gdl_dock_item_drag_end (GDL_DOCK_ITEM (widget), TRUE);
@@ -1211,25 +1309,37 @@
         request->rect.width = alloc.width;
         request->rect.height = alloc.height;
 
+        GdlDockItemBehavior behavior = GDL_DOCK_ITEM(object)->behavior;
+
         /* Calculate docking indicator rectangle size for new locations. Only
            do this when we're not over the item's current location. */
         if (request->applicant != object) {
             switch (request->position) {
                 case GDL_DOCK_TOP:
+                    if (behavior & GDL_DOCK_ITEM_BEH_CANT_DOCK_TOP)
+                        return FALSE;
                     request->rect.height *= SPLIT_RATIO;
                     break;
                 case GDL_DOCK_BOTTOM:
+                    if (behavior & GDL_DOCK_ITEM_BEH_CANT_DOCK_BOTTOM)
+                        return FALSE;
                     request->rect.y += request->rect.height * (1 - SPLIT_RATIO);
                     request->rect.height *= SPLIT_RATIO;
                     break;
                 case GDL_DOCK_LEFT:
+                    if (behavior & GDL_DOCK_ITEM_BEH_CANT_DOCK_LEFT)
+                        return FALSE;
                     request->rect.width *= SPLIT_RATIO;
                     break;
                 case GDL_DOCK_RIGHT:
+                    if (behavior & GDL_DOCK_ITEM_BEH_CANT_DOCK_RIGHT)
+                        return FALSE;
                     request->rect.x += request->rect.width * (1 - SPLIT_RATIO);
                     request->rect.width *= SPLIT_RATIO;
                     break;
                 case GDL_DOCK_CENTER:
+                    if (behavior & GDL_DOCK_ITEM_BEH_CANT_DOCK_CENTER)
+                        return FALSE;
                     request->rect.x = request->rect.width * SPLIT_RATIO/2;
                     request->rect.y = request->rect.height * SPLIT_RATIO/2;
                     request->rect.width = (request->rect.width *
@@ -1311,7 +1421,7 @@
             }
             if (req.width > 1)
                 g_object_set (object, "preferred-width", req.width, NULL);
-            if (req.height > 1)
+            if (req.height > 1 && object_req.height > req.height)
                 g_object_set (object, "preferred-height",
                               object_req.height - req.height, NULL);
             break;
@@ -1738,6 +1857,27 @@
     return GTK_WIDGET (item);
 }
 
+GtkWidget *
+gdl_dock_item_new_with_pixbuf_icon (const gchar         *name,
+                                    const gchar         *long_name,
+                                    const GdkPixbuf     *pixbuf_icon,
+                                    GdlDockItemBehavior  behavior)
+{
+    GdlDockItem *item;
+
+    item = GDL_DOCK_ITEM (g_object_new (GDL_TYPE_DOCK_ITEM, 
+                                        "name", name, 
+                                        "long-name", long_name,
+                                        "pixbuf-icon", pixbuf_icon,
+                                        "behavior", behavior,
+                                        NULL));
+
+    GDL_DOCK_OBJECT_UNSET_FLAGS (item, GDL_DOCK_AUTOMATIC);
+    gdl_dock_item_set_tablabel (item, gtk_label_new (long_name));
+
+    return GTK_WIDGET (item);
+}
+
 /* convenient function (and to preserve source compat) */
 /**
  * gdl_dock_item_dock_to:
@@ -2217,6 +2359,26 @@
 }
 
 
+gboolean
+gdl_dock_item_or_child_has_focus (GdlDockItem *item)
+{
+    GtkWidget *item_child;
+    gboolean item_or_child_has_focus;
+
+    g_return_val_if_fail (GDL_IS_DOCK_ITEM (item), FALSE);
+
+    for (item_child = GTK_CONTAINER (item)->focus_child;
+         item_child && GTK_IS_CONTAINER (item_child) && GTK_CONTAINER (item_child)->focus_child;
+         item_child = GTK_CONTAINER (item_child)->focus_child) ;
+    
+    item_or_child_has_focus =
+        (gtk_widget_has_focus (GTK_WIDGET (item)) || 
+         (GTK_IS_WIDGET (item_child) && gtk_widget_has_focus (item_child)));
+    
+    return item_or_child_has_focus;
+}
+
+
 /* ----- gtk orientation type exporter/importer ----- */
 
 static void 
diff -u /home/alex/devel/gdl/gdl/gdl-dock-item-grip.c src/libgdl//gdl-dock-item-grip.c
--- /home/alex/devel/gdl/gdl/gdl-dock-item-grip.c	2011-12-22 16:14:27.740702752 +0000
+++ src/libgdl//gdl-dock-item-grip.c	2011-12-22 16:00:42.308701315 +0000
@@ -67,10 +67,12 @@
     GtkLabel *label;
     gchar *stock_id = NULL;
     gchar *title = NULL;
+    GdkPixbuf *pixbuf;
   
     label_box = (GtkHBox*)gtk_hbox_new (FALSE, 0);
     
     g_object_get (G_OBJECT (grip->item), "stock-id", &stock_id, NULL);
+    g_object_get (G_OBJECT (grip->item), "pixbuf-icon", &pixbuf, NULL);
     if(stock_id) {   
         image = GTK_IMAGE(gtk_image_new_from_stock (stock_id, GTK_ICON_SIZE_MENU));
         
@@ -79,6 +81,12 @@
             
         g_free (stock_id);
     }
+    else if (pixbuf) {
+        image = GTK_IMAGE(gtk_image_new_from_pixbuf (pixbuf));
+	    
+        gtk_widget_show (GTK_WIDGET(image));
+        gtk_box_pack_start(GTK_BOX(label_box), GTK_WIDGET(image), FALSE, TRUE, 0);
+    }
         
     g_object_get (G_OBJECT (grip->item), "long-name", &title, NULL);
     if (title) {
diff -u /home/alex/devel/gdl/gdl/gdl-dock-item.h src/libgdl//gdl-dock-item.h
--- /home/alex/devel/gdl/gdl/gdl-dock-item.h	2011-12-22 16:14:27.744702753 +0000
+++ src/libgdl//gdl-dock-item.h	2011-12-22 16:08:20.396702112 +0000
@@ -99,6 +99,8 @@
                                    gint            y);
     void     (* dock_drag_end)    (GdlDockItem    *item,
                                    gboolean        cancelled);
+    void     (* move_focus_child) (GdlDockItem      *item,
+                                   GtkDirectionType  direction);
     void     (* set_orientation)  (GdlDockItem    *item,
                                    GtkOrientation  orientation);
 };
@@ -142,6 +144,11 @@
                                                 const gchar         *stock_id,
                                                 GdlDockItemBehavior  behavior);
 
+GtkWidget     *gdl_dock_item_new_with_pixbuf_icon (const gchar         *name,
+                                                   const gchar         *long_name,
+                                                   const GdkPixbuf     *pixbuf_icon,
+                                                   GdlDockItemBehavior  behavior);
+
 GType          gdl_dock_item_get_type          (void);
 
 void           gdl_dock_item_dock_to           (GdlDockItem      *item,
@@ -182,6 +189,7 @@
 void        gdl_dock_item_preferred_size       (GdlDockItem      *item,
                                                 GtkRequisition   *req);
 
+gboolean    gdl_dock_item_or_child_has_focus  (GdlDockItem      *item);
 
 G_END_DECLS
 
diff -u /home/alex/devel/gdl/gdl/gdl-dock-master.c src/libgdl//gdl-dock-master.c
--- /home/alex/devel/gdl/gdl/gdl-dock-master.c	2011-12-22 16:14:27.744702753 +0000
+++ src/libgdl//gdl-dock-master.c	2011-12-22 16:00:56.996701338 +0000
@@ -34,6 +34,9 @@
 #include "gdl-switcher.h"
 #include "libgdlmarshal.h"
 #include "libgdltypebuiltins.h"
+#ifdef WIN32
+#include "gdl-win32.h"
+#endif
 
 /* ----- Private prototypes ----- */
 
@@ -79,7 +82,8 @@
     PROP_0,
     PROP_DEFAULT_TITLE,
     PROP_LOCKED,
-    PROP_SWITCHER_STYLE
+    PROP_SWITCHER_STYLE,
+    PROP_EXPANSION_DIRECTION
 };
 
 enum {
@@ -109,6 +113,8 @@
     GHashTable     *unlocked_items;
     
     GdlSwitcherStyle switcher_style;
+
+    GdlDockExpansionDirection expansion_direction;
 };
 
 #define COMPUTE_LOCKED(master)                                          \
@@ -157,6 +163,15 @@
                            GDL_SWITCHER_STYLE_BOTH,
                            G_PARAM_READWRITE));
 
+    g_object_class_install_property (
+        g_object_class, PROP_EXPANSION_DIRECTION,
+        g_param_spec_enum ("expand-direction", _("Expand direction"),
+                           _("Allow the master's dock items to expand their container "
+                             "dock objects in the given direction"),
+                           GDL_TYPE_EXPANSION_DIRECTION,
+                           GDL_DOCK_EXPANSION_DIRECTION_NONE,
+                           G_PARAM_READWRITE));
+
     master_signals [LAYOUT_CHANGED] = 
         g_signal_new ("layout-changed", 
                       G_TYPE_FROM_CLASS (klass),
@@ -183,6 +198,7 @@
     master->_priv = g_new0 (GdlDockMasterPrivate, 1);
     master->_priv->number = 1;
     master->_priv->switcher_style = GDL_SWITCHER_STYLE_BOTH;
+    master->_priv->expansion_direction = GDL_DOCK_EXPANSION_DIRECTION_NONE;
     master->_priv->locked_items = g_hash_table_new (g_direct_hash, g_direct_equal);
     master->_priv->unlocked_items = g_hash_table_new (g_direct_hash, g_direct_equal);
 }
@@ -359,6 +376,9 @@
         case PROP_SWITCHER_STYLE:
             gdl_dock_master_set_switcher_style (master, g_value_get_enum (value));
             break;
+        case PROP_EXPANSION_DIRECTION:
+            master->_priv->expansion_direction = g_value_get_enum (value);
+            break;
         default:
             G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
             break;
@@ -383,6 +403,9 @@
         case PROP_SWITCHER_STYLE:
             g_value_set_enum (value, master->_priv->switcher_style);
             break;
+        case PROP_EXPANSION_DIRECTION:
+            g_value_set_enum (value, master->_priv->expansion_direction);
+            break;
         default:
             G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
             break;
@@ -632,8 +656,20 @@
             window, &values, GDK_GC_FUNCTION | GDK_GC_SUBWINDOW);
     };
 
+#ifdef WIN32    
+    GdkLineStyle lineStyle = GDK_LINE_ON_OFF_DASH;
+    if (is_os_vista())
+    {
+        // On Vista the dash-line is increadibly slow to draw, it takes several minutes to draw the tracking lines
+        // With GDK_LINE_SOLID it is parts of a second
+        // No performance issue on WinXP
+        lineStyle = GDK_LINE_SOLID;
+    }
+#else
+    GdkLineStyle lineStyle = GDK_LINE_ON_OFF_DASH;
+#endif
     gdk_gc_set_line_attributes (master->_priv->root_xor_gc, 1,
-                                GDK_LINE_ON_OFF_DASH,
+                                lineStyle,
                                 GDK_CAP_NOT_LAST,
                                 GDK_JOIN_BEVEL);
     
diff -u /home/alex/devel/gdl/gdl/gdl-dock-notebook.c src/libgdl//gdl-dock-notebook.c
--- /home/alex/devel/gdl/gdl/gdl-dock-notebook.c	2011-12-22 16:14:27.744702753 +0000
+++ src/libgdl//gdl-dock-notebook.c	2011-12-22 16:01:01.636701348 +0000
@@ -386,11 +390,12 @@
             GdlDockItem *item = GDL_DOCK_ITEM (object);
             GdlDockItem *requestor_item = GDL_DOCK_ITEM (requestor);
             gchar       *long_name, *stock_id;
+            GdkPixbuf   *pixbuf_icon;
             GtkWidget   *label;
             gint         position = -1;
             
             g_object_get (requestor_item, "long-name", &long_name,
-                          "stock-id", &stock_id, NULL);
+                          "stock-id", &stock_id, "pixbuf-icon", &pixbuf_icon, NULL);
             label = gdl_dock_item_get_tablabel (requestor_item);
             if (!label) {
                 label = gtk_label_new (long_name);
@@ -410,7 +415,7 @@
             position = gdl_switcher_insert_page (GDL_SWITCHER (item->child), 
                                                  GTK_WIDGET (requestor), label,
                                                  long_name, long_name,
-                                                 stock_id, position);
+                                                 stock_id, pixbuf_icon, position);
             
             GDL_DOCK_OBJECT_SET_FLAGS (requestor, GDL_DOCK_ATTACHED);
             
diff -u /home/alex/devel/gdl/gdl/gdl-dock-object.c src/libgdl//gdl-dock-object.c
--- /home/alex/devel/gdl/gdl/gdl-dock-object.c	2011-12-22 16:14:27.748702753 +0000
+++ src/libgdl//gdl-dock-object.c	2011-12-22 16:01:10.060701361 +0000
@@ -79,6 +79,7 @@
     PROP_NAME,
     PROP_LONG_NAME,
     PROP_STOCK_ID,
+    PROP_PIXBUF_ICON,
     PROP_MASTER,
     PROP_EXPORT_PROPERTIES
 };
@@ -135,6 +136,12 @@
                              G_PARAM_READWRITE | G_PARAM_CONSTRUCT));
 
     g_object_class_install_property (
+        g_object_class, PROP_PIXBUF_ICON,
+        g_param_spec_pointer ("pixbuf-icon", _("Pixbuf Icon"),
+                              _("Pixbuf icon for the dock object"),
+                              G_PARAM_READWRITE));
+
+    g_object_class_install_property (
         g_object_class, PROP_MASTER,
         g_param_spec_object ("master", _("Dock master"),
                              _("Dock master this dock object is bound to"),
@@ -211,6 +218,9 @@
         g_free (object->stock_id);
         object->stock_id = g_value_dup_string (value);
         break;
+    case PROP_PIXBUF_ICON:
+        object->pixbuf_icon = g_value_get_pointer (value);
+        break;
     case PROP_MASTER:
         if (g_value_get_object (value)) 
             gdl_dock_object_bind (object, g_value_get_object (value));
@@ -241,6 +251,9 @@
     case PROP_STOCK_ID:
         g_value_set_string (value, object->stock_id);
         break;
+    case PROP_PIXBUF_ICON:
+        g_value_set_pointer (value, object->pixbuf_icon);
+        break;
     case PROP_MASTER:
         g_value_set_object (value, object->master);
         break;
@@ -265,6 +278,7 @@
     object->long_name = NULL;
     g_free (object->stock_id);
     object->stock_id = NULL;
+    object->pixbuf_icon = NULL;
 
     G_OBJECT_CLASS (gdl_dock_object_parent_class)->finalize (g_object);
 }
@@ -848,7 +867,7 @@
     static GType our_type = 0;
 
     if (our_type == 0) {
-        GTypeInfo tinfo = { 0, };
+        GTypeInfo tinfo = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
         our_type = g_type_register_static (G_TYPE_STRING, "GdlDockParam", &tinfo, 0);
 
         /* register known transform functions */
diff -u /home/alex/devel/gdl/gdl/gdl-dock-object.h src/libgdl//gdl-dock-object.h
--- /home/alex/devel/gdl/gdl/gdl-dock-object.h	2011-12-22 16:14:27.748702753 +0000
+++ src/libgdl//gdl-dock-object.h	2011-12-22 16:01:10.060701361 +0000
@@ -66,6 +66,14 @@
     GDL_DOCK_FLOATING
 } GdlDockPlacement;
 
+typedef enum {
+    GDL_DOCK_EXPANSION_DIRECTION_NONE = 0,
+    GDL_DOCK_EXPANSION_DIRECTION_UP,
+    GDL_DOCK_EXPANSION_DIRECTION_DOWN,
+    GDL_DOCK_EXPANSION_DIRECTION_LEFT,
+    GDL_DOCK_EXPANSION_DIRECTION_RIGHT
+} GdlDockExpansionDirection;
+
 typedef struct _GdlDockObject      GdlDockObject;
 typedef struct _GdlDockObjectClass GdlDockObjectClass;
 typedef struct _GdlDockRequest     GdlDockRequest;
@@ -88,6 +96,7 @@
     gchar              *name;
     gchar              *long_name;
     gchar              *stock_id;
+    GdkPixbuf          *pixbuf_icon;
     
     gboolean            reduce_pending;
 };
Only in src/libgdl/: gdl-dock-object.o
diff -u /home/alex/devel/gdl/gdl/gdl-dock-paned.c src/libgdl//gdl-dock-paned.c
--- /home/alex/devel/gdl/gdl/gdl-dock-paned.c	2011-12-22 16:14:27.748702753 +0000
+++ src/libgdl//gdl-dock-paned.c	2011-12-22 16:01:14.100701369 +0000
@@ -138,6 +138,64 @@
 gdl_dock_paned_init (GdlDockPaned *paned)
 {
     paned->position_changed = FALSE;
+    paned->in_drag = FALSE;
+    paned->last_drag_position = -1;
+}
+
+static void
+gdl_dock_paned_resize_paned_ancestors (GdlDockPaned       *paned, 
+                                       GdlDockExpansionDirection  expansion_direction,
+                                       gint                diff)
+{
+     GtkWidget *widget, *last_widget;
+
+     g_return_if_fail (GDL_IS_DOCK_PANED (paned));
+
+     last_widget = GTK_WIDGET (paned);
+
+     /* make sure resizing only can be done in the drag direction */
+     if (expansion_direction == GDL_DOCK_EXPANSION_DIRECTION_NONE ||
+         ((expansion_direction == GDL_DOCK_EXPANSION_DIRECTION_DOWN || 
+           expansion_direction == GDL_DOCK_EXPANSION_DIRECTION_UP) && 
+          !GTK_IS_VPANED (GDL_DOCK_ITEM (paned)->child)) ||
+         ((expansion_direction == GDL_DOCK_EXPANSION_DIRECTION_LEFT || 
+           expansion_direction == GDL_DOCK_EXPANSION_DIRECTION_RIGHT) && 
+          !GTK_IS_HPANED (GDL_DOCK_ITEM (paned)->child)))
+     {         
+         return;
+     }
+
+     for (widget = GTK_WIDGET (paned)->parent; widget != NULL; 
+          widget = widget->parent) {
+
+         if (GTK_IS_PANED (widget)) {
+
+             GtkPaned *paned = GTK_PANED (widget);
+
+                 if (last_widget == paned->child1) {
+
+                     if (!GDL_IS_DOCK_OBJECT(widget->parent)) {
+                         GtkRequisition requisition;
+                         GtkAllocation allocation = paned->child1->allocation;
+
+                         gtk_widget_size_request (paned->child1, &requisition);
+
+                         gint new_height =
+                             (allocation.height > requisition.height && diff > 0 ?
+                              allocation.height : requisition.height) + diff;
+
+                         gtk_widget_set_size_request (paned->child1, -1, new_height);
+                     }
+                     
+                     gtk_paned_set_position (paned, gtk_paned_get_position (paned) + diff);
+                 }
+             
+         } else if (!GDL_IS_DOCK_OBJECT (widget)) {
+             break;
+         }
+
+         last_widget = widget;
+     }
 }
 
 static void 
@@ -154,8 +213,40 @@
     
     paned = GDL_DOCK_PANED (user_data);
     
-    if (GDL_DOCK_ITEM_USER_ACTION (user_data) && !strcmp (pspec->name, "position"))
+    if (GDL_DOCK_ITEM_USER_ACTION (user_data) && !strcmp (pspec->name, "position")) {
+
+        GdlDockExpansionDirection expansion_direction;
+
         paned->position_changed = TRUE;
+
+        g_object_get (GDL_DOCK_OBJECT(paned)->master,
+                      "expand-direction", &expansion_direction,
+                      NULL);
+
+        switch (expansion_direction) {
+        case GDL_DOCK_EXPANSION_DIRECTION_DOWN:
+            if (paned->in_drag) {
+                gint max_position, position, diff;
+                g_object_get (GDL_DOCK_ITEM (paned)->child,
+                              "max-position", &max_position,
+                              "position", &position,
+                              NULL);
+ 
+                diff = position - paned->last_drag_position;
+                paned->last_drag_position = position;
+
+                if (diff > 0 && position == max_position) {
+                    gdl_dock_paned_resize_paned_ancestors (paned, expansion_direction, diff + 1);
+                } else {
+                    gdl_dock_paned_resize_paned_ancestors (paned, expansion_direction, diff);
+                }
+                 
+            }
+            break;
+        default:
+            ;
+        }
+    }
 }
 
 static gboolean 
@@ -164,13 +255,48 @@
                           gpointer        user_data)
 {
     GdlDockPaned *paned;
+    (void)widget;
     
     g_return_val_if_fail (user_data != NULL && GDL_IS_DOCK_PANED (user_data), FALSE);
     
     paned = GDL_DOCK_PANED (user_data);
     if (event->button == 1) {
-        if (event->type == GDK_BUTTON_PRESS)
+	if (event->type == GDK_BUTTON_PRESS) {
+
+            GdlDockExpansionDirection expansion_direction;
+
             GDL_DOCK_ITEM_SET_FLAGS (user_data, GDL_DOCK_USER_ACTION);
+
+            paned->in_drag = TRUE;
+
+            g_object_get (GDL_DOCK_OBJECT (paned)->master,
+                          "expand-direction", &expansion_direction,
+                          NULL);
+
+            switch (expansion_direction) {
+            case GDL_DOCK_EXPANSION_DIRECTION_DOWN:
+            {
+                gint max_position, position;
+                g_object_get (GDL_DOCK_ITEM (paned)->child,
+                              "max-position", &max_position,
+                              "position", &position,
+                              NULL);
+
+                paned->last_drag_position = position;
+                /* expand the paned's ancestors a bit if the separator is in max position
+                 * to allow dragging in all directions */
+                if (position == max_position)
+                    gdl_dock_paned_resize_paned_ancestors (paned, expansion_direction, 1);
+                break;
+            }
+            default:
+                ;
+            }
+        }
+        else if (event->type == GDK_BUTTON_RELEASE) {
+	     paned->last_drag_position = -1;
+	     paned->in_drag = FALSE;
+        }
         else {
             GDL_DOCK_ITEM_UNSET_FLAGS (user_data, GDL_DOCK_USER_ACTION);
             if (paned->position_changed) {
@@ -573,7 +699,7 @@
                 gtk_paned_pack1 (paned, GTK_WIDGET (requestor), hresize, FALSE);
                 done = TRUE;
             } else if (!child2 && position == GDL_DOCK_BOTTOM) {
-                gtk_paned_pack2 (paned, GTK_WIDGET (requestor), hresize, FALSE);
+                gtk_paned_pack2 (paned, GTK_WIDGET (requestor), TRUE, FALSE);
                 done = TRUE;
             }
             break;
@@ -675,4 +801,3 @@
     
     return GTK_WIDGET (paned);
 }
-
diff -u /home/alex/devel/gdl/gdl/gdl-dock-paned.h src/libgdl//gdl-dock-paned.h
--- /home/alex/devel/gdl/gdl/gdl-dock-paned.h	2011-12-22 16:14:27.748702753 +0000
+++ src/libgdl//gdl-dock-paned.h	2011-12-22 16:01:14.100701369 +0000
@@ -44,6 +44,8 @@
     GdlDockItem  dock_item;
 
     gboolean     position_changed;
+    gboolean     in_drag;
+    gint         last_drag_position;
 };
 
 struct _GdlDockPanedClass {
diff -u /home/alex/devel/gdl/gdl/gdl-dock-placeholder.c src/libgdl//gdl-dock-placeholder.c
--- /home/alex/devel/gdl/gdl/gdl-dock-placeholder.c	2011-12-22 16:14:27.748702753 +0000
+++ src/libgdl//gdl-dock-placeholder.c	2011-12-22 16:01:20.956701378 +0000
@@ -331,7 +331,7 @@
                           GtkWidget    *widget)
 {
     GdlDockPlaceholder *ph;
-    GdlDockPlacement    pos = GDL_DOCK_CENTER;   /* default position */
+    GdlDockPlacement    pos = GDL_DOCK_TOP;   /* default position */
     
     g_return_if_fail (GDL_IS_DOCK_PLACEHOLDER (container));
     g_return_if_fail (GDL_IS_DOCK_ITEM (widget));
diff -u /home/alex/devel/gdl/gdl/gdl-i18n.c src/libgdl//gdl-i18n.c
--- /home/alex/devel/gdl/gdl/gdl-i18n.c	2011-12-22 16:14:27.752702752 +0000
+++ src/libgdl//gdl-i18n.c	2011-12-22 16:01:36.500701408 +0000
@@ -32,7 +32,7 @@
 	static gboolean initialized = FALSE;
 
 	if (!initialized) {
-		bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR);
+/* 		bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR); */
 		bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8");
 		initialized = TRUE;
 	}
diff -u /home/alex/devel/gdl/gdl/gdl-switcher.c src/libgdl//gdl-switcher.c
--- /home/alex/devel/gdl/gdl/gdl-switcher.c	2011-12-22 16:14:27.752702752 +0000
+++ src/libgdl//gdl-switcher.c	2011-12-22 16:01:48.460701425 +0000
@@ -50,6 +50,7 @@
                                       const gchar *label,
                                       const gchar *tooltips,
                                       const gchar *stock_id,
+                                      const GdkPixbuf *pixbuf_icon,
                                       gint switcher_id,
                                       GtkWidget *page);
 /* static void gdl_switcher_remove_button (GdlSwitcher *switcher, gint switcher_id); */
@@ -665,10 +666,12 @@
                             gint page_num, GdlSwitcher *switcher)
 {
     gint         switcher_id;
- 
+
+    (void)nb;
+    (void)page_num;
     switcher_id = gdl_switcher_get_page_id (page);
     
-    gdl_switcher_add_button (GDL_SWITCHER (switcher), NULL, NULL, NULL,
+    gdl_switcher_add_button (GDL_SWITCHER (switcher), NULL, NULL, NULL, NULL,
                              switcher_id, page);
     gdl_switcher_select_button (GDL_SWITCHER (switcher), switcher_id);
 }
@@ -779,6 +782,7 @@
 void
 gdl_switcher_add_button (GdlSwitcher *switcher, const gchar *label,
                          const gchar *tooltips, const gchar *stock_id,
+			 const GdkPixbuf *pixbuf_icon,
                          gint switcher_id, GtkWidget* page)
 {
     GtkWidget *event_box;
@@ -801,7 +805,14 @@
     gtk_container_add (GTK_CONTAINER (button_widget), hbox);
     gtk_widget_show (hbox);
 
-    icon_widget = gtk_image_new_from_stock (stock_id, GTK_ICON_SIZE_MENU);
+    if (stock_id) {
+        icon_widget = gtk_image_new_from_stock (stock_id, GTK_ICON_SIZE_MENU);
+    } else if (pixbuf_icon) {
+        icon_widget = gtk_image_new_from_pixbuf (pixbuf_icon);
+    } else {
+        icon_widget = gtk_image_new_from_stock (GTK_STOCK_NEW, GTK_ICON_SIZE_MENU);
+    }
+
     gtk_widget_show (icon_widget);
     
     if (!label) {
@@ -879,7 +890,7 @@
 gdl_switcher_insert_page (GdlSwitcher *switcher, GtkWidget *page,
                           GtkWidget *tab_widget, const gchar *label,
                           const gchar *tooltips, const gchar *stock_id,
-                          gint position)
+                          const GdkPixbuf *pixbuf_icon, gint position)
 {
     gint ret_position;
     gint switcher_id;
@@ -892,7 +903,7 @@
         gtk_widget_show (tab_widget);
     }
     switcher_id = gdl_switcher_get_page_id (page);
-    gdl_switcher_add_button (switcher, label, tooltips, stock_id, switcher_id, page);
+    gdl_switcher_add_button (switcher, label, tooltips, stock_id, pixbuf_icon, switcher_id, page);
     
     ret_position = gtk_notebook_insert_page (GTK_NOTEBOOK (switcher), page,
                                              tab_widget, position);
diff -u /home/alex/devel/gdl/gdl/gdl-switcher.h src/libgdl//gdl-switcher.h
--- /home/alex/devel/gdl/gdl/gdl-switcher.h	2011-12-22 16:14:27.752702752 +0000
+++ src/libgdl//gdl-switcher.h	2011-12-22 16:01:48.460701425 +0000
@@ -60,6 +60,7 @@
                                       const gchar *label,
                                       const gchar *tooltips,
                                       const gchar *stock_id,
+                                      const GdkPixbuf *pixbuf_icon,
                                       gint position);
 G_END_DECLS
 
diff -u /home/alex/devel/gdl/gdl/libgdlmarshal.list src/libgdl//libgdlmarshal.list
--- /home/alex/devel/gdl/gdl/libgdlmarshal.list	2011-12-22 16:14:27.752702752 +0000
+++ src/libgdl//libgdlmarshal.list	2011-12-22 16:02:08.916701464 +0000
@@ -1,4 +1,5 @@
 VOID:VOID
+VOID:ENUM
 VOID:INT,INT
 VOID:UINT,UINT
 VOID:BOOLEAN
