diff --git a/src/core/exec.rs b/src/core/exec.rs
index 1d18425e548d0084089e4e43b7afcc8c1b2ba4de..820cdc0a5f003821849dfb353d6b1b4bd81d81d8 100644
--- a/src/core/exec.rs
+++ b/src/core/exec.rs
@@ -70,7 +70,7 @@ impl Editor {
                     String::new()
                 };
                 let last = ind.len();
-                self.buffers.current_buffer_mut().insert_line(y, ind.into());
+                self.buffers.current_buffer_mut().insert_line(y + 1, ind.into());
                 self.goto((last, y + 1));
                 self.cursor_mut().mode =
                     Mode::Primitive(PrimitiveMode::Insert(InsertOptions {
diff --git a/src/edit/buffer.rs b/src/edit/buffer.rs
index ab2aa8eb9ad3148b5d2c290766ddc5b356d347a3..69819c4bdcdad572db35cd8dc22e285287c4de75 100644
--- a/src/edit/buffer.rs
+++ b/src/edit/buffer.rs
@@ -155,8 +155,8 @@ impl<'a> TextBuffer<'a> for SplitBuffer {
     fn insert_line(&mut self, n: usize, line: String) {
         if n < self.before.len() {
             self.before.insert(n, line);
-        } else if n < self.len() {
-            let n = self.len() - 1 - n;
+        } else if n <= self.len() {
+            let n = self.len() - n;
             self.after.insert(n, line);
         } else {
             panic!("Out of bound");
diff --git a/src/edit/insert.rs b/src/edit/insert.rs
index c892d65aa2253a009f734b0abe0bc6986f000e58..5fe4b9a62619206ccedbf2dbcdfadfca07b23836 100644
--- a/src/edit/insert.rs
+++ b/src/edit/insert.rs
@@ -38,7 +38,7 @@ impl Editor {
                 };
                 let begin = nl.len();
 
-                self.buffers.current_buffer_mut().insert_line(y, nl + &second_part);
+                self.buffers.current_buffer_mut().insert_line(y + 1, nl + &second_part);
 
                 self.redraw_task = RedrawTask::LinesAfter(y);
                 self.goto((begin, y + 1));