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..1ace1ee 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,11 @@ __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));
+		__wt_verbose(session, WT_VERB_TEMPORARY,
+		    "LAS_INSTANTIATE: table %s txnid %" PRIu64
+		 " upd %d sz %d value %s",
+		    S2BT(session)->dhandle->name, las_txnid,
+		    (int)upd_type, (int)las_value.size, (char *)las_value.data);
 		WT_ERR(__wt_update_alloc(
 		    session, &las_value, &upd, &incr, upd_type));
 		total_incr += incr;
@@ -197,6 +216,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/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..91c155d 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;
@@ -485,10 +488,20 @@ __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: r %p (%s) error ret %d in %s",
+			    r, r->ref == NULL ? "NO 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 +591,16 @@ 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 +611,54 @@ __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",
+		    r->las_skew_newest, r->max_txn, r->unstable_txn, r->ref);
+		__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);
+	}
+
 	/*
 	 * Fall back to lookaside eviction during checkpoints if a page can't
 	 * be evicted.
@@ -647,10 +718,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 +790,50 @@ __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",
+		    r->las_skew_newest, r->max_txn, r->unstable_txn, r->ref);
+		__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);
+	}
 }
 
 /*
diff --git a/src/txn/txn_ckpt.c b/src/txn/txn_ckpt.c
index 1291afc..a1e0774 100644
--- a/src/txn/txn_ckpt.c
+++ b/src/txn/txn_ckpt.c
@@ -580,6 +580,11 @@ __checkpoint_prepare(
 	 * calls to checkpoint.
 	 */
 	WT_RET(__wt_txn_begin(session, txn_cfg));
+	__wt_verbose(session, WT_VERB_TEMPORARY,
+	    "CKPT: Snapshot txn id %" PRIu64, session->txn.id);
+	__wt_verbose_dump_txn_one(session, &session->txn);
+	__wt_verbose(session, WT_VERB_TEMPORARY,
+	    "CKPT: %s", WT_DIVIDER);
 
 	WT_DIAGNOSTIC_YIELD;
 
diff --git a/test/checkpoint/checkpointer.c b/test/checkpoint/checkpointer.c
index d08c7f6..ccfe140 100644
--- a/test/checkpoint/checkpointer.c
+++ b/test/checkpoint/checkpointer.c
@@ -272,6 +272,52 @@ compare_cursors(
 	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 +338,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 +388,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 +407,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 +432,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 +442,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..f1f57cf 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),error_prefix=\"%s\",cache_size=1GB%s%s",
 	    progname,
 	    config_open == NULL ? "" : ",",
 	    config_open == NULL ? "" : config_open));
