diff --git a/protocol/wayland.xml b/protocol/wayland.xml
index e1d11cb..dc9659e 100644
--- a/protocol/wayland.xml
+++ b/protocol/wayland.xml
@@ -7,7 +7,7 @@
 
     Permission to use, copy, modify, distribute, and sell this
     software and its documentation for any purpose is hereby granted
-    without fee, provided that\n the above copyright notice appear in
+    without fee, provided that the above copyright notice appear in
     all copies and that both that copyright notice and this permission
     notice appear in supporting documentation, and that the name of
     the copyright holders not be used in advertising or publicity
@@ -180,14 +180,6 @@
       <arg name="edges" type="uint"/>
     </request>
 
-    <request name="create_drag">
-      <arg name="id" type="new_id" interface="wl_drag"/>
-    </request>
-
-    <request name="create_selection">
-      <arg name="id" type="new_id" interface="wl_selection"/>
-    </request>
-
     <!-- Make the surface visible as a toplevel window. -->
     <request name="set_toplevel">
       <arg name="surface" type="object" interface="wl_surface"/>
@@ -236,7 +228,28 @@
     </event>
   </interface>
 
-  <interface name="wl_selection" version="1">
+
+  <interface name="wl_transfer" version="1">
+    <request name="receive">
+      <arg name="mime_type" type="string"/>
+      <arg name="fd" type="fd"/>
+    </request>
+
+    <!-- FIXME: Better name? -->
+    <request name="take" type="destructor"/>
+
+    <request name="destroy" type="destructor"/>
+
+    <!-- Sent before the pointer_focus event to announce the types
+         offered.  One event per offered mime type.  Use sync callback
+         to mark end of list. -->
+    <event name="offer">
+      <arg name="type" type="string"/>
+    </event>
+  </interface>
+
+
+  <interface name="wl_transfer_source" version="1">
     <!-- Add an offered mime type.  Can be called several times to
          offer multiple types, but must be called before 'activate'. -->
     <request name="offer">
@@ -244,10 +257,7 @@
     </request>
 
     <!-- Can the selection be activated for multiple devices? -->
-    <request name="activate">
-      <arg name="input_device" type="object" interface="wl_input_device"/>
-      <arg name="time" type="uint"/>
-    </request>
+    <request name="activate"/>
 
     <!-- Destroy the selection. -->
     <request name="destroy" type="destructor"/>
@@ -261,97 +271,66 @@
 
     <!-- Another selection became active. -->
     <event name="cancelled"/>
-  </interface>
 
-  <interface name="wl_selection_offer" version="1">
-    <!-- Called to receive the selection data as the specified type.
-         Sends the pipe fd to the compositor, which forwards it to the
-         source in the 'send' event -->
-    <request name="receive">
+    <!-- dnd: Sent when a target accepts pointer_focus or motion
+         events.  If a target does not accept any of the offered
+         types, type is NULL -->
+    <event name="target">
       <arg name="mime_type" type="string"/>
-      <arg name="fd" type="fd"/>
-    </request>
-
-    <!-- Sent before the keyboard_focus event to announce the types
-         offered.  One event per offered mime type.  A mime type of
-         NULL means the selection offer is going away.  -->
-    <event name="offer">
-      <arg name="type" type="string"/>
     </event>
 
-    <event name="keyboard_focus">
-      <arg name="input_device" type="object" interface="wl_input_device"/>
+    <!-- Sent when the drag is finished.  The server has destroyed the
+         drag source at this point. -->
+    <event name="finish">
+      <!-- Acknowledge successful transfer, in case of cut-and-paste or
+	   dnd move operation that transfers ownership.  for example
+	   file cut and paste, where the file isn't removed until a
+	   destination has ackno. -->
+      <arg name="transfer" type="uint"/>
     </event>
   </interface>
 
+
   <interface name="wl_drag" version="1">
-    <!-- Add an offered mime type.  Can be called several times to
-         offer multiple types, but must be called before 'activate'. -->
-    <request name="offer">
-      <arg name="type" type="string"/>
+    <request name="create_device">
+      <arg name="id" type="new_id" interface="wl_transfer_device"/>
+      <arg name="input_device" type="object" interface="wl_input_device"/>
     </request>
+  </interface>
 
-    <request name="activate">
+  <interface name="wl_transfer_device" version="1">
+    <request name="create_drag_source">
+      <arg name="id" type="new_id" interface="wl_transfer_source"/>
       <arg name="surface" type="object" interface="wl_surface"/>
-      <arg name="input_device" type="object" interface="wl_input_device"/>
       <arg name="time" type="uint"/>
     </request>
 
-    <!-- Destroy the drag and cancel the session. -->
-    <request name="destroy" type="destructor"/>
-
-    <!-- Sent when a target accepts pointer_focus or motion events.
-         If a target does not accept any of the offered types, type is
-         NULL -->
-    <event name="target">
-      <arg name="mime_type" type="string"/>
-    </event>
-
-    <!-- Sent when the drag is finished.  The final mime type is that
-         of the last target event.  If that was NULL, no drag target
-         was valid when the drag finished, fd is undefined and the
-         source should not send data.  The event is also sent in case
-         a drag source tries to activate a drag after the grab was
-         released, in which case mime_type will also be NULL. -->
-    <event name="finish">
-      <arg name="fd" type="fd"/>
-    </event>
-
-    <event name="reject"/>
-  </interface>
-
-
-  <interface name="wl_drag_offer" version="1">
-    <!-- Call to accept the offer of the given type -->
-    <request name="accept">
+    <request name="create_selection_source">
+      <arg name="id" type="new_id" interface="wl_transfer_source"/>
+      <!-- PRIMARY, SECONDARY, ORLY?  Do we want this?-->
+      <arg name="name" type="string"/>
       <arg name="time" type="uint"/>
-      <arg name="type" type="string"/>
     </request>
 
-    <!-- Called to initiate the drag finish sequence.  Sends the pipe
-         fd to the compositor, which forwards it to the source in the
-         'finish' event -->
-    <request name="receive">
-      <arg name="fd" type="fd"/>
+    <!-- Call in response to focus or motion events, to indicate
+         whether the drop target can accept the given type at the most
+         recent position.  Pass NULL to indicate -->
+    <request name="drag_accept">
+      <arg name="mime_type" type="string"/>
+      <!-- FIXME: Do we need this? -->
+      <arg name="time" type="uint"/>
     </request>
 
-    <!-- Called to reject a drop  -->
-    <request name="reject"/>
-
-    <!-- Sent before the pointer_focus event to announce the types
-         offered.  One event per offered mime type. -->
-    <event name="offer">
-      <arg name="type" type="string"/>
-    </event>
-
     <!-- Similar to device::pointer_focus.  Sent to potential target
          surfaces to offer drag data.  If the device leaves the
          window, the drag stops or the originator cancels the drag,
          this event is sent with the NULL surface, at which point the
          drag object may no longer be valid. -->
-    <event name="pointer_focus">
+    <event name="drag_focus">
       <arg name="time" type="uint"/>
       <arg name="surface" type="object" interface="wl_surface"/>
+      <!-- global name of the transfer for this drag session-->
+      <arg name="transfer" type="uint"/>
       <arg name="x" type="int"/>
       <arg name="y" type="int"/>
       <arg name="surface_x" type="int"/>
@@ -360,7 +339,7 @@
 
     <!-- Similar to device::motion.  Sent to potential target surfaces
          as the drag pointer moves around in the surface. -->
-    <event name="motion">
+    <event name="drag_motion">
       <arg name="time" type="uint"/>
       <arg name="x" type="int"/>
       <arg name="y" type="int"/>
@@ -372,7 +351,16 @@
          motion/pointer_focus event gives the location of the drop.
          Target must respond with the 'receive' request, which sends
          an fd to the source for writing the drag data. -->
-    <event name="drop"/>
+    <event name="drag_drop"/>
+
+    <!-- Announce new selection for this device -->
+    <event name="selection">
+      <!-- global name of the transfer for the selection -->
+      <arg name="transfer" type="uint"/>
+      
+      <!-- PRIMARY, SECONDARY, ORLY?  Do we want this?-->
+      <arg name="name" type="string"/>
+    </event>
   </interface>
 
 
