diff --git a/book/src/keymap.md b/book/src/keymap.md
index 65d01b86..cba89896 100644
--- a/book/src/keymap.md
+++ b/book/src/keymap.md
@@ -141,6 +141,7 @@ Jumps to various locations.
 | y   | Go to type definition |
 | r   | Go to references |
 | i   | Go to implementation |
+| a   | Go to the last accessed/alternate file |
 
 ## Object mode
 
diff --git a/helix-term/src/commands.rs b/helix-term/src/commands.rs
index f9db5581..0ae2186b 100644
--- a/helix-term/src/commands.rs
+++ b/helix-term/src/commands.rs
@@ -1317,6 +1317,15 @@ fn push_jump(editor: &mut Editor) {
     view.jumps.push(jump);
 }
 
+fn switch_to_last_accessed_file(cx: &mut Context) {
+    let alternate_file = cx.view().last_accessed_doc;
+    if let Some(alt) = alternate_file {
+        cx.editor.switch(alt, Action::Replace);
+    } else {
+        cx.editor.set_error("no last buffer".to_owned())
+    }
+}
+
 pub fn goto_mode(cx: &mut Context) {
     if let Some(count) = cx._count {
         push_jump(cx.editor);
@@ -1338,6 +1347,7 @@ pub fn goto_mode(cx: &mut Context) {
             match (cx.doc().mode, ch) {
                 (_, 'g') => move_file_start(cx),
                 (_, 'e') => move_file_end(cx),
+                (_, 'a') => switch_to_last_accessed_file(cx),
                 (Mode::Normal, 'h') => move_line_start(cx),
                 (Mode::Normal, 'l') => move_line_end(cx),
                 (Mode::Select, 'h') => extend_line_start(cx),
@@ -2449,6 +2459,10 @@ pub fn jump_backward(cx: &mut Context) {
     let (view, doc) = cx.current();
 
     if let Some((id, selection)) = view.jumps.backward(view.id, doc, count) {
+        // manually set the alternate_file as we cannot use the Editor::switch function here.
+        if view.doc != *id {
+            view.last_accessed_doc = Some(view.doc)
+        }
         view.doc = *id;
         let selection = selection.clone();
         let (view, doc) = cx.current(); // refetch doc
diff --git a/helix-view/src/editor.rs b/helix-view/src/editor.rs
index bd53c53b..ef0d8213 100644
--- a/helix-view/src/editor.rs
+++ b/helix-view/src/editor.rs
@@ -88,6 +88,12 @@ impl Editor {
     pub fn switch(&mut self, id: DocumentId, action: Action) {
         use crate::tree::Layout;
         use helix_core::Selection;
+
+        if !self.documents.contains_key(id) {
+            log::error!("cannot switch to document that does not exist (anymore)");
+            return;
+        }
+
         match action {
             Action::Replace => {
                 let view = self.view();
@@ -98,6 +104,7 @@ impl Editor {
 
                 let view = self.view_mut();
                 view.jumps.push(jump);
+                view.last_accessed_doc = Some(view.doc);
                 view.doc = id;
                 view.first_line = 0;
 
diff --git a/helix-view/src/view.rs b/helix-view/src/view.rs
index 5d2d27fd..c0a72c78 100644
--- a/helix-view/src/view.rs
+++ b/helix-view/src/view.rs
@@ -67,6 +67,8 @@ pub struct View {
     pub first_col: usize,
     pub area: Rect,
     pub jumps: JumpList,
+    /// the last accessed file before the current one
+    pub last_accessed_doc: Option<DocumentId>,
 }
 
 impl View {
@@ -78,6 +80,7 @@ impl View {
             first_col: 0,
             area: Rect::default(), // will get calculated upon inserting into tree
             jumps: JumpList::new((doc, Selection::point(0))), // TODO: use actual sel
+            last_accessed_doc: None,
         }
     }