Index: uspace/lib/libc/generic/async.c
===================================================================
--- uspace/lib/libc/generic/async.c	(revision 28be7fa0fa0ad68be08aa62293dc4d0e38e07dca)
+++ uspace/lib/libc/generic/async.c	(revision 472c09d5893ee3d91337e6bd2fdda63fdbe11301)
@@ -1345,20 +1345,23 @@
 }
 
-/** Wrapper for receiving blobs via the async_data_write_*
+/** Wrapper for receiving binary data via the async_data_write_*
  *
  * This wrapper only makes it more comfortable to use async_data_write_*
  * functions to receive blobs.
  *
- * @param blob     Pointer to data pointer (which should be later disposed
- *                 by free()). If the operation fails, the pointer is not
- *                 touched.
- * @param max_size Maximum size (in bytes) of the blob to receive. 0 means
- *                 no limit.
- * @param received If not NULL, the size of the received data is stored here.
+ * @param data       Pointer to data pointer (which should be later disposed
+ *                   by free()). If the operation fails, the pointer is not
+ *                   touched.
+ * @param max_size   Maximum size (in bytes) of the data to receive. 0 means
+ *                   no limit.
+ * @param granulariy If non-zero, then the size of the received data has to
+ *                   be divisible by this value.
+ * @param received   If not NULL, the size of the received data is stored here.
  *
  * @return Zero on success or a value from @ref errno.h on failure.
  *
  */
-int async_data_blob_receive(char **blob, const size_t max_size, size_t *received)
+int async_data_receive(void **data, const size_t max_size,
+    const size_t granularity, size_t *received)
 {
 	ipc_callid_t callid;
@@ -1374,17 +1377,22 @@
 	}
 	
-	char *data = (char *) malloc(size);
-	if (data == NULL) {
+	if ((granularity > 0) && ((size % granularity) != 0)) {
+		ipc_answer_0(callid, EINVAL);
+		return EINVAL;
+	}
+	
+	void *_data = malloc(size);
+	if (_data == NULL) {
 		ipc_answer_0(callid, ENOMEM);
 		return ENOMEM;
 	}
 	
-	int rc = async_data_write_finalize(callid, data, size);
+	int rc = async_data_write_finalize(callid, _data, size);
 	if (rc != EOK) {
-		free(data);
+		free(_data);
 		return rc;
 	}
 	
-	*blob = data;
+	*data = _data;
 	if (received != NULL)
 		*received = size;
@@ -1403,9 +1411,10 @@
  * @param max_size Maximum size (in bytes) of the string to receive. 0 means
  *                 no limit.
+ * @param received If not NULL, the size of the received data is stored here.
  *
  * @return Zero on success or a value from @ref errno.h on failure.
  *
  */
-int async_data_string_receive(char **str, const size_t max_size)
+int async_string_receive(char **str, const size_t max_size, size_t *received)
 {
 	ipc_callid_t callid;
@@ -1435,4 +1444,7 @@
 	data[size] = 0;
 	*str = data;
+	if (received != NULL)
+		*received = size;
+	
 	return EOK;
 }
Index: uspace/lib/libc/generic/clipboard.c
===================================================================
--- uspace/lib/libc/generic/clipboard.c	(revision 28be7fa0fa0ad68be08aa62293dc4d0e38e07dca)
+++ uspace/lib/libc/generic/clipboard.c	(revision 472c09d5893ee3d91337e6bd2fdda63fdbe11301)
@@ -84,5 +84,5 @@
 		clip_connect();
 		
-		aid_t req = async_send_1(clip_phone, CLIPBOARD_PUT_DATA, CLIPBOARD_TAG_BLOB, NULL);
+		aid_t req = async_send_1(clip_phone, CLIPBOARD_PUT_DATA, CLIPBOARD_TAG_DATA, NULL);
 		ipcarg_t rc = async_data_write_start(clip_phone, (void *) str, size);
 		if (rc != EOK) {
@@ -139,5 +139,5 @@
 			*str = sbuf;
 			return EOK;
-		case CLIPBOARD_TAG_BLOB:
+		case CLIPBOARD_TAG_DATA:
 			sbuf = malloc(size + 1);
 			if (sbuf == NULL)
Index: uspace/lib/libc/include/async.h
===================================================================
--- uspace/lib/libc/include/async.h	(revision 28be7fa0fa0ad68be08aa62293dc4d0e38e07dca)
+++ uspace/lib/libc/include/async.h	(revision 472c09d5893ee3d91337e6bd2fdda63fdbe11301)
@@ -284,6 +284,6 @@
 extern int async_data_write_finalize(ipc_callid_t, void *, size_t);
 
-extern int async_data_blob_receive(char **, const size_t, size_t *);
-extern int async_data_string_receive(char **, const size_t);
+extern int async_data_receive(void **, const size_t, const size_t, size_t *);
+extern int async_string_receive(char **, const size_t, size_t *);
 
 #endif
Index: uspace/lib/libc/include/ipc/clipboard.h
===================================================================
--- uspace/lib/libc/include/ipc/clipboard.h	(revision 28be7fa0fa0ad68be08aa62293dc4d0e38e07dca)
+++ uspace/lib/libc/include/ipc/clipboard.h	(revision 472c09d5893ee3d91337e6bd2fdda63fdbe11301)
@@ -46,5 +46,5 @@
 typedef enum {
 	CLIPBOARD_TAG_NONE,
-	CLIPBOARD_TAG_BLOB
+	CLIPBOARD_TAG_DATA
 } clipboard_tag_t;
 
