diff --git a/gtk/gtkclipboard.c b/gtk/gtkclipboard.c
index c328baded4..5e959cbf3c 100644
--- a/gtk/gtkclipboard.c
+++ b/gtk/gtkclipboard.c
@@ -110,6 +110,7 @@ typedef struct _RequestRichTextInfo RequestRichTextInfo;
 typedef struct _RequestImageInfo RequestImageInfo;
 typedef struct _RequestURIInfo RequestURIInfo;
 typedef struct _RequestTargetsInfo RequestTargetsInfo;
+typedef struct _SetTargetsContents SetTargetsContents;
 
 struct _RequestContentsInfo
 {
@@ -150,6 +151,15 @@ struct _RequestTargetsInfo
   gpointer user_data;
 };
 
+struct _SetTargetsContents
+{
+  gint n;
+
+  GtkTargetEntry *targets;
+
+  gchar **texts;
+};
+
 static void gtk_clipboard_finalize     (GObject             *object);
 static void gtk_clipboard_owner_change (GtkClipboard        *clipboard,
 					GdkEventOwnerChange *event);
@@ -378,6 +388,26 @@ gtk_clipboard_get_default (GdkDisplay *display)
   return gtk_clipboard_get_for_display (display, GDK_SELECTION_CLIPBOARD);
 }
 
+/**
+ * gtk_clipboard_get_for_string:
+ * @selection: a string which identifies the clipboard to use
+ *
+ * Returns the clipboard object for the given selection.
+ * See gtk_clipboard_get_for_display() for complete details.
+ *
+ * Returns: (transfer none): the appropriate clipboard object. If no clipboard
+ *     already exists, a new one will be created. Once a clipboard
+ *     object has been created, it is persistent and, since it is
+ *     owned by GTK+, must not be freed or unreffed.
+ *
+ * Since: 3.94
+ */
+GtkClipboard *
+gtk_clipboard_get_for_string (const gchar *selection)
+{
+  return gtk_clipboard_get (gdk_atom_intern (selection, FALSE));
+}
+
 static void 
 selection_get_cb (GtkWidget          *widget,
 		  GtkSelectionData   *selection_data,
@@ -890,6 +920,89 @@ gtk_clipboard_set_surface (GtkClipboard    *clipboard,
 
 }
 
+static void
+targets_get_func (GtkClipboard     *clipboard,
+                  GtkSelectionData *selection_data,
+                  guint             info,
+                  gpointer          data)
+{
+  gint i;
+  SetTargetsContents *contents = data;
+  GdkAtom target = gtk_selection_data_get_target (selection_data);
+
+  for (i = 0; i < contents->n; i++)
+    {
+      if (target == gdk_atom_intern (contents->targets[i].target, FALSE))
+        {
+          gtk_selection_data_set (selection_data, target, 8,
+                                  (guchar *) contents->texts[i],
+                                  strlen (contents->texts[i]));
+          break;
+        }
+    }
+}
+
+static void
+targets_clear_func (GtkClipboard *clipboard,
+                    gpointer      data)
+{
+  SetTargetsContents *contents = data;
+
+  gtk_target_table_free (contents->targets, contents->n);
+  g_strfreev (contents->texts);
+  g_free (contents);
+}
+
+/**
+ * gtk_clipboard_set_targets:
+ * @clipboard: a #GtkClipboard object
+ * @targets:   (array length=n_targets): array containing information
+ *     about the available forms for the clipboard data
+ * @n_targets: number of elements in @targets
+ * @texts:     (array length=n_texts): UTF-8 strings
+ * @n_texts:   number of elements in @targets, must be equal to n_targets
+ *
+ * Sets the contents of the clipboard to the given UTF-8 strings, each
+ * corresponding to a given data type.
+ *
+ * Since: 3.94
+ **/
+void
+gtk_clipboard_set_targets (GtkClipboard  *clipboard,
+                           gchar        **targets,
+                           gint           n_targets,
+                           gchar        **texts,
+                           gint           n_texts)
+{
+  SetTargetsContents *contents;
+  gint i;
+  GtkTargetList *target_list;
+
+  g_return_if_fail (GTK_IS_CLIPBOARD (clipboard));
+  g_return_if_fail (targets != NULL);
+  g_return_if_fail (texts != NULL);
+  g_return_if_fail (n_targets == n_texts);
+
+  contents = g_new (SetTargetsContents, 1);
+  contents->texts = g_strdupv (texts);
+  target_list = gtk_target_list_new (NULL, 0);
+
+  for (i = 0; i < n_targets; i++)
+    gtk_target_list_add (target_list,
+                         gdk_atom_intern (targets[i], FALSE), 0, 0);
+
+  contents->targets = gtk_target_table_new_from_list (target_list,
+                                                      &contents->n);
+
+  gtk_clipboard_set_with_data (clipboard,
+                               contents->targets, n_targets,
+                               targets_get_func, targets_clear_func,
+                               contents);
+  gtk_clipboard_set_can_store (clipboard, NULL, 0);
+
+  gtk_target_list_unref (target_list);
+}
+
 static void
 set_request_contents_info (GtkWidget           *widget,
 			   RequestContentsInfo *info)
@@ -1338,6 +1451,34 @@ gtk_clipboard_request_targets (GtkClipboard                *clipboard,
 				  info);
 }
 
+/**
+ * gtk_clipboard_request_target:
+ * @clipboard: a #GtkClipboard
+ * @target:    information about the form into which the clipboard
+ *     owner should convert the selection
+ * @callback:  (scope async): A function to call when the results are received
+ *     (or the retrieval fails). If the retrieval fails the length field of
+ *     @selection_data will be negative.
+ * @user_data: user data to pass to @callback
+ *
+ * Requests the contents of clipboard as the given target.
+ * When the results of the result are later received the supplied callback
+ * will be called.
+ **/
+void
+gtk_clipboard_request_target (GtkClipboard             *clipboard,
+                              const gchar              *target,
+                              GtkClipboardReceivedFunc  callback,
+                              gpointer                  user_data)
+{
+  g_return_if_fail (GTK_IS_CLIPBOARD (clipboard));
+  g_return_if_fail (callback != NULL);
+
+  gtk_clipboard_request_contents (clipboard,
+                                  gdk_atom_intern (target, FALSE),
+                                  callback, user_data);
+}
+
 typedef struct
 {
   GMainLoop *loop;
diff --git a/gtk/gtkclipboard.h b/gtk/gtkclipboard.h
index ecc49bee10..73f3443857 100644
--- a/gtk/gtkclipboard.h
+++ b/gtk/gtkclipboard.h
@@ -184,9 +184,10 @@ GtkClipboard *gtk_clipboard_get_for_display (GdkDisplay   *display,
 					     GdkAtom       selection);
 GDK_AVAILABLE_IN_ALL
 GtkClipboard *gtk_clipboard_get             (GdkAtom       selection);
-
 GDK_AVAILABLE_IN_3_16
-GtkClipboard *gtk_clipboard_get_default     (GdkDisplay    *display);
+GtkClipboard *gtk_clipboard_get_default     (GdkDisplay   *display);
+GDK_AVAILABLE_IN_3_94
+GtkClipboard *gtk_clipboard_get_for_string  (const gchar  *selection);
 
 GDK_AVAILABLE_IN_ALL
 GdkDisplay   *gtk_clipboard_get_display     (GtkClipboard *clipboard);
@@ -218,6 +219,12 @@ void     gtk_clipboard_set_image      (GtkClipboard          *clipboard,
 GDK_AVAILABLE_IN_3_94
 void     gtk_clipboard_set_surface    (GtkClipboard    *clipboard,
                                        cairo_surface_t *surface);
+GDK_AVAILABLE_IN_3_94
+void     gtk_clipboard_set_targets    (GtkClipboard  *clipboard,
+                                       gchar        **targets,
+                                       gint           n_targets,
+                                       gchar        **texts,
+                                       gint           n_texts);
 
 GDK_AVAILABLE_IN_ALL
 void gtk_clipboard_request_contents  (GtkClipboard                     *clipboard,
@@ -245,6 +252,11 @@ GDK_AVAILABLE_IN_ALL
 void gtk_clipboard_request_targets   (GtkClipboard                     *clipboard,
                                       GtkClipboardTargetsReceivedFunc   callback,
                                       gpointer                          user_data);
+GDK_AVAILABLE_IN_3_94
+void gtk_clipboard_request_target    (GtkClipboard                     *clipboard,
+                                      const gchar                      *target,
+                                      GtkClipboardReceivedFunc          callback,
+                                      gpointer                          user_data);
 
 GDK_AVAILABLE_IN_ALL
 GtkSelectionData *gtk_clipboard_wait_for_contents  (GtkClipboard  *clipboard,
