diff --git a/kiosk-shell/kiosk-shell.c b/kiosk-shell/kiosk-shell.c
index 4efe261a97ffb1d729b596b8a542800833c8c850..a2de28ec786a4aa15da4e85a02ba73e3076860fd 100644
--- a/kiosk-shell/kiosk-shell.c
+++ b/kiosk-shell/kiosk-shell.c
@@ -65,6 +65,20 @@ get_kiosk_shell_seat(struct weston_seat *seat)
 			    struct kiosk_shell_seat, seat_destroy_listener);
 }
 
+
+static struct weston_seat *
+get_kiosk_shell_first_seat(struct kiosk_shell *shell)
+{
+	struct wl_list *node;
+	struct weston_compositor *compositor = shell->compositor;
+
+	if (wl_list_empty(&compositor->seat_list))
+		return NULL;
+
+	node = compositor->seat_list.next;
+	return container_of(node, struct weston_seat, link);
+}
+
 static void
 transform_handler(struct wl_listener *listener, void *data)
 {
@@ -343,6 +357,36 @@ kiosk_shell_surface_create(struct kiosk_shell *shell,
 	return shsurf;
 }
 
+static void
+kiosk_shell_surface_activate(struct kiosk_shell_surface *shsurf,
+			     struct kiosk_shell_seat *kiosk_seat,
+			     uint32_t activate_flags)
+{
+	struct weston_desktop_surface *dsurface = shsurf->desktop_surface;
+	struct weston_surface *surface =
+		weston_desktop_surface_get_surface(dsurface);
+
+	/* keyboard focus */
+	weston_view_activate_input(shsurf->view, kiosk_seat->seat, activate_flags);
+
+	/* xdg-shell deactivation if there's a focused one */
+	if (kiosk_seat->focused_surface) {
+		struct kiosk_shell_surface *current_focus =
+			get_kiosk_shell_surface(kiosk_seat->focused_surface);
+		struct weston_desktop_surface *dsurface_focus;
+		assert(current_focus);
+
+		dsurface_focus = current_focus->desktop_surface;
+		if (--current_focus->focus_count == 0)
+			weston_desktop_surface_set_activated(dsurface_focus, false);
+	}
+
+	/* xdg-shell activation for the new one */
+	kiosk_seat->focused_surface = surface;
+	if (shsurf->focus_count++ == 0)
+		weston_desktop_surface_set_activated(dsurface, true);
+}
+
 /*
  * kiosk_shell_seat
  */
@@ -350,26 +394,7 @@ kiosk_shell_surface_create(struct kiosk_shell *shell,
 static void
 kiosk_shell_seat_handle_keyboard_focus(struct wl_listener *listener, void *data)
 {
-	struct weston_keyboard *keyboard = data;
-	struct kiosk_shell_seat *shseat = get_kiosk_shell_seat(keyboard->seat);
-
-	if (shseat->focused_surface) {
-		struct kiosk_shell_surface *shsurf =
-			get_kiosk_shell_surface(shseat->focused_surface);
-		if (shsurf && --shsurf->focus_count == 0)
-			weston_desktop_surface_set_activated(shsurf->desktop_surface,
-							     false);
-	}
-
-	shseat->focused_surface = weston_surface_get_main_surface(keyboard->focus);
-
-	if (shseat->focused_surface) {
-		struct kiosk_shell_surface *shsurf =
-			get_kiosk_shell_surface(shseat->focused_surface);
-		if (shsurf && shsurf->focus_count++ == 0)
-			weston_desktop_surface_set_activated(shsurf->desktop_surface,
-							     true);
-	}
+	/* FIXME: To be removed later. */
 }
 
 static void
@@ -619,7 +644,8 @@ desktop_surface_added(struct weston_desktop_surface *desktop_surface,
  * parentage. */
 static struct weston_view *
 find_focus_successor(struct weston_layer *layer,
-		     struct kiosk_shell_surface *shsurf)
+		     struct kiosk_shell_surface *shsurf,
+		     struct weston_surface *focused_surface)
 {
 	struct kiosk_shell_surface *parent_root =
 		kiosk_shell_surface_get_parent_root(shsurf);
@@ -659,17 +685,27 @@ desktop_surface_removed(struct weston_desktop_surface *desktop_surface,
 		weston_desktop_surface_get_surface(desktop_surface);
 	struct weston_view *focus_view;
 	struct weston_seat *seat;
+	struct kiosk_shell_seat* kiosk_seat;
 
 	if (!shsurf)
 		return;
 
-	focus_view = find_focus_successor(&shell->normal_layer, shsurf);
+	seat = get_kiosk_shell_first_seat(shell);
+	kiosk_seat = get_kiosk_shell_seat(seat);
+
+	if (seat && kiosk_seat) {
+		focus_view = find_focus_successor(&shell->normal_layer, shsurf,
+						  kiosk_seat->focused_surface);
 
-	if (focus_view) {
-		wl_list_for_each(seat, &shell->compositor->seat_list, link) {
-			struct weston_keyboard *keyboard = seat->keyboard_state;
-			if (keyboard && keyboard->focus == surface)
-				weston_view_activate_input(focus_view, seat, 0);
+		if (focus_view) {
+			struct kiosk_shell_surface *focus_shsurf =
+				get_kiosk_shell_surface(focus_view->surface);
+
+			kiosk_shell_surface_activate(focus_shsurf, kiosk_seat,
+						     WESTON_ACTIVATE_FLAG_NONE);
+		} else {
+			if (kiosk_seat->focused_surface == surface)
+				kiosk_seat->focused_surface = NULL;
 		}
 	}
 
@@ -687,6 +723,8 @@ desktop_surface_committed(struct weston_desktop_surface *desktop_surface,
 	bool is_resized;
 	bool is_fullscreen;
 
+	assert(shsurf);
+
 	if (surface->width == 0)
 		return;
 
@@ -716,15 +754,19 @@ desktop_surface_committed(struct weston_desktop_surface *desktop_surface,
 	}
 
 	if (!weston_surface_is_mapped(surface)) {
-		struct weston_seat *seat;
+		struct weston_seat *seat =
+			get_kiosk_shell_first_seat(shsurf->shell);
+		struct kiosk_shell_seat *kiosk_seat;
 
 		weston_layer_entry_insert(&shsurf->shell->normal_layer.view_list,
 					  &shsurf->view->layer_link);
 		shsurf->view->is_mapped = true;
 		surface->is_mapped = true;
 
-		wl_list_for_each(seat, &shsurf->shell->compositor->seat_list, link)
-			weston_view_activate_input(shsurf->view, seat, 0);
+		kiosk_seat = get_kiosk_shell_seat(seat);
+		if (seat && kiosk_seat)
+			kiosk_shell_surface_activate(shsurf, kiosk_seat,
+						     WESTON_ACTIVATE_FLAG_NONE);
 	}
 
 	if (!is_fullscreen && (sx != 0 || sy != 0)) {
@@ -916,6 +958,8 @@ kiosk_shell_activate_view(struct kiosk_shell *shell,
 		weston_surface_get_main_surface(view->surface);
 	struct kiosk_shell_surface *shsurf =
 		get_kiosk_shell_surface(main_surface);
+	struct kiosk_shell_seat *kiosk_seat =
+		get_kiosk_shell_seat(seat);
 
 	if (!shsurf)
 		return;
@@ -932,7 +976,8 @@ kiosk_shell_activate_view(struct kiosk_shell *shell,
 		weston_surface_damage(view->surface);
 	}
 
-	weston_view_activate_input(view, seat, flags);
+	if (kiosk_seat)
+		kiosk_shell_surface_activate(shsurf, kiosk_seat, flags);
 }
 
 static void