diff --git a/btr/btr0btr.c b/btr/btr0btr.c
index dd248e6e555..7e734bbec2c 100644
--- a/btr/btr0btr.c
+++ b/btr/btr0btr.c
@@ -264,7 +264,7 @@ btr_page_create(
 			UT_LIST_GET_FIRST(tree->tree_indexes)->table->comp);
 	buf_block_align(page)->check_index_page_at_flush = TRUE;
 	
-	btr_page_set_index_id(page, tree->id, mtr);
+	btr_page_set_index_id(page, NULL, tree->id, mtr);
 }
 
 /******************************************************************
@@ -730,14 +730,14 @@ btr_create(
 	buf_block_align(page)->check_index_page_at_flush = TRUE;
 
 	/* Set the index id of the page */
-	btr_page_set_index_id(page, index_id, mtr);
+	btr_page_set_index_id(page, NULL, index_id, mtr);
 
 	/* Set the level of the new index page */
-	btr_page_set_level(page, 0, mtr);
+	btr_page_set_level(page, NULL, 0, mtr);
 	
 	/* Set the next node and previous node fields */
-	btr_page_set_next(page, FIL_NULL, mtr);
-	btr_page_set_prev(page, FIL_NULL, mtr);
+	btr_page_set_next(page, NULL, FIL_NULL, mtr);
+	btr_page_set_prev(page, NULL, FIL_NULL, mtr);
 
 	/* We reset the free bits for the page to allow creation of several
 	trees in the same mtr, otherwise the latch on a bitmap page would
@@ -1046,12 +1046,12 @@ btr_root_raise_and_insert(
 	level = btr_page_get_level(root, mtr);
 	
 	/* Set the levels of the new index page and root page */
-	btr_page_set_level(new_page, level, mtr);
-	btr_page_set_level(root, level + 1, mtr);
+	btr_page_set_level(new_page, NULL, level, mtr);
+	btr_page_set_level(root, NULL/* TODO */, level + 1, mtr);
 	
 	/* Set the next node and previous node fields of new page */
-	btr_page_set_next(new_page, FIL_NULL, mtr);
-	btr_page_set_prev(new_page, FIL_NULL, mtr);
+	btr_page_set_next(new_page, NULL, FIL_NULL, mtr);
+	btr_page_set_prev(new_page, NULL, FIL_NULL, mtr);
 
 	/* Move the records from root to the new page */
 
@@ -1480,6 +1480,7 @@ btr_attach_half_pages(
 /*==================*/
 	dict_tree_t*	tree,		/* in: the index tree */
 	page_t*		page,		/* in: page to be split */
+	/* TODO page_zip? */
 	rec_t*		split_rec,	/* in: first record on upper
 					half page */
 	page_t*		new_page,	/* in: the new half page */
@@ -1497,6 +1498,8 @@ btr_attach_half_pages(
 	page_t*		upper_page;
 	ulint		lower_page_no;
 	ulint		upper_page_no;
+	page_zip_des_t*	lower_page_zip;
+	page_zip_des_t*	upper_page_zip;
 	dtuple_t*	node_ptr_upper;
 	mem_heap_t* 	heap;
 
@@ -1523,7 +1526,7 @@ btr_attach_half_pages(
 		/* Replace the address of the old child node (= page) with the 
 		address of the new lower half */
 
-		btr_node_ptr_set_child_page_no(node_ptr,
+		btr_node_ptr_set_child_page_no(node_ptr/* TODO zip */,
 			rec_get_offsets(node_ptr,
 					UT_LIST_GET_FIRST(tree->tree_indexes),
 					NULL, ULINT_UNDEFINED, &heap),
@@ -1536,6 +1539,9 @@ btr_attach_half_pages(
 		upper_page = new_page;
 	}
 				   
+	lower_page_zip = buf_block_get_page_zip(buf_block_align(lower_page));
+	upper_page_zip = buf_block_get_page_zip(buf_block_align(upper_page));
+
 	/* Get the level of the split pages */
 	level = btr_page_get_level(page, mtr);
 
@@ -1566,7 +1572,9 @@ btr_attach_half_pages(
 		prev_page = btr_page_get(space, prev_page_no, RW_X_LATCH, mtr);
 		ut_a(page_is_comp(prev_page) == page_is_comp(page));
 
-		btr_page_set_next(prev_page, lower_page_no, mtr);
+		btr_page_set_next(prev_page, buf_block_get_page_zip(
+					buf_block_align(prev_page)),
+					lower_page_no, mtr);
 	}
 
 	if (next_page_no != FIL_NULL) {
@@ -1574,16 +1582,18 @@ btr_attach_half_pages(
 		next_page = btr_page_get(space, next_page_no, RW_X_LATCH, mtr);
 		ut_a(page_is_comp(next_page) == page_is_comp(page));
 
-		btr_page_set_prev(next_page, upper_page_no, mtr);
+		btr_page_set_prev(next_page, buf_block_get_page_zip(
+					buf_block_align(next_page)),
+					upper_page_no, mtr);
 	}
 	
-	btr_page_set_prev(lower_page, prev_page_no, mtr);
-	btr_page_set_next(lower_page, upper_page_no, mtr);
-	btr_page_set_level(lower_page, level, mtr);
+	btr_page_set_prev(lower_page, lower_page_zip, prev_page_no, mtr);
+	btr_page_set_next(lower_page, lower_page_zip, upper_page_no, mtr);
+	btr_page_set_level(lower_page, lower_page_zip, level, mtr);
 
-	btr_page_set_prev(upper_page, lower_page_no, mtr);
-	btr_page_set_next(upper_page, next_page_no, mtr);
-	btr_page_set_level(upper_page, level, mtr);
+	btr_page_set_prev(upper_page, upper_page_zip, lower_page_no, mtr);
+	btr_page_set_next(upper_page, upper_page_zip, next_page_no, mtr);
+	btr_page_set_level(upper_page, upper_page_zip, level, mtr);
 }
 
 /*****************************************************************
@@ -1852,7 +1862,9 @@ btr_level_list_remove(
 		prev_page = btr_page_get(space, prev_page_no, RW_X_LATCH, mtr);
 		ut_a(page_is_comp(prev_page) == page_is_comp(page));
 
-		btr_page_set_next(prev_page, next_page_no, mtr);
+		btr_page_set_next(prev_page, buf_block_get_page_zip(
+				buf_block_align(prev_page)),
+				next_page_no, mtr);
 	}
 
 	if (next_page_no != FIL_NULL) {
@@ -1860,7 +1872,9 @@ btr_level_list_remove(
 		next_page = btr_page_get(space, next_page_no, RW_X_LATCH, mtr);
 		ut_a(page_is_comp(next_page) == page_is_comp(page));
 
-		btr_page_set_prev(next_page, prev_page_no, mtr);
+		btr_page_set_prev(next_page, buf_block_get_page_zip(
+				buf_block_align(next_page)),
+				prev_page_no, mtr);
 	}
 }
 	
@@ -2022,7 +2036,7 @@ btr_lift_page_up(
 		ut_error;
 	}
 
-	btr_page_set_level(father_page, page_level, mtr);
+	btr_page_set_level(father_page, NULL, page_level, mtr);
 
 	if (UNIV_LIKELY_NULL(father_page_zip)) {
 		if (UNIV_UNLIKELY(!page_zip_compress(
@@ -2075,7 +2089,6 @@ btr_compress(
 	ulint		left_page_no;
 	ulint		right_page_no;
 	page_t*		merge_page;
-	page_t*		father_page;
 	ibool		is_left;
 	page_t*		page;
 	rec_t*		node_ptr;
@@ -2105,8 +2118,7 @@ btr_compress(
 	node_ptr = btr_page_get_father_node_ptr(tree, page, mtr);
 	ut_ad(!page_is_comp(page)
 		|| rec_get_status(node_ptr) == REC_STATUS_NODE_PTR);
-	father_page = buf_frame_align(node_ptr);
-	ut_a(page_is_comp(page) == page_is_comp(father_page));
+	ut_a(page_is_comp(page) == page_rec_is_comp(node_ptr));
 
 	/* Decide the page to which we try to merge and which will inherit
 	the locks */
@@ -2188,7 +2200,9 @@ btr_compress(
 		}
 		btr_node_ptr_delete(tree, merge_page, mtr);
 	}
-	
+
+	/* TODO: update page_zip of node_ptr */
+
 	/* Move records to the merge page */
 	if (is_left) {
 		rec_t*	orig_pred = page_rec_get_prev(
@@ -2255,12 +2269,14 @@ btr_discard_only_page_on_level(
 
 	lock_update_discard(page_get_supremum_rec(father_page), page);
 
-	btr_page_set_level(father_page, page_level, mtr);
+	btr_page_set_level(father_page, buf_block_get_page_zip(
+				buf_block_align(father_page)),
+				page_level, mtr);
 
 	/* Free the file page */
 	btr_page_free(tree, page, mtr);		
 
-	if (UNIV_UNLIKELY(buf_frame_get_page_no(father_page)
+	if (UNIV_LIKELY(buf_frame_get_page_no(father_page)
 				== dict_tree_get_page(tree))) {
 		/* The father is the root page */
 
diff --git a/include/btr0btr.ic b/include/btr0btr.ic
index a0860b1c3a7..2f9fc135390 100644
--- a/include/btr0btr.ic
+++ b/include/btr0btr.ic
@@ -42,10 +42,16 @@ void
 btr_page_set_index_id(
 /*==================*/
 	page_t*		page,	/* in: page to be created */
+	page_zip_des_t*	page_zip,/* in: compressed page, or NULL */
 	dulint		id,	/* in: index id */
 	mtr_t*		mtr)	/* in: mtr */
 {
 	mlog_write_dulint(page + PAGE_HEADER + PAGE_INDEX_ID, id, mtr);
+
+	if (UNIV_LIKELY_NULL(page_zip)) {
+		page_zip_write_header(page_zip,
+				page + PAGE_HEADER + PAGE_INDEX_ID, 8);
+	}
 }
 
 /******************************************************************
@@ -101,15 +107,21 @@ UNIV_INLINE
 void
 btr_page_set_level(
 /*===============*/
-	page_t*	page,	/* in: index page */
-	ulint	level,	/* in: level, leaf level == 0 */
-	mtr_t*	mtr)	/* in: mini-transaction handle */
+	page_t*		page,	/* in: index page */
+	page_zip_des_t*	page_zip,/* in: compressed page, or NULL */
+	ulint		level,	/* in: level, leaf level == 0 */
+	mtr_t*		mtr)	/* in: mini-transaction handle */
 {
 	ut_ad(page && mtr);
 	ut_ad(level <= BTR_MAX_NODE_LEVEL);
 
 	mlog_write_ulint(page + PAGE_HEADER + PAGE_LEVEL, level,
 							 MLOG_2BYTES, mtr);
+
+	if (UNIV_LIKELY_NULL(page_zip)) {
+		page_zip_write_header(page_zip,
+				page + PAGE_HEADER + PAGE_LEVEL, 2);
+	}
 }
 
 /************************************************************
@@ -137,13 +149,18 @@ UNIV_INLINE
 void
 btr_page_set_next(
 /*==============*/
-	page_t*	page,	/* in: index page */
-	ulint	next,	/* in: next page number */
-	mtr_t*	mtr)	/* in: mini-transaction handle */
+	page_t*		page,	/* in: index page */
+	page_zip_des_t*	page_zip,/* in: compressed page, or NULL */
+	ulint		next,	/* in: next page number */
+	mtr_t*		mtr)	/* in: mini-transaction handle */
 {
 	ut_ad(page && mtr);
 
 	mlog_write_ulint(page + FIL_PAGE_NEXT, next, MLOG_4BYTES, mtr);
+
+	if (UNIV_LIKELY_NULL(page_zip)) {
+		page_zip_write_header(page_zip, page + FIL_PAGE_NEXT, 4);
+	}
 }
 
 /************************************************************
@@ -167,13 +184,18 @@ UNIV_INLINE
 void
 btr_page_set_prev(
 /*==============*/
-	page_t*	page,	/* in: index page */
-	ulint	prev,	/* in: previous page number */
-	mtr_t*	mtr)	/* in: mini-transaction handle */
+	page_t*		page,	/* in: index page */
+	page_zip_des_t*	page_zip,/* in: compressed page, or NULL */
+	ulint		prev,	/* in: previous page number */
+	mtr_t*		mtr)	/* in: mini-transaction handle */
 {
 	ut_ad(page && mtr);
 
 	mlog_write_ulint(page + FIL_PAGE_PREV, prev, MLOG_4BYTES, mtr);
+
+	if (UNIV_LIKELY_NULL(page_zip)) {
+		page_zip_write_header(page_zip, page + FIL_PAGE_PREV, 4);
+	}
 }
 
 /******************************************************************
diff --git a/include/page0zip.ic b/include/page0zip.ic
index ba720846ec5..80cbf386a36 100644
--- a/include/page0zip.ic
+++ b/include/page0zip.ic
@@ -211,9 +211,10 @@ page_zip_write_trailer(
 
 	pos = ut_align_offset(str, UNIV_PAGE_SIZE);
 
-	ut_ad(pos < PAGE_DATA);/* TODO */
+	ut_ad(pos > PAGE_DATA);
 
-	memcpy(page_zip + pos/* TODO */, str, length);
+	memcpy(page_zip->data + page_zip->size - (UNIV_PAGE_SIZE - pos),
+				str, length);
 
 	ut_ad(page_zip_validate(page_zip, str - pos));
 }
diff --git a/page/page0page.c b/page/page0page.c
index 7b461126626..e9ef6f995eb 100644
--- a/page/page0page.c
+++ b/page/page0page.c
@@ -604,12 +604,12 @@ page_copy_rec_list_end(
 {
 	page_t*	page;
 
-	ut_ad(!new_page_zip || page_zip_validate(new_page_zip, new_page));
-
 	if (page_dir_get_n_heap(new_page) == 2) {
 		page_copy_rec_list_end_to_created_page(
 						new_page, rec, index, mtr);
 	} else {
+		ut_ad(!new_page_zip
+			|| page_zip_validate(new_page_zip, new_page));
 		page_copy_rec_list_end_no_locks(new_page, rec, index, mtr);
 	}