diff --git a/gst/debugutils/progressreport.c b/gst/debugutils/progressreport.c
index 017f78d..0f568bc 100644
--- a/gst/debugutils/progressreport.c
+++ b/gst/debugutils/progressreport.c
@@ -81,6 +81,7 @@ enum
   ARG_0,
   ARG_UPDATE_FREQ,
   ARG_SILENT,
+  ARG_DO_QUERY,
   ARG_FORMAT
 };
 
@@ -98,6 +99,7 @@ GST_STATIC_PAD_TEMPLATE ("sink",
 
 #define DEFAULT_UPDATE_FREQ  5
 #define DEFAULT_SILENT       FALSE
+#define DEFAULT_DO_QUERY     TRUE
 #define DEFAULT_FORMAT       "auto"
 
 static void gst_progress_report_set_property (GObject * object, guint prop_id,
@@ -167,6 +169,11 @@ gst_progress_report_class_init (GstProgressReportClass * g_class)
           DEFAULT_SILENT, G_PARAM_READWRITE));
 
   g_object_class_install_property (gobject_class,
+      ARG_DO_QUERY, g_param_spec_boolean ("do-query",
+          "Use a query instead of buffer metadata to determine stream position", "Use a query instead of buffer metadata to determine stream position",
+          DEFAULT_DO_QUERY, G_PARAM_READWRITE));
+
+  g_object_class_install_property (gobject_class,
       ARG_FORMAT, g_param_spec_string ("format", "format",
           "Format to use for the querying", DEFAULT_FORMAT, G_PARAM_READWRITE));
 
@@ -185,6 +192,7 @@ gst_progress_report_init (GstProgressReport * report,
 
   report->update_freq = DEFAULT_UPDATE_FREQ;
   report->silent = DEFAULT_SILENT;
+  report->do_query = DEFAULT_DO_QUERY;
   report->format = g_strdup (DEFAULT_FORMAT);
 }
 
@@ -349,6 +357,47 @@ gst_progress_report_report (GstProgressReport * filter, GTimeVal cur_time)
   }
 }
 
+static void
+gst_progress_report_report_no_query (GstProgressReport * filter, GTimeVal cur_time, GstBuffer * buf)
+{
+  GstMessage *msg;
+  glong run_time;
+  gint hh, mm, ss;
+  GstClockTime cur = GST_BUFFER_TIMESTAMP (buf);
+
+  if (GST_BUFFER_TIMESTAMP_IS_VALID (buf) && GST_BUFFER_DURATION_IS_VALID(buf))
+    cur += GST_BUFFER_DURATION (buf);
+
+  run_time = cur_time.tv_sec - filter->start_time.tv_sec;
+
+  hh = (run_time / 3600) % 100;
+  mm = (run_time / 60) % 60;
+  ss = (run_time % 60);
+
+
+  GST_OBJECT_LOCK (filter);
+
+  if (!filter->silent) {
+    if (GST_CLOCK_TIME_IS_VALID (cur)) {
+      g_print ("%s (%02d:%02d:%02d): %" G_GINT64_FORMAT " %s\n",
+          GST_OBJECT_NAME (filter), hh, mm, ss, cur / GST_SECOND, "seconds");
+    } else {
+      g_print ("%s (%02d:%02d:%02d): Timestamp is invalid\n",
+          GST_OBJECT_NAME (filter), hh, mm, ss);
+    }
+  }
+
+  gst_progress_report_post_progress (filter, GST_FORMAT_TIME, cur, 0);
+
+  msg = filter->pending_msg;
+  filter->pending_msg = NULL;
+  GST_OBJECT_UNLOCK (filter);
+
+  if (msg) {
+    gst_element_post_message (GST_ELEMENT_CAST (filter), msg);
+  }
+}
+
 static gboolean
 gst_progress_report_event (GstBaseTransform * trans, GstEvent * event)
 {
@@ -383,7 +432,11 @@ gst_progress_report_transform_ip (GstBaseTransform * trans, GstBuffer * buf)
   GST_OBJECT_UNLOCK (filter);
 
   if (need_update) {
-    gst_progress_report_report (filter, cur_time);
+    if (filter->do_query) {
+      gst_progress_report_report (filter, cur_time);
+    } else {
+      gst_progress_report_report_no_query (filter, cur_time, buf);
+    }
     GST_OBJECT_LOCK (filter);
     filter->last_report = cur_time;
     GST_OBJECT_UNLOCK (filter);
@@ -431,6 +484,11 @@ gst_progress_report_set_property (GObject * object, guint prop_id,
       filter->silent = g_value_get_boolean (value);
       GST_OBJECT_UNLOCK (filter);
       break;
+    case ARG_DO_QUERY:
+      GST_OBJECT_LOCK (filter);
+      filter->do_query = g_value_get_boolean (value);
+      GST_OBJECT_UNLOCK (filter);
+      break;
     case ARG_FORMAT:
       GST_OBJECT_LOCK (filter);
       g_free (filter->format);
@@ -463,6 +521,11 @@ gst_progress_report_get_property (GObject * object, guint prop_id,
       g_value_set_boolean (value, filter->silent);
       GST_OBJECT_UNLOCK (filter);
       break;
+    case ARG_DO_QUERY:
+      GST_OBJECT_LOCK (filter);
+      g_value_set_boolean (value, filter->do_query);
+      GST_OBJECT_UNLOCK (filter);
+      break;
     case ARG_FORMAT:
       GST_OBJECT_LOCK (filter);
       g_value_set_string (value, filter->format);
diff --git a/gst/debugutils/progressreport.h b/gst/debugutils/progressreport.h
index 92886b2..0d50149 100644
--- a/gst/debugutils/progressreport.h
+++ b/gst/debugutils/progressreport.h
@@ -47,6 +47,7 @@ struct _GstProgressReport
 
   gint update_freq;
   gboolean silent;
+  gboolean do_query;
   GTimeVal start_time;
   GTimeVal last_report;
 
