diff --git a/coursebuilder/__main__.py b/coursebuilder/__main__.py
index beedcb5..65b2393 100644
--- a/coursebuilder/__main__.py
+++ b/coursebuilder/__main__.py
@@ -58,12 +58,24 @@ class CourseBuilder:
 
                     meta = yaml.load(fm,Loader=yaml.Loader)
 
-                    table_items = schema.process(meta=meta,fields=actual_fields,lang=args.lang) if query == None else schema.process_raw(meta=meta,fields=actual_fields,lang=args.lang)
+                    table_items = schema.process(meta=meta,fields=actual_fields,lang=args.lang) if query == None else schema.to_list_of_dict(meta=meta,fields=actual_fields,lang=args.lang)
 
                     if args.legacy:
                         MarkdownGenerator.generate_table_legacy(table_items=table_items,add_pagebreak=args.pagebreak,title_template=args.title,first_colwidth=args.leftcol)
                     elif query:
+
                         query.run(table_items)
+
+                        # for i in table_items:
+                            # print(i)
+
+                        q = schema.to_list_of_tuple(meta=meta,fields=actual_fields,lang=args.lang)
+
+                        for i in q:
+                            print(i)
+                        
+                        # MarkdownGenerator.generate_table(table_items=q,add_pagebreak=args.pagebreak,title_template=args.title,first_colwidth=args.leftcol)
+
                     else:
                         MarkdownGenerator.generate_table(table_items=table_items,add_pagebreak=args.pagebreak,title_template=args.title,first_colwidth=args.leftcol)
 
diff --git a/coursebuilder/query.py b/coursebuilder/query.py
index fab883b..835fe36 100644
--- a/coursebuilder/query.py
+++ b/coursebuilder/query.py
@@ -1,4 +1,6 @@
 
+import pandas as pd
+
 class Query:
 
     def __init__(self,query) -> None:
@@ -6,8 +8,9 @@ class Query:
 
     def run(self,table_items):
         # print(table_items)
-        for row in table_items:
-            print(row)
-            # print(eval(self.__query,{row:row}))
+        # for item in table_items:
+            # pass
+            # print(item)
+            # print(eval(self.__query,locals()))
         pass
 
diff --git a/coursebuilder/schema.py b/coursebuilder/schema.py
index ee4f058..ee730c0 100644
--- a/coursebuilder/schema.py
+++ b/coursebuilder/schema.py
@@ -92,7 +92,7 @@ class Schema:
         return [k,', '.join(parts)]
 
 
-    def process(self,meta,fields = [],lang = 'de'):
+    def process(self,meta,fields,lang):
 
         table_items = []
 
@@ -113,52 +113,44 @@ class Schema:
         # maybe return tableitems as np.Dataframe?
         return table_items
     
-    def get_str(self,meta,field,lang='de'):
-        if self.is_translatable(field):
-            return meta[field][lang]
-        else:
-            if not 'value' in meta[field]:
-                raise AssertionError(field,'incomplete')
-            return meta[field]['value']
-
-    def get_enum(self,meta,field,lang):
-        vv = meta[field]['value']
-        return self.__schema[field]['values'][vv][lang]
-    
-    def get_num(self,meta,field,lang):
-        return meta[field]['value']
-
-        # if self.needs_spec(field):
-
-        #     t = string.Template(self.get_template(field=field,lang=lang))
-
-        #     spec = meta[field]['spec'][lang]
-
-        #     return [self.process_label(field,lang),t.substitute({'value': enum_val,'spec': spec})]
-        # else:
-        #     return [self.process_label(field,lang),enum_val]
-        
-
-
     def get_value(self,meta,field,lang):
+        """treats receiving the value like a variant, 
+           return values are language specific"""
         match self.__schema[field]['type']: 
-            case 'str': return self.get_str(meta,field,lang)
-            case 'enum': return self.get_enum(meta,field,lang)
-            case 'int' | 'num' : return self.get_num(meta,field,lang)
-            case 'multinum' : return meta[field]['value']
+            case 'str': return meta[field][lang] if self.is_translatable(field) else meta[field]['value']
+            case 'enum' | 'int' | 'num' | 'multikey' : return meta[field]['value']
+            case 'multinum': return meta[field]['value'] if hasattr(meta[field]['value'],'__iter__') else (meta[field]['value'],) # force list!
     
-    
-    def process_raw(self,meta,fields,lang):
-
-        items = [{'field' : field, 
-                  'lang' : lang,
-                  'type' : self.__schema[field]['type'], 
-                  'label' : self.process_label(field,lang),
-                  'value' : self.get_value(meta,field,lang)
-                  
+    def to_list_of_dict(self,meta,fields,lang):
+        # list comprehension for rows
+        return [{'field' : field,   # field name
+                  'lang' : lang,    # language shortcode
+                  'type' : self.__schema[field]['type'], # datatype
+                  'label' : self.process_label(field,lang), # label
+                  'value' : self.get_value(meta,field,lang), # actual value
+                  'template' : self.__schema[field]['template'][lang] if 'template' in self.__schema[field] else None,
+                  # getting crazy with nested dict comprehension
+                  'enum_values' : { k:v[lang] for (k,v) in self.__schema[field]['values'].items()} if 'enum' in self.__schema[field]['type'] else None,
+                  'key_values' : { k:v[lang] for (k,v) in self.__schema[field]['keys'].items()} if 'multikey' in self.__schema[field]['type'] else None,
+                  'spec' : meta[field]['spec'][lang] if 'spec' in meta[field] else None
                   }
                   for field in fields]
+    
+    def to_list_of_tuple(self,meta,fields,lang):
+        # generate a list of tuples with key and value (text)
+        list = []
+        for r in self.to_list_of_dict(meta,fields,lang):
+            match r['type']:
+                case 'str' : 
+                    list.append( (r['label'],r['value']) )
+                case 'int' | 'num' : 
+                    list.append( ( r['label'], r['template'].format(value=r['value'],spec=r['spec']) if r['template'] else r['value']) )
+                case 'enum' : 
+                    list.append( ( r['label'], r['template'].format(value=r['enum_values'][r['value']],spec=r['spec']) 
+                                  if r['template'] else r['enum_values'][r['value']] ) )
+                case 'multikey' : 
+                    list.append( ( r['label'], ', '.join( [r['template'].format(key=r['key_values'][k],value=v) for k,v in r['value'].items()] ) ) )
+                case 'multinum' :
+                    list.append( (r['label'], ', '.join( r['template'].format(value=v) for v in r['value'])) )
 
-
-        # maybe return tableitems as np.Dataframe?
-        return items
\ No newline at end of file
+        return list
\ No newline at end of file
diff --git a/test/Makefile b/test/Makefile
index c806cc2..f662980 100644
--- a/test/Makefile
+++ b/test/Makefile
@@ -33,6 +33,6 @@ debug:
 	#  | pandoc ${target_flags} -V lang:de -o ${target_de}
 
 debug-query:
-	python ${coursebuilder} -s schema.yaml -m mod.cg.yaml mod.interactsys.yaml -q "kind == compulsory"
+	python ${coursebuilder} -s schema.yaml -m mod.cg.yaml mod.interactsys.yaml -q "item['field'] == 'kind' and item['value'] == 'elective'"
 
 .PHONY: clean
\ No newline at end of file
diff --git a/test/schema.yaml b/test/schema.yaml
index fde6931..94c7820 100644
--- a/test/schema.yaml
+++ b/test/schema.yaml
@@ -114,8 +114,8 @@ form-of-instruction:
         }
     }
     template: 
-        de: "${key} (${value}SWS)"
-        en: "${key} (${value}SWS)"
+        de: "{key} ({value}SWS)"
+        en: "{key} ({value}SWS)"
 
 #
 # Voraussetzungen für die Teilnahme
@@ -181,14 +181,15 @@ workload:
 # credits/ECTS
 #
 credits:
-    type: num 
+    type: num
+    unit: ECTS
     label: { 
         en: "credits and weight of mark",
         de: "Kreditpunkte und Gewichtung der Note in der Gesamtnote"
     }
     template: 
-        de: "${value}CP, Gewichtung: ${value}CP von 120CP "
-        en: "${value}CP, weight: ${value} / 120 "    
+        de: "{value}CP, Gewichtung: {value}CP von 120CP "
+        en: "{value}CP, weight: {value} / 120 "    
     
 
 #
@@ -216,8 +217,8 @@ form-of-exam:
     }
     spec: true
     template:
-        de: "${value} (${spec})" 
-        en: "${value} (${spec})"
+        de: "{value} ({spec})" 
+        en: "{value} ({spec})"
 
 
 #
@@ -262,8 +263,8 @@ duration:
         de: Dauer
         en: duration
     template: 
-        de: "$value Semester"
-        en: "$value term(s)"
+        de: "{value} Semester"
+        en: "{value} term(s)"
 
 #
 # Art der Veranstaltung