diff --git a/src/plugins/texteditor/codeassist/codeassistant.cpp b/src/plugins/texteditor/codeassist/codeassistant.cpp
index 84ad277c06215862981107642430f57bc6922f20..2616924ffc2990c93bd501cda6f22bd46e6b2009 100644
--- a/src/plugins/texteditor/codeassist/codeassistant.cpp
+++ b/src/plugins/texteditor/codeassist/codeassistant.cpp
@@ -132,6 +132,8 @@ private:
 // --------------------
 const QChar CodeAssistantPrivate::m_null;
 
+static const int AutomaticProposalTimerInterval = 400;
+
 CodeAssistantPrivate::CodeAssistantPrivate(CodeAssistant *assistant)
     : m_q(assistant)
     , m_textEditor(0)
@@ -142,7 +144,7 @@ CodeAssistantPrivate::CodeAssistantPrivate(CodeAssistant *assistant)
     , m_settings(TextEditorSettings::instance()->completionSettings())
 {
     m_automaticProposalTimer.setSingleShot(true);
-    m_automaticProposalTimer.setInterval(400);
+    m_automaticProposalTimer.setInterval(AutomaticProposalTimerInterval);
     connect(&m_automaticProposalTimer, SIGNAL(timeout()), this, SLOT(automaticProposalTimeout()));
 
     connect(TextEditorSettings::instance(),
@@ -248,7 +250,7 @@ void CodeAssistantPrivate::requestProposal(AssistReason reason,
             m_requestRunner = new ProcessorRunner;
             connect(m_requestRunner, SIGNAL(finished()), this, SLOT(proposalComputed()));
             connect(m_requestRunner, SIGNAL(finished()), this, SLOT(finalizeRequest()));
-            assistInterface->detach(m_requestRunner);
+            assistInterface->prepareForAsyncUse();
             m_requestRunner->setReason(reason);
             m_requestRunner->setProcessor(processor);
             m_requestRunner->setAssistInterface(assistInterface);
diff --git a/src/plugins/texteditor/codeassist/defaultassistinterface.cpp b/src/plugins/texteditor/codeassist/defaultassistinterface.cpp
index f6fccae70c8a1b24c7ab0bf63d18b42ce1a4e56b..325549db61b5d03350ddac6db6a1f1cc861a2660 100644
--- a/src/plugins/texteditor/codeassist/defaultassistinterface.cpp
+++ b/src/plugins/texteditor/codeassist/defaultassistinterface.cpp
@@ -42,7 +42,7 @@ DefaultAssistInterface::DefaultAssistInterface(QTextDocument *textDocument,
                                                Core::IDocument *document,
                                                AssistReason reason)
     : m_textDocument(textDocument)
-    , m_detached(false)
+    , m_isAsync(false)
     , m_position(position)
     , m_document(document)
     , m_reason(reason)
@@ -50,7 +50,7 @@ DefaultAssistInterface::DefaultAssistInterface(QTextDocument *textDocument,
 
 DefaultAssistInterface::~DefaultAssistInterface()
 {
-    if (m_detached)
+    if (m_isAsync)
         delete m_textDocument;
 }
 
@@ -64,11 +64,17 @@ QString DefaultAssistInterface::textAt(int pos, int length) const
     return Convenience::textAt(QTextCursor(m_textDocument), pos, length);
 }
 
-void DefaultAssistInterface::detach(QThread *destination)
+void DefaultAssistInterface::prepareForAsyncUse()
 {
-    m_textDocument = m_textDocument->clone();
-    m_textDocument->moveToThread(destination);
-    m_detached = true;
+    m_text = m_textDocument->toPlainText();
+    m_textDocument = 0;
+    m_isAsync = true;
+}
+
+void DefaultAssistInterface::recreateTextDocument()
+{
+    m_textDocument = new QTextDocument(m_text);
+    m_text = QString();
 }
 
 AssistReason DefaultAssistInterface::reason() const
diff --git a/src/plugins/texteditor/codeassist/defaultassistinterface.h b/src/plugins/texteditor/codeassist/defaultassistinterface.h
index 27e72ac3ba476160a197edee261e187d4da8e079..68ef4b7b51546dba4765379e2980a4eb618a24d4 100644
--- a/src/plugins/texteditor/codeassist/defaultassistinterface.h
+++ b/src/plugins/texteditor/codeassist/defaultassistinterface.h
@@ -48,15 +48,17 @@ public:
     virtual QString textAt(int position, int length) const;
     virtual const Core::IDocument *document() const { return m_document; }
     virtual QTextDocument *textDocument() const { return m_textDocument; }
-    virtual void detach(QThread *destination);
+    virtual void prepareForAsyncUse();
+    virtual void recreateTextDocument();
     virtual AssistReason reason() const;
 
 private:
     QTextDocument *m_textDocument;
-    bool m_detached;
+    bool m_isAsync;
     int m_position;
     Core::IDocument *m_document;
     AssistReason m_reason;
+    QString m_text;
 };
 
 } // TextEditor
diff --git a/src/plugins/texteditor/codeassist/iassistinterface.h b/src/plugins/texteditor/codeassist/iassistinterface.h
index 50fdf0ab70e80792edef08b371596ddc1d2c7082..17d91681ac0180732155da31cbc68a2d1801e7b7 100644
--- a/src/plugins/texteditor/codeassist/iassistinterface.h
+++ b/src/plugins/texteditor/codeassist/iassistinterface.h
@@ -58,7 +58,8 @@ public:
     virtual QString textAt(int position, int length) const = 0;
     virtual const Core::IDocument *document() const = 0;
     virtual QTextDocument *textDocument() const = 0;
-    virtual void detach(QThread *destination) = 0;
+    virtual void prepareForAsyncUse() = 0;
+    virtual void recreateTextDocument() = 0;
     virtual AssistReason reason() const = 0;
 };
 
diff --git a/src/plugins/texteditor/codeassist/runner.cpp b/src/plugins/texteditor/codeassist/runner.cpp
index 494244eb972742235b4e18d6d28ca9d4f5cf8090..b8d9dbfa4a9cbd782b5558c53f58c9fba6f0f527 100644
--- a/src/plugins/texteditor/codeassist/runner.cpp
+++ b/src/plugins/texteditor/codeassist/runner.cpp
@@ -60,6 +60,7 @@ void ProcessorRunner::setProcessor(IAssistProcessor *computer)
 
 void ProcessorRunner::run()
 {
+    m_interface->recreateTextDocument();
     m_proposal = m_processor->perform(m_interface);
 }