diff -Nura plymouth-0.9.2_old/src/libply-splash-core/ply-device-manager.c plymouth-0.9.2/src/libply-splash-core/ply-device-manager.c
--- plymouth-0.9.2_old/src/libply-splash-core/ply-device-manager.c	2017-05-11 12:24:23.366679696 +0800
+++ plymouth-0.9.2/src/libply-splash-core/ply-device-manager.c	2017-05-11 12:24:47.443734836 +0800
@@ -41,6 +41,7 @@
 #define SUBSYSTEM_DRM "drm"
 #define SUBSYSTEM_FRAME_BUFFER "graphics"
 
+static void create_seats_from_udev (ply_device_manager_t *manager);
 static void create_seat_for_terminal_and_renderer_type (ply_device_manager_t *manager,
                                                         const char           *device_path,
                                                         ply_terminal_t       *terminal,
@@ -54,15 +55,15 @@
         ply_seat_t                *local_console_seat;
         ply_list_t                *seats;
         struct udev               *udev_context;
-        struct udev_queue         *udev_queue;
-        int                        udev_queue_fd;
-        ply_fd_watch_t            *udev_queue_fd_watch;
         struct udev_monitor       *udev_monitor;
 
         ply_seat_added_handler_t   seat_added_handler;
         ply_seat_removed_handler_t seat_removed_handler;
         void                      *seat_event_handler_data;
         bool                       has_serial_consoles;
+
+        uint32_t                    local_console_managed : 1;
+        uint32_t                    local_console_is_text : 1;
 };
 
 static void
@@ -377,15 +378,17 @@
 
         if (strcmp (action, "add") == 0) {
                 const char *subsystem;
-                bool coldplug_complete = manager->udev_queue_fd_watch == NULL;
 
                 subsystem = udev_device_get_subsystem (device);
 
-                if (strcmp (subsystem, SUBSYSTEM_DRM) == 0 ||
-                    coldplug_complete)
-                        create_seat_for_udev_device (manager, device);
-                else
-                        ply_trace ("ignoring since we only handle subsystem %s devices after coldplug completes", subsystem);
+                if (strcmp (subsystem, SUBSYSTEM_DRM) == 0) {
+                        if (manager->local_console_managed && manager->local_console_is_text)
+                                ply_trace ("ignoring since we're already using text splash for local console");
+                        else
+                                create_seat_for_udev_device (manager, device);
+                } else {
+                        ply_trace ("ignoring since we only handle subsystem %s devices after timeout", subsystem);
+                }
         } else if (strcmp (action, "remove") == 0) {
                 free_seat_for_udev_device (manager, device);
         }
@@ -530,10 +533,15 @@
         if (manager == NULL)
                 return;
 
+        ply_event_loop_stop_watching_for_timeout (manager->loop,
+                                         (ply_event_loop_timeout_handler_t)
+                                         create_seats_from_udev, manager);
+
         ply_event_loop_stop_watching_for_exit (manager->loop,
                                                (ply_event_loop_exit_handler_t)
                                                detach_from_event_loop,
                                                manager);
+
         free_seats (manager);
         ply_list_free (manager->seats);
 
@@ -696,7 +704,7 @@
 {
         bool found_drm_device, found_fb_device;
 
-        ply_trace ("Looking for devices from udev");
+        ply_trace ("Timeout elapsed, looking for devices from udev");
 
         found_drm_device = create_seats_for_subsystem (manager, SUBSYSTEM_DRM);
         found_fb_device = create_seats_for_subsystem (manager, SUBSYSTEM_FRAME_BUFFER);
@@ -720,63 +728,9 @@
                                                     PLY_RENDERER_TYPE_AUTO);
 }
 
-static void
-on_udev_queue_changed (ply_device_manager_t *manager)
-{
-        if (!udev_queue_get_queue_is_empty (manager->udev_queue))
-                return;
-
-        ply_trace ("udev coldplug complete");
-        ply_event_loop_stop_watching_fd (manager->loop, manager->udev_queue_fd_watch);
-        manager->udev_queue_fd_watch = NULL;
-        udev_queue_unref (manager->udev_queue);
-
-        close (manager->udev_queue_fd);
-        manager->udev_queue_fd = -1;
-
-        manager->udev_queue = NULL;
-
-        create_seats_from_udev (manager);
-}
-
-static void
-watch_for_coldplug_completion (ply_device_manager_t *manager)
-{
-        int fd;
-        int result;
-
-        manager->udev_queue = udev_queue_new (manager->udev_context);
-
-        if (udev_queue_get_queue_is_empty (manager->udev_queue)) {
-                ply_trace ("udev coldplug completed already ");
-                create_seats_from_udev (manager);
-                return;
-        }
-
-        fd = inotify_init1 (IN_CLOEXEC);
-        result = inotify_add_watch (fd, "/run/udev", IN_MOVED_TO| IN_DELETE);
-
-        if (result < 0) {
-                ply_trace ("could not watch for udev to show up: %m");
-                close (fd);
-
-                create_fallback_seat (manager);
-                return;
-        }
-
-        manager->udev_queue_fd = fd;
-
-        manager->udev_queue_fd_watch = ply_event_loop_watch_fd (manager->loop,
-                                                                fd,
-                                                                PLY_EVENT_LOOP_FD_STATUS_HAS_DATA,
-                                                                (ply_event_handler_t)
-                                                                on_udev_queue_changed,
-                                                                NULL,
-                                                                manager);
-}
-
 void
 ply_device_manager_watch_seats (ply_device_manager_t      *manager,
+                                double                    device_timeout,
                                 ply_seat_added_handler_t   seat_added_handler,
                                 ply_seat_removed_handler_t seat_removed_handler,
                                 void                      *data)
@@ -801,7 +755,11 @@
         }
 
         watch_for_udev_events (manager);
-        watch_for_coldplug_completion (manager);
+        create_seats_for_subsystem (manager, SUBSYSTEM_DRM);
+        ply_event_loop_watch_for_timeout (manager->loop,
+                                         device_timeout,
+                                         (ply_event_loop_timeout_handler_t)
+                                         create_seats_from_udev, manager);
 }
 
 bool
diff -Nura plymouth-0.9.2_old/src/libply-splash-core/ply-device-manager.h plymouth-0.9.2/src/libply-splash-core/ply-device-manager.h
--- plymouth-0.9.2_old/src/libply-splash-core/ply-device-manager.h	2017-05-11 12:24:23.366679696 +0800
+++ plymouth-0.9.2/src/libply-splash-core/ply-device-manager.h	2017-05-11 12:24:47.443734836 +0800
@@ -40,6 +40,7 @@
 ply_device_manager_t *ply_device_manager_new (const char                *default_tty,
                                               ply_device_manager_flags_t flags);
 void ply_device_manager_watch_seats (ply_device_manager_t      *manager,
+                                     double                     device_timeout,
                                      ply_seat_added_handler_t   seat_added_handler,
                                      ply_seat_removed_handler_t seat_removed_handler,
                                      void                      *data);
diff -Nura plymouth-0.9.2_old/src/main.c plymouth-0.9.2/src/main.c
--- plymouth-0.9.2_old/src/main.c	2017-05-11 12:24:23.371679707 +0800
+++ plymouth-0.9.2/src/main.c	2017-05-11 12:24:47.444734838 +0800
@@ -107,6 +107,7 @@
 
         double                  start_time;
         double                  splash_delay;
+        double                  device_timeout;
 
         char                    kernel_command_line[PLY_MAX_COMMAND_LINE_SIZE];
         uint32_t                kernel_command_line_is_set : 1;
@@ -293,7 +294,6 @@
                char      **theme_path)
 {
         ply_key_file_t *key_file = NULL;
-        const char *delay_string;
         bool settings_loaded = false;
         const char *splash_string;
 
@@ -313,6 +313,8 @@
                   splash_string, splash_string);
 
         if (isnan (state->splash_delay)) {
+                const char *delay_string;
+
                 delay_string = ply_key_file_get_value (key_file, "Daemon", "ShowDelay");
 
                 if (delay_string != NULL) {
@@ -321,6 +323,18 @@
                 }
         }
 
+        if (isnan (state->device_timeout)) {
+                const char *timeout_string;
+
+                timeout_string = ply_key_file_get_value (key_file, "Daemon", "DeviceTimeout");
+
+                if (timeout_string != NULL) {
+                        state->device_timeout = atof (timeout_string);
+                        ply_trace ("Device timeout is set to %lf", state->device_timeout);
+                }
+        }
+
+
         settings_loaded = true;
 out:
         ply_key_file_free (key_file);
@@ -1037,6 +1051,7 @@
         manager = state->device_manager;
 
         ply_device_manager_watch_seats (state->device_manager,
+                                        state->device_timeout,
                                         (ply_seat_added_handler_t)
                                         on_seat_added,
                                         (ply_seat_removed_handler_t)
@@ -1930,7 +1945,7 @@
         check_verbosity (state);
         check_logging (state);
 
-        ply_trace ("source built on %s", __DATE__);
+        ply_trace ("source built on %s", "2017-01-19 09:38:14.000000000 +0000");
 
         state->keystroke_triggers = ply_list_new ();
         state->entry_triggers = ply_list_new ();
@@ -2198,6 +2213,7 @@
 
         state.progress = ply_progress_new ();
         state.splash_delay = NAN;
+        state.device_timeout = NAN;
 
         ply_progress_load_cache (state.progress,
                                  get_cache_file_for_mode (state.mode));
diff -Nura plymouth-0.9.2_old/src/plymouthd.defaults plymouth-0.9.2/src/plymouthd.defaults
--- plymouth-0.9.2_old/src/plymouthd.defaults	2015-02-27 02:32:41.000000000 +0800
+++ plymouth-0.9.2/src/plymouthd.defaults	2017-05-11 12:25:44.958866554 +0800
@@ -3,3 +3,4 @@
 [Daemon]
 Theme=spinner
 ShowDelay=5
+DeviceTimeout=5
