TP_ACPI_HOTKEYSCAN_CAMERA_MODE,
        TP_ACPI_HOTKEYSCAN_ROTATE_DISPLAY,
 
+       /* Lenovo extended keymap, starting at 0x1300 */
+       TP_ACPI_HOTKEYSCAN_EXTENDED_START,
+       /* first new observed key (star, favorites) is 0x1311 */
+       TP_ACPI_HOTKEYSCAN_STAR = 69,
+       TP_ACPI_HOTKEYSCAN_CLIPPING_TOOL2,
+       TP_ACPI_HOTKEYSCAN_UNK25,
+       TP_ACPI_HOTKEYSCAN_BLUETOOTH,
+       TP_ACPI_HOTKEYSCAN_KEYBOARD,
+
        /* Hotkey keymap size */
        TPACPI_HOTKEY_MAP_LEN
 };
                KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,
                KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,
                KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,
+
+               /* No assignment, used for newer Lenovo models */
+               KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,
+               KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,
+               KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,
+               KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,
+               KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,
+               KEY_UNKNOWN, KEY_UNKNOWN
+
                },
 
        /* Generic keymap for Lenovo ThinkPads */
                KEY_RESERVED,        /* Microphone cancellation */
                KEY_RESERVED,        /* Camera mode */
                KEY_RESERVED,        /* Rotate display, 0x116 */
+
+               /*
+                * These are found in 2017 models (e.g. T470s, X270).
+                * The lowest known value is 0x311, which according to
+                * the manual should launch a user defined favorite
+                * application.
+                *
+                * The offset for these is TP_ACPI_HOTKEYSCAN_EXTENDED_START,
+                * corresponding to 0x34.
+                */
+
+               /* (assignments unknown, please report if found) */
+               KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,
+               KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,
+               KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,
+               KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN, KEY_UNKNOWN,
+               KEY_UNKNOWN,
+
+               KEY_FAVORITES,       /* Favorite app, 0x311 */
+               KEY_RESERVED,        /* Clipping tool */
+               KEY_RESERVED,
+               KEY_BLUETOOTH,       /* Bluetooth */
+               KEY_KEYBOARD         /* Keyboard, 0x315 */
                },
        };
 
 
        default:
                if (scancode < FIRST_ADAPTIVE_KEY ||
-                   scancode >= FIRST_ADAPTIVE_KEY + TPACPI_HOTKEY_MAP_LEN -
-                               TP_ACPI_HOTKEYSCAN_ADAPTIVE_START) {
+                   scancode >= FIRST_ADAPTIVE_KEY +
+                   TP_ACPI_HOTKEYSCAN_EXTENDED_START -
+                   TP_ACPI_HOTKEYSCAN_ADAPTIVE_START) {
                        pr_info("Unhandled adaptive keyboard key: 0x%x\n",
                                        scancode);
                        return false;
        *send_acpi_ev = true;
        *ignore_acpi_ev = false;
 
-       /* HKEY event 0x1001 is scancode 0x00 */
-       if (scancode > 0 && scancode <= TP_ACPI_HOTKEYSCAN_ADAPTIVE_START) {
-               scancode--;
-               if (!(hotkey_source_mask & (1 << scancode))) {
-                       tpacpi_input_send_key_masked(scancode);
-                       *send_acpi_ev = false;
-               } else {
-                       *ignore_acpi_ev = true;
+       /*
+        * Original events are in the 0x10XX range, the adaptive keyboard
+        * found in 2014 X1 Carbon emits events are of 0x11XX. In 2017
+        * models, additional keys are emitted through 0x13XX.
+        */
+       switch ((hkey >> 8) & 0xf) {
+       case 0:
+               if (scancode > 0 &&
+                   scancode <= TP_ACPI_HOTKEYSCAN_ADAPTIVE_START) {
+                       /* HKEY event 0x1001 is scancode 0x00 */
+                       scancode--;
+                       if (!(hotkey_source_mask & (1 << scancode))) {
+                               tpacpi_input_send_key_masked(scancode);
+                               *send_acpi_ev = false;
+                       } else {
+                               *ignore_acpi_ev = true;
+                       }
+                       return true;
                }
-               return true;
-       } else {
+               break;
+
+       case 1:
                return adaptive_keyboard_hotkey_notify_hotkey(scancode);
+
+       case 3:
+               /* Extended keycodes start at 0x300 and our offset into the map
+                * TP_ACPI_HOTKEYSCAN_EXTENDED_START. The calculated scancode
+                * will be positive, but might not be in the correct range.
+                */
+               scancode -= (0x300 - TP_ACPI_HOTKEYSCAN_EXTENDED_START);
+               if (scancode >= TP_ACPI_HOTKEYSCAN_EXTENDED_START &&
+                   scancode < TPACPI_HOTKEY_MAP_LEN) {
+                       tpacpi_input_send_key(scancode);
+                       return true;
+               }
+               break;
        }
+
        return false;
 }