diff --git a/ext/pango/gsttextoverlay.c b/ext/pango/gsttextoverlay.c
index 2a35eb9..90b015c 100644
--- a/ext/pango/gsttextoverlay.c
+++ b/ext/pango/gsttextoverlay.c
@@ -1993,15 +1993,8 @@ gst_text_overlay_text_chain (GstPad * pad, GstBuffer * buffer)
         GST_TEXT_OVERLAY_WAIT (overlay);
         GST_DEBUG ("Pad %s:%s resuming", GST_DEBUG_PAD_NAME (pad));
         if (overlay->text_flushing) {
-          if (overlay->video_flushing) {
-            /* we might have received a PAUSED->READY state change while waiting,
-               so we want to stop gracefully in this case */
-            ret = GST_FLOW_OK;
-          } else {
-            ret = GST_FLOW_WRONG_STATE;
-          }
           GST_OBJECT_UNLOCK (overlay);
-          GST_DEBUG ("text now flushing: wrong state");
+          ret = GST_FLOW_WRONG_STATE;
           goto beach;
         }
       }
diff --git a/gst/playback/gstsubtitleoverlay.c b/gst/playback/gstsubtitleoverlay.c
index 126ffd2..47673d5 100644
--- a/gst/playback/gstsubtitleoverlay.c
+++ b/gst/playback/gstsubtitleoverlay.c
@@ -560,26 +560,56 @@ _remove_element (GstSubtitleOverlay * self, GstElement ** element)
 }
 
 static void
-_generate_update_newsegment_event (GstSegment * segment, GstEvent ** event1,
+_generate_update_newsegment_event (GstPad *pad, GstSegment * segment, GstEvent ** event1,
     GstEvent ** event2)
 {
   GstEvent *event;
+  gboolean res;
+  GstFormat tformat;
+  gint64 taccum;
+  gint64 tstart;
+  gint64 tstop;
+  gint64 ttime;
+  GstPad *peer;
 
   *event1 = NULL;
   *event2 = NULL;
 
+  peer = gst_pad_get_peer (pad);
+
+  /* always push newsegment with format TIME */
+  tformat = GST_FORMAT_TIME;
+  res = gst_pad_query_convert (peer, segment->format, segment->accum, &tformat, &taccum);
+  if (!res) {
+      taccum = 0;
+  }
+
   event = gst_event_new_new_segment_full (FALSE, segment->rate,
-      segment->applied_rate, segment->format, 0, segment->accum, 0);
+      segment->applied_rate, GST_FORMAT_TIME, 0, taccum, 0);
   gst_structure_id_set (event->structure, _subtitle_overlay_event_marker_id,
       G_TYPE_BOOLEAN, TRUE, NULL);
   *event1 = event;
 
+  /* always push newsegment with format TIME */
+  tformat = GST_FORMAT_TIME;
+  res = gst_pad_query_convert (peer, segment->format, segment->start, &tformat, &tstart);
+  tformat = GST_FORMAT_TIME;
+  res &= gst_pad_query_convert (peer, segment->format, segment->stop, &tformat, &tstop);
+  tformat = GST_FORMAT_TIME;
+  res &= gst_pad_query_convert (peer, segment->format, segment->time, &tformat, &ttime);
+  if (!res) {
+      tstart = 0;
+      tstop = -1;
+      ttime = 0;
+  }
   event = gst_event_new_new_segment_full (FALSE, segment->rate,
-      segment->applied_rate, segment->format,
-      segment->start, segment->stop, segment->time);
+      segment->applied_rate, GST_FORMAT_TIME,
+      tstart, tstop, ttime);
   gst_structure_id_set (event->structure, _subtitle_overlay_event_marker_id,
       G_TYPE_BOOLEAN, TRUE, NULL);
   *event2 = event;
+
+  gst_object_unref (peer);
 }
 
 static gboolean
@@ -645,7 +675,7 @@ _setup_passthrough (GstSubtitleOverlay * self)
   if (self->video_segment.format != GST_FORMAT_UNDEFINED) {
     GstEvent *event1, *event2;
 
-    _generate_update_newsegment_event (&self->video_segment, &event1, &event2);
+    _generate_update_newsegment_event (sink, &self->video_segment, &event1, &event2);
     GST_DEBUG_OBJECT (self,
         "Pushing video accumulate newsegment event: %" GST_PTR_FORMAT,
         event1->structure);
@@ -1285,7 +1315,7 @@ _pad_blocked_cb (GstPad * pad, gboolean blocked, gpointer user_data)
       sink = _get_video_pad ((self->renderer) ? self->renderer : self->overlay);
     }
 
-    _generate_update_newsegment_event (&self->video_segment, &event1, &event2);
+    _generate_update_newsegment_event (sink, &self->video_segment, &event1, &event2);
     GST_DEBUG_OBJECT (self,
         "Pushing video accumulate newsegment event: %" GST_PTR_FORMAT,
         event1->structure);
@@ -1306,7 +1336,7 @@ _pad_blocked_cb (GstPad * pad, gboolean blocked, gpointer user_data)
     else
       sink = gst_element_get_static_pad (self->parser, "sink");
 
-    _generate_update_newsegment_event (&self->subtitle_segment, &event1,
+    _generate_update_newsegment_event (sink, &self->subtitle_segment, &event1,
         &event2);
     GST_DEBUG_OBJECT (self,
         "Pushing subtitle accumulate newsegment event: %" GST_PTR_FORMAT,
@@ -2023,6 +2053,8 @@ gst_subtitle_overlay_subtitle_sink_event (GstPad * pad, GstEvent * event)
   gboolean ret;
   GstFormat format;
 
+  GST_DEBUG_OBJECT (pad, "Got event %"GST_PTR_FORMAT, event);
+
   if (GST_EVENT_TYPE (event) == GST_EVENT_CUSTOM_DOWNSTREAM_OOB &&
       event->structure
       && strcmp (gst_structure_get_name (event->structure),
@@ -2096,15 +2128,42 @@ gst_subtitle_overlay_subtitle_sink_event (GstPad * pad, GstEvent * event)
 
     GST_DEBUG_OBJECT (pad, "Old subtitle segment: %" GST_SEGMENT_FORMAT,
         &self->subtitle_segment);
-    if (self->subtitle_segment.format != format) {
-      GST_DEBUG_OBJECT (pad, "Subtitle segment format changed: %s -> %s",
-          gst_format_get_name (self->subtitle_segment.format),
-          gst_format_get_name (format));
-      gst_segment_init (&self->subtitle_segment, format);
+    if (self->subtitle_segment.format != GST_FORMAT_TIME) {
+      GST_DEBUG_OBJECT (pad, "Subtitle segment format %s not TIME, converting",
+          gst_format_get_name (self->subtitle_segment.format));
+      gst_segment_init (&self->subtitle_segment, GST_FORMAT_TIME);
+    }
+
+    if (format != GST_FORMAT_TIME) {
+        gboolean res;
+        GstFormat tformat;
+        gint64 tstart;
+        gint64 tstop;
+        gint64 tposition;
+        GstPad *peer;
+
+        peer = gst_pad_get_peer (pad);
+
+        tformat = GST_FORMAT_TIME;
+        res = gst_pad_query_convert (peer, format, start, &tformat, &tstart);
+        tformat = GST_FORMAT_TIME;
+        res &= gst_pad_query_convert (peer, format, stop, &tformat, &tstop);
+        tformat = GST_FORMAT_TIME;
+        res &= gst_pad_query_convert (peer, format, position, &tformat, &tposition);
+        if (res) {
+            start = tstart;
+            stop = tstop;
+            position = tposition;
+        } else {
+            start = 0;
+            stop = -1;
+            position = 0;
+        }
+        gst_object_unref (peer);
     }
 
     gst_segment_set_newsegment_full (&self->subtitle_segment, update, rate,
-        applied_rate, format, start, stop, position);
+        applied_rate, GST_FORMAT_TIME, start, stop, position);
     GST_DEBUG_OBJECT (pad, "New subtitle segment: %" GST_SEGMENT_FORMAT,
         &self->subtitle_segment);
   }
diff --git a/gst/subparse/gstsubparse.c b/gst/subparse/gstsubparse.c
index efb1ac2..714cf04 100644
--- a/gst/subparse/gstsubparse.c
+++ b/gst/subparse/gstsubparse.c
@@ -1641,6 +1641,9 @@ gst_sub_parse_sink_event (GstPad * pad, GstEvent * event)
          * it received via its video pads instead, so all is fine then too) */
       }
 
+      /* make sure the newsegment is pushed to the srcpad in gst_sub_parse_chain */
+      self->need_segment = TRUE;
+
       ret = TRUE;
       gst_event_unref (event);
       break;
