diff --git a/gst/isomp4/qtdemux.c b/gst/isomp4/qtdemux.c
index 7fbe5f8..5e55275 100644
--- a/gst/isomp4/qtdemux.c
+++ b/gst/isomp4/qtdemux.c
@@ -419,7 +419,7 @@ static gboolean gst_qtdemux_handle_sink_event (GstPad * pad, GstObject * parent,
     GstEvent * event);
 static gboolean gst_qtdemux_setcaps (GstQTDemux * qtdemux, GstCaps * caps);
 static gboolean gst_qtdemux_configure_stream (GstQTDemux * qtdemux,
-    QtDemuxStream * stream);
+    QtDemuxStream * stream, gboolean send_stream_start);
 
 static gboolean qtdemux_parse_moov (GstQTDemux * qtdemux,
     const guint8 * buffer, guint length);
@@ -4080,7 +4080,7 @@ gst_qtdemux_loop_state_movie (GstQTDemux * qtdemux)
 
   stream = qtdemux->streams[index];
   if (stream->new_caps) {
-    gst_qtdemux_configure_stream (qtdemux, stream);
+    gst_qtdemux_configure_stream (qtdemux, stream, TRUE);
     qtdemux_do_allocation (qtdemux, stream);
   }
 
@@ -4580,15 +4580,21 @@ gst_qtdemux_chain (GstPad * sinkpad, GstObject * parent, GstBuffer * inbuf)
         if (fourcc == FOURCC_moov) {
           /* in usual fragmented setup we could try to scan for more
            * and end up at the the moov (after mdat) again */
-          if (demux->got_moov && demux->n_streams > 0) {
+          if (demux->got_moov && demux->n_streams > 0 && !demux->fragmented) {
             GST_DEBUG_OBJECT (demux,
                 "Skipping moov atom as we have one already");
           } else {
+            gboolean send_stream_start = TRUE;
             GST_DEBUG_OBJECT (demux, "Parsing [moov]");
 
             if (demux->got_moov && demux->fragmented) {
               GST_DEBUG_OBJECT (demux,
                   "Got a second moov, clean up data from old one");
+              if (demux->moov_node)
+                g_node_destroy (demux->moov_node);
+              demux->moov_node = NULL;
+              demux->moov_node_compressed = NULL;
+              send_stream_start = FALSE;
             } else {
               /* prepare newsegment to send when streaming actually starts */
               if (!demux->pending_newsegment)
@@ -4608,7 +4614,7 @@ gst_qtdemux_chain (GstPad * sinkpad, GstObject * parent, GstBuffer * inbuf)
               for (n = 0; n < demux->n_streams; n++) {
                 QtDemuxStream *stream = demux->streams[n];
 
-                gst_qtdemux_configure_stream (demux, stream);
+                gst_qtdemux_configure_stream (demux, stream, send_stream_start);
               }
             }
 
@@ -4788,7 +4794,7 @@ gst_qtdemux_chain (GstPad * sinkpad, GstObject * parent, GstBuffer * inbuf)
           goto unknown_stream;
 
         if (stream->new_caps) {
-          gst_qtdemux_configure_stream (demux, stream);
+          gst_qtdemux_configure_stream (demux, stream, TRUE);
         }
 
         /* Put data in a buffer, set timestamps, caps, ... */
@@ -5477,7 +5483,8 @@ qtdemux_do_allocation (GstQTDemux * qtdemux, QtDemuxStream * stream)
 }
 
 static gboolean
-gst_qtdemux_configure_stream (GstQTDemux * qtdemux, QtDemuxStream * stream)
+gst_qtdemux_configure_stream (GstQTDemux * qtdemux, QtDemuxStream * stream,
+    gboolean send_stream_start)
 {
   if (stream->subtype == FOURCC_vide) {
     /* fps is calculated base on the duration of the first frames since
@@ -5623,7 +5630,8 @@ gst_qtdemux_configure_stream (GstQTDemux * qtdemux, QtDemuxStream * stream)
     stream_id =
         gst_pad_create_stream_id_printf (stream->pad,
         GST_ELEMENT_CAST (qtdemux), "%03u", stream->track_id);
-    gst_pad_push_event (stream->pad, gst_event_new_stream_start (stream_id));
+    if (send_stream_start)
+      gst_pad_push_event (stream->pad, gst_event_new_stream_start (stream_id));
     g_free (stream_id);
     gst_pad_set_caps (stream->pad, stream->caps);
     stream->new_caps = FALSE;
@@ -5645,7 +5653,7 @@ gst_qtdemux_add_stream (GstQTDemux * qtdemux,
         gst_pad_new_from_static_template (&gst_qtdemux_videosrc_template, name);
     g_free (name);
 
-    gst_qtdemux_configure_stream (qtdemux, stream);
+    gst_qtdemux_configure_stream (qtdemux, stream, TRUE);
     qtdemux->n_video_streams++;
   } else if (stream->subtype == FOURCC_soun) {
     gchar *name = g_strdup_printf ("audio_%u", qtdemux->n_audio_streams);
@@ -5653,7 +5661,7 @@ gst_qtdemux_add_stream (GstQTDemux * qtdemux,
     stream->pad =
         gst_pad_new_from_static_template (&gst_qtdemux_audiosrc_template, name);
     g_free (name);
-    gst_qtdemux_configure_stream (qtdemux, stream);
+    gst_qtdemux_configure_stream (qtdemux, stream, TRUE);
     qtdemux->n_audio_streams++;
   } else if (stream->subtype == FOURCC_strm) {
     GST_DEBUG_OBJECT (qtdemux, "stream type, not creating pad");
@@ -5664,7 +5672,7 @@ gst_qtdemux_add_stream (GstQTDemux * qtdemux,
     stream->pad =
         gst_pad_new_from_static_template (&gst_qtdemux_subsrc_template, name);
     g_free (name);
-    gst_qtdemux_configure_stream (qtdemux, stream);
+    gst_qtdemux_configure_stream (qtdemux, stream, TRUE);
     qtdemux->n_sub_streams++;
   } else if (stream->caps) {
     gchar *name = g_strdup_printf ("video_%u", qtdemux->n_video_streams);
@@ -5672,7 +5680,7 @@ gst_qtdemux_add_stream (GstQTDemux * qtdemux,
     stream->pad =
         gst_pad_new_from_static_template (&gst_qtdemux_videosrc_template, name);
     g_free (name);
-    gst_qtdemux_configure_stream (qtdemux, stream);
+    gst_qtdemux_configure_stream (qtdemux, stream, TRUE);
     qtdemux->n_video_streams++;
   } else {
     GST_DEBUG_OBJECT (qtdemux, "unknown stream type");
