diff --git a/repos/os/run/input_filter.run b/repos/os/run/input_filter.run
new file mode 100644
index 0000000000..a13a6ee37a
--- /dev/null
+++ b/repos/os/run/input_filter.run
@@ -0,0 +1,355 @@
+#
+# Build
+#
+
+set build_components {
+ core init drivers/timer
+ server/report_rom server/input_filter test/input_filter
+}
+
+build $build_components
+
+create_boot_directory
+
+#
+# Generate config
+#
+
+append config {
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+}
+
+install_config $config
+
+#
+# Boot modules
+#
+
+set boot_modules { core ld.lib.so init timer report_rom
+ input_filter test-input_filter }
+
+build_boot_image $boot_modules
+
+append qemu_args " -nographic "
+
+run_genode_until {.*child "test-input_filter" exited with exit value 0.*} 60
+
diff --git a/repos/os/src/server/input_filter/README b/repos/os/src/server/input_filter/README
new file mode 100644
index 0000000000..fbf07aec6a
--- /dev/null
+++ b/repos/os/src/server/input_filter/README
@@ -0,0 +1,110 @@
+This component transforms input events originating from multiple sources.
+
+
+Configuration
+-------------
+
+An input-filter configuration consists of two parts, a declaration of
+input sources ("Input" connections) that the component should request,
+and the definition of a filter chain. Each input source is defined via
+an '' node with the name of the input source as 'name' attribute and
+the session label as 'label' attribute. The latter can be used to route
+several input sources to different components, i.e, input device drivers.
+
+The filter chain is defined via one '