diff --git a/Resources/Plugins/templates/browser.js b/Resources/Plugins/templates/browser.js
index f1abccb8..2fddd549 100644
--- a/Resources/Plugins/templates/browser.js
+++ b/Resources/Plugins/templates/browser.js
@@ -82,20 +82,30 @@ enabled(){
   
   // template implementation
   
-  var readTemplateToken = (contents, token, replacement) => {
-    let tokenStart = "{"+token;
+  var readTemplateTokens = (contents, tokenData) => {
     let currentIndex = -1;
     let startIndex = -1;
     let endIndex = -1;
     
     let data = [];
+    let tokenNames = Object.keys(tokenData);
     
-    while((currentIndex = contents.indexOf(tokenStart, currentIndex)) !== -1){
-      let entry = [ currentIndex ];
+    while((currentIndex = contents.indexOf('{', currentIndex)) !== -1){
+      startIndex = currentIndex+1;
+      
+      for(; startIndex < contents.length; startIndex++){
+        if (!tokenNames.some(name => contents[startIndex] === name[startIndex-currentIndex-1])){
+          break;
+        }
+      }
       
-      startIndex = currentIndex+tokenStart.length;
       endIndex = startIndex;
       
+      let token = contents.substring(currentIndex+1, startIndex);
+      let replacement = tokenData[token] || "";
+      
+      let entry = [ token, currentIndex ];
+      
       if (contents[endIndex] === '#'){
         ++endIndex;
         
@@ -125,7 +135,9 @@ enabled(){
       }
       
       data.push(entry);
-      contents = contents.substring(0, currentIndex)+(replacement || "")+contents.substring(endIndex+1);
+      
+      contents = contents.substring(0, currentIndex)+replacement+contents.substring(endIndex+1);
+      currentIndex += replacement.length;
     }
     
     return [ contents, data ];
@@ -151,53 +163,65 @@ enabled(){
     if (ele.length === 0)return;
     
     let value = append ? ele.val()+contents : contents;
-    let tokensCursor = null;
-    let tokensAjax = null;
+    let prevLength = value.length;
     
-    [value, tokensCursor] = readTemplateToken(value, "cursor");
-    [value, tokensAjax] = readTemplateToken(value, "ajax", "(...)");
+    let tokens = null;
+    
+    [value, tokens] = readTemplateTokens(value, {
+      "cursor": "",
+      "ajax": "(...)"
+    });
     
     ele.val(value);
     ele.focus();
     
-    if (tokensCursor.length === 1){
-      let [ index, length ] = tokensCursor[0];
-      ele[0].selectionStart = index;
-      ele[0].selectionEnd = index+(length | 0 || 0);
-    }
-    else{
-      ele[0].selectionStart = ele[0].selectionEnd = value.length;
+    ele[0].selectionStart = ele[0].selectionEnd = value.length;
+    
+    let promises = [];
+    let indexOffset = 0;
+    
+    for(let token of tokens){
+      switch(token[0]){
+        case "cursor":
+          let [, index1, length ] = token;
+          ele[0].selectionStart = index1;
+          ele[0].selectionEnd = index1+(length | 0 || 0);
+          break;
+          
+        case "ajax":
+          let [, index2, evaluator, url ] = token;
+          
+          if (!url){
+            url = evaluator;
+            evaluator = null;
+          }
+
+          promises.push(doAjaxRequest(url, evaluator).then(result => {
+            let diff = result.length-5; // "(...)".length
+            let realIndex = indexOffset+index2;
+            
+            let val = ele.val();
+            ele.val(val.substring(0, realIndex)+result+val.substring(realIndex+5));
+            
+            indexOffset += diff;
+          }));
+          
+          break;
+      }
     }
     
-    if (tokensAjax.length > 0){
-      let promises = [];
-      let indexOffset = 0;
-      
-      for(let token of tokensAjax){
-        let [ index, evaluator, url ] = token;
-        
-        if (!url){
-          url = evaluator;
-          evaluator = null;
-        }
-        
-        promises.push(doAjaxRequest(url, evaluator).then(result => {
-          let diff = result.length-5; // "(...)".length
-          let realIndex = indexOffset+index;
-          
-          let val = ele.val();
-          ele.val(val.substring(0, realIndex)+result+val.substring(realIndex+5));
-          
-          ele[0].selectionStart += diff;
-          ele[0].selectionEnd += diff;
-          indexOffset += diff;
-        }));
-      }
+    if (promises.length > 0){
+      let selStart = ele[0].selectionStart;
+      let selEnd = ele[0].selectionEnd;
       
       ele.prop("disabled", true);
       
       Promise.all(promises).then(() => {
         ele.prop("disabled", false);
+        ele.focus();
+        
+        ele[0].selectionStart = selStart+indexOffset;
+        ele[0].selectionEnd = selEnd+indexOffset;
       });
     }