diff --git a/src/compositor/wayland_wrapper/wlinputdevice.cpp b/src/compositor/wayland_wrapper/wlinputdevice.cpp
index f908fe41e5b9e5757a29abdcb257fde100f268eb..fd08624b64a2d359882e46d77ffdc8b162094b36 100644
--- a/src/compositor/wayland_wrapper/wlinputdevice.cpp
+++ b/src/compositor/wayland_wrapper/wlinputdevice.cpp
@@ -220,17 +220,21 @@ void InputDevice::setMouseFocus(Surface *surface, const QPoint &globalPos, const
                                       localPos.x(), localPos.y());
 }
 
-void InputDevice::clientRequestedDataDevice(DataDeviceManager *data_device_manager, struct wl_client *client, uint32_t id)
+void InputDevice::cleanupDataDeviceForClient(struct wl_client *client)
 {
     for (int i = 0; i < m_data_devices.size(); i++) {
         struct wl_resource *data_device_resource =
                 m_data_devices.at(i)->dataDeviceResource();
         if (data_device_resource->client == client) {
             m_data_devices.removeAt(i);
-            free(data_device_resource);
             break;
         }
     }
+}
+
+void InputDevice::clientRequestedDataDevice(DataDeviceManager *data_device_manager, struct wl_client *client, uint32_t id)
+{
+    cleanupDataDeviceForClient(client);
     DataDevice *dataDevice = new DataDevice(data_device_manager,client,id);
     m_data_devices.append(dataDevice);
 }
@@ -328,7 +332,7 @@ void InputDevice::destroy_resource(wl_resource *resource)
         input_device->base()->pointer_focus_resource = 0;
     }
 
-    input_device->m_data_devices.clear();
+    input_device->cleanupDataDeviceForClient(resource->client);
 
     wl_list_remove(&resource->link);
 
diff --git a/src/compositor/wayland_wrapper/wlinputdevice.h b/src/compositor/wayland_wrapper/wlinputdevice.h
index ac105d56d58176e068221ab7350baf578ddb595e..05980b6696abae67aacb4c071b60f11db2d27f87 100644
--- a/src/compositor/wayland_wrapper/wlinputdevice.h
+++ b/src/compositor/wayland_wrapper/wlinputdevice.h
@@ -89,7 +89,10 @@ public:
 
     Compositor *compositor() const;
     WaylandInputDevice *handle() const;
+
 private:
+    void cleanupDataDeviceForClient(struct wl_client *client);
+
     WaylandInputDevice *m_handle;
     Compositor *m_compositor;
     QList<DataDevice *>m_data_devices;