diff --git a/subprojects/gst-plugins-base/gst/playback/gstdecodebin3.c b/subprojects/gst-plugins-base/gst/playback/gstdecodebin3.c
index a4801f12a2..9dfdc1e4c1 100644
--- a/subprojects/gst-plugins-base/gst/playback/gstdecodebin3.c
+++ b/subprojects/gst-plugins-base/gst/playback/gstdecodebin3.c
@@ -166,9 +166,7 @@
  * Based on those two principles, 3 "selection" of streams (stream-id) are used:
  * 1) requested_selection
  *    All streams within that list should be activated
- * 2) active_selection
- *    List of streams that are exposed by decodebin
- * 3) to_activate
+ * 2) to_activate
  *    List of streams that will be moved to requested_selection in the
  *    mq_slot_reassign() method (i.e. once a stream was deactivated, and the output
  *    was retargetted)
@@ -256,8 +254,6 @@ struct _GstDecodebin3
   GstStreamCollection *collection;
   /* requested selection of stream-id to activate post-multiqueue */
   GList *requested_selection;
-  /* list of stream-id currently activated in output */
-  GList *active_selection;
   /* List of stream-id that need to be activated (after a stream switch for ex) */
   GList *to_activate;
   /* Pending select streams event */
@@ -729,9 +725,6 @@ gst_decodebin3_reset (GstDecodebin3 * dbin)
   g_list_free_full (dbin->requested_selection, g_free);
   dbin->requested_selection = NULL;
 
-  g_list_free_full (dbin->active_selection, g_free);
-  dbin->active_selection = NULL;
-
   g_list_free (dbin->to_activate);
   dbin->to_activate = NULL;
 
@@ -2295,6 +2288,21 @@ stream_list_equal (GList * lista, GList * listb)
   return TRUE;
 }
 
+/* Called with SELECTION_LOCK */
+static gboolean
+stream_is_active (GstDecodebin3 * dbin, const gchar * stream_id)
+{
+  GList *tmp;
+
+  for (tmp = dbin->slots; tmp; tmp = tmp->next) {
+    MultiQueueSlot *slot = tmp->data;
+    if (slot->output && !g_strcmp0 (stream_id, slot->active_stream_id))
+      return TRUE;
+  }
+
+  return FALSE;
+}
+
 static void
 update_requested_selection (GstDecodebin3 * dbin)
 {
@@ -2340,7 +2348,7 @@ update_requested_selection (GstDecodebin3 * dbin)
       all_user_selected = FALSE;
     if (request == 1 || (request == -1
             && (stream_in_list (dbin->requested_selection, sid)
-                || stream_in_list (dbin->active_selection, sid)))) {
+                || stream_is_active (dbin, sid)))) {
       GstStreamType curtype = gst_stream_get_stream_type (stream);
       if (request == 1)
         GST_DEBUG_OBJECT (dbin,
@@ -2983,16 +2991,15 @@ mq_slot_get_or_create_output (MultiQueueSlot * slot)
   output = db_output_stream_new (dbin, slot->type);
   mq_slot_set_output (slot, output);
 
-  GST_DEBUG ("Adding '%s' to active_selection", stream_id);
-  dbin->active_selection =
-      g_list_append (dbin->active_selection, (gchar *) g_strdup (stream_id));
+  GST_DEBUG_OBJECT (dbin, "Now active : %s", stream_id);
 
   return output;
 }
 
-/* Returns SELECTED_STREAMS message if active_selection is equal to
+/* Returns SELECTED_STREAMS message if the active slots are equal to
  * requested_selection, else NULL.
- * Must be called with LOCK taken */
+ *
+ * Must be called with SELECTION_LOCK taken */
 static GstMessage *
 is_selection_done (GstDecodebin3 * dbin)
 {
@@ -3015,7 +3022,7 @@ is_selection_done (GstDecodebin3 * dbin)
   }
   for (tmp = dbin->requested_selection; tmp; tmp = tmp->next) {
     GST_DEBUG ("Checking requested stream %s", (gchar *) tmp->data);
-    if (!stream_in_list (dbin->active_selection, (gchar *) tmp->data)) {
+    if (!stream_is_active (dbin, (gchar *) tmp->data)) {
       GST_DEBUG ("Not in active selection, returning");
       return NULL;
     }
@@ -3117,8 +3124,18 @@ check_and_drain_multiqueue_locked (GstDecodebin3 * dbin, GstEvent * eos_event)
 static inline gboolean
 no_more_streams_locked (GstDecodebin3 * dbin)
 {
-  return (!dbin->requested_selection && !dbin->active_selection
-      && !dbin->to_activate);
+  GList *tmp;
+
+  if (dbin->requested_selection || dbin->to_activate)
+    return FALSE;
+
+  for (tmp = dbin->slots; tmp; tmp = tmp->next) {
+    MultiQueueSlot *slot = tmp->data;
+    if (slot->output)
+      return FALSE;
+  }
+
+  return TRUE;
 }
 
 /** mq_slot_check_reconfiguration:
@@ -3157,8 +3174,12 @@ mq_slot_check_reconfiguration (MultiQueueSlot * slot)
     slot->dbin->requested_selection =
         remove_from_list (slot->dbin->requested_selection,
         slot->active_stream_id);
-    slot->dbin->active_selection =
-        remove_from_list (slot->dbin->active_selection, slot->active_stream_id);
+
+    /* Remove output */
+    mq_slot_set_output (slot, NULL);
+    dbin->output_streams = g_list_remove (dbin->output_streams, output);
+    db_output_stream_free (output);
+
     no_more_streams = no_more_streams_locked (dbin);
     dbin->selection_updated = TRUE;
     SELECTION_UNLOCK (dbin);
@@ -3170,7 +3191,6 @@ mq_slot_check_reconfiguration (MultiQueueSlot * slot)
     else
       GST_ELEMENT_WARNING (slot->dbin, CORE, MISSING_PLUGIN, (NULL),
           ("Some plugins were missing"));
-    mq_slot_reassign (slot);
   } else {
     GstMessage *selection_msg = is_selection_done (dbin);
     /* All good, we reconfigured the associated output. Check if we're done with
@@ -3941,15 +3961,6 @@ mq_slot_reassign (MultiQueueSlot * slot)
   GST_DEBUG_OBJECT (slot->src_pad, "Unlinking from previous output");
   mq_slot_set_output (slot, NULL);
 
-  /* Remove sid from active selection */
-  GST_DEBUG ("Removing '%s' from active_selection", sid);
-  for (tmp = dbin->active_selection; tmp; tmp = tmp->next)
-    if (!g_strcmp0 (sid, tmp->data)) {
-      g_free (tmp->data);
-      dbin->active_selection = g_list_delete_link (dbin->active_selection, tmp);
-      break;
-    }
-
   /* Can we re-assign this output to a requested stream ? */
   GST_DEBUG_OBJECT (slot->src_pad, "Attempting to re-assing output stream");
   for (tmp = dbin->to_activate; tmp; tmp = tmp->next) {
@@ -3972,9 +3983,6 @@ mq_slot_reassign (MultiQueueSlot * slot)
     GST_DEBUG_OBJECT (slot->src_pad, "Assigning output to slot %p '%s'",
         target_slot, tsid);
     mq_slot_set_output (target_slot, output);
-    GST_DEBUG ("Adding '%s' to active_selection", tsid);
-    dbin->active_selection =
-        g_list_append (dbin->active_selection, (gchar *) g_strdup (tsid));
     SELECTION_UNLOCK (dbin);
 
     /* Wakeup the target slot so that it retries to send events/buffers