diff --git a/gdk/wayland/gdkdevice-wayland.c b/gdk/wayland/gdkdevice-wayland.c
index bc52fb1..b5842ba 100644
--- a/gdk/wayland/gdkdevice-wayland.c
+++ b/gdk/wayland/gdkdevice-wayland.c
@@ -441,7 +441,27 @@ gdk_wayland_device_window_at_position (GdkDevice       *device,
   if (mask)
     *mask = wd->modifiers;
 
-  return wd->pointer_focus;
+  if (wd->pointer_focus)
+    return wd->pointer_focus;
+
+  /* if we have exactly one touch just return its GdkWindow */
+  if (g_hash_table_size (wd->touches) == 1)
+    {
+      GList *values = g_hash_table_get_values (wd->touches);
+      GdkWaylandTouchData *touch = values->data;
+      GdkWindow *window = touch->window;
+
+      if (win_x)
+	*win_x = touch->x;
+      if (win_y)
+	*win_y = touch->y;
+
+      g_list_free (values);
+
+      return window;
+    }
+
+  return NULL;
 }
 
 static void
@@ -1630,6 +1650,11 @@ seat_handle_capabilities (void                    *data,
       device_manager->devices =
         g_list_prepend (device_manager->devices, device->touch);
 
+      /* TODO: this isn't right. it'll remove any drop context we already have with
+       * a pointer */
+      device->drop_context = _gdk_wayland_drop_context_new (device->touch,
+                                                            device->data_device);
+
       g_signal_emit_by_name (device_manager, "device-added", device->touch);
     }
   else if (!(caps & WL_SEAT_CAPABILITY_TOUCH) && device->wl_touch)
