Index: kernel/generic/src/ddi/ddi.c
===================================================================
--- kernel/generic/src/ddi/ddi.c	(revision 9e40355e27190e4ad773852c97a87d91012aba10)
+++ kernel/generic/src/ddi/ddi.c	(revision 03c971f2e2115454ea0fbcaca3ac08bd88ac0a3c)
@@ -336,5 +336,5 @@
 		order = fnzb(pages - 1) + 1;
 	
-	*phys = frame_alloc_noreserve(order, 0);
+	*phys = frame_alloc_noreserve(order, FRAME_DMA);
 	if (*phys == NULL)
 		return ENOMEM;
@@ -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 9e40355e27190e4ad773852c97a87d91012aba10)
+++ kernel/generic/src/mm/as.c	(revision 03c971f2e2115454ea0fbcaca3ac08bd88ac0a3c)
@@ -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);
 }
 
Index: kernel/generic/src/mm/frame.c
===================================================================
--- kernel/generic/src/mm/frame.c	(revision 9e40355e27190e4ad773852c97a87d91012aba10)
+++ kernel/generic/src/mm/frame.c	(revision 03c971f2e2115454ea0fbcaca3ac08bd88ac0a3c)
@@ -518,5 +518,7 @@
 NO_TRACE static void zone_mark_unavailable(zone_t *zone, size_t frame_idx)
 {
-	ASSERT(zone->flags & ZONE_AVAILABLE);
+	if (!(zone->flags & ZONE_AVAILABLE))
+		return;
+//	ASSERT(zone->flags & ZONE_AVAILABLE);
 	
 	frame_t *frame = zone_get_frame(zone, frame_idx);
@@ -935,6 +937,9 @@
 			}
 			
-			if (confframe >= start + count)
-				panic("Cannot find configuration data for zone.");
+			if (confframe >= start + count) {
+				flags &= ~ZONE_AVAILABLE;
+				goto nonavail;
+//				panic("Cannot find configuration data for zone.");
+			}
 		}
 		
@@ -960,5 +965,6 @@
 		return znum;
 	}
-	
+nonavail:
+	(void)0; // label trick
 	/* Non-available zone */
 	size_t znum = zones_insert_zone(start, count, flags);
