Index: kernel/generic/src/ddi/ddi.c
===================================================================
--- kernel/generic/src/ddi/ddi.c	(revision c6a7b3a033a06e25a2eafce5e62b9f06f4794dee)
+++ kernel/generic/src/ddi/ddi.c	(revision eb0ef5148d4b4fe77108a5a24002b26178b294a7)
@@ -361,6 +361,20 @@
 NO_TRACE static int dmamem_unmap_anonymous(uintptr_t virt)
 {
-	// TODO: implement unlocking & unmap
-	return EOK;
+	// TODO: This is an ugly hack
+	as_t *as = TASK->as;
+
+	mutex_lock(&as->lock);
+	as_area_t *area = find_locked_area(as, virt);
+	if (!area) {
+		mutex_unlock(&as->lock);
+		return ENOENT;
+	}
+	frame_free_noreserve(area->backend_data.base);
+	area->backend_data.base = 0;
+	area->backend_data.frames = 0;
+	mutex_unlock(&area->lock);
+	mutex_unlock(&as->lock);
+
+	return as_area_destroy(as, virt);
 }
 
Index: kernel/generic/src/mm/as.c
===================================================================
--- kernel/generic/src/mm/as.c	(revision c6a7b3a033a06e25a2eafce5e62b9f06f4794dee)
+++ kernel/generic/src/mm/as.c	(revision eb0ef5148d4b4fe77108a5a24002b26178b294a7)
@@ -672,4 +672,11 @@
 	
 	return NULL;
+}
+
+/** UGLY! UGLY! UGLY! */
+// TODO: REMOVE ASAP!
+as_area_t * find_locked_area(as_t *as, uintptr_t va)
+{
+	return find_area_and_lock(as, va);
 }
 
