diff -w -r -up gtk+-2.2.2.org/gtk/gtksettings.c gtk+-2.2.2/gtk/gtksettings.c
--- gtk+-2.2.2.org/gtk/gtksettings.c	2003-05-27 17:10:13.000000000 -0400
+++ gtk+-2.2.2/gtk/gtksettings.c	2003-07-22 21:11:04.000000000 -0400
@@ -48,6 +48,7 @@ enum {
   PROP_CURSOR_BLINK,
   PROP_CURSOR_BLINK_TIME,
   PROP_SPLIT_CURSOR,
+  PROP_BACKSPACE_DELETE_SINGLE_GLYPH,
   PROP_THEME_NAME,
   PROP_KEY_THEME_NAME,
   PROP_MENU_BAR_ACCEL,
@@ -196,6 +197,14 @@ gtk_settings_class_init (GtkSettingsClas
                                              NULL);
   g_assert (result == PROP_SPLIT_CURSOR);
   result = settings_install_property_parser (class,
+                                             g_param_spec_boolean ("gtk-backspace-delete-single-glyph",
+								   _("Backspace deletes single glyph"),
+								   _("Whether Backspace should delete a whole cluster or the last glyph of the last cluster"),
+								   FALSE,
+								   G_PARAM_READWRITE),
+                                             NULL);
+  g_assert (result == PROP_BACKSPACE_DELETE_SINGLE_GLYPH);
+  result = settings_install_property_parser (class,
                                              g_param_spec_string ("gtk-theme-name",
 								   _("Theme Name"),
 								   _("Name of theme RC file to load"),
diff -w -r -up gtk+-2.2.2.org/gtk/gtktextview.c gtk+-2.2.2/gtk/gtktextview.c
--- gtk+-2.2.2.org/gtk/gtktextview.c	2003-06-05 19:04:36.000000000 -0400
+++ gtk+-2.2.2/gtk/gtktextview.c	2003-07-22 21:12:58.000000000 -0400
@@ -112,6 +112,7 @@ enum
   SET_ANCHOR,
   INSERT_AT_CURSOR,
   DELETE_FROM_CURSOR,
+  BACKSPACE_DELETE,
   CUT_CLIPBOARD,
   COPY_CLIPBOARD,
   PASTE_CLIPBOARD,
@@ -249,6 +250,7 @@ static void gtk_text_view_insert_at_curs
 static void gtk_text_view_delete_from_cursor (GtkTextView           *text_view,
                                               GtkDeleteType          type,
                                               gint                   count);
+static void gtk_text_view_backspace_delete (GtkTextView           *text_view);
 static void gtk_text_view_cut_clipboard    (GtkTextView           *text_view);
 static void gtk_text_view_copy_clipboard   (GtkTextView           *text_view);
 static void gtk_text_view_paste_clipboard  (GtkTextView           *text_view);
@@ -529,6 +531,7 @@ gtk_text_view_class_init (GtkTextViewCla
   klass->set_anchor = gtk_text_view_set_anchor;
   klass->insert_at_cursor = gtk_text_view_insert_at_cursor;
   klass->delete_from_cursor = gtk_text_view_delete_from_cursor;
+  klass->backspace_delete = gtk_text_view_backspace_delete;
   klass->cut_clipboard = gtk_text_view_cut_clipboard;
   klass->copy_clipboard = gtk_text_view_copy_clipboard;
   klass->paste_clipboard = gtk_text_view_paste_clipboard;
@@ -700,6 +703,15 @@ gtk_text_view_class_init (GtkTextViewCla
 		  GTK_TYPE_DELETE_TYPE,
 		  G_TYPE_INT);
 
+  signals[DELETE_FROM_CURSOR] =
+    g_signal_new ("backspace_delete",
+		  G_OBJECT_CLASS_TYPE (gobject_class),
+		  G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+		  G_STRUCT_OFFSET (GtkTextViewClass, backspace_delete),
+		  NULL, NULL,
+		  _gtk_marshal_VOID__VOID,
+		  G_TYPE_NONE, 0);
+
   signals[CUT_CLIPBOARD] =
     g_signal_new ("cut_clipboard",
 		  G_OBJECT_CLASS_TYPE (gobject_class),
@@ -932,15 +944,11 @@ gtk_text_view_class_init (GtkTextViewCla
 				G_TYPE_INT, 1);
   
   gtk_binding_entry_add_signal (binding_set, GDK_BackSpace, 0,
-				"delete_from_cursor", 2,
-				G_TYPE_ENUM, GTK_DELETE_CHARS,
-				G_TYPE_INT, -1);
+				"backspace_delete", 0);
 
   /* Make this do the same as Backspace, to help with mis-typing */
   gtk_binding_entry_add_signal (binding_set, GDK_BackSpace, GDK_SHIFT_MASK,
-				"delete_from_cursor", 2,
-				G_TYPE_ENUM, GTK_DELETE_CHARS,
-				G_TYPE_INT, -1);
+				"backspace_delete", 0);
 
   gtk_binding_entry_add_signal (binding_set, GDK_Delete, GDK_CONTROL_MASK,
 				"delete_from_cursor", 2,
@@ -5063,7 +5071,65 @@ gtk_text_view_delete_from_cursor (GtkTex
 }
 
 static void
+gtk_text_view_backspace_delete (GtkTextView   *text_view)
+{
+  GtkTextIter insert;
+  GtkTextIter start;
+  GtkTextIter end;
+  gboolean leave_one = FALSE;
+  gboolean delete_single_glyph;
+  GtkSettings *settings = gtk_widget_get_settings (GTK_WIDGET (text_view));
+  
+  g_object_get (settings,
+		"gtk-backspace-delete-single-glyph", &delete_single_glyph,
+		NULL);
+
+  if (!delete_single_glyph)
+    {
+      gtk_text_view_delete_from_cursor (text_view, GTK_DELETE_CHARS, -1);
+      return;
+    }
+  
+  gtk_text_view_reset_im_context (text_view);
+
+  /* Char delete deletes the selection, if one exists */
+  if (gtk_text_buffer_delete_selection (get_buffer (text_view), TRUE,
+					text_view->editable))
+    return;
+
+  gtk_text_buffer_get_iter_at_mark (get_buffer (text_view),
+                                    &insert,
+                                    gtk_text_buffer_get_mark (get_buffer (text_view),
+                                                              "insert"));
+
+  start = insert;
+  end = insert;
+
+  gtk_text_iter_backward_chars (&end, 1);
+
+  if (!gtk_text_iter_equal (&start, &end))
+    {
+      gtk_text_buffer_begin_user_action (get_buffer (text_view));
+
+      if (gtk_text_buffer_delete_interactive (get_buffer (text_view), &start, &end,
+                                              text_view->editable))
+        {
+          if (leave_one)
+            gtk_text_buffer_insert_interactive_at_cursor (get_buffer (text_view),
+                                                          " ", 1,
+                                                          text_view->editable);
+        }
+
+      gtk_text_buffer_end_user_action (get_buffer (text_view));
+
+      DV(g_print (G_STRLOC": scrolling onscreen\n"));
+      gtk_text_view_scroll_mark_onscreen (text_view,
+                                          gtk_text_buffer_get_mark (get_buffer (text_view), "insert"));
+    }
+}
+
+static void
 gtk_text_view_cut_clipboard (GtkTextView *text_view)
 {
   GtkClipboard *clipboard = gtk_widget_get_clipboard (GTK_WIDGET (text_view),
diff -w -r -up gtk+-2.2.2.org/gtk/gtktextview.h gtk+-2.2.2/gtk/gtktextview.h
--- gtk+-2.2.2.org/gtk/gtktextview.h	2003-06-05 18:59:23.000000000 -0400
+++ gtk+-2.2.2/gtk/gtktextview.h	2003-07-22 21:08:28.000000000 -0400
@@ -187,6 +187,7 @@ struct _GtkTextViewClass
   void (* delete_from_cursor)    (GtkTextView  *text_view,
                                   GtkDeleteType type,
                                   gint          count);
+  void (* backspace_delete)    (GtkTextView  *text_view);
 
   /* cut copy paste */
   void (* cut_clipboard)   (GtkTextView *text_view);
