diff --git a/examples/input/main.cpp b/examples/input/main.cpp
index fa4e0be86a03bb5aa52fad77e2963a1af21fe5b7..d4688c831b746542649c79c341b36a45a29d2e5c 100644
--- a/examples/input/main.cpp
+++ b/examples/input/main.cpp
@@ -17,6 +17,10 @@ class MyComponent : ComponentVertical {
         input_1(delegate->NewChild()),
         input_2(delegate->NewChild()),
         input_3(delegate->NewChild()) {
+
+    input_1.placeholder = L"input1";
+    input_2.placeholder = L"input2";
+    input_3.placeholder = L"input3";
     Focus(&input_1);
   }
 
diff --git a/ftxui/CMakeLists.txt b/ftxui/CMakeLists.txt
index 6991e408e31d266d4cdb6beb8919d0f2cfae6743..b877ae9cc8b8b007b978342e828048dd63b55623 100644
--- a/ftxui/CMakeLists.txt
+++ b/ftxui/CMakeLists.txt
@@ -9,6 +9,7 @@ add_library(ftxui
   src/ftxui/component/input.cpp
   src/ftxui/component/menu.cpp
   src/ftxui/component/toggle.cpp
+  src/ftxui/dom/blink.cpp
   src/ftxui/dom/bold.cpp
   src/ftxui/dom/color.cpp
   src/ftxui/dom/composite_decorator.cpp
@@ -23,6 +24,7 @@ add_library(ftxui
   src/ftxui/dom/separator.cpp
   src/ftxui/dom/text.cpp
   src/ftxui/dom/underlined.cpp
+  src/ftxui/dom/util.cpp
   src/ftxui/dom/vbox.cpp
   src/ftxui/event.cpp
   src/ftxui/screen.cpp
diff --git a/ftxui/include/ftxui/README.md b/ftxui/include/ftxui/README.md
index 74e2a21fe3ade6b126cf663fa75981dc965d634b..0ad8ad1bb3ec5d7a0dfb0d7338a3ae5fea6eec8a 100644
--- a/ftxui/include/ftxui/README.md
+++ b/ftxui/include/ftxui/README.md
@@ -28,4 +28,4 @@
     * mouse
     * terminal event
 
-  You can make implement your own.
+  Implement your own!
diff --git a/ftxui/include/ftxui/component/input.hpp b/ftxui/include/ftxui/component/input.hpp
index b45256d95b76ba083ac0ee6319214590f1e5ab23..232d88e6662e6e1876bb9cf2512b598da4fcf5ae 100644
--- a/ftxui/include/ftxui/component/input.hpp
+++ b/ftxui/include/ftxui/component/input.hpp
@@ -14,8 +14,8 @@ class Input : public Component {
   ~Input() override;
 
   // State.
-  std::wstring content = L"input";
-  std::wstring placeholder = L"placeholder";
+  std::wstring content;
+  std::wstring placeholder;
 
   // State update callback.
   std::function<void()> on_change = [](){};
diff --git a/ftxui/include/ftxui/dom/elements.hpp b/ftxui/include/ftxui/dom/elements.hpp
index 37f2d30257259c3f4955c94db55246c117a40204..c24a1f6d482bf19457efdb15aa07b8535d3054d5 100644
--- a/ftxui/include/ftxui/dom/elements.hpp
+++ b/ftxui/include/ftxui/dom/elements.hpp
@@ -28,6 +28,7 @@ Element bold(Element);
 Element dim(Element);
 Element inverted(Element);
 Element underlined(Element);
+Element blink(Element);
 Element color(Color, Element);
 Element bgcolor(Color, Element);
 
@@ -37,6 +38,9 @@ Element vcenter(Element);
 Element center(Element);
 Element flex(Element);
 
+// --- Util ---
+Element nothing(Element element);
+
 template <class... Args>
 Children unpack(Args... args) {
   Children vec;
diff --git a/ftxui/include/ftxui/event.hpp b/ftxui/include/ftxui/event.hpp
index 15410d7cc20f9fdb7a4e1e06d7acafa7e1a8f37a..c276c24159518dfddddf6937b8bba2c618a680e7 100644
--- a/ftxui/include/ftxui/event.hpp
+++ b/ftxui/include/ftxui/event.hpp
@@ -9,7 +9,7 @@ namespace ftxui {
 struct Event{
  public:
   // --- Character ---
-  static Event Character(char);
+  static Event Character(int);
 
   // --- Arrow ---
   static Event ArrowLeft;
@@ -27,7 +27,7 @@ struct Event{
   bool operator==(const Event& other) { return values == other.values; }
 
   // Internal representation.
-  std::array<char, 5> values = {0, 0, 0, 0, 0};
+  std::array<int, 5> values = {0, 0, 0, 0, 0};
 };
 
 
diff --git a/ftxui/include/ftxui/screen.hpp b/ftxui/include/ftxui/screen.hpp
index 3f6fcabdbd35289a112f9d47382f8764b05daf7d..f01e410e7fde8d099cca95df3c0a1304cda4999e 100644
--- a/ftxui/include/ftxui/screen.hpp
+++ b/ftxui/include/ftxui/screen.hpp
@@ -14,10 +14,11 @@ namespace dom {
 
 struct Pixel {
   wchar_t character = U' ';
+  bool blink = false;
   bool bold = false;
+  bool dim = false;
   bool inverted = false;
   bool underlined = false;
-  bool dim = false;
   Color background_color = Color::Default;
   Color foreground_color = Color::Default;
 };
diff --git a/ftxui/src/ftxui/component/input.cpp b/ftxui/src/ftxui/component/input.cpp
index 3ed3addd8750f55810cddc95883d57da5c7c5a04..77e53d66d649b0f57fe8bdbfbc8287f128119ce6 100644
--- a/ftxui/src/ftxui/component/input.cpp
+++ b/ftxui/src/ftxui/component/input.cpp
@@ -9,36 +9,69 @@ Input::~Input() {}
 
 // Component implementation.
 dom::Element Input::Render() {
-  bool is_place_ho
-  std::wstring& displayed_text = content.size() ? content : placeholder;
-
   using namespace dom;
-  if (Focused())
-    return flex(inverted(text(displayed_text)));
-  else
-    return flex(text(displayed_text));
+  bool is_focused = Focused();
+
+  // Placeholder.
+  if (content.size() == 0) {
+    if (is_focused)
+      return flex(inverted(dim(text(placeholder))));
+    else
+      return flex(dim(text(placeholder)));
+  }
+
+  // Not focused.
+  if (!is_focused)
+    return flex(text(content));
+
+  std::wstring part_before_cursor = content.substr(0,cursor_position);
+  std::wstring part_at_cursor = cursor_position < (int)content.size()
+                                    ? content.substr(cursor_position, 1)
+                                    : L" ";
+  std::wstring part_after_cursor = cursor_position < (int)content.size() - 1
+                                       ? content.substr(cursor_position + 1)
+                                       : L"";
+  return flex(inverted(hbox(             //
+      text(part_before_cursor),          //
+      underlined(text(part_at_cursor)),  //
+      text(part_after_cursor)            //
+      )));                               //
 }
 bool Input::OnEvent(Event event) {
   std::wstring c;
 
-  // Backspace
+  // Backspace.
   if (event == Event::Backspace) {
-    if (content.size() != 0)
-      content = content.substr(0, content.size()-1);
+    if (cursor_position == 0)
+      return false;
+    content.erase(cursor_position - 1, 1);
+    cursor_position--;
     return true;
   }
 
-  // Enter
+  // Enter.
   if (event == Event::Return) {
     return true;
   }
 
+  if (event == Event::ArrowLeft && cursor_position > 0) {
+    cursor_position--;
+    return true;
+  }
+
+  if (event == Event::ArrowRight && cursor_position < (int)content.size()) {
+    cursor_position++;
+    return true;
+  }
+
+  // Content
   constexpr char ESC = char(27);
   if (event.values[0] != ESC) {
-    content += event.values[0];
+    wchar_t v = (char)event.values[0];
+    content.insert(cursor_position, 1, v);
+    cursor_position++;
     return true;
   }
-
   return false;
 }
 
diff --git a/ftxui/src/ftxui/event.cpp b/ftxui/src/ftxui/event.cpp
index f4fe123176da83b1ffeb599a4990305b88dae746..ed232f28ee50aa4cf40dc1e42768bc0b14a358d4 100644
--- a/ftxui/src/ftxui/event.cpp
+++ b/ftxui/src/ftxui/event.cpp
@@ -2,10 +2,10 @@
 
 namespace ftxui {
 
-constexpr char ESC = char(27);
+constexpr int ESC = int(27);
 
 // --- Character ---
-Event Event::Character(char c) {
+Event Event::Character(int c) {
   return Event{c};
 }
 
@@ -16,10 +16,10 @@ Event Event::ArrowUp{ESC, '[', 'A'};
 Event Event::ArrowDown{ESC, '[', 'B'};
 
 // --- Other ---
-Event Event::Backspace{char(127)};
+Event Event::Backspace{127};
 Event Event::Delete{ESC, '[', '3', '~'};
 Event Event::Escape{ESC};
-Event Event::Return{char(10)};
+Event Event::Return{10};
 
 Event Event::F1{ESC, '[', 'O', 'P'};
 Event Event::F2{ESC, '[', 'O', 'Q'};
diff --git a/ftxui/src/ftxui/screen.cpp b/ftxui/src/ftxui/screen.cpp
index a3adeefe5980a61777dca4b7c014337d3cf0ee2f..79cc866a4611529698837a3b7360cb2c7bbeaa8f 100644
--- a/ftxui/src/ftxui/screen.cpp
+++ b/ftxui/src/ftxui/screen.cpp
@@ -45,6 +45,13 @@ std::string Screen::ToString() {
           ss << L"\e[22m";
         }
       }
+      if (pixels_[y][x].blink != previous_pixel.blink) {
+        if (pixels_[y][x].blink) {
+          ss << L"\e[5m";
+        } else {
+          ss << L"\e[25m";
+        }
+      }
       if (pixels_[y][x].foreground_color != previous_pixel.foreground_color) {
         ss << L"\e[" + to_wstring(std::to_string(
                            (uint8_t)pixels_[y][x].foreground_color)) +
diff --git a/ftxui/src/ftxui/screen_interactive.cpp b/ftxui/src/ftxui/screen_interactive.cpp
index 3b2d49dd986f1e48a4f8622e5bdf4ef4f2362ca1..7e157e352a3fc51f9e88fdcb85ed3266c5a905d3 100644
--- a/ftxui/src/ftxui/screen_interactive.cpp
+++ b/ftxui/src/ftxui/screen_interactive.cpp
@@ -9,16 +9,30 @@
 namespace ftxui {
 
 namespace {
-  constexpr char ESC = char(27);
+  constexpr int ESC = 27;
+  constexpr int WAT = 195;
+  constexpr int WATWAIT = 91;
 
   Event GetEvent() {
-    char v1 = char(getchar());
-    if (v1 != ESC)
-      return Event{v1};
+    int v1 = getchar();
+    if (v1 == ESC) {
+      int v2 = getchar();
+      int v3 = getchar();
+
+      //if (v2 == WATWAIT) {
+        //int v4 = getchar();
+        //int v5 = getchar();
+        //return Event{v1, v2, v3, v4, v5};
+      //}
+      return Event{v1, v2, v3};
+    }
+
+    if (v1 == WAT) {
+      int v2 = getchar();
+      return Event{v1, v2};
+    }
 
-    char v2 = char(getchar());
-    char v3 = char(getchar());
-    return Event{v1,v2,v3};
+    return Event{v1};
   };
 };