diff --git a/modules/module-si-convert.c b/modules/module-si-convert.c
index 5dff86bfe1721a1bcfd3adff0863e761f5cc1f20..ddd2469a62a29829b7567d49227a3ad8f65bda72 100644
--- a/modules/module-si-convert.c
+++ b/modules/module-si-convert.c
@@ -32,7 +32,7 @@ struct _WpSiConvert
   gboolean control_port;
 
   WpNode *node;
-  GPtrArray *links;
+  WpSessionItem *link_to_target;
 };
 
 static void si_convert_stream_init (WpSiStreamInterface * iface);
@@ -46,15 +46,6 @@ G_DEFINE_TYPE_WITH_CODE (WpSiConvert, si_convert, WP_TYPE_SESSION_ITEM,
 static void
 si_convert_init (WpSiConvert * self)
 {
-  self->links = g_ptr_array_new_with_free_func (g_object_unref);
-}
-
-static void
-si_convert_finalize (GObject * object)
-{
-  WpSiConvert *self = WP_SI_CONVERT (object);
-  g_clear_pointer (&self->links, g_ptr_array_unref);
-  G_OBJECT_CLASS (si_convert_parent_class)->finalize (object);
 }
 
 static void
@@ -154,9 +145,9 @@ static void
 on_link_activated (WpSessionItem * item, GAsyncResult * res, WpSiConvert * self)
 {
   g_autoptr (GError) error = NULL;
-  gboolean activate_ret = wp_session_item_activate_finish (item, res, &error);
-  g_return_if_fail (error);
-  g_return_if_fail (activate_ret);
+  if (!wp_session_item_activate_finish (item, res, &error)) {
+    wp_warning_object (item, "failed to activate link to the target node");
+  }
 }
 
 static void
@@ -167,6 +158,12 @@ on_convert_running (WpSiConvert *self)
       "si-standard-link");
   g_auto (GVariantBuilder) b = G_VARIANT_BUILDER_INIT (G_VARIANT_TYPE_VARDICT);
 
+  if (G_UNLIKELY (!link)) {
+    wp_warning_object (self, "could not create si-standard-link; "
+        "is the module loaded?");
+    return;
+  }
+
   if (self->direction == WP_DIRECTION_INPUT) {
       g_variant_builder_add (&b, "{sv}", "out-stream",
           g_variant_new_uint64 ((guint64) WP_SI_STREAM (self->target)));
@@ -185,7 +182,7 @@ on_convert_running (WpSiConvert *self)
 
   wp_session_item_configure (link, g_variant_builder_end (&b));
   wp_session_item_activate (link, (GAsyncReadyCallback) on_link_activated, self);
-  g_ptr_array_add (self->links, g_steal_pointer (&self->links));
+  self->link_to_target = g_steal_pointer (&link);
 }
 
 static void
@@ -194,7 +191,7 @@ on_node_state_changed (WpNode * node, WpNodeState old, WpNodeState curr,
 {
   switch (curr) {
   case WP_NODE_STATE_IDLE:
-    g_ptr_array_set_size (self->links, 0);
+    g_clear_object (&self->link_to_target);
     break;
   case WP_NODE_STATE_RUNNING:
     on_convert_running (self);
@@ -316,7 +313,7 @@ si_convert_activate_rollback (WpSessionItem * item)
 {
   WpSiConvert *self = WP_SI_CONVERT (item);
 
-  g_ptr_array_set_size (self->links, 0);
+  g_clear_object (&self->link_to_target);
   g_clear_object (&self->node);
 }
 
@@ -412,11 +409,8 @@ si_convert_port_info_init (WpSiPortInfoInterface * iface)
 static void
 si_convert_class_init (WpSiConvertClass * klass)
 {
-  GObjectClass *object_class = (GObjectClass *) klass;
   WpSessionItemClass *si_class = (WpSessionItemClass *) klass;
 
-  object_class->finalize = si_convert_finalize;
-
   si_class->reset = si_convert_reset;
   si_class->get_associated_proxy = si_convert_get_associated_proxy;
   si_class->configure = si_convert_configure;