diff --git a/lib/wp/configuration.c b/lib/wp/configuration.c
index 4b046349069010a2835be96e633f7d2c64ab4dcd..5303d353e90a8cf039dd65d7bec654155a6de543 100644
--- a/lib/wp/configuration.c
+++ b/lib/wp/configuration.c
@@ -16,7 +16,7 @@
 
 #include "configuration.h"
 #include "debug.h"
-#include "private.h"
+#include "private/registry.h"
 
 struct _WpConfiguration
 {
diff --git a/lib/wp/core.c b/lib/wp/core.c
index e5517fe516c13f0f0b3c3d562049851688924ad5..7f9ccd39aea1da47ea0bab1bcd3416ad2b73addd 100644
--- a/lib/wp/core.c
+++ b/lib/wp/core.c
@@ -28,7 +28,7 @@
 
 #include "core.h"
 #include "wp.h"
-#include "private.h"
+#include "private/registry.h"
 
 #include <pipewire/pipewire.h>
 
diff --git a/lib/wp/debug.c b/lib/wp/debug.c
index edc568b7381be2075825c688f018c00847053c9f..78ac2cbdaf9c5cc97a39e4a414d6e731c30e36f0 100644
--- a/lib/wp/debug.c
+++ b/lib/wp/debug.c
@@ -13,6 +13,7 @@
 
 #include "debug.h"
 #include "spa-pod.h"
+#include "proxy.h"
 #include "private.h"
 #include <pipewire/pipewire.h>
 #include <spa/support/log.h>
diff --git a/lib/wp/iterator.c b/lib/wp/iterator.c
index 21d73ca31a23116a08658a9b6c46a9403f7597f4..cdd54dd0d6d34358e973627d0ad242e84276e59f 100644
--- a/lib/wp/iterator.c
+++ b/lib/wp/iterator.c
@@ -8,8 +8,8 @@
 
 #define G_LOG_DOMAIN "wp-iterator"
 
-#include "private.h"
 #include "iterator.h"
+#include <spa/utils/defs.h>
 
 struct _WpIterator
 {
@@ -58,6 +58,19 @@ wp_iterator_default_foreach (WpIterator *self, WpIteratorForeachFunc func,
   return wp_iterator_fold (self, foreach_fold_func, NULL, &d);
 }
 
+/**
+ * wp_iterator_new:
+ * @methods: method implementations for the new iterator
+ * @user_size: size of the user_data structure to be allocated
+ *
+ * Constructs an iterator that uses the provided @methods to implement its API.
+ * The WpIterator structure is internally allocated with @user_size additional
+ * space at the end. A pointer to this space can be retrieved with
+ * wp_iterator_get_user_data() and is available for implementation-specific
+ * storage.
+ *
+ * Returns: (transfer full): a new custom iterator
+ */
 WpIterator *
 wp_iterator_new (const WpIteratorMethods *methods, size_t user_size)
 {
@@ -73,6 +86,14 @@ wp_iterator_new (const WpIteratorMethods *methods, size_t user_size)
   return self;
 }
 
+/**
+ * wp_iterator_get_user_data:
+ * @self: an iterator object
+ *
+ * Note: this only for use by implementations of WpIterator
+ *
+ * Returns: a pointer to the implementation-specific storage area
+ */
 gpointer
 wp_iterator_get_user_data (WpIterator *self)
 {
diff --git a/lib/wp/iterator.h b/lib/wp/iterator.h
index 613ae2f72353611895c2b6c40950db7cb263bbf1..ffa3479925110a9c6dde4ce386209f259896fcb0 100644
--- a/lib/wp/iterator.h
+++ b/lib/wp/iterator.h
@@ -46,6 +46,18 @@ WP_API
 GType wp_iterator_get_type (void);
 
 typedef struct _WpIterator WpIterator;
+typedef struct _WpIteratorMethods WpIteratorMethods;
+
+struct _WpIteratorMethods
+{
+  void (*reset) (WpIterator *self);
+  gboolean (*next) (WpIterator *self, GValue *item);
+  gboolean (*fold) (WpIterator *self, WpIteratorFoldFunc func,
+      GValue *ret, gpointer data);
+  gboolean (*foreach) (WpIterator *self, WpIteratorForeachFunc func,
+      gpointer data);
+  void (*finalize) (WpIterator *self);
+};
 
 /* ref count */
 
@@ -76,6 +88,15 @@ gboolean wp_iterator_foreach (WpIterator *self, WpIteratorForeachFunc func,
 WP_API
 WpIterator * wp_iterator_new_ptr_array (GPtrArray * items, GType item_type);
 
+WP_API
+WpIterator * wp_iterator_new (const WpIteratorMethods * methods,
+    size_t user_size);
+
+/* private */
+
+WP_API
+gpointer wp_iterator_get_user_data (WpIterator * self);
+
 G_DEFINE_AUTOPTR_CLEANUP_FUNC (WpIterator, wp_iterator_unref)
 
 G_END_DECLS
diff --git a/lib/wp/metadata.c b/lib/wp/metadata.c
index c578c8c3489c9c397095097ed97739f16290dc04..7ff81b3eb2ce04d4f0c733d6bf35e2a6202299a0 100644
--- a/lib/wp/metadata.c
+++ b/lib/wp/metadata.c
@@ -18,7 +18,6 @@
 #include "debug.h"
 #include "error.h"
 #include "wpenums.h"
-#include "private.h"
 
 #include <pipewire/pipewire.h>
 #include <pipewire/extensions/metadata.h>
diff --git a/lib/wp/module.c b/lib/wp/module.c
index 05f4746a0ad3784ecf628ebaee3ac3a71f1a939c..6c84b1522db9bdebf8749eb99defa40e2d18ee0d 100644
--- a/lib/wp/module.c
+++ b/lib/wp/module.c
@@ -44,7 +44,7 @@
 #include "module.h"
 #include "debug.h"
 #include "error.h"
-#include "private.h"
+#include "private/registry.h"
 #include <gmodule.h>
 
 #define WP_MODULE_INIT_SYMBOL "wireplumber__module_init"
diff --git a/lib/wp/object-interest.c b/lib/wp/object-interest.c
index b9f7a70ac8792b34d3fb8afa4586deeb4893e96c..2c26841351f901790c9045653977d6385299d26d 100644
--- a/lib/wp/object-interest.c
+++ b/lib/wp/object-interest.c
@@ -18,7 +18,8 @@
 #include "proxy-interfaces.h"
 #include "debug.h"
 #include "error.h"
-#include "private.h"
+
+#include <pipewire/pipewire.h>
 
 struct constraint
 {
diff --git a/lib/wp/object-manager.c b/lib/wp/object-manager.c
index 51b3232d6160fc462b32e96614d2f37ca8c6aed7..85c07c86c22a309a64d9f8245c27b01a577e5b14 100644
--- a/lib/wp/object-manager.c
+++ b/lib/wp/object-manager.c
@@ -41,7 +41,8 @@
 
 #include "object-manager.h"
 #include "debug.h"
-#include "private.h"
+#include "private/registry.h"
+
 #include <pipewire/pipewire.h>
 
 /* WpObjectManager */
diff --git a/lib/wp/plugin.c b/lib/wp/plugin.c
index e5d0edb95b514bcb5e0e203cc4aafb794bd7eada..62dc4e41130d31fc95d460c451621bfaed9c9ab0 100644
--- a/lib/wp/plugin.c
+++ b/lib/wp/plugin.c
@@ -14,7 +14,7 @@
 #define G_LOG_DOMAIN "wp-plugin"
 
 #include "plugin.h"
-#include "private.h"
+#include "private/registry.h"
 
 enum {
   PROP_0,
diff --git a/lib/wp/private.h b/lib/wp/private.h
index 33447682c8d83bcb68aca874ce7b12efbbafa700..792bb977e080a2817c8a43b47126ca71a47bb8d3 100644
--- a/lib/wp/private.h
+++ b/lib/wp/private.h
@@ -14,9 +14,7 @@
 #include "props.h"
 #include "proxy.h"
 #include "session-item.h"
-#include "iterator.h"
 #include "spa-type.h"
-#include "private/registry.h"
 
 #include <stdint.h>
 #include <pipewire/pipewire.h>
@@ -31,23 +29,6 @@ struct spa_pod_builder;
 void wp_props_handle_proxy_param_event (WpProps * self, guint32 id,
     WpSpaPod * pod);
 
-/* iterator */
-
-struct _WpIteratorMethods {
-  void (*reset) (WpIterator *self);
-  gboolean (*next) (WpIterator *self, GValue *item);
-  gboolean (*fold) (WpIterator *self, WpIteratorFoldFunc func,
-      GValue *ret, gpointer data);
-  gboolean (*foreach) (WpIterator *self, WpIteratorForeachFunc func,
-      gpointer data);
-  void (*finalize) (WpIterator *self);
-};
-typedef struct _WpIteratorMethods WpIteratorMethods;
-
-WpIterator * wp_iterator_new (const WpIteratorMethods *methods,
-    size_t user_size);
-gpointer wp_iterator_get_user_data (WpIterator *self);
-
 /* spa pod */
 
 typedef struct _WpSpaPod WpSpaPod;
diff --git a/lib/wp/properties.c b/lib/wp/properties.c
index 0b137866e4247761a4e19fab920d81e4dfcd4353..a8ea67265982dcdc31c4a18877da46afeed44c93 100644
--- a/lib/wp/properties.c
+++ b/lib/wp/properties.c
@@ -40,7 +40,6 @@
 #define G_LOG_DOMAIN "wp-properties"
 
 #include "properties.h"
-#include "private.h"
 
 #include <errno.h>
 #include <pipewire/properties.h>
diff --git a/lib/wp/si-factory.c b/lib/wp/si-factory.c
index 74c0cec8977bd9e087dfd992ca39d70871ab50e3..85ec51a8edc2df6a5bc447af92c51466d4f9bc35 100644
--- a/lib/wp/si-factory.c
+++ b/lib/wp/si-factory.c
@@ -14,7 +14,7 @@
 #define G_LOG_DOMAIN "wp-si-factory"
 
 #include "si-factory.h"
-#include "private.h"
+#include "private/registry.h"
 
 enum {
   PROP_0,