diff --git a/javascript/src/Helper/codemirror.js b/javascript/src/Helper/codemirror.js
index bb9641eb381d6452ec8c91e81478316250966d98..3a50e213c4c90f15d676f4cfd713c9df50a3c926 100644
--- a/javascript/src/Helper/codemirror.js
+++ b/javascript/src/Helper/codemirror.js
@@ -19,24 +19,6 @@ var QfqNS = QfqNS || {};
  */
 QfqNS.Helper = QfqNS.Helper || {};
 
-QfqNS.Helper.cmKeyUpHandler = function(editor, event){
-    if ([32/*space*/, 57/*opening parenthesis*/].includes(event.keyCode)) {
-        editor.execCommand("capitalizeSql");
-    } else if (!editor.state.completionActive &&
-        (event.keyCode >= 48 && event.keyCode <= 111 /*alphanumeric*/ ||
-            [189, 190, 191, 58, 60, 219/* _./:<{ */].includes(event.keyCode) ) ) {
-        CodeMirror.commands.autocomplete(editor, null, {
-            completeSingle: false,
-            customKeys: { /*for hinting*/
-                "Up": function (cm, handle) { handle.moveFocus(-1); },
-                "Down": function (cm, handle) { handle.moveFocus(1); },
-                "Tab": function (cm, handle) { handle.pick(); },
-                "Esc": function (cm, handle) { handle.close(); }
-            }
-        });
-    }
-};
-
 (function (n) {
     'use strict';
 
@@ -88,8 +70,6 @@ QfqNS.Helper.cmKeyUpHandler = function(editor, event){
                         };
                     })($(this).closest('form'), $this));
 
-                    cm.on("keyup", QfqNS.Helper.cmKeyUpHandler);
-
                     cm.on('focus', function () {
                         oldElement = $this.val();
                         cmFocusOn = true;
@@ -217,8 +197,6 @@ $(document).ready(function () {
                 };
 
             })($(this).closest('form'), $this));
-            // hinting
-            cm.on("keyup", QfqNS.Helper.cmKeyUpHandler);
             // This added class is needed to not fire the script more than once
             $(this).addClass("cm-done");
             // For the extern window we use the whole place to show CodeMirror
diff --git a/javascript/src/Helper/codemirror/qfq.js b/javascript/src/Helper/codemirror/qfq.js
index 2c0afc9185e39490683dc8edf00a106d772dfa6f..7f0d83a1bd2ee62288cc9b835598759b4500a9f6 100644
--- a/javascript/src/Helper/codemirror/qfq.js
+++ b/javascript/src/Helper/codemirror/qfq.js
@@ -627,4 +627,45 @@
             return { list: list, from: from, to: to };
         }
     });
+
+    CodeMirror.defineOption("qfq-hint", false, function(cm) {
+        cm.on("keyup", function(cm, event){
+            if ([32/*space*/, 57/*opening parenthesis*/].includes(event.keyCode)) {
+                cm.execCommand("capitalizeSql");
+            } else if (!cm.state.completionActive &&
+                (event.keyCode >= 48 && event.keyCode <= 111 /*alphanumeric*/ ||
+                    [189, 190, 191, 58, 60, 219/* _./:<{ */].includes(event.keyCode) ) ) {
+                CodeMirror.commands.autocomplete(cm, null, {
+                    completeSingle: false,
+                    customKeys: { /*for hinting*/
+                        "Up": function (cm, handle) { handle.moveFocus(-1); },
+                        "Down": function (cm, handle) { handle.moveFocus(1); },
+                        "Tab": function (cm, handle) { handle.pick(); },
+                        "Esc": function (cm, handle) { handle.close(); }
+                    }
+                });
+            }
+        });
+    });
+
+    CodeMirror.defineOption("qfq-keymap", false, function(cm) {
+       cm.setOption("extraKeys", {
+           Tab: function(cm) {
+               if (cm.getSelections()[0].length) {
+                   // something selected: indent more
+                   cm.execCommand("indentMore");
+               } else {
+                   // insert one indentUnit worth of spaces
+                   var spaces = Array(cm.getOption("indentUnit") + 1).join(" ");
+                   cm.replaceSelection(spaces);
+               }
+           },
+           "Shift-Tab": function(cm) {
+               cm.execCommand("indentLess");
+           },
+           "Ctrl-Enter": function (cm) {
+               cm.execCommand("indentAuto");
+           }
+       })
+    });
 });
\ No newline at end of file