Index: kernel/generic/src/ipc/irq.c
===================================================================
--- kernel/generic/src/ipc/irq.c	(revision ada559c5e94ba58f9ea3b263de2877127eba8873)
+++ kernel/generic/src/ipc/irq.c	(revision 179d052bd8f476fcf6318dc690211df13a60f86d)
@@ -430,4 +430,7 @@
 {
 	ASSERT(irq);
+
+	ASSERT(interrupts_disabled());
+	ASSERT(irq_spinlock_locked(&irq->lock));
 	
 	if (irq->notif_cfg.answerbox) {
Index: kernel/generic/src/mm/as.c
===================================================================
--- kernel/generic/src/mm/as.c	(revision ada559c5e94ba58f9ea3b263de2877127eba8873)
+++ kernel/generic/src/mm/as.c	(revision 179d052bd8f476fcf6318dc690211df13a60f86d)
@@ -817,4 +817,7 @@
 		[PF_ACCESS_EXEC] = AS_AREA_EXEC
 	};
+
+	ASSERT(interrupts_disabled());
+	ASSERT(mutex_locked(&area->lock));
 	
 	if (!(area->flags & flagmap[access]))
@@ -1221,4 +1224,7 @@
 unsigned int as_area_get_flags(as_area_t *area)
 {
+	ASSERT(interrupts_disabled());
+	ASSERT(mutex_locked(&area->lock));
+
 	return area_flags_to_page_flags(area->flags);
 }
@@ -1322,4 +1328,7 @@
 as_area_t *find_area_and_lock(as_t *as, uintptr_t va)
 {
+	ASSERT(interrupts_disabled());
+	ASSERT(mutex_locked(&as->lock));
+
 	btree_node_t *leaf;
 	as_area_t *area = (as_area_t *) btree_search(&as->as_area_btree, va, &leaf);
@@ -1386,4 +1395,7 @@
     as_area_t *avoid_area)
 {
+	ASSERT(interrupts_disabled());
+	ASSERT(mutex_locked(&as->lock));
+
 	/*
 	 * We don't want any area to have conflicts with NULL page.
@@ -1473,5 +1485,5 @@
 /** Return size of the address space area with given base.
  *
- * @param base Arbitrary address insede the address space area.
+ * @param base Arbitrary address inside the address space area.
  *
  * @return Size of the address space area in bytes or zero if it
@@ -1484,4 +1496,5 @@
 	
 	ipl_t ipl = interrupts_disable();
+	page_table_lock(AS, true);
 	as_area_t *src_area = find_area_and_lock(AS, base);
 	
@@ -1492,4 +1505,5 @@
 		size = 0;
 	
+	page_table_unlock(AS, true);
 	interrupts_restore(ipl);
 	return size;
@@ -1509,4 +1523,5 @@
 int used_space_insert(as_area_t *area, uintptr_t page, size_t count)
 {
+	ASSERT(mutex_locked(&area->lock));
 	ASSERT(page == ALIGN_DOWN(page, PAGE_SIZE));
 	ASSERT(count);
@@ -1815,4 +1830,5 @@
 int used_space_remove(as_area_t *area, uintptr_t page, size_t count)
 {
+	ASSERT(mutex_locked(&area->lock));
 	ASSERT(page == ALIGN_DOWN(page, PAGE_SIZE));
 	ASSERT(count);
Index: kernel/generic/src/mm/backend_anon.c
===================================================================
--- kernel/generic/src/mm/backend_anon.c	(revision ada559c5e94ba58f9ea3b263de2877127eba8873)
+++ kernel/generic/src/mm/backend_anon.c	(revision 179d052bd8f476fcf6318dc690211df13a60f86d)
@@ -79,4 +79,7 @@
 {
 	uintptr_t frame;
+
+	ASSERT(page_table_locked(AS));
+	ASSERT(mutex_locked(&area->lock));
 
 	if (!as_area_check_access(area, access))
@@ -168,4 +171,7 @@
 void anon_frame_free(as_area_t *area, uintptr_t page, uintptr_t frame)
 {
+	ASSERT(page_table_locked(area->as));
+	ASSERT(mutex_locked(&area->lock));
+
 	frame_free(frame);
 }
@@ -183,4 +189,7 @@
 {
 	link_t *cur;
+
+	ASSERT(mutex_locked(&area->as->lock));
+	ASSERT(mutex_locked(&area->lock));
 
 	/*
Index: kernel/generic/src/mm/backend_elf.c
===================================================================
--- kernel/generic/src/mm/backend_elf.c	(revision ada559c5e94ba58f9ea3b263de2877127eba8873)
+++ kernel/generic/src/mm/backend_elf.c	(revision 179d052bd8f476fcf6318dc690211df13a60f86d)
@@ -86,4 +86,7 @@
 	bool dirty = false;
 
+	ASSERT(page_table_locked(AS));
+	ASSERT(mutex_locked(&area->lock));
+
 	if (!as_area_check_access(area, access))
 		return AS_PF_FAULT;
@@ -235,6 +238,10 @@
 	uintptr_t start_anon;
 
-	ASSERT((page >= ALIGN_DOWN(entry->p_vaddr, PAGE_SIZE)) &&
-	    (page < entry->p_vaddr + entry->p_memsz));
+	ASSERT(page_table_locked(area->as));
+	ASSERT(mutex_locked(&area->lock));
+
+	ASSERT(page >= ALIGN_DOWN(entry->p_vaddr, PAGE_SIZE));
+	ASSERT(page < entry->p_vaddr + entry->p_memsz);
+
 	start_anon = entry->p_vaddr + entry->p_filesz;
 
@@ -273,4 +280,7 @@
 	btree_node_t *leaf, *node;
 	uintptr_t start_anon = entry->p_vaddr + entry->p_filesz;
+
+	ASSERT(mutex_locked(&area->as->lock));
+	ASSERT(mutex_locked(&area->lock));
 
 	/*
Index: kernel/generic/src/mm/backend_phys.c
===================================================================
--- kernel/generic/src/mm/backend_phys.c	(revision ada559c5e94ba58f9ea3b263de2877127eba8873)
+++ kernel/generic/src/mm/backend_phys.c	(revision 179d052bd8f476fcf6318dc690211df13a60f86d)
@@ -72,4 +72,7 @@
 	uintptr_t base = area->backend_data.base;
 
+	ASSERT(page_table_locked(AS));
+	ASSERT(mutex_locked(&area->lock));
+
 	if (!as_area_check_access(area, access))
 		return AS_PF_FAULT;
@@ -93,4 +96,6 @@
 void phys_share(as_area_t *area)
 {
+	ASSERT(mutex_locked(&area->as->lock));
+	ASSERT(mutex_locked(&area->lock));
 }
 
Index: kernel/generic/src/mm/page.c
===================================================================
--- kernel/generic/src/mm/page.c	(revision ada559c5e94ba58f9ea3b263de2877127eba8873)
+++ kernel/generic/src/mm/page.c	(revision 179d052bd8f476fcf6318dc690211df13a60f86d)
@@ -120,7 +120,10 @@
     unsigned int flags)
 {
+	ASSERT(interrupts_disabled());
+	ASSERT(page_table_locked(as));
+	
 	ASSERT(page_mapping_operations);
 	ASSERT(page_mapping_operations->mapping_insert);
-	
+
 	page_mapping_operations->mapping_insert(as, page, frame, flags);
 	
@@ -143,4 +146,7 @@
 void page_mapping_remove(as_t *as, uintptr_t page)
 {
+	ASSERT(interrupts_disabled());
+	ASSERT(page_table_locked(as));
+	
 	ASSERT(page_mapping_operations);
 	ASSERT(page_mapping_operations->mapping_remove);
@@ -167,4 +173,7 @@
 pte_t *page_mapping_find(as_t *as, uintptr_t page)
 {
+	ASSERT(interrupts_disabled());
+	ASSERT(page_table_locked(as));
+	
 	ASSERT(page_mapping_operations);
 	ASSERT(page_mapping_operations->mapping_find);
Index: kernel/generic/src/proc/task.c
===================================================================
--- kernel/generic/src/proc/task.c	(revision ada559c5e94ba58f9ea3b263de2877127eba8873)
+++ kernel/generic/src/proc/task.c	(revision 179d052bd8f476fcf6318dc690211df13a60f86d)
@@ -351,4 +351,7 @@
 task_t *task_find_by_id(task_id_t id)
 {
+	ASSERT(interrupts_disabled());
+	ASSERT(irq_spinlock_locked(&tasks_lock));
+
 	avltree_node_t *node =
 	    avltree_search(&tasks_tree, (avltree_key_t) id);
@@ -362,5 +365,5 @@
 /** Get accounting data of given task.
  *
- * Note that task lock of 't' must be already held and interrupts must be
+ * Note that task lock of 'task' must be already held and interrupts must be
  * already disabled.
  *
@@ -372,4 +375,7 @@
 void task_get_accounting(task_t *task, uint64_t *ucycles, uint64_t *kcycles)
 {
+	ASSERT(interrupts_disabled());
+	ASSERT(irq_spinlock_locked(&task->lock));
+
 	/* Accumulated values of task */
 	uint64_t uret = task->ucycles;
Index: kernel/generic/src/proc/thread.c
===================================================================
--- kernel/generic/src/proc/thread.c	(revision ada559c5e94ba58f9ea3b263de2877127eba8873)
+++ kernel/generic/src/proc/thread.c	(revision 179d052bd8f476fcf6318dc690211df13a60f86d)
@@ -683,4 +683,7 @@
 bool thread_exists(thread_t *thread)
 {
+	ASSERT(interrupts_disabled());
+	ASSERT(irq_spinlock_locked(&threads_lock));
+
 	avltree_node_t *node =
 	    avltree_search(&threads_tree, (avltree_key_t) ((uintptr_t) thread));
@@ -700,4 +703,7 @@
 {
 	uint64_t time = get_cycle();
+
+	ASSERT(interrupts_disabled());
+	ASSERT(irq_spinlock_locked(&THREAD->lock));
 	
 	if (user)
@@ -735,4 +741,7 @@
 thread_t *thread_find_by_id(thread_id_t thread_id)
 {
+	ASSERT(interrupts_disabled());
+	ASSERT(irq_spinlock_locked(&threads_lock));
+
 	thread_iterator_t iterator;
 	
Index: kernel/generic/src/synch/waitq.c
===================================================================
--- kernel/generic/src/synch/waitq.c	(revision ada559c5e94ba58f9ea3b263de2877127eba8873)
+++ kernel/generic/src/synch/waitq.c	(revision 179d052bd8f476fcf6318dc690211df13a60f86d)
@@ -459,4 +459,7 @@
 {
 	size_t count = 0;
+
+	ASSERT(interrupts_disabled());
+	ASSERT(irq_spinlock_locked(&wq->lock));
 	
 loop:
Index: kernel/generic/src/sysinfo/stats.c
===================================================================
--- kernel/generic/src/sysinfo/stats.c	(revision ada559c5e94ba58f9ea3b263de2877127eba8873)
+++ kernel/generic/src/sysinfo/stats.c	(revision 179d052bd8f476fcf6318dc690211df13a60f86d)
@@ -204,4 +204,7 @@
 static void produce_stats_task(task_t *task, stats_task_t *stats_task)
 {
+	ASSERT(interrupts_disabled());
+	ASSERT(irq_spinlock_locked(&task->lock));
+
 	stats_task->task_id = task->taskid;
 	str_cpy(stats_task->name, TASK_NAME_BUFLEN, task->name);
@@ -303,4 +306,7 @@
 static void produce_stats_thread(thread_t *thread, stats_thread_t *stats_thread)
 {
+	ASSERT(interrupts_disabled());
+	ASSERT(irq_spinlock_locked(&thread->lock));
+
 	stats_thread->thread_id = thread->tid;
 	stats_thread->task_id = thread->task->taskid;
Index: kernel/generic/src/udebug/udebug.c
===================================================================
--- kernel/generic/src/udebug/udebug.c	(revision ada559c5e94ba58f9ea3b263de2877127eba8873)
+++ kernel/generic/src/udebug/udebug.c	(revision 179d052bd8f476fcf6318dc690211df13a60f86d)
@@ -389,5 +389,5 @@
  * FINISHED event for each of them.
  *
- * @param task Task structure. ta->udebug.lock must be already locked.
+ * @param task Task structure. task->udebug.lock must be already locked.
  *
  * @return Zero on success or negative error code.
@@ -396,4 +396,6 @@
 int udebug_task_cleanup(struct task *task)
 {
+	ASSERT(mutex_locked(&task->udebug.lock));
+
 	if ((task->udebug.dt_state != UDEBUG_TS_BEGINNING) &&
 	    (task->udebug.dt_state != UDEBUG_TS_ACTIVE)) {
