[gimp/wip/Jehan/classy-GIMP: 27/60] pdb, libgimp: now make all ID types classes of their own.



commit 5133c4e6268b5c4dd544af0333b9b118b22117e6
Author: Jehan <jehan girinstud io>
Date:   Tue Aug 13 21:36:03 2019 +0200

    pdb, libgimp: now make all ID types classes of their own.
    
    No need of is_id_arg() anymore in pdb/lib.pl. Let's reuse the {id}
    value. Also I had to add an additional trick for GimpDisplay which we
    will now generate as such in libgimp PDB files, but still need to show
    as GimpObject on app/pdb/.
    
    As previously, only the new classes and the PDB generation for a first
    step.

 libgimp/Makefile.gi                 |   10 +-
 libgimp/gimp.h                      |    3 +
 libgimp/gimpchannel.c               |   18 +
 libgimp/gimpchannel.h               |   35 +
 libgimp/gimpchannel_pdb.c           |  392 +++++++++-
 libgimp/gimpchannel_pdb.h           |   93 ++-
 libgimp/gimpdisplay.c               |  160 +++++
 libgimp/gimpdisplay.h               |   75 ++
 libgimp/gimpdisplay_pdb.c           |  145 +++-
 libgimp/gimpdisplay_pdb.h           |   26 +-
 libgimp/gimpimage_pdb.c             |  134 ++--
 libgimp/gimpimage_pdb.h             |   30 +-
 libgimp/gimpimageguides_pdb.c       |   48 +-
 libgimp/gimpimageguides_pdb.h       |   14 +-
 libgimp/gimpimagesamplepoints_pdb.c |   34 +-
 libgimp/gimpimagesamplepoints_pdb.h |   10 +-
 libgimp/gimplayer_pdb.c             |   34 +-
 libgimp/gimplayer_pdb.h             |    8 +-
 libgimp/gimplayermask.c             |   39 +
 libgimp/gimplayermask.h             |   70 ++
 libgimp/gimpprogress_pdb.c          |   46 +-
 libgimp/gimpprogress_pdb.h          |    9 +-
 libgimp/gimpselection.c             |   14 +
 libgimp/gimpselection.h             |   33 +
 libgimp/gimpselection_pdb.c         |   10 +-
 libgimp/gimpselection_pdb.h         |    2 +-
 libgimp/gimptypes.h                 |    6 +
 libgimp/gimpvectors.c               |   39 +
 libgimp/gimpvectors.h               |   70 ++
 libgimp/gimpvectors_pdb.c           | 1340 ++++++++++++++++++++++++++++++-----
 libgimp/gimpvectors_pdb.h           |  235 ++++--
 pdb/app.pl                          |   14 +-
 pdb/lib.pl                          |   25 +-
 pdb/pdb.pl                          |   39 +-
 34 files changed, 2750 insertions(+), 510 deletions(-)
---
diff --git a/libgimp/Makefile.gi b/libgimp/Makefile.gi
index 5b2147c69d..6c387ca8a1 100644
--- a/libgimp/Makefile.gi
+++ b/libgimp/Makefile.gi
@@ -111,6 +111,7 @@ libgimp_introspectable_headers = \
        ${PDB_WRAPPERS_H}                       \
        ../libgimp/gimpbrushselect.h            \
        ../libgimp/gimpchannel.h                \
+       ../libgimp/gimpdisplay.h                \
        ../libgimp/gimpdrawable.h               \
        ../libgimp/gimpfileprocedure.h          \
        ../libgimp/gimpfontselect.h             \
@@ -121,6 +122,7 @@ libgimp_introspectable_headers = \
        ../libgimp/gimpimageprocedure.h         \
        ../libgimp/gimpitem.h                   \
        ../libgimp/gimplayer.h                  \
+       ../libgimp/gimplayermask.h              \
        ../libgimp/gimploadprocedure.h          \
        ../libgimp/gimppaletteselect.h          \
        ../libgimp/gimpparamspecs.h             \
@@ -131,7 +133,8 @@ libgimp_introspectable_headers = \
        ../libgimp/gimpprogress.h               \
        ../libgimp/gimpsaveprocedure.h          \
        ../libgimp/gimpselection.h              \
-       ../libgimp/gimpthumbnailprocedure.h
+       ../libgimp/gimpthumbnailprocedure.h     \
+       ../libgimp/gimpvectors.h
 
 libgimp_introspectable = \
        $(libgimp_introspectable_headers)       \
@@ -140,6 +143,7 @@ libgimp_introspectable = \
        ${PDB_WRAPPERS_C}                       \
        ../libgimp/gimpbrushselect.c            \
        ../libgimp/gimpchannel.c                \
+       ../libgimp/gimpdisplay.c                \
        ../libgimp/gimpdrawable.c               \
        ../libgimp/gimpfileprocedure.c          \
        ../libgimp/gimpfontselect.c             \
@@ -150,6 +154,7 @@ libgimp_introspectable = \
        ../libgimp/gimpimageprocedure.c         \
        ../libgimp/gimpitem.c                   \
        ../libgimp/gimplayer.c                  \
+       ../libgimp/gimplayermask.c              \
        ../libgimp/gimploadprocedure.c          \
        ../libgimp/gimppaletteselect.c          \
        ../libgimp/gimpparamspecs.c             \
@@ -160,7 +165,8 @@ libgimp_introspectable = \
        ../libgimp/gimpprogress.c               \
        ../libgimp/gimpsaveprocedure.c          \
        ../libgimp/gimpselection.c              \
-       ../libgimp/gimpthumbnailprocedure.c
+       ../libgimp/gimpthumbnailprocedure.c     \
+       ../libgimp/gimpvectors.c
 
 libgimpui_introspectable_headers = \
        ../libgimp/gimpui.h                     \
diff --git a/libgimp/gimp.h b/libgimp/gimp.h
index 8d3bc6171d..5a3631a5ba 100644
--- a/libgimp/gimp.h
+++ b/libgimp/gimp.h
@@ -37,6 +37,7 @@
 
 #include <libgimp/gimpbrushselect.h>
 #include <libgimp/gimpchannel.h>
+#include <libgimp/gimpdisplay.h>
 #include <libgimp/gimpdrawable.h>
 #include <libgimp/gimpfontselect.h>
 #include <libgimp/gimpgimprc.h>
@@ -46,6 +47,7 @@
 #include <libgimp/gimpimageprocedure.h>
 #include <libgimp/gimpitem.h>
 #include <libgimp/gimplayer.h>
+#include <libgimp/gimplayermask.h>
 #include <libgimp/gimploadprocedure.h>
 #include <libgimp/gimplegacy.h>
 #include <libgimp/gimppaletteselect.h>
@@ -58,6 +60,7 @@
 #include <libgimp/gimpsaveprocedure.h>
 #include <libgimp/gimpselection.h>
 #include <libgimp/gimpthumbnailprocedure.h>
+#include <libgimp/gimpvectors.h>
 
 #include <libgimp/gimp_pdb_headers.h>
 
diff --git a/libgimp/gimpchannel.c b/libgimp/gimpchannel.c
index 2fd111b6c0..b81b204244 100644
--- a/libgimp/gimpchannel.c
+++ b/libgimp/gimpchannel.c
@@ -23,6 +23,24 @@
 #include "gimp.h"
 
 
+G_DEFINE_TYPE (GimpChannel, gimp_channel, GIMP_TYPE_DRAWABLE)
+
+#define parent_class gimp_drawable_parent_class
+
+static void
+gimp_channel_class_init (GimpChannelClass *klass)
+{
+}
+
+static void
+gimp_channel_init (GimpChannel *channel)
+{
+}
+
+
+/* Public API. */
+
+
 /**
  * gimp_channel_new:
  * @image:   The image to which to add the channel.
diff --git a/libgimp/gimpchannel.h b/libgimp/gimpchannel.h
index 1771e6f2c4..73b7b6c775 100644
--- a/libgimp/gimpchannel.h
+++ b/libgimp/gimpchannel.h
@@ -29,6 +29,41 @@ G_BEGIN_DECLS
 
 /* For information look into the C source or the html documentation */
 
+#include <libgimp/gimpdrawable.h>
+
+#define GIMP_TYPE_CHANNEL            (gimp_channel_get_type ())
+#define GIMP_CHANNEL(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_CHANNEL, GimpChannel))
+#define GIMP_CHANNEL_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_CHANNEL, GimpChannelClass))
+#define GIMP_IS_CHANNEL(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_CHANNEL))
+#define GIMP_IS_CHANNEL_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_CHANNEL))
+#define GIMP_CHANNEL_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_CHANNEL, GimpChannelClass))
+
+
+typedef struct _GimpChannelClass   GimpChannelClass;
+
+struct _GimpChannel
+{
+  GimpDrawable      parent_instance;
+};
+
+struct _GimpChannelClass
+{
+  GimpDrawableClass parent_class;
+
+  /* Padding for future expansion */
+  void (*_gimp_reserved1) (void);
+  void (*_gimp_reserved2) (void);
+  void (*_gimp_reserved3) (void);
+  void (*_gimp_reserved4) (void);
+  void (*_gimp_reserved5) (void);
+  void (*_gimp_reserved6) (void);
+  void (*_gimp_reserved7) (void);
+  void (*_gimp_reserved8) (void);
+  void (*_gimp_reserved9) (void);
+};
+
+GType    gimp_channel_get_type           (void) G_GNUC_CONST;
+
 
 #ifndef GIMP_DEPRECATED_REPLACE_NEW_API
 
diff --git a/libgimp/gimpchannel_pdb.c b/libgimp/gimpchannel_pdb.c
index dad21df6ea..ca4302d3a4 100644
--- a/libgimp/gimpchannel_pdb.c
+++ b/libgimp/gimpchannel_pdb.c
@@ -53,9 +53,9 @@
  * explicit procedure calls.
  * The channel's contents are undefined initially.
  *
- * Returns: The newly created channel.
+ * Returns: (transfer full): The newly created channel.
  **/
-gint32
+GimpChannel *
 _gimp_channel_new (GimpImage     *image,
                    gint           width,
                    gint           height,
@@ -66,7 +66,7 @@ _gimp_channel_new (GimpImage     *image,
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
   GimpValueArray *return_vals;
-  gint32 channel_ID = -1;
+  GimpChannel *channel = NULL;
 
   args = gimp_value_array_new_from_types (NULL,
                                           GIMP_TYPE_IMAGE_ID, gimp_image_get_id (image),
@@ -87,11 +87,11 @@ _gimp_channel_new (GimpImage     *image,
   gimp_value_array_unref (args);
 
   if (g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS)
-    channel_ID = gimp_value_get_channel_id (gimp_value_array_index (return_vals, 1));
+    channel = GIMP_CHANNEL (gimp_item_new_by_id (gimp_value_get_channel_id (gimp_value_array_index 
(return_vals, 1))));
 
   gimp_value_array_unref (return_vals);
 
-  return channel_ID;
+  return channel;
 }
 
 /**
@@ -168,11 +168,11 @@ __gimp_channel_new (gint32         image_ID,
  * Other attributes, such as channel visibility, should be set with
  * explicit procedure calls.
  *
- * Returns: The newly created channel.
+ * Returns: (transfer full): The newly created channel.
  *
  * Since: 2.4
  **/
-gint32
+GimpChannel *
 gimp_channel_new_from_component (GimpImage       *image,
                                  GimpChannelType  component,
                                  const gchar     *name)
@@ -180,7 +180,7 @@ gimp_channel_new_from_component (GimpImage       *image,
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
   GimpValueArray *return_vals;
-  gint32 channel_ID = -1;
+  GimpChannel *channel = NULL;
 
   args = gimp_value_array_new_from_types (NULL,
                                           GIMP_TYPE_IMAGE_ID, gimp_image_get_id (image),
@@ -198,11 +198,11 @@ gimp_channel_new_from_component (GimpImage       *image,
   gimp_value_array_unref (args);
 
   if (g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS)
-    channel_ID = gimp_value_get_channel_id (gimp_value_array_index (return_vals, 1));
+    channel = GIMP_CHANNEL (gimp_item_new_by_id (gimp_value_get_channel_id (gimp_value_array_index 
(return_vals, 1))));
 
   gimp_value_array_unref (return_vals);
 
-  return channel_ID;
+  return channel;
 }
 
 /**
@@ -258,6 +258,47 @@ _gimp_channel_new_from_component (gint32           image_ID,
 
 /**
  * gimp_channel_copy:
+ * @channel: The channel to copy.
+ *
+ * Copy a channel.
+ *
+ * This procedure copies the specified channel and returns the copy.
+ * The new channel still needs to be added to the image, as this is not
+ * automatic. Add the new channel with gimp_image_insert_channel().
+ *
+ * Returns: (transfer full): The newly copied channel.
+ **/
+GimpChannel *
+gimp_channel_copy (GimpChannel *channel)
+{
+  GimpPDB        *pdb = gimp_get_pdb ();
+  GimpValueArray *args;
+  GimpValueArray *return_vals;
+  GimpChannel *channel_copy = NULL;
+
+  args = gimp_value_array_new_from_types (NULL,
+                                          GIMP_TYPE_CHANNEL_ID, gimp_item_get_id (GIMP_ITEM (channel)),
+                                          G_TYPE_NONE);
+
+  if (pdb)
+    return_vals = gimp_pdb_run_procedure_array (pdb,
+                                                "gimp-channel-copy",
+                                                args);
+  else
+    return_vals = gimp_run_procedure_array ("gimp-channel-copy",
+                                            args);
+  gimp_value_array_unref (args);
+
+  if (g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS)
+    channel_copy = GIMP_CHANNEL (gimp_item_new_by_id (gimp_value_get_channel_id (gimp_value_array_index 
(return_vals, 1))));
+
+  gimp_value_array_unref (return_vals);
+
+  return channel_copy;
+}
+
+/**
+ * _gimp_channel_copy: (skip)
  * @channel_ID: The channel to copy.
  *
  * Copy a channel.
@@ -269,7 +310,7 @@ _gimp_channel_new_from_component (gint32           image_ID,
  * Returns: The newly copied channel.
  **/
 gint32
-gimp_channel_copy (gint32 channel_ID)
+_gimp_channel_copy (gint32 channel_ID)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -299,6 +340,57 @@ gimp_channel_copy (gint32 channel_ID)
 
 /**
  * gimp_channel_combine_masks:
+ * @channel1: The channel1.
+ * @channel2: The channel2.
+ * @operation: The selection operation.
+ * @offx: x offset between upper left corner of channels: (second - first).
+ * @offy: y offset between upper left corner of channels: (second - first).
+ *
+ * Combine two channel masks.
+ *
+ * This procedure combines two channel masks. The result is stored in
+ * the first channel.
+ *
+ * Returns: TRUE on success.
+ **/
+gboolean
+gimp_channel_combine_masks (GimpChannel    *channel1,
+                            GimpChannel    *channel2,
+                            GimpChannelOps  operation,
+                            gint            offx,
+                            gint            offy)
+{
+  GimpPDB        *pdb = gimp_get_pdb ();
+  GimpValueArray *args;
+  GimpValueArray *return_vals;
+  gboolean success = TRUE;
+
+  args = gimp_value_array_new_from_types (NULL,
+                                          GIMP_TYPE_CHANNEL_ID, gimp_item_get_id (GIMP_ITEM (channel1)),
+                                          GIMP_TYPE_CHANNEL_ID, gimp_item_get_id (GIMP_ITEM (channel2)),
+                                          GIMP_TYPE_CHANNEL_OPS, operation,
+                                          G_TYPE_INT, offx,
+                                          G_TYPE_INT, offy,
+                                          G_TYPE_NONE);
+
+  if (pdb)
+    return_vals = gimp_pdb_run_procedure_array (pdb,
+                                                "gimp-channel-combine-masks",
+                                                args);
+  else
+    return_vals = gimp_run_procedure_array ("gimp-channel-combine-masks",
+                                            args);
+  gimp_value_array_unref (args);
+
+  success = g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS;
+
+  gimp_value_array_unref (return_vals);
+
+  return success;
+}
+
+/**
+ * _gimp_channel_combine_masks: (skip)
  * @channel1_ID: The channel1.
  * @channel2_ID: The channel2.
  * @operation: The selection operation.
@@ -313,11 +405,11 @@ gimp_channel_copy (gint32 channel_ID)
  * Returns: TRUE on success.
  **/
 gboolean
-gimp_channel_combine_masks (gint32         channel1_ID,
-                            gint32         channel2_ID,
-                            GimpChannelOps operation,
-                            gint           offx,
-                            gint           offy)
+_gimp_channel_combine_masks (gint32         channel1_ID,
+                             gint32         channel2_ID,
+                             GimpChannelOps operation,
+                             gint           offx,
+                             gint           offy)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -350,6 +442,47 @@ gimp_channel_combine_masks (gint32         channel1_ID,
 
 /**
  * gimp_channel_get_show_masked:
+ * @channel: The channel.
+ *
+ * Get the composite method of the specified channel.
+ *
+ * This procedure returns the specified channel's composite method. If
+ * it is TRUE, then the channel is composited with the image so that
+ * masked regions are shown. Otherwise, selected regions are shown.
+ *
+ * Returns: The channel composite method.
+ **/
+gboolean
+gimp_channel_get_show_masked (GimpChannel *channel)
+{
+  GimpPDB        *pdb = gimp_get_pdb ();
+  GimpValueArray *args;
+  GimpValueArray *return_vals;
+  gboolean show_masked = FALSE;
+
+  args = gimp_value_array_new_from_types (NULL,
+                                          GIMP_TYPE_CHANNEL_ID, gimp_item_get_id (GIMP_ITEM (channel)),
+                                          G_TYPE_NONE);
+
+  if (pdb)
+    return_vals = gimp_pdb_run_procedure_array (pdb,
+                                                "gimp-channel-get-show-masked",
+                                                args);
+  else
+    return_vals = gimp_run_procedure_array ("gimp-channel-get-show-masked",
+                                            args);
+  gimp_value_array_unref (args);
+
+  if (g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS)
+    show_masked = g_value_get_boolean (gimp_value_array_index (return_vals, 1));
+
+  gimp_value_array_unref (return_vals);
+
+  return show_masked;
+}
+
+/**
+ * _gimp_channel_get_show_masked: (skip)
  * @channel_ID: The channel.
  *
  * Get the composite method of the specified channel.
@@ -361,7 +494,7 @@ gimp_channel_combine_masks (gint32         channel1_ID,
  * Returns: The channel composite method.
  **/
 gboolean
-gimp_channel_get_show_masked (gint32 channel_ID)
+_gimp_channel_get_show_masked (gint32 channel_ID)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -391,6 +524,49 @@ gimp_channel_get_show_masked (gint32 channel_ID)
 
 /**
  * gimp_channel_set_show_masked:
+ * @channel: The channel.
+ * @show_masked: The new channel composite method.
+ *
+ * Set the composite method of the specified channel.
+ *
+ * This procedure sets the specified channel's composite method. If it
+ * is TRUE, then the channel is composited with the image so that
+ * masked regions are shown. Otherwise, selected regions are shown.
+ *
+ * Returns: TRUE on success.
+ **/
+gboolean
+gimp_channel_set_show_masked (GimpChannel *channel,
+                              gboolean     show_masked)
+{
+  GimpPDB        *pdb = gimp_get_pdb ();
+  GimpValueArray *args;
+  GimpValueArray *return_vals;
+  gboolean success = TRUE;
+
+  args = gimp_value_array_new_from_types (NULL,
+                                          GIMP_TYPE_CHANNEL_ID, gimp_item_get_id (GIMP_ITEM (channel)),
+                                          G_TYPE_BOOLEAN, show_masked,
+                                          G_TYPE_NONE);
+
+  if (pdb)
+    return_vals = gimp_pdb_run_procedure_array (pdb,
+                                                "gimp-channel-set-show-masked",
+                                                args);
+  else
+    return_vals = gimp_run_procedure_array ("gimp-channel-set-show-masked",
+                                            args);
+  gimp_value_array_unref (args);
+
+  success = g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS;
+
+  gimp_value_array_unref (return_vals);
+
+  return success;
+}
+
+/**
+ * _gimp_channel_set_show_masked: (skip)
  * @channel_ID: The channel.
  * @show_masked: The new channel composite method.
  *
@@ -403,8 +579,8 @@ gimp_channel_get_show_masked (gint32 channel_ID)
  * Returns: TRUE on success.
  **/
 gboolean
-gimp_channel_set_show_masked (gint32   channel_ID,
-                              gboolean show_masked)
+_gimp_channel_set_show_masked (gint32   channel_ID,
+                               gboolean show_masked)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -434,6 +610,45 @@ gimp_channel_set_show_masked (gint32   channel_ID,
 
 /**
  * gimp_channel_get_opacity:
+ * @channel: The channel.
+ *
+ * Get the opacity of the specified channel.
+ *
+ * This procedure returns the specified channel's opacity.
+ *
+ * Returns: The channel opacity.
+ **/
+gdouble
+gimp_channel_get_opacity (GimpChannel *channel)
+{
+  GimpPDB        *pdb = gimp_get_pdb ();
+  GimpValueArray *args;
+  GimpValueArray *return_vals;
+  gdouble opacity = 0.0;
+
+  args = gimp_value_array_new_from_types (NULL,
+                                          GIMP_TYPE_CHANNEL_ID, gimp_item_get_id (GIMP_ITEM (channel)),
+                                          G_TYPE_NONE);
+
+  if (pdb)
+    return_vals = gimp_pdb_run_procedure_array (pdb,
+                                                "gimp-channel-get-opacity",
+                                                args);
+  else
+    return_vals = gimp_run_procedure_array ("gimp-channel-get-opacity",
+                                            args);
+  gimp_value_array_unref (args);
+
+  if (g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS)
+    opacity = g_value_get_double (gimp_value_array_index (return_vals, 1));
+
+  gimp_value_array_unref (return_vals);
+
+  return opacity;
+}
+
+/**
+ * _gimp_channel_get_opacity: (skip)
  * @channel_ID: The channel.
  *
  * Get the opacity of the specified channel.
@@ -443,7 +658,7 @@ gimp_channel_set_show_masked (gint32   channel_ID,
  * Returns: The channel opacity.
  **/
 gdouble
-gimp_channel_get_opacity (gint32 channel_ID)
+_gimp_channel_get_opacity (gint32 channel_ID)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -473,6 +688,47 @@ gimp_channel_get_opacity (gint32 channel_ID)
 
 /**
  * gimp_channel_set_opacity:
+ * @channel: The channel.
+ * @opacity: The new channel opacity.
+ *
+ * Set the opacity of the specified channel.
+ *
+ * This procedure sets the specified channel's opacity.
+ *
+ * Returns: TRUE on success.
+ **/
+gboolean
+gimp_channel_set_opacity (GimpChannel *channel,
+                          gdouble      opacity)
+{
+  GimpPDB        *pdb = gimp_get_pdb ();
+  GimpValueArray *args;
+  GimpValueArray *return_vals;
+  gboolean success = TRUE;
+
+  args = gimp_value_array_new_from_types (NULL,
+                                          GIMP_TYPE_CHANNEL_ID, gimp_item_get_id (GIMP_ITEM (channel)),
+                                          G_TYPE_DOUBLE, opacity,
+                                          G_TYPE_NONE);
+
+  if (pdb)
+    return_vals = gimp_pdb_run_procedure_array (pdb,
+                                                "gimp-channel-set-opacity",
+                                                args);
+  else
+    return_vals = gimp_run_procedure_array ("gimp-channel-set-opacity",
+                                            args);
+  gimp_value_array_unref (args);
+
+  success = g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS;
+
+  gimp_value_array_unref (return_vals);
+
+  return success;
+}
+
+/**
+ * _gimp_channel_set_opacity: (skip)
  * @channel_ID: The channel.
  * @opacity: The new channel opacity.
  *
@@ -483,8 +739,8 @@ gimp_channel_get_opacity (gint32 channel_ID)
  * Returns: TRUE on success.
  **/
 gboolean
-gimp_channel_set_opacity (gint32  channel_ID,
-                          gdouble opacity)
+_gimp_channel_set_opacity (gint32  channel_ID,
+                           gdouble opacity)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -514,6 +770,49 @@ gimp_channel_set_opacity (gint32  channel_ID,
 
 /**
  * gimp_channel_get_color:
+ * @channel: The channel.
+ * @color: (out caller-allocates): The channel compositing color.
+ *
+ * Get the compositing color of the specified channel.
+ *
+ * This procedure returns the specified channel's compositing color.
+ *
+ * Returns: TRUE on success.
+ **/
+gboolean
+gimp_channel_get_color (GimpChannel *channel,
+                        GimpRGB     *color)
+{
+  GimpPDB        *pdb = gimp_get_pdb ();
+  GimpValueArray *args;
+  GimpValueArray *return_vals;
+  gboolean success = TRUE;
+
+  args = gimp_value_array_new_from_types (NULL,
+                                          GIMP_TYPE_CHANNEL_ID, gimp_item_get_id (GIMP_ITEM (channel)),
+                                          G_TYPE_NONE);
+
+  if (pdb)
+    return_vals = gimp_pdb_run_procedure_array (pdb,
+                                                "gimp-channel-get-color",
+                                                args);
+  else
+    return_vals = gimp_run_procedure_array ("gimp-channel-get-color",
+                                            args);
+  gimp_value_array_unref (args);
+
+  success = g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS;
+
+  if (success)
+    gimp_value_get_rgb (gimp_value_array_index (return_vals, 1), &*color);
+
+  gimp_value_array_unref (return_vals);
+
+  return success;
+}
+
+/**
+ * _gimp_channel_get_color: (skip)
  * @channel_ID: The channel.
  * @color: (out caller-allocates): The channel compositing color.
  *
@@ -524,8 +823,8 @@ gimp_channel_set_opacity (gint32  channel_ID,
  * Returns: TRUE on success.
  **/
 gboolean
-gimp_channel_get_color (gint32   channel_ID,
-                        GimpRGB *color)
+_gimp_channel_get_color (gint32   channel_ID,
+                         GimpRGB *color)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -557,7 +856,7 @@ gimp_channel_get_color (gint32   channel_ID,
 
 /**
  * gimp_channel_set_color:
- * @channel_ID: The channel.
+ * @channel: The channel.
  * @color: The new channel compositing color.
  *
  * Set the compositing color of the specified channel.
@@ -567,7 +866,7 @@ gimp_channel_get_color (gint32   channel_ID,
  * Returns: TRUE on success.
  **/
 gboolean
-gimp_channel_set_color (gint32         channel_ID,
+gimp_channel_set_color (GimpChannel   *channel,
                         const GimpRGB *color)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
@@ -575,6 +874,47 @@ gimp_channel_set_color (gint32         channel_ID,
   GimpValueArray *return_vals;
   gboolean success = TRUE;
 
+  args = gimp_value_array_new_from_types (NULL,
+                                          GIMP_TYPE_CHANNEL_ID, gimp_item_get_id (GIMP_ITEM (channel)),
+                                          GIMP_TYPE_RGB, color,
+                                          G_TYPE_NONE);
+
+  if (pdb)
+    return_vals = gimp_pdb_run_procedure_array (pdb,
+                                                "gimp-channel-set-color",
+                                                args);
+  else
+    return_vals = gimp_run_procedure_array ("gimp-channel-set-color",
+                                            args);
+  gimp_value_array_unref (args);
+
+  success = g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS;
+
+  gimp_value_array_unref (return_vals);
+
+  return success;
+}
+
+/**
+ * _gimp_channel_set_color: (skip)
+ * @channel_ID: The channel.
+ * @color: The new channel compositing color.
+ *
+ * Set the compositing color of the specified channel.
+ *
+ * This procedure sets the specified channel's compositing color.
+ *
+ * Returns: TRUE on success.
+ **/
+gboolean
+_gimp_channel_set_color (gint32         channel_ID,
+                         const GimpRGB *color)
+{
+  GimpPDB        *pdb = gimp_get_pdb ();
+  GimpValueArray *args;
+  GimpValueArray *return_vals;
+  gboolean success = TRUE;
+
   args = gimp_value_array_new_from_types (NULL,
                                           GIMP_TYPE_CHANNEL_ID, channel_ID,
                                           GIMP_TYPE_RGB, color,
diff --git a/libgimp/gimpchannel_pdb.h b/libgimp/gimpchannel_pdb.h
index f6ac448117..2136e26909 100644
--- a/libgimp/gimpchannel_pdb.h
+++ b/libgimp/gimpchannel_pdb.h
@@ -32,39 +32,48 @@ G_BEGIN_DECLS
 /* For information look into the C source or the html documentation */
 
 
-gint32   gimp_channel_copy            (gint32          channel_ID);
-gboolean gimp_channel_combine_masks   (gint32          channel1_ID,
-                                       gint32          channel2_ID,
-                                       GimpChannelOps  operation,
-                                       gint            offx,
-                                       gint            offy);
-gboolean gimp_channel_get_show_masked (gint32          channel_ID);
-gboolean gimp_channel_set_show_masked (gint32          channel_ID,
-                                       gboolean        show_masked);
-gdouble  gimp_channel_get_opacity     (gint32          channel_ID);
-gboolean gimp_channel_set_opacity     (gint32          channel_ID,
-                                       gdouble         opacity);
-gboolean gimp_channel_get_color       (gint32          channel_ID,
-                                       GimpRGB        *color);
-gboolean gimp_channel_set_color       (gint32          channel_ID,
-                                       const GimpRGB  *color);
+
 
 #ifndef GIMP_DEPRECATED_REPLACE_NEW_API
 
-G_GNUC_INTERNAL gint32 _gimp_channel_new               (GimpImage       *image,
-                                                        gint             width,
-                                                        gint             height,
-                                                        const gchar     *name,
-                                                        gdouble          opacity,
-                                                        const GimpRGB   *color);
-gint32                 gimp_channel_new_from_component (GimpImage       *image,
-                                                        GimpChannelType  component,
-                                                        const gchar     *name);
+G_GNUC_INTERNAL GimpChannel* _gimp_channel_new               (GimpImage       *image,
+                                                              gint             width,
+                                                              gint             height,
+                                                              const gchar     *name,
+                                                              gdouble          opacity,
+                                                              const GimpRGB   *color);
+GimpChannel*                 gimp_channel_new_from_component (GimpImage       *image,
+                                                              GimpChannelType  component,
+                                                              const gchar     *name);
+GimpChannel*                 gimp_channel_copy               (GimpChannel     *channel);
+gboolean                     gimp_channel_combine_masks      (GimpChannel     *channel1,
+                                                              GimpChannel     *channel2,
+                                                              GimpChannelOps   operation,
+                                                              gint             offx,
+                                                              gint             offy);
+gboolean                     gimp_channel_get_show_masked    (GimpChannel     *channel);
+gboolean                     gimp_channel_set_show_masked    (GimpChannel     *channel,
+                                                              gboolean         show_masked);
+gdouble                      gimp_channel_get_opacity        (GimpChannel     *channel);
+gboolean                     gimp_channel_set_opacity        (GimpChannel     *channel,
+                                                              gdouble          opacity);
+gboolean                     gimp_channel_get_color          (GimpChannel     *channel,
+                                                              GimpRGB         *color);
+gboolean                     gimp_channel_set_color          (GimpChannel     *channel,
+                                                              const GimpRGB   *color);
 
 #else /* GIMP_DEPRECATED_REPLACE_NEW_API */
 
 #define _gimp_channel_new __gimp_channel_new
 #define gimp_channel_new_from_component _gimp_channel_new_from_component
+#define gimp_channel_copy _gimp_channel_copy
+#define gimp_channel_combine_masks _gimp_channel_combine_masks
+#define gimp_channel_get_show_masked _gimp_channel_get_show_masked
+#define gimp_channel_set_show_masked _gimp_channel_set_show_masked
+#define gimp_channel_get_opacity _gimp_channel_get_opacity
+#define gimp_channel_set_opacity _gimp_channel_set_opacity
+#define gimp_channel_get_color _gimp_channel_get_color
+#define gimp_channel_set_color _gimp_channel_set_color
 
 
 #endif /* GIMP_DEPRECATED_REPLACE_NEW_API */
@@ -73,15 +82,31 @@ gint32                 gimp_channel_new_from_component (GimpImage       *image,
  * They are not marked internal as a trick to keep the old API alive for now.
  */
 
-gint32 __gimp_channel_new               (gint32           image_ID,
-                                         gint             width,
-                                         gint             height,
-                                         const gchar     *name,
-                                         gdouble          opacity,
-                                         const GimpRGB   *color);
-gint32 _gimp_channel_new_from_component (gint32           image_ID,
-                                         GimpChannelType  component,
-                                         const gchar     *name);
+gint32   __gimp_channel_new               (gint32           image_ID,
+                                           gint             width,
+                                           gint             height,
+                                           const gchar     *name,
+                                           gdouble          opacity,
+                                           const GimpRGB   *color);
+gint32   _gimp_channel_new_from_component (gint32           image_ID,
+                                           GimpChannelType  component,
+                                           const gchar     *name);
+gint32   _gimp_channel_copy               (gint32           channel_ID);
+gboolean _gimp_channel_combine_masks      (gint32           channel1_ID,
+                                           gint32           channel2_ID,
+                                           GimpChannelOps   operation,
+                                           gint             offx,
+                                           gint             offy);
+gboolean _gimp_channel_get_show_masked    (gint32           channel_ID);
+gboolean _gimp_channel_set_show_masked    (gint32           channel_ID,
+                                           gboolean         show_masked);
+gdouble  _gimp_channel_get_opacity        (gint32           channel_ID);
+gboolean _gimp_channel_set_opacity        (gint32           channel_ID,
+                                           gdouble          opacity);
+gboolean _gimp_channel_get_color          (gint32           channel_ID,
+                                           GimpRGB         *color);
+gboolean _gimp_channel_set_color          (gint32           channel_ID,
+                                           const GimpRGB   *color);
 
 
 G_END_DECLS
diff --git a/libgimp/gimpdisplay.c b/libgimp/gimpdisplay.c
new file mode 100644
index 0000000000..ff85fc99eb
--- /dev/null
+++ b/libgimp/gimpdisplay.c
@@ -0,0 +1,160 @@
+/* LIBGIMP - The GIMP Library
+ * Copyright (C) 1995-2000 Peter Mattis and Spencer Kimball
+ *
+ * gimpdisplay.c
+ * Copyright (C) Jehan
+ *
+ * This library is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library.  If not, see
+ * <https://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include "gimp.h"
+
+#include "gimppixbuf.h"
+
+enum
+{
+  PROP_0,
+  PROP_ID,
+  N_PROPS
+};
+
+struct _GimpDisplayPrivate
+{
+  gint id;
+};
+
+static void       gimp_display_set_property  (GObject      *object,
+                                              guint         property_id,
+                                              const GValue *value,
+                                              GParamSpec   *pspec);
+static void       gimp_display_get_property  (GObject      *object,
+                                              guint         property_id,
+                                              GValue       *value,
+                                              GParamSpec   *pspec);
+
+G_DEFINE_TYPE_WITH_PRIVATE (GimpDisplay, gimp_display, G_TYPE_OBJECT)
+
+#define parent_class gimp_display_parent_class
+
+static GParamSpec *props[N_PROPS] = { NULL, };
+
+static void
+gimp_display_class_init (GimpDisplayClass *klass)
+{
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+
+  object_class->set_property = gimp_display_set_property;
+  object_class->get_property = gimp_display_get_property;
+
+  props[PROP_ID] =
+    g_param_spec_int ("id",
+                      "The display id",
+                      "The display id for internal use",
+                      0, G_MAXINT32, 0,
+                      GIMP_PARAM_READWRITE |
+                      G_PARAM_CONSTRUCT_ONLY);
+
+  g_object_class_install_properties (object_class, N_PROPS, props);
+}
+
+static void
+gimp_display_init (GimpDisplay *display)
+{
+  display->priv = gimp_display_get_instance_private (display);
+}
+
+static void
+gimp_display_set_property (GObject      *object,
+                           guint         property_id,
+                           const GValue *value,
+                           GParamSpec   *pspec)
+{
+  GimpDisplay *display = GIMP_DISPLAY (object);
+
+  switch (property_id)
+    {
+    case PROP_ID:
+      display->priv->id = g_value_get_int (value);
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+      break;
+    }
+}
+
+static void
+gimp_display_get_property (GObject    *object,
+                           guint       property_id,
+                           GValue     *value,
+                           GParamSpec *pspec)
+{
+  GimpDisplay *display = GIMP_DISPLAY (object);
+
+  switch (property_id)
+    {
+    case PROP_ID:
+      g_value_set_int (value, display->priv->id);
+      break;
+
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
+      break;
+    }
+}
+
+
+/* Public API. */
+
+
+/**
+ * gimp_display_get_id:
+ * @display: The display.
+ *
+ * Returns: the display ID.
+ *
+ * Since: 3.0
+ **/
+gint32
+gimp_display_get_id (GimpDisplay *display)
+{
+  return display->priv->id;
+}
+
+/**
+ * gimp_display_new_by_id:
+ * @display_id: The display id.
+ *
+ * Creates a #GimpDisplay representing @display_id.
+ *
+ * Returns: (nullable) (transfer full): a #GimpDisplay for @display_id or
+ *          %NULL if @display_id does not represent a valid display.
+ *
+ * Since: 3.0
+ **/
+GimpDisplay *
+gimp_display_new_by_id (gint32 display_id)
+{
+  GimpDisplay *display = NULL;
+
+  if (_gimp_display_is_valid (display_id))
+    display = g_object_new (GIMP_TYPE_DISPLAY,
+                            "id", display_id,
+                            NULL);
+
+  return display;
+}
diff --git a/libgimp/gimpdisplay.h b/libgimp/gimpdisplay.h
new file mode 100644
index 0000000000..043311478f
--- /dev/null
+++ b/libgimp/gimpdisplay.h
@@ -0,0 +1,75 @@
+/* LIBGIMP - The GIMP Library
+ * Copyright (C) 1995-2000 Peter Mattis and Spencer Kimball
+ *
+ * gimpdisplay.h
+ * Copyright (C) Jehan
+ *
+ * This library is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library.  If not, see
+ * <https://www.gnu.org/licenses/>.
+ */
+
+#if !defined (__GIMP_H_INSIDE__) && !defined (GIMP_COMPILATION)
+#error "Only <libgimp/gimp.h> can be included directly."
+#endif
+
+#ifndef __GIMP_DISPLAY_H__
+#define __GIMP_DISPLAY_H__
+
+G_BEGIN_DECLS
+
+/* For information look into the C source or the html documentation */
+
+#define GIMP_TYPE_DISPLAY            (gimp_display_get_type ())
+#define GIMP_DISPLAY(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_DISPLAY, GimpDisplay))
+#define GIMP_DISPLAY_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_DISPLAY, GimpDisplayClass))
+#define GIMP_IS_DISPLAY(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_DISPLAY))
+#define GIMP_IS_DISPLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_DISPLAY))
+#define GIMP_DISPLAY_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_DISPLAY, GimpDisplayClass))
+
+
+typedef struct _GimpDisplayClass   GimpDisplayClass;
+typedef struct _GimpDisplayPrivate GimpDisplayPrivate;
+
+struct _GimpDisplay
+{
+  GObject      parent_instance;
+
+  GimpDisplayPrivate *priv;
+};
+
+struct _GimpDisplayClass
+{
+  GObjectClass parent_class;
+
+  /* Padding for future expansion */
+  void (*_gimp_reserved1) (void);
+  void (*_gimp_reserved2) (void);
+  void (*_gimp_reserved3) (void);
+  void (*_gimp_reserved4) (void);
+  void (*_gimp_reserved5) (void);
+  void (*_gimp_reserved6) (void);
+  void (*_gimp_reserved7) (void);
+  void (*_gimp_reserved8) (void);
+  void (*_gimp_reserved9) (void);
+};
+
+GType         gimp_display_get_type     (void) G_GNUC_CONST;
+
+gint32        gimp_display_get_id       (GimpDisplay    *display);
+GimpDisplay * gimp_display_new_by_id    (gint32          display_id);
+
+
+G_END_DECLS
+
+#endif /* __GIMP_DISPLAY_H__ */
diff --git a/libgimp/gimpdisplay_pdb.c b/libgimp/gimpdisplay_pdb.c
index 1f88c8ad1c..0089d0cfc2 100644
--- a/libgimp/gimpdisplay_pdb.c
+++ b/libgimp/gimpdisplay_pdb.c
@@ -36,6 +36,48 @@
 
 /**
  * gimp_display_is_valid:
+ * @display: The display to check.
+ *
+ * Returns TRUE if the display is valid.
+ *
+ * This procedure checks if the given display ID is valid and refers to
+ * an existing display.
+ *
+ * Returns: Whether the display ID is valid.
+ *
+ * Since: 2.4
+ **/
+gboolean
+gimp_display_is_valid (GimpDisplay *display)
+{
+  GimpPDB        *pdb = gimp_get_pdb ();
+  GimpValueArray *args;
+  GimpValueArray *return_vals;
+  gboolean valid = FALSE;
+
+  args = gimp_value_array_new_from_types (NULL,
+                                          GIMP_TYPE_DISPLAY_ID, gimp_display_get_id (display),
+                                          G_TYPE_NONE);
+
+  if (pdb)
+    return_vals = gimp_pdb_run_procedure_array (pdb,
+                                                "gimp-display-is-valid",
+                                                args);
+  else
+    return_vals = gimp_run_procedure_array ("gimp-display-is-valid",
+                                            args);
+  gimp_value_array_unref (args);
+
+  if (g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS)
+    valid = g_value_get_boolean (gimp_value_array_index (return_vals, 1));
+
+  gimp_value_array_unref (return_vals);
+
+  return valid;
+}
+
+/**
+ * _gimp_display_is_valid: (skip)
  * @display_ID: The display to check.
  *
  * Returns TRUE if the display is valid.
@@ -48,7 +90,7 @@
  * Since: 2.4
  **/
 gboolean
-gimp_display_is_valid (gint32 display_ID)
+_gimp_display_is_valid (gint32 display_ID)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -89,15 +131,15 @@ gimp_display_is_valid (gint32 display_ID)
  * procedure only makes sense for use with the GIMP UI, and will result
  * in an execution error if called when GIMP has no UI.
  *
- * Returns: The new display.
+ * Returns: (transfer full): The new display.
  **/
-gint32
+GimpDisplay *
 gimp_display_new (GimpImage *image)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
   GimpValueArray *return_vals;
-  gint32 display_ID = -1;
+  GimpDisplay *display = NULL;
 
   args = gimp_value_array_new_from_types (NULL,
                                           GIMP_TYPE_IMAGE_ID, gimp_image_get_id (image),
@@ -113,11 +155,11 @@ gimp_display_new (GimpImage *image)
   gimp_value_array_unref (args);
 
   if (g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS)
-    display_ID = gimp_value_get_display_id (gimp_value_array_index (return_vals, 1));
+    display = gimp_display_new_by_id (gimp_value_get_display_id (gimp_value_array_index (return_vals, 1)));
 
   gimp_value_array_unref (return_vals);
 
-  return display_ID;
+  return display;
 }
 
 /**
@@ -166,6 +208,48 @@ _gimp_display_new (gint32 image_ID)
 
 /**
  * gimp_display_delete:
+ * @display: The display to delete.
+ *
+ * Delete the specified display.
+ *
+ * This procedure removes the specified display. If this is the last
+ * remaining display for the underlying image, then the image is
+ * deleted also. Note that the display is closed no matter if the image
+ * is dirty or not. Better save the image before calling this
+ * procedure.
+ *
+ * Returns: TRUE on success.
+ **/
+gboolean
+gimp_display_delete (GimpDisplay *display)
+{
+  GimpPDB        *pdb = gimp_get_pdb ();
+  GimpValueArray *args;
+  GimpValueArray *return_vals;
+  gboolean success = TRUE;
+
+  args = gimp_value_array_new_from_types (NULL,
+                                          GIMP_TYPE_DISPLAY_ID, gimp_display_get_id (display),
+                                          G_TYPE_NONE);
+
+  if (pdb)
+    return_vals = gimp_pdb_run_procedure_array (pdb,
+                                                "gimp-display-delete",
+                                                args);
+  else
+    return_vals = gimp_run_procedure_array ("gimp-display-delete",
+                                            args);
+  gimp_value_array_unref (args);
+
+  success = g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS;
+
+  gimp_value_array_unref (return_vals);
+
+  return success;
+}
+
+/**
+ * _gimp_display_delete: (skip)
  * @display_ID: The display to delete.
  *
  * Delete the specified display.
@@ -179,7 +263,7 @@ _gimp_display_new (gint32 image_ID)
  * Returns: TRUE on success.
  **/
 gboolean
-gimp_display_delete (gint32 display_ID)
+_gimp_display_delete (gint32 display_ID)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -208,6 +292,51 @@ gimp_display_delete (gint32 display_ID)
 
 /**
  * gimp_display_get_window_handle:
+ * @display: The display to get the window handle from.
+ *
+ * Get a handle to the native window for an image display.
+ *
+ * This procedure returns a handle to the native window for a given
+ * image display. For example in the X backend of GDK, a native window
+ * handle is an Xlib XID. A value of 0 is returned for an invalid
+ * display or if this function is unimplemented for the windowing
+ * system that is being used.
+ *
+ * Returns: The native window handle or 0.
+ *
+ * Since: 2.4
+ **/
+gint
+gimp_display_get_window_handle (GimpDisplay *display)
+{
+  GimpPDB        *pdb = gimp_get_pdb ();
+  GimpValueArray *args;
+  GimpValueArray *return_vals;
+  gint window = 0;
+
+  args = gimp_value_array_new_from_types (NULL,
+                                          GIMP_TYPE_DISPLAY_ID, gimp_display_get_id (display),
+                                          G_TYPE_NONE);
+
+  if (pdb)
+    return_vals = gimp_pdb_run_procedure_array (pdb,
+                                                "gimp-display-get-window-handle",
+                                                args);
+  else
+    return_vals = gimp_run_procedure_array ("gimp-display-get-window-handle",
+                                            args);
+  gimp_value_array_unref (args);
+
+  if (g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS)
+    window = g_value_get_int (gimp_value_array_index (return_vals, 1));
+
+  gimp_value_array_unref (return_vals);
+
+  return window;
+}
+
+/**
+ * _gimp_display_get_window_handle: (skip)
  * @display_ID: The display to get the window handle from.
  *
  * Get a handle to the native window for an image display.
@@ -223,7 +352,7 @@ gimp_display_delete (gint32 display_ID)
  * Since: 2.4
  **/
 gint
-gimp_display_get_window_handle (gint32 display_ID)
+_gimp_display_get_window_handle (gint32 display_ID)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
diff --git a/libgimp/gimpdisplay_pdb.h b/libgimp/gimpdisplay_pdb.h
index 9df129fa59..2bfb981ec5 100644
--- a/libgimp/gimpdisplay_pdb.h
+++ b/libgimp/gimpdisplay_pdb.h
@@ -32,20 +32,23 @@ G_BEGIN_DECLS
 /* For information look into the C source or the html documentation */
 
 
-gboolean gimp_display_is_valid          (gint32 display_ID);
-gboolean gimp_display_delete            (gint32 display_ID);
-gint     gimp_display_get_window_handle (gint32 display_ID);
-gboolean gimp_displays_flush            (void);
+gboolean gimp_displays_flush (void);
 
 #ifndef GIMP_DEPRECATED_REPLACE_NEW_API
 
-gint32   gimp_display_new        (GimpImage *image);
-gboolean gimp_displays_reconnect (GimpImage *old_image,
-                                  GimpImage *new_image);
+gboolean     gimp_display_is_valid          (GimpDisplay *display);
+GimpDisplay* gimp_display_new               (GimpImage   *image);
+gboolean     gimp_display_delete            (GimpDisplay *display);
+gint         gimp_display_get_window_handle (GimpDisplay *display);
+gboolean     gimp_displays_reconnect        (GimpImage   *old_image,
+                                             GimpImage   *new_image);
 
 #else /* GIMP_DEPRECATED_REPLACE_NEW_API */
 
+#define gimp_display_is_valid _gimp_display_is_valid
 #define gimp_display_new _gimp_display_new
+#define gimp_display_delete _gimp_display_delete
+#define gimp_display_get_window_handle _gimp_display_get_window_handle
 #define gimp_displays_reconnect _gimp_displays_reconnect
 
 
@@ -55,9 +58,12 @@ gboolean gimp_displays_reconnect (GimpImage *old_image,
  * They are not marked internal as a trick to keep the old API alive for now.
  */
 
-gint32   _gimp_display_new        (gint32 image_ID);
-gboolean _gimp_displays_reconnect (gint32 old_image_ID,
-                                   gint32 new_image_ID);
+gboolean _gimp_display_is_valid          (gint32 display_ID);
+gint32   _gimp_display_new               (gint32 image_ID);
+gboolean _gimp_display_delete            (gint32 display_ID);
+gint     _gimp_display_get_window_handle (gint32 display_ID);
+gboolean _gimp_displays_reconnect        (gint32 old_image_ID,
+                                          gint32 new_image_ID);
 
 
 G_END_DECLS
diff --git a/libgimp/gimpimage_pdb.c b/libgimp/gimpimage_pdb.c
index 4221e39cc6..9da6806816 100644
--- a/libgimp/gimpimage_pdb.c
+++ b/libgimp/gimpimage_pdb.c
@@ -2214,8 +2214,8 @@ _gimp_image_thaw_layers (gint32 image_ID)
 /**
  * gimp_image_insert_channel:
  * @image: The image.
- * @channel_ID: The channel.
- * @parent_ID: The parent channel.
+ * @channel: The channel.
+ * @parent: The parent channel.
  * @position: The channel position.
  *
  * Add the specified channel to the image.
@@ -2230,10 +2230,10 @@ _gimp_image_thaw_layers (gint32 image_ID)
  * Returns: TRUE on success.
  **/
 gboolean
-gimp_image_insert_channel (GimpImage *image,
-                           gint32     channel_ID,
-                           gint32     parent_ID,
-                           gint       position)
+gimp_image_insert_channel (GimpImage   *image,
+                           GimpChannel *channel,
+                           GimpChannel *parent,
+                           gint         position)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -2242,8 +2242,8 @@ gimp_image_insert_channel (GimpImage *image,
 
   args = gimp_value_array_new_from_types (NULL,
                                           GIMP_TYPE_IMAGE_ID, gimp_image_get_id (image),
-                                          GIMP_TYPE_CHANNEL_ID, channel_ID,
-                                          GIMP_TYPE_CHANNEL_ID, parent_ID,
+                                          GIMP_TYPE_CHANNEL_ID, gimp_item_get_id (GIMP_ITEM (channel)),
+                                          GIMP_TYPE_CHANNEL_ID, gimp_item_get_id (GIMP_ITEM (parent)),
                                           G_TYPE_INT, position,
                                           G_TYPE_NONE);
 
@@ -2318,7 +2318,7 @@ _gimp_image_insert_channel (gint32 image_ID,
 /**
  * gimp_image_remove_channel:
  * @image: The image.
- * @channel_ID: The channel.
+ * @channel: The channel.
  *
  * Remove the specified channel from the image.
  *
@@ -2328,8 +2328,8 @@ _gimp_image_insert_channel (gint32 image_ID,
  * Returns: TRUE on success.
  **/
 gboolean
-gimp_image_remove_channel (GimpImage *image,
-                           gint32     channel_ID)
+gimp_image_remove_channel (GimpImage   *image,
+                           GimpChannel *channel)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -2338,7 +2338,7 @@ gimp_image_remove_channel (GimpImage *image,
 
   args = gimp_value_array_new_from_types (NULL,
                                           GIMP_TYPE_IMAGE_ID, gimp_image_get_id (image),
-                                          GIMP_TYPE_CHANNEL_ID, channel_ID,
+                                          GIMP_TYPE_CHANNEL_ID, gimp_item_get_id (GIMP_ITEM (channel)),
                                           G_TYPE_NONE);
 
   if (pdb)
@@ -2584,8 +2584,8 @@ _gimp_image_thaw_channels (gint32 image_ID)
 /**
  * gimp_image_insert_vectors:
  * @image: The image.
- * @vectors_ID: The vectors.
- * @parent_ID: The parent vectors.
+ * @vectors: The vectors.
+ * @parent: The parent vectors.
  * @position: The vectors position.
  *
  * Add the specified vectors to the image.
@@ -2600,10 +2600,10 @@ _gimp_image_thaw_channels (gint32 image_ID)
  * Returns: TRUE on success.
  **/
 gboolean
-gimp_image_insert_vectors (GimpImage *image,
-                           gint32     vectors_ID,
-                           gint32     parent_ID,
-                           gint       position)
+gimp_image_insert_vectors (GimpImage   *image,
+                           GimpVectors *vectors,
+                           GimpVectors *parent,
+                           gint         position)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -2612,8 +2612,8 @@ gimp_image_insert_vectors (GimpImage *image,
 
   args = gimp_value_array_new_from_types (NULL,
                                           GIMP_TYPE_IMAGE_ID, gimp_image_get_id (image),
-                                          GIMP_TYPE_VECTORS_ID, vectors_ID,
-                                          GIMP_TYPE_VECTORS_ID, parent_ID,
+                                          GIMP_TYPE_VECTORS_ID, gimp_item_get_id (GIMP_ITEM (vectors)),
+                                          GIMP_TYPE_VECTORS_ID, gimp_item_get_id (GIMP_ITEM (parent)),
                                           G_TYPE_INT, position,
                                           G_TYPE_NONE);
 
@@ -2688,7 +2688,7 @@ _gimp_image_insert_vectors (gint32 image_ID,
 /**
  * gimp_image_remove_vectors:
  * @image: The image.
- * @vectors_ID: The vectors object.
+ * @vectors: The vectors object.
  *
  * Remove the specified path from the image.
  *
@@ -2700,8 +2700,8 @@ _gimp_image_insert_vectors (gint32 image_ID,
  * Since: 2.4
  **/
 gboolean
-gimp_image_remove_vectors (GimpImage *image,
-                           gint32     vectors_ID)
+gimp_image_remove_vectors (GimpImage   *image,
+                           GimpVectors *vectors)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -2710,7 +2710,7 @@ gimp_image_remove_vectors (GimpImage *image,
 
   args = gimp_value_array_new_from_types (NULL,
                                           GIMP_TYPE_IMAGE_ID, gimp_image_get_id (image),
-                                          GIMP_TYPE_VECTORS_ID, vectors_ID,
+                                          GIMP_TYPE_VECTORS_ID, gimp_item_get_id (GIMP_ITEM (vectors)),
                                           G_TYPE_NONE);
 
   if (pdb)
@@ -4637,15 +4637,15 @@ _gimp_image_set_active_layer (gint32 image_ID,
  * If there is an active channel, this will return the channel ID,
  * otherwise, -1.
  *
- * Returns: The active channel.
+ * Returns: (transfer full): The active channel.
  **/
-gint32
+GimpChannel *
 gimp_image_get_active_channel (GimpImage *image)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
   GimpValueArray *return_vals;
-  gint32 active_channel_ID = -1;
+  GimpChannel *active_channel = NULL;
 
   args = gimp_value_array_new_from_types (NULL,
                                           GIMP_TYPE_IMAGE_ID, gimp_image_get_id (image),
@@ -4661,11 +4661,11 @@ gimp_image_get_active_channel (GimpImage *image)
   gimp_value_array_unref (args);
 
   if (g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS)
-    active_channel_ID = gimp_value_get_channel_id (gimp_value_array_index (return_vals, 1));
+    active_channel = GIMP_CHANNEL (gimp_item_new_by_id (gimp_value_get_channel_id (gimp_value_array_index 
(return_vals, 1))));
 
   gimp_value_array_unref (return_vals);
 
-  return active_channel_ID;
+  return active_channel;
 }
 
 /**
@@ -4711,7 +4711,7 @@ _gimp_image_get_active_channel (gint32 image_ID)
 /**
  * gimp_image_set_active_channel:
  * @image: The image.
- * @active_channel_ID: The new image active channel.
+ * @active_channel: The new image active channel.
  *
  * Sets the specified image's active channel.
  *
@@ -4723,8 +4723,8 @@ _gimp_image_get_active_channel (gint32 image_ID)
  * Returns: TRUE on success.
  **/
 gboolean
-gimp_image_set_active_channel (GimpImage *image,
-                               gint32     active_channel_ID)
+gimp_image_set_active_channel (GimpImage   *image,
+                               GimpChannel *active_channel)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -4733,7 +4733,7 @@ gimp_image_set_active_channel (GimpImage *image,
 
   args = gimp_value_array_new_from_types (NULL,
                                           GIMP_TYPE_IMAGE_ID, gimp_image_get_id (image),
-                                          GIMP_TYPE_CHANNEL_ID, active_channel_ID,
+                                          GIMP_TYPE_CHANNEL_ID, gimp_item_get_id (GIMP_ITEM 
(active_channel)),
                                           G_TYPE_NONE);
 
   if (pdb)
@@ -4804,15 +4804,15 @@ _gimp_image_set_active_channel (gint32 image_ID,
  *
  * If there is an active path, its ID will be returned, otherwise, -1.
  *
- * Returns: The active vectors.
+ * Returns: (transfer full): The active vectors.
  **/
-gint32
+GimpVectors *
 gimp_image_get_active_vectors (GimpImage *image)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
   GimpValueArray *return_vals;
-  gint32 active_vectors_ID = -1;
+  GimpVectors *active_vectors = NULL;
 
   args = gimp_value_array_new_from_types (NULL,
                                           GIMP_TYPE_IMAGE_ID, gimp_image_get_id (image),
@@ -4828,11 +4828,11 @@ gimp_image_get_active_vectors (GimpImage *image)
   gimp_value_array_unref (args);
 
   if (g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS)
-    active_vectors_ID = gimp_value_get_vectors_id (gimp_value_array_index (return_vals, 1));
+    active_vectors = GIMP_VECTORS (gimp_item_new_by_id (gimp_value_get_vectors_id (gimp_value_array_index 
(return_vals, 1))));
 
   gimp_value_array_unref (return_vals);
 
-  return active_vectors_ID;
+  return active_vectors;
 }
 
 /**
@@ -4877,7 +4877,7 @@ _gimp_image_get_active_vectors (gint32 image_ID)
 /**
  * gimp_image_set_active_vectors:
  * @image: The image.
- * @active_vectors_ID: The new image active vectors.
+ * @active_vectors: The new image active vectors.
  *
  * Sets the specified image's active vectors.
  *
@@ -4886,8 +4886,8 @@ _gimp_image_get_active_vectors (gint32 image_ID)
  * Returns: TRUE on success.
  **/
 gboolean
-gimp_image_set_active_vectors (GimpImage *image,
-                               gint32     active_vectors_ID)
+gimp_image_set_active_vectors (GimpImage   *image,
+                               GimpVectors *active_vectors)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -4896,7 +4896,7 @@ gimp_image_set_active_vectors (GimpImage *image,
 
   args = gimp_value_array_new_from_types (NULL,
                                           GIMP_TYPE_IMAGE_ID, gimp_image_get_id (image),
-                                          GIMP_TYPE_VECTORS_ID, active_vectors_ID,
+                                          GIMP_TYPE_VECTORS_ID, gimp_item_get_id (GIMP_ITEM 
(active_vectors)),
                                           G_TYPE_NONE);
 
   if (pdb)
@@ -4965,15 +4965,15 @@ _gimp_image_set_active_vectors (gint32 image_ID,
  * This will always return a valid ID for a selection -- which is
  * represented as a channel internally.
  *
- * Returns: The selection channel.
+ * Returns: (transfer full): The selection channel.
  **/
-gint32
+GimpSelection *
 gimp_image_get_selection (GimpImage *image)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
   GimpValueArray *return_vals;
-  gint32 selection_ID = -1;
+  GimpSelection *selection = NULL;
 
   args = gimp_value_array_new_from_types (NULL,
                                           GIMP_TYPE_IMAGE_ID, gimp_image_get_id (image),
@@ -4989,11 +4989,11 @@ gimp_image_get_selection (GimpImage *image)
   gimp_value_array_unref (args);
 
   if (g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS)
-    selection_ID = gimp_value_get_selection_id (gimp_value_array_index (return_vals, 1));
+    selection = GIMP_SELECTION (gimp_item_new_by_id (gimp_value_get_selection_id (gimp_value_array_index 
(return_vals, 1))));
 
   gimp_value_array_unref (return_vals);
 
-  return selection_ID;
+  return selection;
 }
 
 /**
@@ -6682,16 +6682,16 @@ _gimp_image_get_layer_by_tattoo (gint32 image_ID,
  * This procedure returns the channel with the given tattoo in the
  * specified image.
  *
- * Returns: The channel with the specified tattoo.
+ * Returns: (transfer full): The channel with the specified tattoo.
  **/
-gint32
+GimpChannel *
 gimp_image_get_channel_by_tattoo (GimpImage *image,
                                   guint      tattoo)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
   GimpValueArray *return_vals;
-  gint32 channel_ID = -1;
+  GimpChannel *channel = NULL;
 
   args = gimp_value_array_new_from_types (NULL,
                                           GIMP_TYPE_IMAGE_ID, gimp_image_get_id (image),
@@ -6708,11 +6708,11 @@ gimp_image_get_channel_by_tattoo (GimpImage *image,
   gimp_value_array_unref (args);
 
   if (g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS)
-    channel_ID = gimp_value_get_channel_id (gimp_value_array_index (return_vals, 1));
+    channel = GIMP_CHANNEL (gimp_item_new_by_id (gimp_value_get_channel_id (gimp_value_array_index 
(return_vals, 1))));
 
   gimp_value_array_unref (return_vals);
 
-  return channel_ID;
+  return channel;
 }
 
 /**
@@ -6768,18 +6768,18 @@ _gimp_image_get_channel_by_tattoo (gint32 image_ID,
  * This procedure returns the vectors with the given tattoo in the
  * specified image.
  *
- * Returns: The vectors with the specified tattoo.
+ * Returns: (transfer full): The vectors with the specified tattoo.
  *
  * Since: 2.6
  **/
-gint32
+GimpVectors *
 gimp_image_get_vectors_by_tattoo (GimpImage *image,
                                   guint      tattoo)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
   GimpValueArray *return_vals;
-  gint32 vectors_ID = -1;
+  GimpVectors *vectors = NULL;
 
   args = gimp_value_array_new_from_types (NULL,
                                           GIMP_TYPE_IMAGE_ID, gimp_image_get_id (image),
@@ -6796,11 +6796,11 @@ gimp_image_get_vectors_by_tattoo (GimpImage *image,
   gimp_value_array_unref (args);
 
   if (g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS)
-    vectors_ID = gimp_value_get_vectors_id (gimp_value_array_index (return_vals, 1));
+    vectors = GIMP_VECTORS (gimp_item_new_by_id (gimp_value_get_vectors_id (gimp_value_array_index 
(return_vals, 1))));
 
   gimp_value_array_unref (return_vals);
 
-  return vectors_ID;
+  return vectors;
 }
 
 /**
@@ -6948,18 +6948,18 @@ _gimp_image_get_layer_by_name (gint32       image_ID,
  * This procedure returns the channel with the given name in the
  * specified image.
  *
- * Returns: The channel with the specified name.
+ * Returns: (transfer full): The channel with the specified name.
  *
  * Since: 2.8
  **/
-gint32
+GimpChannel *
 gimp_image_get_channel_by_name (GimpImage   *image,
                                 const gchar *name)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
   GimpValueArray *return_vals;
-  gint32 channel_ID = -1;
+  GimpChannel *channel = NULL;
 
   args = gimp_value_array_new_from_types (NULL,
                                           GIMP_TYPE_IMAGE_ID, gimp_image_get_id (image),
@@ -6976,11 +6976,11 @@ gimp_image_get_channel_by_name (GimpImage   *image,
   gimp_value_array_unref (args);
 
   if (g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS)
-    channel_ID = gimp_value_get_channel_id (gimp_value_array_index (return_vals, 1));
+    channel = GIMP_CHANNEL (gimp_item_new_by_id (gimp_value_get_channel_id (gimp_value_array_index 
(return_vals, 1))));
 
   gimp_value_array_unref (return_vals);
 
-  return channel_ID;
+  return channel;
 }
 
 /**
@@ -7038,18 +7038,18 @@ _gimp_image_get_channel_by_name (gint32       image_ID,
  * This procedure returns the vectors with the given name in the
  * specified image.
  *
- * Returns: The vectors with the specified name.
+ * Returns: (transfer full): The vectors with the specified name.
  *
  * Since: 2.8
  **/
-gint32
+GimpVectors *
 gimp_image_get_vectors_by_name (GimpImage   *image,
                                 const gchar *name)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
   GimpValueArray *return_vals;
-  gint32 vectors_ID = -1;
+  GimpVectors *vectors = NULL;
 
   args = gimp_value_array_new_from_types (NULL,
                                           GIMP_TYPE_IMAGE_ID, gimp_image_get_id (image),
@@ -7066,11 +7066,11 @@ gimp_image_get_vectors_by_name (GimpImage   *image,
   gimp_value_array_unref (args);
 
   if (g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS)
-    vectors_ID = gimp_value_get_vectors_id (gimp_value_array_index (return_vals, 1));
+    vectors = GIMP_VECTORS (gimp_item_new_by_id (gimp_value_get_vectors_id (gimp_value_array_index 
(return_vals, 1))));
 
   gimp_value_array_unref (return_vals);
 
-  return vectors_ID;
+  return vectors;
 }
 
 /**
diff --git a/libgimp/gimpimage_pdb.h b/libgimp/gimpimage_pdb.h
index 53b0885ffd..0ade23a1f4 100644
--- a/libgimp/gimpimage_pdb.h
+++ b/libgimp/gimpimage_pdb.h
@@ -81,19 +81,19 @@ gboolean                 gimp_image_remove_layer               (GimpImage
 gboolean                 gimp_image_freeze_layers              (GimpImage           *image);
 gboolean                 gimp_image_thaw_layers                (GimpImage           *image);
 gboolean                 gimp_image_insert_channel             (GimpImage           *image,
-                                                                gint32               channel_ID,
-                                                                gint32               parent_ID,
+                                                                GimpChannel         *channel,
+                                                                GimpChannel         *parent,
                                                                 gint                 position);
 gboolean                 gimp_image_remove_channel             (GimpImage           *image,
-                                                                gint32               channel_ID);
+                                                                GimpChannel         *channel);
 gboolean                 gimp_image_freeze_channels            (GimpImage           *image);
 gboolean                 gimp_image_thaw_channels              (GimpImage           *image);
 gboolean                 gimp_image_insert_vectors             (GimpImage           *image,
-                                                                gint32               vectors_ID,
-                                                                gint32               parent_ID,
+                                                                GimpVectors         *vectors,
+                                                                GimpVectors         *parent,
                                                                 gint                 position);
 gboolean                 gimp_image_remove_vectors             (GimpImage           *image,
-                                                                gint32               vectors_ID);
+                                                                GimpVectors         *vectors);
 gboolean                 gimp_image_freeze_vectors             (GimpImage           *image);
 gboolean                 gimp_image_thaw_vectors               (GimpImage           *image);
 gint                     gimp_image_get_item_position          (GimpImage           *image,
@@ -137,13 +137,13 @@ G_GNUC_INTERNAL gboolean _gimp_image_thumbnail                 (GimpImage
 GimpLayer*               gimp_image_get_active_layer           (GimpImage           *image);
 gboolean                 gimp_image_set_active_layer           (GimpImage           *image,
                                                                 GimpLayer           *active_layer);
-gint32                   gimp_image_get_active_channel         (GimpImage           *image);
+GimpChannel*             gimp_image_get_active_channel         (GimpImage           *image);
 gboolean                 gimp_image_set_active_channel         (GimpImage           *image,
-                                                                gint32               active_channel_ID);
-gint32                   gimp_image_get_active_vectors         (GimpImage           *image);
+                                                                GimpChannel         *active_channel);
+GimpVectors*             gimp_image_get_active_vectors         (GimpImage           *image);
 gboolean                 gimp_image_set_active_vectors         (GimpImage           *image,
-                                                                gint32               active_vectors_ID);
-gint32                   gimp_image_get_selection              (GimpImage           *image);
+                                                                GimpVectors         *active_vectors);
+GimpSelection*           gimp_image_get_selection              (GimpImage           *image);
 gboolean                 gimp_image_get_component_active       (GimpImage           *image,
                                                                 GimpChannelType      component);
 gboolean                 gimp_image_set_component_active       (GimpImage           *image,
@@ -176,15 +176,15 @@ gboolean                 gimp_image_set_tattoo_state           (GimpImage
                                                                 guint                tattoo_state);
 GimpLayer*               gimp_image_get_layer_by_tattoo        (GimpImage           *image,
                                                                 guint                tattoo);
-gint32                   gimp_image_get_channel_by_tattoo      (GimpImage           *image,
+GimpChannel*             gimp_image_get_channel_by_tattoo      (GimpImage           *image,
                                                                 guint                tattoo);
-gint32                   gimp_image_get_vectors_by_tattoo      (GimpImage           *image,
+GimpVectors*             gimp_image_get_vectors_by_tattoo      (GimpImage           *image,
                                                                 guint                tattoo);
 GimpLayer*               gimp_image_get_layer_by_name          (GimpImage           *image,
                                                                 const gchar         *name);
-gint32                   gimp_image_get_channel_by_name        (GimpImage           *image,
+GimpChannel*             gimp_image_get_channel_by_name        (GimpImage           *image,
                                                                 const gchar         *name);
-gint32                   gimp_image_get_vectors_by_name        (GimpImage           *image,
+GimpVectors*             gimp_image_get_vectors_by_name        (GimpImage           *image,
                                                                 const gchar         *name);
 gboolean                 gimp_image_attach_parasite            (GimpImage           *image,
                                                                 const GimpParasite  *parasite);
diff --git a/libgimp/gimpimageguides_pdb.c b/libgimp/gimpimageguides_pdb.c
index 84d027d58b..08b5c1b04a 100644
--- a/libgimp/gimpimageguides_pdb.c
+++ b/libgimp/gimpimageguides_pdb.c
@@ -47,14 +47,14 @@
  *
  * Returns: The new guide.
  **/
-gint32
+guint
 gimp_image_add_hguide (GimpImage *image,
                        gint       yposition)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
   GimpValueArray *return_vals;
-  gint32 guide_ID = -1;
+  guint guide = 0;
 
   args = gimp_value_array_new_from_types (NULL,
                                           GIMP_TYPE_IMAGE_ID, gimp_image_get_id (image),
@@ -71,11 +71,11 @@ gimp_image_add_hguide (GimpImage *image,
   gimp_value_array_unref (args);
 
   if (g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS)
-    guide_ID = g_value_get_uint (gimp_value_array_index (return_vals, 1));
+    guide = g_value_get_uint (gimp_value_array_index (return_vals, 1));
 
   gimp_value_array_unref (return_vals);
 
-  return guide_ID;
+  return guide;
 }
 
 /**
@@ -135,14 +135,14 @@ _gimp_image_add_hguide (gint32 image_ID,
  *
  * Returns: The new guide.
  **/
-gint32
+guint
 gimp_image_add_vguide (GimpImage *image,
                        gint       xposition)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
   GimpValueArray *return_vals;
-  gint32 guide_ID = -1;
+  guint guide = 0;
 
   args = gimp_value_array_new_from_types (NULL,
                                           GIMP_TYPE_IMAGE_ID, gimp_image_get_id (image),
@@ -159,11 +159,11 @@ gimp_image_add_vguide (GimpImage *image,
   gimp_value_array_unref (args);
 
   if (g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS)
-    guide_ID = g_value_get_uint (gimp_value_array_index (return_vals, 1));
+    guide = g_value_get_uint (gimp_value_array_index (return_vals, 1));
 
   gimp_value_array_unref (return_vals);
 
-  return guide_ID;
+  return guide;
 }
 
 /**
@@ -213,7 +213,7 @@ _gimp_image_add_vguide (gint32 image_ID,
 /**
  * gimp_image_delete_guide:
  * @image: The image.
- * @guide_ID: The ID of the guide to be removed.
+ * @guide: The ID of the guide to be removed.
  *
  * Deletes a guide from an image.
  *
@@ -224,7 +224,7 @@ _gimp_image_add_vguide (gint32 image_ID,
  **/
 gboolean
 gimp_image_delete_guide (GimpImage *image,
-                         gint32     guide_ID)
+                         guint      guide)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -233,7 +233,7 @@ gimp_image_delete_guide (GimpImage *image,
 
   args = gimp_value_array_new_from_types (NULL,
                                           GIMP_TYPE_IMAGE_ID, gimp_image_get_id (image),
-                                          G_TYPE_UINT, guide_ID,
+                                          G_TYPE_UINT, guide,
                                           G_TYPE_NONE);
 
   if (pdb)
@@ -297,7 +297,7 @@ _gimp_image_delete_guide (gint32 image_ID,
 /**
  * gimp_image_find_next_guide:
  * @image: The image.
- * @guide_ID: The ID of the current guide (0 if first invocation).
+ * @guide: The ID of the current guide (0 if first invocation).
  *
  * Find next guide on an image.
  *
@@ -309,18 +309,18 @@ _gimp_image_delete_guide (gint32 image_ID,
  *
  * Returns: The next guide's ID.
  **/
-gint32
+guint
 gimp_image_find_next_guide (GimpImage *image,
-                            gint32     guide_ID)
+                            guint      guide)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
   GimpValueArray *return_vals;
-  gint32 next_guide_ID = -1;
+  guint next_guide = 0;
 
   args = gimp_value_array_new_from_types (NULL,
                                           GIMP_TYPE_IMAGE_ID, gimp_image_get_id (image),
-                                          G_TYPE_UINT, guide_ID,
+                                          G_TYPE_UINT, guide,
                                           G_TYPE_NONE);
 
   if (pdb)
@@ -333,11 +333,11 @@ gimp_image_find_next_guide (GimpImage *image,
   gimp_value_array_unref (args);
 
   if (g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS)
-    next_guide_ID = g_value_get_uint (gimp_value_array_index (return_vals, 1));
+    next_guide = g_value_get_uint (gimp_value_array_index (return_vals, 1));
 
   gimp_value_array_unref (return_vals);
 
-  return next_guide_ID;
+  return next_guide;
 }
 
 /**
@@ -389,7 +389,7 @@ _gimp_image_find_next_guide (gint32 image_ID,
 /**
  * gimp_image_get_guide_orientation:
  * @image: The image.
- * @guide_ID: The guide.
+ * @guide: The guide.
  *
  * Get orientation of a guide on an image.
  *
@@ -400,7 +400,7 @@ _gimp_image_find_next_guide (gint32 image_ID,
  **/
 GimpOrientationType
 gimp_image_get_guide_orientation (GimpImage *image,
-                                  gint32     guide_ID)
+                                  guint      guide)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -409,7 +409,7 @@ gimp_image_get_guide_orientation (GimpImage *image,
 
   args = gimp_value_array_new_from_types (NULL,
                                           GIMP_TYPE_IMAGE_ID, gimp_image_get_id (image),
-                                          G_TYPE_UINT, guide_ID,
+                                          G_TYPE_UINT, guide,
                                           G_TYPE_NONE);
 
   if (pdb)
@@ -475,7 +475,7 @@ _gimp_image_get_guide_orientation (gint32 image_ID,
 /**
  * gimp_image_get_guide_position:
  * @image: The image.
- * @guide_ID: The guide.
+ * @guide: The guide.
  *
  * Get position of a guide on an image.
  *
@@ -486,7 +486,7 @@ _gimp_image_get_guide_orientation (gint32 image_ID,
  **/
 gint
 gimp_image_get_guide_position (GimpImage *image,
-                               gint32     guide_ID)
+                               guint      guide)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -495,7 +495,7 @@ gimp_image_get_guide_position (GimpImage *image,
 
   args = gimp_value_array_new_from_types (NULL,
                                           GIMP_TYPE_IMAGE_ID, gimp_image_get_id (image),
-                                          G_TYPE_UINT, guide_ID,
+                                          G_TYPE_UINT, guide,
                                           G_TYPE_NONE);
 
   if (pdb)
diff --git a/libgimp/gimpimageguides_pdb.h b/libgimp/gimpimageguides_pdb.h
index c566bd7b04..91ab5e94e0 100644
--- a/libgimp/gimpimageguides_pdb.h
+++ b/libgimp/gimpimageguides_pdb.h
@@ -36,18 +36,18 @@ G_BEGIN_DECLS
 
 #ifndef GIMP_DEPRECATED_REPLACE_NEW_API
 
-gint32              gimp_image_add_hguide            (GimpImage *image,
+guint               gimp_image_add_hguide            (GimpImage *image,
                                                       gint       yposition);
-gint32              gimp_image_add_vguide            (GimpImage *image,
+guint               gimp_image_add_vguide            (GimpImage *image,
                                                       gint       xposition);
 gboolean            gimp_image_delete_guide          (GimpImage *image,
-                                                      gint32     guide_ID);
-gint32              gimp_image_find_next_guide       (GimpImage *image,
-                                                      gint32     guide_ID);
+                                                      guint      guide);
+guint               gimp_image_find_next_guide       (GimpImage *image,
+                                                      guint      guide);
 GimpOrientationType gimp_image_get_guide_orientation (GimpImage *image,
-                                                      gint32     guide_ID);
+                                                      guint      guide);
 gint                gimp_image_get_guide_position    (GimpImage *image,
-                                                      gint32     guide_ID);
+                                                      guint      guide);
 
 #else /* GIMP_DEPRECATED_REPLACE_NEW_API */
 
diff --git a/libgimp/gimpimagesamplepoints_pdb.c b/libgimp/gimpimagesamplepoints_pdb.c
index effb078a37..7394bc6de7 100644
--- a/libgimp/gimpimagesamplepoints_pdb.c
+++ b/libgimp/gimpimagesamplepoints_pdb.c
@@ -50,7 +50,7 @@
  *
  * Since: 2.10
  **/
-gint32
+guint
 gimp_image_add_sample_point (GimpImage *image,
                              gint       position_x,
                              gint       position_y)
@@ -58,7 +58,7 @@ gimp_image_add_sample_point (GimpImage *image,
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
   GimpValueArray *return_vals;
-  gint32 sample_point_ID = -1;
+  guint sample_point = 0;
 
   args = gimp_value_array_new_from_types (NULL,
                                           GIMP_TYPE_IMAGE_ID, gimp_image_get_id (image),
@@ -76,11 +76,11 @@ gimp_image_add_sample_point (GimpImage *image,
   gimp_value_array_unref (args);
 
   if (g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS)
-    sample_point_ID = g_value_get_uint (gimp_value_array_index (return_vals, 1));
+    sample_point = g_value_get_uint (gimp_value_array_index (return_vals, 1));
 
   gimp_value_array_unref (return_vals);
 
-  return sample_point_ID;
+  return sample_point;
 }
 
 /**
@@ -135,7 +135,7 @@ _gimp_image_add_sample_point (gint32 image_ID,
 /**
  * gimp_image_delete_sample_point:
  * @image: The image.
- * @sample_point_ID: The ID of the sample point to be removed.
+ * @sample_point: The ID of the sample point to be removed.
  *
  * Deletes a sample point from an image.
  *
@@ -148,7 +148,7 @@ _gimp_image_add_sample_point (gint32 image_ID,
  **/
 gboolean
 gimp_image_delete_sample_point (GimpImage *image,
-                                gint32     sample_point_ID)
+                                guint      sample_point)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -157,7 +157,7 @@ gimp_image_delete_sample_point (GimpImage *image,
 
   args = gimp_value_array_new_from_types (NULL,
                                           GIMP_TYPE_IMAGE_ID, gimp_image_get_id (image),
-                                          G_TYPE_UINT, sample_point_ID,
+                                          G_TYPE_UINT, sample_point,
                                           G_TYPE_NONE);
 
   if (pdb)
@@ -223,7 +223,7 @@ _gimp_image_delete_sample_point (gint32 image_ID,
 /**
  * gimp_image_find_next_sample_point:
  * @image: The image.
- * @sample_point_ID: The ID of the current sample point (0 if first invocation).
+ * @sample_point: The ID of the current sample point (0 if first invocation).
  *
  * Find next sample point on an image.
  *
@@ -238,18 +238,18 @@ _gimp_image_delete_sample_point (gint32 image_ID,
  *
  * Since: 2.10
  **/
-gint32
+guint
 gimp_image_find_next_sample_point (GimpImage *image,
-                                   gint32     sample_point_ID)
+                                   guint      sample_point)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
   GimpValueArray *return_vals;
-  gint32 next_sample_point_ID = -1;
+  guint next_sample_point = 0;
 
   args = gimp_value_array_new_from_types (NULL,
                                           GIMP_TYPE_IMAGE_ID, gimp_image_get_id (image),
-                                          G_TYPE_UINT, sample_point_ID,
+                                          G_TYPE_UINT, sample_point,
                                           G_TYPE_NONE);
 
   if (pdb)
@@ -262,11 +262,11 @@ gimp_image_find_next_sample_point (GimpImage *image,
   gimp_value_array_unref (args);
 
   if (g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS)
-    next_sample_point_ID = g_value_get_uint (gimp_value_array_index (return_vals, 1));
+    next_sample_point = g_value_get_uint (gimp_value_array_index (return_vals, 1));
 
   gimp_value_array_unref (return_vals);
 
-  return next_sample_point_ID;
+  return next_sample_point;
 }
 
 /**
@@ -321,7 +321,7 @@ _gimp_image_find_next_sample_point (gint32 image_ID,
 /**
  * gimp_image_get_sample_point_position:
  * @image: The image.
- * @sample_point_ID: The guide.
+ * @sample_point: The guide.
  * @position_y: (out): The sample points's position relative to top of image.
  *
  * Get position of a sample point on an image.
@@ -336,7 +336,7 @@ _gimp_image_find_next_sample_point (gint32 image_ID,
  **/
 gint
 gimp_image_get_sample_point_position (GimpImage *image,
-                                      gint32     sample_point_ID,
+                                      guint      sample_point,
                                       gint      *position_y)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
@@ -346,7 +346,7 @@ gimp_image_get_sample_point_position (GimpImage *image,
 
   args = gimp_value_array_new_from_types (NULL,
                                           GIMP_TYPE_IMAGE_ID, gimp_image_get_id (image),
-                                          G_TYPE_UINT, sample_point_ID,
+                                          G_TYPE_UINT, sample_point,
                                           G_TYPE_NONE);
 
   if (pdb)
diff --git a/libgimp/gimpimagesamplepoints_pdb.h b/libgimp/gimpimagesamplepoints_pdb.h
index 3dd6252f5f..5700c08872 100644
--- a/libgimp/gimpimagesamplepoints_pdb.h
+++ b/libgimp/gimpimagesamplepoints_pdb.h
@@ -36,15 +36,15 @@ G_BEGIN_DECLS
 
 #ifndef GIMP_DEPRECATED_REPLACE_NEW_API
 
-gint32   gimp_image_add_sample_point          (GimpImage *image,
+guint    gimp_image_add_sample_point          (GimpImage *image,
                                                gint       position_x,
                                                gint       position_y);
 gboolean gimp_image_delete_sample_point       (GimpImage *image,
-                                               gint32     sample_point_ID);
-gint32   gimp_image_find_next_sample_point    (GimpImage *image,
-                                               gint32     sample_point_ID);
+                                               guint      sample_point);
+guint    gimp_image_find_next_sample_point    (GimpImage *image,
+                                               guint      sample_point);
 gint     gimp_image_get_sample_point_position (GimpImage *image,
-                                               gint32     sample_point_ID,
+                                               guint      sample_point,
                                                gint      *position_y);
 
 #else /* GIMP_DEPRECATED_REPLACE_NEW_API */
diff --git a/libgimp/gimplayer_pdb.c b/libgimp/gimplayer_pdb.c
index e0cb6aa97e..658972ecd5 100644
--- a/libgimp/gimplayer_pdb.c
+++ b/libgimp/gimplayer_pdb.c
@@ -1118,16 +1118,16 @@ _gimp_layer_set_offsets (gint32 layer_ID,
  * 'ADD-ALPHA-TRANSFER-MASK' on a layer with no alpha channels, or with
  * 'ADD-SELECTION-MASK' when there is no selection on the image.
  *
- * Returns: The newly created mask.
+ * Returns: (transfer full): The newly created mask.
  **/
-gint32
+GimpLayerMask *
 gimp_layer_create_mask (GimpLayer       *layer,
                         GimpAddMaskType  mask_type)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
   GimpValueArray *return_vals;
-  gint32 mask_ID = -1;
+  GimpLayerMask *mask = NULL;
 
   args = gimp_value_array_new_from_types (NULL,
                                           GIMP_TYPE_LAYER_ID, gimp_item_get_id (GIMP_ITEM (layer)),
@@ -1144,11 +1144,11 @@ gimp_layer_create_mask (GimpLayer       *layer,
   gimp_value_array_unref (args);
 
   if (g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS)
-    mask_ID = gimp_value_get_layer_mask_id (gimp_value_array_index (return_vals, 1));
+    mask = GIMP_LAYER_MASK (gimp_item_new_by_id (gimp_value_get_layer_mask_id (gimp_value_array_index 
(return_vals, 1))));
 
   gimp_value_array_unref (return_vals);
 
-  return mask_ID;
+  return mask;
 }
 
 /**
@@ -1221,15 +1221,15 @@ _gimp_layer_create_mask (gint32          layer_ID,
  * This procedure returns the specified layer's mask, or -1 if none
  * exists.
  *
- * Returns: The layer mask.
+ * Returns: (transfer full): The layer mask.
  **/
-gint32
+GimpLayerMask *
 gimp_layer_get_mask (GimpLayer *layer)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
   GimpValueArray *return_vals;
-  gint32 mask_ID = -1;
+  GimpLayerMask *mask = NULL;
 
   args = gimp_value_array_new_from_types (NULL,
                                           GIMP_TYPE_LAYER_ID, gimp_item_get_id (GIMP_ITEM (layer)),
@@ -1245,11 +1245,11 @@ gimp_layer_get_mask (GimpLayer *layer)
   gimp_value_array_unref (args);
 
   if (g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS)
-    mask_ID = gimp_value_get_layer_mask_id (gimp_value_array_index (return_vals, 1));
+    mask = GIMP_LAYER_MASK (gimp_item_new_by_id (gimp_value_get_layer_mask_id (gimp_value_array_index 
(return_vals, 1))));
 
   gimp_value_array_unref (return_vals);
 
-  return mask_ID;
+  return mask;
 }
 
 /**
@@ -1294,7 +1294,7 @@ _gimp_layer_get_mask (gint32 layer_ID)
 
 /**
  * gimp_layer_from_mask:
- * @mask_ID: Mask for which to return the layer.
+ * @mask: Mask for which to return the layer.
  *
  * Get the specified mask's layer.
  *
@@ -1306,7 +1306,7 @@ _gimp_layer_get_mask (gint32 layer_ID)
  * Since: 2.2
  **/
 GimpLayer *
-gimp_layer_from_mask (gint32 mask_ID)
+gimp_layer_from_mask (GimpLayerMask *mask)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -1314,7 +1314,7 @@ gimp_layer_from_mask (gint32 mask_ID)
   GimpLayer *layer = NULL;
 
   args = gimp_value_array_new_from_types (NULL,
-                                          GIMP_TYPE_LAYER_MASK_ID, mask_ID,
+                                          GIMP_TYPE_LAYER_MASK_ID, gimp_item_get_id (GIMP_ITEM (mask)),
                                           G_TYPE_NONE);
 
   if (pdb)
@@ -1379,7 +1379,7 @@ _gimp_layer_from_mask (gint32 mask_ID)
 /**
  * gimp_layer_add_mask:
  * @layer: The layer to receive the mask.
- * @mask_ID: The mask to add to the layer.
+ * @mask: The mask to add to the layer.
  *
  * Add a layer mask to the specified layer.
  *
@@ -1394,8 +1394,8 @@ _gimp_layer_from_mask (gint32 mask_ID)
  * Returns: TRUE on success.
  **/
 gboolean
-gimp_layer_add_mask (GimpLayer *layer,
-                     gint32     mask_ID)
+gimp_layer_add_mask (GimpLayer     *layer,
+                     GimpLayerMask *mask)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -1404,7 +1404,7 @@ gimp_layer_add_mask (GimpLayer *layer,
 
   args = gimp_value_array_new_from_types (NULL,
                                           GIMP_TYPE_LAYER_ID, gimp_item_get_id (GIMP_ITEM (layer)),
-                                          GIMP_TYPE_LAYER_MASK_ID, mask_ID,
+                                          GIMP_TYPE_LAYER_MASK_ID, gimp_item_get_id (GIMP_ITEM (mask)),
                                           G_TYPE_NONE);
 
   if (pdb)
diff --git a/libgimp/gimplayer_pdb.h b/libgimp/gimplayer_pdb.h
index 3070256ff9..fd24228e62 100644
--- a/libgimp/gimplayer_pdb.h
+++ b/libgimp/gimplayer_pdb.h
@@ -66,12 +66,12 @@ gboolean                   gimp_layer_resize_to_image_size (GimpLayer
 gboolean                   gimp_layer_set_offsets          (GimpLayer              *layer,
                                                             gint                    offx,
                                                             gint                    offy);
-gint32                     gimp_layer_create_mask          (GimpLayer              *layer,
+GimpLayerMask*             gimp_layer_create_mask          (GimpLayer              *layer,
                                                             GimpAddMaskType         mask_type);
-gint32                     gimp_layer_get_mask             (GimpLayer              *layer);
-GimpLayer*                 gimp_layer_from_mask            (gint32                  mask_ID);
+GimpLayerMask*             gimp_layer_get_mask             (GimpLayer              *layer);
+GimpLayer*                 gimp_layer_from_mask            (GimpLayerMask          *mask);
 gboolean                   gimp_layer_add_mask             (GimpLayer              *layer,
-                                                            gint32                  mask_ID);
+                                                            GimpLayerMask          *mask);
 gboolean                   gimp_layer_remove_mask          (GimpLayer              *layer,
                                                             GimpMaskApplyMode       mode);
 gboolean                   gimp_layer_is_floating_sel      (GimpLayer              *layer);
diff --git a/libgimp/gimplayermask.c b/libgimp/gimplayermask.c
new file mode 100644
index 0000000000..dd04bb7476
--- /dev/null
+++ b/libgimp/gimplayermask.c
@@ -0,0 +1,39 @@
+/* LIBGIMP - The GIMP Library
+ * Copyright (C) 1995-1997 Peter Mattis and Spencer Kimball
+ *
+ * gimplayermask.c
+ * Copyright (C) Jehan
+ *
+ * This library is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library.  If not, see
+ * <https://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include "gimp.h"
+
+
+G_DEFINE_TYPE (GimpLayerMask, gimp_layer_mask, GIMP_TYPE_CHANNEL)
+
+#define parent_class gimp_layer_mask_parent_class
+
+static void
+gimp_layer_mask_class_init (GimpLayerMaskClass *klass)
+{
+}
+
+static void
+gimp_layer_mask_init (GimpLayerMask *layer_mask)
+{
+}
diff --git a/libgimp/gimplayermask.h b/libgimp/gimplayermask.h
new file mode 100644
index 0000000000..8796841d93
--- /dev/null
+++ b/libgimp/gimplayermask.h
@@ -0,0 +1,70 @@
+/* LIBGIMP - The GIMP Library
+ * Copyright (C) 1995-2000 Peter Mattis and Spencer Kimball
+ *
+ * gimplayermask.h
+ * Copyright (C) Jehan
+ *
+ * This library is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library.  If not, see
+ * <https://www.gnu.org/licenses/>.
+ */
+
+#if !defined (__GIMP_H_INSIDE__) && !defined (GIMP_COMPILATION)
+#error "Only <libgimp/gimp.h> can be included directly."
+#endif
+
+#ifndef __GIMP_LAYER_MASK_H__
+#define __GIMP_LAYER_MASK_H__
+
+G_BEGIN_DECLS
+
+/* For information look into the C source or the html documentation */
+
+#define GIMP_TYPE_LAYER_MASK            (gimp_layer_mask_get_type ())
+#define GIMP_LAYER_MASK(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_LAYER_MASK, 
GimpLayerMask))
+#define GIMP_LAYER_MASK_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_LAYER_MASK, 
GimpLayerMaskClass))
+#define GIMP_IS_LAYER_MASK(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_LAYER_MASK))
+#define GIMP_IS_LAYER_MASK_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_LAYER_MASK))
+#define GIMP_LAYER_MASK_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_LAYER_MASK, 
GimpLayerMaskClass))
+
+
+typedef struct _GimpLayerMaskClass   GimpLayerMaskClass;
+typedef struct _GimpLayerMaskPrivate GimpLayerMaskPrivate;
+
+struct _GimpLayerMask
+{
+  GimpChannel      parent_instance;
+};
+
+struct _GimpLayerMaskClass
+{
+  GimpChannelClass parent_class;
+
+  /* Padding for future expansion */
+  void (*_gimp_reserved1) (void);
+  void (*_gimp_reserved2) (void);
+  void (*_gimp_reserved3) (void);
+  void (*_gimp_reserved4) (void);
+  void (*_gimp_reserved5) (void);
+  void (*_gimp_reserved6) (void);
+  void (*_gimp_reserved7) (void);
+  void (*_gimp_reserved8) (void);
+  void (*_gimp_reserved9) (void);
+};
+
+GType         gimp_layer_mask_get_type     (void) G_GNUC_CONST;
+
+
+G_END_DECLS
+
+#endif /* __GIMP_LAYER_MASK_H__ */
diff --git a/libgimp/gimpprogress_pdb.c b/libgimp/gimpprogress_pdb.c
index dc476a785c..0ff8a45d86 100644
--- a/libgimp/gimpprogress_pdb.c
+++ b/libgimp/gimpprogress_pdb.c
@@ -37,7 +37,7 @@
 /**
  * _gimp_progress_init:
  * @message: Message to use in the progress dialog.
- * @gdisplay_ID: GimpDisplay to update progressbar in, or -1 for a separate window.
+ * @gdisplay: GimpDisplay to update progressbar in, or -1 for a separate window.
  *
  * Initializes the progress bar for the current plug-in.
  *
@@ -48,7 +48,49 @@
  **/
 gboolean
 _gimp_progress_init (const gchar *message,
-                     gint32       gdisplay_ID)
+                     GimpDisplay *gdisplay)
+{
+  GimpPDB        *pdb = gimp_get_pdb ();
+  GimpValueArray *args;
+  GimpValueArray *return_vals;
+  gboolean success = TRUE;
+
+  args = gimp_value_array_new_from_types (NULL,
+                                          G_TYPE_STRING, message,
+                                          GIMP_TYPE_DISPLAY_ID, gimp_display_get_id (gdisplay),
+                                          G_TYPE_NONE);
+
+  if (pdb)
+    return_vals = gimp_pdb_run_procedure_array (pdb,
+                                                "gimp-progress-init",
+                                                args);
+  else
+    return_vals = gimp_run_procedure_array ("gimp-progress-init",
+                                            args);
+  gimp_value_array_unref (args);
+
+  success = g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS;
+
+  gimp_value_array_unref (return_vals);
+
+  return success;
+}
+
+/**
+ * __gimp_progress_init: (skip)
+ * @message: Message to use in the progress dialog.
+ * @gdisplay_ID: GimpDisplay to update progressbar in, or -1 for a separate window.
+ *
+ * Initializes the progress bar for the current plug-in.
+ *
+ * Initializes the progress bar for the current plug-in. It is only
+ * valid to call this procedure from a plug-in.
+ *
+ * Returns: TRUE on success.
+ **/
+gboolean
+__gimp_progress_init (const gchar *message,
+                      gint32       gdisplay_ID)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
diff --git a/libgimp/gimpprogress_pdb.h b/libgimp/gimpprogress_pdb.h
index c06908f64a..2870d9c057 100644
--- a/libgimp/gimpprogress_pdb.h
+++ b/libgimp/gimpprogress_pdb.h
@@ -32,8 +32,6 @@ G_BEGIN_DECLS
 /* For information look into the C source or the html documentation */
 
 
-G_GNUC_INTERNAL gboolean _gimp_progress_init             (const gchar *message,
-                                                          gint32       gdisplay_ID);
 G_GNUC_INTERNAL gboolean _gimp_progress_update           (gdouble      percentage);
 gboolean                 gimp_progress_pulse             (void);
 gboolean                 gimp_progress_set_text          (const gchar *message);
@@ -45,10 +43,12 @@ gboolean                 gimp_progress_cancel            (const gchar *progress_
 
 #ifndef GIMP_DEPRECATED_REPLACE_NEW_API
 
-
+G_GNUC_INTERNAL gboolean _gimp_progress_init (const gchar *message,
+                                              GimpDisplay *gdisplay);
 
 #else /* GIMP_DEPRECATED_REPLACE_NEW_API */
 
+#define _gimp_progress_init __gimp_progress_init
 
 
 #endif /* GIMP_DEPRECATED_REPLACE_NEW_API */
@@ -57,7 +57,8 @@ gboolean                 gimp_progress_cancel            (const gchar *progress_
  * They are not marked internal as a trick to keep the old API alive for now.
  */
 
-
+gboolean __gimp_progress_init (const gchar *message,
+                               gint32       gdisplay_ID);
 
 
 G_END_DECLS
diff --git a/libgimp/gimpselection.c b/libgimp/gimpselection.c
index 58bc224366..b5c0bb4c31 100644
--- a/libgimp/gimpselection.c
+++ b/libgimp/gimpselection.c
@@ -22,6 +22,20 @@
 
 #include "gimp.h"
 
+
+G_DEFINE_TYPE (GimpSelection, gimp_selection, GIMP_TYPE_CHANNEL)
+
+#define parent_class gimp_selection_parent_class
+
+static void
+gimp_selection_class_init (GimpSelectionClass *klass)
+{
+}
+
+static void
+gimp_selection_init (GimpSelection *selection)
+{
+}
 /**
  * gimp_selection_float:
  * @image: ignored
diff --git a/libgimp/gimpselection.h b/libgimp/gimpselection.h
index 5073b43228..6911e424ee 100644
--- a/libgimp/gimpselection.h
+++ b/libgimp/gimpselection.h
@@ -30,6 +30,39 @@ G_BEGIN_DECLS
 /* For information look into the C source or the html documentation */
 
 
+#define GIMP_TYPE_SELECTION            (gimp_selection_get_type ())
+#define GIMP_SELECTION(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_SELECTION, 
GimpSelection))
+#define GIMP_SELECTION_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_SELECTION, 
GimpSelectionClass))
+#define GIMP_IS_SELECTION(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_SELECTION))
+#define GIMP_IS_SELECTION_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_SELECTION))
+#define GIMP_SELECTION_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_SELECTION, 
GimpSelectionClass))
+
+
+typedef struct _GimpSelectionClass   GimpSelectionClass;
+
+struct _GimpSelection
+{
+  GimpChannel      parent_instance;
+};
+
+struct _GimpSelectionClass
+{
+  GimpChannelClass parent_class;
+
+  /* Padding for future expansion */
+  void (*_gimp_reserved1) (void);
+  void (*_gimp_reserved2) (void);
+  void (*_gimp_reserved3) (void);
+  void (*_gimp_reserved4) (void);
+  void (*_gimp_reserved5) (void);
+  void (*_gimp_reserved6) (void);
+  void (*_gimp_reserved7) (void);
+  void (*_gimp_reserved8) (void);
+  void (*_gimp_reserved9) (void);
+};
+
+GType       gimp_selection_get_type     (void) G_GNUC_CONST;
+
 #ifndef GIMP_DEPRECATED_REPLACE_NEW_API
 
 GimpLayer * gimp_selection_float (GimpImage    *image,
diff --git a/libgimp/gimpselection_pdb.c b/libgimp/gimpselection_pdb.c
index bfdd3e315e..c85c2d9f54 100644
--- a/libgimp/gimpselection_pdb.c
+++ b/libgimp/gimpselection_pdb.c
@@ -1294,15 +1294,15 @@ _gimp_selection_flood (gint32 image_ID)
  * new channel. The new channel is automatically inserted into the
  * image's list of channels.
  *
- * Returns: The new channel.
+ * Returns: (transfer full): The new channel.
  **/
-gint32
+GimpChannel *
 gimp_selection_save (GimpImage *image)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
   GimpValueArray *return_vals;
-  gint32 channel_ID = -1;
+  GimpChannel *channel = NULL;
 
   args = gimp_value_array_new_from_types (NULL,
                                           GIMP_TYPE_IMAGE_ID, gimp_image_get_id (image),
@@ -1318,11 +1318,11 @@ gimp_selection_save (GimpImage *image)
   gimp_value_array_unref (args);
 
   if (g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS)
-    channel_ID = gimp_value_get_channel_id (gimp_value_array_index (return_vals, 1));
+    channel = GIMP_CHANNEL (gimp_item_new_by_id (gimp_value_get_channel_id (gimp_value_array_index 
(return_vals, 1))));
 
   gimp_value_array_unref (return_vals);
 
-  return channel_ID;
+  return channel;
 }
 
 /**
diff --git a/libgimp/gimpselection_pdb.h b/libgimp/gimpselection_pdb.h
index 62e190e295..eca4fc82f8 100644
--- a/libgimp/gimpselection_pdb.h
+++ b/libgimp/gimpselection_pdb.h
@@ -65,7 +65,7 @@ gboolean                   gimp_selection_grow      (GimpImage    *image,
 gboolean                   gimp_selection_shrink    (GimpImage    *image,
                                                      gint          steps);
 gboolean                   gimp_selection_flood     (GimpImage    *image);
-gint32                     gimp_selection_save      (GimpImage    *image);
+GimpChannel*               gimp_selection_save      (GimpImage    *image);
 
 #else /* GIMP_DEPRECATED_REPLACE_NEW_API */
 
diff --git a/libgimp/gimptypes.h b/libgimp/gimptypes.h
index 49d827b310..03ce8dab47 100644
--- a/libgimp/gimptypes.h
+++ b/libgimp/gimptypes.h
@@ -41,6 +41,12 @@ typedef struct _GimpImage       GimpImage;
 typedef struct _GimpItem        GimpItem;
 typedef struct _GimpDrawable    GimpDrawable;
 typedef struct _GimpLayer       GimpLayer;
+typedef struct _GimpChannel     GimpChannel;
+typedef struct _GimpLayerMask   GimpLayerMask;
+typedef struct _GimpSelection   GimpSelection;
+typedef struct _GimpVectors     GimpVectors;
+
+typedef struct _GimpDisplay     GimpDisplay;
 
 
 /* FIXME move somewhere else */
diff --git a/libgimp/gimpvectors.c b/libgimp/gimpvectors.c
new file mode 100644
index 0000000000..034e00c0e8
--- /dev/null
+++ b/libgimp/gimpvectors.c
@@ -0,0 +1,39 @@
+/* LIBGIMP - The GIMP Library
+ * Copyright (C) 1995-2000 Peter Mattis and Spencer Kimball
+ *
+ * gimpvectors.c
+ * Copyright (C) Jehan
+ *
+ * This library is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library.  If not, see
+ * <https://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include "gimp.h"
+
+
+G_DEFINE_TYPE (GimpVectors, gimp_vectors, GIMP_TYPE_ITEM)
+
+#define parent_class gimp_vectors_parent_class
+
+static void
+gimp_vectors_class_init (GimpVectorsClass *klass)
+{
+}
+
+static void
+gimp_vectors_init (GimpVectors *vectors)
+{
+}
diff --git a/libgimp/gimpvectors.h b/libgimp/gimpvectors.h
new file mode 100644
index 0000000000..bb26d5b457
--- /dev/null
+++ b/libgimp/gimpvectors.h
@@ -0,0 +1,70 @@
+/* LIBGIMP - The GIMP Library
+ * Copyright (C) 1995-2000 Peter Mattis and Spencer Kimball
+ *
+ * gimpvectors.h
+ * Copyright (C) Jehan
+ *
+ * This library is free software: you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library.  If not, see
+ * <https://www.gnu.org/licenses/>.
+ */
+
+#if !defined (__GIMP_H_INSIDE__) && !defined (GIMP_COMPILATION)
+#error "Only <libgimp/gimp.h> can be included directly."
+#endif
+
+#ifndef __GIMP_VECTORS_H__
+#define __GIMP_VECTORS_H__
+
+G_BEGIN_DECLS
+
+/* For information look into the C source or the html documentation */
+
+#define GIMP_TYPE_VECTORS            (gimp_vectors_get_type ())
+#define GIMP_VECTORS(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GIMP_TYPE_VECTORS, GimpVectors))
+#define GIMP_VECTORS_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GIMP_TYPE_VECTORS, GimpVectorsClass))
+#define GIMP_IS_VECTORS(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GIMP_TYPE_VECTORS))
+#define GIMP_IS_VECTORS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GIMP_TYPE_VECTORS))
+#define GIMP_VECTORS_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), GIMP_TYPE_VECTORS, GimpVectorsClass))
+
+
+typedef struct _GimpVectorsClass   GimpVectorsClass;
+typedef struct _GimpVectorsPrivate GimpVectorsPrivate;
+
+struct _GimpVectors
+{
+  GimpItem      parent_instance;
+};
+
+struct _GimpVectorsClass
+{
+  GimpItemClass parent_class;
+
+  /* Padding for future expansion */
+  void (*_gimp_reserved1) (void);
+  void (*_gimp_reserved2) (void);
+  void (*_gimp_reserved3) (void);
+  void (*_gimp_reserved4) (void);
+  void (*_gimp_reserved5) (void);
+  void (*_gimp_reserved6) (void);
+  void (*_gimp_reserved7) (void);
+  void (*_gimp_reserved8) (void);
+  void (*_gimp_reserved9) (void);
+};
+
+GType         gimp_vectors_get_type     (void) G_GNUC_CONST;
+
+
+G_END_DECLS
+
+#endif /* __GIMP_VECTORS_H__ */
diff --git a/libgimp/gimpvectors_pdb.c b/libgimp/gimpvectors_pdb.c
index 4589f516b6..fe380a5b86 100644
--- a/libgimp/gimpvectors_pdb.c
+++ b/libgimp/gimpvectors_pdb.c
@@ -44,18 +44,19 @@
  * Creates a new empty vectors object. The vectors object needs to be
  * added to the image using gimp_image_insert_vectors().
  *
- * Returns: the current vector object, 0 if no vector exists in the image.
+ * Returns: (transfer full):
+ *          the current vector object, 0 if no vector exists in the image.
  *
  * Since: 2.4
  **/
-gint32
+GimpVectors *
 gimp_vectors_new (GimpImage   *image,
                   const gchar *name)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
   GimpValueArray *return_vals;
-  gint32 vectors_ID = -1;
+  GimpVectors *vectors = NULL;
 
   args = gimp_value_array_new_from_types (NULL,
                                           GIMP_TYPE_IMAGE_ID, gimp_image_get_id (image),
@@ -72,11 +73,11 @@ gimp_vectors_new (GimpImage   *image,
   gimp_value_array_unref (args);
 
   if (g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS)
-    vectors_ID = gimp_value_get_vectors_id (gimp_value_array_index (return_vals, 1));
+    vectors = GIMP_VECTORS (gimp_item_new_by_id (gimp_value_get_vectors_id (gimp_value_array_index 
(return_vals, 1))));
 
   gimp_value_array_unref (return_vals);
 
-  return vectors_ID;
+  return vectors;
 }
 
 /**
@@ -134,18 +135,18 @@ _gimp_vectors_new (gint32       image_ID,
  * Creates a new vectors object from a text layer. The vectors object
  * needs to be added to the image using gimp_image_insert_vectors().
  *
- * Returns: The vectors of the text layer.
+ * Returns: (transfer full): The vectors of the text layer.
  *
  * Since: 2.6
  **/
-gint32
+GimpVectors *
 gimp_vectors_new_from_text_layer (GimpImage *image,
                                   GimpLayer *layer)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
   GimpValueArray *return_vals;
-  gint32 vectors_ID = -1;
+  GimpVectors *vectors = NULL;
 
   args = gimp_value_array_new_from_types (NULL,
                                           GIMP_TYPE_IMAGE_ID, gimp_image_get_id (image),
@@ -162,11 +163,11 @@ gimp_vectors_new_from_text_layer (GimpImage *image,
   gimp_value_array_unref (args);
 
   if (g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS)
-    vectors_ID = gimp_value_get_vectors_id (gimp_value_array_index (return_vals, 1));
+    vectors = GIMP_VECTORS (gimp_item_new_by_id (gimp_value_get_vectors_id (gimp_value_array_index 
(return_vals, 1))));
 
   gimp_value_array_unref (return_vals);
 
-  return vectors_ID;
+  return vectors;
 }
 
 /**
@@ -216,6 +217,48 @@ _gimp_vectors_new_from_text_layer (gint32 image_ID,
 
 /**
  * gimp_vectors_copy:
+ * @vectors: The vectors object to copy.
+ *
+ * Copy a vectors object.
+ *
+ * This procedure copies the specified vectors object and returns the
+ * copy.
+ *
+ * Returns: (transfer full): The newly copied vectors object.
+ *
+ * Since: 2.6
+ **/
+GimpVectors *
+gimp_vectors_copy (GimpVectors *vectors)
+{
+  GimpPDB        *pdb = gimp_get_pdb ();
+  GimpValueArray *args;
+  GimpValueArray *return_vals;
+  GimpVectors *vectors_copy = NULL;
+
+  args = gimp_value_array_new_from_types (NULL,
+                                          GIMP_TYPE_VECTORS_ID, gimp_item_get_id (GIMP_ITEM (vectors)),
+                                          G_TYPE_NONE);
+
+  if (pdb)
+    return_vals = gimp_pdb_run_procedure_array (pdb,
+                                                "gimp-vectors-copy",
+                                                args);
+  else
+    return_vals = gimp_run_procedure_array ("gimp-vectors-copy",
+                                            args);
+  gimp_value_array_unref (args);
+
+  if (g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS)
+    vectors_copy = GIMP_VECTORS (gimp_item_new_by_id (gimp_value_get_vectors_id (gimp_value_array_index 
(return_vals, 1))));
+
+  gimp_value_array_unref (return_vals);
+
+  return vectors_copy;
+}
+
+/**
+ * _gimp_vectors_copy: (skip)
  * @vectors_ID: The vectors object to copy.
  *
  * Copy a vectors object.
@@ -228,7 +271,7 @@ _gimp_vectors_new_from_text_layer (gint32 image_ID,
  * Since: 2.6
  **/
 gint32
-gimp_vectors_copy (gint32 vectors_ID)
+_gimp_vectors_copy (gint32 vectors_ID)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -258,7 +301,7 @@ gimp_vectors_copy (gint32 vectors_ID)
 
 /**
  * gimp_vectors_get_strokes:
- * @vectors_ID: The vectors object.
+ * @vectors: The vectors object.
  * @num_strokes: (out): The number of strokes returned.
  *
  * List the strokes associated with the passed path.
@@ -273,8 +316,59 @@ gimp_vectors_copy (gint32 vectors_ID)
  * Since: 2.4
  **/
 gint *
-gimp_vectors_get_strokes (gint32  vectors_ID,
-                          gint   *num_strokes)
+gimp_vectors_get_strokes (GimpVectors *vectors,
+                          gint        *num_strokes)
+{
+  GimpPDB        *pdb = gimp_get_pdb ();
+  GimpValueArray *args;
+  GimpValueArray *return_vals;
+  gint *stroke_ids = NULL;
+
+  args = gimp_value_array_new_from_types (NULL,
+                                          GIMP_TYPE_VECTORS_ID, gimp_item_get_id (GIMP_ITEM (vectors)),
+                                          G_TYPE_NONE);
+
+  if (pdb)
+    return_vals = gimp_pdb_run_procedure_array (pdb,
+                                                "gimp-vectors-get-strokes",
+                                                args);
+  else
+    return_vals = gimp_run_procedure_array ("gimp-vectors-get-strokes",
+                                            args);
+  gimp_value_array_unref (args);
+
+  *num_strokes = 0;
+
+  if (g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS)
+    {
+      *num_strokes = g_value_get_int (gimp_value_array_index (return_vals, 1));
+      stroke_ids = gimp_value_dup_int32_array (gimp_value_array_index (return_vals, 2));
+    }
+
+  gimp_value_array_unref (return_vals);
+
+  return stroke_ids;
+}
+
+/**
+ * _gimp_vectors_get_strokes: (skip)
+ * @vectors_ID: The vectors object.
+ * @num_strokes: (out): The number of strokes returned.
+ *
+ * List the strokes associated with the passed path.
+ *
+ * Returns an Array with the stroke-IDs associated with the passed
+ * path.
+ *
+ * Returns: (array length=num_strokes):
+ *          List of the strokes belonging to the path.
+ *          The returned value must be freed with g_free().
+ *
+ * Since: 2.4
+ **/
+gint *
+_gimp_vectors_get_strokes (gint32  vectors_ID,
+                           gint   *num_strokes)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -309,6 +403,53 @@ gimp_vectors_get_strokes (gint32  vectors_ID,
 
 /**
  * gimp_vectors_stroke_get_length:
+ * @vectors: The vectors object.
+ * @stroke_id: The stroke ID.
+ * @precision: The precision used for the approximation.
+ *
+ * Measure the length of the given stroke.
+ *
+ * Measure the length of the given stroke.
+ *
+ * Returns: The length (in pixels) of the given stroke.
+ *
+ * Since: 2.4
+ **/
+gdouble
+gimp_vectors_stroke_get_length (GimpVectors *vectors,
+                                gint         stroke_id,
+                                gdouble      precision)
+{
+  GimpPDB        *pdb = gimp_get_pdb ();
+  GimpValueArray *args;
+  GimpValueArray *return_vals;
+  gdouble length = 0.0;
+
+  args = gimp_value_array_new_from_types (NULL,
+                                          GIMP_TYPE_VECTORS_ID, gimp_item_get_id (GIMP_ITEM (vectors)),
+                                          G_TYPE_INT, stroke_id,
+                                          G_TYPE_DOUBLE, precision,
+                                          G_TYPE_NONE);
+
+  if (pdb)
+    return_vals = gimp_pdb_run_procedure_array (pdb,
+                                                "gimp-vectors-stroke-get-length",
+                                                args);
+  else
+    return_vals = gimp_run_procedure_array ("gimp-vectors-stroke-get-length",
+                                            args);
+  gimp_value_array_unref (args);
+
+  if (g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS)
+    length = g_value_get_double (gimp_value_array_index (return_vals, 1));
+
+  gimp_value_array_unref (return_vals);
+
+  return length;
+}
+
+/**
+ * _gimp_vectors_stroke_get_length: (skip)
  * @vectors_ID: The vectors object.
  * @stroke_id: The stroke ID.
  * @precision: The precision used for the approximation.
@@ -322,9 +463,9 @@ gimp_vectors_get_strokes (gint32  vectors_ID,
  * Since: 2.4
  **/
 gdouble
-gimp_vectors_stroke_get_length (gint32  vectors_ID,
-                                gint    stroke_id,
-                                gdouble precision)
+_gimp_vectors_stroke_get_length (gint32  vectors_ID,
+                                 gint    stroke_id,
+                                 gdouble precision)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -356,7 +497,7 @@ gimp_vectors_stroke_get_length (gint32  vectors_ID,
 
 /**
  * gimp_vectors_stroke_get_point_at_dist:
- * @vectors_ID: The vectors object.
+ * @vectors: The vectors object.
  * @stroke_id: The stroke ID.
  * @dist: The given distance.
  * @precision: The precision used for the approximation.
@@ -379,14 +520,14 @@ gimp_vectors_stroke_get_length (gint32  vectors_ID,
  * Since: 2.4
  **/
 gboolean
-gimp_vectors_stroke_get_point_at_dist (gint32    vectors_ID,
-                                       gint      stroke_id,
-                                       gdouble   dist,
-                                       gdouble   precision,
-                                       gdouble  *x_point,
-                                       gdouble  *y_point,
-                                       gdouble  *slope,
-                                       gboolean *valid)
+gimp_vectors_stroke_get_point_at_dist (GimpVectors *vectors,
+                                       gint         stroke_id,
+                                       gdouble      dist,
+                                       gdouble      precision,
+                                       gdouble     *x_point,
+                                       gdouble     *y_point,
+                                       gdouble     *slope,
+                                       gboolean    *valid)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -394,7 +535,7 @@ gimp_vectors_stroke_get_point_at_dist (gint32    vectors_ID,
   gboolean success = TRUE;
 
   args = gimp_value_array_new_from_types (NULL,
-                                          GIMP_TYPE_VECTORS_ID, vectors_ID,
+                                          GIMP_TYPE_VECTORS_ID, gimp_item_get_id (GIMP_ITEM (vectors)),
                                           G_TYPE_INT, stroke_id,
                                           G_TYPE_DOUBLE, dist,
                                           G_TYPE_DOUBLE, precision,
@@ -430,21 +571,38 @@ gimp_vectors_stroke_get_point_at_dist (gint32    vectors_ID,
 }
 
 /**
- * gimp_vectors_remove_stroke:
+ * _gimp_vectors_stroke_get_point_at_dist: (skip)
  * @vectors_ID: The vectors object.
  * @stroke_id: The stroke ID.
+ * @dist: The given distance.
+ * @precision: The precision used for the approximation.
+ * @x_point: (out): The x position of the point.
+ * @y_point: (out): The y position of the point.
+ * @slope: (out): The slope (dy / dx) at the specified point.
+ * @valid: (out): Indicator for the validity of the returned data.
  *
- * remove the stroke from a vectors object.
+ * Get point at a specified distance along the stroke.
  *
- * Remove the stroke from a vectors object.
+ * This will return the x,y position of a point at a given distance
+ * along the stroke. The distance will be obtained by first digitizing
+ * the curve internally and then walking along the curve. For a closed
+ * stroke the start of the path is the first point on the path that was
+ * created. This might not be obvious. If the stroke is not long
+ * enough, a \"valid\" flag will be FALSE.
  *
  * Returns: TRUE on success.
  *
  * Since: 2.4
  **/
 gboolean
-gimp_vectors_remove_stroke (gint32 vectors_ID,
-                            gint   stroke_id)
+_gimp_vectors_stroke_get_point_at_dist (gint32    vectors_ID,
+                                        gint      stroke_id,
+                                        gdouble   dist,
+                                        gdouble   precision,
+                                        gdouble  *x_point,
+                                        gdouble  *y_point,
+                                        gdouble  *slope,
+                                        gboolean *valid)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -454,40 +612,55 @@ gimp_vectors_remove_stroke (gint32 vectors_ID,
   args = gimp_value_array_new_from_types (NULL,
                                           GIMP_TYPE_VECTORS_ID, vectors_ID,
                                           G_TYPE_INT, stroke_id,
+                                          G_TYPE_DOUBLE, dist,
+                                          G_TYPE_DOUBLE, precision,
                                           G_TYPE_NONE);
 
   if (pdb)
     return_vals = gimp_pdb_run_procedure_array (pdb,
-                                                "gimp-vectors-remove-stroke",
+                                                "gimp-vectors-stroke-get-point-at-dist",
                                                 args);
   else
-    return_vals = gimp_run_procedure_array ("gimp-vectors-remove-stroke",
+    return_vals = gimp_run_procedure_array ("gimp-vectors-stroke-get-point-at-dist",
                                             args);
   gimp_value_array_unref (args);
 
+  *x_point = 0.0;
+  *y_point = 0.0;
+  *slope = 0.0;
+  *valid = FALSE;
+
   success = g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS;
 
+  if (success)
+    {
+      *x_point = g_value_get_double (gimp_value_array_index (return_vals, 1));
+      *y_point = g_value_get_double (gimp_value_array_index (return_vals, 2));
+      *slope = g_value_get_double (gimp_value_array_index (return_vals, 3));
+      *valid = g_value_get_boolean (gimp_value_array_index (return_vals, 4));
+    }
+
   gimp_value_array_unref (return_vals);
 
   return success;
 }
 
 /**
- * gimp_vectors_stroke_close:
- * @vectors_ID: The vectors object.
+ * gimp_vectors_remove_stroke:
+ * @vectors: The vectors object.
  * @stroke_id: The stroke ID.
  *
- * closes the specified stroke.
+ * remove the stroke from a vectors object.
  *
- * Closes the specified stroke.
+ * Remove the stroke from a vectors object.
  *
  * Returns: TRUE on success.
  *
  * Since: 2.4
  **/
 gboolean
-gimp_vectors_stroke_close (gint32 vectors_ID,
-                           gint   stroke_id)
+gimp_vectors_remove_stroke (GimpVectors *vectors,
+                            gint         stroke_id)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -495,16 +668,16 @@ gimp_vectors_stroke_close (gint32 vectors_ID,
   gboolean success = TRUE;
 
   args = gimp_value_array_new_from_types (NULL,
-                                          GIMP_TYPE_VECTORS_ID, vectors_ID,
+                                          GIMP_TYPE_VECTORS_ID, gimp_item_get_id (GIMP_ITEM (vectors)),
                                           G_TYPE_INT, stroke_id,
                                           G_TYPE_NONE);
 
   if (pdb)
     return_vals = gimp_pdb_run_procedure_array (pdb,
-                                                "gimp-vectors-stroke-close",
+                                                "gimp-vectors-remove-stroke",
                                                 args);
   else
-    return_vals = gimp_run_procedure_array ("gimp-vectors-stroke-close",
+    return_vals = gimp_run_procedure_array ("gimp-vectors-remove-stroke",
                                             args);
   gimp_value_array_unref (args);
 
@@ -516,25 +689,21 @@ gimp_vectors_stroke_close (gint32 vectors_ID,
 }
 
 /**
- * gimp_vectors_stroke_translate:
+ * _gimp_vectors_remove_stroke: (skip)
  * @vectors_ID: The vectors object.
  * @stroke_id: The stroke ID.
- * @off_x: Offset in x direction.
- * @off_y: Offset in y direction.
  *
- * translate the given stroke.
+ * remove the stroke from a vectors object.
  *
- * Translate the given stroke.
+ * Remove the stroke from a vectors object.
  *
  * Returns: TRUE on success.
  *
  * Since: 2.4
  **/
 gboolean
-gimp_vectors_stroke_translate (gint32 vectors_ID,
-                               gint   stroke_id,
-                               gint   off_x,
-                               gint   off_y)
+_gimp_vectors_remove_stroke (gint32 vectors_ID,
+                             gint   stroke_id)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -544,16 +713,14 @@ gimp_vectors_stroke_translate (gint32 vectors_ID,
   args = gimp_value_array_new_from_types (NULL,
                                           GIMP_TYPE_VECTORS_ID, vectors_ID,
                                           G_TYPE_INT, stroke_id,
-                                          G_TYPE_INT, off_x,
-                                          G_TYPE_INT, off_y,
                                           G_TYPE_NONE);
 
   if (pdb)
     return_vals = gimp_pdb_run_procedure_array (pdb,
-                                                "gimp-vectors-stroke-translate",
+                                                "gimp-vectors-remove-stroke",
                                                 args);
   else
-    return_vals = gimp_run_procedure_array ("gimp-vectors-stroke-translate",
+    return_vals = gimp_run_procedure_array ("gimp-vectors-remove-stroke",
                                             args);
   gimp_value_array_unref (args);
 
@@ -565,25 +732,21 @@ gimp_vectors_stroke_translate (gint32 vectors_ID,
 }
 
 /**
- * gimp_vectors_stroke_scale:
- * @vectors_ID: The vectors object.
+ * gimp_vectors_stroke_close:
+ * @vectors: The vectors object.
  * @stroke_id: The stroke ID.
- * @scale_x: Scale factor in x direction.
- * @scale_y: Scale factor in y direction.
  *
- * scales the given stroke.
+ * closes the specified stroke.
  *
- * Scale the given stroke.
+ * Closes the specified stroke.
  *
  * Returns: TRUE on success.
  *
  * Since: 2.4
  **/
 gboolean
-gimp_vectors_stroke_scale (gint32  vectors_ID,
-                           gint    stroke_id,
-                           gdouble scale_x,
-                           gdouble scale_y)
+gimp_vectors_stroke_close (GimpVectors *vectors,
+                           gint         stroke_id)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -591,18 +754,16 @@ gimp_vectors_stroke_scale (gint32  vectors_ID,
   gboolean success = TRUE;
 
   args = gimp_value_array_new_from_types (NULL,
-                                          GIMP_TYPE_VECTORS_ID, vectors_ID,
+                                          GIMP_TYPE_VECTORS_ID, gimp_item_get_id (GIMP_ITEM (vectors)),
                                           G_TYPE_INT, stroke_id,
-                                          G_TYPE_DOUBLE, scale_x,
-                                          G_TYPE_DOUBLE, scale_y,
                                           G_TYPE_NONE);
 
   if (pdb)
     return_vals = gimp_pdb_run_procedure_array (pdb,
-                                                "gimp-vectors-stroke-scale",
+                                                "gimp-vectors-stroke-close",
                                                 args);
   else
-    return_vals = gimp_run_procedure_array ("gimp-vectors-stroke-scale",
+    return_vals = gimp_run_procedure_array ("gimp-vectors-stroke-close",
                                             args);
   gimp_value_array_unref (args);
 
@@ -614,27 +775,21 @@ gimp_vectors_stroke_scale (gint32  vectors_ID,
 }
 
 /**
- * gimp_vectors_stroke_rotate:
+ * _gimp_vectors_stroke_close: (skip)
  * @vectors_ID: The vectors object.
  * @stroke_id: The stroke ID.
- * @center_x: X coordinate of the rotation center.
- * @center_y: Y coordinate of the rotation center.
- * @angle: angle to rotate about.
  *
- * rotates the given stroke.
+ * closes the specified stroke.
  *
- * Rotates the given stroke around given center by angle (in degrees).
+ * Closes the specified stroke.
  *
  * Returns: TRUE on success.
  *
  * Since: 2.4
  **/
 gboolean
-gimp_vectors_stroke_rotate (gint32  vectors_ID,
-                            gint    stroke_id,
-                            gdouble center_x,
-                            gdouble center_y,
-                            gdouble angle)
+_gimp_vectors_stroke_close (gint32 vectors_ID,
+                            gint   stroke_id)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -644,17 +799,14 @@ gimp_vectors_stroke_rotate (gint32  vectors_ID,
   args = gimp_value_array_new_from_types (NULL,
                                           GIMP_TYPE_VECTORS_ID, vectors_ID,
                                           G_TYPE_INT, stroke_id,
-                                          G_TYPE_DOUBLE, center_x,
-                                          G_TYPE_DOUBLE, center_y,
-                                          G_TYPE_DOUBLE, angle,
                                           G_TYPE_NONE);
 
   if (pdb)
     return_vals = gimp_pdb_run_procedure_array (pdb,
-                                                "gimp-vectors-stroke-rotate",
+                                                "gimp-vectors-stroke-close",
                                                 args);
   else
-    return_vals = gimp_run_procedure_array ("gimp-vectors-stroke-rotate",
+    return_vals = gimp_run_procedure_array ("gimp-vectors-stroke-close",
                                             args);
   gimp_value_array_unref (args);
 
@@ -666,25 +818,25 @@ gimp_vectors_stroke_rotate (gint32  vectors_ID,
 }
 
 /**
- * gimp_vectors_stroke_flip:
- * @vectors_ID: The vectors object.
+ * gimp_vectors_stroke_translate:
+ * @vectors: The vectors object.
  * @stroke_id: The stroke ID.
- * @flip_type: Flip orientation, either vertical or horizontal.
- * @axis: axis coordinate about which to flip, in pixels.
+ * @off_x: Offset in x direction.
+ * @off_y: Offset in y direction.
  *
- * flips the given stroke.
+ * translate the given stroke.
  *
- * Rotates the given stroke around given center by angle (in degrees).
+ * Translate the given stroke.
  *
  * Returns: TRUE on success.
  *
  * Since: 2.4
  **/
 gboolean
-gimp_vectors_stroke_flip (gint32              vectors_ID,
-                          gint                stroke_id,
-                          GimpOrientationType flip_type,
-                          gdouble             axis)
+gimp_vectors_stroke_translate (GimpVectors *vectors,
+                               gint         stroke_id,
+                               gint         off_x,
+                               gint         off_y)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -692,18 +844,18 @@ gimp_vectors_stroke_flip (gint32              vectors_ID,
   gboolean success = TRUE;
 
   args = gimp_value_array_new_from_types (NULL,
-                                          GIMP_TYPE_VECTORS_ID, vectors_ID,
+                                          GIMP_TYPE_VECTORS_ID, gimp_item_get_id (GIMP_ITEM (vectors)),
                                           G_TYPE_INT, stroke_id,
-                                          GIMP_TYPE_ORIENTATION_TYPE, flip_type,
-                                          G_TYPE_DOUBLE, axis,
+                                          G_TYPE_INT, off_x,
+                                          G_TYPE_INT, off_y,
                                           G_TYPE_NONE);
 
   if (pdb)
     return_vals = gimp_pdb_run_procedure_array (pdb,
-                                                "gimp-vectors-stroke-flip",
+                                                "gimp-vectors-stroke-translate",
                                                 args);
   else
-    return_vals = gimp_run_procedure_array ("gimp-vectors-stroke-flip",
+    return_vals = gimp_run_procedure_array ("gimp-vectors-stroke-translate",
                                             args);
   gimp_value_array_unref (args);
 
@@ -715,13 +867,419 @@ gimp_vectors_stroke_flip (gint32              vectors_ID,
 }
 
 /**
- * gimp_vectors_stroke_flip_free:
+ * _gimp_vectors_stroke_translate: (skip)
  * @vectors_ID: The vectors object.
  * @stroke_id: The stroke ID.
- * @x1: X coordinate of the first point of the flipping axis.
- * @y1: Y coordinate of the first point of the flipping axis.
- * @x2: X coordinate of the second point of the flipping axis.
- * @y2: Y coordinate of the second point of the flipping axis.
+ * @off_x: Offset in x direction.
+ * @off_y: Offset in y direction.
+ *
+ * translate the given stroke.
+ *
+ * Translate the given stroke.
+ *
+ * Returns: TRUE on success.
+ *
+ * Since: 2.4
+ **/
+gboolean
+_gimp_vectors_stroke_translate (gint32 vectors_ID,
+                                gint   stroke_id,
+                                gint   off_x,
+                                gint   off_y)
+{
+  GimpPDB        *pdb = gimp_get_pdb ();
+  GimpValueArray *args;
+  GimpValueArray *return_vals;
+  gboolean success = TRUE;
+
+  args = gimp_value_array_new_from_types (NULL,
+                                          GIMP_TYPE_VECTORS_ID, vectors_ID,
+                                          G_TYPE_INT, stroke_id,
+                                          G_TYPE_INT, off_x,
+                                          G_TYPE_INT, off_y,
+                                          G_TYPE_NONE);
+
+  if (pdb)
+    return_vals = gimp_pdb_run_procedure_array (pdb,
+                                                "gimp-vectors-stroke-translate",
+                                                args);
+  else
+    return_vals = gimp_run_procedure_array ("gimp-vectors-stroke-translate",
+                                            args);
+  gimp_value_array_unref (args);
+
+  success = g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS;
+
+  gimp_value_array_unref (return_vals);
+
+  return success;
+}
+
+/**
+ * gimp_vectors_stroke_scale:
+ * @vectors: The vectors object.
+ * @stroke_id: The stroke ID.
+ * @scale_x: Scale factor in x direction.
+ * @scale_y: Scale factor in y direction.
+ *
+ * scales the given stroke.
+ *
+ * Scale the given stroke.
+ *
+ * Returns: TRUE on success.
+ *
+ * Since: 2.4
+ **/
+gboolean
+gimp_vectors_stroke_scale (GimpVectors *vectors,
+                           gint         stroke_id,
+                           gdouble      scale_x,
+                           gdouble      scale_y)
+{
+  GimpPDB        *pdb = gimp_get_pdb ();
+  GimpValueArray *args;
+  GimpValueArray *return_vals;
+  gboolean success = TRUE;
+
+  args = gimp_value_array_new_from_types (NULL,
+                                          GIMP_TYPE_VECTORS_ID, gimp_item_get_id (GIMP_ITEM (vectors)),
+                                          G_TYPE_INT, stroke_id,
+                                          G_TYPE_DOUBLE, scale_x,
+                                          G_TYPE_DOUBLE, scale_y,
+                                          G_TYPE_NONE);
+
+  if (pdb)
+    return_vals = gimp_pdb_run_procedure_array (pdb,
+                                                "gimp-vectors-stroke-scale",
+                                                args);
+  else
+    return_vals = gimp_run_procedure_array ("gimp-vectors-stroke-scale",
+                                            args);
+  gimp_value_array_unref (args);
+
+  success = g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS;
+
+  gimp_value_array_unref (return_vals);
+
+  return success;
+}
+
+/**
+ * _gimp_vectors_stroke_scale: (skip)
+ * @vectors_ID: The vectors object.
+ * @stroke_id: The stroke ID.
+ * @scale_x: Scale factor in x direction.
+ * @scale_y: Scale factor in y direction.
+ *
+ * scales the given stroke.
+ *
+ * Scale the given stroke.
+ *
+ * Returns: TRUE on success.
+ *
+ * Since: 2.4
+ **/
+gboolean
+_gimp_vectors_stroke_scale (gint32  vectors_ID,
+                            gint    stroke_id,
+                            gdouble scale_x,
+                            gdouble scale_y)
+{
+  GimpPDB        *pdb = gimp_get_pdb ();
+  GimpValueArray *args;
+  GimpValueArray *return_vals;
+  gboolean success = TRUE;
+
+  args = gimp_value_array_new_from_types (NULL,
+                                          GIMP_TYPE_VECTORS_ID, vectors_ID,
+                                          G_TYPE_INT, stroke_id,
+                                          G_TYPE_DOUBLE, scale_x,
+                                          G_TYPE_DOUBLE, scale_y,
+                                          G_TYPE_NONE);
+
+  if (pdb)
+    return_vals = gimp_pdb_run_procedure_array (pdb,
+                                                "gimp-vectors-stroke-scale",
+                                                args);
+  else
+    return_vals = gimp_run_procedure_array ("gimp-vectors-stroke-scale",
+                                            args);
+  gimp_value_array_unref (args);
+
+  success = g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS;
+
+  gimp_value_array_unref (return_vals);
+
+  return success;
+}
+
+/**
+ * gimp_vectors_stroke_rotate:
+ * @vectors: The vectors object.
+ * @stroke_id: The stroke ID.
+ * @center_x: X coordinate of the rotation center.
+ * @center_y: Y coordinate of the rotation center.
+ * @angle: angle to rotate about.
+ *
+ * rotates the given stroke.
+ *
+ * Rotates the given stroke around given center by angle (in degrees).
+ *
+ * Returns: TRUE on success.
+ *
+ * Since: 2.4
+ **/
+gboolean
+gimp_vectors_stroke_rotate (GimpVectors *vectors,
+                            gint         stroke_id,
+                            gdouble      center_x,
+                            gdouble      center_y,
+                            gdouble      angle)
+{
+  GimpPDB        *pdb = gimp_get_pdb ();
+  GimpValueArray *args;
+  GimpValueArray *return_vals;
+  gboolean success = TRUE;
+
+  args = gimp_value_array_new_from_types (NULL,
+                                          GIMP_TYPE_VECTORS_ID, gimp_item_get_id (GIMP_ITEM (vectors)),
+                                          G_TYPE_INT, stroke_id,
+                                          G_TYPE_DOUBLE, center_x,
+                                          G_TYPE_DOUBLE, center_y,
+                                          G_TYPE_DOUBLE, angle,
+                                          G_TYPE_NONE);
+
+  if (pdb)
+    return_vals = gimp_pdb_run_procedure_array (pdb,
+                                                "gimp-vectors-stroke-rotate",
+                                                args);
+  else
+    return_vals = gimp_run_procedure_array ("gimp-vectors-stroke-rotate",
+                                            args);
+  gimp_value_array_unref (args);
+
+  success = g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS;
+
+  gimp_value_array_unref (return_vals);
+
+  return success;
+}
+
+/**
+ * _gimp_vectors_stroke_rotate: (skip)
+ * @vectors_ID: The vectors object.
+ * @stroke_id: The stroke ID.
+ * @center_x: X coordinate of the rotation center.
+ * @center_y: Y coordinate of the rotation center.
+ * @angle: angle to rotate about.
+ *
+ * rotates the given stroke.
+ *
+ * Rotates the given stroke around given center by angle (in degrees).
+ *
+ * Returns: TRUE on success.
+ *
+ * Since: 2.4
+ **/
+gboolean
+_gimp_vectors_stroke_rotate (gint32  vectors_ID,
+                             gint    stroke_id,
+                             gdouble center_x,
+                             gdouble center_y,
+                             gdouble angle)
+{
+  GimpPDB        *pdb = gimp_get_pdb ();
+  GimpValueArray *args;
+  GimpValueArray *return_vals;
+  gboolean success = TRUE;
+
+  args = gimp_value_array_new_from_types (NULL,
+                                          GIMP_TYPE_VECTORS_ID, vectors_ID,
+                                          G_TYPE_INT, stroke_id,
+                                          G_TYPE_DOUBLE, center_x,
+                                          G_TYPE_DOUBLE, center_y,
+                                          G_TYPE_DOUBLE, angle,
+                                          G_TYPE_NONE);
+
+  if (pdb)
+    return_vals = gimp_pdb_run_procedure_array (pdb,
+                                                "gimp-vectors-stroke-rotate",
+                                                args);
+  else
+    return_vals = gimp_run_procedure_array ("gimp-vectors-stroke-rotate",
+                                            args);
+  gimp_value_array_unref (args);
+
+  success = g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS;
+
+  gimp_value_array_unref (return_vals);
+
+  return success;
+}
+
+/**
+ * gimp_vectors_stroke_flip:
+ * @vectors: The vectors object.
+ * @stroke_id: The stroke ID.
+ * @flip_type: Flip orientation, either vertical or horizontal.
+ * @axis: axis coordinate about which to flip, in pixels.
+ *
+ * flips the given stroke.
+ *
+ * Rotates the given stroke around given center by angle (in degrees).
+ *
+ * Returns: TRUE on success.
+ *
+ * Since: 2.4
+ **/
+gboolean
+gimp_vectors_stroke_flip (GimpVectors         *vectors,
+                          gint                 stroke_id,
+                          GimpOrientationType  flip_type,
+                          gdouble              axis)
+{
+  GimpPDB        *pdb = gimp_get_pdb ();
+  GimpValueArray *args;
+  GimpValueArray *return_vals;
+  gboolean success = TRUE;
+
+  args = gimp_value_array_new_from_types (NULL,
+                                          GIMP_TYPE_VECTORS_ID, gimp_item_get_id (GIMP_ITEM (vectors)),
+                                          G_TYPE_INT, stroke_id,
+                                          GIMP_TYPE_ORIENTATION_TYPE, flip_type,
+                                          G_TYPE_DOUBLE, axis,
+                                          G_TYPE_NONE);
+
+  if (pdb)
+    return_vals = gimp_pdb_run_procedure_array (pdb,
+                                                "gimp-vectors-stroke-flip",
+                                                args);
+  else
+    return_vals = gimp_run_procedure_array ("gimp-vectors-stroke-flip",
+                                            args);
+  gimp_value_array_unref (args);
+
+  success = g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS;
+
+  gimp_value_array_unref (return_vals);
+
+  return success;
+}
+
+/**
+ * _gimp_vectors_stroke_flip: (skip)
+ * @vectors_ID: The vectors object.
+ * @stroke_id: The stroke ID.
+ * @flip_type: Flip orientation, either vertical or horizontal.
+ * @axis: axis coordinate about which to flip, in pixels.
+ *
+ * flips the given stroke.
+ *
+ * Rotates the given stroke around given center by angle (in degrees).
+ *
+ * Returns: TRUE on success.
+ *
+ * Since: 2.4
+ **/
+gboolean
+_gimp_vectors_stroke_flip (gint32              vectors_ID,
+                           gint                stroke_id,
+                           GimpOrientationType flip_type,
+                           gdouble             axis)
+{
+  GimpPDB        *pdb = gimp_get_pdb ();
+  GimpValueArray *args;
+  GimpValueArray *return_vals;
+  gboolean success = TRUE;
+
+  args = gimp_value_array_new_from_types (NULL,
+                                          GIMP_TYPE_VECTORS_ID, vectors_ID,
+                                          G_TYPE_INT, stroke_id,
+                                          GIMP_TYPE_ORIENTATION_TYPE, flip_type,
+                                          G_TYPE_DOUBLE, axis,
+                                          G_TYPE_NONE);
+
+  if (pdb)
+    return_vals = gimp_pdb_run_procedure_array (pdb,
+                                                "gimp-vectors-stroke-flip",
+                                                args);
+  else
+    return_vals = gimp_run_procedure_array ("gimp-vectors-stroke-flip",
+                                            args);
+  gimp_value_array_unref (args);
+
+  success = g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS;
+
+  gimp_value_array_unref (return_vals);
+
+  return success;
+}
+
+/**
+ * gimp_vectors_stroke_flip_free:
+ * @vectors: The vectors object.
+ * @stroke_id: The stroke ID.
+ * @x1: X coordinate of the first point of the flipping axis.
+ * @y1: Y coordinate of the first point of the flipping axis.
+ * @x2: X coordinate of the second point of the flipping axis.
+ * @y2: Y coordinate of the second point of the flipping axis.
+ *
+ * flips the given stroke about an arbitrary axis.
+ *
+ * Flips the given stroke about an arbitrary axis. Axis is defined by
+ * two coordinates in the image (in pixels), through which the flipping
+ * axis passes.
+ *
+ * Returns: TRUE on success.
+ *
+ * Since: 2.4
+ **/
+gboolean
+gimp_vectors_stroke_flip_free (GimpVectors *vectors,
+                               gint         stroke_id,
+                               gdouble      x1,
+                               gdouble      y1,
+                               gdouble      x2,
+                               gdouble      y2)
+{
+  GimpPDB        *pdb = gimp_get_pdb ();
+  GimpValueArray *args;
+  GimpValueArray *return_vals;
+  gboolean success = TRUE;
+
+  args = gimp_value_array_new_from_types (NULL,
+                                          GIMP_TYPE_VECTORS_ID, gimp_item_get_id (GIMP_ITEM (vectors)),
+                                          G_TYPE_INT, stroke_id,
+                                          G_TYPE_DOUBLE, x1,
+                                          G_TYPE_DOUBLE, y1,
+                                          G_TYPE_DOUBLE, x2,
+                                          G_TYPE_DOUBLE, y2,
+                                          G_TYPE_NONE);
+
+  if (pdb)
+    return_vals = gimp_pdb_run_procedure_array (pdb,
+                                                "gimp-vectors-stroke-flip-free",
+                                                args);
+  else
+    return_vals = gimp_run_procedure_array ("gimp-vectors-stroke-flip-free",
+                                            args);
+  gimp_value_array_unref (args);
+
+  success = g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS;
+
+  gimp_value_array_unref (return_vals);
+
+  return success;
+}
+
+/**
+ * _gimp_vectors_stroke_flip_free: (skip)
+ * @vectors_ID: The vectors object.
+ * @stroke_id: The stroke ID.
+ * @x1: X coordinate of the first point of the flipping axis.
+ * @y1: Y coordinate of the first point of the flipping axis.
+ * @x2: X coordinate of the second point of the flipping axis.
+ * @y2: Y coordinate of the second point of the flipping axis.
  *
  * flips the given stroke about an arbitrary axis.
  *
@@ -734,12 +1292,12 @@ gimp_vectors_stroke_flip (gint32              vectors_ID,
  * Since: 2.4
  **/
 gboolean
-gimp_vectors_stroke_flip_free (gint32  vectors_ID,
-                               gint    stroke_id,
-                               gdouble x1,
-                               gdouble y1,
-                               gdouble x2,
-                               gdouble y2)
+_gimp_vectors_stroke_flip_free (gint32  vectors_ID,
+                                gint    stroke_id,
+                                gdouble x1,
+                                gdouble y1,
+                                gdouble x2,
+                                gdouble y2)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -773,7 +1331,7 @@ gimp_vectors_stroke_flip_free (gint32  vectors_ID,
 
 /**
  * gimp_vectors_stroke_get_points:
- * @vectors_ID: The vectors object.
+ * @vectors: The vectors object.
  * @stroke_id: The stroke ID.
  * @num_points: (out): The number of floats returned.
  * @controlpoints: (out) (array length=num_points) (element-type gdouble) (transfer full): List of the 
control points for the stroke (x0, y0, x1, y1, ...).
@@ -791,11 +1349,71 @@ gimp_vectors_stroke_flip_free (gint32  vectors_ID,
  * Since: 2.4
  **/
 GimpVectorsStrokeType
-gimp_vectors_stroke_get_points (gint32     vectors_ID,
-                                gint       stroke_id,
-                                gint      *num_points,
-                                gdouble  **controlpoints,
-                                gboolean  *closed)
+gimp_vectors_stroke_get_points (GimpVectors  *vectors,
+                                gint          stroke_id,
+                                gint         *num_points,
+                                gdouble     **controlpoints,
+                                gboolean     *closed)
+{
+  GimpPDB        *pdb = gimp_get_pdb ();
+  GimpValueArray *args;
+  GimpValueArray *return_vals;
+  GimpVectorsStrokeType type = 0;
+
+  args = gimp_value_array_new_from_types (NULL,
+                                          GIMP_TYPE_VECTORS_ID, gimp_item_get_id (GIMP_ITEM (vectors)),
+                                          G_TYPE_INT, stroke_id,
+                                          G_TYPE_NONE);
+
+  if (pdb)
+    return_vals = gimp_pdb_run_procedure_array (pdb,
+                                                "gimp-vectors-stroke-get-points",
+                                                args);
+  else
+    return_vals = gimp_run_procedure_array ("gimp-vectors-stroke-get-points",
+                                            args);
+  gimp_value_array_unref (args);
+
+  *num_points = 0;
+
+  if (g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS)
+    {
+      type = g_value_get_enum (gimp_value_array_index (return_vals, 1));
+      *num_points = g_value_get_int (gimp_value_array_index (return_vals, 2));
+      *controlpoints = gimp_value_dup_float_array (gimp_value_array_index (return_vals, 3));
+      *closed = g_value_get_boolean (gimp_value_array_index (return_vals, 4));
+    }
+
+  gimp_value_array_unref (return_vals);
+
+  return type;
+}
+
+/**
+ * _gimp_vectors_stroke_get_points: (skip)
+ * @vectors_ID: The vectors object.
+ * @stroke_id: The stroke ID.
+ * @num_points: (out): The number of floats returned.
+ * @controlpoints: (out) (array length=num_points): List of the control points for the stroke (x0, y0, x1, 
y1, ...).
+ * @closed: (out): Whether the stroke is closed or not.
+ *
+ * returns the control points of a stroke.
+ *
+ * returns the control points of a stroke. The interpretation of the
+ * coordinates returned depends on the type of the stroke. For Gimp 2.4
+ * this is always a bezier stroke, where the coordinates are the
+ * control points.
+ *
+ * Returns: type of the stroke (always GIMP_VECTORS_STROKE_TYPE_BEZIER for now).
+ *
+ * Since: 2.4
+ **/
+GimpVectorsStrokeType
+_gimp_vectors_stroke_get_points (gint32     vectors_ID,
+                                 gint       stroke_id,
+                                 gint      *num_points,
+                                 gdouble  **controlpoints,
+                                 gboolean  *closed)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -833,7 +1451,7 @@ gimp_vectors_stroke_get_points (gint32     vectors_ID,
 
 /**
  * gimp_vectors_stroke_new_from_points:
- * @vectors_ID: The vectors object.
+ * @vectors: The vectors object.
  * @type: type of the stroke (always GIMP_VECTORS_STROKE_TYPE_BEZIER for now).
  * @num_points: The number of elements in the array, i.e. the number of controlpoints in the stroke * 2 (x- 
and y-coordinate).
  * @controlpoints: (array length=num_points) (element-type gdouble): List of the x- and y-coordinates of the 
control points.
@@ -855,7 +1473,7 @@ gimp_vectors_stroke_get_points (gint32     vectors_ID,
  * Since: 2.4
  **/
 gint
-gimp_vectors_stroke_new_from_points (gint32                 vectors_ID,
+gimp_vectors_stroke_new_from_points (GimpVectors           *vectors,
                                      GimpVectorsStrokeType  type,
                                      gint                   num_points,
                                      const gdouble         *controlpoints,
@@ -866,6 +1484,67 @@ gimp_vectors_stroke_new_from_points (gint32                 vectors_ID,
   GimpValueArray *return_vals;
   gint stroke_id = 0;
 
+  args = gimp_value_array_new_from_types (NULL,
+                                          GIMP_TYPE_VECTORS_ID, gimp_item_get_id (GIMP_ITEM (vectors)),
+                                          GIMP_TYPE_VECTORS_STROKE_TYPE, type,
+                                          G_TYPE_INT, num_points,
+                                          GIMP_TYPE_FLOAT_ARRAY, NULL,
+                                          G_TYPE_BOOLEAN, closed,
+                                          G_TYPE_NONE);
+  gimp_value_set_float_array (gimp_value_array_index (args, 3), controlpoints, num_points);
+
+  if (pdb)
+    return_vals = gimp_pdb_run_procedure_array (pdb,
+                                                "gimp-vectors-stroke-new-from-points",
+                                                args);
+  else
+    return_vals = gimp_run_procedure_array ("gimp-vectors-stroke-new-from-points",
+                                            args);
+  gimp_value_array_unref (args);
+
+  if (g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS)
+    stroke_id = g_value_get_int (gimp_value_array_index (return_vals, 1));
+
+  gimp_value_array_unref (return_vals);
+
+  return stroke_id;
+}
+
+/**
+ * _gimp_vectors_stroke_new_from_points: (skip)
+ * @vectors_ID: The vectors object.
+ * @type: type of the stroke (always GIMP_VECTORS_STROKE_TYPE_BEZIER for now).
+ * @num_points: The number of elements in the array, i.e. the number of controlpoints in the stroke * 2 (x- 
and y-coordinate).
+ * @controlpoints: (array length=num_points) (element-type gdouble): List of the x- and y-coordinates of the 
control points.
+ * @closed: Whether the stroke is to be closed or not.
+ *
+ * Adds a stroke of a given type to the vectors object.
+ *
+ * Adds a stroke of a given type to the vectors object. The coordinates
+ * of the control points can be specified. For now only strokes of the
+ * type GIMP_VECTORS_STROKE_TYPE_BEZIER are supported. The control
+ * points are specified as a pair of float values for the x- and
+ * y-coordinate. The Bezier stroke type needs a multiple of three
+ * control points. Each Bezier segment endpoint (anchor, A) has two
+ * additional control points (C) associated. They are specified in the
+ * order CACCACCAC...
+ *
+ * Returns: The stroke ID of the newly created stroke.
+ *
+ * Since: 2.4
+ **/
+gint
+_gimp_vectors_stroke_new_from_points (gint32                 vectors_ID,
+                                      GimpVectorsStrokeType  type,
+                                      gint                   num_points,
+                                      const gdouble         *controlpoints,
+                                      gboolean               closed)
+{
+  GimpPDB        *pdb = gimp_get_pdb ();
+  GimpValueArray *args;
+  GimpValueArray *return_vals;
+  gint stroke_id = 0;
+
   args = gimp_value_array_new_from_types (NULL,
                                           GIMP_TYPE_VECTORS_ID, vectors_ID,
                                           GIMP_TYPE_VECTORS_STROKE_TYPE, type,
@@ -877,23 +1556,82 @@ gimp_vectors_stroke_new_from_points (gint32                 vectors_ID,
 
   if (pdb)
     return_vals = gimp_pdb_run_procedure_array (pdb,
-                                                "gimp-vectors-stroke-new-from-points",
+                                                "gimp-vectors-stroke-new-from-points",
+                                                args);
+  else
+    return_vals = gimp_run_procedure_array ("gimp-vectors-stroke-new-from-points",
+                                            args);
+  gimp_value_array_unref (args);
+
+  if (g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS)
+    stroke_id = g_value_get_int (gimp_value_array_index (return_vals, 1));
+
+  gimp_value_array_unref (return_vals);
+
+  return stroke_id;
+}
+
+/**
+ * gimp_vectors_stroke_interpolate:
+ * @vectors: The vectors object.
+ * @stroke_id: The stroke ID.
+ * @precision: The precision used for the approximation.
+ * @num_coords: (out): The number of floats returned.
+ * @closed: (out): Whether the stroke is closed or not.
+ *
+ * returns polygonal approximation of the stroke.
+ *
+ * returns polygonal approximation of the stroke.
+ *
+ * Returns: (array length=num_coords) (element-type gdouble) (transfer full):
+ *          List of the coords along the path (x0, y0, x1, y1, ...).
+ *          The returned value must be freed with g_free().
+ *
+ * Since: 2.4
+ **/
+gdouble *
+gimp_vectors_stroke_interpolate (GimpVectors *vectors,
+                                 gint         stroke_id,
+                                 gdouble      precision,
+                                 gint        *num_coords,
+                                 gboolean    *closed)
+{
+  GimpPDB        *pdb = gimp_get_pdb ();
+  GimpValueArray *args;
+  GimpValueArray *return_vals;
+  gdouble *coords = NULL;
+
+  args = gimp_value_array_new_from_types (NULL,
+                                          GIMP_TYPE_VECTORS_ID, gimp_item_get_id (GIMP_ITEM (vectors)),
+                                          G_TYPE_INT, stroke_id,
+                                          G_TYPE_DOUBLE, precision,
+                                          G_TYPE_NONE);
+
+  if (pdb)
+    return_vals = gimp_pdb_run_procedure_array (pdb,
+                                                "gimp-vectors-stroke-interpolate",
                                                 args);
   else
-    return_vals = gimp_run_procedure_array ("gimp-vectors-stroke-new-from-points",
+    return_vals = gimp_run_procedure_array ("gimp-vectors-stroke-interpolate",
                                             args);
   gimp_value_array_unref (args);
 
+  *num_coords = 0;
+
   if (g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS)
-    stroke_id = g_value_get_int (gimp_value_array_index (return_vals, 1));
+    {
+      *num_coords = g_value_get_int (gimp_value_array_index (return_vals, 1));
+      coords = gimp_value_dup_float_array (gimp_value_array_index (return_vals, 2));
+      *closed = g_value_get_boolean (gimp_value_array_index (return_vals, 3));
+    }
 
   gimp_value_array_unref (return_vals);
 
-  return stroke_id;
+  return coords;
 }
 
 /**
- * gimp_vectors_stroke_interpolate:
+ * _gimp_vectors_stroke_interpolate: (skip)
  * @vectors_ID: The vectors object.
  * @stroke_id: The stroke ID.
  * @precision: The precision used for the approximation.
@@ -904,18 +1642,18 @@ gimp_vectors_stroke_new_from_points (gint32                 vectors_ID,
  *
  * returns polygonal approximation of the stroke.
  *
- * Returns: (array length=num_coords) (element-type gdouble) (transfer full):
+ * Returns: (array length=num_coords):
  *          List of the coords along the path (x0, y0, x1, y1, ...).
  *          The returned value must be freed with g_free().
  *
  * Since: 2.4
  **/
 gdouble *
-gimp_vectors_stroke_interpolate (gint32    vectors_ID,
-                                 gint      stroke_id,
-                                 gdouble   precision,
-                                 gint     *num_coords,
-                                 gboolean *closed)
+_gimp_vectors_stroke_interpolate (gint32    vectors_ID,
+                                  gint      stroke_id,
+                                  gdouble   precision,
+                                  gint     *num_coords,
+                                  gboolean *closed)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -953,6 +1691,53 @@ gimp_vectors_stroke_interpolate (gint32    vectors_ID,
 
 /**
  * gimp_vectors_bezier_stroke_new_moveto:
+ * @vectors: The vectors object.
+ * @x0: The x-coordinate of the moveto.
+ * @y0: The y-coordinate of the moveto.
+ *
+ * Adds a bezier stroke with a single moveto to the vectors object.
+ *
+ * Adds a bezier stroke with a single moveto to the vectors object.
+ *
+ * Returns: The resulting stroke.
+ *
+ * Since: 2.4
+ **/
+gint
+gimp_vectors_bezier_stroke_new_moveto (GimpVectors *vectors,
+                                       gdouble      x0,
+                                       gdouble      y0)
+{
+  GimpPDB        *pdb = gimp_get_pdb ();
+  GimpValueArray *args;
+  GimpValueArray *return_vals;
+  gint stroke_id = 0;
+
+  args = gimp_value_array_new_from_types (NULL,
+                                          GIMP_TYPE_VECTORS_ID, gimp_item_get_id (GIMP_ITEM (vectors)),
+                                          G_TYPE_DOUBLE, x0,
+                                          G_TYPE_DOUBLE, y0,
+                                          G_TYPE_NONE);
+
+  if (pdb)
+    return_vals = gimp_pdb_run_procedure_array (pdb,
+                                                "gimp-vectors-bezier-stroke-new-moveto",
+                                                args);
+  else
+    return_vals = gimp_run_procedure_array ("gimp-vectors-bezier-stroke-new-moveto",
+                                            args);
+  gimp_value_array_unref (args);
+
+  if (g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS)
+    stroke_id = g_value_get_int (gimp_value_array_index (return_vals, 1));
+
+  gimp_value_array_unref (return_vals);
+
+  return stroke_id;
+}
+
+/**
+ * _gimp_vectors_bezier_stroke_new_moveto: (skip)
  * @vectors_ID: The vectors object.
  * @x0: The x-coordinate of the moveto.
  * @y0: The y-coordinate of the moveto.
@@ -966,9 +1751,9 @@ gimp_vectors_stroke_interpolate (gint32    vectors_ID,
  * Since: 2.4
  **/
 gint
-gimp_vectors_bezier_stroke_new_moveto (gint32  vectors_ID,
-                                       gdouble x0,
-                                       gdouble y0)
+_gimp_vectors_bezier_stroke_new_moveto (gint32  vectors_ID,
+                                        gdouble x0,
+                                        gdouble y0)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -1000,6 +1785,55 @@ gimp_vectors_bezier_stroke_new_moveto (gint32  vectors_ID,
 
 /**
  * gimp_vectors_bezier_stroke_lineto:
+ * @vectors: The vectors object.
+ * @stroke_id: The stroke ID.
+ * @x0: The x-coordinate of the lineto.
+ * @y0: The y-coordinate of the lineto.
+ *
+ * Extends a bezier stroke with a lineto.
+ *
+ * Extends a bezier stroke with a lineto.
+ *
+ * Returns: TRUE on success.
+ *
+ * Since: 2.4
+ **/
+gboolean
+gimp_vectors_bezier_stroke_lineto (GimpVectors *vectors,
+                                   gint         stroke_id,
+                                   gdouble      x0,
+                                   gdouble      y0)
+{
+  GimpPDB        *pdb = gimp_get_pdb ();
+  GimpValueArray *args;
+  GimpValueArray *return_vals;
+  gboolean success = TRUE;
+
+  args = gimp_value_array_new_from_types (NULL,
+                                          GIMP_TYPE_VECTORS_ID, gimp_item_get_id (GIMP_ITEM (vectors)),
+                                          G_TYPE_INT, stroke_id,
+                                          G_TYPE_DOUBLE, x0,
+                                          G_TYPE_DOUBLE, y0,
+                                          G_TYPE_NONE);
+
+  if (pdb)
+    return_vals = gimp_pdb_run_procedure_array (pdb,
+                                                "gimp-vectors-bezier-stroke-lineto",
+                                                args);
+  else
+    return_vals = gimp_run_procedure_array ("gimp-vectors-bezier-stroke-lineto",
+                                            args);
+  gimp_value_array_unref (args);
+
+  success = g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS;
+
+  gimp_value_array_unref (return_vals);
+
+  return success;
+}
+
+/**
+ * _gimp_vectors_bezier_stroke_lineto: (skip)
  * @vectors_ID: The vectors object.
  * @stroke_id: The stroke ID.
  * @x0: The x-coordinate of the lineto.
@@ -1014,10 +1848,10 @@ gimp_vectors_bezier_stroke_new_moveto (gint32  vectors_ID,
  * Since: 2.4
  **/
 gboolean
-gimp_vectors_bezier_stroke_lineto (gint32  vectors_ID,
-                                   gint    stroke_id,
-                                   gdouble x0,
-                                   gdouble y0)
+_gimp_vectors_bezier_stroke_lineto (gint32  vectors_ID,
+                                    gint    stroke_id,
+                                    gdouble x0,
+                                    gdouble y0)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -1049,6 +1883,63 @@ gimp_vectors_bezier_stroke_lineto (gint32  vectors_ID,
 
 /**
  * gimp_vectors_bezier_stroke_conicto:
+ * @vectors: The vectors object.
+ * @stroke_id: The stroke ID.
+ * @x0: The x-coordinate of the control point.
+ * @y0: The y-coordinate of the control point.
+ * @x1: The x-coordinate of the end point.
+ * @y1: The y-coordinate of the end point.
+ *
+ * Extends a bezier stroke with a conic bezier spline.
+ *
+ * Extends a bezier stroke with a conic bezier spline. Actually a cubic
+ * bezier spline gets added that realizes the shape of a conic bezier
+ * spline.
+ *
+ * Returns: TRUE on success.
+ *
+ * Since: 2.4
+ **/
+gboolean
+gimp_vectors_bezier_stroke_conicto (GimpVectors *vectors,
+                                    gint         stroke_id,
+                                    gdouble      x0,
+                                    gdouble      y0,
+                                    gdouble      x1,
+                                    gdouble      y1)
+{
+  GimpPDB        *pdb = gimp_get_pdb ();
+  GimpValueArray *args;
+  GimpValueArray *return_vals;
+  gboolean success = TRUE;
+
+  args = gimp_value_array_new_from_types (NULL,
+                                          GIMP_TYPE_VECTORS_ID, gimp_item_get_id (GIMP_ITEM (vectors)),
+                                          G_TYPE_INT, stroke_id,
+                                          G_TYPE_DOUBLE, x0,
+                                          G_TYPE_DOUBLE, y0,
+                                          G_TYPE_DOUBLE, x1,
+                                          G_TYPE_DOUBLE, y1,
+                                          G_TYPE_NONE);
+
+  if (pdb)
+    return_vals = gimp_pdb_run_procedure_array (pdb,
+                                                "gimp-vectors-bezier-stroke-conicto",
+                                                args);
+  else
+    return_vals = gimp_run_procedure_array ("gimp-vectors-bezier-stroke-conicto",
+                                            args);
+  gimp_value_array_unref (args);
+
+  success = g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS;
+
+  gimp_value_array_unref (return_vals);
+
+  return success;
+}
+
+/**
+ * _gimp_vectors_bezier_stroke_conicto: (skip)
  * @vectors_ID: The vectors object.
  * @stroke_id: The stroke ID.
  * @x0: The x-coordinate of the control point.
@@ -1067,12 +1958,12 @@ gimp_vectors_bezier_stroke_lineto (gint32  vectors_ID,
  * Since: 2.4
  **/
 gboolean
-gimp_vectors_bezier_stroke_conicto (gint32  vectors_ID,
-                                    gint    stroke_id,
-                                    gdouble x0,
-                                    gdouble y0,
-                                    gdouble x1,
-                                    gdouble y1)
+_gimp_vectors_bezier_stroke_conicto (gint32  vectors_ID,
+                                     gint    stroke_id,
+                                     gdouble x0,
+                                     gdouble y0,
+                                     gdouble x1,
+                                     gdouble y1)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -1106,6 +1997,67 @@ gimp_vectors_bezier_stroke_conicto (gint32  vectors_ID,
 
 /**
  * gimp_vectors_bezier_stroke_cubicto:
+ * @vectors: The vectors object.
+ * @stroke_id: The stroke ID.
+ * @x0: The x-coordinate of the first control point.
+ * @y0: The y-coordinate of the first control point.
+ * @x1: The x-coordinate of the second control point.
+ * @y1: The y-coordinate of the second control point.
+ * @x2: The x-coordinate of the end point.
+ * @y2: The y-coordinate of the end point.
+ *
+ * Extends a bezier stroke with a cubic bezier spline.
+ *
+ * Extends a bezier stroke with a cubic bezier spline.
+ *
+ * Returns: TRUE on success.
+ *
+ * Since: 2.4
+ **/
+gboolean
+gimp_vectors_bezier_stroke_cubicto (GimpVectors *vectors,
+                                    gint         stroke_id,
+                                    gdouble      x0,
+                                    gdouble      y0,
+                                    gdouble      x1,
+                                    gdouble      y1,
+                                    gdouble      x2,
+                                    gdouble      y2)
+{
+  GimpPDB        *pdb = gimp_get_pdb ();
+  GimpValueArray *args;
+  GimpValueArray *return_vals;
+  gboolean success = TRUE;
+
+  args = gimp_value_array_new_from_types (NULL,
+                                          GIMP_TYPE_VECTORS_ID, gimp_item_get_id (GIMP_ITEM (vectors)),
+                                          G_TYPE_INT, stroke_id,
+                                          G_TYPE_DOUBLE, x0,
+                                          G_TYPE_DOUBLE, y0,
+                                          G_TYPE_DOUBLE, x1,
+                                          G_TYPE_DOUBLE, y1,
+                                          G_TYPE_DOUBLE, x2,
+                                          G_TYPE_DOUBLE, y2,
+                                          G_TYPE_NONE);
+
+  if (pdb)
+    return_vals = gimp_pdb_run_procedure_array (pdb,
+                                                "gimp-vectors-bezier-stroke-cubicto",
+                                                args);
+  else
+    return_vals = gimp_run_procedure_array ("gimp-vectors-bezier-stroke-cubicto",
+                                            args);
+  gimp_value_array_unref (args);
+
+  success = g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS;
+
+  gimp_value_array_unref (return_vals);
+
+  return success;
+}
+
+/**
+ * _gimp_vectors_bezier_stroke_cubicto: (skip)
  * @vectors_ID: The vectors object.
  * @stroke_id: The stroke ID.
  * @x0: The x-coordinate of the first control point.
@@ -1124,14 +2076,14 @@ gimp_vectors_bezier_stroke_conicto (gint32  vectors_ID,
  * Since: 2.4
  **/
 gboolean
-gimp_vectors_bezier_stroke_cubicto (gint32  vectors_ID,
-                                    gint    stroke_id,
-                                    gdouble x0,
-                                    gdouble y0,
-                                    gdouble x1,
-                                    gdouble y1,
-                                    gdouble x2,
-                                    gdouble y2)
+_gimp_vectors_bezier_stroke_cubicto (gint32  vectors_ID,
+                                     gint    stroke_id,
+                                     gdouble x0,
+                                     gdouble y0,
+                                     gdouble x1,
+                                     gdouble y1,
+                                     gdouble x2,
+                                     gdouble y2)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -1167,6 +2119,62 @@ gimp_vectors_bezier_stroke_cubicto (gint32  vectors_ID,
 
 /**
  * gimp_vectors_bezier_stroke_new_ellipse:
+ * @vectors: The vectors object.
+ * @x0: The x-coordinate of the center.
+ * @y0: The y-coordinate of the center.
+ * @radius_x: The radius in x direction.
+ * @radius_y: The radius in y direction.
+ * @angle: The angle the x-axis of the ellipse (radians, counterclockwise).
+ *
+ * Adds a bezier stroke describing an ellipse the vectors object.
+ *
+ * Adds a bezier stroke describing an ellipse the vectors object.
+ *
+ * Returns: The resulting stroke.
+ *
+ * Since: 2.4
+ **/
+gint
+gimp_vectors_bezier_stroke_new_ellipse (GimpVectors *vectors,
+                                        gdouble      x0,
+                                        gdouble      y0,
+                                        gdouble      radius_x,
+                                        gdouble      radius_y,
+                                        gdouble      angle)
+{
+  GimpPDB        *pdb = gimp_get_pdb ();
+  GimpValueArray *args;
+  GimpValueArray *return_vals;
+  gint stroke_id = 0;
+
+  args = gimp_value_array_new_from_types (NULL,
+                                          GIMP_TYPE_VECTORS_ID, gimp_item_get_id (GIMP_ITEM (vectors)),
+                                          G_TYPE_DOUBLE, x0,
+                                          G_TYPE_DOUBLE, y0,
+                                          G_TYPE_DOUBLE, radius_x,
+                                          G_TYPE_DOUBLE, radius_y,
+                                          G_TYPE_DOUBLE, angle,
+                                          G_TYPE_NONE);
+
+  if (pdb)
+    return_vals = gimp_pdb_run_procedure_array (pdb,
+                                                "gimp-vectors-bezier-stroke-new-ellipse",
+                                                args);
+  else
+    return_vals = gimp_run_procedure_array ("gimp-vectors-bezier-stroke-new-ellipse",
+                                            args);
+  gimp_value_array_unref (args);
+
+  if (g_value_get_enum (gimp_value_array_index (return_vals, 0)) == GIMP_PDB_SUCCESS)
+    stroke_id = g_value_get_int (gimp_value_array_index (return_vals, 1));
+
+  gimp_value_array_unref (return_vals);
+
+  return stroke_id;
+}
+
+/**
+ * _gimp_vectors_bezier_stroke_new_ellipse: (skip)
  * @vectors_ID: The vectors object.
  * @x0: The x-coordinate of the center.
  * @y0: The y-coordinate of the center.
@@ -1183,12 +2191,12 @@ gimp_vectors_bezier_stroke_cubicto (gint32  vectors_ID,
  * Since: 2.4
  **/
 gint
-gimp_vectors_bezier_stroke_new_ellipse (gint32  vectors_ID,
-                                        gdouble x0,
-                                        gdouble y0,
-                                        gdouble radius_x,
-                                        gdouble radius_y,
-                                        gdouble angle)
+_gimp_vectors_bezier_stroke_new_ellipse (gint32  vectors_ID,
+                                         gdouble x0,
+                                         gdouble y0,
+                                         gdouble radius_x,
+                                         gdouble radius_y,
+                                         gdouble angle)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -1485,7 +2493,7 @@ _gimp_vectors_import_from_string (gint32        image_ID,
  * gimp_vectors_export_to_file:
  * @image: The image.
  * @filename: The name of the SVG file to create.
- * @vectors_ID: The vectors object to be saved, or 0 for all in the image.
+ * @vectors: The vectors object to be saved, or 0 for all in the image.
  *
  * save a path as an SVG file.
  *
@@ -1501,7 +2509,7 @@ _gimp_vectors_import_from_string (gint32        image_ID,
 gboolean
 gimp_vectors_export_to_file (GimpImage   *image,
                              const gchar *filename,
-                             gint32       vectors_ID)
+                             GimpVectors *vectors)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -1511,7 +2519,7 @@ gimp_vectors_export_to_file (GimpImage   *image,
   args = gimp_value_array_new_from_types (NULL,
                                           GIMP_TYPE_IMAGE_ID, gimp_image_get_id (image),
                                           G_TYPE_STRING, filename,
-                                          GIMP_TYPE_VECTORS_ID, vectors_ID,
+                                          GIMP_TYPE_VECTORS_ID, gimp_item_get_id (GIMP_ITEM (vectors)),
                                           G_TYPE_NONE);
 
   if (pdb)
@@ -1582,7 +2590,7 @@ _gimp_vectors_export_to_file (gint32       image_ID,
 /**
  * gimp_vectors_export_to_string:
  * @image: The image.
- * @vectors_ID: The vectors object to save, or 0 for all in the image.
+ * @vectors: The vectors object to save, or 0 for all in the image.
  *
  * Save a path as an SVG string.
  *
@@ -1598,8 +2606,8 @@ _gimp_vectors_export_to_file (gint32       image_ID,
  * Since: 2.6
  **/
 gchar *
-gimp_vectors_export_to_string (GimpImage *image,
-                               gint32     vectors_ID)
+gimp_vectors_export_to_string (GimpImage   *image,
+                               GimpVectors *vectors)
 {
   GimpPDB        *pdb = gimp_get_pdb ();
   GimpValueArray *args;
@@ -1608,7 +2616,7 @@ gimp_vectors_export_to_string (GimpImage *image,
 
   args = gimp_value_array_new_from_types (NULL,
                                           GIMP_TYPE_IMAGE_ID, gimp_image_get_id (image),
-                                          GIMP_TYPE_VECTORS_ID, vectors_ID,
+                                          GIMP_TYPE_VECTORS_ID, gimp_item_get_id (GIMP_ITEM (vectors)),
                                           G_TYPE_NONE);
 
   if (pdb)
diff --git a/libgimp/gimpvectors_pdb.h b/libgimp/gimpvectors_pdb.h
index e12c21c795..932553f4fd 100644
--- a/libgimp/gimpvectors_pdb.h
+++ b/libgimp/gimpvectors_pdb.h
@@ -32,13 +32,21 @@ G_BEGIN_DECLS
 /* For information look into the C source or the html documentation */
 
 
-gint32                gimp_vectors_copy                      (gint32                  vectors_ID);
-gint*                 gimp_vectors_get_strokes               (gint32                  vectors_ID,
+
+
+#ifndef GIMP_DEPRECATED_REPLACE_NEW_API
+
+GimpVectors*          gimp_vectors_new                       (GimpImage              *image,
+                                                              const gchar            *name);
+GimpVectors*          gimp_vectors_new_from_text_layer       (GimpImage              *image,
+                                                              GimpLayer              *layer);
+GimpVectors*          gimp_vectors_copy                      (GimpVectors            *vectors);
+gint*                 gimp_vectors_get_strokes               (GimpVectors            *vectors,
                                                               gint                   *num_strokes);
-gdouble               gimp_vectors_stroke_get_length         (gint32                  vectors_ID,
+gdouble               gimp_vectors_stroke_get_length         (GimpVectors            *vectors,
                                                               gint                    stroke_id,
                                                               gdouble                 precision);
-gboolean              gimp_vectors_stroke_get_point_at_dist  (gint32                  vectors_ID,
+gboolean              gimp_vectors_stroke_get_point_at_dist  (GimpVectors            *vectors,
                                                               gint                    stroke_id,
                                                               gdouble                 dist,
                                                               gdouble                 precision,
@@ -46,62 +54,62 @@ gboolean              gimp_vectors_stroke_get_point_at_dist  (gint32
                                                               gdouble                *y_point,
                                                               gdouble                *slope,
                                                               gboolean               *valid);
-gboolean              gimp_vectors_remove_stroke             (gint32                  vectors_ID,
+gboolean              gimp_vectors_remove_stroke             (GimpVectors            *vectors,
                                                               gint                    stroke_id);
-gboolean              gimp_vectors_stroke_close              (gint32                  vectors_ID,
+gboolean              gimp_vectors_stroke_close              (GimpVectors            *vectors,
                                                               gint                    stroke_id);
-gboolean              gimp_vectors_stroke_translate          (gint32                  vectors_ID,
+gboolean              gimp_vectors_stroke_translate          (GimpVectors            *vectors,
                                                               gint                    stroke_id,
                                                               gint                    off_x,
                                                               gint                    off_y);
-gboolean              gimp_vectors_stroke_scale              (gint32                  vectors_ID,
+gboolean              gimp_vectors_stroke_scale              (GimpVectors            *vectors,
                                                               gint                    stroke_id,
                                                               gdouble                 scale_x,
                                                               gdouble                 scale_y);
-gboolean              gimp_vectors_stroke_rotate             (gint32                  vectors_ID,
+gboolean              gimp_vectors_stroke_rotate             (GimpVectors            *vectors,
                                                               gint                    stroke_id,
                                                               gdouble                 center_x,
                                                               gdouble                 center_y,
                                                               gdouble                 angle);
-gboolean              gimp_vectors_stroke_flip               (gint32                  vectors_ID,
+gboolean              gimp_vectors_stroke_flip               (GimpVectors            *vectors,
                                                               gint                    stroke_id,
                                                               GimpOrientationType     flip_type,
                                                               gdouble                 axis);
-gboolean              gimp_vectors_stroke_flip_free          (gint32                  vectors_ID,
+gboolean              gimp_vectors_stroke_flip_free          (GimpVectors            *vectors,
                                                               gint                    stroke_id,
                                                               gdouble                 x1,
                                                               gdouble                 y1,
                                                               gdouble                 x2,
                                                               gdouble                 y2);
-GimpVectorsStrokeType gimp_vectors_stroke_get_points         (gint32                  vectors_ID,
+GimpVectorsStrokeType gimp_vectors_stroke_get_points         (GimpVectors            *vectors,
                                                               gint                    stroke_id,
                                                               gint                   *num_points,
                                                               gdouble               **controlpoints,
                                                               gboolean               *closed);
-gint                  gimp_vectors_stroke_new_from_points    (gint32                  vectors_ID,
+gint                  gimp_vectors_stroke_new_from_points    (GimpVectors            *vectors,
                                                               GimpVectorsStrokeType   type,
                                                               gint                    num_points,
                                                               const gdouble          *controlpoints,
                                                               gboolean                closed);
-gdouble*              gimp_vectors_stroke_interpolate        (gint32                  vectors_ID,
+gdouble*              gimp_vectors_stroke_interpolate        (GimpVectors            *vectors,
                                                               gint                    stroke_id,
                                                               gdouble                 precision,
                                                               gint                   *num_coords,
                                                               gboolean               *closed);
-gint                  gimp_vectors_bezier_stroke_new_moveto  (gint32                  vectors_ID,
+gint                  gimp_vectors_bezier_stroke_new_moveto  (GimpVectors            *vectors,
                                                               gdouble                 x0,
                                                               gdouble                 y0);
-gboolean              gimp_vectors_bezier_stroke_lineto      (gint32                  vectors_ID,
+gboolean              gimp_vectors_bezier_stroke_lineto      (GimpVectors            *vectors,
                                                               gint                    stroke_id,
                                                               gdouble                 x0,
                                                               gdouble                 y0);
-gboolean              gimp_vectors_bezier_stroke_conicto     (gint32                  vectors_ID,
+gboolean              gimp_vectors_bezier_stroke_conicto     (GimpVectors            *vectors,
                                                               gint                    stroke_id,
                                                               gdouble                 x0,
                                                               gdouble                 y0,
                                                               gdouble                 x1,
                                                               gdouble                 y1);
-gboolean              gimp_vectors_bezier_stroke_cubicto     (gint32                  vectors_ID,
+gboolean              gimp_vectors_bezier_stroke_cubicto     (GimpVectors            *vectors,
                                                               gint                    stroke_id,
                                                               gdouble                 x0,
                                                               gdouble                 y0,
@@ -109,42 +117,54 @@ gboolean              gimp_vectors_bezier_stroke_cubicto     (gint32
                                                               gdouble                 y1,
                                                               gdouble                 x2,
                                                               gdouble                 y2);
-gint                  gimp_vectors_bezier_stroke_new_ellipse (gint32                  vectors_ID,
+gint                  gimp_vectors_bezier_stroke_new_ellipse (GimpVectors            *vectors,
                                                               gdouble                 x0,
                                                               gdouble                 y0,
                                                               gdouble                 radius_x,
                                                               gdouble                 radius_y,
                                                               gdouble                 angle);
-
-#ifndef GIMP_DEPRECATED_REPLACE_NEW_API
-
-gint32   gimp_vectors_new                 (GimpImage    *image,
-                                           const gchar  *name);
-gint32   gimp_vectors_new_from_text_layer (GimpImage    *image,
-                                           GimpLayer    *layer);
-gboolean gimp_vectors_import_from_file    (GimpImage    *image,
-                                           const gchar  *filename,
-                                           gboolean      merge,
-                                           gboolean      scale,
-                                           gint         *num_vectors,
-                                           gint        **vectors_ids);
-gboolean gimp_vectors_import_from_string  (GimpImage    *image,
-                                           const gchar  *string,
-                                           gint          length,
-                                           gboolean      merge,
-                                           gboolean      scale,
-                                           gint         *num_vectors,
-                                           gint        **vectors_ids);
-gboolean gimp_vectors_export_to_file      (GimpImage    *image,
-                                           const gchar  *filename,
-                                           gint32        vectors_ID);
-gchar*   gimp_vectors_export_to_string    (GimpImage    *image,
-                                           gint32        vectors_ID);
+gboolean              gimp_vectors_import_from_file          (GimpImage              *image,
+                                                              const gchar            *filename,
+                                                              gboolean                merge,
+                                                              gboolean                scale,
+                                                              gint                   *num_vectors,
+                                                              gint                  **vectors_ids);
+gboolean              gimp_vectors_import_from_string        (GimpImage              *image,
+                                                              const gchar            *string,
+                                                              gint                    length,
+                                                              gboolean                merge,
+                                                              gboolean                scale,
+                                                              gint                   *num_vectors,
+                                                              gint                  **vectors_ids);
+gboolean              gimp_vectors_export_to_file            (GimpImage              *image,
+                                                              const gchar            *filename,
+                                                              GimpVectors            *vectors);
+gchar*                gimp_vectors_export_to_string          (GimpImage              *image,
+                                                              GimpVectors            *vectors);
 
 #else /* GIMP_DEPRECATED_REPLACE_NEW_API */
 
 #define gimp_vectors_new _gimp_vectors_new
 #define gimp_vectors_new_from_text_layer _gimp_vectors_new_from_text_layer
+#define gimp_vectors_copy _gimp_vectors_copy
+#define gimp_vectors_get_strokes _gimp_vectors_get_strokes
+#define gimp_vectors_stroke_get_length _gimp_vectors_stroke_get_length
+#define gimp_vectors_stroke_get_point_at_dist _gimp_vectors_stroke_get_point_at_dist
+#define gimp_vectors_remove_stroke _gimp_vectors_remove_stroke
+#define gimp_vectors_stroke_close _gimp_vectors_stroke_close
+#define gimp_vectors_stroke_translate _gimp_vectors_stroke_translate
+#define gimp_vectors_stroke_scale _gimp_vectors_stroke_scale
+#define gimp_vectors_stroke_rotate _gimp_vectors_stroke_rotate
+#define gimp_vectors_stroke_flip _gimp_vectors_stroke_flip
+#define gimp_vectors_stroke_flip_free _gimp_vectors_stroke_flip_free
+#define gimp_vectors_stroke_get_points _gimp_vectors_stroke_get_points
+#define gimp_vectors_stroke_new_from_points _gimp_vectors_stroke_new_from_points
+#define gimp_vectors_stroke_interpolate _gimp_vectors_stroke_interpolate
+#define gimp_vectors_bezier_stroke_new_moveto _gimp_vectors_bezier_stroke_new_moveto
+#define gimp_vectors_bezier_stroke_lineto _gimp_vectors_bezier_stroke_lineto
+#define gimp_vectors_bezier_stroke_conicto _gimp_vectors_bezier_stroke_conicto
+#define gimp_vectors_bezier_stroke_cubicto _gimp_vectors_bezier_stroke_cubicto
+#define gimp_vectors_bezier_stroke_new_ellipse _gimp_vectors_bezier_stroke_new_ellipse
 #define gimp_vectors_import_from_file _gimp_vectors_import_from_file
 #define gimp_vectors_import_from_string _gimp_vectors_import_from_string
 #define gimp_vectors_export_to_file _gimp_vectors_export_to_file
@@ -157,28 +177,111 @@ gchar*   gimp_vectors_export_to_string    (GimpImage    *image,
  * They are not marked internal as a trick to keep the old API alive for now.
  */
 
-gint32   _gimp_vectors_new                 (gint32        image_ID,
-                                            const gchar  *name);
-gint32   _gimp_vectors_new_from_text_layer (gint32        image_ID,
-                                            gint32        layer_ID);
-gboolean _gimp_vectors_import_from_file    (gint32        image_ID,
-                                            const gchar  *filename,
-                                            gboolean      merge,
-                                            gboolean      scale,
-                                            gint         *num_vectors,
-                                            gint        **vectors_ids);
-gboolean _gimp_vectors_import_from_string  (gint32        image_ID,
-                                            const gchar  *string,
-                                            gint          length,
-                                            gboolean      merge,
-                                            gboolean      scale,
-                                            gint         *num_vectors,
-                                            gint        **vectors_ids);
-gboolean _gimp_vectors_export_to_file      (gint32        image_ID,
-                                            const gchar  *filename,
-                                            gint32        vectors_ID);
-gchar*   _gimp_vectors_export_to_string    (gint32        image_ID,
-                                            gint32        vectors_ID);
+gint32                _gimp_vectors_new                       (gint32                  image_ID,
+                                                               const gchar            *name);
+gint32                _gimp_vectors_new_from_text_layer       (gint32                  image_ID,
+                                                               gint32                  layer_ID);
+gint32                _gimp_vectors_copy                      (gint32                  vectors_ID);
+gint*                 _gimp_vectors_get_strokes               (gint32                  vectors_ID,
+                                                               gint                   *num_strokes);
+gdouble               _gimp_vectors_stroke_get_length         (gint32                  vectors_ID,
+                                                               gint                    stroke_id,
+                                                               gdouble                 precision);
+gboolean              _gimp_vectors_stroke_get_point_at_dist  (gint32                  vectors_ID,
+                                                               gint                    stroke_id,
+                                                               gdouble                 dist,
+                                                               gdouble                 precision,
+                                                               gdouble                *x_point,
+                                                               gdouble                *y_point,
+                                                               gdouble                *slope,
+                                                               gboolean               *valid);
+gboolean              _gimp_vectors_remove_stroke             (gint32                  vectors_ID,
+                                                               gint                    stroke_id);
+gboolean              _gimp_vectors_stroke_close              (gint32                  vectors_ID,
+                                                               gint                    stroke_id);
+gboolean              _gimp_vectors_stroke_translate          (gint32                  vectors_ID,
+                                                               gint                    stroke_id,
+                                                               gint                    off_x,
+                                                               gint                    off_y);
+gboolean              _gimp_vectors_stroke_scale              (gint32                  vectors_ID,
+                                                               gint                    stroke_id,
+                                                               gdouble                 scale_x,
+                                                               gdouble                 scale_y);
+gboolean              _gimp_vectors_stroke_rotate             (gint32                  vectors_ID,
+                                                               gint                    stroke_id,
+                                                               gdouble                 center_x,
+                                                               gdouble                 center_y,
+                                                               gdouble                 angle);
+gboolean              _gimp_vectors_stroke_flip               (gint32                  vectors_ID,
+                                                               gint                    stroke_id,
+                                                               GimpOrientationType     flip_type,
+                                                               gdouble                 axis);
+gboolean              _gimp_vectors_stroke_flip_free          (gint32                  vectors_ID,
+                                                               gint                    stroke_id,
+                                                               gdouble                 x1,
+                                                               gdouble                 y1,
+                                                               gdouble                 x2,
+                                                               gdouble                 y2);
+GimpVectorsStrokeType _gimp_vectors_stroke_get_points         (gint32                  vectors_ID,
+                                                               gint                    stroke_id,
+                                                               gint                   *num_points,
+                                                               gdouble               **controlpoints,
+                                                               gboolean               *closed);
+gint                  _gimp_vectors_stroke_new_from_points    (gint32                  vectors_ID,
+                                                               GimpVectorsStrokeType   type,
+                                                               gint                    num_points,
+                                                               const gdouble          *controlpoints,
+                                                               gboolean                closed);
+gdouble*              _gimp_vectors_stroke_interpolate        (gint32                  vectors_ID,
+                                                               gint                    stroke_id,
+                                                               gdouble                 precision,
+                                                               gint                   *num_coords,
+                                                               gboolean               *closed);
+gint                  _gimp_vectors_bezier_stroke_new_moveto  (gint32                  vectors_ID,
+                                                               gdouble                 x0,
+                                                               gdouble                 y0);
+gboolean              _gimp_vectors_bezier_stroke_lineto      (gint32                  vectors_ID,
+                                                               gint                    stroke_id,
+                                                               gdouble                 x0,
+                                                               gdouble                 y0);
+gboolean              _gimp_vectors_bezier_stroke_conicto     (gint32                  vectors_ID,
+                                                               gint                    stroke_id,
+                                                               gdouble                 x0,
+                                                               gdouble                 y0,
+                                                               gdouble                 x1,
+                                                               gdouble                 y1);
+gboolean              _gimp_vectors_bezier_stroke_cubicto     (gint32                  vectors_ID,
+                                                               gint                    stroke_id,
+                                                               gdouble                 x0,
+                                                               gdouble                 y0,
+                                                               gdouble                 x1,
+                                                               gdouble                 y1,
+                                                               gdouble                 x2,
+                                                               gdouble                 y2);
+gint                  _gimp_vectors_bezier_stroke_new_ellipse (gint32                  vectors_ID,
+                                                               gdouble                 x0,
+                                                               gdouble                 y0,
+                                                               gdouble                 radius_x,
+                                                               gdouble                 radius_y,
+                                                               gdouble                 angle);
+gboolean              _gimp_vectors_import_from_file          (gint32                  image_ID,
+                                                               const gchar            *filename,
+                                                               gboolean                merge,
+                                                               gboolean                scale,
+                                                               gint                   *num_vectors,
+                                                               gint                  **vectors_ids);
+gboolean              _gimp_vectors_import_from_string        (gint32                  image_ID,
+                                                               const gchar            *string,
+                                                               gint                    length,
+                                                               gboolean                merge,
+                                                               gboolean                scale,
+                                                               gint                   *num_vectors,
+                                                               gint                  **vectors_ids);
+gboolean              _gimp_vectors_export_to_file            (gint32                  image_ID,
+                                                               const gchar            *filename,
+                                                               gint32                  vectors_ID);
+gchar*                _gimp_vectors_export_to_string          (gint32                  image_ID,
+                                                               gint32                  vectors_ID);
 
 
 G_END_DECLS
diff --git a/pdb/app.pl b/pdb/app.pl
index 870b5bbf3e..dc55dd7070 100644
--- a/pdb/app.pl
+++ b/pdb/app.pl
@@ -82,10 +82,20 @@ sub declare_args {
 
            unless (exists $_->{no_declare} || exists $_->{dead}) {
                if ($outargs) {
-                   $result .= "  $arg->{type}$_->{name} = $arg->{init_value}";
+                    if (exists $arg->{app_type}) {
+                        $result .= "  $arg->{app_type}$_->{name} = $arg->{init_value}";
+                    }
+                    else {
+                        $result .= "  $arg->{type}$_->{name} = $arg->{init_value}";
+                    }
                }
                else {
-                   $result .= "  $arg->{const_type}$_->{name}";
+                    if (exists $arg->{app_const_type}) {
+                        $result .= "  $arg->{app_const_type}$_->{name}";
+                    }
+                    else {
+                        $result .= "  $arg->{const_type}$_->{name}";
+                    }
                }
                $result .= ";\n";
 
diff --git a/pdb/lib.pl b/pdb/lib.pl
index 9ff9460859..706635d14d 100644
--- a/pdb/lib.pl
+++ b/pdb/lib.pl
@@ -45,15 +45,6 @@ sub desc_wrap {
     return $wrapped;
 }
 
-sub is_id_arg {
-    my ($arg) = @_;
-
-    return ($arg->{name} eq 'IMAGE'    ||
-            $arg->{name} eq 'ITEM'     ||
-            $arg->{name} eq 'DRAWABLE' ||
-            $arg->{name} eq 'LAYER');
-}
-
 sub generate_fun {
     my ($proc, $out, $api_deprecated, $has_id_arg) = @_;
     my @inargs = @{$proc->{inargs}} if (defined $proc->{inargs});
@@ -67,11 +58,7 @@ sub generate_fun {
        my $argtype = $arg_types{$type};
        my $rettype = '';
 
-        if ($api_deprecated && is_id_arg($argtype)) {
-            return 'gint32 ';
-        }
-
-       if (exists $argtype->{id}) {
+       if ($api_deprecated && exists $argtype->{id}) {
            return 'gint32 ';
        }
 
@@ -220,7 +207,7 @@ sub generate_fun {
         my $desc = exists $_->{desc} ? $_->{desc} : "";
         my $var_len;
         my $value;
-        my $is_id = ($arg->{id} || ($api_deprecated && is_id_arg($arg)));
+        my $is_id = $arg->{id} && $api_deprecated;
 
         $var .= '_ID' if $is_id;
 
@@ -318,7 +305,7 @@ sub generate_fun {
             my ($type) = &arg_parse($_->{type});
             my $arg = $arg_types{$type};
             my $var;
-            my $is_id = ($arg->{id} || ($api_deprecated && is_id_arg($arg)));
+            my $is_id = $arg->{id} && $api_deprecated;
 
             $return_marshal = "" unless $once++;
 
@@ -399,7 +386,7 @@ CODE
             my ($type) = &arg_parse($_->{type});
             my $desc = exists $_->{desc} ? $_->{desc} : "";
             my $arg = $arg_types{$type};
-            my $is_id = ($arg->{id} || ($api_deprecated && is_id_arg($arg)));
+            my $is_id = $arg->{id} && $api_deprecated;
             my $var;
 
             # The return value variable
@@ -733,7 +720,7 @@ sub generate {
        foreach (@outargs) {
            my ($type, @typeinfo) = &arg_parse($_->{type});
            my $arg = $arg_types{$type};
-            if (is_id_arg($arg)) {
+            if (exists $arg->{id}) {
                 $has_id_arg = 1;
                 last;
             }
@@ -742,7 +729,7 @@ sub generate {
             foreach (@inargs) {
                 my ($type, @typeinfo) = &arg_parse($_->{type});
                 my $arg = $arg_types{$type};
-                if (is_id_arg($arg)) {
+                if (exists $arg->{id}) {
                     $has_id_arg = 1;
                     last;
                 }
diff --git a/pdb/pdb.pl b/pdb/pdb.pl
index 0775c55e48..41e52a8ebe 100644
--- a/pdb/pdb.pl
+++ b/pdb/pdb.pl
@@ -150,19 +150,25 @@ package Gimp::CodeGen::pdb;
 
     display     => { name            => 'DISPLAY',
                     gtype           => 'GIMP_TYPE_DISPLAY_ID',
-                    type            => 'GimpObject *',
-                    const_type      => 'GimpObject *',
+                    type            => 'GimpDisplay *',
+                    const_type      => 'GimpDisplay *',
+                    app_type        => 'GimpObject *',
+                    app_const_type  => 'GimpObject *',
                     id              => 1,
                     init_value      => 'NULL',
+                    out_annotate    => '(transfer full)',
                     get_value_func  => '$var = gimp_value_get_display ($value, gimp)',
-                    dup_value_func  => '$var = gimp_value_get_display_id ($value)',
-                    set_value_func  => 'gimp_value_set_display_id ($value, $var)',
-                    take_value_func => 'gimp_value_set_display ($value, $var)' },
+                    dup_value_func  => '$var = gimp_display_new_by_id (gimp_value_get_display_id ($value))',
+                    dup_value_func_d=> '$var = gimp_value_get_display_id ($value)',
+                    set_value_func  => 'gimp_value_set_display_id ($value, gimp_display_get_id ($var))',
+                    take_value_func => 'gimp_value_set_display ($value, $var)' ,
+                    convert_func    => 'gimp_display_get_id ($var)'},
 
     image       => { name            => 'IMAGE',
                     gtype           => 'GIMP_TYPE_IMAGE_ID',
                     type            => 'GimpImage *',
                     const_type      => 'GimpImage *',
+                    id              => 1,
                     init_value      => 'NULL',
                     out_annotate    => '(transfer full)',
                     get_value_func  => '$var = gimp_value_get_image ($value, gimp)',
@@ -177,6 +183,7 @@ package Gimp::CodeGen::pdb;
                     gtype           => 'GIMP_TYPE_ITEM_ID',
                     type            => 'GimpItem *',
                     const_type      => 'GimpItem *',
+                    id              => 1,
                     init_value      => 'NULL',
                     out_annotate    => '(transfer full)',
                     get_value_func  => '$var = gimp_value_get_item ($value, gimp)',
@@ -191,6 +198,7 @@ package Gimp::CodeGen::pdb;
                     gtype           => 'GIMP_TYPE_LAYER_ID',
                     type            => 'GimpLayer *',
                     const_type      => 'GimpLayer *',
+                    id              => 1,
                     init_value      => 'NULL',
                     out_annotate    => '(transfer full)',
                     get_value_func  => '$var = gimp_value_get_layer ($value, gimp)',
@@ -207,16 +215,20 @@ package Gimp::CodeGen::pdb;
                     const_type      => 'GimpChannel *',
                     id              => 1,
                     init_value      => 'NULL',
+                    out_annotate    => '(transfer full)',
                     get_value_func  => '$var = gimp_value_get_channel ($value, gimp)',
-                    dup_value_func  => '$var = gimp_value_get_channel_id ($value)',
+                    dup_value_func  => '$var = GIMP_CHANNEL (gimp_item_new_by_id (gimp_value_get_channel_id 
($value)))',
+                    dup_value_func_d=> '$var = gimp_value_get_channel_id ($value)',
                     set_value_func  => 'gimp_value_set_channel_id ($value, $var)',
                     take_value_func => 'gimp_value_set_channel ($value, $var)',
+                    convert_func    => 'gimp_item_get_id (GIMP_ITEM ($var))',
                     headers         => [ qw("core/gimpchannel.h") ] },
 
     drawable    => { name            => 'DRAWABLE',
                     gtype           => 'GIMP_TYPE_DRAWABLE_ID',
                     type            => 'GimpDrawable *',
                     const_type      => 'GimpDrawable *',
+                    id              => 1,
                     init_value      => 'NULL',
                     out_annotate    => '(transfer full)',
                     get_value_func  => '$var = gimp_value_get_drawable ($value, gimp)',
@@ -233,10 +245,13 @@ package Gimp::CodeGen::pdb;
                     const_type      => 'GimpSelection *',
                     id              => 1,
                     init_value      => 'NULL',
+                    out_annotate    => '(transfer full)',
                     get_value_func  => '$var = gimp_value_get_selection ($value, gimp)',
-                    dup_value_func  => '$var = gimp_value_get_selection_id ($value)',
+                    dup_value_func  => '$var = GIMP_SELECTION (gimp_item_new_by_id 
(gimp_value_get_selection_id ($value)))',
+                    dup_value_func_d=> '$var = gimp_value_get_selection_id ($value)',
                     set_value_func  => 'gimp_value_set_selection_id ($value, $var)',
                     take_value_func => 'gimp_value_set_selection ($value, $var)',
+                    convert_func    => 'gimp_item_get_id (GIMP_ITEM ($var))',
                     headers         => [ qw("core/gimpselection.h") ] },
 
     layer_mask  => { name            => 'CHANNEL',
@@ -245,10 +260,13 @@ package Gimp::CodeGen::pdb;
                     const_type      => 'GimpLayerMask *',
                     id              => 1,
                     init_value      => 'NULL',
+                    out_annotate    => '(transfer full)',
                     get_value_func  => '$var = gimp_value_get_layer_mask ($value, gimp)',
-                    dup_value_func  => '$var = gimp_value_get_layer_mask_id ($value)',
+                    dup_value_func  => '$var = GIMP_LAYER_MASK (gimp_item_new_by_id 
(gimp_value_get_layer_mask_id ($value)))',
+                    dup_value_func_d=> '$var = gimp_value_get_layer_mask_id ($value)',
                     set_value_func  => 'gimp_value_set_layer_mask_id ($value, $var)',
                     take_value_func => 'gimp_value_set_layer_mask ($value, $var)',
+                    convert_func    => 'gimp_item_get_id (GIMP_ITEM ($var))',
                     headers         => [ qw("core/gimplayermask.h") ] },
 
     vectors     => { name            => 'VECTORS',
@@ -257,10 +275,13 @@ package Gimp::CodeGen::pdb;
                     const_type      => 'GimpVectors *',
                     id              => 1,
                     init_value      => 'NULL',
+                    out_annotate    => '(transfer full)',
                     get_value_func  => '$var = gimp_value_get_vectors ($value, gimp)',
-                    dup_value_func  => '$var = gimp_value_get_vectors_id ($value)',
+                    dup_value_func  => '$var = GIMP_VECTORS (gimp_item_new_by_id (gimp_value_get_vectors_id 
($value)))',
+                    dup_value_func_d=> '$var = gimp_value_get_vectors_id ($value)',
                     set_value_func  => 'gimp_value_set_vectors_id ($value, $var)',
                     take_value_func => 'gimp_value_set_vectors ($value, $var)',
+                    convert_func    => 'gimp_item_get_id (GIMP_ITEM ($var))',
                     headers         => [ qw("vectors/gimpvectors.h") ] },
 
     parasite    => { name            => 'PARASITE',


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]