diff --git a/src/core/prompt.rs b/src/core/prompt.rs
index dc585cbfc30b328643d2e086034611eea7ec439b..8f8c536a99fda1c30e309707ef1224cc52914c7e 100644
--- a/src/core/prompt.rs
+++ b/src/core/prompt.rs
@@ -39,6 +39,8 @@ pub enum PromptCommand<'a> {
     },
     /// List the available buffers.
     ListBuffers,
+    /// Create a new empty buffer.
+    CreateBuffer,
     /// Delete the current buffer.
     DeleteBuffer,
     /// Switch to the nth buffer.
@@ -70,6 +72,7 @@ impl<'a> PromptCommand<'a> {
             "o" | "open" => Open { path: sec_cmd },
             "w" | "write" => Write { path: sec_cmd },
             "ls" => ListBuffers,
+            "bn" => CreateBuffer,
             "bd" => DeleteBuffer,
             "h" | "help" => Help,
             "q" | "quit" => Quit,
@@ -121,10 +124,16 @@ impl Editor {
                 }
             }
             Open { path } => {
+                let line = self.buffers.current_buffer().get_line(0).unwrap().len();
+                let empty = self.buffers.current_buffer().len() == 1 && line == 0;
+                let ix = self.buffers.current_buffer_index();
                 self.status_bar.msg = match self.open(path) {
                     FileStatus::NotFound => format!("File {} could not be opened", path),
                     FileStatus::Ok => format!("File {} opened", path),
                     _ => unreachable!(),
+                };
+                if empty {
+                    self.buffers.delete_buffer(ix);
                 }
             }
             Write { path } => {
@@ -151,11 +160,19 @@ impl Editor {
             }
             SwitchToBuffer { buffer_index: ix } => if !self.buffers.is_buffer_index_valid(ix) {
                 self.status_bar.msg = format!("Invalid buffer #{}", ix);
+            } else if self.buffers.current_buffer_index() == ix{
+                self.status_bar.msg = format!("Already in buffer #{}", ix);
             } else {
                 self.buffers.switch_to(ix);
                 self.redraw_task = RedrawTask::Full;
                 self.status_bar.msg = format!("Switched to buffer #{}", ix);
             },
+            CreateBuffer => {
+                let new = self.buffers.new_buffer(Buffer::new());
+                self.buffers.switch_to(new);
+                self.redraw_task = RedrawTask::Full;
+                self.status_bar.msg = format!("Switched to buffer#{}", new);
+            }
             DeleteBuffer => {
                 let ix = self.buffers.current_buffer_index();
                 self.buffers.delete_buffer(ix);
diff --git a/src/state/editor.rs b/src/state/editor.rs
index 565c91cf0118e6457c04074790701251efaf7b85..2527a3be3ebbd928c3dff26bbe96f66d75213600 100644
--- a/src/state/editor.rs
+++ b/src/state/editor.rs
@@ -38,7 +38,7 @@ pub struct Buffer {
 
 impl Buffer {
     /// Create a new Buffer with default values.
-    fn new() -> Buffer {
+    pub fn new() -> Buffer {
         Buffer {
             raw_buffer: SplitBuffer::new(),
             current_cursor: 0,
@@ -147,7 +147,9 @@ impl BufferManager {
         if self.buffers.len() == 0 {
             self.buffers.push(Buffer::new());
             self.current_buffer_index = 0;
-        } else if self.current_buffer_index <= n {
+        } else if n == 0 {
+            self.current_buffer_index = 0;
+        } else if self.current_buffer_index >= n {
             self.current_buffer_index -= 1;
         }
     }