diff --git a/libkvm/libkvm.c b/libkvm/libkvm.c
index 5edfad7..ebf39b6 100644
--- a/libkvm/libkvm.c
+++ b/libkvm/libkvm.c
@@ -100,21 +100,6 @@ int get_free_slot(kvm_context_t kvm)
 	return -1;
 }
 
-void register_slot(int slot, unsigned long phys_addr, unsigned long len,
-		   int user_alloc, unsigned long userspace_addr, unsigned flags)
-{
-	slots[slot].phys_addr = phys_addr;
-	slots[slot].len = len;
-	slots[slot].user_alloc = user_alloc;
-	slots[slot].userspace_addr = userspace_addr;
-        slots[slot].flags = flags;
-}
-
-void free_slot(int slot)
-{
-	slots[slot].len = 0;
-}
-
 int get_slot(unsigned long phys_addr)
 {
 	int i;
@@ -138,6 +123,58 @@ int get_intersecting_slot(unsigned long phys_addr)
 	return -1;
 }
 
+void register_slot(int slot, unsigned long phys_addr, unsigned long len,
+		   int user_alloc, unsigned long userspace_addr, unsigned flags)
+{
+	int pslot;
+	int nslot;
+
+	int merged = 0;
+
+	/* Merge with previous slot ? */
+	pslot = get_slot(phys_addr-1);
+	if (pslot != -1) {
+		if (slots[pslot].userspace_addr + len == userspace_addr &&
+			slots[pslot].user_alloc == user_alloc &&
+			slots[pslot].flags == flags) {
+
+			slots[pslot].len += len;
+			merged = 1;
+		}
+	}
+
+	/* Merge with following slot ? */
+	nslot = get_slot(phys_addr+len);
+	if (nslot != -1) {
+		if (slots[nslot].userspace_addr == userspace_addr + len &&
+			slots[nslot].user_alloc == user_alloc &&
+			slots[nslot].flags == flags) {
+
+			slots[nslot].phys_addr = phys_addr;
+			slots[nslot].len += len;
+			slots[nslot].userspace_addr = userspace_addr;
+			
+			if (merged)
+				slots[pslot].len = 0;
+
+			merged = 1;
+		}
+	}
+
+	if (!merged) {
+		slots[slot].phys_addr = phys_addr;
+		slots[slot].len = len;
+		slots[slot].user_alloc = user_alloc;
+		slots[slot].userspace_addr = userspace_addr;
+        slots[slot].flags = flags;
+	}
+}
+
+void free_slot(int slot)
+{
+	slots[slot].len = 0;
+}
+
 /* 
  * dirty pages logging control 
  */
