diff --git a/src/sheet-control-gui.c b/src/sheet-control-gui.c
index c3d1636..ce5fed3 100644
--- a/src/sheet-control-gui.c
+++ b/src/sheet-control-gui.c
@@ -62,7 +62,6 @@
 #include "item-bar.h"
 #include "item-cursor.h"
 #include "widgets/gnumeric-expr-entry.h"
-#include "widgets/widget-editable-label.h"
 #include "gnm-sheet-slicer.h"
 
 #include <go-data-slicer-field.h>
@@ -1711,14 +1710,21 @@ sheet_control_gui_new (SheetView *sv, WBCGtk *wbcg)
 		}
 	}
 
-	scg->label = editable_label_new
-		(sheet->name_unquoted,
-		 sheet->tab_color
-		 ? go_color_to_gdk_rgba (sheet->tab_color->go_color, &cback)
-		 : NULL,
-		 sheet->tab_text_color
-		 ? go_color_to_gdk_rgba (sheet->tab_text_color->go_color, &cfore)
-		 : NULL);
+	scg->label = g_object_new
+		(GNM_NOTEBOOK_BUTTON_TYPE,
+		 "label", sheet->name_unquoted,
+		 //"valign", GTK_ALIGN_START,
+		 "background-color",
+		 (sheet->tab_color
+		  ? go_color_to_gdk_rgba (sheet->tab_color->go_color,
+					  &cback)
+		  : NULL),
+		 "text-color",
+		 (sheet->tab_text_color
+		  ? go_color_to_gdk_rgba (sheet->tab_text_color->go_color,
+					  &cfore)
+		  : NULL),
+		 NULL);
 	g_object_ref (scg->label);
 
 	return scg;
diff --git a/src/wbc-gtk-actions.c b/src/wbc-gtk-actions.c
index 20af87c..9d3fbb3 100644
--- a/src/wbc-gtk-actions.c
+++ b/src/wbc-gtk-actions.c
@@ -70,7 +70,6 @@
 #include <goffice/goffice.h>
 #include <goffice/component/goffice-component.h>
 
-#include "widgets/widget-editable-label.h"
 #include <gtk/gtk.h>
 #include <glib/gi18n-lib.h>
 #include <gsf/gsf-input.h>
@@ -918,8 +917,10 @@ static GNM_ACTION_DEF (cb_insert_comment)
 
 static GNM_ACTION_DEF (cb_sheet_name)
 {
+#if 0
 	SheetControlGUI *scg = wbcg_cur_scg(wbcg);
 	editable_label_start_editing (EDITABLE_LABEL(scg->label));
+#endif
 }
 
 static GNM_ACTION_DEF (cb_sheet_order)		{ dialog_sheet_order (wbcg); }
diff --git a/src/wbc-gtk.c b/src/wbc-gtk.c
index 7a2bcc1..2f54307 100644
--- a/src/wbc-gtk.c
+++ b/src/wbc-gtk.c
@@ -49,7 +49,6 @@
 #include "style-border.h"
 #include "gnumeric-conf.h"
 #include "dialogs/dialogs.h"
-#include "widgets/widget-editable-label.h"
 #include "widgets/gnm-fontbutton.h"
 #include "gui-clipboard.h"
 #include "libgnumeric.h"
@@ -382,8 +381,8 @@ wbcg_update_action_sensitivity (WorkbookControl *wbc)
 		for (i = 0; i < N; i++) {
 			GtkWidget *label =
 				gnm_notebook_get_nth_label (wbcg->bnotebook, i);
-			editable_label_set_editable (EDITABLE_LABEL (label),
-						     enable_actions);
+			g_object_set_data (G_OBJECT (label), "editable",
+					   GINT_TO_POINTER (enable_actions));
 		}
 	}
 
@@ -415,6 +414,7 @@ wbcg_update_action_sensitivity (WorkbookControl *wbc)
 	}
 }
 
+#if 0
 static gboolean
 cb_sheet_label_edit_finished (EditableLabel *el, char const *new_name,
 			      WBCGtk *wbcg)
@@ -431,6 +431,7 @@ cb_sheet_label_edit_finished (EditableLabel *el, char const *new_name,
 	wbcg_focus_cur_scg (wbcg);
 	return reject;
 }
+#endif
 
 void
 wbcg_insert_sheet (GtkWidget *unused, WBCGtk *wbcg)
@@ -490,7 +491,11 @@ static void cb_sheets_manage (SheetControlGUI *scg) { dialog_sheet_order (scg->w
 static void cb_sheets_insert (SheetControlGUI *scg) { wbcg_insert_sheet (NULL, scg->wbcg); }
 static void cb_sheets_add    (SheetControlGUI *scg) { wbcg_append_sheet (NULL, scg->wbcg); }
 static void cb_sheets_clone  (SheetControlGUI *scg) { wbcg_clone_sheet  (NULL, scg->wbcg); }
-static void cb_sheets_rename (SheetControlGUI *scg) { editable_label_start_editing (EDITABLE_LABEL(scg->label)); }
+static void cb_sheets_rename (SheetControlGUI *scg) {
+#if 0
+	editable_label_start_editing (EDITABLE_LABEL(scg->label));
+#endif
+}
 static void cb_sheets_resize (SheetControlGUI *scg) { dialog_sheet_resize (scg->wbcg); }
 
 
@@ -586,7 +591,7 @@ sheet_menu_label_run (SheetControlGUI *scg, GdkEventButton *event)
 /**
  * cb_sheet_label_button_press:
  *
- * Invoked when the user has clicked on the EditableLabel widget.
+ * Invoked when the user has clicked on the sheet name widget.
  * This takes care of switching to the notebook that contains the label
  */
 static gboolean
@@ -609,7 +614,7 @@ cb_sheet_label_button_press (GtkWidget *widget, GdkEventButton *event,
 	if (event->button == 3) {
 		if ((scg_wbcg (scg))->edit_line.guru == NULL)
 			scg_object_unselect (scg, NULL);
-		if (editable_label_get_editable (EDITABLE_LABEL (widget))) {
+		if (g_object_get_data (G_OBJECT (widget), "editable")) {
 			sheet_menu_label_run (scg, event);
 			scg_take_focus (scg);
 			return TRUE;
@@ -995,22 +1000,27 @@ wbcg_menu_state_sheet_count (WBCGtk *wbcg)
 static void
 cb_sheet_tab_change (Sheet *sheet,
 		     G_GNUC_UNUSED GParamSpec *pspec,
-		     EditableLabel *el)
+		     GtkWidget *widget)
 {
 	GdkRGBA cfore, cback;
-	SheetControlGUI *scg = get_scg (GTK_WIDGET (el));
+	SheetControlGUI *scg = get_scg (widget);
 
 	g_return_if_fail (IS_SHEET_CONTROL_GUI (scg));
 
 	/* We're lazy and just set all relevant attributes.  */
-	editable_label_set_text (el, sheet->name_unquoted);
-	editable_label_set_color (el,
-				  sheet->tab_color
-				  ? go_color_to_gdk_rgba (sheet->tab_color->go_color, &cback)
-				  : NULL,
-				  sheet->tab_text_color
-				  ? go_color_to_gdk_rgba (sheet->tab_text_color->go_color, &cfore)
-				  : NULL);
+	g_object_set (widget,
+		      "label", sheet->name_unquoted,
+		      "background-color",
+		      (sheet->tab_color
+		       ? go_color_to_gdk_rgba (sheet->tab_color->go_color,
+					       &cback)
+		       : NULL),
+		      "text-color",
+		      (sheet->tab_text_color
+		       ? go_color_to_gdk_rgba (sheet->tab_text_color->go_color,
+					       &cfore)
+		       : NULL),
+		      NULL);
 }
 
 static void
@@ -1103,9 +1113,11 @@ wbcg_sheet_add (WorkbookControl *wbc, SheetView *sv)
 	g_object_set_data (G_OBJECT (scg->grid), SHEET_CONTROL_KEY, scg);
 
 	g_object_set_data (G_OBJECT (scg->label), SHEET_CONTROL_KEY, scg);
+#if 0
 	g_signal_connect_after (G_OBJECT (scg->label),
 				"edit_finished",
 				G_CALLBACK (cb_sheet_label_edit_finished), wbcg);
+#endif
 
 	/* do not preempt the editable label handler */
 	g_signal_connect_after (G_OBJECT (scg->label),
diff --git a/src/widgets/gnm-notebook.c b/src/widgets/gnm-notebook.c
index 9765285..4fa7f62 100644
--- a/src/widgets/gnm-notebook.c
+++ b/src/widgets/gnm-notebook.c
@@ -21,8 +21,262 @@
 
 #include <gnumeric-config.h>
 #include "gnm-notebook.h"
+#include <goffice/goffice.h>
+#include "gnm-i18n.h"
 #include <gsf/gsf-impl-utils.h>
 
+/* ------------------------------------------------------------------------- */
+
+struct GnmNotebookButton_ {
+	/*
+	 * We need to derive from GtkLabel mostly for theming reasons,
+	 * but GtkLabel is also special for clipping.
+	 */
+	GtkLabel base;
+
+	PangoLayout *layout;
+	PangoLayout *layout_active;
+
+	int x_offset, x_offset_active;
+
+	GdkRGBA *fg, *bg;
+};
+
+typedef struct {
+	GtkLabelClass parent_class;
+} GnmNotebookButtonClass;
+
+static GObjectClass *gnm_notebook_button_parent_class;
+
+enum {
+	NBB_PROP_0,
+	NBB_PROP_BACKGROUND_COLOR,
+	NBB_PROP_TEXT_COLOR
+};
+
+static void
+gnm_notebook_button_finalize (GObject *obj)
+{
+	GnmNotebookButton *nbb = GNM_NOTEBOOK_BUTTON (obj);
+	g_clear_object (&nbb->layout);
+	g_clear_object (&nbb->layout_active);
+	gdk_rgba_free (nbb->fg);
+	gdk_rgba_free (nbb->bg);
+	gnm_notebook_button_parent_class->finalize (obj);
+}
+
+static void
+gnm_notebook_button_set_property (GObject      *obj,
+				  guint         prop_id,
+				  const GValue *value,
+				  GParamSpec   *pspec)
+{
+	GnmNotebookButton *nbb = GNM_NOTEBOOK_BUTTON (obj);
+
+	switch (prop_id) {
+	case NBB_PROP_BACKGROUND_COLOR:
+		gdk_rgba_free (nbb->bg);
+		nbb->bg = g_value_dup_boxed (value);
+		gtk_widget_queue_draw (GTK_WIDGET (obj));
+		break;
+	case NBB_PROP_TEXT_COLOR:
+		gdk_rgba_free (nbb->fg);
+		nbb->fg = g_value_dup_boxed (value);
+		gtk_widget_queue_draw (GTK_WIDGET (obj));
+		gtk_widget_override_color (GTK_WIDGET (obj),
+					   GTK_STATE_FLAG_NORMAL,
+					   nbb->fg);
+		gtk_widget_override_color (GTK_WIDGET (obj),
+					   GTK_STATE_FLAG_ACTIVE,
+					   nbb->fg);
+		break;
+	default:
+		G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
+		break;
+	}
+}
+
+static void
+gnm_notebook_button_ensure_layout (GnmNotebookButton *nbb)
+{
+	const char *text = gtk_label_get_text (GTK_LABEL (nbb));
+
+	if (nbb->layout) {
+		/* Optimize?  */
+		pango_layout_set_text (nbb->layout, text, -1);
+		pango_layout_set_text (nbb->layout_active, text, -1);
+	} else {
+		PangoAttrList *attrs = NULL, *attrs_active;
+		PangoAttribute *attr;
+
+		nbb->layout = gtk_widget_create_pango_layout (GTK_WIDGET (nbb), text);
+		nbb->layout_active = gtk_widget_create_pango_layout (GTK_WIDGET (nbb), text);
+
+		if (nbb->bg) {
+			attrs = pango_attr_list_new ();
+
+			attr = go_color_to_pango
+				(go_color_from_gdk_rgba (nbb->bg, NULL),
+				 FALSE);
+			attr->start_index = 0;
+			attr->end_index = -1;
+			pango_attr_list_insert (attrs, attr);
+		}			
+
+		pango_layout_set_attributes (nbb->layout, attrs);
+
+		attrs_active = attrs
+			? pango_attr_list_copy (attrs)
+			: pango_attr_list_new ();
+		attr = pango_attr_weight_new (PANGO_WEIGHT_BOLD);
+		attr->start_index = 0;
+		attr->end_index = -1;
+		pango_attr_list_insert (attrs_active, attr);
+		pango_layout_set_attributes (nbb->layout_active, attrs_active);
+		
+		if (attrs) pango_attr_list_unref (attrs);
+		pango_attr_list_unref (attrs_active);
+	}
+}
+
+static void
+gnm_notebook_button_screen_changed (GtkWidget *widget, G_GNUC_UNUSED GdkScreen *prev)
+{
+	GnmNotebookButton *nbb = GNM_NOTEBOOK_BUTTON (widget);
+	g_clear_object (&nbb->layout);
+}
+
+static gboolean
+gnm_notebook_button_draw (GtkWidget *widget, cairo_t *cr)
+{
+	GnmNotebookButton *nbb = GNM_NOTEBOOK_BUTTON (widget);
+	GnmNotebook *nb = GNM_NOTEBOOK (gtk_widget_get_parent (widget));
+	GtkStyleContext *context = gtk_widget_get_style_context (widget);
+	gboolean is_active = (widget == gnm_notebook_get_current_label (nb));
+	GtkStateFlags state =
+		is_active ? GTK_STATE_FLAG_ACTIVE : GTK_STATE_FLAG_NORMAL;
+	GtkBorder padding;
+
+	gtk_style_context_save (context);
+	gtk_style_context_set_state (context, state);
+
+	gtk_style_context_get_padding (context, state, &padding);
+
+	gnm_notebook_button_ensure_layout (nbb);
+
+	gtk_render_layout (context, cr,
+			   padding.left + (is_active ? nbb->x_offset_active : nbb->x_offset),
+			   0,
+			   is_active ? nbb->layout_active : nbb->layout);
+
+	gtk_style_context_restore (context);
+	return FALSE;
+}
+
+static GtkSizeRequestMode 
+gnm_notebook_button_get_request_mode (GtkWidget *widget)
+{ 
+	return GTK_SIZE_REQUEST_CONSTANT_SIZE;
+}
+
+static void
+gnm_notebook_button_get_preferred_height (GtkWidget *widget,
+					  gint      *minimum,
+					  gint      *natural)
+{
+	GnmNotebookButton *nbb = GNM_NOTEBOOK_BUTTON (widget);
+	PangoRectangle logical, logical_active;
+	GtkBorder padding;
+
+	gtk_style_context_get_padding (gtk_widget_get_style_context (widget),
+				       GTK_STATE_FLAG_NORMAL,
+				       &padding);
+
+	gnm_notebook_button_ensure_layout (nbb);
+	pango_layout_get_extents (nbb->layout, NULL, &logical);
+	pango_layout_get_extents (nbb->layout_active, NULL, &logical_active);
+
+	*minimum = *natural =
+		(padding.top +
+		 PANGO_PIXELS_CEIL (MAX (logical.height, logical_active.height)) +
+		 padding.bottom);
+}
+
+static void
+gnm_notebook_button_get_preferred_width (GtkWidget *widget,
+					 gint      *minimum,
+					 gint      *natural)
+{
+	GnmNotebookButton *nbb = GNM_NOTEBOOK_BUTTON (widget);
+	PangoRectangle logical, logical_active;
+	GtkBorder padding;
+	int dx;
+
+	gtk_style_context_get_padding (gtk_widget_get_style_context (widget),
+				       GTK_STATE_FLAG_NORMAL,
+				       &padding);
+
+	gnm_notebook_button_ensure_layout (nbb);
+	pango_layout_get_extents (nbb->layout, NULL, &logical);
+	pango_layout_get_extents (nbb->layout_active, NULL, &logical_active);
+
+	dx = logical_active.width - logical.width;
+	nbb->x_offset = PANGO_PIXELS (MAX (0, dx / 2));
+	nbb->x_offset_active = PANGO_PIXELS (MAX (0, -dx / 2));
+
+	*minimum = *natural =
+		(padding.left +
+		 PANGO_PIXELS_CEIL (MAX (logical.width, logical_active.width)) +
+		 padding.right);
+}
+
+static void
+gnm_notebook_button_class_init (GObjectClass *klass)
+{
+	GtkWidgetClass *wclass = (GtkWidgetClass *)klass;
+
+	gnm_notebook_button_parent_class = g_type_class_peek_parent (klass);
+	klass->finalize = gnm_notebook_button_finalize;
+	klass->set_property = gnm_notebook_button_set_property;
+
+	g_object_class_install_property
+		(klass,
+		 NBB_PROP_BACKGROUND_COLOR,
+		 g_param_spec_boxed ("background-color",
+				     P_("Background Color"),
+				     P_("Override color to use for background"),
+				     GDK_TYPE_RGBA,
+				     G_PARAM_WRITABLE));
+	g_object_class_install_property
+		(klass,
+		 NBB_PROP_TEXT_COLOR,
+		 g_param_spec_boxed ("text-color",
+				     P_("Text Color"),
+				     P_("Override color to use for label"),
+				     GDK_TYPE_RGBA,
+				     G_PARAM_WRITABLE));
+
+	wclass->draw = gnm_notebook_button_draw;
+	wclass->screen_changed = gnm_notebook_button_screen_changed;
+	wclass->get_request_mode = gnm_notebook_button_get_request_mode;
+	wclass->get_preferred_width = gnm_notebook_button_get_preferred_width;
+	wclass->get_preferred_height = gnm_notebook_button_get_preferred_height;
+}
+
+static void
+gnm_notebook_button_init (GnmNotebookButton *nbb)
+{
+}
+
+GSF_CLASS (GnmNotebookButton, gnm_notebook_button,
+	   gnm_notebook_button_class_init,
+	   gnm_notebook_button_init, GTK_TYPE_LABEL)
+#if 0
+	;
+#endif
+
+/* ------------------------------------------------------------------------- */
+
 struct _GnmNotebook {
 	GtkNotebook parent;
 
@@ -117,6 +371,17 @@ gnm_notebook_get_nth_label (GnmNotebook *nb, int n)
 	return gtk_notebook_get_tab_label (GTK_NOTEBOOK (nb), page);
 }
 
+GtkWidget *
+gnm_notebook_get_current_label (GnmNotebook *nb)
+{
+	int i;
+
+	g_return_val_if_fail (GNM_IS_NOTEBOOK (nb), NULL);
+
+	i = gtk_notebook_get_current_page (GTK_NOTEBOOK (nb));
+	return i == -1 ? NULL : gnm_notebook_get_nth_label (nb, i);
+}
+
 static void
 cb_label_destroyed (G_GNUC_UNUSED GtkWidget *label, GtkWidget *dummy)
 {
diff --git a/src/widgets/gnm-notebook.h b/src/widgets/gnm-notebook.h
index e880c8c..82b3f8d 100644
--- a/src/widgets/gnm-notebook.h
+++ b/src/widgets/gnm-notebook.h
@@ -23,6 +23,12 @@
 
 #include <gtk/gtk.h>
 
+GType		gnm_notebook_button_get_type	(void);
+typedef struct GnmNotebookButton_ GnmNotebookButton;
+#define GNM_NOTEBOOK_BUTTON_TYPE        (gnm_notebook_button_get_type ())
+#define GNM_NOTEBOOK_BUTTON(obj)        (G_TYPE_CHECK_INSTANCE_CAST((obj), GNM_NOTEBOOK_BUTTON_TYPE, GnmNotebookButton))
+#define GNM_IS_NOTEBOOK_BUTTON(obj)     (G_TYPE_CHECK_INSTANCE_TYPE((obj), GNM_NOTEBOOK_BUTTON_TYPE))
+
 #define GNM_NOTEBOOK_TYPE        (gnm_notebook_get_type ())
 #define GNM_NOTEBOOK(obj)        (G_TYPE_CHECK_INSTANCE_CAST((obj), GNM_NOTEBOOK_TYPE, GnmNotebook))
 #define GNM_IS_NOTEBOOK(obj)     (G_TYPE_CHECK_INSTANCE_TYPE((obj), GNM_NOTEBOOK_TYPE))
@@ -33,6 +39,7 @@ GType		gnm_notebook_get_type	(void);
 
 int             gnm_notebook_get_n_visible (GnmNotebook *nb);
 GtkWidget *     gnm_notebook_get_nth_label (GnmNotebook *nb, int n);
+GtkWidget *     gnm_notebook_get_current_label (GnmNotebook *nb);
 void            gnm_notebook_insert_tab (GnmNotebook *nb, GtkWidget *label,
 					 int pos);
 void            gnm_notebook_move_tab (GnmNotebook *nb, GtkWidget *label, int newpos);
