diff --git a/gtk/gtk.symbols b/gtk/gtk.symbols
index 31ecfc4..6dbaa39 100644
--- a/gtk/gtk.symbols
+++ b/gtk/gtk.symbols
@@ -1300,6 +1300,8 @@ gtk_image_set_from_pixbuf
 gtk_image_set_from_stock
 gtk_image_set_pixel_size
 gtk_image_type_get_type G_GNUC_CONST
+gtk_im_context_can_redo
+gtk_im_context_can_undo
 gtk_im_context_delete_surrounding
 gtk_im_context_filter_keypress
 gtk_im_context_focus_in
@@ -1307,6 +1309,7 @@ gtk_im_context_focus_out
 gtk_im_context_get_preedit_string
 gtk_im_context_get_surrounding
 gtk_im_context_get_type G_GNUC_CONST
+gtk_im_context_redo
 gtk_im_context_reset
 gtk_im_context_set_client_window
 gtk_im_context_set_cursor_location
@@ -1315,6 +1318,7 @@ gtk_im_context_set_use_preedit
 gtk_im_context_simple_add_table
 gtk_im_context_simple_get_type G_GNUC_CONST
 gtk_im_context_simple_new
+gtk_im_context_undo
 gtk_im_multicontext_append_menuitems
 gtk_im_multicontext_get_context_id
 gtk_im_multicontext_get_type G_GNUC_CONST
diff --git a/gtk/gtkimcontext.c b/gtk/gtkimcontext.c
index 3569ba7..de9a00c 100644
--- a/gtk/gtkimcontext.c
+++ b/gtk/gtkimcontext.c
@@ -708,3 +708,95 @@ gtk_im_context_delete_surrounding (GtkIMContext *context,
 
   return result;
 }
+
+/**
+ * gtk_im_context_can_undo:
+ * @context: a #GtkIMContext
+ *
+ * Asks whether the input context can undo the last operation.
+ *
+ * Return value: %TRUE if an undo operation is possible.
+ **/
+gboolean
+gtk_im_context_can_undo (GtkIMContext *context)
+{
+  GtkIMContextClass *klass;
+  gboolean result = FALSE;
+
+  g_return_val_if_fail (GTK_IS_IM_CONTEXT (context), FALSE);
+
+  klass = GTK_IM_CONTEXT_GET_CLASS (context);
+  if (klass->can_undo)
+    result = klass->can_undo (context);
+
+  return result;
+}
+
+/**
+ * gtk_im_context_can_redo:
+ * @context: a #GtkIMContext
+ *
+ * Asks whether the input context can redo the last operation.
+ *
+ * Return value: %TRUE if a redo operation is possible.
+ **/
+gboolean
+gtk_im_context_can_redo (GtkIMContext *context)
+{
+  GtkIMContextClass *klass;
+  gboolean result = FALSE;
+
+  g_return_val_if_fail (GTK_IS_IM_CONTEXT (context), FALSE);
+
+  klass = GTK_IM_CONTEXT_GET_CLASS (context);
+  if (klass->can_redo)
+    result = klass->can_redo (context);
+
+  return result;
+}
+
+/**
+ * gtk_im_context_undo:
+ * @context: a #GtkIMContext
+ *
+ * Asks the input context to perform undo operation.
+ *
+ * Return value: %TRUE if undo operation was done in input method.
+ **/
+gboolean
+gtk_im_context_undo (GtkIMContext *context)
+{
+  GtkIMContextClass *klass;
+  gboolean result = FALSE;
+
+  g_return_val_if_fail (GTK_IS_IM_CONTEXT (context), FALSE);
+
+  klass = GTK_IM_CONTEXT_GET_CLASS (context);
+  if (klass->undo)
+    result = klass->undo (context);
+
+  return result;
+}
+
+/**
+ * gtk_im_context_redo:
+ * @context: a #GtkIMContext
+ *
+ * Asks the input context to perform redo operation.
+ *
+ * Return value: %TRUE if redo operation was done in input method.
+ **/
+gboolean
+gtk_im_context_redo (GtkIMContext *context)
+{
+  GtkIMContextClass *klass;
+  gboolean result = FALSE;
+
+  g_return_val_if_fail (GTK_IS_IM_CONTEXT (context), FALSE);
+
+  klass = GTK_IM_CONTEXT_GET_CLASS (context);
+  if (klass->redo)
+    result = klass->redo (context);
+
+  return result;
+}
diff --git a/gtk/gtkimcontext.h b/gtk/gtkimcontext.h
index 1c5dfd0..21e4bf8 100644
--- a/gtk/gtkimcontext.h
+++ b/gtk/gtkimcontext.h
@@ -85,14 +85,14 @@ struct _GtkIMContextClass
   gboolean (*get_surrounding)     (GtkIMContext   *context,
 				   gchar         **text,
 				   gint           *cursor_index);
+  gboolean (*can_undo)            (GtkIMContext   *context);
+  gboolean (*can_redo)            (GtkIMContext   *context);
+  gboolean (*undo)                (GtkIMContext   *context);
+  gboolean (*redo)                (GtkIMContext   *context);
   /*< private >*/
   /* Padding for future expansion */
   void (*_gtk_reserved1) (void);
   void (*_gtk_reserved2) (void);
-  void (*_gtk_reserved3) (void);
-  void (*_gtk_reserved4) (void);
-  void (*_gtk_reserved5) (void);
-  void (*_gtk_reserved6) (void);
 };
 
 GType    gtk_im_context_get_type            (void) G_GNUC_CONST;
@@ -122,6 +122,10 @@ gboolean gtk_im_context_get_surrounding     (GtkIMContext       *context,
 gboolean gtk_im_context_delete_surrounding  (GtkIMContext       *context,
 					     gint                offset,
 					     gint                n_chars);
+gboolean gtk_im_context_can_undo            (GtkIMContext       *context);
+gboolean gtk_im_context_can_redo            (GtkIMContext       *context);
+gboolean gtk_im_context_undo                (GtkIMContext       *context);
+gboolean gtk_im_context_redo                (GtkIMContext       *context);
 
 G_END_DECLS
 
