diff --git a/repos/os/src/server/event_dump/main.cc b/repos/os/src/server/event_dump/main.cc
new file mode 100644
index 0000000000..c82767f6c1
--- /dev/null
+++ b/repos/os/src/server/event_dump/main.cc
@@ -0,0 +1,90 @@
+/*
+ * \brief Event service that prints incoming events
+ * \author Norman Feske
+ * \date 2020-08-11
+ */
+
+/*
+ * Copyright (C) 2020 Genode Labs GmbH
+ *
+ * This file is part of the Genode OS framework, which is distributed
+ * under the terms of the GNU Affero General Public License version 3.
+ */
+
+/* Genode includes */
+#include
+#include
+#include
+#include
+#include
+
+namespace Test {
+
+ using namespace Genode;
+
+ struct Event_session;
+ struct Main;
+}
+
+
+struct Test::Event_session : Rpc_object
+{
+ Attached_ram_dataspace _ds;
+
+ unsigned _event_cnt = 0;
+ int _key_cnt = 0;
+
+ Dataspace_capability dataspace() { return _ds.cap(); }
+
+ void submit_batch(unsigned count)
+ {
+ size_t const max_events = _ds.size() / sizeof(Input::Event);
+
+ if (count > max_events)
+ warning("number of events exceeds dataspace capacity");
+
+ count = min(count, max_events);
+
+ Input::Event const * const events = _ds.local_addr();
+
+ for (unsigned i = 0; i < count; i++) {
+
+ Input::Event const &ev = events[i];
+
+ if (ev.press()) ++_key_cnt;
+ if (ev.release()) --_key_cnt;
+
+ log("Input event #", _event_cnt++, "\t", ev, "\tkey count: ", _key_cnt);
+ }
+ }
+
+ Event_session(Env &env) : _ds(env.ram(), env.rm(), 4096) { }
+};
+
+
+/******************
+ ** Main program **
+ ******************/
+
+struct Test::Main
+{
+ Env &_env;
+
+ Event_session _event_session { _env };
+
+ /*
+ * Attach root interfaces to the entry point
+ */
+ Static_root _event_root { _env.ep().manage(_event_session) };
+
+ Main(Env &env)
+ :
+ _env(env)
+ {
+ _env.parent().announce(env.ep().manage(_event_root));
+ }
+};
+
+
+void Component::construct(Genode::Env &env) { static Test::Main main(env); }
+
diff --git a/repos/os/src/server/event_dump/target.mk b/repos/os/src/server/event_dump/target.mk
new file mode 100644
index 0000000000..0ca4ccdcbf
--- /dev/null
+++ b/repos/os/src/server/event_dump/target.mk
@@ -0,0 +1,3 @@
+TARGET = event_dump
+SRC_CC = main.cc
+LIBS = base