diff --git a/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp b/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp
index 0c3914b0831e07b5e808f6645dfd0abbde39a008..84ec468140030c4e0abcfd06d64882de757a650e 100644
--- a/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp
+++ b/src/plugins/qmlprofiler/qmlprofilermodelmanager.cpp
@@ -338,16 +338,20 @@ void QmlProfilerModelManager::save(const QString &filename)
 
     d->notesModel->saveData();
 
-    QFuture<void> result = Utils::runAsync<void>([this, file] (QFutureInterface<void> &future) {
-        QmlProfilerFileWriter writer;
-        writer.setTraceTime(traceTime()->startTime(), traceTime()->endTime(),
-                            traceTime()->duration());
-        writer.setQmlEvents(d->model->getEventTypes(), d->model->getEvents());
-        writer.setNotes(d->model->getEventNotes());
-        writer.setFuture(&future);
-        writer.save(file);
+    QmlProfilerFileWriter *writer = new QmlProfilerFileWriter(this);
+    writer->setTraceTime(traceTime()->startTime(), traceTime()->endTime(),
+                        traceTime()->duration());
+    writer->setQmlEvents(d->model->getEventTypes(), d->model->getEvents());
+    writer->setNotes(d->model->getEventNotes());
+
+    connect(writer, &QObject::destroyed, this, &QmlProfilerModelManager::saveFinished,
+            Qt::QueuedConnection);
+
+    QFuture<void> result = Utils::runAsync<void>([file, writer] (QFutureInterface<void> &future) {
+        writer->setFuture(&future);
+        writer->save(file);
+        delete writer;
         file->deleteLater();
-        QMetaObject::invokeMethod(this, "saveFinished", Qt::QueuedConnection);
     });
 
     Core::ProgressManager::addTask(result, tr("Saving Trace Data"), Constants::TASK_SAVE,
@@ -366,24 +370,33 @@ void QmlProfilerModelManager::load(const QString &filename)
 
     clear();
     setState(AcquiringData);
+    QmlProfilerFileReader *reader = new QmlProfilerFileReader(this);
+
+    connect(reader, &QmlProfilerFileReader::error, this, [this, reader](const QString &message) {
+        delete reader;
+        emit error(message);
+    }, Qt::QueuedConnection);
+
+    connect(reader, &QmlProfilerFileReader::success, this, [this, reader]() {
+        d->model->setData(reader->traceStart(), qMax(reader->traceStart(), reader->traceEnd()),
+                          reader->qmlEvents(), reader->ranges());
+        d->model->setNoteData(reader->notes());
+        setRecordedFeatures(reader->loadedFeatures());
+        d->traceTime->increaseEndTime(d->model->lastTimeMark());
+        delete reader;
+        acquiringDone();
+    }, Qt::QueuedConnection);
 
-    QFuture<void> result = Utils::runAsync<void>([this, file] (QFutureInterface<void> &future) {
-        QmlProfilerFileReader reader;
-        reader.setFuture(&future);
-        connect(&reader, &QmlProfilerFileReader::error, this, &QmlProfilerModelManager::error);
-        reader.setQmlDataModel(d->model);
-        reader.load(file);
-        setRecordedFeatures(reader.loadedFeatures());
+    QFuture<void> result = Utils::runAsync<void>([file, reader] (QFutureInterface<void> &future) {
+        reader->setFuture(&future);
+        reader->load(file);
         file->close();
         file->deleteLater();
-        d->traceTime->increaseEndTime(d->model->lastTimeMark());
-        acquiringDone();
     });
 
     Core::ProgressManager::addTask(result, tr("Loading Trace Data"), Constants::TASK_LOAD);
 }
 
-
 void QmlProfilerModelManager::setState(QmlProfilerModelManager::State state)
 {
     // It's not an error, we are continuously calling "AcquiringData" for example
diff --git a/src/plugins/qmlprofiler/qmlprofilertracefile.cpp b/src/plugins/qmlprofiler/qmlprofilertracefile.cpp
index 4c58cf17e7cb1f246212ae59f671e54638a87811..afe6186967b7e5c89f1901150bed52449711aed1 100644
--- a/src/plugins/qmlprofiler/qmlprofilertracefile.cpp
+++ b/src/plugins/qmlprofiler/qmlprofilertracefile.cpp
@@ -117,16 +117,13 @@ static QString qmlTypeAsString(Message message, RangeType rangeType)
 
 QmlProfilerFileReader::QmlProfilerFileReader(QObject *parent) :
     QObject(parent),
+    m_traceStart(-1),
+    m_traceEnd(-1),
     m_future(0),
     m_loadedFeatures(0)
 {
 }
 
-void QmlProfilerFileReader::setQmlDataModel(QmlProfilerDataModel *dataModel)
-{
-    m_qmlModel = dataModel;
-}
-
 void QmlProfilerFileReader::setFuture(QFutureInterface<void> *future)
 {
     m_future = future;
@@ -142,8 +139,6 @@ bool QmlProfilerFileReader::load(QIODevice *device)
     QXmlStreamReader stream(device);
 
     bool validVersion = true;
-    qint64 traceStart = -1;
-    qint64 traceEnd = -1;
 
     while (validVersion && !stream.atEnd() && !stream.hasError()) {
         if (isCanceled())
@@ -160,9 +155,9 @@ bool QmlProfilerFileReader::load(QIODevice *device)
                 else
                     validVersion = false;
                 if (attributes.hasAttribute(_("traceStart")))
-                    traceStart = attributes.value(_("traceStart")).toLongLong();
+                    m_traceStart = attributes.value(_("traceStart")).toLongLong();
                 if (attributes.hasAttribute(_("traceEnd")))
-                    traceEnd = attributes.value(_("traceEnd")).toLongLong();
+                    m_traceEnd = attributes.value(_("traceEnd")).toLongLong();
             }
 
             if (elementName == _("eventData")) {
@@ -190,8 +185,7 @@ bool QmlProfilerFileReader::load(QIODevice *device)
         emit error(tr("Error while parsing trace data file: %1").arg(stream.errorString()));
         return false;
     } else {
-        m_qmlModel->setData(traceStart, qMax(traceStart, traceEnd), m_qmlEvents, m_ranges);
-        m_qmlModel->setNoteData(m_notes);
+        emit success();
         return true;
     }
 }
diff --git a/src/plugins/qmlprofiler/qmlprofilertracefile.h b/src/plugins/qmlprofiler/qmlprofilertracefile.h
index 5a5080c1bed083b09f679f41d73af7760dd3f486..f29b04634d89fc45be98d1f0d185a3890e0360e9 100644
--- a/src/plugins/qmlprofiler/qmlprofilertracefile.h
+++ b/src/plugins/qmlprofiler/qmlprofilertracefile.h
@@ -50,14 +50,21 @@ class QmlProfilerFileReader : public QObject
 public:
     explicit QmlProfilerFileReader(QObject *parent = 0);
 
-    void setQmlDataModel(QmlProfilerDataModel *dataModel);
     void setFuture(QFutureInterface<void> *future);
 
     bool load(QIODevice *device);
     quint64 loadedFeatures() const;
 
+    qint64 traceStart() const { return m_traceStart; }
+    qint64 traceEnd() const { return m_traceEnd; }
+
+    const QVector<QmlProfilerDataModel::QmlEventTypeData> &qmlEvents() const { return m_qmlEvents; }
+    const QVector<QmlProfilerDataModel::QmlEventData> &ranges() const { return m_ranges; }
+    const QVector<QmlProfilerDataModel::QmlEventNoteData> &notes() const { return m_notes; }
+
 signals:
     void error(const QString &error);
+    void success();
 
 private:
     void loadEventData(QXmlStreamReader &reader);
@@ -66,7 +73,7 @@ private:
     void progress(QIODevice *device);
     bool isCanceled() const;
 
-    QmlProfilerDataModel *m_qmlModel;
+    qint64 m_traceStart, m_traceEnd;
     QFutureInterface<void> *m_future;
     QVector<QmlProfilerDataModel::QmlEventTypeData> m_qmlEvents;
     QVector<QmlProfilerDataModel::QmlEventData> m_ranges;