diff --git a/src/global.c b/src/global.c
index 606dc3c9d5afe078da440ec4892a8d86d258daee..12c2cbc154422a573240b617ac008293b187e5f2 100644
--- a/src/global.c
+++ b/src/global.c
@@ -1147,6 +1147,9 @@ void shortcut_init(void)
     add_to_sclist(MMAIN, "M-^", 0, do_copy_text, 0);
     add_to_sclist(MMAIN, "M-}", 0, do_indent, 0);
     add_to_sclist(MMAIN, "M-{", 0, do_unindent, 0);
+#ifdef KEY_BTAB
+    add_to_sclist(MMAIN, "S-Tab", KEY_BTAB, do_unindent, 0);
+#endif
     add_to_sclist(MMAIN, "M-:", 0, record_macro, 0);
     add_to_sclist(MMAIN, "M-;", 0, run_macro, 0);
     add_to_sclist(MMAIN, "M-U", 0, do_undo, 0);
diff --git a/src/winio.c b/src/winio.c
index f3d548a006b59d265eb795e9882736d79b9e83e8..ea067761646ca25487f47483db628410036f7a04 100644
--- a/src/winio.c
+++ b/src/winio.c
@@ -621,8 +621,14 @@ int parse_kbinput(WINDOW *win)
     if (console && ioctl(0, TIOCLINUX, &modifiers) >= 0) {
 #ifndef NANO_TINY
 	/* Is Shift being held? */
-	if (modifiers & 0x01)
+	if (modifiers & 0x01) {
+#ifdef KEY_BTAB
+	    /* A shifted <Tab> is a back tab. */
+	    if (retval == TAB_CODE)
+		return KEY_BTAB;
+#endif
 	    shift_held = TRUE;
+	}
 #endif
 	/* Is Ctrl being held? */
 	if (modifiers & 0x04) {
@@ -655,6 +661,16 @@ int parse_kbinput(WINDOW *win)
     }
 #endif /* __linux__ */
 
+#ifndef NANO_TINY
+    /* When <Tab> is pressed while the mark is on, do an indent. */
+    if (retval == TAB_CODE && openfile->mark && currmenu == MMAIN) {
+	const sc *command = first_sc_for(MMAIN, do_indent);
+
+	meta_key = command->meta;
+	return command->keycode;
+    }
+#endif
+
     switch (retval) {
 #ifdef KEY_SLEFT
 	/* Slang doesn't support KEY_SLEFT. */