Index: generic/include/ipc/ipc.h
===================================================================
--- generic/include/ipc/ipc.h	(revision 4fded58aa3e9d077e85ec03f4c86b755c84c174a)
+++ generic/include/ipc/ipc.h	(revision 76d73057b7edc9cce0605befc3483baf1085d042)
@@ -132,9 +132,8 @@
  * - ARG1 - Where the area will be mapped
  * - ARG2 - Expected size of area
- * - ARG3 - Requested rights for the area
+ * - ARG3 - User defined argument
  * on answer - the server sets ARG1 as src as address of the as_area
- * to be shared
- *
- *
+ * to be shared, ARG2 is set to rights that will be used for sharing,
+ * which is returned as part of answer back to the receiver
  */
 #define IPC_M_AS_AREA_RECV      6
Index: generic/src/ipc/sysipc.c
===================================================================
--- generic/src/ipc/sysipc.c	(revision 4fded58aa3e9d077e85ec03f4c86b755c84c174a)
+++ generic/src/ipc/sysipc.c	(revision 76d73057b7edc9cce0605befc3483baf1085d042)
@@ -137,4 +137,5 @@
 		if (!IPC_GET_RETVAL(answer->data)) { /* Accepted, handle as_area receipt */
 			ipl_t ipl;
+			int rc;
 			as_t *as;
 			
@@ -145,6 +146,8 @@
 			interrupts_restore(ipl);
 			
-			return as_area_share(as, IPC_GET_ARG1(*olddata), IPC_GET_ARG2(*olddata),
-					     AS, IPC_GET_ARG1(answer->data), IPC_GET_ARG3(*olddata));
+			rc = as_area_share(as, IPC_GET_ARG1(*olddata), IPC_GET_ARG2(*olddata),
+					   AS, IPC_GET_ARG1(answer->data), IPC_GET_ARG3(*olddata));
+			IPC_SET_RETVAL(answer->data, rc);
+			return rc;
 		}
 	} else if (IPC_GET_METHOD(*olddata) == IPC_M_AS_AREA_RECV) {
@@ -161,5 +164,5 @@
 			
 			rc = as_area_share(AS, IPC_GET_ARG1(answer->data), IPC_GET_ARG2(*olddata),
-					   as, IPC_GET_ARG1(*olddata), IPC_GET_ARG3(*olddata));
+					   as, IPC_GET_ARG1(*olddata), IPC_GET_ARG2(answer->data));
 			IPC_SET_RETVAL(answer->data, rc);
 		}
Index: generic/src/mm/as.c
===================================================================
--- generic/src/mm/as.c	(revision 4fded58aa3e9d077e85ec03f4c86b755c84c174a)
+++ generic/src/mm/as.c	(revision 76d73057b7edc9cce0605befc3483baf1085d042)
@@ -517,5 +517,5 @@
 	src_backend_data = src_area->backend_data;
 	
-	if (src_size != acc_size) {
+	if (src_size != acc_size || (src_flags & dst_flags_mask) != dst_flags_mask) {
 		mutex_unlock(&src_area->lock);
 		mutex_unlock(&src_as->lock);
@@ -555,5 +555,5 @@
 	 * to support sharing in less privileged mode.
 	 */
-	dst_area = as_area_create(dst_as, src_flags & dst_flags_mask, src_size, dst_base,
+	dst_area = as_area_create(dst_as, dst_flags_mask, src_size, dst_base,
 				  AS_AREA_ATTR_PARTIAL, src_backend, &src_backend_data);
 	if (!dst_area) {
