Index: kernel/generic/src/ddi/ddi.c
===================================================================
--- kernel/generic/src/ddi/ddi.c	(revision d1582b502edcb7bfeef771a2019538f265e7e27c)
+++ kernel/generic/src/ddi/ddi.c	(revision d70dc1c40835f7e957ea1b4fa52c29db4d21ced4)
@@ -107,4 +107,15 @@
 }
 
+/** Norify physical area has been unmapped.
+ *
+ * @param parea Physical area
+ */
+void ddi_parea_unmap_notify(parea_t *parea)
+{
+	parea->mapped = false;
+	if (parea->mapped_changed != NULL)
+		parea->mapped_changed(parea->arg);
+}
+
 /** Map piece of physical memory into virtual address space of current task.
  *
@@ -204,4 +215,6 @@
 
 map:
+	backend_data.parea = parea;
+
 	if (!as_area_create(TASK->as, flags, FRAMES2SIZE(pages),
 	    AS_AREA_ATTR_NONE, &phys_backend, &backend_data, virt, bound)) {
Index: kernel/generic/src/mm/backend_phys.c
===================================================================
--- kernel/generic/src/mm/backend_phys.c	(revision d1582b502edcb7bfeef771a2019538f265e7e27c)
+++ kernel/generic/src/mm/backend_phys.c	(revision d70dc1c40835f7e957ea1b4fa52c29db4d21ced4)
@@ -38,4 +38,5 @@
 
 #include <assert.h>
+#include <ddi/ddi.h>
 #include <typedefs.h>
 #include <mm/as.h>
@@ -101,8 +102,11 @@
 {
 	/*
-	 * Nothing to do.
 	 * The anonymous frames, if any, are released in
 	 * phys_destroy_shared_data().
 	 */
+
+	/* Notify parea has been unmapped */
+	if (area->backend_data.parea != NULL)
+		ddi_parea_unmap_notify(area->backend_data.parea);
 }
 
