diff -rup gst-plugins-base/gst/playback/gstqueue2.c gst-plugins-base_topatch/gst/playback/gstqueue2.c
--- gst-plugins-base/gst/playback/gstqueue2.c	2007-06-07 06:11:27.000000000 -0300
+++ gst-plugins-base_topatch/gst/playback/gstqueue2.c	2007-06-08 10:53:20.000000000 -0300
@@ -1390,6 +1390,19 @@ gst_queue_handle_src_event (GstPad * pad
   return res;
 }
 
+/* Answers a duration query received on the src pad */
+gboolean gst_queue_srcpad_query_duration(GstQueue *queue, GstQuery *duration_query)
+{
+
+  GstPad *sink_peer = gst_pad_get_peer(queue->sinkpad);
+  /* we just pass it to the upstream element */
+  gboolean ret = gst_pad_query(sink_peer, duration_query);
+
+  gst_object_unref(GST_OBJECT(sink_peer));
+
+  return ret;
+}
+
 static gboolean
 gst_queue_handle_src_query (GstPad * pad, GstQuery * query)
 {
@@ -1431,12 +1444,31 @@ gst_queue_handle_src_query (GstPad * pad
       gst_query_set_position (query, format, peer_pos);
       break;
     }
+    case GST_QUERY_DURATION:
+    {
+      GST_QUEUE_MUTEX_LOCK(queue);
+
+      /* we have to wait until the upstream element is at least paused */ 
+      while(gst_queue_is_empty(queue))
+      {
+        GST_QUEUE_WAIT_ADD_CHECK(queue, duration_query);
+      }
+
+      GST_QUEUE_MUTEX_UNLOCK(queue);
+
+      if(!gst_queue_query_duration(queue, query))
+        return FALSE;
+    }
     default:
       /* peer handled other queries */
       break;
   }
 
   return TRUE;
+
+duration_query:
+  //TODO - what whould be done here? select a better name also.
+  return FALSE;
 }
 
 static GstFlowReturn
