Index: generic/include/interrupt.h
===================================================================
--- generic/include/interrupt.h	(revision bdc5c516b811c2d1871bfaaf83a3c1fa14c86fc4)
+++ generic/include/interrupt.h	(revision e8194664346da297d4362295839ff6b1fb615c0b)
@@ -32,4 +32,5 @@
 #include <arch/interrupt.h>
 #include <typedefs.h>
+#include <arch/types.h>
 
 #ifndef IVT_ITEMS
Index: generic/include/mm/as.h
===================================================================
--- generic/include/mm/as.h	(revision bdc5c516b811c2d1871bfaaf83a3c1fa14c86fc4)
+++ generic/include/mm/as.h	(revision e8194664346da297d4362295839ff6b1fb615c0b)
@@ -64,4 +64,8 @@
 #define AS_AREA_ATTR_PARTIAL	1	/* Not fully initialized area. */
 
+#define AS_PF_FAULT		0	/**< The page fault was not resolved by asp_page_fault(). */
+#define AS_PF_OK		1	/**< The page fault was resolved by as_page_fault(). */
+#define AS_PF_DEFER		2	/**< The page fault was caused by memcpy_from_uspace(). */
+
 /** Address space area structure.
  *
@@ -122,5 +126,5 @@
 int as_area_send(task_id_t dst_id, __address base);
 extern void as_set_mapping(as_t *as, __address page, __address frame);
-extern int as_page_fault(__address page);
+extern int as_page_fault(__address page, istate_t *istate);
 extern void as_switch(as_t *old, as_t *new);
 extern void as_free(as_t *as);
Index: generic/include/mm/page.h
===================================================================
--- generic/include/mm/page.h	(revision bdc5c516b811c2d1871bfaaf83a3c1fa14c86fc4)
+++ generic/include/mm/page.h	(revision e8194664346da297d4362295839ff6b1fb615c0b)
@@ -61,15 +61,4 @@
 #define PAGE_GLOBAL		(1<<PAGE_GLOBAL_SHIFT)
 
-/* TODO - check that userspace is OK, platform specific functions etc */
-static inline void copy_to_uspace(void *dst, void *src, count_t cnt)
-{
-	memcpy(dst, src, cnt);
-} 
-
-static inline void copy_from_uspace(void *dst, void *src, count_t cnt)
-{
-	memcpy(dst, src, cnt);
-}
-
 /** Operations to manipulate page mappings. */
 struct page_mapping_operations {
Index: generic/include/proc/thread.h
===================================================================
--- generic/include/proc/thread.h	(revision bdc5c516b811c2d1871bfaaf83a3c1fa14c86fc4)
+++ generic/include/proc/thread.h	(revision e8194664346da297d4362295839ff6b1fb615c0b)
@@ -92,4 +92,10 @@
 	volatile int timeout_pending;		/**< Flag signalling sleep timeout in progress. */
 
+	/** True if this thread is executing copy_from_uspace(). False otherwise. */
+	bool in_copy_from_uspace;
+	/** True if this thread is executing copy_to_uspace(). False otherwise. */
+	bool in_copy_to_uspace;
+
+
 	fpu_context_t *saved_fpu_context;
 	int fpu_context_exists;
Index: generic/include/syscall/copy.h
===================================================================
--- generic/include/syscall/copy.h	(revision e8194664346da297d4362295839ff6b1fb615c0b)
+++ generic/include/syscall/copy.h	(revision e8194664346da297d4362295839ff6b1fb615c0b)
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2006 Jakub Jermar
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ *   notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ *   notice, this list of conditions and the following disclaimer in the
+ *   documentation and/or other materials provided with the distribution.
+ * - The name of the author may not be used to endorse or promote products
+ *   derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __COPY_H__
+#define __COPY_H__
+
+#include <typedefs.h>
+
+/** Label within memcpy_from_uspace() that contains return -1. */
+extern char memcpy_from_uspace_failover_address;
+
+/** Label within memcpy_to_uspace() that contains return -1. */
+extern char memcpy_to_uspace_failover_address;
+
+extern int copy_from_uspace(void *dst, void *uspace_src, size_t size);
+extern int copy_to_uspace(void *dst_uspace, void *src, size_t size);
+
+/*
+ * This interface must be implemented by each architecture.
+ */
+extern int memcpy_from_uspace(void *dst, void *uspace_src, size_t size);
+extern int memcpy_to_uspace(void *uspace_dst, void *src, size_t size);
+
+#endif
