diff --git a/src/plugins/qmldesigner/core/model/modeltotextmerger.cpp b/src/plugins/qmldesigner/core/model/modeltotextmerger.cpp
index 5a4b9882df2251feff17bbd2997578ab6067e71e..a2d924e5712b04e469fc996b05c99ef34d8b5feb 100644
--- a/src/plugins/qmldesigner/core/model/modeltotextmerger.cpp
+++ b/src/plugins/qmldesigner/core/model/modeltotextmerger.cpp
@@ -191,7 +191,7 @@ RewriterView *ModelToTextMerger::view()
     return m_rewriterView;
 }
 
-void ModelToTextMerger::applyChanges()
+bool ModelToTextMerger::applyChanges()
 {
     if (m_rewriteActions.isEmpty())
         return;
@@ -223,6 +223,8 @@ void ModelToTextMerger::applyChanges()
         textModifier->deactivateChangeSignals();
         textModifier->startGroup();
 
+        bool success = true;
+
         for (int i = 0; i < m_rewriteActions.size(); ++i) {
             if (i != 0) {
                 textModifier->flushGroup();
@@ -235,15 +237,15 @@ void ModelToTextMerger::applyChanges()
             }
 
             ModelNodePositionStorage *positionStore = m_rewriterView->positionStorage();
-            const bool success = action->execute(refactoring, *positionStore);
+            success = action->execute(refactoring, *positionStore);
 
             if (!success /*&& DebugRewriteActions*/) {
                 qDebug() << "*** QML source code: ***";
                 qDebug() << qPrintable(textModifier->text());
                 qDebug() << "*** End of QML source code. ***";
-            }
 
-            Q_ASSERT(success);
+                break;
+            }
         }
         qDeleteAll(m_rewriteActions);
         m_rewriteActions.clear();
@@ -254,10 +256,15 @@ void ModelToTextMerger::applyChanges()
 
         textModifier->reactivateChangeSignals();
     } catch (...) {
+        qDeleteAll(m_rewriteActions);
+        m_rewriteActions.clear();
+        textModifier->commitGroup();
         textModifier->reactivateChangeSignals();
 
         throw;
     }
+
+    return success;
 }
 
 void ModelToTextMerger::reindent(const QMap<int, int> &/*dirtyAreas*/) const
diff --git a/src/plugins/qmldesigner/core/model/modeltotextmerger.h b/src/plugins/qmldesigner/core/model/modeltotextmerger.h
index c3bc38ebadda240c5bd9880497e8e67adb3c2004..6dca583a9081bbc252c1b9f48313cab922332c1f 100644
--- a/src/plugins/qmldesigner/core/model/modeltotextmerger.h
+++ b/src/plugins/qmldesigner/core/model/modeltotextmerger.h
@@ -57,7 +57,7 @@ class ModelToTextMerger
 
 public:
     ModelToTextMerger(RewriterView *reWriterView);
-    void applyChanges();
+    bool applyChanges(); // Note: his method might throw exceptions, as the model works this way. So to handle rewriting failures, you will also need to catch any exception coming out.
 
     void nodeCreated(const ModelNode &createdNode);
     void nodeRemoved(const ModelNode &removedNode, const NodeAbstractProperty &parentProperty, PropertyChangeFlags propertyChange);