diff --git a/src/plugins/diffeditor/diffeditorwidget.cpp b/src/plugins/diffeditor/diffeditorwidget.cpp
index a4a9adc8beef3888cc4424106d91991400dd3997..346fc69c85d24ec1e00ba15aa15c5cb94b9867c5 100644
--- a/src/plugins/diffeditor/diffeditorwidget.cpp
+++ b/src/plugins/diffeditor/diffeditorwidget.cpp
@@ -97,6 +97,7 @@ protected:
     virtual int lineNumberDigits() const;
     virtual bool selectionVisible(int blockNumber) const;
     virtual bool replacementVisible(int blockNumber) const;
+    QString plainTextFromSelection(const QTextCursor &cursor) const;
     virtual void paintEvent(QPaintEvent *e);
     virtual void scrollContentsBy(int dx, int dy);
 
@@ -137,6 +138,41 @@ bool DiffViewEditorWidget::replacementVisible(int blockNumber) const
     return m_skippedLines.value(blockNumber);
 }
 
+QString DiffViewEditorWidget::plainTextFromSelection(const QTextCursor &cursor) const
+{
+    const int startPosition = cursor.selectionStart();
+    const int endPosition = cursor.selectionEnd();
+    if (startPosition == endPosition)
+        return QString(); // no selection
+
+    QTextBlock startBlock = document()->findBlock(startPosition);
+    QTextBlock endBlock = document()->findBlock(endPosition);
+    QTextBlock block = startBlock;
+    QString text;
+    bool textInserted = false;
+    while (block.isValid() && block.blockNumber() <= endBlock.blockNumber()) {
+        if (selectionVisible(block.blockNumber())) {
+            if (block == startBlock) {
+                if (block == endBlock)
+                    text = cursor.selectedText(); // just one line text
+                else
+                    text = block.text().mid(startPosition - block.position());
+            } else {
+                if (textInserted)
+                    text += QLatin1Char('\n');
+                if (block == endBlock)
+                    text += block.text().left(endPosition - block.position());
+                else
+                    text += block.text();
+            }
+            textInserted = true;
+        }
+        block = block.next();
+    }
+
+    return convertToPlainText(text);
+}
+
 void DiffViewEditorWidget::setLineNumber(int blockNumber, const QString &lineNumber)
 {
     m_lineNumbers.insert(blockNumber, lineNumber);
diff --git a/src/plugins/texteditor/basetexteditor.cpp b/src/plugins/texteditor/basetexteditor.cpp
index 9a15510b0a904b90fbeb528e2df24e535bbe7f8d..c91729e17465841f7060951513d2e8cf67c66744 100644
--- a/src/plugins/texteditor/basetexteditor.cpp
+++ b/src/plugins/texteditor/basetexteditor.cpp
@@ -170,10 +170,8 @@ Core::IEditor *BaseTextEditorWidget::openEditorAt(const QString &fileName, int l
     return editor;
 }
 
-QString BaseTextEditorWidget::plainTextFromSelection() const
+QString BaseTextEditorWidget::plainTextFromSelection(const QTextCursor &cursor) const
 {
-    QTextCursor cursor = textCursor();
-
     // Copy the selected text as plain text
     QString text = cursor.selectedText();
     return convertToPlainText(text);
@@ -2863,29 +2861,36 @@ QString BaseTextEditorWidgetPrivate::copyBlockSelection()
     const TabSettings &ts = q->tabSettings();
     QTextBlock block = m_blockSelection.firstBlock.block();
     QTextBlock lastBlock = m_blockSelection.lastBlock.block();
+    bool textInserted = false;
     for (;;) {
-        QString text = block.text();
-        int startOffset = 0;
-        int startPos = ts.positionAtColumn(text, m_blockSelection.firstVisualColumn, &startOffset);
-        int endOffset = 0;
-        int endPos = ts.positionAtColumn(text, m_blockSelection.lastVisualColumn, &endOffset);
-
-        if (startPos == endPos) {
-            selection += QString(endOffset - startOffset, QLatin1Char(' '));
-        } else {
-            if (startOffset < 0)
-                selection += QString(-startOffset, QLatin1Char(' '));
-            if (endOffset < 0)
-                --endPos;
-            selection += text.mid(startPos, endPos - startPos);
-            if (endOffset < 0)
-                selection += QString(ts.m_tabSize + endOffset, QLatin1Char(' '));
-            else if (endOffset > 0)
-                selection += QString(endOffset, QLatin1Char(' '));
+        if (q->selectionVisible(block.blockNumber())) {
+            if (textInserted)
+                selection += QLatin1Char('\n');
+            textInserted = true;
+
+            QString text = block.text();
+            int startOffset = 0;
+            int startPos = ts.positionAtColumn(text, m_blockSelection.firstVisualColumn, &startOffset);
+            int endOffset = 0;
+            int endPos = ts.positionAtColumn(text, m_blockSelection.lastVisualColumn, &endOffset);
+
+            if (startPos == endPos) {
+                selection += QString(endOffset - startOffset, QLatin1Char(' '));
+            } else {
+                if (startOffset < 0)
+                    selection += QString(-startOffset, QLatin1Char(' '));
+                if (endOffset < 0)
+                    --endPos;
+                selection += text.mid(startPos, endPos - startPos);
+                if (endOffset < 0)
+                    selection += QString(ts.m_tabSize + endOffset, QLatin1Char(' '));
+                else if (endOffset > 0)
+                    selection += QString(endOffset, QLatin1Char(' '));
+            }
         }
         if (block == lastBlock)
             break;
-        selection += QLatin1Char('\n');
+
         block = block.next();
     }
     return selection;
@@ -5977,7 +5982,7 @@ QMimeData *BaseTextEditorWidget::createMimeDataFromSelection() const
         QTextCursor cursor = textCursor();
         QMimeData *mimeData = new QMimeData;
 
-        QString text = plainTextFromSelection();
+        QString text = plainTextFromSelection(cursor);
         mimeData->setText(text);
 
         // Copy the selected text as HTML
@@ -5989,21 +5994,33 @@ QMimeData *BaseTextEditorWidget::createMimeDataFromSelection() const
 
             // Apply the additional formats set by the syntax highlighter
             QTextBlock start = document()->findBlock(cursor.selectionStart());
-            QTextBlock end = document()->findBlock(cursor.selectionEnd());
-            end = end.next();
+            QTextBlock last = document()->findBlock(cursor.selectionEnd());
+            QTextBlock end = last.next();
 
             const int selectionStart = cursor.selectionStart();
             const int endOfDocument = tempDocument->characterCount() - 1;
+            int removedCount = 0;
             for (QTextBlock current = start; current.isValid() && current != end; current = current.next()) {
-                const QTextLayout *layout = current.layout();
-                foreach (const QTextLayout::FormatRange &range, layout->additionalFormats()) {
-                    const int start = current.position() + range.start - selectionStart;
-                    const int end = start + range.length;
-                    if (end <= 0 || start >= endOfDocument)
-                        continue;
-                    tempCursor.setPosition(qMax(start, 0));
-                    tempCursor.setPosition(qMin(end, endOfDocument), QTextCursor::KeepAnchor);
-                    tempCursor.setCharFormat(range.format);
+                if (selectionVisible(current.blockNumber())) {
+                    const QTextLayout *layout = current.layout();
+                    foreach (const QTextLayout::FormatRange &range, layout->additionalFormats()) {
+                        const int startPosition = current.position() + range.start - selectionStart - removedCount;
+                        const int endPosition = startPosition + range.length;
+                        if (endPosition <= 0 || startPosition >= endOfDocument)
+                            continue;
+                        tempCursor.setPosition(qMax(startPosition, 0));
+                        tempCursor.setPosition(qMin(endPosition, endOfDocument), QTextCursor::KeepAnchor);
+                        tempCursor.setCharFormat(range.format);
+                    }
+                } else {
+                    const int startPosition = current.position() - start.position() - removedCount;
+                    int endPosition = startPosition + current.text().count();
+                    if (current != last)
+                        endPosition++;
+                    removedCount += endPosition - startPosition;
+                    tempCursor.setPosition(startPosition);
+                    tempCursor.setPosition(endPosition, QTextCursor::KeepAnchor);
+                    tempCursor.deleteChar();
                 }
             }
 
@@ -6041,7 +6058,7 @@ QMimeData *BaseTextEditorWidget::createMimeDataFromSelection() const
                 selend.movePosition(QTextCursor::StartOfBlock);
             cursor.setPosition(selstart.position());
             cursor.setPosition(selend.position(), QTextCursor::KeepAnchor);
-            text = cursor.selectedText();
+            text = plainTextFromSelection(cursor);
             mimeData->setData(QLatin1String(kTextBlockMimeType), text.toUtf8());
         }
         return mimeData;
diff --git a/src/plugins/texteditor/basetexteditor.h b/src/plugins/texteditor/basetexteditor.h
index 27b293253277b2da433b79cb7ad3758d512cad05..11a397b6ed3c5ddf829319bf0813c45549094904 100644
--- a/src/plugins/texteditor/basetexteditor.h
+++ b/src/plugins/texteditor/basetexteditor.h
@@ -354,7 +354,7 @@ protected:
     bool canInsertFromMimeData(const QMimeData *source) const;
     void insertFromMimeData(const QMimeData *source);
 
-    virtual QString plainTextFromSelection() const;
+    virtual QString plainTextFromSelection(const QTextCursor &cursor) const;
     static QString convertToPlainText(const QString &txt);
 
     virtual QString lineNumber(int blockNumber) const;