diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp
index da69d192361a592e90f4b1747d436034a207da0e..9771328c5bb821e6f66a4c68b540c6897dc8a694 100644
--- a/src/plugins/cppeditor/cppeditor.cpp
+++ b/src/plugins/cppeditor/cppeditor.cpp
@@ -1537,28 +1537,43 @@ int CPPEditor::paragraphSeparatorAboutToBeInserted(QTextCursor &cursor)
     else
         braceDepth= 0;
 
-    if (braceDepth > 0) { // we do have an extra brace, let's close it
-        int pos = cursor.position();
-
-        MatchingText matchingText;
-        const QString textToInsert = matchingText.insertParagraphSeparator(cursor);
-
-        cursor.insertText(textToInsert);
-        cursor.setPosition(pos);
-        const TabSettings &ts = tabSettings();
-        if (ts.m_autoIndent) {
-            cursor.insertBlock();
-            indent(document(), cursor, QChar::Null);
-        } else {
-            QString previousBlockText = cursor.block().text();
-            cursor.insertBlock();
-            cursor.insertText(ts.indentationString(previousBlockText));
-        }
-        cursor.setPosition(pos);
-        m_allowSkippingOfBlockEnd = true;
-        return 1;
+    if (braceDepth <= 0)
+        return 0; // braces are all balanced or worse, no need to do anything
+
+    // we have an extra brace , let's see if we should close it
+
+
+    /* verify that the next block is not further intended compared to the current block.
+       This covers the following case:
+
+            if (condition) {|
+                statement;
+    */
+    const TabSettings &ts = tabSettings();
+    QTextBlock block = cursor.block();
+    int indentation = ts.indentationColumn(block.text());
+    if (block.next().isValid()
+        && ts.indentationColumn(block.next().text()) > indentation)
+        return 0;
+
+    int pos = cursor.position();
+
+    MatchingText matchingText;
+    const QString textToInsert = matchingText.insertParagraphSeparator(cursor);
+
+    cursor.insertText(textToInsert);
+    cursor.setPosition(pos);
+    if (ts.m_autoIndent) {
+        cursor.insertBlock();
+        indent(document(), cursor, QChar::Null);
+    } else {
+        QString previousBlockText = cursor.block().text();
+        cursor.insertBlock();
+        cursor.insertText(ts.indentationString(previousBlockText));
     }
-    return 0;
+    cursor.setPosition(pos);
+    m_allowSkippingOfBlockEnd = true;
+    return 1;
 }
 
 bool CPPEditor::contextAllowsAutoParentheses(const QTextCursor &cursor,
diff --git a/src/plugins/texteditor/basetexteditor.cpp b/src/plugins/texteditor/basetexteditor.cpp
index 13461fe7c7c39a4a3c057e4695aa589511f21345..9b4a4f0edf5ed5a5cb0eef6aaa49d93c9fe5ec13 100644
--- a/src/plugins/texteditor/basetexteditor.cpp
+++ b/src/plugins/texteditor/basetexteditor.cpp
@@ -4509,11 +4509,12 @@ QMimeData *BaseTextEditor::createMimeDataFromSelection() const
         const TabSettings &ts = d->m_document->tabSettings();
 
         bool startOk = ts.cursorIsAtBeginningOfLine(selstart);
-        bool endOk = (selend.block() != selstart.block() && ts.cursorIsAtBeginningOfLine(selend));
+        bool multipleBlocks = (selend.block() != selstart.block());
 
-        if (startOk && endOk) {
+        if (startOk && multipleBlocks) {
             selstart.movePosition(QTextCursor::StartOfBlock);
-            selend.movePosition(QTextCursor::StartOfBlock);
+            if (ts.cursorIsAtBeginningOfLine(selend))
+                selend.movePosition(QTextCursor::StartOfBlock);
             cursor.setPosition(selstart.position());
             cursor.setPosition(selend.position(), QTextCursor::KeepAnchor);
             text = cursor.selectedText();
@@ -4583,29 +4584,43 @@ void BaseTextEditor::insertFromMimeData(const QMimeData *source)
 
     cursor.beginEditBlock();
 
-    if (ts.cursorIsAtBeginningOfLine(cursor)
+    bool insertAtBeginningOfLine = ts.cursorIsAtBeginningOfLine(cursor);
+
+    if (insertAtBeginningOfLine
         && source->hasFormat(QLatin1String("application/vnd.nokia.qtcreator.blocktext"))) {
         text = QString::fromUtf8(source->data(QLatin1String("application/vnd.nokia.qtcreator.blocktext")));
         if (text.isEmpty())
             return;
+    }
 
-        cursor.removeSelectedText();
+    cursor.removeSelectedText();
 
-        int bpos = cursor.block().position();
-        int pos = cursor.position() - bpos;
+    int reindentBlockStart = cursor.blockNumber() + (insertAtBeginningOfLine?0:1);
 
-        cursor.setPosition(bpos); // since we'll add a final newline, preserve current line's indentation
+    bool hasFinalNewline = (text.endsWith(QLatin1Char('\n'))
+                            || text.endsWith(QChar::ParagraphSeparator)
+                            || text.endsWith(QLatin1Char('\r')));
 
-        cursor.insertText(text);
-        pos = cursor.position();
-        cursor.setPosition(bpos);
-        cursor.setPosition(pos, QTextCursor::KeepAnchor);
-        cursor.setPosition(cursor.position()-1, QTextCursor::KeepAnchor);
-        reindent(document(), cursor);
-        cursor.clearSelection();
-        cursor.setPosition(cursor.position()+1); // skip newline
-    } else {
-        cursor.insertText(text);
+    QTextCursor unnecessaryWhitespace;
+    if (hasFinalNewline) {
+        // since we'll add a final newline, preserve current line's indentation
+        unnecessaryWhitespace = cursor;
+        unnecessaryWhitespace.movePosition(QTextCursor::StartOfBlock, QTextCursor::KeepAnchor);
+        cursor.setPosition(unnecessaryWhitespace.position());
+    }
+
+    cursor.insertText(text);
+
+    int reindentBlockEnd = cursor.blockNumber() - (hasFinalNewline?1:0);
+
+    if (reindentBlockStart <= reindentBlockEnd) {
+        if (insertAtBeginningOfLine && hasFinalNewline)
+            unnecessaryWhitespace.removeSelectedText();
+        QTextCursor c = cursor;
+        c.setPosition(cursor.document()->findBlockByNumber(reindentBlockStart).position());
+        c.setPosition(cursor.document()->findBlockByNumber(reindentBlockEnd).position(),
+                      QTextCursor::KeepAnchor);
+        reindent(document(), c);
     }
 
     cursor.endEditBlock();