Index: uspace/app/tester/mm/common.c
===================================================================
--- uspace/app/tester/mm/common.c	(revision 955f2a57490a386f4fbaee3277e4bd761f17dd29)
+++ uspace/app/tester/mm/common.c	(revision 1b3e8549153c45754eeae954067e77cd51aca026)
@@ -135,4 +135,16 @@
 }
 
+static void check_consistency(const char *loc)
+{
+	/* Check heap consistency */
+	void *prob = heap_check();
+	if (prob != NULL) {
+		TPRINTF("\nError: Heap inconsistency at %p in %s.\n",
+		    prob, loc);
+		TSTACKTRACE();
+		error_flag = true;
+	}
+}
+
 /** Checked malloc
  *
@@ -153,4 +165,5 @@
 	/* Allocate the chunk of memory */
 	data = malloc(size);
+	check_consistency("checked_malloc");
 	if (data == NULL)
 		return NULL;
@@ -160,4 +173,5 @@
 		TPRINTF("\nError: Allocated block overlaps with another "
 		    "previously allocated block.\n");
+		TSTACKTRACE();
 		error_flag = true;
 	}
@@ -198,4 +212,5 @@
 	if (block->addr == NULL) {
 		free(block);
+		check_consistency("alloc_block");
 		return NULL;
 	}
@@ -228,5 +243,7 @@
 	/* Free the memory */
 	free(block->addr);
+	check_consistency("free_block (a)");
 	free(block);
+	check_consistency("free_block (b)");
 }
 
@@ -257,4 +274,6 @@
 	    pos < end; pos++)
 		*pos = block_expected_value(block, pos);
+	
+	check_consistency("fill_block");
 }
 
@@ -273,4 +292,5 @@
 		if (*pos != block_expected_value(block, pos)) {
 			TPRINTF("\nError: Corrupted content of a data block.\n");
+			TSTACKTRACE();
 			error_flag = true;
 			return;
@@ -296,4 +316,5 @@
 	if (entry == NULL) {
 		TPRINTF("\nError: Corrupted list of allocated memory blocks.\n");
+		TSTACKTRACE();
 		error_flag = true;
 	}
@@ -325,4 +346,5 @@
 	if (addr == NULL) {
 		free(area);
+		check_consistency("map_area (a)");
 		return NULL;
 	}
@@ -331,4 +353,5 @@
 	if (area->addr == (void *) -1) {
 		free(area);
+		check_consistency("map_area (b)");
 		return NULL;
 	}
@@ -361,4 +384,5 @@
 	
 	free(area);
+	check_consistency("unmap_area");
 }
 
@@ -389,3 +413,5 @@
 	    pos < end; pos++)
 		*pos = area_expected_value(area, pos);
-}
+	
+	check_consistency("fill_area");
+}
Index: uspace/app/tester/mm/malloc3.c
===================================================================
--- uspace/app/tester/mm/malloc3.c	(revision 955f2a57490a386f4fbaee3277e4bd761f17dd29)
+++ uspace/app/tester/mm/malloc3.c	(revision 1b3e8549153c45754eeae954067e77cd51aca026)
@@ -236,4 +236,5 @@
 					mem_area_t *area = map_area(AREA_SIZE);
 					RETURN_IF_ERROR;
+					
 					if (area != NULL) {
 						TPRINTF("*");
Index: uspace/app/tester/tester.h
===================================================================
--- uspace/app/tester/tester.h	(revision 955f2a57490a386f4fbaee3277e4bd761f17dd29)
+++ uspace/app/tester/tester.h	(revision 1b3e8549153c45754eeae954067e77cd51aca026)
@@ -38,4 +38,5 @@
 #include <sys/types.h>
 #include <bool.h>
+#include <stacktrace.h>
 
 #define IPC_TEST_SERVICE  10240
@@ -59,4 +60,11 @@
 		if (!test_quiet) { \
 			fprintf(stderr, (format), ##__VA_ARGS__); \
+		} \
+	} while (0)
+
+#define TSTACKTRACE() \
+	do { \
+		if (!test_quiet) { \
+			stacktrace_print(); \
 		} \
 	} while (0)
Index: uspace/lib/c/generic/malloc.c
===================================================================
--- uspace/lib/c/generic/malloc.c	(revision 955f2a57490a386f4fbaee3277e4bd761f17dd29)
+++ uspace/lib/c/generic/malloc.c	(revision 1b3e8549153c45754eeae954067e77cd51aca026)
@@ -904,4 +904,53 @@
 }
 
+void *heap_check(void)
+{
+	futex_down(&malloc_futex);
+	
+	if (first_heap_area == NULL) {
+		futex_up(&malloc_futex);
+		return (void *) -1;
+	}
+	
+	/* Walk all heap areas */
+	for (heap_area_t *area = first_heap_area; area != NULL;
+	    area = area->next) {
+		
+		/* Check heap area consistency */
+		if ((area->magic != HEAP_AREA_MAGIC) ||
+		    ((void *) area != area->start) ||
+		    (area->start >= area->end) ||
+		    (((uintptr_t) area->start % PAGE_SIZE) != 0) ||
+		    (((uintptr_t) area->end % PAGE_SIZE) != 0)) {
+			futex_up(&malloc_futex);
+			return (void *) area;
+		}
+		
+		/* Walk all heap blocks */
+		for (heap_block_head_t *head = (heap_block_head_t *)
+		    AREA_FIRST_BLOCK_HEAD(area); (void *) head < area->end;
+		    head = (heap_block_head_t *) (((void *) head) + head->size)) {
+			
+			/* Check heap block consistency */
+			if (head->magic != HEAP_BLOCK_HEAD_MAGIC) {
+				futex_up(&malloc_futex);
+				return (void *) head;
+			}
+			
+			heap_block_foot_t *foot = BLOCK_FOOT(head);
+			
+			if ((foot->magic != HEAP_BLOCK_FOOT_MAGIC) ||
+			    (head->size != foot->size)) {
+				futex_up(&malloc_futex);
+				return (void *) foot;
+			}
+		}
+	}
+	
+	futex_up(&malloc_futex);
+	
+	return NULL;
+}
+
 /** @}
  */
Index: uspace/lib/c/include/malloc.h
===================================================================
--- uspace/lib/c/include/malloc.h	(revision 955f2a57490a386f4fbaee3277e4bd761f17dd29)
+++ uspace/lib/c/include/malloc.h	(revision 1b3e8549153c45754eeae954067e77cd51aca026)
@@ -46,4 +46,5 @@
 extern void *realloc(const void *addr, const size_t size);
 extern void free(const void *addr);
+extern void *heap_check(void);
 
 #endif
