diff --git a/docs/reference/gtk/gtk-sections.txt b/docs/reference/gtk/gtk-sections.txt
index 4d0690d..311bab2 100644
--- a/docs/reference/gtk/gtk-sections.txt
+++ b/docs/reference/gtk/gtk-sections.txt
@@ -3946,10 +3946,13 @@ gtk_toggle_button_get_type
 <TITLE>GtkToolShell</TITLE>
 GtkToolShell
 GtkToolShellIface
+gtk_tool_shell_get_ellipsize_mode
 gtk_tool_shell_get_icon_size
 gtk_tool_shell_get_orientation
 gtk_tool_shell_get_relief_style
 gtk_tool_shell_get_style
+gtk_tool_shell_get_text_alignment
+gtk_tool_shell_get_text_orientation
 gtk_tool_shell_rebuild_menu
 
 <SUBSECTION Standard>
@@ -4037,10 +4040,13 @@ gtk_tool_item_set_visible_vertical
 gtk_tool_item_get_visible_vertical
 gtk_tool_item_set_is_important
 gtk_tool_item_get_is_important
+gtk_tool_item_get_ellipsize_mode
 gtk_tool_item_get_icon_size
 gtk_tool_item_get_orientation
 gtk_tool_item_get_toolbar_style
 gtk_tool_item_get_relief_style
+gtk_tool_item_get_text_alignment
+gtk_tool_item_get_text_orientation
 gtk_tool_item_retrieve_proxy_menu_item
 gtk_tool_item_get_proxy_menu_item
 gtk_tool_item_set_proxy_menu_item
diff --git a/gtk/gtk.symbols b/gtk/gtk.symbols
index 3b3c65c..64c043f 100644
--- a/gtk/gtk.symbols
+++ b/gtk/gtk.symbols
@@ -4076,10 +4076,14 @@ gtk_toolbar_unset_style
 #if IN_HEADER(__GTK_TOOL_SHELL_H__)
 #if IN_FILE(__GTK_TOOL_SHELL_C__)
 gtk_tool_shell_get_type G_GNUC_CONST
+gtk_tool_shell_get_ellipsize_mode
 gtk_tool_shell_get_icon_size
 gtk_tool_shell_get_orientation
 gtk_tool_shell_get_style
 gtk_tool_shell_get_relief_style
+gtk_tool_shell_get_text_alignment
+gtk_tool_shell_get_text_orientation
+gtk_tool_shell_get_text_size_group
 gtk_tool_shell_rebuild_menu
 #endif
 #endif
@@ -4106,6 +4110,7 @@ gtk_tool_button_set_use_underline
 
 #if IN_HEADER(__GTK_TOOL_ITEM_H__)
 #if IN_FILE(__GTK_TOOL_ITEM_C__)
+gtk_tool_item_get_ellipsize_mode
 gtk_tool_item_get_expand
 gtk_tool_item_get_homogeneous
 gtk_tool_item_get_icon_size
@@ -4113,6 +4118,9 @@ gtk_tool_item_get_is_important
 gtk_tool_item_get_orientation
 gtk_tool_item_get_proxy_menu_item
 gtk_tool_item_get_relief_style
+gtk_tool_item_get_text_alignment
+gtk_tool_item_get_text_orientation
+gtk_tool_item_get_text_size_group
 gtk_tool_item_get_toolbar_style
 gtk_tool_item_get_type G_GNUC_CONST
 gtk_tool_item_get_use_drag_window
diff --git a/gtk/gtktoolbutton.c b/gtk/gtktoolbutton.c
index a38da3a..0970155 100644
--- a/gtk/gtktoolbutton.c
+++ b/gtk/gtktoolbutton.c
@@ -92,7 +92,9 @@ struct _GtkToolButtonPrivate
   gchar *label_text;
   GtkWidget *label_widget;
   GtkWidget *icon_widget;
-  
+
+  GtkSizeGroup *text_size_group;
+
   guint use_underline : 1;
   guint contents_invalid : 1;
 };
@@ -296,6 +298,8 @@ gtk_tool_button_construct_contents (GtkToolItem *tool_item)
   GtkIconSize icon_size;
   GtkWidget *box = NULL;
   guint icon_spacing;
+  GtkOrientation text_orientation = GTK_ORIENTATION_HORIZONTAL;
+  GtkSizeGroup *size_group = NULL;
 
   button->priv->contents_invalid = FALSE;
 
@@ -333,7 +337,8 @@ gtk_tool_button_construct_contents (GtkToolItem *tool_item)
 
   if (style == GTK_TOOLBAR_BOTH_HORIZ &&
       (gtk_tool_item_get_is_important (GTK_TOOL_ITEM (button)) ||
-       gtk_tool_item_get_orientation (GTK_TOOL_ITEM (button)) == GTK_ORIENTATION_VERTICAL))
+       gtk_tool_item_get_orientation (GTK_TOOL_ITEM (button)) == GTK_ORIENTATION_VERTICAL ||
+       gtk_tool_item_get_text_orientation (GTK_TOOL_ITEM (button)) == GTK_ORIENTATION_VERTICAL))
     {
       need_label = TRUE;
     }
@@ -392,7 +397,30 @@ gtk_tool_button_construct_contents (GtkToolItem *tool_item)
 	  g_free (label_text);
 	  
 	  gtk_widget_show (label);
+
+	  size_group = gtk_tool_item_get_text_size_group (GTK_TOOL_ITEM (button));
+	  if (size_group != NULL)
+	    gtk_size_group_add_widget (size_group, label);
 	}
+
+      gtk_label_set_ellipsize (GTK_LABEL (label),
+			       gtk_tool_item_get_ellipsize_mode (GTK_TOOL_ITEM (button)));
+      text_orientation = gtk_tool_item_get_text_orientation (GTK_TOOL_ITEM (button));
+      if (text_orientation == GTK_ORIENTATION_HORIZONTAL)
+	{
+          gtk_label_set_angle (GTK_LABEL (label), 0);
+          gtk_misc_set_alignment (GTK_MISC (label),
+                                  gtk_tool_item_get_text_alignment (GTK_TOOL_ITEM (button)),
+                                  0.5);
+        }
+      else
+        {
+          gtk_label_set_ellipsize (GTK_LABEL (label), PANGO_ELLIPSIZE_NONE);
+          gtk_label_set_angle (GTK_LABEL (label), 90);
+          gtk_misc_set_alignment (GTK_MISC (label),
+                                  0.5,
+                                  1 - gtk_tool_item_get_text_alignment (GTK_TOOL_ITEM (button)));
+        }
     }
 
   icon_size = gtk_tool_item_get_icon_size (GTK_TOOL_ITEM (button));
@@ -420,6 +448,15 @@ gtk_tool_button_construct_contents (GtkToolItem *tool_item)
 	  icon = gtk_image_new_from_icon_name (button->priv->icon_name, icon_size);
 	  gtk_widget_show (icon);
 	}
+
+      if (icon && text_orientation == GTK_ORIENTATION_HORIZONTAL)
+	gtk_misc_set_alignment (GTK_MISC (icon),
+				1.0 - gtk_tool_item_get_text_alignment (GTK_TOOL_ITEM (button)),
+				0.5);
+      else if (icon)
+	gtk_misc_set_alignment (GTK_MISC (icon),
+				0.5,
+				gtk_tool_item_get_text_alignment (GTK_TOOL_ITEM (button)));
     }
 
   switch (style)
@@ -430,19 +467,33 @@ gtk_tool_button_construct_contents (GtkToolItem *tool_item)
       break;
 
     case GTK_TOOLBAR_BOTH:
-      box = gtk_vbox_new (FALSE, icon_spacing);
+      if (text_orientation == GTK_ORIENTATION_HORIZONTAL)
+	box = gtk_vbox_new (FALSE, icon_spacing);
+      else
+	box = gtk_hbox_new (FALSE, icon_spacing);
       if (icon)
 	gtk_box_pack_start (GTK_BOX (box), icon, TRUE, TRUE, 0);
-      gtk_box_pack_start (GTK_BOX (box), label, FALSE, TRUE, 0);
+      gtk_box_pack_end (GTK_BOX (box), label, FALSE, TRUE, 0);
       gtk_container_add (GTK_CONTAINER (button->priv->button), box);
       break;
 
     case GTK_TOOLBAR_BOTH_HORIZ:
-      box = gtk_hbox_new (FALSE, icon_spacing);
-      if (icon)
-	gtk_box_pack_start (GTK_BOX (box), icon, label? FALSE : TRUE, TRUE, 0);
-      if (label)
-	gtk_box_pack_start (GTK_BOX (box), label, TRUE, TRUE, 0);
+      if (text_orientation == GTK_ORIENTATION_HORIZONTAL)
+	{
+	  box = gtk_hbox_new (FALSE, icon_spacing);
+	  if (icon)
+	    gtk_box_pack_start (GTK_BOX (box), icon, label && !size_group? FALSE : TRUE, TRUE, 0);
+	  if (label)
+	    gtk_box_pack_end (GTK_BOX (box), label, size_group ? FALSE : TRUE, TRUE, 0);
+	}
+      else
+	{
+	  box = gtk_vbox_new (FALSE, icon_spacing);
+	  if (icon)
+	    gtk_box_pack_end (GTK_BOX (box), icon, label && !size_group? FALSE : TRUE, TRUE, 0);
+	  if (label)
+	    gtk_box_pack_start (GTK_BOX (box), label, size_group ? FALSE : TRUE, TRUE, 0);
+	}
       gtk_container_add (GTK_CONTAINER (button->priv->button), box);
       break;
 
diff --git a/gtk/gtktoolitem.c b/gtk/gtktoolitem.c
index 48e1f52..05ec399 100644
--- a/gtk/gtktoolitem.c
+++ b/gtk/gtktoolitem.c
@@ -524,6 +524,33 @@ gtk_tool_item_new (void)
 }
 
 /**
+ * gtk_tool_item_get_ellipsize_mode:
+ * @tool_item: a #GtkToolItem: 
+ * 
+ * Returns the ellipsize mode used for @tool_item. Custom subclasses of
+ * #GtkToolItem should call this function to find out how text should
+ * be ellipsized.
+ * 
+ * Return value: a #PangoEllipsizeMode indicating how text in @tool_item
+ * should be ellipsized.
+ * 
+ * Since: 2.14
+ **/
+PangoEllipsizeMode
+gtk_tool_item_get_ellipsize_mode (GtkToolItem *tool_item)
+{
+  GtkWidget *parent;
+  
+  g_return_val_if_fail (GTK_IS_TOOL_ITEM (tool_item), GTK_ORIENTATION_HORIZONTAL);
+
+  parent = GTK_WIDGET (tool_item)->parent;
+  if (!parent || !GTK_IS_TOOL_SHELL (parent))
+    return PANGO_ELLIPSIZE_NONE;
+
+  return gtk_tool_shell_get_ellipsize_mode (GTK_TOOL_SHELL (parent));
+}
+
+/**
  * gtk_tool_item_get_icon_size:
  * @tool_item: a #GtkToolItem:
  * 
@@ -648,6 +675,85 @@ gtk_tool_item_get_relief_style (GtkToolItem *tool_item)
 }
 
 /**
+ * gtk_tool_item_get_text_alignment:
+ * @tool_item: a #GtkToolItem: 
+ * 
+ * Returns the text alignment used for @tool_item. Custom subclasses of
+ * #GtkToolItem should call this function to find out how text should
+ * be aligned.
+ * 
+ * Return value: a #gfloat indicating the horizontal text alignment
+ * used for @tool_item
+ * 
+ * Since: 2.14
+ **/
+gfloat
+gtk_tool_item_get_text_alignment (GtkToolItem *tool_item)
+{
+  GtkWidget *parent;
+  
+  g_return_val_if_fail (GTK_IS_TOOL_ITEM (tool_item), GTK_ORIENTATION_HORIZONTAL);
+
+  parent = GTK_WIDGET (tool_item)->parent;
+  if (!parent || !GTK_IS_TOOL_SHELL (parent))
+    return 0.5;
+
+  return gtk_tool_shell_get_text_alignment (GTK_TOOL_SHELL (parent));
+}
+
+/**
+ * gtk_tool_item_get_text_orientation:
+ * @tool_item: a #GtkToolItem: 
+ * 
+ * Returns the text orientation used for @tool_item. Custom subclasses of
+ * #GtkToolItem should call this function to find out how text should
+ * be orientated.
+ * 
+ * Return value: a #GtkOrientation indicating the text orientation
+ * used for @tool_item
+ * 
+ * Since: 2.14
+ **/
+GtkOrientation
+gtk_tool_item_get_text_orientation (GtkToolItem *tool_item)
+{
+  GtkWidget *parent;
+  
+  g_return_val_if_fail (GTK_IS_TOOL_ITEM (tool_item), GTK_ORIENTATION_HORIZONTAL);
+
+  parent = GTK_WIDGET (tool_item)->parent;
+  if (!parent || !GTK_IS_TOOL_SHELL (parent))
+    return GTK_ORIENTATION_HORIZONTAL;
+
+  return gtk_tool_shell_get_text_orientation (GTK_TOOL_SHELL (parent));
+}
+
+/**
+ * gtk_tool_item_get_text_size_group:
+ * @tool_item: a #GtkToolItem: 
+ * 
+ * Returns the size group used for labels in @tool_item. Custom subclasses of
+ * #GtkToolItem should call this function and use the size group for labels.
+ * 
+ * Return value: a #GtkSizeGroup
+ * 
+ * Since: 2.14
+ **/
+GtkSizeGroup *
+gtk_tool_item_get_text_size_group (GtkToolItem *tool_item)
+{
+  GtkWidget *parent;
+  
+  g_return_val_if_fail (GTK_IS_TOOL_ITEM (tool_item), GTK_ORIENTATION_HORIZONTAL);
+
+  parent = GTK_WIDGET (tool_item)->parent;
+  if (!parent || !GTK_IS_TOOL_SHELL (parent))
+    return NULL;
+
+  return gtk_tool_shell_get_text_size_group (GTK_TOOL_SHELL (parent));
+}
+
+/**
  * gtk_tool_item_set_expand:
  * @tool_item: a #GtkToolItem: 
  * @expand: Whether @tool_item is allocated extra space
diff --git a/gtk/gtktoolitem.h b/gtk/gtktoolitem.h
index 430c16d..d1dff8b 100644
--- a/gtk/gtktoolitem.h
+++ b/gtk/gtktoolitem.h
@@ -26,6 +26,7 @@
 #include <gtk/gtkbin.h>
 #include <gtk/gtktooltips.h>
 #include <gtk/gtkmenuitem.h>
+#include <gtk/gtksizegroup.h>
 
 G_BEGIN_DECLS
 
@@ -109,10 +110,14 @@ gboolean        gtk_tool_item_get_is_important         (GtkToolItem *tool_item);
 void            gtk_tool_item_set_is_important         (GtkToolItem *tool_item,
 							gboolean     is_important);
 
+PangoEllipsizeMode gtk_tool_item_get_ellipsize_mode    (GtkToolItem *tool_item);
 GtkIconSize     gtk_tool_item_get_icon_size            (GtkToolItem *tool_item);
 GtkOrientation  gtk_tool_item_get_orientation          (GtkToolItem *tool_item);
 GtkToolbarStyle gtk_tool_item_get_toolbar_style        (GtkToolItem *tool_item);
 GtkReliefStyle  gtk_tool_item_get_relief_style         (GtkToolItem *tool_item);
+gfloat          gtk_tool_item_get_text_alignment       (GtkToolItem *tool_item);
+GtkOrientation  gtk_tool_item_get_text_orientation     (GtkToolItem *tool_item);
+GtkSizeGroup *  gtk_tool_item_get_text_size_group      (GtkToolItem *tool_item);
 
 GtkWidget *     gtk_tool_item_retrieve_proxy_menu_item (GtkToolItem *tool_item);
 GtkWidget *     gtk_tool_item_get_proxy_menu_item      (GtkToolItem *tool_item,
diff --git a/gtk/gtktoolshell.c b/gtk/gtktoolshell.c
index 1421820..eac6c50 100644
--- a/gtk/gtktoolshell.c
+++ b/gtk/gtktoolshell.c
@@ -155,5 +155,97 @@ gtk_tool_shell_rebuild_menu (GtkToolShell *shell)
     iface->rebuild_menu (shell);
 }
 
+/**
+ * gtk_tool_shell_get_text_orientation:
+ * @shell: a #GtkToolShell
+ *
+ * Retrieves the current text orientation for the tool shell. Tool items must not
+ * call this function directly, but rely on gtk_tool_item_get_text_orientation()
+ * instead.
+ *
+ * Return value: the current text orientation of @shell
+ *
+ * Since: 2.14
+ **/
+GtkOrientation
+gtk_tool_shell_get_text_orientation (GtkToolShell *shell)
+{
+  GtkToolShellIface *iface = GTK_TOOL_SHELL_GET_IFACE (shell);
+
+  if (iface->get_text_orientation)
+    return GTK_TOOL_SHELL_GET_IFACE (shell)->get_text_orientation (shell);
+
+  return GTK_ORIENTATION_HORIZONTAL;
+}
+
+/**
+ * gtk_tool_shell_get_text_alignment:
+ * @shell: a #GtkToolShell
+ *
+ * Retrieves the current text alignment for the tool shell. Tool items must not
+ * call this function directly, but rely on gtk_tool_item_get_text_alignment()
+ * instead.
+ *
+ * Return value: the current text alignment of @shell
+ *
+ * Since: 2.14
+ **/
+gfloat
+gtk_tool_shell_get_text_alignment (GtkToolShell *shell)
+{
+  GtkToolShellIface *iface = GTK_TOOL_SHELL_GET_IFACE (shell);
+
+  if (iface->get_text_alignment)
+    return GTK_TOOL_SHELL_GET_IFACE (shell)->get_text_alignment (shell);
+
+  return 0.5f;
+}
+
+/**
+ * gtk_tool_shell_get_ellipsize_mode
+ * @shell: a #GtkToolShell
+ *
+ * Retrieves the current ellipsize mode for the tool shell. Tool items must not
+ * call this function directly, but rely on gtk_tool_item_get_ellipsize_mode()
+ * instead.
+ *
+ * Return value: the current ellipsize mode of @shell
+ *
+ * Since: 2.14
+ **/
+PangoEllipsizeMode
+gtk_tool_shell_get_ellipsize_mode (GtkToolShell *shell)
+{
+  GtkToolShellIface *iface = GTK_TOOL_SHELL_GET_IFACE (shell);
+
+  if (iface->get_ellipsize_mode)
+    return GTK_TOOL_SHELL_GET_IFACE (shell)->get_ellipsize_mode (shell);
+
+  return PANGO_ELLIPSIZE_NONE;
+}
+
+/**
+ * gtk_tool_shell_get_text_size_group:
+ * @shell: a #GtkToolShell
+ *
+ * Retrieves the current text size group for the tool shell. Tool items must not
+ * call this function directly, but rely on gtk_tool_item_get_text_size_group()
+ * instead.
+ *
+ * Return value: the current text size group of @shell
+ *
+ * Since: 2.14
+ **/
+GtkSizeGroup *
+gtk_tool_shell_get_text_size_group (GtkToolShell *shell)
+{
+  GtkToolShellIface *iface = GTK_TOOL_SHELL_GET_IFACE (shell);
+
+  if (iface->get_text_size_group)
+    return GTK_TOOL_SHELL_GET_IFACE (shell)->get_text_size_group (shell);
+
+  return NULL;
+}
+
 #define __GTK_TOOL_SHELL_C__
 #include "gtkaliasdef.c"
diff --git a/gtk/gtktoolshell.h b/gtk/gtktoolshell.h
index 684ad89..0812cfc 100644
--- a/gtk/gtktoolshell.h
+++ b/gtk/gtktoolshell.h
@@ -24,6 +24,8 @@
 #define __GTK_TOOL_SHELL_H__
 
 #include <gtk/gtkenums.h>
+#include <pango/pango.h>
+#include <gtk/gtksizegroup.h>
 
 G_BEGIN_DECLS
 
@@ -37,11 +39,15 @@ typedef struct _GtkToolShellIface      GtkToolShellIface;
 
 /**
  * GtkToolShellIface:
- * @get_icon_size:    mandatory implementation of gtk_tool_shell_get_icon_size().
- * @get_orientation:  mandatory implementation of gtk_tool_shell_get_orientation().
- * @get_style:        mandatory implementation of gtk_tool_shell_get_style().
- * @get_relief_style: optional implementation of gtk_tool_shell_get_relief_style().
- * @rebuild_menu:     optional implementation of gtk_tool_shell_rebuild_menu().
+ * @get_icon_size:        mandatory implementation of gtk_tool_shell_get_icon_size().
+ * @get_orientation:      mandatory implementation of gtk_tool_shell_get_orientation().
+ * @get_style:            mandatory implementation of gtk_tool_shell_get_style().
+ * @get_relief_style:     optional implementation of gtk_tool_shell_get_relief_style().
+ * @rebuild_menu:         optional implementation of gtk_tool_shell_rebuild_menu().
+ * @get_text_orientation: optional implementation of gtk_tool_shell_get_text_orientation().
+ * @get_text_alignment:   optional implementation of gtk_tool_shell_get_text_alignment().
+ * @get_ellipsize_mode:   optional implementation of gtk_tool_shell_get_ellipsize_mode().
+ * @get_text_size_group:  optional implementation of gtk_tool_shell_get_text_size_group().
  *
  * Virtual function table for the #GtkToolShell interface.
  */
@@ -51,20 +57,28 @@ struct _GtkToolShellIface
   GTypeInterface g_iface;
 
   /*< public >*/
-  GtkIconSize     (*get_icon_size)    (GtkToolShell *shell);
-  GtkOrientation  (*get_orientation)  (GtkToolShell *shell);
-  GtkToolbarStyle (*get_style)        (GtkToolShell *shell);
-  GtkReliefStyle  (*get_relief_style) (GtkToolShell *shell);
-  void            (*rebuild_menu)     (GtkToolShell *shell);
+  GtkIconSize        (*get_icon_size)        (GtkToolShell *shell);
+  GtkOrientation     (*get_orientation)      (GtkToolShell *shell);
+  GtkToolbarStyle    (*get_style)            (GtkToolShell *shell);
+  GtkReliefStyle     (*get_relief_style)     (GtkToolShell *shell);
+  void               (*rebuild_menu)         (GtkToolShell *shell);
+  GtkOrientation     (*get_text_orientation) (GtkToolShell *shell);
+  gfloat             (*get_text_alignment)   (GtkToolShell *shell);
+  PangoEllipsizeMode (*get_ellipsize_mode)   (GtkToolShell *shell);
+  GtkSizeGroup *     (*get_text_size_group)  (GtkToolShell *shell);
 };
 
-GType           gtk_tool_shell_get_type         (void) G_GNUC_CONST;
+GType              gtk_tool_shell_get_type             (void) G_GNUC_CONST;
 
-GtkIconSize     gtk_tool_shell_get_icon_size    (GtkToolShell *shell);
-GtkOrientation  gtk_tool_shell_get_orientation  (GtkToolShell *shell);
-GtkToolbarStyle gtk_tool_shell_get_style        (GtkToolShell *shell);
-GtkReliefStyle  gtk_tool_shell_get_relief_style (GtkToolShell *shell);
-void            gtk_tool_shell_rebuild_menu     (GtkToolShell *shell);
+GtkIconSize        gtk_tool_shell_get_icon_size        (GtkToolShell *shell);
+GtkOrientation     gtk_tool_shell_get_orientation      (GtkToolShell *shell);
+GtkToolbarStyle    gtk_tool_shell_get_style            (GtkToolShell *shell);
+GtkReliefStyle     gtk_tool_shell_get_relief_style     (GtkToolShell *shell);
+void               gtk_tool_shell_rebuild_menu         (GtkToolShell *shell);
+GtkOrientation     gtk_tool_shell_get_text_orientation (GtkToolShell *shell);
+gfloat             gtk_tool_shell_get_text_alignment   (GtkToolShell *shell);
+PangoEllipsizeMode gtk_tool_shell_get_ellipsize_mode   (GtkToolShell *shell);
+GtkSizeGroup *     gtk_tool_shell_get_text_size_group  (GtkToolShell *shell);
 
 G_END_DECLS
 
