diff --git a/Nasal/canvas/draw/compass.nas b/Nasal/canvas/draw/compass.nas
index a92b4d7ac..71983edac 100644
--- a/Nasal/canvas/draw/compass.nas
+++ b/Nasal/canvas/draw/compass.nas
@@ -10,15 +10,17 @@ var CompassRose = {
         new: func() {
             var obj = {
                 parents: [CompassRose.Style, canvas.draw.marksStyle.new()],
-                mark_count: 36,     # number of marks, count = 360 / interval
-                label_count: 12,    # number of text labels (degrees), e.g. 12
-                label_div: 10,      # >0 divide degrees by this number for text label, e.g. 10
+                mark_count: 36,       # number of marks, count = 360 / interval
+                label_count: 12,      # number of text labels (degrees)
+                label_div: 10,        # >0 div. degr. by this for text labels
                 circle_color: [255,255,255,1],
                 mark_color:   [255,255,255,1],
                 label_color:  [255,255,255,1],
-                center_mark: 0,     # draw a mark in the center of the rose
-                fontsize: 0,        # fontsize for labels
-                nesw: 1,            # replace labels 0,90,180,270 by N,E,S,W
+                center_mark: 0,       # draw a mark in the center of the rose
+                font: "sans",         # fontsize for labels
+                font_weight: "bold",  # fontsize for labels
+                fontsize: 0,          # fontsize for labels
+                nesw: 1,              # replace labels 0,90,180,270 by N,E,S,W
             };
             obj.setMarkLength(0.1);
             obj.setSubdivisionLength(0.5);
@@ -80,6 +82,7 @@ CompassRose.draw = func(cgroup, radius, style=nil) {
             .createChildren("text", style.label_count);
         var offset = (style.mark_offset < 0 ? -1 : 1) * style.mark_length * radius;
         var rot = 2*math.pi/style.label_count;
+        var font = canvas.font_mapper(style.font, style.font_weight);
         forindex (i; labels) {
             var t = n = int(i*360 / style.label_count);
             if (style.label_div > 0) t = int(n / style.label_div);
@@ -93,7 +96,7 @@ CompassRose.draw = func(cgroup, radius, style=nil) {
             labels[i]
                 .setText(txt)
                 .setFontSize(fontsize)
-                .setFont(font_mapper("LiberationSans","bold"))
+                .setFont(font)
                 .setColor(style.label_color)
                 .setAlignment("center-"~(style.mark_offset < 0 ? "top" : "bottom"))
                 .setTranslation(0,-radius-offset)
diff --git a/Nasal/modules/canvas_efis/efis-canvas.nas b/Nasal/modules/canvas_efis/efis-canvas.nas
index f17215731..1f0b2bb8c 100644
--- a/Nasal/modules/canvas_efis/efis-canvas.nas
+++ b/Nasal/modules/canvas_efis/efis-canvas.nas
@@ -82,11 +82,13 @@ var EFISCanvas = {
     },
 
     loadsvg: func(file) {
-        var font_mapper = func(family, weight) {
-            return "LiberationFonts/LiberationSans-Regular.ttf";
+        logprint(LOG_INFO, "EFIS loading "~file);
+        var options = {
+            "default-font-family": "LiberationSans",
+            "default-font-weight": "",
+            "default-font-style": "",
         };
-        print("EFIS loading "~file);
-        canvas.parsesvg(me._root, file, {'font-mapper': font_mapper});
+        canvas.parsesvg(me._root, file, options);
 
         # create nasal variables for SVG elements;
         # in a class derived from EFISCanvas, add IDs to the svg_keys member in the constructor (new)
@@ -107,21 +109,21 @@ var EFISCanvas = {
     #       defaults to EFISCanvas instance calling this method, useful if "f" 
     #       is a member of the EFISCanvas instance
     addUpdateFunction: func(f, interval, f_me = nil) {
-        if (typeof(f) != "func") {
-            print("EFISCanvas.addUpdateFunction: Error, argument is not a function.");
+        if (!isfunc(f)) {
+            logprint(DEV_ALERT, "EFISCanvas.addUpdateFunction: argument is not a function.");
             return;
         }
         interval = num(interval);
         f_me = (f_me == nil) ? me : f_me;
         if (interval != nil and interval >= 0) {
-            #the updateCountN is meant for debug/performance monitoring
             var timer = maketimer(interval, me, func {
                 if (me.updateN != nil and me.updateN.getValue()) {
                     var err = [];
                     call(f, [], f_me, nil, err);
                     if (size(err))
                         debug.printerror(err);
-                    me.updateCountN.setValue(me.updateCountN.getValue() + 1);
+                    # debug/performance monitoring
+                    me.updateCountN.increment();
                 }
             });
             append(me._timers, timer);
@@ -137,8 +139,9 @@ var EFISCanvas = {
 
     # stop all registered update functions
     stopUpdates: func() {
-        foreach (var t; me._timers)
+        foreach (var t; me._timers) {
             t.stop();
+        }
     },
 
     # getInstr - get props from /instrumentation/<sys>[i]/<prop>
@@ -165,7 +168,7 @@ var EFISCanvas = {
         }
         me[svgkey].setText(text);
         if (color != nil and me[svgkey].setColor != nil) {
-            if (typeof(color) == "vector") me[svgkey].setColor(color);
+            if (isvec(color)) me[svgkey].setColor(color);
             else me[svgkey].setColor(me.colors[color]);
         }
     },
@@ -186,32 +189,36 @@ var EFISCanvas = {
     # value: optional value to trigger show(); otherwise node.value will be implicitly treated as bool
     _makeListener_showHide: func(svgkeys, value=nil) {
         if (value == nil) {
-            if (typeof(svgkeys) == "vector")
+            if (isvec(svgkeys)) {
                 return func(n) {
                     if (n.getValue())
                         foreach (var key; svgkeys) me[key].show();
                     else
                         foreach (var key; svgkeys) me[key].hide();
                 }
-            else
+            }
+            else {
                 return func(n) {
                     if (n.getValue()) me[svgkeys].show();
                     else me[svgkeys].hide();
                 }
+            }
         }
         else {
-            if (typeof(svgkeys) == "vector")
+            if (isvec(svgkeys)) {
                 return func(n) {
                     if (n.getValue() == value)
                         foreach (var key; svgkeys) me[key].show();
                     else
                         foreach (var key; svgkeys) me[key].hide();
                 };
-            else
+            }
+            else {
                 return func(n) {
                     if (n.getValue() == value) me[svgkeys].show();
                     else me[svgkeys].hide();
                 };
+            }
         }
     },
 
@@ -222,21 +229,23 @@ var EFISCanvas = {
     #          {"svgkey" : factor}, missing keys will be treated as 1
     _makeListener_rotate: func(svgkeys, factors=nil) {
         if (factors == nil) {
-            if (typeof(svgkeys) == "vector")
+            if (isvec(svgkeys)) {
                 return func(n) {
                     var value = n.getValue() or 0;
                     foreach (var key; svgkeys) {
                         me[key].setRotation(value);
                     }
                 }
-            else
+            }
+            else {
                 return func(n) {
                     var value = n.getValue() or 0;
                     me[svgkeys].setRotation(value);
                 }
+            }
         }
         else {
-            if (typeof(svgkeys) == "vector")
+            if (isvec(svgkeys)) {
                 return func(n) {
                     var value = n.getValue() or 0;
                     foreach (var key; svgkeys) {
@@ -244,12 +253,14 @@ var EFISCanvas = {
                         me[key].setRotation(value * factor);
                     }
                 };
-            else
+            }
+            else {
                 return func(n) {
                     var value = n.getValue() or 0;
                     var factor = num(factors) or 1;
                     me[svgkeys].setRotation(value * factor);
                 };
+            }
         }
     },
 
@@ -259,15 +270,15 @@ var EFISCanvas = {
     # factors: number (if svgkeys is a single key) or hash of numbers
     #          {"svgkey" : factor}, missing keys will be treated as 0 (=no op)
     _makeListener_translate: func(svgkeys, fx, fy) {
-        if (typeof(svgkeys) == "vector") {
+        if (isvec(svgkeys)) {
             var x = num(fx) or 0;
             var y = num(fy) or 0;
-            if (typeof(fx) == "hash" or typeof(fy) == "hash") {
+            if (ishash(fx) or ishash(fy)) {
                 return func(n) {
                     foreach (var key; svgkeys) {
                         var value = n.getValue() or 0;
-                        if (typeof(fx) == "hash") x = fx[key] or 0;
-                        if (typeof(fy) == "hash") y = fy[key] or 0;
+                        if (ishash(fx)) x = fx[key] or 0;
+                        if (ishash(fy)) y = fy[key] or 0;
                         me[key].setTranslation(value * x, value * y);
                     }
                 };
@@ -300,9 +311,9 @@ var EFISCanvas = {
     #         (hint: putting elements in a SVG group (if possible) might be easier)
     # colors can be either a vector e.g. [r,g,b] or "name" from me.colors
     _makeListener_setColor: func(svgkeys, color_true, color_false) {
-        var col_0 = (typeof(color_false) == "vector") ? color_false : me.colors[color_false];
-        var col_1 = (typeof(color_true) == "vector") ? color_true : me.colors[color_true];
-        if (typeof(svgkeys) == "vector")  {
+        var col_0 = isvec(color_false) ? color_false : me.colors[color_false];
+        var col_1 = isvec(color_true) ? color_true : me.colors[color_true];
+        if (isvec(svgkeys) )  {
             return func(n) {
                 if (n.getValue())
                     foreach (var key; svgkeys) me[key].setColor(col_1);
@@ -319,10 +330,11 @@ var EFISCanvas = {
     },
 
     _makeListener_updateText: func(svgkeys, format="%s", default="") {
-        if (typeof(svgkeys) == "vector")  {
+        if (isvec(svgkeys)) {
             return func(n) {
-                foreach (var key; svgkeys)
+                foreach (var key; svgkeys) {
                     me.updateTextElement(key, sprintf(format, n.getValue() or default));
+                }
             };
         }
         else {