Index: uspace/libc/arch/amd64/include/config.h
===================================================================
--- uspace/libc/arch/amd64/include/config.h	(revision 5a8b2a2e58c0aff599e30b00eed3a773ff644968)
+++ uspace/libc/arch/amd64/include/config.h	(revision 134877d64bac047ca117c283bd304140ea31a7b0)
@@ -38,4 +38,5 @@
 #define PAGE_WIDTH	12
 #define PAGE_SIZE	(1<<PAGE_WIDTH)
+#define PAGE_COLOR_BITS	0		/* dummy */
 
 #endif
Index: uspace/libc/arch/ia32/include/config.h
===================================================================
--- uspace/libc/arch/ia32/include/config.h	(revision 5a8b2a2e58c0aff599e30b00eed3a773ff644968)
+++ uspace/libc/arch/ia32/include/config.h	(revision 134877d64bac047ca117c283bd304140ea31a7b0)
@@ -38,4 +38,5 @@
 #define PAGE_WIDTH	12
 #define PAGE_SIZE	(1<<PAGE_WIDTH)
+#define PAGE_COLOR_BITS	0		/* dummy */
 
 #endif
Index: uspace/libc/arch/ia64/include/config.h
===================================================================
--- uspace/libc/arch/ia64/include/config.h	(revision 5a8b2a2e58c0aff599e30b00eed3a773ff644968)
+++ uspace/libc/arch/ia64/include/config.h	(revision 134877d64bac047ca117c283bd304140ea31a7b0)
@@ -38,4 +38,5 @@
 #define PAGE_WIDTH	14
 #define PAGE_SIZE	(1<<PAGE_WIDTH)
+#define PAGE_COLOR_BITS	0		/* dummy */
 
 #endif
Index: uspace/libc/arch/mips32/include/config.h
===================================================================
--- uspace/libc/arch/mips32/include/config.h	(revision 5a8b2a2e58c0aff599e30b00eed3a773ff644968)
+++ uspace/libc/arch/mips32/include/config.h	(revision 134877d64bac047ca117c283bd304140ea31a7b0)
@@ -38,4 +38,5 @@
 #define PAGE_WIDTH	14
 #define PAGE_SIZE	(1<<PAGE_WIDTH)
+#define PAGE_COLOR_BITS	0		/* dummy */
 
 #endif
Index: uspace/libc/arch/ppc32/include/config.h
===================================================================
--- uspace/libc/arch/ppc32/include/config.h	(revision 5a8b2a2e58c0aff599e30b00eed3a773ff644968)
+++ uspace/libc/arch/ppc32/include/config.h	(revision 134877d64bac047ca117c283bd304140ea31a7b0)
@@ -38,4 +38,5 @@
 #define PAGE_WIDTH	12
 #define PAGE_SIZE	(1<<PAGE_WIDTH)
+#define PAGE_COLOR_BITS	0		/* dummy */
 
 #endif
Index: uspace/libc/arch/ppc64/include/config.h
===================================================================
--- uspace/libc/arch/ppc64/include/config.h	(revision 5a8b2a2e58c0aff599e30b00eed3a773ff644968)
+++ uspace/libc/arch/ppc64/include/config.h	(revision 134877d64bac047ca117c283bd304140ea31a7b0)
@@ -38,4 +38,5 @@
 #define PAGE_WIDTH	12
 #define PAGE_SIZE	(1<<PAGE_WIDTH)
+#define PAGE_COLOR_BITS	0		/* dummy */
 
 #endif
Index: uspace/libc/arch/sparc64/include/config.h
===================================================================
--- uspace/libc/arch/sparc64/include/config.h	(revision 5a8b2a2e58c0aff599e30b00eed3a773ff644968)
+++ uspace/libc/arch/sparc64/include/config.h	(revision 134877d64bac047ca117c283bd304140ea31a7b0)
@@ -38,4 +38,5 @@
 #define PAGE_WIDTH	13
 #define PAGE_SIZE	(1<<PAGE_WIDTH)
+#define PAGE_COLOR_BITS	1		/**< Bit 13 is the page color. */
 
 #endif
Index: uspace/libc/generic/as.c
===================================================================
--- uspace/libc/generic/as.c	(revision 5a8b2a2e58c0aff599e30b00eed3a773ff644968)
+++ uspace/libc/generic/as.c	(revision 134877d64bac047ca117c283bd304140ea31a7b0)
@@ -38,4 +38,5 @@
 #include <align.h>
 #include <types.h>
+#include <bitops.h>
 
 /**
@@ -54,10 +55,12 @@
 void *as_area_create(void *address, size_t size, int flags)
 {
-	return (void *) __SYSCALL3(SYS_AS_AREA_CREATE, (sysarg_t ) address, (sysarg_t) size, (sysarg_t) flags);
+	return (void *) __SYSCALL3(SYS_AS_AREA_CREATE, (sysarg_t ) address,
+		(sysarg_t) size, (sysarg_t) flags);
 }
 
 /** Resize address space area.
  *
- * @param address Virtual address pointing into already existing address space area.
+ * @param address Virtual address pointing into already existing address space
+ * 	area.
  * @param size New requested size of the area.
  * @param flags Currently unused.
@@ -67,10 +70,12 @@
 int as_area_resize(void *address, size_t size, int flags)
 {
-	return __SYSCALL3(SYS_AS_AREA_RESIZE, (sysarg_t ) address, (sysarg_t) size, (sysarg_t) flags);
+	return __SYSCALL3(SYS_AS_AREA_RESIZE, (sysarg_t ) address, (sysarg_t)
+		size, (sysarg_t) flags);
 }
 
 /** Destroy address space area.
  *
- * @param address Virtual address pointing into the address space area being destroyed.
+ * @param address Virtual address pointing into the address space area being
+ * 	destroyed.
  *
  * @return Zero on success or a code from @ref errno.h on failure.
@@ -134,15 +139,27 @@
 	/* Return pointer to area not managed by sbrk */
 	return ((void *) &_heap + maxheapsize);
-
 }
 
 /** Return pointer to some unmapped area, where fits new as_area
  *
+ * @param sz Requested size of the allocation.
+ * @param color Requested virtual color of the allocation.
+ *
+ * @return Pointer to the beginning 
+ *
  * TODO: make some first_fit/... algorithm, we are now just incrementing
  *       the pointer to last area
  */
-void * as_get_mappable_page(size_t sz)
+#include <stdio.h>
+void *as_get_mappable_page(size_t sz, int color)
 {
 	void *res;
+	uint64_t asz;
+	int i;
+	
+	if (!sz)
+		return NULL;	
+
+	asz = 1 << (fnzb64(sz - 1) + 1);
 
 	/* Set heapsize to some meaningful value */
@@ -150,10 +167,23 @@
 		set_maxheapsize(MAX_HEAP_SIZE);
 	
-	if (!last_allocated)
-		last_allocated = (void *) ALIGN_UP((void *) &_heap + maxheapsize, PAGE_SIZE);
-	
-	sz = ALIGN_UP(sz, PAGE_SIZE);
+	/*
+	 * Make sure we allocate from naturally aligned address and a page of
+	 * appropriate color.
+	 */
+	i = 0;
+	do {
+		if (!last_allocated) {
+			last_allocated = (void *) ALIGN_UP((void *) &_heap +
+				maxheapsize, asz);
+		} else {
+			last_allocated = (void *) ALIGN_UP(((uintptr_t)
+				last_allocated) + (int) (i > 0), asz);
+		}
+	} while ((asz < (1 << (PAGE_COLOR_BITS + PAGE_WIDTH))) &&
+		(PAGE_COLOR((uintptr_t) last_allocated) != color) &&
+		(++i < (1 << PAGE_COLOR_BITS)));
+
 	res = last_allocated;
-	last_allocated += sz;
+	last_allocated += ALIGN_UP(sz, PAGE_SIZE);
 
 	return res;
Index: uspace/libc/generic/mman.c
===================================================================
--- uspace/libc/generic/mman.c	(revision 5a8b2a2e58c0aff599e30b00eed3a773ff644968)
+++ uspace/libc/generic/mman.c	(revision 134877d64bac047ca117c283bd304140ea31a7b0)
@@ -40,5 +40,5 @@
 {
 	if (!start)
-		start = as_get_mappable_page(length);
+		start = as_get_mappable_page(length, 0);
 	
 //	if (! ((flags & MAP_SHARED) ^ (flags & MAP_PRIVATE)))
Index: uspace/libc/generic/time.c
===================================================================
--- uspace/libc/generic/time.c	(revision 5a8b2a2e58c0aff599e30b00eed3a773ff644968)
+++ uspace/libc/generic/time.c	(revision 134877d64bac047ca117c283bd304140ea31a7b0)
@@ -41,4 +41,5 @@
 #include <atomic.h>
 #include <futex.h>
+#include <sysinfo.h>
 #include <ipc/services.h>
 
@@ -72,7 +73,10 @@
 
 	if (!ktime) {
-		mapping = as_get_mappable_page(PAGE_SIZE);
+		mapping = as_get_mappable_page(PAGE_SIZE, (int)
+			sysinfo_value("clock.fcolor"));
 		/* Get the mapping of kernel clock */
-		res = ipc_call_sync_3(PHONE_NS, IPC_M_AS_AREA_RECV, (sysarg_t) mapping, PAGE_SIZE, SERVICE_MEM_REALTIME, NULL, &rights, NULL);
+		res = ipc_call_sync_3(PHONE_NS, IPC_M_AS_AREA_RECV, (sysarg_t)
+			mapping, PAGE_SIZE, SERVICE_MEM_REALTIME, NULL, &rights,
+			NULL);
 		if (res) {
 			printf("Failed to initialize timeofday memarea\n");
Index: uspace/libc/include/as.h
===================================================================
--- uspace/libc/include/as.h	(revision 5a8b2a2e58c0aff599e30b00eed3a773ff644968)
+++ uspace/libc/include/as.h	(revision 134877d64bac047ca117c283bd304140ea31a7b0)
@@ -40,4 +40,7 @@
 #include <kernel/arch/mm/as.h>
 #include <kernel/mm/as.h>
+#include <libarch/config.h>
+
+#define PAGE_COLOR(va)	(((va) >> PAGE_WIDTH) & ((1 << PAGE_COLOR_BITS) - 1))
 
 extern void *as_area_create(void *address, size_t size, int flags);
@@ -45,5 +48,5 @@
 extern int as_area_destroy(void *address);
 extern void *set_maxheapsize(size_t mhs);
-extern void * as_get_mappable_page(size_t sz);
+extern void * as_get_mappable_page(size_t sz, int color);
 
 #endif
Index: uspace/libc/include/bitops.h
===================================================================
--- uspace/libc/include/bitops.h	(revision 134877d64bac047ca117c283bd304140ea31a7b0)
+++ uspace/libc/include/bitops.h	(revision 134877d64bac047ca117c283bd304140ea31a7b0)
@@ -0,0 +1,94 @@
+/*
+ * Copyright (C) 2006 Ondrej Palkovsky
+ * 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.
+ */
+
+/** @addtogroup generic	
+ * @{
+ */
+/** @file
+ */
+
+#ifndef LIBC_BITOPS_H_
+#define LIBC_BITOPS_H_
+
+#include <types.h>
+
+
+/** Return position of first non-zero bit from left (i.e. [log_2(arg)]).
+ *
+ * If number is zero, it returns 0
+ */
+static inline int fnzb32(uint32_t arg)
+{
+	int n = 0;
+
+	if (arg >> 16) {
+		arg >>= 16;
+		n += 16;
+	}
+	
+	if (arg >> 8) {
+		arg >>= 8;
+		n += 8;
+	}
+	
+	if (arg >> 4) {
+		arg >>= 4;
+		n += 4;
+	}
+	
+	if (arg >> 2) {
+		arg >>= 2;
+		n += 2;
+	}
+	
+	if (arg >> 1) {
+		arg >>= 1;
+		n += 1;
+	}
+	
+	return n;
+}
+
+static inline int fnzb64(uint64_t arg)
+{
+	int n = 0;
+
+	if (arg >> 32) {
+		arg >>= 32;
+		n += 32;
+	}
+	
+	return n + fnzb32((uint32_t) arg);
+}
+
+#define fnzb(x) fnzb32(x)
+
+#endif
+
+/** @}
+ */
