diff --git a/lib/neovim/async_session.rb b/lib/neovim/async_session.rb
index <HASH>..<HASH> 100644
--- a/lib/neovim/async_session.rb
+++ b/lib/neovim/async_session.rb
@@ -38,7 +38,7 @@ module Neovim
           message_cb.call(Request.new(method, args, @msgpack_stream, reqid))
         when 1
           reqid, (_, error), result = rest
-          @pending_requests.fetch(reqid).call(error, result)
+          @pending_requests.delete(reqid).call(error, result)
         when 2
           method, args = rest
           message_cb.call(Notification.new(method, args))
diff --git a/lib/neovim/session.rb b/lib/neovim/session.rb
index <HASH>..<HASH> 100644
--- a/lib/neovim/session.rb
+++ b/lib/neovim/session.rb
@@ -21,8 +21,8 @@ module Neovim
     def run(&message_cb)
       message_cb ||= Proc.new {}
 
-      until @pending_messages.empty?
-        in_handler_fiber { message_cb.call(@pending_messages.shift) }
+      while message = @pending_messages.shift
+        in_handler_fiber { message_cb.call(message) }
       end
 
       @async_session.run(self) do |message|
Cleanup

- Delete reqids when responding
- Shorten enqueued message flushing