diff --git a/papersurfer/papersurfer.py b/papersurfer/papersurfer.py
index 709dc8d86f0ce18b05fe0c9970a4d30ff297aae4..c09d4d0840733578378c2ae7cd67c81540682a17 100644
--- a/papersurfer/papersurfer.py
+++ b/papersurfer/papersurfer.py
@@ -251,7 +251,7 @@ class Papersurfer:
         """Open submit paper dialog."""
         self._pile = urwid.Pile(
             [
-                PostDialog(self.mtm, close=self.h_close_dialog)
+                PostDialog(self.mtm, self.h_close_dialog, self.mainloop)
             ]
         )
         self._over = urwid.Overlay(
@@ -322,7 +322,10 @@ class PostDialog(urwid.WidgetWrap):
 
         [Submit]       [Close]
     """
-    def __init__(self, mattermost, close):
+    def __init__(self, mattermost, close, loop):
+        self._loop = loop
+        self.alarm_handle = None
+
         self.doi = None
         self.msg = None
         self.mattermost = mattermost
@@ -371,11 +374,18 @@ class PostDialog(urwid.WidgetWrap):
         return msg
 
     def h_input(self, _, doi):
-        """Handle doi input field."""
-        self.doi_result.set_text("... loading ...")
+        """Handle doi input field and debounce."""
+        self.doi_result.set_text("")
         self.doi = None
         self.msg = None
 
+        self._loop.remove_alarm(self.alarm_handle)
+        self.alarm_handle = self._loop.set_alarm_in(.5, self.search_doi, doi)
+
+    def search_doi(self, _loop, doi):
+        """Trigger search for paper ref by doi and update ui."""
+        self.doi_result.set_text("... loading ...")
+        self._loop.draw_screen()
         if Doi().extract_doi(doi):
             paper = Doi().get_info(doi)
             if paper:
@@ -386,6 +396,8 @@ class PostDialog(urwid.WidgetWrap):
                     self.doi_result.set_text(self.create_mgs(paper))
                     self.doi = doi
                     self.msg = self.create_mgs(paper)
+            else:
+                self.doi_result.set_text("Doi not found.")
             return
 
         self.doi_result.set_text("invalid doi")