diff --git a/web/gui/src/main/webapp/app/fw/layer/quickhelp.js b/web/gui/src/main/webapp/app/fw/layer/quickhelp.js
index e552885..5ef4369 100644
--- a/web/gui/src/main/webapp/app/fw/layer/quickhelp.js
+++ b/web/gui/src/main/webapp/app/fw/layer/quickhelp.js
@@ -23,7 +23,7 @@
     'use strict';
 
     // injected references
-    var $log, fs, sus;
+    var $log, fs, sus, ls;
 
     // configuration
     var defaultSettings = {
@@ -202,11 +202,13 @@
         fmt.forEach(function (k) {
             var v = map.get(k),
                 a = fs.isA(v),
-                d = (a && a[1]);
+                d = (a && a[1]),
+                dfn = fs.isF(d),
+                dval = (dfn && dfn()) || d;
 
             // '-' marks a separator; d is the description
-            if (k === '-' || d) {
-                b.push([mkKeyDisp(k), d]);
+            if (k === '-' || dval) {
+                b.push([mkKeyDisp(k), dval]);
             }
         });
         return b;
@@ -268,6 +270,10 @@
         addRow(mkArrRow(vgest));
     }
 
+    function qhlion_title() {
+        var lion = ls.bundle('core.fw.QuickHelp');
+        return lion('qh_title');
+    }
 
     function popBind(bindings) {
         pane = svg.append('g')
@@ -280,7 +286,7 @@
             .attr('rx', 8);
 
         pane.append('text')
-            .text('Quick Help')
+            .text(qhlion_title())
             .attr({
                 class: 'title',
                 dy: '1.2em',
@@ -342,12 +348,13 @@
 
     angular.module('onosLayer')
     .factory('QuickHelpService',
-        ['$log', 'FnService', 'SvgUtilService',
+        ['$log', 'FnService', 'SvgUtilService', 'LionService',
 
-        function (_$log_, _fs_, _sus_) {
+        function (_$log_, _fs_, _sus_, _ls_) {
             $log = _$log_;
             fs = _fs_;
             sus = _sus_;
+            ls = _ls_;
 
             function initQuickHelp(opts) {
                 settings = angular.extend({}, defaultSettings, fs.isO(opts));
diff --git a/web/gui/src/main/webapp/app/fw/util/keys.js b/web/gui/src/main/webapp/app/fw/util/keys.js
index 5f146c4..2e8900a 100644
--- a/web/gui/src/main/webapp/app/fw/util/keys.js
+++ b/web/gui/src/main/webapp/app/fw/util/keys.js
@@ -21,7 +21,7 @@
     'use strict';
 
     // references to injected services
-    var $log, $timeout, fs, ts, ns, ee, qhs;
+    var $log, $timeout, fs, ts, ns, ee, qhs, ls;
 
     // internal state
     var enabled = true,
@@ -162,13 +162,30 @@
         }
     }
 
+    // functions to obtain localized strings deferred from the setup of the
+    //  global key data structures.
+    function qhlion() {
+        return ls.bundle('core.fw.QuickHelp');
+    }
+    function qhlion_show_hide() {
+        return qhlion()('qh_hint_show_hide_qh');
+    }
+
+    function qhlion_hint_esc() {
+        return qhlion()('qh_hint_esc');
+    }
+
+    function qhlion_hint_t() {
+        return qhlion()('qh_hint_t');
+    }
+
     function setupGlobalKeys() {
         angular.extend(keyHandler, {
             globalKeys: {
-                backSlash: [quickHelp, 'Show / hide Quick Help'],
-                slash: [quickHelp, 'Show / hide Quick Help'],
-                esc: [escapeKey, 'Dismiss dialog or cancel selections'],
-                T: [toggleTheme, "Toggle theme"]
+                backSlash: [quickHelp, qhlion_show_hide],
+                slash: [quickHelp, qhlion_show_hide],
+                esc: [escapeKey, qhlion_hint_esc],
+                T: [toggleTheme, qhlion_hint_t]
             },
             globalFormat: ['backSlash', 'slash', 'esc', 'T'],
 
@@ -302,15 +319,16 @@
     angular.module('onosUtil')
     .factory('KeyService',
         ['$log', '$timeout', 'FnService', 'ThemeService', 'NavService',
-            'EeService',
+            'EeService', 'LionService',
 
-        function (_$log_, _$timeout_, _fs_, _ts_, _ns_, _ee_) {
+        function (_$log_, _$timeout_, _fs_, _ts_, _ns_, _ee_, _ls_) {
             $log = _$log_;
             $timeout = _$timeout_;
             fs = _fs_;
             ts = _ts_;
             ns = _ns_;
             ee = _ee_;
+            ls = _ls_;
 
             return {
                 bindQhs: function (_qhs_) {
diff --git a/web/gui/src/main/webapp/tests/app/fw/layer/quickhelp-spec.js b/web/gui/src/main/webapp/tests/app/fw/layer/quickhelp-spec.js
index 6a86329..8f79e5c 100644
--- a/web/gui/src/main/webapp/tests/app/fw/layer/quickhelp-spec.js
+++ b/web/gui/src/main/webapp/tests/app/fw/layer/quickhelp-spec.js
@@ -15,7 +15,7 @@
  */
 
 /*
- ONOS GUI -- Layer -- Flash Service - Unit Tests
+ ONOS GUI -- Layer -- Quick Help Service - Unit Tests
  */
 describe('factory: fw/layer/quickhelp.js', function () {
     var $log, fs, qhs, d3Elem,
@@ -39,7 +39,7 @@
         'globalKeys', 'globalFormat', 'viewKeys', 'viewGestures'
     ];
 
-    beforeEach(module('onosUtil', 'onosSvg', 'onosLayer'));
+    beforeEach(module('onosUtil', 'onosSvg', 'onosLayer', 'onosRemote'));
 
     beforeEach(inject(function (_$log_, FnService, QuickHelpService) {
         $log = _$log_;
@@ -115,12 +115,16 @@
         expect($log.warn).toHaveBeenCalledWith(warning, neededBindings);
     });
 
-    it('should not warn if bindings are provided', function () {
+    it('should not warn if bindings are provided (except lion)', function () {
         spyOn($log, 'warn');
         expect(qhs.showQuickHelp(mockBindings)).toBe(undefined);
-        expect($log.warn).not.toHaveBeenCalled();
+        expect($log.warn).toHaveBeenCalledWith(
+            'No lion bundle registered:', 'core.fw.QuickHelp'
+        );
     });
 
+    // TODO: consider testing localization of text
+
     it('should append an svg', function () {
         var svg = d3Elem.select('svg');
         expect(d3Elem.empty()).toBe(false);
@@ -149,7 +153,8 @@
         expect(rect.attr('rx')).toBe('8');
 
         text = g.select('text');
-        expect(text.text()).toBe('Quick Help');
+        // NOTE: we aren't mocking localization, so should get %...% key tag
+        expect(text.text()).toBe('%qh_title%');
         expect(text.classed('title')).toBe(true);
         expect(text.attr('dy')).toBe('1.2em');
         expect(text.attr('transform')).toBeTruthy();
