>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,
