diff --git a/src/compositor.c b/src/compositor.c
index 3af7f9367831d22f72463903ceaac30165a59a63..18e657018da2de27059cc65f62818af7fb7d5108 100644
--- a/src/compositor.c
+++ b/src/compositor.c
@@ -4151,6 +4151,14 @@ weston_compositor_shutdown(struct weston_compositor *ec)
 	weston_config_destroy(ec->config);
 }
 
+WL_EXPORT void
+weston_compositor_exit_with_code(struct weston_compositor *compositor,
+				 int exit_code)
+{
+	compositor->exit_code = exit_code;
+	wl_display_terminate(compositor->wl_display);
+}
+
 WL_EXPORT void
 weston_compositor_set_default_pointer_grab(struct weston_compositor *ec,
 			const struct weston_pointer_grab_interface *interface)
@@ -4764,6 +4772,7 @@ int main(int argc, char *argv[])
 
 	ec->idle_time = idle_time;
 	ec->default_pointer_grab = NULL;
+	ec->exit_code = EXIT_SUCCESS;
 
 	for (i = 1; i < argc; i++)
 		weston_log("fatal: unhandled option: %s\n", argv[i]);
@@ -4829,6 +4838,14 @@ int main(int argc, char *argv[])
 
 	wl_display_run(display);
 
+	/* Allow for setting return exit code after
+	 * wl_display_run returns normally. This is
+	 * useful for devs/testers and automated tests
+	 * that want to indicate failure status to
+	 * testing infrastructure above
+	 */
+	ret = ec->exit_code;
+
 out:
 	/* prevent further rendering while shutting down */
 	ec->state = WESTON_COMPOSITOR_OFFSCREEN;
diff --git a/src/compositor.h b/src/compositor.h
index a0aef0299803f9aac75e5416cfb1b61308d9b9ea..e936edad81385344ec25cb900b8782500e4c8d19 100644
--- a/src/compositor.h
+++ b/src/compositor.h
@@ -664,6 +664,8 @@ struct weston_compositor {
 	int32_t kb_repeat_delay;
 
 	clockid_t presentation_clock;
+
+	int exit_code;
 };
 
 struct weston_buffer {
@@ -1264,6 +1266,9 @@ weston_compositor_set_presentation_clock_software(
 void
 weston_compositor_shutdown(struct weston_compositor *ec);
 void
+weston_compositor_exit_with_code(struct weston_compositor *compositor,
+				 int exit_code);
+void
 weston_output_init_zoom(struct weston_output *output);
 void
 weston_output_update_zoom(struct weston_output *output);