diff --git a/gst/rtpmanager/gstrtpsession.c b/gst/rtpmanager/gstrtpsession.c
index be749de..a4cbca6 100644
--- a/gst/rtpmanager/gstrtpsession.c
+++ b/gst/rtpmanager/gstrtpsession.c
@@ -713,35 +713,45 @@ gst_rtp_session_get_property (GObject * object, guint prop_id,
 }
 
 static void
-get_current_times (GstRtpSession * rtpsession,
-    GstClockTime * running_time, guint64 * ntpnstime)
+get_current_times (GstRtpSession * rtpsession, GstClockTime * running_time,
+    guint64 * ntpnstime, GstClockTime * pipeline_time)
 {
   guint64 ntpns;
   GstClock *clock;
-  GstClockTime base_time, ntpnsbase, rt;
+  GstClockTime base_time, rt;
+  GstClockTime pt;
+  GTimeVal current;
 
   GST_OBJECT_LOCK (rtpsession);
   if ((clock = GST_ELEMENT_CLOCK (rtpsession))) {
     base_time = GST_ELEMENT_CAST (rtpsession)->base_time;
-    ntpnsbase = rtpsession->priv->ntpnsbase;
     gst_object_ref (clock);
     GST_OBJECT_UNLOCK (rtpsession);
 
+    /* get current NTP time */
+    g_get_current_time (&current);
+    ntpns = GST_TIMEVAL_TO_TIME (current);
+
+    /* add constant to convert from 1970 based time to 1900 based time */
+    ntpns += (2208988800LL * GST_SECOND);
+
     /* get current clock time and convert to running time */
-    rt = gst_clock_get_time (clock) - base_time;
-    /* add NTP base offset to get NTP ns time */
-    ntpns = rt + ntpnsbase;
+    pt = gst_clock_get_time (clock);
+    rt = pt - base_time;
 
     gst_object_unref (clock);
   } else {
     GST_OBJECT_UNLOCK (rtpsession);
     rt = -1;
     ntpns = -1;
+    pt = -1;
   }
   if (running_time)
     *running_time = rt;
   if (ntpnstime)
     *ntpnstime = ntpns;
+  if (pipeline_time)
+    *pipeline_time = pt;
 }
 
 static void
@@ -751,6 +761,7 @@ rtcp_thread (GstRtpSession * rtpsession)
   GstClockTime current_time;
   GstClockTime next_timeout;
   guint64 ntpnstime;
+  GstClockTime pipeline_time;
 
   GST_DEBUG_OBJECT (rtpsession, "entering RTCP thread");
 
@@ -789,7 +800,7 @@ rtcp_thread (GstRtpSession * rtpsession)
     current_time = gst_clock_get_time (rtpsession->priv->sysclock);
 
     /* get current NTP time */
-    get_current_times (rtpsession, NULL, &ntpnstime);
+    get_current_times (rtpsession, NULL, &ntpnstime, &pipeline_time);
 
     /* we get unlocked because we need to perform reconsideration, don't perform
      * the timeout but get a new reporting estimate. */
@@ -798,7 +809,8 @@ rtcp_thread (GstRtpSession * rtpsession)
 
     /* perform actions, we ignore result. Release lock because it might push. */
     GST_RTP_SESSION_UNLOCK (rtpsession);
-    rtp_session_on_timeout (rtpsession->priv->session, current_time, ntpnstime);
+    rtp_session_on_timeout (rtpsession->priv->session, current_time, ntpnstime,
+        pipeline_time);
     GST_RTP_SESSION_LOCK (rtpsession);
   }
   /* mark the thread as stopped now */
@@ -1352,7 +1364,7 @@ gst_rtp_session_chain_recv_rtp (GstPad * pad, GstBuffer * buffer)
     /* add constant to convert running time to NTP time */
     ntpnstime = running_time + priv->ntpnsbase;
   } else {
-    get_current_times (rtpsession, &running_time, &ntpnstime);
+    get_current_times (rtpsession, &running_time, &ntpnstime, NULL);
   }
   current_time = gst_clock_get_time (priv->sysclock);
 
diff --git a/gst/rtpmanager/rtpsession.c b/gst/rtpmanager/rtpsession.c
index 7abaf34..f93c234 100644
--- a/gst/rtpmanager/rtpsession.c
+++ b/gst/rtpmanager/rtpsession.c
@@ -2175,6 +2175,7 @@ typedef struct
   GstBuffer *rtcp;
   GstClockTime current_time;
   guint64 ntpnstime;
+  GstClockTime pipeline_time;
   GstClockTime interval;
   GstRTCPPacket packet;
   gboolean is_bye;
@@ -2199,8 +2200,8 @@ session_start_rtcp (RTPSession * sess, ReportData * data)
     gst_rtcp_buffer_add_packet (data->rtcp, GST_RTCP_TYPE_SR, packet);
 
     /* get latest stats */
-    rtp_source_get_new_sr (own, data->ntpnstime, &ntptime, &rtptime,
-        &packet_count, &octet_count);
+    rtp_source_get_new_sr (own, data->ntpnstime, data->pipeline_time,
+        &ntptime, &rtptime, &packet_count, &octet_count);
     /* store stats */
     rtp_source_process_sr (own, data->current_time, ntptime, rtptime,
         packet_count, octet_count);
@@ -2462,7 +2463,7 @@ is_rtcp_time (RTPSession * sess, GstClockTime current_time, ReportData * data)
  */
 GstFlowReturn
 rtp_session_on_timeout (RTPSession * sess, GstClockTime current_time,
-    guint64 ntpnstime)
+    guint64 ntpnstime, GstClockTime pipeline_time)
 {
   GstFlowReturn result = GST_FLOW_OK;
   GList *item;
@@ -2481,6 +2482,7 @@ rtp_session_on_timeout (RTPSession * sess, GstClockTime current_time,
   data.ntpnstime = ntpnstime;
   data.is_bye = FALSE;
   data.has_sdes = FALSE;
+  data.pipeline_time = pipeline_time;
 
   own = sess->source;
 
diff --git a/gst/rtpmanager/rtpsession.h b/gst/rtpmanager/rtpsession.h
index 25e228b..70527b6 100644
--- a/gst/rtpmanager/rtpsession.h
+++ b/gst/rtpmanager/rtpsession.h
@@ -301,6 +301,6 @@ GstFlowReturn   rtp_session_schedule_bye           (RTPSession *sess, const gcha
 /* get interval for next RTCP interval */
 GstClockTime    rtp_session_next_timeout           (RTPSession *sess, GstClockTime current_time);
 GstFlowReturn   rtp_session_on_timeout             (RTPSession *sess, GstClockTime current_time,
-                                                    guint64 ntpnstime);
+                                                    guint64 ntpnstime, GstClockTime pipeline_time);
 
 #endif /* __RTP_SESSION_H__ */
diff --git a/gst/rtpmanager/rtpsource.c b/gst/rtpmanager/rtpsource.c
index 6a46873..b3b2ad4 100644
--- a/gst/rtpmanager/rtpsource.c
+++ b/gst/rtpmanager/rtpsource.c
@@ -1070,6 +1070,7 @@ rtp_source_send_rtp (RTPSource * src, gpointer data, gboolean is_list,
   GstBuffer *buffer = NULL;
   guint packets;
   guint32 ssrc;
+  GstClockTime timestamp;
 
   g_return_val_if_fail (RTP_IS_SOURCE (src), GST_FLOW_ERROR);
   g_return_val_if_fail (is_list || GST_IS_BUFFER (data), GST_FLOW_ERROR);
@@ -1133,8 +1134,10 @@ rtp_source_send_rtp (RTPSource * src, gpointer data, gboolean is_list,
 
   if (is_list) {
     rtptime = gst_rtp_buffer_list_get_timestamp (list);
+    timestamp = GST_BUFFER_TIMESTAMP (gst_buffer_list_get (list, 0, 0));
   } else {
     rtptime = gst_rtp_buffer_get_timestamp (buffer);
+    timestamp = GST_BUFFER_TIMESTAMP (buffer);
   }
   ext_rtptime = src->last_rtptime;
   ext_rtptime = gst_rtp_buffer_ext_timestamp (&ext_rtptime, rtptime);
@@ -1154,7 +1157,8 @@ rtp_source_send_rtp (RTPSource * src, gpointer data, gboolean is_list,
   }
 
   /* we keep track of the last received RTP timestamp and the corresponding
-   * NTP timestamp so that we can use this info when constructing SR reports */
+   * buffer timestamp so that we can use this info when constructing SR reports */
+  src->last_timestamp = timestamp;
   src->last_rtptime = ext_rtptime;
   src->last_ntpnstime = ntpnstime;
 
@@ -1323,8 +1327,8 @@ rtp_source_process_rb (RTPSource * src, GstClockTime time, guint8 fractionlost,
  */
 gboolean
 rtp_source_get_new_sr (RTPSource * src, guint64 ntpnstime,
-    guint64 * ntptime, guint32 * rtptime, guint32 * packet_count,
-    guint32 * octet_count)
+    GstClockTime pipeline_time, guint64 * ntptime, guint32 * rtptime,
+    guint32 * packet_count, guint32 * octet_count)
 {
   guint64 t_rtp;
   guint64 t_current_ntp;
@@ -1339,23 +1343,23 @@ rtp_source_get_new_sr (RTPSource * src, guint64 ntpnstime,
    * out RTP packets. */
   t_rtp = src->last_rtptime;
 
-  GST_DEBUG ("last_ntpnstime %" GST_TIME_FORMAT ", last_rtptime %"
-      G_GUINT64_FORMAT, GST_TIME_ARGS (src->last_ntpnstime), t_rtp);
+  GST_DEBUG ("last_timestamp %" GST_TIME_FORMAT ", last_rtptime %"
+      G_GUINT64_FORMAT, GST_TIME_ARGS (src->last_timestamp), t_rtp);
 
   if (src->clock_rate != -1) {
     /* get the diff with the SR time */
-    diff = GST_CLOCK_DIFF (src->last_ntpnstime, ntpnstime);
+    diff = GST_CLOCK_DIFF (src->last_timestamp, pipeline_time);
 
     /* now translate the diff to RTP time, handle positive and negative cases.
      * If there is no diff, we already set rtptime correctly above. */
     if (diff > 0) {
-      GST_DEBUG ("ntpnstime %" GST_TIME_FORMAT ", diff %" GST_TIME_FORMAT,
-          GST_TIME_ARGS (ntpnstime), GST_TIME_ARGS (diff));
+      GST_DEBUG ("pipeline_time %" GST_TIME_FORMAT ", diff %" GST_TIME_FORMAT,
+          GST_TIME_ARGS (pipeline_time), GST_TIME_ARGS (diff));
       t_rtp += gst_util_uint64_scale_int (diff, src->clock_rate, GST_SECOND);
     } else {
       diff = -diff;
-      GST_DEBUG ("ntpnstime %" GST_TIME_FORMAT ", diff -%" GST_TIME_FORMAT,
-          GST_TIME_ARGS (ntpnstime), GST_TIME_ARGS (diff));
+      GST_DEBUG ("pipeline_time %" GST_TIME_FORMAT ", diff -%" GST_TIME_FORMAT,
+          GST_TIME_ARGS (pipeline_time), GST_TIME_ARGS (diff));
       t_rtp -= gst_util_uint64_scale_int (diff, src->clock_rate, GST_SECOND);
     }
   } else {
diff --git a/gst/rtpmanager/rtpsource.h b/gst/rtpmanager/rtpsource.h
index b0c9bd0..2b16afc 100644
--- a/gst/rtpmanager/rtpsource.h
+++ b/gst/rtpmanager/rtpsource.h
@@ -136,6 +136,7 @@ struct _RTPSource {
   GstClockTime  last_activity;
   GstClockTime  last_rtp_activity;
 
+  GstClockTime  last_timestamp;
   GstClockTime  last_rtptime;
   GstClockTime  last_ntpnstime;
 
@@ -202,8 +203,8 @@ void            rtp_source_process_rb          (RTPSource *src, GstClockTime tim
                                                 gint32 packetslost, guint32 exthighestseq, guint32 jitter,
                                                 guint32 lsr, guint32 dlsr);
 
-gboolean        rtp_source_get_new_sr          (RTPSource *src, guint64 ntpnstime, guint64 *ntptime,
-		                                guint32 *rtptime, guint32 *packet_count,
+gboolean        rtp_source_get_new_sr          (RTPSource *src, guint64 ntpnstime, GstClockTime pipeline_time,
+                                                guint64 *ntptime, guint32 *rtptime, guint32 *packet_count,
 						guint32 *octet_count);
 gboolean        rtp_source_get_new_rb          (RTPSource *src, GstClockTime time, guint8 *fractionlost,
                                                 gint32 *packetslost, guint32 *exthighestseq, guint32 *jitter,
