diff --git a/src/plugins/cppeditor/cppeditor.cpp b/src/plugins/cppeditor/cppeditor.cpp
index 53a471bae0a6d5131f35df071abb3bd141195d5a..2f21580ba90a4577296c411621c73ef1a91434cb 100644
--- a/src/plugins/cppeditor/cppeditor.cpp
+++ b/src/plugins/cppeditor/cppeditor.cpp
@@ -658,26 +658,30 @@ void CPPEditor::inAllRenameSelections(EditOperation operation,
     m_inRename = true;
     cursor.beginEditBlock();
 
-    const int offset = cursor.position() - currentRenameSelection.cursor.anchor();
+    const int startOffset = cursor.selectionStart() - currentRenameSelection.cursor.anchor();
+    const int endOffset = cursor.selectionEnd() - currentRenameSelection.cursor.anchor();
+    const int length = endOffset - startOffset;
 
     for (int i = 0; i < m_renameSelections.size(); ++i) {
         QTextEdit::ExtraSelection &s = m_renameSelections[i];
         int pos = s.cursor.anchor();
         int endPos = s.cursor.position();
-        s.cursor.setPosition(s.cursor.anchor() + offset);
+
+        s.cursor.setPosition(pos + startOffset);
+        s.cursor.setPosition(pos + endOffset, QTextCursor::KeepAnchor);
 
         switch (operation) {
         case DeletePreviousChar:
             s.cursor.deletePreviousChar();
-            --endPos;
+            endPos -= qMax(1, length);
             break;
         case DeleteChar:
             s.cursor.deleteChar();
-            --endPos;
+            endPos -= qMax(1, length);
             break;
         case InsertText:
             s.cursor.insertText(text);
-            endPos += text.length();
+            endPos += text.length() - length;
             break;
         }
 
@@ -1733,8 +1737,8 @@ void CPPEditor::keyPressEvent(QKeyEvent *e)
             // Eat backspace at start of name
             e->accept();
             return;
-        } else if (cursor.position() > currentRenameSelection.cursor.anchor()
-                && cursor.position() <= currentRenameSelection.cursor.position()) {
+        } else if (cursor.selectionStart() > currentRenameSelection.cursor.anchor()
+                && cursor.selectionEnd() <= currentRenameSelection.cursor.position()) {
 
             inAllRenameSelections(DeletePreviousChar, currentRenameSelection, cursor);
             e->accept();
@@ -1747,8 +1751,8 @@ void CPPEditor::keyPressEvent(QKeyEvent *e)
             // Eat delete at end of name
             e->accept();
             return;
-        } else if (cursor.position() >= currentRenameSelection.cursor.anchor()
-                && cursor.position() < currentRenameSelection.cursor.position()) {
+        } else if (cursor.selectionStart() >= currentRenameSelection.cursor.anchor()
+                && cursor.selectionEnd() < currentRenameSelection.cursor.position()) {
 
             inAllRenameSelections(DeleteChar, currentRenameSelection, cursor);
             e->accept();
@@ -1759,8 +1763,8 @@ void CPPEditor::keyPressEvent(QKeyEvent *e)
     default: {
         QString text = e->text();
         if (! text.isEmpty() && text.at(0).isPrint()) {
-            if (cursor.position() >= currentRenameSelection.cursor.anchor()
-                    && cursor.position() <= currentRenameSelection.cursor.position()) {
+            if (cursor.selectionStart() >= currentRenameSelection.cursor.anchor()
+                    && cursor.selectionEnd() <= currentRenameSelection.cursor.position()) {
 
                 inAllRenameSelections(InsertText, currentRenameSelection, cursor, text);
                 e->accept();