diff --git a/src/plugins/texteditor/basetexteditor.cpp b/src/plugins/texteditor/basetexteditor.cpp
index 49a054a334970b1eda0d2144ba01c436b870d6d6..e03659adf19eec61937dca2dc8b1043b085b30e4 100644
--- a/src/plugins/texteditor/basetexteditor.cpp
+++ b/src/plugins/texteditor/basetexteditor.cpp
@@ -1178,7 +1178,7 @@ void BaseTextEditor::keyPressEvent(QKeyEvent *e)
         }
     }
 
-    if (e->key() == Qt::Key_H && e->modifiers() == Qt::ControlModifier) {
+    if (e->key() == Qt::Key_H && e->modifiers() == Qt::MetaModifier) {
         universalHelper();
         e->accept();
         return;
@@ -1243,23 +1243,67 @@ skip_event:
 void BaseTextEditor::universalHelper()
 {
     QList<QTextEdit::ExtraSelection> selections;
+
     QTextCursor cursor = textCursor();
+    const int startCursorPosition = cursor.position();
     cursor.beginEditBlock();
-    int pos = cursor.position();
-    cursor.insertText("if (condition){\n        \n    }\n");
-    QTextCursor c = cursor;
-    c.setPosition(pos + 3); // condition-1;
-    c.setPosition(c.position() + 10, QTextCursor::KeepAnchor);
-    QTextEdit::ExtraSelection selection;
-    selection.cursor = c;
-    selection.format.setBackground(Qt::darkCyan);
-    selections.append(selection);
-    c.setPosition(pos + 24); // contents
-    selection.cursor = c;
-    selection.format.setBackground(Qt::darkMagenta);
-    selections.append(selection);
+
+    const QString snippet = QLatin1String("for ($initializer$; $condition$; $expresssion$) {\n$$\n}\n");
+
+    if ((snippet.count('$') % 2) != 0) {
+        qWarning() << "invalid snippet";
+        return;
+    }
+
+    int pos = 0;
+    while (pos < snippet.size()) {
+        if (snippet.at(pos) != QLatin1Char('$')) {
+            const int start = pos;
+            do { ++pos; }
+            while (pos < snippet.size() && snippet.at(pos) != QLatin1Char('$'));
+            cursor.insertText(snippet.mid(start, pos - start));
+        } else {
+            // the start of a place holder.
+            const int start = ++pos;
+            for (; pos < snippet.size(); ++pos) {
+                if (snippet.at(pos) == QLatin1Char('$'))
+                    break;
+            }
+
+            Q_ASSERT(pos < snippet.size());
+            Q_ASSERT(snippet.at(pos) == QLatin1Char('$'));
+
+            const QString textToInsert = snippet.mid(start, pos - start);
+
+            int cursorPosition = cursor.position();
+            cursor.insertText(textToInsert);
+
+            QTextCursor tc(document());
+            tc.setPosition(cursorPosition - 1);
+            tc.setPosition(cursorPosition + textToInsert.length(), QTextCursor::KeepAnchor);
+
+            QTextEdit::ExtraSelection selection;
+            selection.cursor = tc;
+            selection.format.setBackground(Qt::darkCyan);
+
+            selections.append(selection);
+            ++pos;
+        }
+    }
+
     cursor.endEditBlock();
+    cursor.setPosition(startCursorPosition, QTextCursor::KeepAnchor);
+    indent(cursor.document(), cursor, QChar());
+
     setExtraSelections(BaseTextEditor::SnippetPlaceholderSelection, selections);
+
+    if (! selections.isEmpty()) {
+        const QTextEdit::ExtraSelection &selection = selections.first();
+
+        cursor = textCursor();
+        cursor.setPosition(selection.cursor.anchor() + 1);
+        setTextCursor(cursor);
+    }
 }
 
 void BaseTextEditor::setTextCursor(const QTextCursor &cursor)