Merge "Improve query language documentation"
diff --git a/.gitignore b/.gitignore
index 219d538..87ea481 100644
--- a/.gitignore
+++ b/.gitignore
@@ -9,6 +9,7 @@
 cache/data
 public
 kalamar.*.conf
+kalamar.conf.json
 script/hypnotoad.pid
 .sass-cache
 dev/css
diff --git a/Gruntfile.js b/Gruntfile.js
index af74d0e..830a0eb 100644
--- a/Gruntfile.js
+++ b/Gruntfile.js
@@ -14,26 +14,48 @@
  * TODO: Implement a LaTeX generator for a pdf of the dokumentation 
  */
 
-// Generate requireJS files for l10n
-var reqTasks = [];
-for (var i in {'en' : 0, 'de' : 1}) {
-  reqTasks.push({
-    options: {
-      // optimize: "uglify",
-      baseUrl: 'dev/js/src',
-      paths : {
-	      'lib': '../lib'
-      },
-      wrap:true,
-      // dir : 'public/js',
-      name: 'lib/almond',
-      include : ['app/' + i],
-      out: 'public/js/kalamar-<%= pkg.version %>-' + i + '.js'
-    }
-  })
-};
-
 module.exports = function(grunt) {
+
+  var config;
+
+  try {
+    config = grunt.file.readJSON('kalamar.conf.json');
+  }
+  catch(err) {
+    console.log("Error: " + err);
+    config = {};
+  };
+
+  if (config["include"] === undefined) {
+    config["include"] = [
+      'hint/foundries/base',
+      'hint/foundries/dereko'
+    ];
+  };
+
+  // Generate requireJS files for l10n
+  var reqTasks = [];
+  for (var i in {'en' : 0, 'de' : 1}) {
+
+    var includeFiles = config["include"].slice();
+    includeFiles.push('app/' + i);
+
+    reqTasks.push({
+      options: {
+        // optimize: "uglify",
+        baseUrl: 'dev/js/src',
+        paths : {
+	        'lib': '../lib'
+        },
+        wrap:true,
+        // dir : 'public/js',
+        name: 'lib/almond',
+        include : includeFiles,
+        out: 'public/js/kalamar-<%= pkg.version %>-' + i + '.js'
+      }
+    })
+  };
+
   grunt.initConfig({
     pkg: grunt.file.readJSON('package.json'),
     requirejs: reqTasks,
diff --git a/dev/js/spec/hintSpec.js b/dev/js/spec/hintSpec.js
index 5df65fd..1ff9343 100644
--- a/dev/js/spec/hintSpec.js
+++ b/dev/js/spec/hintSpec.js
@@ -143,7 +143,7 @@
 
 
   describe('KorAP.Hint', function () {
-    KorAP.hintArray = {
+    KorAP.annotationHelper = {
       "-" : [
   ["Base Annotation", "base/s=", "Structure"],
   ["CoreNLP", "corenlp/", "Constituency, Named Entities, Part-of-Speech"]
diff --git a/dev/js/spec/menuSpec.js b/dev/js/spec/menuSpec.js
index aba3f1e..a60d7ab 100644
--- a/dev/js/spec/menuSpec.js
+++ b/dev/js/spec/menuSpec.js
@@ -295,6 +295,7 @@
         // Highlight in the middle - both
         menuItem = KorAP.ComplexMenuItem.create(['CoreNLP', 'corenlp/', 'This is my Example']);
         menuItem.highlight("e");
+
         expect(menuItem.element().innerHTML).toEqual("<div><h1>Cor<mark>e</mark>NLP</h1><h2>cor<mark>e</mark>nlp/</h2><h3>This is my <mark>E</mark>xampl<mark>e</mark></h3></div>");
 
         menuItem.lowlight();
@@ -328,6 +329,21 @@
         ["Syntax", "syn="]
       ];
 
+      var listMultiPrefix = [
+        ["PP","PP ","Personal Pronoun"],
+        ["PPP","PPP ","Personal Pronoun, Plural"],
+        ["PPPA","PPPA ","Personal Pronoun, Plural, Acc."],
+        ["PPPD","PPPD ","Personal Pronoun, Plural, Dative"],
+        ["PPPR","PPPR ","Personal Pronoun, Plural, Direct"],
+        ["PPPO","PPPO ","Personal Pronoun, Plural, Oblique"],
+        ["PPS","PPS ","Personal Pronoun, Singular"],
+        ["PPSA","PPSA ","Personal Pronoun, Singular, Accusative"],
+        ["PPSD","PPSD ","Personal Pronoun, Singular, Dative"],
+        ["PPSR","PPSR ","Personal Pronoun, Singular, Direct"],
+        ["PPSN","PPSN ","Personal Pronoun, Singular, Nominative"],
+        ["PPSO","PPSO ","Personal Pronoun, Singular, Oblique"]
+      ];
+      
       var demolist = [
         ['Titel', 'title'],
         ['Untertitel', 'subTitle'],
@@ -784,7 +800,43 @@
         expect(menu.shownItem(2)).toBe(undefined);
       });
 
+      it('should be filterable (multiple prefix = "pro sin")', function () {
+        var menu = KorAP.HintMenu.create("drukola/p=", listMultiPrefix);
+        menu._firstActive = true;
 
+        menu.limit(2);
+        expect(menu.prefix("pro sin").show()).toBe(true);
+        expect(menu.shownItem(0).name()).toEqual("PPS");
+        expect(menu.element().childNodes[3].innerHTML).toEqual(
+          "<strong>PPS</strong><span>Personal <mark>Pro</mark>noun, <mark>Sin</mark>gular</span>"
+        );
+
+        expect(menu.shownItem(0).active()).toBe(true);
+        expect(menu.shownItem(1).name()).toEqual("PPSA");
+        expect(menu.element().childNodes[4].innerHTML).toEqual("<strong>PPSA</strong><span>Personal <mark>Pro</mark>noun, <mark>Sin</mark>gular, Accusative</span>");
+        expect(menu.shownItem(1).active()).toBe(false);
+
+        expect(menu.shownItem(2)).toBe(undefined);
+      });
+
+      it('should be filterable (trimming = " p")', function () {
+        var menu = KorAP.HintMenu.create("/p=", listMultiPrefix);
+        // menu._firstActive = true;
+
+        menu.limit(2);
+        expect(menu.show()).toBe(true);
+        menu._prefix.add(" ");
+        expect(menu.show()).toBe(true);
+        menu._prefix.add("p")
+        expect(menu.show()).toBe(true);
+        expect(menu.shownItem(0).name()).toEqual("PP");
+        expect(menu.element().childNodes[3].innerHTML).toEqual(
+          "<strong><mark>P</mark><mark>P</mark></strong>"+
+            "<span><mark>P</mark>ersonal <mark>P</mark>ronoun</span>"
+        );
+      });
+
+      
       it('should choose prefix with failing prefix (1)', function () {
         var menu = KorAP.HintMenu.create("cnx/", list);
         menu.limit(2);
diff --git a/dev/js/src/hint.js b/dev/js/src/hint.js
index 238b737..2ebc395 100644
--- a/dev/js/src/hint.js
+++ b/dev/js/src/hint.js
@@ -42,7 +42,7 @@
     ")?" +
     ")?" +
     ")$";
-  KorAP.hintArray = KorAP.hintArray || {};
+  KorAP.annotationHelper = KorAP.annotationHelper || { "-" : [] };
 
   /**
    * Return keycode based on event
@@ -175,12 +175,12 @@
       if (this._menu[action] === undefined) {
 
 	      // No matching hint menu
-	      if (KorAP.hintArray[action] === undefined)
+	      if (KorAP.annotationHelper[action] === undefined)
 	        return;
 
 	      // Create matching hint menu
 	      this._menu[action] = menuClass.create(
-	        this, action, KorAP.hintArray[action]
+	        this, action, KorAP.annotationHelper[action]
 	      );
       };
 
diff --git a/dev/js/src/hint/array.js b/dev/js/src/hint/array.js
deleted file mode 100644
index fcfe9a2..0000000
--- a/dev/js/src/hint/array.js
+++ /dev/null
@@ -1,463 +0,0 @@
-/*
-var menuContent = [
-  ['cnx/c', 'cnx', 'c'],
-  ['mate/c', 'mate', 'c'],
-  ['base/c', 'base', 'c'],
-  ['xip/c', 'xip', 'c'],
-  ['tt/c', 'tt', 'c']
-];
-*/
-
-var namedEntities = [
-  ["I-LOC",  "I-LOC ",  "Location"],
-  ["I-MISC", "I-MISC ", "Miscellaneous"],
-  ["I-ORG",  "I-ORG ",  "Organization"],
-  ["I-PER",  "I-PER ",  "Person"]
-];
-
-// http://www.ids-mannheim.de/cosmas2/projekt/referenz/stts/morph.html
-// http://nachhalt.sfb632.uni-potsdam.de/owl-docu/stts.html
-var sttsArray = [
-  // "$.", "$(", "$,"
-  ["ADJA","ADJA ", "Attributive Adjective"],
-  ["ADJD","ADJD ", "Predicative Adjective"],
-  ["ADV","ADV ", "Adverb"],
-  ["APPO","APPO ", "Postposition"],
-  ["APPR","APPR ", "Preposition"],
-  ["APPRART","APPRART ", "Preposition with Determiner"],
-  ["APZR","APZR ","Right Circumposition"],
-  ["ART","ART ", "Determiner"],
-  ["CARD","CARD ", "Cardinal Number"],
-  ["FM","FM ", "Foreign Material"],
-  ["ITJ","ITJ ", "Interjection"],
-  ["KOKOM","KOKOM ", "Comparison Particle"],
-  ["KON","KON ", "Coordinating Conjuncion"],
-  ["KOUI","KOUI ", "Subordinating Conjunction with 'zu'"],
-  ["KOUS","KOUS ", "Subordinating Conjunction with Sentence"],
-  ["NE","NE ", "Named Entity"],
-  ["NN","NN ", "Normal Nomina"],
-  ["PAV", "PAV ", "Pronominal Adverb"],
-  ["PDAT","PDAT ","Attributive Demonstrative Pronoun"],
-  ["PDS","PDS ", "Substitutive Demonstrative Pronoun"],
-  ["PIAT","PIAT ", "Attributive Indefinite Pronoun without Determiner"],
-  ["PIDAT","PIDAT ", "Attributive Indefinite Pronoun with Determiner"],
-  ["PIS","PIS ", "Substitutive Indefinite Pronoun"],
-  ["PPER","PPER ", "Personal Pronoun"],
-  ["PPOSAT","PPOSAT ", "Attributive Possessive Pronoun"],
-  ["PPOSS","PPOSS ", "Substitutive Possessive Pronoun"],
-  ["PRELAT","PRELAT ", "Attributive Relative Pronoun"],
-  ["PRELS","PRELS ", "Substitutive Relative Pronoun"],
-  ["PRF","PRF ", "Reflexive Pronoun"],
-  ["PROAV","PROAV ", "Pronominal Adverb"],
-  ["PTKA","PTKA ","Particle with Adjective"],
-  ["PTKANT","PTKANT ", "Answering Particle"],
-  ["PTKNEG","PTKNEG ", "Negation Particle"],
-  ["PTKVZ","PTKVZ ", "Separated Verbal Particle"],
-  ["PTKZU","PTKZU ", "'zu' Particle"],
-  ["PWAT","PWAT ", "Attributive Interrogative Pronoun"],
-  ["PWAV","PWAV ", "Adverbial Interrogative Pronoun"],
-  ["PWS","PWS ", "Substitutive Interrogative Pronoun"],
-  ["TRUNC","TRUNC ","Truncated"],
-  ["VAFIN","VAFIN ", "Auxiliary Finite Verb"],
-  ["VAIMP","VAIMP ", "Auxiliary Finite Imperative Verb"],
-  ["VAINF","VAINF ", "Auxiliary Infinite Verb"],
-  ["VAPP","VAPP ", "Auxiliary Perfect Participle"],
-  ["VMFIN","VMFIN ", "Modal Finite Verb"],
-  ["VMINF","VMINF ", "Modal Infinite Verb"],
-  ["VMPP","VMPP ", "Modal Perfect Participle"],
-  ["VVFIN","VVFIN ","Finite Verb"],
-  ["VVIMP","VVIMP ", "Finite Imperative Verb"],
-  ["VVINF","VVINF ", "Infinite Verb"],
-  ["VVIZU","VVIZU ", "Infinite Verb with 'zu'"],
-  ["VVPP","VVPP ", "Perfect Participle"],
-  ["XY", "XY ", "Non-Word"]
-];
-
-
-// http://www.coli.uni-saarland.de/projects/sfb378/negra-corpus/negra-corpus.html
-// http://www.coli.uni-saarland.de/projects/sfb378/negra-corpus/knoten.html
-var negraNodes = [
-  ["AA", "AA", "superlative phrase with 'am'"],
-  ["AP","AP", "adjektive phrase"],
-  ["AVP","AVP", "adverbial phrase"],
-  ["CAP","CAP", "coordinated adjektive phrase"],
-  ["CAVP","CAVP", "coordinated adverbial phrase"],
-  ["CAC","CAC", "coordinated adposition"],
-  ["CCP","CCP", "coordinated complementiser"],
-  ["CH","CH", "chunk"],
-  ["CNP","CNP", "coordinated noun phrase"],
-  ["CO","CO", "coordination"],
-  ["CPP","CPP", "coordinated adpositional phrase"],
-  ["CS","CS", "coordinated sentence"],
-  ["CVP","CVP", "coordinated verb phrase (non-finite)"],
-  ["CVZ","CVZ", "coordinated zu-marked infinitive"],
-  ["DL","DL", "discourse level constituent"],
-  ["ISU","ISU", "idiosyncratis unit"],
-  ["MPN","MPN", "multi-word proper noun"],
-  ["MTA","MTA", "multi-token adjective"],
-  ["NM","NM", "multi-token number"],
-  ["NP","NP", "noun phrase"],
-  ["PP","PP", "adpositional phrase"],
-  ["QL","QL", "quasi-languag"],
-  ["ROOT","ROOT", "root node"],
-  ["S","S", "sentence"],
-  ["VP","VP", "verb phrase (non-finite)"],
-  ["VZ","VZ", "zu-marked infinitive"]
-];
-
-// http://www.coli.uni-saarland.de/projects/sfb378/negra-corpus/kanten.html
-var negraEdges = [
-  ["AC","AC","adpositional case marker"],
-  ["ADC","ADC","adjective component"],
-  ["AMS","AMS","measure argument of adj"],
-  ["APP","APP","apposition"],
-  ["AVC","AVC","adverbial phrase component"],
-  ["CC","CC","comparative complement"],
-  ["CD","CD","coordinating conjunction"],
-  ["CJ","CJ","conjunct"],
-  ["CM","CM","comparative concjunction"],
-  ["CP","CP","complementizer"],
-  ["DA","DA","dative"],
-  ["DH","DH","discourse-level head"],
-  ["DM","DM","discourse marker"],
-  ["GL","GL","prenominal genitive"],
-  ["GR","GR","postnominal genitive"],
-  ["HD","HD","head"],
-  ["JU","JU","junctor"],
-  ["MC","MC","comitative"],
-  ["MI","MI","instrumental"],
-  ["ML","ML","locative"],
-  ["MNR","MNR","postnominal modifier"],
-  ["MO","MO","modifier"],
-  ["MR","MR","rhetorical modifier"],
-  ["MW","MW","way (directional modifier)"],
-  ["NG","NG","negation"],
-  ["NK","NK","noun kernel modifier"],
-  ["NMC","NMC","numerical component"], 
-  ["OA","OA","accusative object"],
-  ["OA2","OA2","second accusative object"], 
-  ["OC","OC","clausal object"],
-  ["OG","OG","genitive object"], 
-  ["PD","PD","predicate"],
-  ["PG","PG","pseudo-genitive"],
-  ["PH","PH","placeholder"],
-  ["PM","PM","morphological particle"],
-  ["PNC","PNC","proper noun component"], 
-  ["RC","RC","relative clause"],
-  ["RE","RE","repeated element"],
-  ["RS","RS","reported speech"],
-  ["SB","SB","subject"],
-  ["SBP","SBP","passivised subject (PP)"], 
-  ["SP","SP","subject or predicate"],
-  ["SVP","SVP","separable verb prefix"],
-  ["UC","UC","(idiosyncratic) unit component"], 
-  ["VO","VO","vocative"]
-];
-
-var mateSttsArray = sttsArray.slice(0);
-mateSttsArray.push(
-  ["<root-POS>","<root-POS>","Root Part of Speech"]
-);
-
-var sgbrSttsArray = sttsArray.slice(0);
-
-// Push specific information for Schreibgebrauch
-sgbrSttsArray.push(
-  ["NNE", "NNE", "Normal Nomina with Named Entity"],
-  ["ADVART","ADVART",   "Adverb with Article"],
-  ["EMOASC","EMOASC",   "ASCII emoticon"],
-  ["EMOIMG","EMOIMG",   "Graphic emoticon"],
-  ["ERRTOK","ERRTOK",   "Tokenisation Error"],
-  ["HST",     "HST",      "Hashtag"],
-  ["KOUSPPER","KOUSPPER", "Subordinating Conjunction (with Sentence) with Personal Pronoun"],
-  ["ONO",     "ONO",      "Onomatopoeia"],
-  ["PPERPPER","PPERPPER", "Personal Pronoun with Personal Pronoun"],
-  ["URL",     "URL",      "Uniform Resource Locator"],
-  ["VAPPER",  "VAPPER",   "Finite Auxiliary Verb with Personal Pronoun"],
-  ["VMPPER",  "VMPPER",   "Fintite Modal Verb with Personal Pronoun"],
-  ["VVPPER",  "VVPPER",   "Finite Full Verb with Personal Pronoun"],
-  ["AW", "AW", "Interaction Word"],
-  ["ADR", "ADR", "Addressing Term"],
-  ["AWIND", "AWIND", "Punctuation Indicating Addressing Term"],
-  ["ERRAW","ERRAW", "Part of Erroneously Separated Compound"]
-  /*
-    As KorAP currently doesn't support these tags, they could also be ommited
-    ["_KOMMA", "_KOMMA", "Comma"],
-    ["_SONST", "_SONST", "Intrasentential Punctuation Mark"],
-    ["_ENDE", "_ENDE", "Punctuation Mark at the end of the Sentence"]
-  */
-);
-
-// Sort by tag
-sgbrSttsArray.sort(function (a,b) { return a[0].localeCompare(b[0]) });
-
-define(function () {
-  var obj = {
-    "-" : [
-      ["Base Annotation", "base/s=", "Structure"],
-//      ["Connexor", "cnx/", "Constituency, Lemma, Morphology, Part-of-Speech, Syntax"],
-      ["CoreNLP", "corenlp/", "Constituency, Named Entities, Part-of-Speech"],
-      ["DeReKo", "dereko/s=", "Structure"],
-      ["DRuKoLa", "drukola/", "Lemma, Morphology, Part-of-Speech"],
-//      ["Mate", "mate/", "Lemma, Morphology, Part-of-Speech"],
-      ["Malt", "malt/", "Dependency"],
-      ["OpenNLP", "opennlp/", "Part-of-Speech"],
-//      ["Schreibgebrauch", "sgbr/", "Lemma, Lemma Variants, Part-of-Speech"],
-      ["TreeTagger", "tt/", "Lemma, Part-of-Speech"],
-//      ["Xerox Parser", "xip/", "Constituency, Lemma, Part-of-Speech"]
-      ["MarMoT", "marmot/", "Morphology, Part-of-Speech"],
-    ],
-    "base/s=" : [
-      ["s", "s", "Sentence"],
-      ["p", "p", "Paragraph"],
-      ["t", "t", "Text"]
-    ],
-    "corenlp/" : [
-      ["Constituency", "c="],
-      ["Named Entity", "ne=" , "Combined"],
-      ["Named Entity", "ne_dewac_175m_600=" , "ne_dewac_175m_600"],
-      ["Named Entity", "ne_hgc_175m_600=",    "ne_hgc_175m_600"],
-      ["Part-of-Speech", "p="]
-    ],
-    "corenlp/ne=" : namedEntities,
-    "corenlp/ne_dewac_175m_600=" : namedEntities,
-    "corenlp/ne_hgc_175m_600=" : namedEntities,
-    "corenlp/p=" : sttsArray,
-    "corenlp/c=" : negraNodes,
-    "cnx/" : [
-      ["Constituency", "c="],
-      ["Lemma", "l="],
-      ["Morphology", "m="],
-      ["Part-of-Speech", "p="],
-      ["Syntax", "syn="]
-    ],
-    "cnx/c=" : [
-      ["np", "np ", "Nominal Phrase"]
-    ],
-    // http://www.ids-mannheim.de/cosmas2/projekt/referenz/connexor/morph.html
-    "cnx/m=" : [
-      ["Abbr","Abbr ", "Nouns: Abbreviation"],
-      ["CMP","CMP ", "Adjective: Comparative"],
-      ["IMP", "IMP ", "Mood: Imperative"],
-      ["IND", "IND ", "Mood: Indicative"],
-      ["INF", "INF ", "Infinitive"],
-      ["ORD","ORD ", "Numeral: Ordinal"],
-      ["PAST", "PAST ", "Tense: past"],
-      ["PCP", "PCP ", "Participle"],
-      ["PERF", "PERF ", "Perfective Participle"],
-      ["PL","PL ", "Nouns: Plural"],
-      ["PRES", "PRES ", "Tense: present"],
-      ["PROG", "PROG ", "Progressive Participle"],
-      ["Prop","Prop ", "Nouns: Proper Noun"],
-      ["SUB", "SUB ", "Mood: Subjunctive"],
-      ["SUP","SUP ", "Adjective: Superlative"]
-    ],
-    // http://www.ids-mannheim.de/cosmas2/projekt/referenz/connexor/morph.html
-    "cnx/p=" : [
-      ["A", "A ", "Adjective"],
-      ["ADV", "ADV ", "Adverb"],
-      ["CC", "CC ", "Coordination Marker"],
-      ["CS", "CS ", "Clause Marker"],
-      ["DET", "DET ", "Determiner"],
-      ["INTERJ", "INTERJ ", "Interjection"],
-      ["N", "N ", "Noun"],
-      ["NUM", "NUM ", "Numeral"],
-      ["PREP", "PREP ", "Preposition"],
-      ["PRON", "PRON ", "Pro-Nominal"],
-      ["V", "V ", "Verb"]
-    ],
-    // http://www.ids-mannheim.de/cosmas2/projekt/referenz/connexor/syntax.html
-    "cnx/syn=" : [
-      ["@ADVL", "@ADVL ", "Adverbial Head"],
-      ["@AUX", "@AUX ", "Auxiliary Verb"],
-      ["@CC", "@CC ", "Coordination"]
-      ["@MAIN", "@MAIN ", "Main Verb"],
-      ["@NH", "@NH ", "Nominal Head"],
-      ["@POSTMOD", "@POSTMOD ", "Postmodifier"],
-      ["@PREMARK", "@PREMARK ", "Preposed Marker"],
-      ["@PREMOD", "@POSTMOD ", "Premodifier"]
-    ],
-    "drukola/" : [
-      ["Lemma", "l="],
-      ["Morphology", "m="],
-      ["Part-of-Speech", "p="]      
-    ],
-    "opennlp/" : [
-      ["Part-of-Speech", "p="]
-    ],
-    "opennlp/p=" : sttsArray,
-    "sgbr/" : [
-      ["Lemma", "l="],
-      ["Lemma Variants", "lv="],
-      ["Part-of-Speech", "p="]
-    ],
-    "sgbr/p=" : sgbrSttsArray,
-    "xip/" : [
-      ["Constituency", "c="],
-      // Inactive: ["Dependency", "d="],
-      ["Lemma", "l="],
-      ["Part-of-Speech", "p="],
-    ],
-    // "xip/c=" : [],
-    // Inactive: "xip/d=" : [],
-    // "xip/p=" : [],
-    "tt/" : [
-      ["Lemma", "l="],
-      ["Part-of-Speech", "p="]
-    ],
-    "tt/p=" : sttsArray,
-    "marmot/" : [
-      ["Morphology", "m="],
-      ["Part-of-Speech", "p="]
-    ],
-    "marmot/p=" : sttsArray,
-    "malt/" : [
-      ["Dependency", "d="]
-    ],
-    "mate/" : [
-      // Inactive: "d" : ["d=", "Dependency"],
-      ["Lemma", "l="],
-      ["Morphology", "m="],
-      ["Part-of-Speech", "p="]
-    ],
-    // Inactive: mate/d=
-    "mate/p=" : mateSttsArray,
-    "mate/m=" : [
-      ["Case", "case:"],
-      ["Degree", "degree:"],
-      ["Gender", "gender:"],
-      ["Mood", "mood:"],
-      ["Number", "number:"],
-      ["Person", "person:"],
-      ["Tense","tense:"],
-      ["No type", "<no-type> "]
-    ],
-    "marmot/m=" : [
-      ["Case", "case:"],
-      ["Degree", "degree:"],
-      ["Gender", "gender:"],
-      ["Mood", "mood:"],
-      ["Number", "number:"],
-      ["Person", "person:"],
-      ["Tense","tense:"],
-      ["No type", "<no-type> "]
-    ],
-    "mate/m=case:" : [
-      ["acc", "acc ", "Accusative"],
-      ["dat","dat ", "Dative"],
-      ["gen", "gen ","Genitive"],
-      ["nom","nom ", "Nominative"],
-      ["*","* ", "Undefined"]
-    ],
-    "marmot/m=case:" : [
-      ["acc", "acc ", "Accusative"],
-      ["dat","dat ", "Dative"],
-      ["gen", "gen ","Genitive"],
-      ["nom","nom ", "Nominative"],
-      ["*","* ", "Undefined"]
-    ],
-    "mate/m=degree:" : [
-      ["comp","comp ", "Comparative"],
-      ["pos","pos ", "Positive"],
-      ["sup","sup ", "Superative"]
-    ],
-    "marmot/m=degree:" : [
-      ["comp","comp ", "Comparative"],
-      ["pos","pos ", "Positive"],
-      ["sup","sup ", "Superative"]
-    ],
-    "mate/m=gender:" : [
-      ["fem", "fem ", "Feminium"],
-      ["masc", "masc ", "Masculinum"],
-      ["neut","neut ", "Neuter"],
-      ["*","* ","Undefined"]
-    ],
-    "marmot/m=gender:" : [
-      ["fem", "fem ", "Feminium"],
-      ["masc", "masc ", "Masculinum"],
-      ["neut","neut ", "Neuter"],
-      ["*","* ","Undefined"]
-    ],
-    "mate/m=mood:" : [
-      ["imp","imp ", "Imperative"],
-      ["ind","ind ", "Indicative"],
-      ["subj","subj ", "Subjunctive"]
-    ],
-    "marmot/m=mood:" : [
-      ["imp","imp ", "Imperative"],
-      ["ind","ind ", "Indicative"],
-      ["subj","subj ", "Subjunctive"]
-    ], 
-    "mate/m=number:" : [
-      ["pl","pl ","Plural"],
-      ["sg","sg ","Singular"],
-      ["*","* ","Undefined"]
-    ],
-    "marmot/m=number" : [
-      ["pl","pl ","Plural"],
-      ["sg","sg ","Singular"],
-      ["*","* ","Undefined"]
-    ],
-    "mate/m=person:" : [
-      ["1","1 ", "First Person"],
-      ["2","2 ", "Second Person"],
-      ["3","3 ", "Third Person"]
-    ],
-    "marmot/m=person:" : [
-      ["1","1 ", "First Person"],
-      ["2","2 ", "Second Person"],
-      ["3","3 ", "Third Person"]
-    ],
-    "mate/m=tense:" : [
-      ["past","past ", "Past"],
-      ["pres","pres ", "Present"]
-    ],
-    "marmot/m=tense:" : [
-      ["past","past ", "Past"],
-      ["pres","pres ", "Present"]
-    ],
-    "malt/d=" : [
-      ["-PUNCT-", "-PUNCT- "],
-      ["-UNKNOWN-","-UNKNOWN- "],
-      ["ADV","ADV "],
-      ["APP","APP "],
-      ["ATTR","ATTR "],
-      ["AUX","AUX "],
-      ["AVZ","AVZ "],
-      ["CJ","CJ "],
-      ["DET","DET "],
-      ["EXPL","EXPL "],
-      ["GMOD","GMOD "],
-      ["GRAD","GRAD "],
-      ["KOM","KOM "],
-      ["KON","KON "],
-      ["KONJ","KONJ "],
-      ["NEB","NEB "],
-      ["OBJA","OBJA "],
-      ["OBJC","OBJC "],
-      ["OBJD","OBJD "],
-      ["OBJG","OBJG "],
-      ["OBJI","OBJI "],
-      ["OBJP","OBJP "],
-      ["PAR","PAR "],
-      ["PART","PART "],
-      ["PN","PN "],
-      ["PP","PP "],
-      ["PRED","PRED "],
-      ["REL","REL "],
-      ["ROOT","ROOT "],
-      ["S","S "],
-      ["SUBJ","SUBJ "],
-      ["SUBJC","SUBJC "],
-      ["ZEIT","ZEIT "],
-      ["gmod-app","gmod-app "],
-      ["koord","koord "]
-    ]
-  };
-
-  for (var i in negraNodes) {
-    obj["corenlp/c=" + negraNodes[i][0] + '-'] = negraEdges;
-  };
-
-  return obj;
-});
diff --git a/dev/js/src/hint/foundries/base.js b/dev/js/src/hint/foundries/base.js
new file mode 100644
index 0000000..0bb26fc
--- /dev/null
+++ b/dev/js/src/hint/foundries/base.js
@@ -0,0 +1,11 @@
+var ah = KorAP.annotationHelper = KorAP.annotationHelper || { "-" : [] };
+
+ah["-"].push(
+  ["Base Annotation", "base/s=", "Structure"]
+);
+
+ah["base/s="] = [
+  ["s", "s", "Sentence"],
+  ["p", "p", "Paragraph"],
+  ["t", "t", "Text"]
+];
diff --git a/dev/js/src/hint/foundries/cnx.js b/dev/js/src/hint/foundries/cnx.js
new file mode 100644
index 0000000..0c6f8cb
--- /dev/null
+++ b/dev/js/src/hint/foundries/cnx.js
@@ -0,0 +1,63 @@
+var ah = KorAP.annotationHelper = KorAP.annotationHelper || { "-" : [] };
+
+ah["-"].push(
+  ["Connexor", "cnx/", "Constituency, Lemma, Morphology, Part-of-Speech, Syntax"]
+);
+
+ah["cnx/"] = [
+  ["Constituency", "c="],
+  ["Lemma", "l="],
+  ["Morphology", "m="],
+  ["Part-of-Speech", "p="],
+  ["Syntax", "syn="]
+];
+
+ah["cnx/c="] = [
+  ["np", "np ", "Nominal Phrase"]
+];
+
+// http://www.ids-mannheim.de/cosmas2/projekt/referenz/connexor/morph.html
+ah["cnx/m="] = [
+  ["Abbr","Abbr ", "Nouns: Abbreviation"],
+  ["CMP","CMP ", "Adjective: Comparative"],
+  ["IMP", "IMP ", "Mood: Imperative"],
+  ["IND", "IND ", "Mood: Indicative"],
+  ["INF", "INF ", "Infinitive"],
+  ["ORD","ORD ", "Numeral: Ordinal"],
+  ["PAST", "PAST ", "Tense: past"],
+  ["PCP", "PCP ", "Participle"],
+  ["PERF", "PERF ", "Perfective Participle"],
+  ["PL","PL ", "Nouns: Plural"],
+  ["PRES", "PRES ", "Tense: present"],
+  ["PROG", "PROG ", "Progressive Participle"],
+  ["Prop","Prop ", "Nouns: Proper Noun"],
+  ["SUB", "SUB ", "Mood: Subjunctive"],
+  ["SUP","SUP ", "Adjective: Superlative"]
+];
+
+// http://www.ids-mannheim.de/cosmas2/projekt/referenz/connexor/morph.html
+ah["cnx/p="] = [
+  ["A", "A ", "Adjective"],
+  ["ADV", "ADV ", "Adverb"],
+  ["CC", "CC ", "Coordination Marker"],
+  ["CS", "CS ", "Clause Marker"],
+  ["DET", "DET ", "Determiner"],
+  ["INTERJ", "INTERJ ", "Interjection"],
+  ["N", "N ", "Noun"],
+  ["NUM", "NUM ", "Numeral"],
+  ["PREP", "PREP ", "Preposition"],
+  ["PRON", "PRON ", "Pro-Nominal"],
+  ["V", "V ", "Verb"]
+];
+
+// http://www.ids-mannheim.de/cosmas2/projekt/referenz/connexor/syntax.html
+ah["cnx/syn="] = [
+  ["@ADVL", "@ADVL ", "Adverbial Head"],
+  ["@AUX", "@AUX ", "Auxiliary Verb"],
+  ["@CC", "@CC ", "Coordination"]
+  ["@MAIN", "@MAIN ", "Main Verb"],
+  ["@NH", "@NH ", "Nominal Head"],
+  ["@POSTMOD", "@POSTMOD ", "Postmodifier"],
+  ["@PREMARK", "@PREMARK ", "Preposed Marker"],
+  ["@PREMOD", "@POSTMOD ", "Premodifier"]
+];
diff --git a/dev/js/src/hint/foundries/corenlp.js b/dev/js/src/hint/foundries/corenlp.js
new file mode 100644
index 0000000..b591c62
--- /dev/null
+++ b/dev/js/src/hint/foundries/corenlp.js
@@ -0,0 +1,112 @@
+require(["hint/foundries/stts"], function (sttsArray) {
+  var ah = KorAP.annotationHelper = KorAP.annotationHelper || { "-" : [] };
+
+  var namedEntities = [
+    ["I-LOC",  "I-LOC ",  "Location"],
+    ["I-MISC", "I-MISC ", "Miscellaneous"],
+    ["I-ORG",  "I-ORG ",  "Organization"],
+    ["I-PER",  "I-PER ",  "Person"]
+  ];
+
+  // http://www.coli.uni-saarland.de/projects/sfb378/negra-corpus/negra-corpus.html
+  // http://www.coli.uni-saarland.de/projects/sfb378/negra-corpus/knoten.html
+  var negraNodes = [
+    ["AA", "AA", "superlative phrase with 'am'"],
+    ["AP","AP", "adjektive phrase"],
+    ["AVP","AVP", "adverbial phrase"],
+    ["CAP","CAP", "coordinated adjektive phrase"],
+    ["CAVP","CAVP", "coordinated adverbial phrase"],
+    ["CAC","CAC", "coordinated adposition"],
+    ["CCP","CCP", "coordinated complementiser"],
+    ["CH","CH", "chunk"],
+    ["CNP","CNP", "coordinated noun phrase"],
+    ["CO","CO", "coordination"],
+    ["CPP","CPP", "coordinated adpositional phrase"],
+    ["CS","CS", "coordinated sentence"],
+    ["CVP","CVP", "coordinated verb phrase (non-finite)"],
+    ["CVZ","CVZ", "coordinated zu-marked infinitive"],
+    ["DL","DL", "discourse level constituent"],
+    ["ISU","ISU", "idiosyncratis unit"],
+    ["MPN","MPN", "multi-word proper noun"],
+    ["MTA","MTA", "multi-token adjective"],
+    ["NM","NM", "multi-token number"],
+    ["NP","NP", "noun phrase"],
+    ["PP","PP", "adpositional phrase"],
+    ["QL","QL", "quasi-languag"],
+    ["ROOT","ROOT", "root node"],
+    ["S","S", "sentence"],
+    ["VP","VP", "verb phrase (non-finite)"],
+    ["VZ","VZ", "zu-marked infinitive"]
+  ];
+
+  // http://www.coli.uni-saarland.de/projects/sfb378/negra-corpus/kanten.html
+  var negraEdges = [
+    ["AC","AC","adpositional case marker"],
+    ["ADC","ADC","adjective component"],
+    ["AMS","AMS","measure argument of adj"],
+    ["APP","APP","apposition"],
+    ["AVC","AVC","adverbial phrase component"],
+    ["CC","CC","comparative complement"],
+    ["CD","CD","coordinating conjunction"],
+    ["CJ","CJ","conjunct"],
+    ["CM","CM","comparative concjunction"],
+    ["CP","CP","complementizer"],
+    ["DA","DA","dative"],
+    ["DH","DH","discourse-level head"],
+    ["DM","DM","discourse marker"],
+    ["GL","GL","prenominal genitive"],
+    ["GR","GR","postnominal genitive"],
+    ["HD","HD","head"],
+    ["JU","JU","junctor"],
+    ["MC","MC","comitative"],
+    ["MI","MI","instrumental"],
+    ["ML","ML","locative"],
+    ["MNR","MNR","postnominal modifier"],
+    ["MO","MO","modifier"],
+    ["MR","MR","rhetorical modifier"],
+    ["MW","MW","way (directional modifier)"],
+    ["NG","NG","negation"],
+    ["NK","NK","noun kernel modifier"],
+    ["NMC","NMC","numerical component"], 
+    ["OA","OA","accusative object"],
+    ["OA2","OA2","second accusative object"], 
+    ["OC","OC","clausal object"],
+    ["OG","OG","genitive object"], 
+    ["PD","PD","predicate"],
+    ["PG","PG","pseudo-genitive"],
+    ["PH","PH","placeholder"],
+    ["PM","PM","morphological particle"],
+    ["PNC","PNC","proper noun component"], 
+    ["RC","RC","relative clause"],
+    ["RE","RE","repeated element"],
+    ["RS","RS","reported speech"],
+    ["SB","SB","subject"],
+    ["SBP","SBP","passivised subject (PP)"], 
+    ["SP","SP","subject or predicate"],
+    ["SVP","SVP","separable verb prefix"],
+    ["UC","UC","(idiosyncratic) unit component"], 
+    ["VO","VO","vocative"]
+  ];
+
+  ah["-"].push(
+    ["CoreNLP", "corenlp/", "Constituency, Named Entities, Part-of-Speech"]
+  );
+
+  ah["corenlp/"] = [
+    ["Constituency", "c="],
+    ["Named Entity", "ne=" , "Combined"],
+    ["Named Entity", "ne_dewac_175m_600=" , "ne_dewac_175m_600"],
+    ["Named Entity", "ne_hgc_175m_600=",    "ne_hgc_175m_600"],
+    ["Part-of-Speech", "p="]
+  ];
+
+  ah["corenlp/ne="] = namedEntities;
+  ah["corenlp/ne_dewac_175m_600="] = namedEntities;
+  ah["corenlp/ne_hgc_175m_600="] = namedEntities;
+  ah["corenlp/p="] = sttsArray;
+  ah["corenlp/c="] = negraNodes;
+
+  for (var i in negraNodes) {
+    ah["corenlp/c=" + negraNodes[i][0] + '-'] = negraEdges;
+  };
+});
diff --git a/dev/js/src/hint/foundries/dereko.js b/dev/js/src/hint/foundries/dereko.js
new file mode 100644
index 0000000..c8afe08
--- /dev/null
+++ b/dev/js/src/hint/foundries/dereko.js
@@ -0,0 +1,5 @@
+var ah = KorAP.annotationHelper = KorAP.annotationHelper || { "-" : [] };
+
+ah["-"].push(
+  ["DeReKo", "dereko/s=", "Structure"]
+);
diff --git a/dev/js/src/hint/foundries/drukola.js b/dev/js/src/hint/foundries/drukola.js
new file mode 100644
index 0000000..2fec26d
--- /dev/null
+++ b/dev/js/src/hint/foundries/drukola.js
@@ -0,0 +1,105 @@
+var ah = KorAP.annotationHelper = KorAP.annotationHelper || { "-" : [] };
+
+ah["-"].push(
+  ["DRuKoLa", "drukola/", "Lemma, Morphology, Part-of-Speech"]
+);
+
+ah["drukola/"] = [
+  ["Lemma", "l="],
+  ["Morphology", "m="],
+  ["Part-of-Speech", "p="]      
+];
+
+ah["drukola/m="] =  [
+  ["CTAG", "ctag:"]
+];
+
+ah["drukola/m=ctag:"] = [
+  ["A","A ","Adjective"],
+  ["Y","Y ","Abbreviation"],
+  ["AN","AN ","Adjective, Indefinite"],
+  ["APRY","APRY ","Adjective, Plural, Direct, Definite"],
+  ["APN","APN ","Adjective, Plural, Indefinite"],
+  ["APOY","APOY ","Adjective, Plural, Oblique, Definite"],
+  ["APON","APON ","Adjective, Plural, Oblique, Indefinite"],
+  ["ASRY","ASRY ","Adjective, Singular, Direct, Definite"],
+  ["ASN","ASN ","Adjective, Singular, Indefinite"],
+  ["ASOY","ASOY ","Adjective, Singular, Oblique, Definite"],
+  ["ASON","ASON ","Adjective, Singular, Oblique, Indefinite"],
+  ["ASVY","ASVY ","Adjective, Singular, Vocative, Definite"],
+  ["ASVN","ASVN ","Adjective, Singular, Vocative, Indefinite"],
+  ["R","R ","Adverb"],
+  ["RC","RC ","Adverb, Portmanteau"],
+  ["TS","TS ","Article, Definite or Possessive, Singular"],
+  ["TP","TP ","Article, Indefinite or Possessive, Plural"],
+  ["TPR","TPR ","Article, non-Possessive, Plural, Direct"],
+  ["TPO","TPO ","Article, non-Possessive, Plural, Oblique"],
+  ["TSR","TSR ","Article, non-Possessive, Singular, Direct"],
+  ["TSO","TSO ","Article, non-Possessive, Singular, Oblique"],
+  ["NPRY","NPRY ","Common Noun, Plural, Direct, Definite"],
+  ["NPN","NPN ","Common Noun, Plural, Indefinite"],
+  ["NPOY","NPOY ","Common Noun, Plural, Oblique, Definite"],
+  ["NPVY","NPVY ","Common Noun, Plural, Vocative, Definite"],
+  ["NN","NN ","Common Noun, singular"],
+  ["NSY","NSY ","Common Noun, Singular, Definite"],
+  ["NSRY","NSRY ","Common Noun, Singular, Direct, Definite"],
+  ["NSRN","NSRN ","Common Noun, Singular, Direct, Indefinite"],
+  ["NSN","NSN ","Common Noun, Singular, Indefinite"],
+  ["NSOY","NSOY ","Common Noun, Singular, Oblique, Definite"],
+  ["NSON","NSON ","Common Noun, Singular, Oblique, Indefinite"],
+  ["NSVY","NSVY ","Common Noun, Singular, Vocative, Definite"],
+  ["NSVN","NSVN ","Common Noun, Singular, Vocative, Indefinite"],
+  ["CR","CR ","Conjunctio, portmanteau"],
+  ["C","C ","Conjunction"],
+  ["QF","QF ","Future Particle"],
+  ["QN","QN ","Infinitival Particle"],
+  ["I","I ","Interjection"],
+  ["QZ","QZ ","Negative Particle"],
+  ["M","M ","Numeral"],
+  ["PP","PP ","Personal Pronoun"],
+  ["PPP","PPP ","Personal Pronoun, Plural"],
+  ["PPPA","PPPA ","Personal Pronoun, Plural, Acc."],
+  ["PPPD","PPPD ","Personal Pronoun, Plural, Dative"],
+  ["PPPR","PPPR ","Personal Pronoun, Plural, Direct"],
+  ["PPPO","PPPO ","Personal Pronoun, Plural, Oblique"],
+  ["PPS","PPS ","Personal Pronoun, Singular"],
+  ["PPSA","PPSA ","Personal Pronoun, Singular, Accusative"],
+  ["PPSD","PPSD ","Personal Pronoun, Singular, Dative"],
+  ["PPSR","PPSR ","Personal Pronoun, Singular, Direct"],
+  ["PPSN","PPSN ","Personal Pronoun, Singular, Nominative"],
+  ["PPSO","PPSO ","Personal Pronoun, Singular, Oblique"],
+  ["S","S ","Preposition"],
+  ["DMPR","DMPR ","Pronoun or Determiner, Demonstrative, Plural, Direct"],
+  ["DMPO","DMPO ","Pronoun or Determiner, Demonstrative, Plural, Oblique"],
+  ["DMSR","DMSR ","Pronoun or Determiner, Demonstrative, Singular, Direct"],
+  ["DMSO","DMSO ","Pronoun or Determiner, Demonstrative, Singular, Oblique"],
+  ["PS","PS ","Pronoun or Determiner, Poss or Emph"],
+  ["PSS","PSS ","Pronoun or Determiner, Poss or Emph, Singular"],
+  ["RELR","RELR ","Pronoun or Determiner, Relative, Direct"],
+  ["RELO","RELO ","Pronoun or Determiner, Relative, Oblique"],
+  ["NP","NP ","Proper Noun"],
+  ["PI","PI ","Quantifier Pronoun or Determiner"],
+  ["PXA","PXA ","Reflexive Pronoun, Accusative"],
+  ["PXD","PXD ","Reflexive Pronoun, Dative"],
+  ["X","X ","Residual"],
+  ["QS","QS ","Subjunctive Particle"],
+  ["VA","VA ","Verb, Auxiliary"],
+  ["VA1","VA1 ","Verb, Auxiliary, 1st person"],
+  ["VA2P","VA2P ","Verb, Auxiliary, 2nd person, Plural"],
+  ["VA2S","VA2S ","Verb, Auxiliary, 2nd person, Singular"],
+  ["VA3","VA3 ","Verb, Auxiliary, 3rd person"],
+  ["VA3P","VA3P ","Verb, Auxiliary, 3rd person, Plural"],
+  ["VA3S","VA3S ","Verb, Auxiliary, 3rd person, Singular"],
+  ["VA1P","VA1P ","Verb, Auxiliary,1st person, Plural"],
+  ["VA1S","VA1S ","Verb, Auxiliary,1st person, Singular"],
+  ["VG","VG ","Verb, Gerund"],
+  ["VN","VN ","Verb, Infinitive"],
+  ["V1","V1 ","Verb, Main, 1st person"],
+  ["V2","V2 ","Verb, Main, 2nd person"],
+  ["V3","V3 ","Verb, Main, 3rd person"],
+  ["VPPF","VPPF ","Verb, Participle, Plural, Feminine"],
+  ["VPPM","VPPM ","Verb, Participle, Plural, Masculine"],
+  ["VPSF","VPSF ","Verb, Participle, Singular, Feminine"],
+  ["VPSM","VPSM ","Verb, Participle, Singular, Masculine"]
+];
+
diff --git a/dev/js/src/hint/foundries/malt.js b/dev/js/src/hint/foundries/malt.js
new file mode 100644
index 0000000..c81df9e
--- /dev/null
+++ b/dev/js/src/hint/foundries/malt.js
@@ -0,0 +1,47 @@
+var ah = KorAP.annotationHelper = KorAP.annotationHelper || { "-" : [] };
+
+ah["-"].push(
+  ["Malt", "malt/", "Dependency"]
+);
+
+ah["malt/"] = [
+  ["Dependency", "d="]
+];
+
+ah["malt/d="] = [
+  ["-PUNCT-", "-PUNCT- "],
+  ["-UNKNOWN-","-UNKNOWN- "],
+  ["ADV","ADV "],
+  ["APP","APP "],
+  ["ATTR","ATTR "],
+  ["AUX","AUX "],
+  ["AVZ","AVZ "],
+  ["CJ","CJ "],
+  ["DET","DET "],
+  ["EXPL","EXPL "],
+  ["GMOD","GMOD "],
+  ["GRAD","GRAD "],
+  ["KOM","KOM "],
+  ["KON","KON "],
+  ["KONJ","KONJ "],
+  ["NEB","NEB "],
+  ["OBJA","OBJA "],
+  ["OBJC","OBJC "],
+  ["OBJD","OBJD "],
+  ["OBJG","OBJG "],
+  ["OBJI","OBJI "],
+  ["OBJP","OBJP "],
+  ["PAR","PAR "],
+  ["PART","PART "],
+  ["PN","PN "],
+  ["PP","PP "],
+  ["PRED","PRED "],
+  ["REL","REL "],
+  ["ROOT","ROOT "],
+  ["S","S "],
+  ["SUBJ","SUBJ "],
+  ["SUBJC","SUBJC "],
+  ["ZEIT","ZEIT "],
+  ["gmod-app","gmod-app "],
+  ["koord","koord "]
+];
diff --git a/dev/js/src/hint/foundries/marmot.js b/dev/js/src/hint/foundries/marmot.js
new file mode 100644
index 0000000..0b80292
--- /dev/null
+++ b/dev/js/src/hint/foundries/marmot.js
@@ -0,0 +1,69 @@
+require(["hint/foundries/stts"], function () {
+  var ah = KorAP.annotationHelper = KorAP.annotationHelper || { "-" : [] };
+
+  ah["-"].push(
+    ["MarMoT", "marmot/", "Morphology, Part-of-Speech"]
+  );
+
+  ah["marmot/"] = [
+    ["Morphology", "m="],
+    ["Part-of-Speech", "p="]
+  ];
+
+  ah["marmot/p="] = sttsArray;
+
+  ah["marmot/m="] = [
+    ["Case", "case:"],
+    ["Degree", "degree:"],
+    ["Gender", "gender:"],
+    ["Mood", "mood:"],
+    ["Number", "number:"],
+    ["Person", "person:"],
+    ["Tense","tense:"],
+    ["No type", "<no-type> "]
+  ];
+
+  ah["marmot/m=case:"] = [
+    ["acc", "acc ", "Accusative"],
+    ["dat","dat ", "Dative"],
+    ["gen", "gen ","Genitive"],
+    ["nom","nom ", "Nominative"],
+    ["*","* ", "Undefined"]
+  ];
+
+  ah["marmot/m=degree:"] = [
+    ["comp","comp ", "Comparative"],
+    ["pos","pos ", "Positive"],
+    ["sup","sup ", "Superative"]
+  ];
+  
+  ah["marmot/m=gender:"] = [
+    ["fem", "fem ", "Feminium"],
+    ["masc", "masc ", "Masculinum"],
+    ["neut","neut ", "Neuter"],
+    ["*","* ","Undefined"]
+  ];
+
+  ah["marmot/m=mood:"] = [
+    ["imp","imp ", "Imperative"],
+    ["ind","ind ", "Indicative"],
+    ["subj","subj ", "Subjunctive"]
+  ];
+
+  ah["marmot/m=number"] = [
+    ["pl","pl ","Plural"],
+    ["sg","sg ","Singular"],
+    ["*","* ","Undefined"]
+  ];
+
+  ah["marmot/m=person:"] = [
+    ["1","1 ", "First Person"],
+    ["2","2 ", "Second Person"],
+    ["3","3 ", "Third Person"]
+  ];
+
+  ah["marmot/m=tense:"] = [
+    ["past","past ", "Past"],
+    ["pres","pres ", "Present"]
+  ];
+});
diff --git a/dev/js/src/hint/foundries/mate.js b/dev/js/src/hint/foundries/mate.js
new file mode 100644
index 0000000..d837fd7
--- /dev/null
+++ b/dev/js/src/hint/foundries/mate.js
@@ -0,0 +1,76 @@
+require(["hint/foundries/stts"], function (sttsArray) {
+  var mateSttsArray = sttsArray.slice(0);
+  mateSttsArray.push(
+    ["<root-POS>","<root-POS>","Root Part of Speech"]
+  );
+
+  var ah = KorAP.annotationHelper = KorAP.annotationHelper || { "-" : [] };
+
+  ah["-"].push(
+    ["Mate", "mate/", "Lemma, Morphology, Part-of-Speech"]
+  );
+
+  ah["mate/"] = [
+    // Inactive: "d" : ["d=", "Dependency"],
+    ["Lemma", "l="],
+    ["Morphology", "m="],
+    ["Part-of-Speech", "p="]
+  ];
+
+  // Inactive: mate/d=
+  ah["mate/p="] = mateSttsArray;
+
+  ah["mate/m="] = [
+    ["Case", "case:"],
+    ["Degree", "degree:"],
+    ["Gender", "gender:"],
+    ["Mood", "mood:"],
+    ["Number", "number:"],
+    ["Person", "person:"],
+    ["Tense","tense:"],
+    ["No type", "<no-type> "]
+  ];
+
+  ah["mate/m=case:"] = [
+    ["acc", "acc ", "Accusative"],
+    ["dat","dat ", "Dative"],
+    ["gen", "gen ","Genitive"],
+    ["nom","nom ", "Nominative"],
+    ["*","* ", "Undefined"]
+  ];
+
+  ah["mate/m=degree:"] = [
+    ["comp","comp ", "Comparative"],
+    ["pos","pos ", "Positive"],
+    ["sup","sup ", "Superative"]
+  ];
+
+  ah["mate/m=gender:"] = [
+    ["fem", "fem ", "Feminium"],
+    ["masc", "masc ", "Masculinum"],
+    ["neut","neut ", "Neuter"],
+    ["*","* ","Undefined"]
+  ];
+
+  ah["mate/m=mood:"] = [
+    ["imp","imp ", "Imperative"],
+    ["ind","ind ", "Indicative"],
+    ["subj","subj ", "Subjunctive"]
+  ];
+
+  ah["mate/m=number:"] = [
+    ["pl","pl ","Plural"],
+    ["sg","sg ","Singular"],
+    ["*","* ","Undefined"]
+  ];
+
+  ah["mate/m=person:"] = [
+    ["1","1 ", "First Person"],
+    ["2","2 ", "Second Person"],
+    ["3","3 ", "Third Person"]
+  ];
+  ah["mate/m=tense:"] = [
+    ["past","past ", "Past"],
+    ["pres","pres ", "Present"]
+  ];
+});
diff --git a/dev/js/src/hint/foundries/opennlp.js b/dev/js/src/hint/foundries/opennlp.js
new file mode 100644
index 0000000..267bf8d
--- /dev/null
+++ b/dev/js/src/hint/foundries/opennlp.js
@@ -0,0 +1,14 @@
+require(["hint/foundries/stts"], function (sttsArray) {
+  
+  var ah = KorAP.annotationHelper = KorAP.annotationHelper || { "-" : [] };
+
+  ah["-"].push(
+    ["OpenNLP", "opennlp/", "Part-of-Speech"]
+  );
+
+  ah["opennlp/"] = [
+    ["Part-of-Speech", "p="]
+  ];
+
+  ah["opennlp/p="] = sttsArray;
+});
diff --git a/dev/js/src/hint/foundries/schreibgebrauch.js b/dev/js/src/hint/foundries/schreibgebrauch.js
new file mode 100644
index 0000000..7cce57e
--- /dev/null
+++ b/dev/js/src/hint/foundries/schreibgebrauch.js
@@ -0,0 +1,48 @@
+require(["hint/foundries/stts"], function (sttsArray) {
+  var ah = KorAP.annotationHelper = KorAP.annotationHelper || { "-" : [] };
+
+  var sgbrSttsArray = sttsArray.slice(0);
+
+  // Push specific information for Schreibgebrauch
+  sgbrSttsArray.push(
+    ["NNE", "NNE", "Normal Nomina with Named Entity"],
+    ["ADVART","ADVART",   "Adverb with Article"],
+    ["EMOASC","EMOASC",   "ASCII emoticon"],
+    ["EMOIMG","EMOIMG",   "Graphic emoticon"],
+    ["ERRTOK","ERRTOK",   "Tokenisation Error"],
+    ["HST",     "HST",      "Hashtag"],
+    ["KOUSPPER","KOUSPPER", "Subordinating Conjunction (with Sentence) with Personal Pronoun"],
+    ["ONO",     "ONO",      "Onomatopoeia"],
+    ["PPERPPER","PPERPPER", "Personal Pronoun with Personal Pronoun"],
+    ["URL",     "URL",      "Uniform Resource Locator"],
+    ["VAPPER",  "VAPPER",   "Finite Auxiliary Verb with Personal Pronoun"],
+    ["VMPPER",  "VMPPER",   "Fintite Modal Verb with Personal Pronoun"],
+    ["VVPPER",  "VVPPER",   "Finite Full Verb with Personal Pronoun"],
+    ["AW", "AW", "Interaction Word"],
+    ["ADR", "ADR", "Addressing Term"],
+    ["AWIND", "AWIND", "Punctuation Indicating Addressing Term"],
+    ["ERRAW","ERRAW", "Part of Erroneously Separated Compound"]
+    /*
+      As KorAP currently doesn't support these tags, they could also be ommited
+      ["_KOMMA", "_KOMMA", "Comma"],
+      ["_SONST", "_SONST", "Intrasentential Punctuation Mark"],
+      ["_ENDE", "_ENDE", "Punctuation Mark at the end of the Sentence"]
+    */
+  );
+
+  // Sort by tag
+  sgbrSttsArray.sort(function (a,b) { return a[0].localeCompare(b[0]) });
+
+  
+  ah["-"].push(
+    ["Schreibgebrauch", "sgbr/", "Lemma, Lemma Variants, Part-of-Speech"]
+  );
+
+  ah["sgbr/"] = [
+    ["Lemma", "l="],
+    ["Lemma Variants", "lv="],
+    ["Part-of-Speech", "p="]
+  ];
+
+  ah["sgbr/p="] = sgbrSttsArray;
+});
diff --git a/dev/js/src/hint/foundries/stts.js b/dev/js/src/hint/foundries/stts.js
new file mode 100644
index 0000000..f7d3b62
--- /dev/null
+++ b/dev/js/src/hint/foundries/stts.js
@@ -0,0 +1,59 @@
+define(function () {
+  return [
+    // http://www.ids-mannheim.de/cosmas2/projekt/referenz/stts/morph.html
+    // http://nachhalt.sfb632.uni-potsdam.de/owl-docu/stts.html
+    // "$.", "$(", "$,"
+    ["ADJA","ADJA ", "Attributive Adjective"],
+    ["ADJD","ADJD ", "Predicative Adjective"],
+    ["ADV","ADV ", "Adverb"],
+    ["APPO","APPO ", "Postposition"],
+    ["APPR","APPR ", "Preposition"],
+    ["APPRART","APPRART ", "Preposition with Determiner"],
+    ["APZR","APZR ","Right Circumposition"],
+    ["ART","ART ", "Determiner"],
+    ["CARD","CARD ", "Cardinal Number"],
+    ["FM","FM ", "Foreign Material"],
+    ["ITJ","ITJ ", "Interjection"],
+    ["KOKOM","KOKOM ", "Comparison Particle"],
+    ["KON","KON ", "Coordinating Conjuncion"],
+    ["KOUI","KOUI ", "Subordinating Conjunction with 'zu'"],
+    ["KOUS","KOUS ", "Subordinating Conjunction with Sentence"],
+    ["NE","NE ", "Named Entity"],
+    ["NN","NN ", "Normal Nomina"],
+    ["PAV", "PAV ", "Pronominal Adverb"],
+    ["PDAT","PDAT ","Attributive Demonstrative Pronoun"],
+    ["PDS","PDS ", "Substitutive Demonstrative Pronoun"],
+    ["PIAT","PIAT ", "Attributive Indefinite Pronoun without Determiner"],
+    ["PIDAT","PIDAT ", "Attributive Indefinite Pronoun with Determiner"],
+    ["PIS","PIS ", "Substitutive Indefinite Pronoun"],
+    ["PPER","PPER ", "Personal Pronoun"],
+    ["PPOSAT","PPOSAT ", "Attributive Possessive Pronoun"],
+    ["PPOSS","PPOSS ", "Substitutive Possessive Pronoun"],
+    ["PRELAT","PRELAT ", "Attributive Relative Pronoun"],
+    ["PRELS","PRELS ", "Substitutive Relative Pronoun"],
+    ["PRF","PRF ", "Reflexive Pronoun"],
+    ["PROAV","PROAV ", "Pronominal Adverb"],
+    ["PTKA","PTKA ","Particle with Adjective"],
+    ["PTKANT","PTKANT ", "Answering Particle"],
+    ["PTKNEG","PTKNEG ", "Negation Particle"],
+    ["PTKVZ","PTKVZ ", "Separated Verbal Particle"],
+    ["PTKZU","PTKZU ", "'zu' Particle"],
+    ["PWAT","PWAT ", "Attributive Interrogative Pronoun"],
+    ["PWAV","PWAV ", "Adverbial Interrogative Pronoun"],
+    ["PWS","PWS ", "Substitutive Interrogative Pronoun"],
+    ["TRUNC","TRUNC ","Truncated"],
+    ["VAFIN","VAFIN ", "Auxiliary Finite Verb"],
+    ["VAIMP","VAIMP ", "Auxiliary Finite Imperative Verb"],
+    ["VAINF","VAINF ", "Auxiliary Infinite Verb"],
+    ["VAPP","VAPP ", "Auxiliary Perfect Participle"],
+    ["VMFIN","VMFIN ", "Modal Finite Verb"],
+    ["VMINF","VMINF ", "Modal Infinite Verb"],
+    ["VMPP","VMPP ", "Modal Perfect Participle"],
+    ["VVFIN","VVFIN ","Finite Verb"],
+    ["VVIMP","VVIMP ", "Finite Imperative Verb"],
+    ["VVINF","VVINF ", "Infinite Verb"],
+    ["VVIZU","VVIZU ", "Infinite Verb with 'zu'"],
+    ["VVPP","VVPP ", "Perfect Participle"],
+    ["XY", "XY ", "Non-Word"]
+  ];
+});
diff --git a/dev/js/src/hint/foundries/treetagger.js b/dev/js/src/hint/foundries/treetagger.js
new file mode 100644
index 0000000..35fcfcc
--- /dev/null
+++ b/dev/js/src/hint/foundries/treetagger.js
@@ -0,0 +1,14 @@
+require(["hint/foundries/stts"], function (sttsArray) {
+  var ah = KorAP.annotationHelper = KorAP.annotationHelper || { "-" : [] };
+
+  ah["-"].push(
+    ["TreeTagger", "tt/", "Lemma, Part-of-Speech"]
+  );
+
+  ah["tt/"] = [
+    ["Lemma", "l="],
+    ["Part-of-Speech", "p="]
+  ];
+
+  ah["tt/p="] = sttsArray;
+});
diff --git a/dev/js/src/hint/foundries/xip.js b/dev/js/src/hint/foundries/xip.js
new file mode 100644
index 0000000..cd9fc8a
--- /dev/null
+++ b/dev/js/src/hint/foundries/xip.js
@@ -0,0 +1,12 @@
+var ah = KorAP.annotationHelper = KorAP.annotationHelper || { "-" : [] };
+
+ah["-"].push(
+  ["Xerox Parser", "xip/", "Constituency, Lemma, Part-of-Speech"]
+);
+
+ah["xip/"] = [
+  ["Constituency", "c="],
+  // Inactive: ["Dependency", "d="],
+  ["Lemma", "l="],
+  ["Part-of-Speech", "p="]
+];
diff --git a/dev/js/src/init.js b/dev/js/src/init.js
index 6eee4f8..fdc2fab 100644
--- a/dev/js/src/init.js
+++ b/dev/js/src/init.js
@@ -16,7 +16,6 @@
   'vc',
   'tutorial',
   'lib/domReady',
-  'hint/array',
   'vc/array',
   'lib/alertify',
   'session',
@@ -31,16 +30,12 @@
              vcClass,
              tutClass,
              domReady,
-             hintArray,
              vcArray,
              alertifyClass,
              sessionClass,
              tagger,
              selectMenuClass) {
 
-  // Set hint array for hint helper
-  KorAP.hintArray = hintArray;
-
   // Localization values
   var loc = KorAP.Locale;
   loc.VC_allCorpora    = loc.VC_allCorpora    || 'all corpora';
diff --git a/dev/js/src/menu.js b/dev/js/src/menu.js
index e575b7e..d7ec89f 100644
--- a/dev/js/src/menu.js
+++ b/dev/js/src/menu.js
@@ -4,7 +4,6 @@
  * @author Nils Diewald
  */
 /*
- * TODO: space is not a valid prefix!
  * TODO: Show the slider briefly on move (whenever screen is called).
  * TODO: Ignore alt+ and strg+ key strokes.
  * TODO: Should scroll to a chosen value after prefixing, if the chosen value is live
@@ -13,6 +12,7 @@
  *       or anytime items would be outside the screen.
  * TODO: Add a .match() method to items for scrolling and probably for prefixing.
  * TODO: Add static header (for title, sortation fields, but also for menu points like "fragments" and "history".
+ * TODO: Support space separated list of prefixes so "co no" will highlight "common noun"
  */
 define([
   'menu/item',
@@ -181,18 +181,44 @@
        * There is a prefix set, so filter the list!
        */
       var pos;
-      var prefix = " " + this.prefix().toLowerCase();
+      var prefixList = this.prefix().toLowerCase().split(" ");
+
+      var items = [];
+      var maxPoints = 1; // minimum 1
 
       // Iterate over all items and choose preferred matching items
       // i.e. the matching happens at the word start
       for (pos = 0; pos < this._items.length; pos++) {
-        if ((this.item(pos).lcField().indexOf(prefix)) >= 0)
+
+        var points = 0;
+
+        for (pref = 0; pref < prefixList.length; pref++) {
+          var prefix = " " + prefixList[pref];
+
+          // Check if it matches at the beginning
+          if ((this.item(pos).lcField().indexOf(prefix)) >= 0) {
+            points += 5;
+          }
+
+          // Check if it matches anywhere
+          else if ((this.item(pos).lcField().indexOf(prefix.substring(1))) >= 0) {
+            points += 1;
+          };
+        };
+
+        if (points > maxPoints) {
+          this._list = [pos];
+          maxPoints = points;
+        }
+        else if (points == maxPoints) {
           this._list.push(pos);
+        }
       };
 
       // The list is empty - so lower your expectations
       // Iterate over all items and choose matching items
       // i.e. the matching happens anywhere in the word
+      /*
       prefix = prefix.substring(1);
       if (this._list.length == 0) {
         for (pos = 0; pos < this._items.length; pos++) {
@@ -200,6 +226,7 @@
             this._list.push(pos);
         };
       };
+      */
 
       this._slider.length(this._list.length).reInit();
 
diff --git a/dev/js/src/menu/item.js b/dev/js/src/menu/item.js
index 3f955be..812a398 100644
--- a/dev/js/src/menu/item.js
+++ b/dev/js/src/menu/item.js
@@ -5,6 +5,8 @@
  * further: action happen on right arrow
  */
 
+"use strict";
+
 /**
  * Item in the Dropdown menu
  */
@@ -153,13 +155,13 @@
     for (var i = marks.length - 1; i >= 0; i--) {
       // Create text node clone
       var x = document.createTextNode(
-	marks[i].firstChild.nodeValue
+	      marks[i].firstChild.nodeValue
       );
       
       // Replace with content
       marks[i].parentNode.replaceChild(
-	x,
-	marks[i]
+	      x,
+	      marks[i]
       );
     };
 
@@ -169,48 +171,82 @@
   },
 
   // Highlight a certain substring of the menu item
-  _highlight : function (elem, prefix) {
+  _highlight : function (elem, prefixString) {    
     if (elem.nodeType === 3) {
       
       var text   = elem.nodeValue;
       var textlc = text.toLowerCase();
-      var pos    = textlc.indexOf(prefix);
-      if (pos >= 0) {
+
+      // Split prefixes
+      if (prefixString) {
+
+        // ND:
+        //   Doing this in a single line can trigger
+        //   a deep-recursion in Firefox 57.01, though I don't know why.
+        prefixString = prefixString.trim();
+        var prefixes = prefixString.split(" ");
+
+        var prefix;
+        var testPos;
+        var pos = -1;
+        var len = 0;
+
+        // Iterate over all prefixes and get the best one
+        for (var i = 0; i < prefixes.length; i++) {
+
+          // Get first pos of a matching prefix
+          testPos = textlc.indexOf(prefixes[i]);
+          if (testPos < 0)
+            continue;
+
+          if (pos === -1 || testPos < pos) {
+            pos = testPos;
+            len = prefixes[i].length;
+          }
+          else if (testPos === pos && prefixes[i].length > len) {
+            len = prefixes[i].length;
+          };
+        };
+
+        // Matches!
+        if (pos >= 0) {
 	
-	// First element
-	if (pos > 0) {
-	  elem.parentNode.insertBefore(
-	    document.createTextNode(text.substr(0, pos)),
-	    elem
-	  );
-	};
+	        // First element
+	        if (pos > 0) {
+	          elem.parentNode.insertBefore(
+	            document.createTextNode(text.substr(0, pos)),
+	            elem
+	          );
+	        };
 	
-	// Second element
-	var hl = document.createElement("mark");
-	hl.appendChild(
-	  document.createTextNode(text.substr(pos, prefix.length))
-	);
-	elem.parentNode.insertBefore(hl, elem);
+	        // Second element
+	        var hl = document.createElement("mark");
+	        hl.appendChild(
+	          document.createTextNode(text.substr(pos, len))
+	        );
+	        elem.parentNode.insertBefore(hl, elem);
 	
-	// Third element
-	var third = text.substr(pos + prefix.length);
-	if (third.length > 0) {
-	  var thirdE = document.createTextNode(third);
-	  elem.parentNode.insertBefore(
-	    thirdE,
-	    elem
-	  );
-	  this._highlight(thirdE, prefix);
-	};
+	        // Third element
+	        var third = text.substr(pos + len);
+
+	        if (third.length > 0) {
+	          var thirdE = document.createTextNode(third);
+	          elem.parentNode.insertBefore(
+	            thirdE,
+	            elem
+	          );
+	          this._highlight(thirdE, prefixString);
+	        };
 	
-	var p = elem.parentNode;
-	p.removeChild(elem);
+	        var p = elem.parentNode;
+	        p.removeChild(elem);
+        };
       };
     }
     else {
       var children = elem.childNodes;
       for (var i = children.length -1; i >= 0; i--) {
-	this._highlight(children[i], prefix);
+	      this._highlight(children[i], prefixString);
       };
     };
   },
diff --git a/dev/js/src/menu/prefix.js b/dev/js/src/menu/prefix.js
index abcf66c..90924c9 100644
--- a/dev/js/src/menu/prefix.js
+++ b/dev/js/src/menu/prefix.js
@@ -107,7 +107,7 @@
     // Prefix is long enough for backspace
     if (this._string.length > 1) {
       this._string = this._string.substring(
-	0, this._string.length - 1
+	      0, this._string.length - 1
       );
     }
     else {