diff --git a/src/libpmem2/map_posix.c b/src/libpmem2/map_posix.c
index 302cc7a19d3a7031a661cc6900ed91c574923988..0b042aa6869bf2d67db3a9d279b9361ddae08fa4 100644
--- a/src/libpmem2/map_posix.c
+++ b/src/libpmem2/map_posix.c
@@ -263,8 +263,11 @@ unmap(void *addr, size_t len)
 static int
 vm_reservation_mend(struct pmem2_vm_reservation *rsv, void *addr, size_t size)
 {
-	ASSERT((char *)addr >= (char *)rsv->addr &&
-			(char *)addr + size <= (char *)rsv->addr + rsv->size);
+	void *rsv_addr = pmem2_vm_reservation_get_address(rsv);
+	size_t rsv_size = pmem2_vm_reservation_get_size(rsv);
+
+	ASSERT((char *)addr >= (char *)rsv_addr &&
+			(char *)addr + size <= (char *)rsv_addr + rsv_size);
 
 	char *daddr = mmap(addr, size, PROT_NONE,
 			MAP_PRIVATE | MAP_ANONYMOUS | MAP_FIXED, -1, 0);
@@ -570,8 +573,8 @@ pmem2_map_delete(struct pmem2_map **map_ptr)
 		VALGRIND_REMOVE_PMEM_MAPPING(map_addr, map_len);
 
 		if (rsv) {
-			size_t rsv_offset = (size_t)map_addr -
-					(size_t)rsv->addr;
+			void *rsv_addr = pmem2_vm_reservation_get_address(rsv);
+			size_t rsv_offset = (size_t)map_addr - (size_t)rsv_addr;
 			if (!vm_reservation_map_find_acquire(rsv, rsv_offset,
 					map_len)) {
 				ret = PMEM2_E_MAPPING_NOT_FOUND;
diff --git a/src/libpmem2/map_windows.c b/src/libpmem2/map_windows.c
index b35926dc033c5d89f569026e4e83ccde4b0070fa..67901eed316610becc58142e229f9e33980b7911 100644
--- a/src/libpmem2/map_windows.c
+++ b/src/libpmem2/map_windows.c
@@ -142,8 +142,9 @@ static int
 vm_reservation_merge(struct pmem2_vm_reservation *rsv, void *addr,
 		size_t length)
 {
+	void *rsv_addr = pmem2_vm_reservation_get_address(rsv);
 	size_t rsv_size = pmem2_vm_reservation_get_size(rsv);
-	size_t rsv_offset = (size_t)addr - (size_t)rsv->addr;
+	size_t rsv_offset = (size_t)addr - (size_t)rsv_addr;
 
 	/*
 	 * After unmapping from the reservation, it is neccessary to merge
@@ -161,7 +162,7 @@ vm_reservation_merge(struct pmem2_vm_reservation *rsv, void *addr,
 			merge_addr = (char *)map->addr + map->reserved_length;
 			merge_size += (char *)addr - (char *)merge_addr;
 		} else {
-			merge_addr = rsv->addr;
+			merge_addr = rsv_addr;
 			merge_size += rsv_offset;
 		}
 	}
@@ -172,7 +173,7 @@ vm_reservation_merge(struct pmem2_vm_reservation *rsv, void *addr,
 		if (map)
 			merge_size += (char *)map->addr - (char *)addr - length;
 		else
-			merge_size += rsv->size - rsv_offset - length;
+			merge_size += rsv_size - rsv_offset - length;
 	}
 
 	if ((addr != merge_addr) || (length != merge_size)) {
@@ -546,8 +547,8 @@ pmem2_map_delete(struct pmem2_map **map_ptr)
 
 	if (map->reserved_length != 0) {
 		if (rsv) {
-			size_t rsv_offset = (size_t)map_addr -
-					(size_t)rsv->addr;
+			void *rsv_addr = pmem2_vm_reservation_get_address(rsv);
+			size_t rsv_offset = (size_t)map_addr - (size_t)rsv_addr;
 			if (!vm_reservation_map_find_acquire(rsv, rsv_offset,
 					map_len)) {
 				ret = PMEM2_E_MAPPING_NOT_FOUND;
diff --git a/src/libpmem2/vm_reservation.c b/src/libpmem2/vm_reservation.c
index ae5f6c9f1b0c55f536d0489c47a59da8730b586d..7ea400387a59065322a1ab78e8f09388ef6ea48e 100644
--- a/src/libpmem2/vm_reservation.c
+++ b/src/libpmem2/vm_reservation.c
@@ -16,9 +16,18 @@
 #include <Windows.h>
 #endif
 
+struct pmem2_vm_reservation {
+	struct ravl_interval *itree;
+	void *addr;
+	size_t size;
+	os_rwlock_t lock;
+};
+
 int vm_reservation_reserve_memory(void *addr, size_t size, void **raddr,
 		size_t *rsize);
 int vm_reservation_release_memory(void *addr, size_t size);
+struct ravl_interval *vm_reservation_get_interval_tree(
+		struct pmem2_vm_reservation *rsv);
 
 /*
  * pmem2_vm_reservation_get_address -- get reservation address
@@ -274,3 +283,12 @@ vm_reservation_release(struct pmem2_vm_reservation *rsv)
 {
 	util_rwlock_unlock(&rsv->lock);
 }
+
+/*
+ * vm_reservation_get_interval_tree -- get interval tree
+ */
+struct ravl_interval *
+vm_reservation_get_interval_tree(struct pmem2_vm_reservation *rsv)
+{
+	return rsv->itree;
+}
diff --git a/src/libpmem2/vm_reservation.h b/src/libpmem2/vm_reservation.h
index bcae6ef23ffce173e81cffb608edb0671c9185ed..68e4273f3e46e1501d5052c41d943f17f35e76c6 100644
--- a/src/libpmem2/vm_reservation.h
+++ b/src/libpmem2/vm_reservation.h
@@ -9,12 +9,7 @@
 
 #include "ravl_interval.h"
 
-struct pmem2_vm_reservation {
-	struct ravl_interval *itree;
-	void *addr;
-	size_t size;
-	os_rwlock_t lock;
-};
+struct pmem2_vm_reservation;
 
 int vm_reservation_map_register_release(struct pmem2_vm_reservation *rsv,
 		struct pmem2_map *map);
diff --git a/src/libpmem2/vm_reservation_windows.c b/src/libpmem2/vm_reservation_windows.c
index e8c3cacecf5358e2dafc93af506c1805b054bfef..6e8c2a77635d18b8cc081367e5afcd50d6b45b0b 100644
--- a/src/libpmem2/vm_reservation_windows.c
+++ b/src/libpmem2/vm_reservation_windows.c
@@ -22,6 +22,8 @@ struct pmem2_map *vm_reservation_map_find_closest_prior(
 struct pmem2_map *vm_reservation_map_find_closest_later(
 		struct pmem2_vm_reservation *rsv,
 		size_t reserv_offset, size_t len);
+struct ravl_interval *vm_reservation_get_interval_tree(
+		struct pmem2_vm_reservation *rsv);
 
 /*
  * vm_reservation_reserve_memory -- create a blank virual memory mapping
@@ -79,12 +81,14 @@ vm_reservation_map_find_closest_prior(struct pmem2_vm_reservation *rsv,
 		size_t reserv_offset, size_t len)
 {
 	struct pmem2_map map;
-	map.addr = (char *)rsv->addr + reserv_offset;
+
+	map.addr = (char *)pmem2_vm_reservation_get_address(rsv) +
+			reserv_offset;
 	map.content_length = len;
 
 	struct ravl_interval_node *node;
-
-	node = ravl_interval_find_closest_prior(rsv->itree, &map);
+	struct ravl_interval *itree = vm_reservation_get_interval_tree(rsv);
+	node = ravl_interval_find_closest_prior(itree, &map);
 
 	if (!node)
 		return NULL;
@@ -101,12 +105,13 @@ vm_reservation_map_find_closest_later(struct pmem2_vm_reservation *rsv,
 		size_t reserv_offset, size_t len)
 {
 	struct pmem2_map map;
-	map.addr = (char *)rsv->addr + reserv_offset;
+	map.addr = (char *)pmem2_vm_reservation_get_address(rsv) +
+			reserv_offset;
 	map.content_length = len;
 
 	struct ravl_interval_node *node;
-
-	node = ravl_interval_find_closest_later(rsv->itree, &map);
+	struct ravl_interval *itree = vm_reservation_get_interval_tree(rsv);
+	node = ravl_interval_find_closest_later(itree, &map);
 
 	if (!node)
 		return NULL;
diff --git a/src/test/pmem2_vm_reservation/TESTS.py b/src/test/pmem2_vm_reservation/TESTS.py
index 0b07d7e70425387bc1566e721d6403cbb5ab0dd7..4cb35d6bc5c19160811be773073b3cddbebe3e7a 100755
--- a/src/test/pmem2_vm_reservation/TESTS.py
+++ b/src/test/pmem2_vm_reservation/TESTS.py
@@ -205,27 +205,6 @@ class TEST20(PMEM2_VM_RESERVATION):
 
 
 class TEST21(PMEM2_VM_RESERVATION):
-    """delete a vm reservation with spoiled address"""
-    test_case = "test_vm_reserv_delete_spoil_addr"
-
-
-class TEST22(PMEM2_VM_RESERVATION_DEVDAX):
-    """DevDax delete a vm reservation with spoiled address"""
-    test_case = "test_vm_reserv_delete_spoil_addr"
-
-
-@t.windows_exclude
-class TEST23(PMEM2_VM_RESERVATION):
-    """delete a vm reservation with spoiled size"""
-    test_case = "test_vm_reserv_delete_spoil_size"
-
-
-class TEST24(PMEM2_VM_RESERVATION_DEVDAX):
-    """DevDax delete a vm reservation with spoiled size"""
-    test_case = "test_vm_reserv_delete_spoil_size"
-
-
-class TEST25(PMEM2_VM_RESERVATION):
     """
     map multiple files to a vm reservation, then
     unmap every 2nd mapping and map the mappings again
@@ -233,7 +212,7 @@ class TEST25(PMEM2_VM_RESERVATION):
     test_case = "test_vm_reserv_map_unmap_multiple_files"
 
 
-class TEST26(PMEM2_VM_RESERVATION_DEVDAX):
+class TEST22(PMEM2_VM_RESERVATION_DEVDAX):
     """
     DevDax map multiple files to a vm reservation, then
     unmap every 2nd mapping and map the mappings again
@@ -241,12 +220,12 @@ class TEST26(PMEM2_VM_RESERVATION_DEVDAX):
     test_case = "test_vm_reserv_map_unmap_multiple_files"
 
 
-class TEST27(PMEM2_VM_RESERVATION):
+class TEST23(PMEM2_VM_RESERVATION):
     """map a file to a vm reservation with insufficient space"""
     test_case = "test_vm_reserv_map_insufficient_space"
 
 
-class TEST28(PMEM2_VM_RESERVATION):
+class TEST24(PMEM2_VM_RESERVATION):
     """
     map a file to a vm reservation and overlap whole other existing mapping
     belonging to the same reservation
@@ -254,7 +233,7 @@ class TEST28(PMEM2_VM_RESERVATION):
     test_case = "test_vm_reserv_map_full_overlap"
 
 
-class TEST29(PMEM2_VM_RESERVATION_DEVDAX):
+class TEST25(PMEM2_VM_RESERVATION_DEVDAX):
     """
     DevDax map a file to a vm reservation and overlap whole other
     existing mapping belonging to the same reservation
@@ -262,7 +241,7 @@ class TEST29(PMEM2_VM_RESERVATION_DEVDAX):
     test_case = "test_vm_reserv_map_full_overlap"
 
 
-class TEST30(PMEM2_VM_RESERVATION):
+class TEST26(PMEM2_VM_RESERVATION):
     """
     map a file to a vm reservation overlapping with the ealier half
     of the other existing mapping
@@ -270,7 +249,7 @@ class TEST30(PMEM2_VM_RESERVATION):
     test_case = "test_vm_reserv_map_partial_overlap_below"
 
 
-class TEST31(PMEM2_VM_RESERVATION_DEVDAX):
+class TEST27(PMEM2_VM_RESERVATION_DEVDAX):
     """
     DevDax map a file to a vm reservation overlapping with the ealier half
     of the other existing mapping
@@ -278,7 +257,7 @@ class TEST31(PMEM2_VM_RESERVATION_DEVDAX):
     test_case = "test_vm_reserv_map_partial_overlap_below"
 
 
-class TEST32(PMEM2_VM_RESERVATION):
+class TEST28(PMEM2_VM_RESERVATION):
     """
     map a file to a vm reservation overlapping with the latter half
     of the other existing mapping
@@ -286,7 +265,7 @@ class TEST32(PMEM2_VM_RESERVATION):
     test_case = "test_vm_reserv_map_partial_overlap_above"
 
 
-class TEST33(PMEM2_VM_RESERVATION_DEVDAX):
+class TEST29(PMEM2_VM_RESERVATION_DEVDAX):
     """
     DevDax map a file to a vm reservation overlapping with the latter half
     of the other existing mapping
@@ -295,7 +274,7 @@ class TEST33(PMEM2_VM_RESERVATION_DEVDAX):
 
 
 @g.require_granularity(g.PAGE, g.CACHELINE)
-class TEST34(PMEM2_VM_RESERVATION):
+class TEST30(PMEM2_VM_RESERVATION):
     """
     map a file with invalid granularity to a vm reservation in the middle of
     the vm reservation bigger than the file, then map a file that covers whole
@@ -304,7 +283,7 @@ class TEST34(PMEM2_VM_RESERVATION):
     test_case = "test_vm_reserv_map_invalid_granularity"
 
 
-class TEST35(PMEM2_VM_RESERVATION_ASYNC):
+class TEST31(PMEM2_VM_RESERVATION_ASYNC):
     """
     map and unmap asynchronously multiple times to the whole vm reservation
     region
@@ -314,7 +293,7 @@ class TEST35(PMEM2_VM_RESERVATION_ASYNC):
     ops_per_thread = 1000
 
 
-class TEST36(PMEM2_VM_RESERVATION_ASYNC_DEVDAX):
+class TEST32(PMEM2_VM_RESERVATION_ASYNC_DEVDAX):
     """
     DevDax map and unmap asynchronously multiple times to the whole
     whole vm reservation region
diff --git a/src/test/pmem2_vm_reservation/pmem2_vm_reservation.c b/src/test/pmem2_vm_reservation/pmem2_vm_reservation.c
index 6c433fca224ed860e1dec68157c28e991312f1ba..43725634479e47fb5b6b446d339f5f82f30ff335 100644
--- a/src/test/pmem2_vm_reservation/pmem2_vm_reservation.c
+++ b/src/test/pmem2_vm_reservation/pmem2_vm_reservation.c
@@ -558,76 +558,6 @@ test_vm_reserv_delete_contains_mapping(const struct test_case *tc,
 	return 2;
 }
 
-/*
- * test_vm_reserv_delete_spoil_addr - delete a vm reservation with
- *                                    spoiled address
- */
-static int
-test_vm_reserv_delete_spoil_addr(const struct test_case *tc,
-		int argc, char *argv[])
-{
-	if (argc < 2)
-		UT_FATAL("usage: test_vm_reserv_delete_spoil_addr "
-				"<file> <size>");
-	size_t size = ATOUL(argv[1]);
-	void *rsv_addr;
-	struct pmem2_vm_reservation *rsv;
-
-	/* create a reservation in the virtual memory */
-	int ret = pmem2_vm_reservation_new(&rsv, NULL, size);
-	UT_ASSERTeq(ret, 0);
-
-	rsv_addr = pmem2_vm_reservation_get_address(rsv);
-	/* spoil vm_reservation struct address */
-	rsv->addr = (void *) - 1;
-
-	ret = pmem2_vm_reservation_delete(&rsv);
-	UT_PMEM2_EXPECT_RETURN(ret, -EINVAL);
-
-	/* restore the appropriate address */
-	rsv->addr = rsv_addr;
-
-	ret = pmem2_vm_reservation_delete(&rsv);
-	UT_ASSERTeq(ret, 0);
-
-	return 2;
-}
-
-/*
- * test_vm_reserv_delete_spoil_size - delete a vm reservation with
- *                                    spoiled size
- */
-static int
-test_vm_reserv_delete_spoil_size(const struct test_case *tc,
-		int argc, char *argv[])
-{
-	if (argc < 2)
-		UT_FATAL("usage: test_vm_reserv_delete_spoil_size "
-				"<file> <size>");
-	size_t size = ATOUL(argv[1]);
-	size_t rsv_size;
-	struct pmem2_vm_reservation *rsv;
-
-	/* create a reservation in the virtual memory */
-	int ret = pmem2_vm_reservation_new(&rsv, NULL, size);
-	UT_ASSERTeq(ret, 0);
-
-	rsv_size = pmem2_vm_reservation_get_size(rsv);
-	/* spoil vm_reservation struct address */
-	rsv->size = 0;
-
-	ret = pmem2_vm_reservation_delete(&rsv);
-	UT_PMEM2_EXPECT_RETURN(ret, -EINVAL);
-
-	/* restore the appropriate size */
-	rsv->size = rsv_size;
-
-	ret = pmem2_vm_reservation_delete(&rsv);
-	UT_ASSERTeq(ret, 0);
-
-	return 2;
-}
-
 /*
  * test_vm_reserv_map_unmap_multiple_files - map multiple files to a
  * vm reservation, then unmap every 2nd mapping and map the mapping again
@@ -1173,8 +1103,6 @@ static struct test_case test_cases[] = {
 	TEST_CASE(test_vm_reserv_map_file),
 	TEST_CASE(test_vm_reserv_map_part_file),
 	TEST_CASE(test_vm_reserv_delete_contains_mapping),
-	TEST_CASE(test_vm_reserv_delete_spoil_addr),
-	TEST_CASE(test_vm_reserv_delete_spoil_size),
 	TEST_CASE(test_vm_reserv_map_unmap_multiple_files),
 	TEST_CASE(test_vm_reserv_map_insufficient_space),
 	TEST_CASE(test_vm_reserv_map_full_overlap),