diff --git a/examples/declarative/particles/trails/overburst.qml b/examples/declarative/particles/trails/overburst.qml
index c3129a1d72ae14dc2593f4f56bb46191669f3e48..ca6bc6dedc84777001167c926c550c3b02e467eb 100644
--- a/examples/declarative/particles/trails/overburst.qml
+++ b/examples/declarative/particles/trails/overburst.qml
@@ -61,7 +61,6 @@ Rectangle{
         x: ma.mouseX
         y: ma.mouseY
         emitRate: 16000
-        lifeSpan: 1000
         emitCap: 4000
         acceleration: AngledDirection{angleVariation: 360; magnitude: 360; }
         size: 8
@@ -75,7 +74,7 @@ Rectangle{
     MouseArea{
         width: 100
         height: 100
-        onClicked: sys.overwrite = !sys.overwrite
+        onClicked: bursty.noCap = true;
         id: ma2
         Rectangle{
             anchors.fill: parent
diff --git a/src/declarative/particles/qsgfollowemitter.cpp b/src/declarative/particles/qsgfollowemitter.cpp
index 54daec77299fb9d1f1f07af63269ea1245e7c094..0ee4a00f00bbfacfa7faede13c10f0782ede3da8 100644
--- a/src/declarative/particles/qsgfollowemitter.cpp
+++ b/src/declarative/particles/qsgfollowemitter.cpp
@@ -134,6 +134,7 @@ void QSGFollowEmitter::emitWindow(int timeStamp)
         }
     }
 
+    //TODO: Implement startTime and speedFromMovement
     qreal time = timeStamp / 1000.;
     qreal particleRatio = 1. / m_particlesPerParticlePerSecond;
     qreal pt;
@@ -158,7 +159,7 @@ void QSGFollowEmitter::emitWindow(int timeStamp)
             continue;
         }
         while (pt < time || !m_burstQueue.isEmpty()){
-            QSGParticleData* datum = m_system->newDatum(gId2);
+            QSGParticleData* datum = m_system->newDatum(gId2, !m_overwrite);
             if (datum){//else, skip this emission
                 datum->e = this;//###useful?
 
diff --git a/src/declarative/particles/qsgparticleemitter.cpp b/src/declarative/particles/qsgparticleemitter.cpp
index 4c08ef51992f0190aa3ecaedb501be825c8bc5cd..0daf274323e5648f899e9ee6317bf4b9e9347be9 100644
--- a/src/declarative/particles/qsgparticleemitter.cpp
+++ b/src/declarative/particles/qsgparticleemitter.cpp
@@ -110,6 +110,7 @@ QT_BEGIN_NAMESPACE
 
     Default value is 0.
 */
+
 /*!
     \qmlproperty int QtQuick.Particles2::Emitter::emitCap
 
@@ -119,6 +120,21 @@ QT_BEGIN_NAMESPACE
     to stagger emissions. The default value is emitRate * lifeSpan in seconds, which
     is the number of particles that would be alive at any one time given the default settings.
 */
+/*!
+    \qmlproperty bool QtQuick.Particles2::Emitter::noCap
+
+    If set to true, the emitCap will be ignored and this emitter will never skip emitting
+    a particle based on how many it has alive.
+
+    Default value is false.
+*/
+/*!
+    \qmlproperty int QtQuick.Particles2::Emitter::startTime
+
+    If this value is set when the emitter is loaded, then it will emit particles from the
+    past, up to startTime milliseconds ago. These will simulate as if they were emitted then,
+    but will not have any affectors applied to them. Affectors will take effect from the present time.
+*/
 /*!
     \qmlproperty real QtQuick.Particles2::Emitter::size
 
@@ -184,8 +200,10 @@ QSGParticleEmitter::QSGParticleEmitter(QSGItem *parent) :
   , m_speed_from_movement(0)
   , m_particle_count(0)
   , m_reset_last(true)
-  , m_last_timestamp(0)
+  , m_last_timestamp(-1)
   , m_last_emission(0)
+  , m_startTime(0)
+  , m_overwrite(false)
 
 {
     //TODO: Reset speed/acc back to null vector? Or allow null pointer?
@@ -297,7 +315,10 @@ void QSGParticleEmitter::emitWindow(int timeStamp)
 
     if (m_reset_last) {
         m_last_emitter = m_last_last_emitter = QPointF(x(), y());
-        m_last_timestamp = timeStamp/1000.;
+        if (m_last_timestamp == -1)
+            m_last_timestamp = timeStamp/1000. - m_startTime;
+        else
+            m_last_timestamp = timeStamp/1000.;
         m_last_emission = m_last_timestamp;
         m_reset_last = false;
     }
@@ -339,7 +360,7 @@ void QSGParticleEmitter::emitWindow(int timeStamp)
         pt = time;
     while (pt < time || !m_burstQueue.isEmpty()) {
         //int pos = m_last_particle % m_particle_count;
-        QSGParticleData* datum = m_system->newDatum(m_system->m_groupIds[m_particle]);
+        QSGParticleData* datum = m_system->newDatum(m_system->m_groupIds[m_particle], !m_overwrite);
         if (datum){//actually emit(otherwise we've been asked to skip this one)
             datum->e = this;//###useful?
             qreal t = 1 - (pt - opt) / dt;
diff --git a/src/declarative/particles/qsgparticleemitter_p.h b/src/declarative/particles/qsgparticleemitter_p.h
index 0b0fe9197ed75b2796fd50acd425a86a846e381a..d3c9327773de22c6147d766d7a6e91885475046b 100644
--- a/src/declarative/particles/qsgparticleemitter_p.h
+++ b/src/declarative/particles/qsgparticleemitter_p.h
@@ -64,6 +64,8 @@ class QSGParticleEmitter : public QSGItem
     Q_PROPERTY(QString particle READ particle WRITE setParticle NOTIFY particleChanged)
     Q_PROPERTY(QSGParticleExtruder* shape READ extruder WRITE setExtruder NOTIFY extruderChanged)
     Q_PROPERTY(bool emitting READ emitting WRITE setEmitting NOTIFY emittingChanged)
+    Q_PROPERTY(int startTime READ startTime WRITE setStartTime NOTIFY startTimeChanged)
+    Q_PROPERTY(bool noCap READ overwrite WRITE setOverWrite NOTIFY overwriteChanged)
 
     Q_PROPERTY(qreal emitRate READ particlesPerSecond WRITE setParticlesPerSecond NOTIFY particlesPerSecondChanged)
     Q_PROPERTY(int lifeSpan READ particleDuration WRITE setParticleDuration NOTIFY particleDurationChanged)
@@ -144,6 +146,10 @@ signals:
 
     void speedFromMovementChanged();
 
+    void startTimeChanged(int arg);
+
+    void overwriteChanged(bool arg);
+
 public slots:
     void pulse(qreal seconds);
     void burst(int num);
@@ -241,6 +247,22 @@ public slots:
 
        void setMaxParticleCount(int arg);
 
+       void setStartTime(int arg)
+       {
+           if (m_startTime != arg) {
+               m_startTime = arg;
+               emit startTimeChanged(arg);
+           }
+       }
+
+       void setOverWrite(bool arg)
+{
+    if (m_overwrite != arg) {
+    m_overwrite = arg;
+emit overwriteChanged(arg);
+}
+}
+
 public:
        int particleCount() const;
 
@@ -280,6 +302,16 @@ public:
            return m_maxParticleCount;
        }
 
+       int startTime() const
+       {
+           return m_startTime;
+       }
+
+       bool overwrite() const
+       {
+           return m_overwrite;
+       }
+
 protected:
        qreal m_particlesPerSecond;
        int m_particleDuration;
@@ -296,6 +328,10 @@ protected:
        qreal m_particleEndSize;
        qreal m_particleSizeVariation;
 
+       qreal m_speedFromMovement;
+       int m_startTime;
+       bool m_overwrite;
+
        int m_burstLeft;//TODO: Rename to pulse
        QList<QPair<int, QPointF > > m_burstQueue;
        int m_maxParticleCount;
@@ -314,7 +350,7 @@ protected:
 
 private:
        QSGStochasticDirection m_nullVector;
-       qreal m_speedFromMovement;
+
 };
 
 QT_END_NAMESPACE