unsigned long long dest_alignment;
        unsigned long long region_size;
        int overlapping;
+       int dest_preamble_size;
 };
 
 struct test {
 static long long remap_region(struct config c, unsigned int threshold_mb,
                              char pattern_seed)
 {
-       void *addr, *src_addr, *dest_addr;
+       void *addr, *src_addr, *dest_addr, *dest_preamble_addr;
        unsigned long long i;
        struct timespec t_start = {0, 0}, t_end = {0, 0};
        long long  start_ns, end_ns, align_mask, ret, offset;
                goto out;
        }
 
-       /* Set byte pattern */
+       /* Set byte pattern for source block. */
        srand(pattern_seed);
        for (i = 0; i < threshold; i++)
                memset((char *) src_addr + i, (char) rand(), 1);
        addr = (void *) (((unsigned long long) src_addr + c.region_size
                          + offset) & align_mask);
 
+       /* Remap after the destination block preamble. */
+       addr += c.dest_preamble_size;
+
        /* See comment in get_source_mapping() */
        if (!((unsigned long long) addr & c.dest_alignment))
                addr = (void *) ((unsigned long long) addr | c.dest_alignment);
                addr += c.dest_alignment;
        }
 
+       if (c.dest_preamble_size) {
+               dest_preamble_addr = mmap((void *) addr - c.dest_preamble_size, c.dest_preamble_size,
+                                         PROT_READ | PROT_WRITE,
+                                         MAP_FIXED_NOREPLACE | MAP_ANONYMOUS | MAP_SHARED,
+                                                       -1, 0);
+               if (dest_preamble_addr == MAP_FAILED) {
+                       ksft_print_msg("Failed to map dest preamble region: %s\n",
+                                       strerror(errno));
+                       ret = -1;
+                       goto clean_up_src;
+               }
+
+               /* Set byte pattern for the dest preamble block. */
+               srand(pattern_seed);
+               for (i = 0; i < c.dest_preamble_size; i++)
+                       memset((char *) dest_preamble_addr + i, (char) rand(), 1);
+       }
+
        clock_gettime(CLOCK_MONOTONIC, &t_start);
        dest_addr = mremap(src_addr, c.region_size, c.region_size,
                                          MREMAP_MAYMOVE|MREMAP_FIXED, (char *) addr);
        if (dest_addr == MAP_FAILED) {
                ksft_print_msg("mremap failed: %s\n", strerror(errno));
                ret = -1;
-               goto clean_up_src;
+               goto clean_up_dest_preamble;
        }
 
        /* Verify byte pattern after remapping */
                }
        }
 
+       /* Verify the dest preamble byte pattern after remapping */
+       if (c.dest_preamble_size) {
+               srand(pattern_seed);
+               for (i = 0; i < c.dest_preamble_size; i++) {
+                       char c = (char) rand();
+
+                       if (((char *) dest_preamble_addr)[i] != c) {
+                               ksft_print_msg("Preamble data after remap doesn't match at offset %d\n",
+                                              i);
+                               ksft_print_msg("Expected: %#x\t Got: %#x\n", c & 0xff,
+                                              ((char *) dest_preamble_addr)[i] & 0xff);
+                               ret = -1;
+                               goto clean_up_dest;
+                       }
+               }
+       }
+
        start_ns = t_start.tv_sec * NS_PER_SEC + t_start.tv_nsec;
        end_ns = t_end.tv_sec * NS_PER_SEC + t_end.tv_nsec;
        ret = end_ns - start_ns;
  */
 clean_up_dest:
        munmap(dest_addr, c.region_size);
+clean_up_dest_preamble:
+       if (c.dest_preamble_size && dest_preamble_addr)
+               munmap(dest_preamble_addr, c.dest_preamble_size);
 clean_up_src:
        munmap(src_addr, c.region_size);
 out:
        return 0;
 }
 
-#define MAX_TEST 14
+#define MAX_TEST 15
 #define MAX_PERF_TEST 3
 int main(int argc, char **argv)
 {
        unsigned int threshold_mb = VALIDATION_DEFAULT_THRESHOLD;
        unsigned int pattern_seed;
        int num_expand_tests = 2;
-       struct test test_cases[MAX_TEST];
+       struct test test_cases[MAX_TEST] = {};
        struct test perf_test_cases[MAX_PERF_TEST];
        int page_size;
        time_t t;
        test_cases[13] = MAKE_TEST(_1MB, _1MB, _5MB, NON_OVERLAPPING, EXPECT_SUCCESS,
                                  "5MB mremap - Source 1MB-aligned, Destination 1MB-aligned");
 
+       /* Src and Dest addr 1MB aligned. 5MB mremap. */
+       test_cases[14] = MAKE_TEST(_1MB, _1MB, _5MB, NON_OVERLAPPING, EXPECT_SUCCESS,
+                                 "5MB mremap - Source 1MB-aligned, Dest 1MB-aligned with 40MB Preamble");
+       test_cases[14].config.dest_preamble_size = 10 * _4MB;
+
        perf_test_cases[0] =  MAKE_TEST(page_size, page_size, _1GB, NON_OVERLAPPING, EXPECT_SUCCESS,
                                        "1GB mremap - Source PTE-aligned, Destination PTE-aligned");
        /*