diff --git a/dist/s_string.ok b/dist/s_string.ok
index 068abb5..aee8790 100644
--- a/dist/s_string.ok
+++ b/dist/s_string.ok
@@ -210,6 +210,7 @@ Kanowski's
 Kounavis
 LANGID
 LAS
+LASdump
 LF
 LLLLLL
 LLLLLLL
diff --git a/src/btree/bt_debug.c b/src/btree/bt_debug.c
index 7ed8511..70daf2c 100644
--- a/src/btree/bt_debug.c
+++ b/src/btree/bt_debug.c
@@ -684,6 +684,28 @@ __wt_debug_page(void *session_arg, WT_BTREE *btree, WT_REF *ref, const char *ofi
 }
 
 /*
+ * __wt_debug_cursor_las --
+ *     Dump the LAS tree given a user cursor.
+ */
+int
+__wt_debug_cursor_las(void *cursor_arg, const char *ofile)
+  WT_GCC_FUNC_ATTRIBUTE((visibility("default")))
+{
+    WT_CONNECTION_IMPL *conn;
+    WT_CURSOR *cursor;
+    WT_CURSOR_BTREE *cbt;
+    WT_SESSION_IMPL *las_session;
+
+    cursor = cursor_arg;
+    conn = S2C((WT_SESSION_IMPL *)cursor->session);
+    las_session = conn->cache->las_session[0];
+    if (las_session == NULL)
+        return (0);
+    cbt = (WT_CURSOR_BTREE *)las_session->las_cursor;
+    return (__wt_debug_tree_all(las_session, cbt->btree, NULL, ofile));
+}
+
+/*
  * __wt_debug_cursor_page --
  *     Dump the in-memory information for a cursor-referenced page.
  */
@@ -1171,7 +1193,8 @@ __debug_update(WT_DBG *ds, WT_UPDATE *upd, bool hexbyte)
         if (upd->txnid == WT_TXN_ABORTED)
             WT_RET(ds->f(ds,
               "\t"
-              "txn id aborted"));
+              "txn id aborted (was %" PRIu64 ")",
+              upd->orig_txnid));
         else
             WT_RET(ds->f(ds,
               "\t"
diff --git a/src/btree/bt_delete.c b/src/btree/bt_delete.c
index 9749cef..406bb6b 100644
--- a/src/btree/bt_delete.c
+++ b/src/btree/bt_delete.c
@@ -231,8 +231,10 @@ __wt_delete_page_rollback(WT_SESSION_IMPL *session, WT_REF *ref)
      */
     WT_ASSERT(session, locked);
     if ((updp = ref->page_del->update_list) != NULL)
-        for (; *updp != NULL; ++updp)
+        for (; *updp != NULL; ++updp) {
+            (*updp)->orig_txnid = (*updp)->txnid;
             (*updp)->txnid = WT_TXN_ABORTED;
+        }
 
     WT_REF_SET_STATE(ref, current_state);
 
diff --git a/src/cache/cache_las.c b/src/cache/cache_las.c
index e1edcb5..0e8dbea 100644
--- a/src/cache/cache_las.c
+++ b/src/cache/cache_las.c
@@ -747,11 +747,17 @@ __wt_las_insert_block(
               (upd->type == WT_UPDATE_STANDARD || upd->type == WT_UPDATE_MODIFY)) {
                 las_value.size = 0;
                 WT_ASSERT(session, upd != first_upd || multi->page_las.skew_newest);
+                __wt_errx(session, "LAS_INS: birthmark txn id %" PRIu64 " start_ts %" PRIu64 " size %d",
+                  upd->txnid, upd->start_ts, (int)upd->size);
                 cursor->set_value(cursor, upd->txnid, upd->start_ts, upd->durable_ts,
                   upd->prepare_state, WT_UPDATE_BIRTHMARK, &las_value);
-            } else
+            } else {
+                if (upd->size == 0 && upd->txnid != WT_TXN_NONE)
+                  __wt_errx(session, "LAS_INS: ZERO txn id %" PRIu64 " start_ts %" PRIu64 " type %d",
+                    upd->txnid, upd->start_ts, (int)upd->type);
                 cursor->set_value(cursor, upd->txnid, upd->start_ts, upd->durable_ts,
                   upd->prepare_state, upd->type, &las_value);
+            }
 
             /*
              * Using update looks a little strange because the keys are guaranteed to not exist, but
diff --git a/src/include/btmem.h b/src/include/btmem.h
index 68d6f53..9893de5 100644
--- a/src/include/btmem.h
+++ b/src/include/btmem.h
@@ -1069,7 +1069,8 @@ struct __wt_ikey {
  *	formed into a forward-linked list.
  */
 struct __wt_update {
-    volatile uint64_t txnid; /* transaction ID */
+    volatile uint64_t txnid;      /* transaction ID */
+    volatile uint64_t orig_txnid; /* transaction ID */
 
     wt_timestamp_t durable_ts; /* timestamps */
     wt_timestamp_t start_ts;
@@ -1107,7 +1108,11 @@ struct __wt_update {
  * WT_UPDATE_SIZE is the expected structure size excluding the payload data -- we verify the build
  * to ensure the compiler hasn't inserted padding.
  */
+#if 0
 #define WT_UPDATE_SIZE 38
+#else
+#define WT_UPDATE_SIZE 46
+#endif
 
 /*
  * The memory size of an update: include some padding because this is such a common case that
diff --git a/src/include/extern.h b/src/include/extern.h
index f069e68..9eba24e 100644
--- a/src/include/extern.h
+++ b/src/include/extern.h
@@ -574,6 +574,8 @@ extern int __wt_debug_addr(WT_SESSION_IMPL *session, const uint8_t *addr, size_t
   const char *ofile) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
 extern int __wt_debug_addr_print(WT_SESSION_IMPL *session, const uint8_t *addr, size_t addr_size)
   WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
+extern int __wt_debug_cursor_las(void *cursor_arg, const char *ofile) WT_GCC_FUNC_DECL_ATTRIBUTE(
+  (visibility("default"))) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
 extern int __wt_debug_cursor_page(void *cursor_arg, const char *ofile) WT_GCC_FUNC_DECL_ATTRIBUTE(
   (visibility("default"))) WT_GCC_FUNC_DECL_ATTRIBUTE((warn_unused_result));
 extern int __wt_debug_disk(WT_SESSION_IMPL *session, const WT_PAGE_HEADER *dsk, const char *ofile)
diff --git a/src/include/txn.i b/src/include/txn.i
index 3e5d2bf..87fc4ed 100644
--- a/src/include/txn.i
+++ b/src/include/txn.i
@@ -213,6 +213,7 @@ __wt_txn_resolve_prepared_op(
         ++(*resolved_update_countp);
 
         if (!commit) {
+            upd->orig_txnid = upd->txnid;
             upd->txnid = WT_TXN_ABORTED;
             continue;
         }
diff --git a/src/reconcile/rec_row.c b/src/reconcile/rec_row.c
index 733f450..db660ac 100644
--- a/src/reconcile/rec_row.c
+++ b/src/reconcile/rec_row.c
@@ -518,6 +518,11 @@ static bool
 __rec_row_zero_len(WT_SESSION_IMPL *session, wt_timestamp_t start_ts, uint64_t start_txn,
   wt_timestamp_t stop_ts, uint64_t stop_txn)
 {
+    bool vis;
+
+    vis = __wt_txn_visible_all(session, start_txn, start_ts);
+    __wt_errx(session, "ZERO: start_txn %" PRIu64 " start_ts %" PRIu64 " vis %d pg_vers_ts %d",
+      start_txn, (uint64_t)start_ts, vis, __wt_process.page_version_ts);
     /* Before timestamps were stored on pages, it was always possible. */
     if (!__wt_process.page_version_ts)
         return (true);
@@ -525,9 +530,24 @@ __rec_row_zero_len(WT_SESSION_IMPL *session, wt_timestamp_t start_ts, uint64_t s
     /*
      * The item must be globally visible because we're not writing anything on the page.
      */
+#if 1
+    return ((stop_ts == WT_TS_MAX && stop_txn == WT_TXN_MAX) &&
+      ((start_ts == WT_TS_NONE && start_txn == WT_TXN_NONE) || vis));
+#else
     return ((stop_ts == WT_TS_MAX && stop_txn == WT_TXN_MAX) &&
       ((start_ts == WT_TS_NONE && start_txn == WT_TXN_NONE) ||
               __wt_txn_visible_all(session, start_txn, start_ts)));
+    if (stop_ts == WT_TS_MAX && stop_txn == WT_TXN_MAX) {
+        if (!(start_ts == WT_TS_NONE && start_txn == WT_TXN_NONE)) {
+            vis = __wt_txn_visible_all(session, start_txn, start_ts);
+            __wt_errx(session, "ZERO: start_txn %" PRIu64 " start_ts %" PRIu64 " vis %d", start_txn,
+              (uint64_t)start_ts, vis);
+            return (vis);
+        } else
+            return (true);
+    } else
+        return (false);
+#endif
 }
 
 /*
diff --git a/src/reconcile/rec_visibility.c b/src/reconcile/rec_visibility.c
index 9f3150d..c7a9391 100644
--- a/src/reconcile/rec_visibility.c
+++ b/src/reconcile/rec_visibility.c
@@ -94,6 +94,7 @@ __rec_append_orig_value(
 
     if (upd->type == WT_UPDATE_BIRTHMARK) {
         upd->type = WT_UPDATE_STANDARD;
+        upd->orig_txnid = upd->txnid;
         upd->txnid = WT_TXN_ABORTED;
     }
 
diff --git a/src/txn/txn.c b/src/txn/txn.c
index 0374732..504c667 100644
--- a/src/txn/txn.c
+++ b/src/txn/txn.c
@@ -921,6 +921,7 @@ __wt_txn_commit(WT_SESSION_IMPL *session, const char *cfg[])
                  * Switch reserved operations to abort to simplify obsolete update list truncation.
                  */
                 if (upd->type == WT_UPDATE_RESERVE) {
+                    upd->orig_txnid = upd->txnid;
                     upd->txnid = WT_TXN_ABORTED;
                     break;
                 }
@@ -1110,6 +1111,7 @@ __wt_txn_prepare(WT_SESSION_IMPL *session, const char *cfg[])
              * again: it can be evicted.
              */
             if (upd->type == WT_UPDATE_RESERVE) {
+                upd->orig_txnid = upd->txnid;
                 upd->txnid = WT_TXN_ABORTED;
                 __wt_txn_op_free(session, op);
                 break;
@@ -1239,6 +1241,7 @@ __wt_txn_rollback(WT_SESSION_IMPL *session, const char *cfg[])
                 WT_ASSERT(session, resolved_update_count >= visited_update_count);
             } else {
                 WT_ASSERT(session, upd->txnid == txn->id || upd->txnid == WT_TXN_ABORTED);
+                upd->orig_txnid = upd->txnid;
                 upd->txnid = WT_TXN_ABORTED;
             }
             break;
diff --git a/src/txn/txn_rollback_to_stable.c b/src/txn/txn_rollback_to_stable.c
index 97c83c4..f16eec4 100644
--- a/src/txn/txn_rollback_to_stable.c
+++ b/src/txn/txn_rollback_to_stable.c
@@ -117,6 +117,7 @@ __txn_abort_newer_update(
                 upd == first_upd);
             first_upd = upd->next;
 
+            upd->orig_txnid = upd->txnid;
             upd->txnid = WT_TXN_ABORTED;
             WT_STAT_CONN_INCR(session, txn_rollback_upd_aborted);
             upd->durable_ts = upd->start_ts = WT_TS_NONE;
diff --git a/test/format/format.h b/test/format/format.h
index e90bbf8..c1c0815 100644
--- a/test/format/format.h
+++ b/test/format/format.h
@@ -63,6 +63,7 @@ typedef struct {
     char *home_backup_init;  /* Initialize backup command */
     char *home_config;       /* Run CONFIG file path */
     char *home_init;         /* Initialize home command */
+    char *home_lasdump;      /* LAS dump filename */
     char *home_log;          /* Operation log file path */
     char *home_pagedump;     /* Page dump filename */
     char *home_rand;         /* RNG log file path */
diff --git a/test/format/ops.c b/test/format/ops.c
index a03b42e..aaf0b2a 100644
--- a/test/format/ops.c
+++ b/test/format/ops.c
@@ -977,6 +977,7 @@ ops(void *arg)
             snap_repeat_update(tinfo, true);
             break;
         case 5: /* 10% */
+        case 6: /* 20% */
 rollback:
             rollback_transaction(tinfo);
             snap_repeat_update(tinfo, false);
diff --git a/test/format/snap.c b/test/format/snap.c
index e68309c..cccf575 100644
--- a/test/format/snap.c
+++ b/test/format/snap.c
@@ -195,6 +195,10 @@ snap_verify(WT_CURSOR *cursor, TINFO *tinfo, SNAP_OPS *snap)
 #ifdef HAVE_DIAGNOSTIC
     fprintf(stderr, "snapshot-isolation error: Dumping page to %s\n", g.home_pagedump);
     testutil_check(__wt_debug_cursor_page(cursor, g.home_pagedump));
+    fprintf(stderr, "snapshot-isolation error: Dumping LAS to %s\n", g.home_lasdump);
+    testutil_check(__wt_debug_cursor_las(cursor, g.home_lasdump));
+    if (g.logging)
+        testutil_check(cursor->session->log_flush(cursor->session, "sync=off"));
 #endif
     switch (g.type) {
     case FIX:
diff --git a/test/format/util.c b/test/format/util.c
index 88c5afd..b1bb81d 100644
--- a/test/format/util.c
+++ b/test/format/util.c
@@ -247,7 +247,7 @@ val_gen(WT_RAND_STATE *rnd, WT_ITEM *value, uint64_t keyno)
      * WiredTiger doesn't store zero-length data items in row-store files, test that by inserting a
      * zero-length data item every so often.
      */
-    if (keyno % 63 == 0) {
+    if (keyno % 5 == 0) {
         p[0] = '\0';
         value->size = 0;
         return;
@@ -330,6 +330,11 @@ path_setup(const char *home)
     g.home_log = dmalloc(len);
     testutil_check(__wt_snprintf(g.home_log, len, "%s/%s", g.home, "log"));
 
+    /* LAS dump file. */
+    len = strlen(g.home) + strlen("LASdump") + 2;
+    g.home_lasdump = dmalloc(len);
+    testutil_check(__wt_snprintf(g.home_lasdump, len, "%s/%s", g.home, "LASdump"));
+
     /* Page dump file. */
     len = strlen(g.home) + strlen("pagedump") + 2;
     g.home_pagedump = dmalloc(len);
