diff --git a/src/btree/bt_debug.c b/src/btree/bt_debug.c
index 29c784c..99c90b9 100644
--- a/src/btree/bt_debug.c
+++ b/src/btree/bt_debug.c
@@ -29,6 +29,7 @@ struct __wt_dbg {
 	const char *key_format;
 	const char *value_format;
 
+	const char *tid;
 	WT_ITEM *t1, *t2;			/* Temporary space */
 };
 
@@ -138,7 +139,8 @@ __debug_item_key(WT_DBG *ds, const char *tag, const void *data_arg, size_t size)
 		data_arg = ds->t2->data;
 		size = ds->t2->size + 1;
 	}
-	return (ds->f(ds, "\t%s%s{%s}\n",
+	return (ds->f(ds, "[%s]\t%s%s{%s}\n",
+	    ds->tid,
 	    tag == NULL ? "" : tag, tag == NULL ? "" : " ",
 	    __wt_buf_set_printable_format(
 	    session, data_arg, size, ds->key_format, ds->t1)));
@@ -254,8 +256,11 @@ __debug_config(WT_SESSION_IMPL *session, WT_DBG *ds, const char *ofile)
 {
 	WT_BTREE *btree;
 	WT_DECL_RET;
+	char *tid;
 
+	tid = ds->tid;
 	memset(ds, 0, sizeof(WT_DBG));
+	ds->tid = tid;
 
 	ds->session = session;
 
@@ -434,9 +439,12 @@ __wt_debug_disk(
 {
 	WT_DBG *ds, _ds;
 	WT_DECL_RET;
+	char tid[64];
 
 	ds = &_ds;
 	WT_RET(__debug_config(session, ds, ofile));
+	ds->tid = tid;
+	WT_RET(__wt_thread_str(tid, sizeof(tid)));
 
 	WT_ERR(ds->f(ds, "%s page", __wt_page_type_string(dsk->type)));
 	switch (dsk->type) {
@@ -606,11 +614,14 @@ __wt_debug_tree_shape(
 {
 	WT_DBG *ds, _ds;
 	WT_DECL_RET;
+	char tid[64];
 
 	WT_ASSERT(session, S2BT_SAFE(session) != NULL);
 
 	ds = &_ds;
 	WT_RET(__debug_config(session, ds, ofile));
+	ds->tid = tid;
+	WT_RET(__wt_thread_str(tid, sizeof(tid)));
 
 	/* A NULL WT_REF starts at the top of the tree -- it's a convenience. */
 	if (ref == NULL)
@@ -687,6 +698,7 @@ __wt_debug_page(
 	WT_DBG *ds, _ds;
 	WT_DECL_RET;
 	WT_SESSION_IMPL *session;
+	char tid[64];
 
 	/*
 	 * Allow an explicit btree as an argument, as one may not yet be set on
@@ -699,6 +711,8 @@ __wt_debug_page(
 	ds = &_ds;
 	WT_WITH_BTREE(session, btree, ret = __debug_config(session, ds, ofile));
 	WT_RET(ret);
+	ds->tid = tid;
+	WT_RET(__wt_thread_str(tid, sizeof(tid)));
 
 	WT_WITH_BTREE(session, btree,
 	    ret = __debug_page(ds, ref, WT_DEBUG_TREE_LEAF));
@@ -732,9 +746,12 @@ __debug_tree(
 {
 	WT_DBG *ds, _ds;
 	WT_DECL_RET;
+	char tid[64];
 
 	ds = &_ds;
 	WT_RET(__debug_config(session, ds, ofile));
+	ds->tid = tid;
+	WT_RET(__wt_thread_str(tid, sizeof(tid)));
 
 	/* A NULL page starts at the top of the tree -- it's a convenience. */
 	if (ref == NULL)
@@ -811,6 +828,7 @@ __debug_page_metadata(WT_DBG *ds, WT_REF *ref)
 	mod = page->modify;
 	split_gen = 0;
 
+	WT_RET(ds->f(ds, "[%s] ", ds->tid));
 	WT_RET(ds->f(ds, "%p", (void *)ref));
 
 	switch (page->type) {
@@ -840,7 +858,7 @@ __debug_page_metadata(WT_DBG *ds, WT_REF *ref)
 	}
 
 	WT_RET(ds->f(ds, ": %s\n", __wt_page_type_string(page->type)));
-	WT_RET(ds->f(ds, "\t" "disk %p", (void *)page->dsk));
+	WT_RET(ds->f(ds, "[%s] \t" "disk %p", ds->tid, (void *)page->dsk));
 	if (page->dsk != NULL)
 		WT_RET(ds->f(
 		    ds, ", dsk_mem_size %" PRIu32, page->dsk->mem_size));
@@ -916,14 +934,14 @@ __debug_page_col_fix(WT_DBG *ds, WT_REF *ref)
 	if (dsk != NULL) {
 		ins = WT_SKIP_FIRST(WT_COL_UPDATE_SINGLE(page));
 		WT_FIX_FOREACH(btree, dsk, v, i) {
-			WT_RET(ds->f(ds, "\t%" PRIu64 "\t{", recno));
+			WT_RET(ds->f(ds, "[%s] \t%" PRIu64 "\t{", ds->tid, recno));
 			WT_RET(__debug_hex_byte(ds, v));
 			WT_RET(ds->f(ds, "}\n"));
 
 			/* Check for a match on the update list. */
 			if (ins != NULL && WT_INSERT_RECNO(ins) == recno) {
-				WT_RET(ds->f(ds, "\tupdate %" PRIu64 "\n",
-				    WT_INSERT_RECNO(ins)));
+				WT_RET(ds->f(ds, "[%s] \tupdate %" PRIu64 "\n",
+				    ds->tid, WT_INSERT_RECNO(ins)));
 				WT_RET(__debug_update(ds, ins->upd, true));
 				ins = WT_SKIP_NEXT(ins);
 			}
@@ -957,7 +975,7 @@ __debug_page_col_int(WT_DBG *ds, WT_PAGE *page, uint32_t flags)
 	session = ds->session;
 
 	WT_INTL_FOREACH_BEGIN(session, page, ref) {
-		WT_RET(ds->f(ds, "\trecno %" PRIu64 "\n", ref->ref_recno));
+		WT_RET(ds->f(ds, "[%s] \trecno %" PRIu64 "\n", ds->tid, ref->ref_recno));
 		WT_RET(__debug_ref(ds, ref));
 	} WT_INTL_FOREACH_END;
 
@@ -1108,7 +1126,7 @@ __debug_col_skip(
 
 	WT_SKIP_FOREACH(ins, head) {
 		WT_RET(ds->f(ds,
-		    "\t%s %" PRIu64 "\n", tag, WT_INSERT_RECNO(ins)));
+		    "[%s] \t%s %" PRIu64 "\n", ds->tid, tag, WT_INSERT_RECNO(ins)));
 		WT_RET(__debug_update(ds, ins->upd, hexbyte));
 	}
 	return (0);
@@ -1173,6 +1191,7 @@ __debug_update(WT_DBG *ds, WT_UPDATE *upd, bool hexbyte)
 	char ts_string[WT_TS_INT_STRING_SIZE];
 
 	for (; upd != NULL; upd = upd->next) {
+		WT_RET(ds->f(ds, "[%s]", ds->tid));
 		switch (upd->type) {
 		case WT_UPDATE_INVALID:
 			WT_RET(ds->f(ds, "\tvalue {invalid}\n"));
@@ -1202,6 +1221,7 @@ __debug_update(WT_DBG *ds, WT_UPDATE *upd, bool hexbyte)
 			break;
 		}
 
+		WT_RET(ds->f(ds, "[%s]", ds->tid));
 		if (upd->txnid == WT_TXN_ABORTED)
 			WT_RET(ds->f(ds, "\t" "txn id aborted"));
 		else
@@ -1283,6 +1303,7 @@ __debug_ref(WT_DBG *ds, WT_REF *ref)
 	}
 
 	__wt_ref_info(session, ref, &addr, &addr_size, NULL);
+	WT_RET(ds->f(ds, "[%s]", ds->tid));
 	return (ds->f(ds, "\t" "%p %s %s\n", (void *)ref,
 	    state, __wt_addr_string(session, addr, addr_size, ds->t1)));
 }
@@ -1301,6 +1322,7 @@ __debug_cell(WT_DBG *ds, const WT_PAGE_HEADER *dsk, WT_CELL_UNPACK *unpack)
 
 	session = ds->session;
 
+	WT_RET(ds->f(ds, "[%s]", ds->tid));
 	WT_RET(ds->f(ds, "\t%s: len %" PRIu32,
 	    __wt_cell_type_string(unpack->raw), unpack->size));
 
@@ -1405,6 +1427,7 @@ __debug_cell_data(WT_DBG *ds,
 	 * Column-store references to deleted cells return a NULL cell
 	 * reference.
 	 */
+	WT_RET(ds->f(ds, "[%s]", ds->tid));
 	if (unpack == NULL)
 		return (__debug_item(ds, tag, "deleted", strlen("deleted")));
 
diff --git a/src/btree/bt_read.c b/src/btree/bt_read.c
index c0933d4..9351c11 100644
--- a/src/btree/bt_read.c
+++ b/src/btree/bt_read.c
@@ -77,8 +77,14 @@ __las_page_instantiate_verbose(WT_SESSION_IMPL *session, uint64_t las_pageid)
 	WT_CACHE *cache;
 	uint64_t ckpt_gen_current, ckpt_gen_last;
 
+#if 1
 	if (!WT_VERBOSE_ISSET(session,
+	    WT_VERB_TEMPORARY |
 	    WT_VERB_LOOKASIDE | WT_VERB_LOOKASIDE_ACTIVITY))
+#else
+	if (!WT_VERBOSE_ISSET(session,
+	    WT_VERB_LOOKASIDE | WT_VERB_LOOKASIDE_ACTIVITY))
+#endif
 		return;
 
 	cache = S2C(session)->cache;
@@ -100,7 +106,12 @@ __las_page_instantiate_verbose(WT_SESSION_IMPL *session, uint64_t las_pageid)
 		if (__wt_atomic_casv64(&cache->las_verb_gen_read,
 			ckpt_gen_last, ckpt_gen_current)) {
 			__wt_verbose(session,
+#if 1
+			    WT_VERB_LOOKASIDE | WT_VERB_LOOKASIDE_ACTIVITY |
+			    WT_VERB_TEMPORARY,
+#else
 			    WT_VERB_LOOKASIDE | WT_VERB_LOOKASIDE_ACTIVITY,
+#endif
 			    "Read from lookaside file triggered for "
 			    "file ID %" PRIu32 ", page ID %" PRIu64,
 			    S2BT(session)->id, las_pageid);
@@ -172,6 +183,9 @@ __las_page_instantiate(WT_SESSION_IMPL *session, WT_REF *ref)
 	    ret = cursor->next(cursor)) {
 		WT_ERR(cursor->get_key(cursor,
 		    &las_pageid, &las_id, &las_counter, &las_key));
+		__wt_verbose(session, WT_VERB_TEMPORARY,
+		    "LAS_INSTANTIATE: table %s btree id %" PRIu32,
+		    S2BT(session)->dhandle->name, las_id);
 
 		/*
 		 * Confirm the search using the unique prefix; if not a match,
@@ -184,6 +198,15 @@ __las_page_instantiate(WT_SESSION_IMPL *session, WT_REF *ref)
 		WT_ERR(cursor->get_value(
 		    cursor, &las_txnid, &las_timestamp,
 		    &durable_timestamp, &prepare_state, &upd_type, &las_value));
+		if (upd_type == WT_UPDATE_BIRTHMARK)
+			__wt_verbose(session, WT_VERB_TEMPORARY,
+			    "LAS_INSTANTIATE: table %s txnid %" PRIu64
+			    " upd BIRTHMARK",
+			    S2BT(session)->dhandle->name, las_txnid);
+		else
+			__wt_verbose(session, WT_VERB_TEMPORARY,
+			    "LAS_INSTANTIATE: table %s txnid %" PRIu64 " upd %d",
+			    S2BT(session)->dhandle->name, las_txnid, (int)upd_type);
 		WT_ERR(__wt_update_alloc(
 		    session, &las_value, &upd, &incr, upd_type));
 		total_incr += incr;
@@ -197,6 +220,11 @@ __las_page_instantiate(WT_SESSION_IMPL *session, WT_REF *ref)
 		case WT_PAGE_COL_VAR:
 			p = las_key.data;
 			WT_ERR(__wt_vunpack_uint(&p, 0, &recno));
+			__wt_verbose(session, WT_VERB_TEMPORARY,
+			    "LAS_INSTANTIATE: COL table %s txnid %" PRIu64
+			    " recno %" PRIu64 " cur %" PRIu64,
+			    S2BT(session)->dhandle->name, las_txnid,
+			    recno, current_recno);
 			if (current_recno == recno)
 				break;
 			WT_ASSERT(session, current_recno < recno);
diff --git a/src/btree/bt_sync.c b/src/btree/bt_sync.c
index 3d940a8..0466811 100644
--- a/src/btree/bt_sync.c
+++ b/src/btree/bt_sync.c
@@ -59,6 +59,10 @@ __sync_checkpoint_can_skip(WT_SESSION_IMPL *session, WT_PAGE *page)
 			if (multi->addr.addr == NULL)
 				return (false);
 
+	__wt_verbose(session, WT_VERB_TEMPORARY,
+	    "CKPT_CAN_SKIP: TRUE page %p mod %p txn snap_max %" PRIu64
+	    " mod->first_dirty_txn %" PRIu64,
+	    page, mod, txn->snap_max, mod->first_dirty_txn);
 	return (true);
 }
 
diff --git a/src/cache/cache_las.c b/src/cache/cache_las.c
index a68c706..2288368 100644
--- a/src/cache/cache_las.c
+++ b/src/cache/cache_las.c
@@ -652,6 +652,9 @@ __wt_las_insert_block(WT_CURSOR *cursor,
 		case WT_PAGE_COL_FIX:
 		case WT_PAGE_COL_VAR:
 			p = key->mem;
+			__wt_verbose(session, WT_VERB_TEMPORARY,
+			    "LAS_INSERT: COL recno %" PRIu64,
+			    WT_INSERT_RECNO(list->ins));
 			WT_ERR(
 			    __wt_vpack_uint(&p, 0, WT_INSERT_RECNO(list->ins)));
 			key->size = WT_PTRDIFF(p, key->data);
@@ -730,10 +733,17 @@ __wt_las_insert_block(WT_CURSOR *cursor,
 				    upd->start_ts, upd->durable_ts,
 				    upd->prepare_state, WT_UPDATE_BIRTHMARK,
 				    &las_value);
-			} else
+				__wt_verbose(session, WT_VERB_TEMPORARY,
+				    "LAS_INSERT: BIRTHMARK txnid %" PRIu64,
+				    upd->txnid);
+			} else {
 				cursor->set_value(cursor, upd->txnid,
 				    upd->start_ts, upd->durable_ts,
 				    upd->prepare_state, upd->type, &las_value);
+				__wt_verbose(session, WT_VERB_TEMPORARY,
+				    "LAS_INSERT: type %d txnid %" PRIu64,
+				    (int)upd->type, upd->txnid);
+			}
 
 			/*
 			 * Using update looks a little strange because the keys
diff --git a/src/include/btree.i b/src/include/btree.i
index f0c0726..5c0f6c9 100644
--- a/src/include/btree.i
+++ b/src/include/btree.i
@@ -524,8 +524,12 @@ __wt_page_only_modify_set(WT_SESSION_IMPL *session, WT_PAGE *page)
 		 * first_dirty_txn rather than potentially racing to update it,
 		 * at worst, we'll unnecessarily write a page in a checkpoint.
 		 */
-		if (last_running != 0)
+		if (last_running != 0) {
 			page->modify->first_dirty_txn = last_running;
+			__wt_verbose(session, WT_VERB_TEMPORARY,
+			    "PG_ONLY_MOD: page %p mod %p first_dirty %" PRIu64,
+			    page, page->modify, last_running);
+		}
 	}
 
 	/* Check if this is the largest transaction ID to update the page. */
diff --git a/src/include/txn.i b/src/include/txn.i
index 6ce224e..72e5c09 100644
--- a/src/include/txn.i
+++ b/src/include/txn.i
@@ -743,6 +743,12 @@ __txn_visible_id(WT_SESSION_IMPL *session, uint64_t id)
 		return (true);
 
 	WT_BINARY_SEARCH(id, txn->snapshot, txn->snapshot_count, found);
+	if (found)
+		__wt_verbose(session, WT_VERB_TEMPORARY,
+		    "TXN_VISIBLE: myid %" PRIu64 " check id %" PRIu64
+		    " snapshot found NOT VISIBLE"
+		    " snap count %d",
+		    txn->id, id, txn->snapshot_count);
 	return (!found);
 }
 
diff --git a/src/reconcile/rec_write.c b/src/reconcile/rec_write.c
index 866eab3..f2d0bf2 100644
--- a/src/reconcile/rec_write.c
+++ b/src/reconcile/rec_write.c
@@ -260,6 +260,8 @@ typedef struct {
 	bool cache_write_restore;	/* Used update/restoration */
 
 	uint32_t tested_ref_state;	/* Debugging information */
+#define	WT_REC_CONFLICT		0x1
+	uint32_t rec_flags;
 
 	/*
 	 * XXX
@@ -350,6 +352,7 @@ __wt_reconcile(WT_SESSION_IMPL *session, WT_REF *ref,
 	WT_PAGE_MODIFY *mod;
 	WT_RECONCILE *r;
 	uint64_t oldest_id;
+	int rec_ret;
 
 	btree = S2BT(session);
 	page = ref->page;
@@ -363,6 +366,12 @@ __wt_reconcile(WT_SESSION_IMPL *session, WT_REF *ref,
 	    LF_ISSET(WT_REC_EVICT) ? "evict" : "checkpoint",
 	    LF_ISSET(WT_REC_LOOKASIDE) ? ", lookaside" : "",
 	    LF_ISSET(WT_REC_UPDATE_RESTORE) ? ", update/restore" : "");
+	__wt_verbose(session, WT_VERB_TEMPORARY,
+	    "%p reconcile %s (%s%s%s)",
+	    (void *)ref, __wt_page_type_string(page->type),
+	    LF_ISSET(WT_REC_EVICT) ? "evict" : "checkpoint",
+	    LF_ISSET(WT_REC_LOOKASIDE) ? ", lookaside" : "",
+	    LF_ISSET(WT_REC_UPDATE_RESTORE) ? ", update/restore" : "");
 
 	/*
 	 * Sanity check flags.
@@ -485,10 +494,19 @@ __wt_reconcile(WT_SESSION_IMPL *session, WT_REF *ref,
 	WT_TRET(__rec_write_check_complete(session, r, ret, lookaside_retryp));
 
 	/* Wrap up the page reconciliation. */
+	rec_ret = ret;
 	if (ret == 0 && (ret = __rec_write_wrapup(session, r, page)) == 0)
 		__rec_write_page_status(session, r);
-	else
+	else {
+		if (FLD_ISSET(r->rec_flags, WT_REC_CONFLICT))
+			__wt_verbose(session, WT_VERB_TEMPORARY,
+			    "WT_RECONCILE: ref %p (%s) error ret %d in %s",
+			    r->ref, (r->ref->page_las == NULL ?
+			    "NO PAGE LAS" : "with page LAS"), ret,
+			    rec_ret == 0 ? "WRITE_WRAPUP" : "WT_RECONCILE");
 		WT_TRET(__rec_write_wrapup_err(session, r, page));
+	}
+	FLD_CLR(r->rec_flags, WT_REC_CONFLICT);
 
 	/*
 	 * If reconciliation completes successfully, save the stable timestamp.
@@ -578,6 +596,15 @@ static int
 __rec_write_check_complete(
     WT_SESSION_IMPL *session, WT_RECONCILE *r, int tret, bool *lookaside_retryp)
 {
+	WT_BTREE *btree;
+	WT_TXN *txn;
+	WT_TXN_GLOBAL *tg;
+	uint32_t i;
+
+	btree = S2BT(session);
+	txn = &session->txn;
+	tg = &S2C(session)->txn_global;
+
 	/*
 	 * Tests in this function are lookaside tests and tests to decide if
 	 * rewriting a page in memory is worth doing. In-memory configurations
@@ -588,6 +615,57 @@ __rec_write_check_complete(
 	if (F_ISSET(r, WT_REC_IN_MEMORY))
 		return (0);
 
+	if (r->orig_btree_checkpoint_gen != btree->checkpoint_gen ||
+	    r->orig_txn_checkpoint_gen !=
+	    __wt_gen(session, WT_GEN_CHECKPOINT) ||
+	    r->orig_btree_checkpoint_gen != r->orig_txn_checkpoint_gen) {
+		FLD_SET(r->rec_flags, WT_REC_CONFLICT);
+		__wt_verbose(session, WT_VERB_TEMPORARY,
+		    "REC_CHECK: EBUSY CONFLICT r->orig_btree_ckpt_gen %" PRIu64
+		    " r->orig_txn_ckpt_gen %" PRIu64
+		    " btree->checkpoint_gen %" PRIu64 " wt_gen CKPT %" PRIu64,
+		    r->orig_btree_checkpoint_gen, r->orig_txn_checkpoint_gen,
+		    btree->checkpoint_gen,
+		    __wt_gen(session, WT_GEN_CHECKPOINT));
+		__wt_verbose(session, WT_VERB_TEMPORARY,
+		    "REC_CHECK: RECONCILE skew_newest %d max_txn %" PRIu64
+		    " unstable_txn %" PRIu64 " ref %p page %p",
+		    r->las_skew_newest, r->max_txn, r->unstable_txn,
+		    r->ref, r->page);
+		__wt_verbose(session, WT_VERB_TEMPORARY,
+		    "REC_CHECK: RECONCILE leave_dirty %d", r->leave_dirty);
+		__wt_verbose(session, WT_VERB_TEMPORARY,
+		    "REC_CHECK: txn flags %" PRIx32 " snap_min %" PRIu64
+		   " snap_max %" PRIu64 " snapcount %" PRIu32,
+		    txn->flags, txn->snap_min, txn->snap_max, txn->snapshot_count);
+		for (i = 0; i < txn->snapshot_count; i++) {
+			__wt_verbose(session, WT_VERB_TEMPORARY,
+			    "REC_CHECK: snap %" PRIu32 ": %" PRIu64,
+			    i, txn->snapshot[i]);
+		}
+		__wt_verbose(session, WT_VERB_TEMPORARY,
+		    "REC_CHECK: %s", WT_DIVIDER);
+		__wt_verbose(session, WT_VERB_TEMPORARY,
+		    "REC_CHECK: TXN_GLOBAL: ckpt running %d ckpt txn id %" PRIu64,
+		    tg->checkpoint_running, tg->checkpoint_state.id);
+		__wt_verbose(session, WT_VERB_TEMPORARY,
+		    "REC_CHECK: TXN_GLOBAL: last_running %" PRIu64 " oldest id %" PRIu64,
+		    tg->last_running, tg->oldest_id);
+		__wt_verbose(session, WT_VERB_TEMPORARY,
+		    "REC_CHECK: %s", WT_DIVIDER);
+		if (r->ref->page_las != NULL)
+			__wt_verbose(session, WT_VERB_TEMPORARY,
+			    " page_las skew_newest %d unstable_txn %" PRIu64,
+			    r->ref->page_las->skew_newest,
+			    r->ref->page_las->unstable_txn);
+		else
+			__wt_verbose(session, WT_VERB_TEMPORARY,
+			    " ref %p HAS NO PAGE_LAS", r->ref);
+		(void)__wt_debug_page(session, btree, r->ref, NULL);
+		__wt_verbose(session, WT_VERB_TEMPORARY,
+		    "REC_CHECK: DEBUG DONE %s", WT_DIVIDER);
+	}
+
 	/*
 	 * Fall back to lookaside eviction during checkpoints if a page can't
 	 * be evicted.
@@ -647,10 +725,15 @@ __rec_write_page_status(WT_SESSION_IMPL *session, WT_RECONCILE *r)
 	WT_BTREE *btree;
 	WT_PAGE *page;
 	WT_PAGE_MODIFY *mod;
+	WT_TXN *txn;
+	WT_TXN_GLOBAL *tg;
+	uint32_t i;
 
 	btree = S2BT(session);
 	page = r->page;
 	mod = page->modify;
+	txn = &session->txn;
+	tg = &S2C(session)->txn_global;
 
 	/*
 	 * Set the page's status based on whether or not we cleaned the page.
@@ -714,6 +797,53 @@ __rec_write_page_status(WT_SESSION_IMPL *session, WT_RECONCILE *r)
 		else
 			WT_ASSERT(session, !F_ISSET(r, WT_REC_EVICT));
 	}
+	if (FLD_ISSET(r->rec_flags, WT_REC_CONFLICT)) {
+		FLD_CLR(r->rec_flags, WT_REC_CONFLICT);
+		__wt_verbose(session, WT_VERB_TEMPORARY,
+		    "REC_PG_STAT: CONFLICT r->orig_btree_ckpt_gen %" PRIu64
+		    " r->orig_txn_ckpt_gen %" PRIu64
+		    " btree->checkpoint_gen %" PRIu64 " wt_gen CKPT %" PRIu64,
+		    r->orig_btree_checkpoint_gen, r->orig_txn_checkpoint_gen,
+		    btree->checkpoint_gen,
+		    __wt_gen(session, WT_GEN_CHECKPOINT));
+		__wt_verbose(session, WT_VERB_TEMPORARY,
+		    "REC_PG_STAT: skew_newest %d max_txn %" PRIu64
+		    " unstable_txn %" PRIu64 " ref %p page %p mod %p",
+		    r->las_skew_newest, r->max_txn, r->unstable_txn,
+		    r->ref, page, mod);
+		__wt_verbose(session, WT_VERB_TEMPORARY,
+		    "REC_PG_STAT: leave_dirty %d", r->leave_dirty);
+		__wt_verbose(session, WT_VERB_TEMPORARY,
+		    "REC_PG_STAT: txn flags %" PRIx32 " snap_min %" PRIu64
+		   " snap_max %" PRIu64 " snapcount %" PRIu32,
+		    txn->flags, txn->snap_min, txn->snap_max, txn->snapshot_count);
+		for (i = 0; i < txn->snapshot_count; i++) {
+			__wt_verbose(session, WT_VERB_TEMPORARY,
+			    "REC_PG_STAT: snap %" PRIu32 ": %" PRIu64,
+			    i, txn->snapshot[i]);
+		}
+		__wt_verbose(session, WT_VERB_TEMPORARY,
+		    "REC_PG_STAT: %s", WT_DIVIDER);
+		__wt_verbose(session, WT_VERB_TEMPORARY,
+		    "REC_PG_STAT: TXN_GLOBAL: ckpt running %d ckpt txn id %" PRIu64,
+		    tg->checkpoint_running, tg->checkpoint_state.id);
+		__wt_verbose(session, WT_VERB_TEMPORARY,
+		    "REC_PG_STAT: TXN_GLOBAL: last_running %" PRIu64 " oldest id %" PRIu64,
+		    tg->last_running, tg->oldest_id);
+		__wt_verbose(session, WT_VERB_TEMPORARY,
+		    "REC_PG_STAT: %s", WT_DIVIDER);
+		if (r->ref->page_las != NULL)
+			__wt_verbose(session, WT_VERB_TEMPORARY,
+			    "REC_PG_STAT: page_las skew_newest %d unstable_txn %" PRIu64,
+			    r->ref->page_las->skew_newest,
+			    r->ref->page_las->unstable_txn);
+		else
+			__wt_verbose(session, WT_VERB_TEMPORARY,
+			    "REC_PG_STAT: ref %p HAS NO PAGE_LAS", r->ref);
+		(void)__wt_debug_page(session, btree, r->ref, NULL);
+		__wt_verbose(session, WT_VERB_TEMPORARY,
+		    "REC_PG_STAT: DBG DONE %s", WT_DIVIDER);
+	}
 }
 
 /*
@@ -1239,6 +1369,13 @@ __rec_upd_select(WT_SESSION_IMPL *session, WT_RECONCILE *r, WT_INSERT *ins,
 		/* Track the largest transaction ID seen. */
 		if (WT_TXNID_LT(max_txn, txnid))
 			max_txn = txnid;
+#if 0
+		__wt_verbose(session, WT_VERB_TEMPORARY,
+		    "REC_UPD_SELECT: txnid %" PRIu64 " max txnid %"
+		    PRIu64, txnid, max_txn);
+		WT_ASSERT(session,
+		    WT_TXNID_LE(page->modify->first_dirty_txn, txnid));
+#endif
 
 		/*
 		 * Check whether the update was committed before reconciliation
@@ -1479,7 +1616,7 @@ __rec_upd_select(WT_SESSION_IMPL *session, WT_RECONCILE *r, WT_INSERT *ins,
 		if (first_ts_upd != NULL &&
 		    r->unstable_timestamp < first_ts_upd->start_ts)
 			r->unstable_timestamp = first_ts_upd->start_ts;
-	} else if (F_ISSET(r, WT_REC_LOOKASIDE)) {
+	} else if (F_ISSET(r, WT_REC_LOOKASIDE))
 		for (upd = first_upd; upd != upd_select->upd; upd = upd->next) {
 			if (upd->txnid == WT_TXN_ABORTED)
 				continue;
@@ -1490,7 +1627,6 @@ __rec_upd_select(WT_SESSION_IMPL *session, WT_RECONCILE *r, WT_INSERT *ins,
 			if (upd->start_ts < r->unstable_timestamp)
 				r->unstable_timestamp = upd->start_ts;
 		}
-	}
 
 check_original_value:
 	/*
@@ -2931,10 +3067,17 @@ __rec_split_write_supd(WT_SESSION_IMPL *session,
 			if (cmp >= 0)
 				break;
 		}
-	} else
+	} else {
 		for (i = 0, supd = r->supd; i < r->supd_next; ++i, ++supd)
 			if (WT_INSERT_RECNO(supd->ins) >= next->recno)
 				break;
+		if (FLD_ISSET(r->rec_flags, WT_REC_CONFLICT))
+			__wt_verbose(session, WT_VERB_TEMPORARY,
+			    "SPLIT_WRITE_SUPD: ending ref %p i %d insert recno %" PRIu64
+			    " next recno %" PRIu64,
+			    r->ref, i, WT_INSERT_RECNO(supd->ins),
+			    next->recno);
+	}
 	if (i != 0) {
 		WT_ERR(__rec_supd_move(session, multi, r->supd, i));
 
@@ -4312,6 +4455,12 @@ record_loop:	/*
 			deleted = false;
 
 			if (upd != NULL) {
+				if (FLD_ISSET(r->rec_flags, WT_REC_CONFLICT))
+					__wt_verbose(session, WT_VERB_TEMPORARY,
+					    "REC_COL_VAR: upd type %d "
+					    "txn id %" PRIu64 " src recno %"
+					    PRIu64, (int)upd->type, upd->txnid,
+					    src_recno);
 				switch (upd->type) {
 				case WT_UPDATE_MODIFY:
 					cbt->slot = WT_COL_SLOT(page, cip);
@@ -5679,6 +5828,8 @@ __rec_write_wrapup(WT_SESSION_IMPL *session, WT_RECONCILE *r, WT_PAGE *page)
 	 */
 	WT_RET(__wt_ovfl_track_wrapup(session, page));
 
+	__wt_verbose(session, WT_VERB_TEMPORARY,
+	    "%p reconciled into %" PRIu32 " pages", (void *)ref, r->multi_next);
 	__wt_verbose(session, WT_VERB_RECONCILE,
 	    "%p reconciled into %" PRIu32 " pages", (void *)ref, r->multi_next);
 
diff --git a/src/txn/txn_ckpt.c b/src/txn/txn_ckpt.c
index 1291afc..ff6a116 100644
--- a/src/txn/txn_ckpt.c
+++ b/src/txn/txn_ckpt.c
@@ -563,6 +563,7 @@ __checkpoint_prepare(
 	const char *txn_cfg[] = { WT_CONFIG_BASE(session,
 	    WT_SESSION_begin_transaction), "isolation=snapshot", NULL };
 	bool use_timestamp;
+	uint64_t i;
 
 	conn = S2C(session);
 	txn = &session->txn;
@@ -585,6 +586,23 @@ __checkpoint_prepare(
 
 	/* Ensure a transaction ID is allocated prior to sharing it globally */
 	WT_RET(__wt_txn_id_check(session));
+	__wt_verbose(session, WT_VERB_TEMPORARY,
+	    "CKPT_PREP: txn flags %" PRIx32 " snap_min %" PRIu64
+	    " snap_max %" PRIu64 " snapcount %" PRIu32,
+	    txn->flags, txn->snap_min, txn->snap_max, txn->snapshot_count);
+	__wt_verbose(session, WT_VERB_TEMPORARY,
+	    "CKPT_PREP: id %" PRIu64 " snapcount %" PRIu32,
+	    txn->id, txn->snapshot_count);
+	for (i = 0; i < txn->snapshot_count; i++) {
+		__wt_verbose(session, WT_VERB_TEMPORARY,
+		    "CKPT_PREP: snap %" PRIu32 ": %" PRIu64,
+		    i, txn->snapshot[i]);
+	}
+	__wt_verbose(session, WT_VERB_TEMPORARY,
+	    "CKPT_PREP: TXN_GLOBAL: last_running %" PRIu64
+	    " oldest id %" PRIu64 " current %" PRIu64,
+	    txn_global->last_running, txn_global->oldest_id,
+	    txn_global->current);
 
 	/* Keep track of handles acquired for locking. */
 	WT_RET(__wt_meta_track_on(session));
@@ -1102,10 +1120,14 @@ __txn_checkpoint_wrapper(WT_SESSION_IMPL *session, const char *cfg[])
 
 	WT_STAT_CONN_SET(session, txn_checkpoint_running, 1);
 	txn_global->checkpoint_running = true;
+	__wt_verbose(session, WT_VERB_TEMPORARY, "%s",
+	    "==== CHECKPOINT RUNNING ====");
 
 	ret = __txn_checkpoint(session, cfg);
 
 	WT_STAT_CONN_SET(session, txn_checkpoint_running, 0);
+	__wt_verbose(session, WT_VERB_TEMPORARY, "%s",
+	    "==== CHECKPOINT DONE ====");
 	txn_global->checkpoint_running = false;
 
 	return (ret);
diff --git a/test/checkpoint/checkpointer.c b/test/checkpoint/checkpointer.c
index d08c7f6..93fc0df 100644
--- a/test/checkpoint/checkpointer.c
+++ b/test/checkpoint/checkpointer.c
@@ -135,11 +135,11 @@ verify_checkpoint(WT_SESSION *session)
 {
 	WT_CURSOR **cursors;
 	uint64_t key_count;
-	int i, ret, t_ret;
+	int err, err_ret, i, ret, t_ret;
 	char ckpt[128], next_uri[128];
 	const char *type0, *typei;
 
-	ret = t_ret = 0;
+	err = err_ret = ret = t_ret = 0;
 	key_count = 0;
 	testutil_check(__wt_snprintf(
 	    ckpt, sizeof(ckpt), "checkpoint=%s", g.checkpoint_name));
@@ -213,12 +213,19 @@ verify_checkpoint(WT_SESSION *session)
 				(void)log_print_err(
 				    "verify_checkpoint - mismatching data",
 				    EFAULT, 1);
+				err++;
+				if (err_ret == 0)
+					err_ret = ret;
+				/* See how many mismatches there really are. */
+				ret = 0;
+#if 0
 				goto err;
+#endif
 			}
 		}
 	}
-	printf("Finished verifying a checkpoint with %d tables and %" PRIu64
-	    " keys\n", g.ntables, key_count);
+	printf("Finished verifying a checkpoint (%d errors) with %d tables and %" PRIu64
+	    " keys\n", err, g.ntables, key_count);
 
 err:	for (i = 0; i < g.ntables; i++) {
 		if (cursors[i] != NULL &&
@@ -227,7 +234,7 @@ err:	for (i = 0; i < g.ntables; i++) {
 			    "verify_checkpoint:cursor close", ret, 1);
 	}
 	free(cursors);
-	return (ret);
+	return (err_ret);
 }
 
 /*
@@ -268,10 +275,60 @@ compare_cursors(
 	printf("Key/value mismatch: %" PRIu64 "/%s from a %s table is not %"
 	    PRIu64 "/%s from a %s table\n",
 	    key1, val1, type1, key2, val2, type2);
+	if (key1 < key2)
+		cursor1->next(cursor1);
+	else
+		cursor2->next(cursor2);
 
 	return (ret);
 }
 
+static void
+backup_dump(int index1, int index2)
+{
+	int status;
+	char cmd[128], dir[64], ofile[32], uri[32];
+
+	/*
+	 * Take a copy of the checkpoint to another directory, and take
+	 * a dump of the checkpoint as well. Two different ways to see
+	 * what is in the table.
+	 *
+	 * First copy the files.
+	 */
+	testutil_check(__wt_snprintf(dir, sizeof(dir),
+	    "%s.BACKUP", g.home));
+
+	testutil_check(__wt_snprintf(cmd, sizeof(cmd),
+	    "rm -rf %s; mkdir %s; cp -rp %s/* %s",
+	    dir, dir, g.home, dir));
+	if ((status = system(cmd)) < 0)
+		testutil_die(status, "system2: %s", cmd);
+	/*
+	 * Second dump via a dump cursor, using the backup dir
+	 * because we cannot open another connection on the original.
+	 */
+	testutil_check(__wt_snprintf(uri, sizeof(uri),
+	    "file:__wt%04d.wt", index1));
+	testutil_check(__wt_snprintf(ofile, sizeof(ofile),
+	    "%s/dump.wt%04d", dir, index1));
+	testutil_check(__wt_snprintf(cmd, sizeof(cmd),
+	    "./wt -h %s dump -c \"WiredTigerCheckpoint\" -j -f %s %s",
+	    dir, ofile, uri));
+	if ((status = system(cmd)) < 0)
+		testutil_die(status, "system0: %s", cmd);
+	testutil_check(__wt_snprintf(uri, sizeof(uri),
+	    "file:__wt%04d.wt", index2));
+	testutil_check(__wt_snprintf(ofile, sizeof(ofile),
+	    "%s/dump.wt%04d", dir, index2));
+	testutil_check(__wt_snprintf(cmd, sizeof(cmd),
+	    "./wt -h %s dump -c \"WiredTigerCheckpoint\" -j -f %s %s",
+	    dir, ofile, uri));
+	if ((status = system(cmd)) < 0)
+		testutil_die(status, "system1: %s", cmd);
+	return;
+}
+
 /*
  * diagnose_key_error --
  *     Dig a bit deeper on failure. Continue after some failures here to
@@ -292,6 +349,8 @@ diagnose_key_error(
 	session = cursor1->session;
 	key1_orig = key2_orig = 0;
 
+	backup_dump(index1, index2);
+
 	testutil_check(__wt_snprintf(
 	    ckpt, sizeof(ckpt), "checkpoint=%s", g.checkpoint_name));
 
@@ -340,11 +399,17 @@ diagnose_key_error(
 	if (session->open_cursor(session, next_uri, NULL, ckpt, &c) != 0)
 		return (1);
 	c->set_key(c, key1_orig);
-	if ((ret = c->search(c)) != 0)
-		(void)log_print_err("1st cursor didn't find 1st key", ret, 0);
+	if ((ret = c->search(c)) != 0) {
+		(void)log_print_err("CKPT: 1st cursor open on ", ret, 0);
+		(void)log_print_err(next_uri, ret, 0);
+		(void)log_print_err("CKPT: 1st cursor didn't find 1st key", ret, 0);
+	}
 	c->set_key(c, key2_orig);
-	if ((ret = c->search(c)) != 0)
-		(void)log_print_err("1st cursor didn't find 2nd key", ret, 0);
+	if ((ret = c->search(c)) != 0) {
+		(void)log_print_err("CKPT: 1st cursor open on ", ret, 0);
+		(void)log_print_err(next_uri, ret, 0);
+		(void)log_print_err("CKPT: 1st cursor didn't find 2nd key", ret, 0);
+	}
 	if (c->close(c) != 0)
 		return (1);
 
@@ -353,11 +418,17 @@ diagnose_key_error(
 	if (session->open_cursor(session, next_uri, NULL, ckpt, &c) != 0)
 		return (1);
 	c->set_key(c, key1_orig);
-	if ((ret = c->search(c)) != 0)
-		(void)log_print_err("2nd cursor didn't find 1st key", ret, 0);
+	if ((ret = c->search(c)) != 0) {
+		(void)log_print_err("CKPT: 2nd cursor open on ", ret, 0);
+		(void)log_print_err(next_uri, ret, 0);
+		(void)log_print_err("CKPT: 2nd cursor didn't find 1st key", ret, 0);
+	}
 	c->set_key(c, key2_orig);
-	if ((ret = c->search(c)) != 0)
-		(void)log_print_err("2nd cursor didn't find 2nd key", ret, 0);
+	if ((ret = c->search(c)) != 0) {
+		(void)log_print_err("CKPT: 2nd cursor open on ", ret, 0);
+		(void)log_print_err(next_uri, ret, 0);
+		(void)log_print_err("CKPT: 2nd cursor didn't find 2nd key", ret, 0);
+	}
 	if (c->close(c) != 0)
 		return (1);
 
@@ -372,7 +443,7 @@ live_check:
 		return (1);
 	c->set_key(c, key1_orig);
 	if ((ret = c->search(c)) != 0)
-		(void)log_print_err("1st cursor didn't find 1st key", ret, 0);
+		(void)log_print_err("LIVE: 1st cursor didn't find 1st key", ret, 0);
 	if (c->close(c) != 0)
 		return (1);
 
@@ -382,7 +453,7 @@ live_check:
 		return (1);
 	c->set_key(c, key2_orig);
 	if ((ret = c->search(c)) != 0)
-		(void)log_print_err("2nd cursor didn't find 2nd key", ret, 0);
+		(void)log_print_err("LIVE: 2nd cursor didn't find 2nd key", ret, 0);
 	if (c->close(c) != 0)
 		return (1);
 
diff --git a/test/checkpoint/test_checkpoint.c b/test/checkpoint/test_checkpoint.c
index f73ada6..27fe485 100644
--- a/test/checkpoint/test_checkpoint.c
+++ b/test/checkpoint/test_checkpoint.c
@@ -189,12 +189,12 @@ wt_connect(const char *config_open)
 		NULL	/* Close handler. */
 	};
 	int ret;
-	char config[128];
+	char config[256];
 
 	testutil_make_work_dir(g.home);
 
 	testutil_check(__wt_snprintf(config, sizeof(config),
-	    "create,statistics=(fast),error_prefix=\"%s\",cache_size=1GB%s%s",
+	    "create,statistics=(fast),statistics_log=(wait=1,json=false),verbose=(temporary,lookaside),error_prefix=\"%s\",cache_size=1GB%s%s",
 	    progname,
 	    config_open == NULL ? "" : ",",
 	    config_open == NULL ? "" : config_open));
