Index: generic/include/mm/frame.h
===================================================================
--- generic/include/mm/frame.h	(revision df0103f7b38d6ac53512fd7880952c2d3a01c7d1)
+++ generic/include/mm/frame.h	(revision f3ac6360053576f070c57d84c51335e1bed6f4e0)
@@ -91,4 +91,5 @@
 extern pfn_t frame_alloc_generic(__u8 order, int flags, int * status, int *pzone);
 extern void frame_free(pfn_t pfn);
+extern void frame_reference_add(pfn_t pfn);
 
 extern int zone_create(pfn_t start, count_t count, pfn_t confframe, int flags);
Index: generic/src/mm/as.c
===================================================================
--- generic/src/mm/as.c	(revision df0103f7b38d6ac53512fd7880952c2d3a01c7d1)
+++ generic/src/mm/as.c	(revision f3ac6360053576f070c57d84c51335e1bed6f4e0)
@@ -392,7 +392,6 @@
 			ASSERT(PTE_PRESENT(pte));
 			frame = PTE_GET_FRAME(pte);
-			if (!(flags & AS_AREA_DEVICE)) {
-				/* TODO: increment frame reference count */
-			}
+			if (!(flags & AS_AREA_DEVICE))
+				frame_reference_add(ADDR2PFN(frame));
 			page_table_unlock(AS, false);
 		} else {
Index: generic/src/mm/frame.c
===================================================================
--- generic/src/mm/frame.c	(revision df0103f7b38d6ac53512fd7880952c2d3a01c7d1)
+++ generic/src/mm/frame.c	(revision f3ac6360053576f070c57d84c51335e1bed6f4e0)
@@ -59,9 +59,9 @@
 	link_t buddy_link;	/**< link to the next free block inside one order */
 	void *parent;           /**< If allocated by slab, this points there */
-}frame_t;
+} frame_t;
 
 typedef struct {
 	SPINLOCK_DECLARE(lock);	/**< this lock protects everything below */
-	pfn_t base;	/**< frame_no of the first frame in the frames array */
+	pfn_t base;		/**< frame_no of the first frame in the frames array */
 	count_t count;          /**< Size of zone */
 
@@ -72,5 +72,5 @@
 	buddy_system_t * buddy_system; /**< buddy system for the zone */
 	int flags;
-}zone_t;
+} zone_t;
 
 /*
@@ -83,5 +83,5 @@
 	int count;
 	zone_t *info[ZONES_MAX];
-}zones;
+} zones;
 
 
@@ -945,9 +945,9 @@
 /** Free a frame.
  *
- * Find respective frame structure for supplied addr.
+ * Find respective frame structure for supplied PFN.
  * Decrement frame reference count.
  * If it drops to zero, move the frame structure to free list.
  *
- * @param frame Frame no to be freed.
+ * @param frame Frame number to be freed.
  */
 void frame_free(pfn_t pfn)
@@ -970,5 +970,31 @@
 }
 
-
+/** Add reference to frame.
+ *
+ * Find respective frame structure for supplied PFN and
+ * increment frame reference count.
+ *
+ * @param frame Frame no to be freed.
+ */
+void frame_reference_add(pfn_t pfn)
+{
+	ipl_t ipl;
+	zone_t *zone;
+	frame_t *frame;
+
+	ipl = interrupts_disable();
+	
+	/*
+	 * First, find host frame zone for addr.
+	 */
+	zone = find_zone_and_lock(pfn,NULL);
+	ASSERT(zone);
+	
+	frame = &zone->frames[pfn-zone->base];
+	frame->refcount++;
+	
+	spinlock_unlock(&zone->lock);
+	interrupts_restore(ipl);
+}
 
 /** Mark given range unavailable in frame zones */
