diff --git a/src/main.rs b/src/main.rs
index 41ee3a7..d51a40d 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -12,8 +12,9 @@ use std::{
 #[derive(Default)]
 struct Nuudel {
 	quitting: bool,
-	cursorx: i32,
-	cursory: i32,
+	cursorx: u16,
+	cursory: u16,
+	buffer: String,
 }
 
 fn main() -> Result<()> {
@@ -36,10 +37,9 @@ fn main() -> Result<()> {
 impl Nuudel {
 
 	pub fn run(&mut self, stdout: &mut Stdout) -> Result<()> {
-		print!("Press Q to quit");
 		while !self.quitting {
 			self.handle_events()?;
-			stdout.flush()?;
+			self.draw_terminal(stdout)?;
 		}
 		Ok(())
 	}
@@ -51,6 +51,7 @@ impl Nuudel {
 	}
 
 	fn restore_terminal() -> Result<()> {
+		stdout().execute(cursor::Show)?;
 		stdout().execute(terminal::LeaveAlternateScreen)?;
 		terminal::disable_raw_mode()?;
 		Ok(())
@@ -70,16 +71,24 @@ impl Nuudel {
 						print!("█");
 					},
 					KeyCode::Left => {
-						stdout().execute(cursor::MoveLeft(1))?;
+						if self.cursorx > 0 {
+							self.cursorx -= 1;
+							self.cursorx = self.cursorx.clamp(0, terminal::size()?.0-1);
+						}
 					},
 					KeyCode::Right => {
-						stdout().execute(cursor::MoveRight(1))?;
+						self.cursorx += 1;
+						self.cursorx = self.cursorx.clamp(0, terminal::size()?.0-1);
 					},
 					KeyCode::Up => {
-						stdout().execute(cursor::MoveUp(1))?;
+						if self.cursory > 0 {
+							self.cursory -= 1;
+						}
+						self.cursory = self.cursory.clamp(0, terminal::size()?.1-1);
 					},
 					KeyCode::Down => {
-						stdout().execute(cursor::MoveDown(1))?;
+						self.cursory += 1;
+						self.cursory = self.cursory.clamp(0, terminal::size()?.1-1);
 					},
 					_ => {}
 				},
@@ -88,4 +97,42 @@ impl Nuudel {
 		}
 		Ok(())
 	}
+
+	fn draw_terminal(&mut self, stdout: &mut Stdout) -> Result<()> {
+		//stdout.execute(terminal::BeginSynchronizedUpdate)?;
+		stdout.execute(cursor::Hide)?;
+		stdout.execute(cursor::MoveTo(0, 0))?;
+
+		let mut y = 0;
+		self.buffer = "\n".to_string();
+		let buffer_lines = self.buffer.lines().count() as u16;
+
+		while y < terminal::size()?.1 - buffer_lines {
+			self.buffer.push_str("~\n");
+			y += 1;
+		}
+
+		// Draw buffer one by one
+		y = 0;
+		let mut lines = self.buffer.lines();
+		while y < terminal::size()?.1-1 {
+			stdout.execute(terminal::Clear(terminal::ClearType::CurrentLine))?;
+			let line = lines.next();
+			if line.is_none() {
+				break;
+			}
+			write!(stdout, "{}", line.unwrap())?;
+			stdout.execute(cursor::MoveToNextLine(1))?;
+			y += 1;
+		}
+		print!("Press Q to quit");
+
+		//stdout.execute(terminal::EndSynchronizedUpdate)?;
+		stdout.execute(cursor::MoveTo(self.cursorx, self.cursory))?;
+		stdout.execute(cursor::Show)?;
+
+		std::thread::sleep(Duration::from_millis(16));
+
+		Ok(())
+	}
 }