diff --git a/src/mongo/db/storage/wiredtiger/wiredtiger_index.cpp b/src/mongo/db/storage/wiredtiger/wiredtiger_index.cpp
index 28cbcf27163..2373325a90e 100644
--- a/src/mongo/db/storage/wiredtiger/wiredtiger_index.cpp
+++ b/src/mongo/db/storage/wiredtiger/wiredtiger_index.cpp
@@ -597,6 +597,7 @@ StatusWith<bool> WiredTigerIndex::_checkDups(OperationContext* opCtx,
     WiredTigerItem prefixKeyItem(keyString.getBuffer(), sizeWithoutRecordId);
 
     // First phase inserts the prefix key to prohibit concurrent insertions of same key
+    //c->set_raw_key_value(c, keyItem.Get(), valueItem.Get());
     setKey(c, prefixKeyItem.Get());
     c->set_value(c, emptyItem.Get());
     ret = WT_OP_CHECK(wiredTigerCursorInsert(*WiredTigerRecoveryUnit::get(opCtx), c));
@@ -1651,8 +1652,9 @@ Status WiredTigerIdIndex::_insert(OperationContext* opCtx,
         value.appendTypeBits(typeBits);
 
     WiredTigerItem valueItem(value.getBuffer(), value.getSize());
-    setKey(c, keyItem.Get());
-    c->set_value(c, valueItem.Get());
+    c->set_raw_key_value(c, keyItem.Get(), valueItem.Get());
+    //setKey(c, keyItem.Get());
+    //c->set_value(c, valueItem.Get());
     int ret = WT_OP_CHECK(wiredTigerCursorInsert(*WiredTigerRecoveryUnit::get(opCtx), c));
 
     auto& metricsCollector = ResourceConsumption::MetricsCollector::get(opCtx);
@@ -1714,8 +1716,9 @@ Status WiredTigerIndexUnique::_insertOldFormatKey(OperationContext* opCtx,
     }
 
     WiredTigerItem valueItem(value.getBuffer(), value.getSize());
-    setKey(c, keyItem.Get());
-    c->set_value(c, valueItem.Get());
+    c->set_raw_key_value(c, keyItem.Get(), valueItem.Get());
+    //setKey(c, keyItem.Get());
+    //c->set_value(c, valueItem.Get());
     int ret = WT_OP_CHECK(wiredTigerCursorInsert(*WiredTigerRecoveryUnit::get(opCtx), c));
 
     auto& metricsCollector = ResourceConsumption::MetricsCollector::get(opCtx);
@@ -1772,8 +1775,10 @@ Status WiredTigerIndexUnique::_insert(OperationContext* opCtx,
     WiredTigerItem valueItem = typeBits.isAllZeros()
         ? emptyItem
         : WiredTigerItem(typeBits.getBuffer(), typeBits.getSize());
-    setKey(c, keyItem.Get());
-    c->set_value(c, valueItem.Get());
+
+    c->set_raw_key_value(c, keyItem.Get(), valueItem.Get());
+    //setKey(c, keyItem.Get());
+    //c->set_value(c, valueItem.Get());
     ret = WT_OP_CHECK(wiredTigerCursorInsert(*WiredTigerRecoveryUnit::get(opCtx), c));
 
     // Account for the actual key insertion, but do not attempt account for the complexity of any
@@ -2025,8 +2030,9 @@ Status WiredTigerIndexStandard::_insert(OperationContext* opCtx,
         ? emptyItem
         : WiredTigerItem(typeBits.getBuffer(), typeBits.getSize());
 
-    setKey(c, keyItem.Get());
-    c->set_value(c, valueItem.Get());
+    c->set_raw_key_value(c, keyItem.Get(), valueItem.Get());
+    //setKey(c, keyItem.Get());
+    //c->set_value(c, valueItem.Get());
     ret = WT_OP_CHECK(wiredTigerCursorInsert(*WiredTigerRecoveryUnit::get(opCtx), c));
 
     auto& metricsCollector = ResourceConsumption::MetricsCollector::get(opCtx);
diff --git a/src/third_party/wiredtiger/examples/c/ex_all.c b/src/third_party/wiredtiger/examples/c/ex_all.c
index 37cebacc8bc..d359b65f2fe 100644
--- a/src/third_party/wiredtiger/examples/c/ex_all.c
+++ b/src/third_party/wiredtiger/examples/c/ex_all.c
@@ -177,6 +177,18 @@ cursor_ops(WT_SESSION *session)
         /*! [Set the cursor's string value] */
     }
 
+    {
+        /*! [Set the cursor's raw key and value] */
+        /* Set the cursor's raw key and value. */
+        WT_ITEM key, value; /* Set the cursor's raw key and value. */
+        key.data = "New key";
+        key.size = strlen("New key");
+        value.data = "New value";
+        value.size = strlen("New value");
+        cursor->set_raw_key_value(cursor, &key, &value);
+        /*! [Set the cursor's raw key and value] */
+    }
+
     {
         /*! [Get the cursor's string value] */
         const char *value; /* Get the cursor's string value. */
diff --git a/src/third_party/wiredtiger/lang/python/wiredtiger.i b/src/third_party/wiredtiger/lang/python/wiredtiger.i
index 1a4f8a269f1..e13f519e31d 100644
--- a/src/third_party/wiredtiger/lang/python/wiredtiger.i
+++ b/src/third_party/wiredtiger/lang/python/wiredtiger.i
@@ -629,6 +629,9 @@ COMPARE_NOTFOUND_OK(__wt_cursor::_search_near)
 /* Replace get_raw_key_value method with a Python equivalent */
 %ignore __wt_cursor::get_raw_key_value;
 
+/* Replace set_raw_key_value method with a Python equivalent */
+%ignore __wt_cursor::set_raw_key_value;
+
 /* Next, override methods that return integers via arguments. */
 %ignore __wt_cursor::compare(WT_CURSOR *, WT_CURSOR *, int *);
 %ignore __wt_cursor::equals(WT_CURSOR *, WT_CURSOR *, int *);
diff --git a/src/third_party/wiredtiger/src/cursor/cur_backup.c b/src/third_party/wiredtiger/src/cursor/cur_backup.c
index ce856a3762d..6e06b5cf065 100644
--- a/src/third_party/wiredtiger/src/cursor/cur_backup.c
+++ b/src/third_party/wiredtiger/src/cursor/cur_backup.c
@@ -315,6 +315,7 @@ __wt_curbackup_open(WT_SESSION_IMPL *session, const char *uri, WT_CURSOR *other,
       __wt_cursor_get_raw_key_value_notsup,           /* get-raw-key-value */
       __wt_cursor_set_key_notsup,                     /* set-key */
       __wt_cursor_set_value_notsup,                   /* set-value */
+      __wt_cursor_set_raw_key_value_notsup,           /* set-raw-key-value */
       __wt_cursor_compare_notsup,                     /* compare */
       __wt_cursor_equals_notsup,                      /* equals */
       __curbackup_next,                               /* next */
diff --git a/src/third_party/wiredtiger/src/cursor/cur_config.c b/src/third_party/wiredtiger/src/cursor/cur_config.c
index bd44991ad1b..2294abad544 100644
--- a/src/third_party/wiredtiger/src/cursor/cur_config.c
+++ b/src/third_party/wiredtiger/src/cursor/cur_config.c
@@ -39,6 +39,7 @@ __wt_curconfig_open(
       __wt_cursor_get_raw_key_value,                  /* get-raw-key-value */
       __wt_cursor_set_key,                            /* set-key */
       __wt_cursor_set_value,                          /* set-value */
+      __wt_cursor_set_raw_key_value,                  /* set-raw-key-value */
       __wt_cursor_compare_notsup,                     /* compare */
       __wt_cursor_equals_notsup,                      /* equals */
       __wt_cursor_notsup,                             /* next */
diff --git a/src/third_party/wiredtiger/src/cursor/cur_ds.c b/src/third_party/wiredtiger/src/cursor/cur_ds.c
index 0e79a425cc6..c68d66b33f2 100644
--- a/src/third_party/wiredtiger/src/cursor/cur_ds.c
+++ b/src/third_party/wiredtiger/src/cursor/cur_ds.c
@@ -435,6 +435,7 @@ __wt_curds_open(WT_SESSION_IMPL *session, const char *uri, WT_CURSOR *owner, con
       __wt_cursor_get_raw_key_value,                  /* get-raw-key-value */
       __wt_cursor_set_key,                            /* set-key */
       __wt_cursor_set_value,                          /* set-value */
+      __wt_cursor_set_raw_key_value,                  /* set-raw-key-value */
       __curds_compare,                                /* compare */
       __wt_cursor_equals,                             /* equals */
       __curds_next,                                   /* next */
diff --git a/src/third_party/wiredtiger/src/cursor/cur_dump.c b/src/third_party/wiredtiger/src/cursor/cur_dump.c
index 31127a7a513..e5ce812b76c 100644
--- a/src/third_party/wiredtiger/src/cursor/cur_dump.c
+++ b/src/third_party/wiredtiger/src/cursor/cur_dump.c
@@ -397,6 +397,7 @@ __wt_curdump_create(WT_CURSOR *child, WT_CURSOR *owner, WT_CURSOR **cursorp)
       __wt_cursor_get_raw_key_value_notsup,         /* get-raw-key-value */
       __curdump_set_key,                            /* set-key */
       __curdump_set_value,                          /* set-value */
+      __wt_cursor_set_raw_key_value_notsup,         /* set-raw-key-value */
       __wt_cursor_compare_notsup,                   /* compare */
       __wt_cursor_equals_notsup,                    /* equals */
       __curdump_next,                               /* next */
diff --git a/src/third_party/wiredtiger/src/cursor/cur_file.c b/src/third_party/wiredtiger/src/cursor/cur_file.c
index 458ced0f523..24684b32e25 100644
--- a/src/third_party/wiredtiger/src/cursor/cur_file.c
+++ b/src/third_party/wiredtiger/src/cursor/cur_file.c
@@ -950,6 +950,7 @@ __curfile_create(WT_SESSION_IMPL *session, WT_CURSOR *owner, const char *cfg[],
       __wt_cursor_get_raw_key_value,                  /* get-raw-key-value */
       __wt_cursor_set_key,                            /* set-key */
       __wt_cursor_set_value,                          /* set-value */
+      __wt_cursor_set_raw_key_value,                  /* set-raw-key-value */
       __curfile_compare,                              /* compare */
       __curfile_equals,                               /* equals */
       __curfile_next,                                 /* next */
diff --git a/src/third_party/wiredtiger/src/cursor/cur_hs.c b/src/third_party/wiredtiger/src/cursor/cur_hs.c
index 7a6718e5b21..b093d9c8141 100644
--- a/src/third_party/wiredtiger/src/cursor/cur_hs.c
+++ b/src/third_party/wiredtiger/src/cursor/cur_hs.c
@@ -1233,6 +1233,7 @@ __wt_curhs_open(WT_SESSION_IMPL *session, WT_CURSOR *owner, WT_CURSOR **cursorp)
       __wt_cursor_get_raw_key_value_notsup,           /* get-raw-key-value */
       __curhs_set_key,                                /* set-key */
       __curhs_set_value,                              /* set-value */
+      __wt_cursor_set_raw_key_value_notsup,           /* set-raw-key-value */
       __curhs_compare,                                /* compare */
       __wt_cursor_equals_notsup,                      /* equals */
       __curhs_next,                                   /* next */
diff --git a/src/third_party/wiredtiger/src/cursor/cur_index.c b/src/third_party/wiredtiger/src/cursor/cur_index.c
index 6f39723b0f2..8068ab1c64a 100644
--- a/src/third_party/wiredtiger/src/cursor/cur_index.c
+++ b/src/third_party/wiredtiger/src/cursor/cur_index.c
@@ -565,6 +565,7 @@ __wt_curindex_open(WT_SESSION_IMPL *session, const char *uri, WT_CURSOR *owner,
       __wt_cursor_get_raw_key_value_notsup,           /* get-raw-key-value */
       __wt_cursor_set_key,                            /* set-key */
       __curindex_set_value,                           /* set-value */
+      __wt_cursor_set_raw_key_value_notsup,           /* set-raw-key-value */
       __curindex_compare,                             /* compare */
       __wt_cursor_equals,                             /* equals */
       __curindex_next,                                /* next */
diff --git a/src/third_party/wiredtiger/src/cursor/cur_join.c b/src/third_party/wiredtiger/src/cursor/cur_join.c
index e568ebb69a6..d3bc90ef08a 100644
--- a/src/third_party/wiredtiger/src/cursor/cur_join.c
+++ b/src/third_party/wiredtiger/src/cursor/cur_join.c
@@ -564,6 +564,7 @@ __curjoin_entry_member(
       __wt_cursor_get_raw_key_value,                  /* get-raw-key-value */
       __wt_cursor_set_key,                            /* set-key */
       __wt_cursor_set_value,                          /* set-value */
+      __wt_cursor_set_raw_key_value,                  /* set-raw-key-value */
       __wt_cursor_compare_notsup,                     /* compare */
       __wt_cursor_equals_notsup,                      /* equals */
       __wt_cursor_notsup,                             /* next */
@@ -1214,6 +1215,7 @@ __wt_curjoin_open(WT_SESSION_IMPL *session, const char *uri, WT_CURSOR *owner, c
       __wt_cursor_get_raw_key_value_notsup,         /* get-raw-key-value */
       __wt_cursor_set_key_notsup,                   /* set-key */
       __wt_cursor_set_value_notsup,                 /* set-value */
+      __wt_cursor_set_raw_key_value_notsup,         /* set-raw-key-value */
       __wt_cursor_compare_notsup,                   /* compare */
       __wt_cursor_equals_notsup,                    /* equals */
       __curjoin_next,                               /* next */
diff --git a/src/third_party/wiredtiger/src/cursor/cur_log.c b/src/third_party/wiredtiger/src/cursor/cur_log.c
index acc32dc19a0..4dfbea130c7 100644
--- a/src/third_party/wiredtiger/src/cursor/cur_log.c
+++ b/src/third_party/wiredtiger/src/cursor/cur_log.c
@@ -330,6 +330,7 @@ __wt_curlog_open(WT_SESSION_IMPL *session, const char *uri, const char *cfg[], W
       __wt_cursor_get_raw_key_value,                  /* get-raw-key-value */
       __wt_cursor_set_key,                            /* set-key */
       __wt_cursor_set_value,                          /* set-value */
+      __wt_cursor_set_raw_key_value,                  /* set-raw-key-value */
       __curlog_compare,                               /* compare */
       __wt_cursor_equals,                             /* equals */
       __curlog_next,                                  /* next */
diff --git a/src/third_party/wiredtiger/src/cursor/cur_metadata.c b/src/third_party/wiredtiger/src/cursor/cur_metadata.c
index f202c591305..de268c6b86b 100644
--- a/src/third_party/wiredtiger/src/cursor/cur_metadata.c
+++ b/src/third_party/wiredtiger/src/cursor/cur_metadata.c
@@ -583,6 +583,7 @@ __wt_curmetadata_open(WT_SESSION_IMPL *session, const char *uri, WT_CURSOR *owne
       __wt_cursor_get_raw_key_value,                  /* get-raw-key-value */
       __wt_cursor_set_key,                            /* set-key */
       __wt_cursor_set_value,                          /* set-value */
+      __wt_cursor_set_raw_key_value,                  /* set-raw-key-value */
       __curmetadata_compare,                          /* compare */
       __wt_cursor_equals,                             /* equals */
       __curmetadata_next,                             /* next */
diff --git a/src/third_party/wiredtiger/src/cursor/cur_stat.c b/src/third_party/wiredtiger/src/cursor/cur_stat.c
index c34fabb19c6..622bc3180b1 100644
--- a/src/third_party/wiredtiger/src/cursor/cur_stat.c
+++ b/src/third_party/wiredtiger/src/cursor/cur_stat.c
@@ -625,6 +625,7 @@ __wt_curstat_open(WT_SESSION_IMPL *session, const char *uri, WT_CURSOR *other, c
       __wt_cursor_get_raw_key_value_notsup,         /* get-raw-key-value */
       __curstat_set_key,                            /* set-key */
       __curstat_set_value,                          /* set-value */
+      __wt_cursor_set_raw_key_value_notsup,         /* set-raw-key-value */
       __wt_cursor_compare_notsup,                   /* compare */
       __wt_cursor_equals_notsup,                    /* equals */
       __curstat_next,                               /* next */
diff --git a/src/third_party/wiredtiger/src/cursor/cur_std.c b/src/third_party/wiredtiger/src/cursor/cur_std.c
index c68e4a78d31..64066d03809 100644
--- a/src/third_party/wiredtiger/src/cursor/cur_std.c
+++ b/src/third_party/wiredtiger/src/cursor/cur_std.c
@@ -90,6 +90,18 @@ __wt_cursor_set_value_notsup(WT_CURSOR *cursor, ...)
     WT_IGNORE_RET(__wt_cursor_notsup(cursor));
 }
 
+/*
+ * __wt_cursor_set_raw_key_value_notsup --
+ *     WT_CURSOR.set_raw_key_value not-supported.
+ */
+void
+__wt_cursor_set_raw_key_value_notsup(WT_CURSOR *cursor, WT_ITEM *key, WT_ITEM *value)
+{
+    WT_UNUSED(key);
+    WT_UNUSED(value);
+    WT_IGNORE_RET(__wt_cursor_notsup(cursor));
+}
+
 /*
  * __wt_cursor_compare_notsup --
  *     Unsupported cursor comparison.
@@ -622,6 +634,61 @@ __wt_cursor_set_value(WT_CURSOR *cursor, ...)
     va_end(ap);
 }
 
+/*
+ * __wt_cursor_set_raw_key_value --
+ *     WT_CURSOR->set_raw_key_value default implementation
+ */
+void
+__wt_cursor_set_raw_key_value(WT_CURSOR *cursor, WT_ITEM *key, WT_ITEM *value)
+{
+    WT_DECL_RET;
+    WT_ITEM *buf;
+    WT_SESSION_IMPL *session;
+
+    CURSOR_API_CALL(cursor, session, ret, set_raw_key_value, NULL);
+    WT_ERR(__cursor_copy_release(cursor));
+
+    if ((key == NULL) || (value == NULL))
+        WT_ERR(__wt_cursor_kv_not_set(cursor, true));
+
+    WT_ERR(__cursor_copy_release(cursor));
+
+    F_CLR(cursor, WT_CURSTD_KEY_SET);
+    buf = &cursor->key;
+    if (WT_DATA_IN_ITEM(buf)) {
+        buf->mem = NULL;
+        buf->memsize = 0;
+    }
+
+    if (key->size == 0)
+        WT_ERR_MSG(session, EINVAL, "Empty keys not permitted");
+    else if ((uint32_t)key->size != key->size)
+        WT_ERR_MSG(session, EINVAL, "Key size (%" PRIu64 ") out of range", (uint64_t)key->size);
+
+    cursor->saved_err = 0;
+    cursor->key.data = key->data;
+    cursor->key.size = key->size;
+    F_SET(cursor, WT_CURSTD_KEY_EXT);
+
+    F_CLR(cursor, WT_CURSTD_VALUE_SET);
+    buf = &cursor->value;
+    if (WT_DATA_IN_ITEM(buf)) {
+        buf->mem = NULL;
+        buf->memsize = 0;
+    }
+    cursor->value.data = value->data;
+    cursor->value.size = value->size;
+    F_SET(cursor, WT_CURSTD_VALUE_EXT);
+
+err:
+    if (ret != 0) {
+        ret = __wt_panic(CUR2S(cursor), ret, "failed to set key");
+        cursor->saved_err = ret;
+    }
+    API_END(session, ret);
+    WT_IGNORE_RET(ret);
+}
+
 /*
  * __wt_cursor_set_valuev --
  *     WT_CURSOR->set_value worker implementation.
diff --git a/src/third_party/wiredtiger/src/cursor/cur_table.c b/src/third_party/wiredtiger/src/cursor/cur_table.c
index 19403106562..84841598b6e 100644
--- a/src/third_party/wiredtiger/src/cursor/cur_table.c
+++ b/src/third_party/wiredtiger/src/cursor/cur_table.c
@@ -90,6 +90,7 @@ __wt_apply_single_idx(WT_SESSION_IMPL *session, WT_INDEX *idx, WT_CURSOR *cur,
       __wt_cursor_get_raw_key_value,                  /* get-raw-key-value */
       __wt_cursor_set_key,                            /* set-key */
       __wt_cursor_set_value,                          /* set-value */
+      __wt_cursor_set_raw_key_value,                  /* set-raw-key-value */
       __wt_cursor_compare_notsup,                     /* compare */
       __wt_cursor_equals_notsup,                      /* equals */
       __wt_cursor_notsup,                             /* next */
@@ -1052,6 +1053,7 @@ __wt_curtable_open(WT_SESSION_IMPL *session, const char *uri, WT_CURSOR *owner,
       __wt_cursor_get_raw_key_value_notsup,             /* get-raw-key-value */
       __wt_curtable_set_key,                            /* set-key */
       __wt_curtable_set_value,                          /* set-value */
+      __wt_cursor_set_raw_key_value_notsup,             /* set-raw-key-value */
       __curtable_compare,                               /* compare */
       __wt_cursor_equals,                               /* equals */
       __curtable_next,                                  /* next */
diff --git a/src/third_party/wiredtiger/src/cursor/cur_version.c b/src/third_party/wiredtiger/src/cursor/cur_version.c
index c7cb50e7a1f..6c7f7ff6ba4 100644
--- a/src/third_party/wiredtiger/src/cursor/cur_version.c
+++ b/src/third_party/wiredtiger/src/cursor/cur_version.c
@@ -604,6 +604,7 @@ __wt_curversion_open(WT_SESSION_IMPL *session, const char *uri, WT_CURSOR *owner
       __wt_cursor_get_raw_key_value_notsup,            /* get-raw-key-value */
       __curversion_set_key,                            /* set-key */
       __wt_cursor_set_value_notsup,                    /* set-value */
+      __wt_cursor_set_raw_key_value_notsup,            /* set-raw-key-value */
       __wt_cursor_compare_notsup,                      /* compare */
       __wt_cursor_equals_notsup,                       /* equals */
       __curversion_next,                               /* next */
diff --git a/src/third_party/wiredtiger/src/docs/cursors.dox b/src/third_party/wiredtiger/src/docs/cursors.dox
index 237141aa5d1..88aeefce4ce 100644
--- a/src/third_party/wiredtiger/src/docs/cursors.dox
+++ b/src/third_party/wiredtiger/src/docs/cursors.dox
@@ -73,6 +73,9 @@ cursor's \c key_format or \c value_format, respectively.
 WT_CURSOR::get_raw_key_value can be used to obtain both the key and value
 in raw format in a single function call.
 
+WT_CURSOR::set_raw_key_value can be used to set both the key and value
+in raw format in a single function call.
+
 The @ex_ref{ex_schema.c} example creates a table where the value format is
 \c "5sHq", where the initial string is the country, the short is a year,
 and the long is a population.
diff --git a/src/third_party/wiredtiger/src/include/cursor.h b/src/third_party/wiredtiger/src/include/cursor.h
index 1039e915780..bffc8063d59 100644
--- a/src/third_party/wiredtiger/src/include/cursor.h
+++ b/src/third_party/wiredtiger/src/include/cursor.h
@@ -14,29 +14,29 @@
 /*
  * Initialize a static WT_CURSOR structure.
  */
-#define WT_CURSOR_STATIC_INIT(n, get_key, get_value, get_raw_key_value, set_key, set_value,      \
-  compare, equals, next, prev, reset, search, search_near, insert, modify, update, remove,       \
-  reserve, reconfigure, largest_key, bound, cache, reopen, checkpoint_id, close)                 \
-    static const WT_CURSOR n = {                                                                 \
-      NULL, /* session */                                                                        \
-      NULL, /* uri */                                                                            \
-      NULL, /* key_format */                                                                     \
-      NULL, /* value_format */                                                                   \
-      get_key, get_value, get_raw_key_value, set_key, set_value, compare, equals, next, prev,    \
-      reset, search, search_near, insert, modify, update, remove, reserve, checkpoint_id, close, \
-      largest_key, reconfigure, bound, cache, reopen, 0, /* uri_hash */                          \
-      {NULL, NULL},                                      /* TAILQ_ENTRY q */                     \
-      0,                                                 /* recno key */                         \
-      {0},                                               /* recno raw buffer */                  \
-      NULL,                                              /* json_private */                      \
-      NULL,                                              /* lang_private */                      \
-      {NULL, 0, NULL, 0, 0},                             /* WT_ITEM key */                       \
-      {NULL, 0, NULL, 0, 0},                             /* WT_ITEM value */                     \
-      0,                                                 /* int saved_err */                     \
-      NULL,                                              /* internal_uri */                      \
-      {NULL, 0, NULL, 0, 0},                             /* WT_ITEM lower bound */               \
-      {NULL, 0, NULL, 0, 0},                             /* WT_ITEM upper bound */               \
-      0                                                  /* uint32_t flags */                    \
+#define WT_CURSOR_STATIC_INIT(n, get_key, get_value, get_raw_key_value, set_key, set_value,        \
+  set_raw_key_value, compare, equals, next, prev, reset, search, search_near, insert, modify,      \
+  update, remove, reserve, reconfigure, largest_key, bound, cache, reopen, checkpoint_id, close)   \
+    static const WT_CURSOR n = {                                                                   \
+      NULL, /* session */                                                                          \
+      NULL, /* uri */                                                                              \
+      NULL, /* key_format */                                                                       \
+      NULL, /* value_format */                                                                     \
+      get_key, get_value, get_raw_key_value, set_key, set_value, set_raw_key_value, compare,       \
+      equals, next, prev, reset, search, search_near, insert, modify, update, remove, reserve,     \
+      checkpoint_id, close, largest_key, reconfigure, bound, cache, reopen, 0, /* uri_hash */      \
+      {NULL, NULL},                                                            /* TAILQ_ENTRY q */ \
+      0,                                                                       /* recno key */     \
+      {0},                   /* recno raw buffer */                                                \
+      NULL,                  /* json_private */                                                    \
+      NULL,                  /* lang_private */                                                    \
+      {NULL, 0, NULL, 0, 0}, /* WT_ITEM key */                                                     \
+      {NULL, 0, NULL, 0, 0}, /* WT_ITEM value */                                                   \
+      0,                     /* int saved_err */                                                   \
+      NULL,                  /* internal_uri */                                                    \
+      {NULL, 0, NULL, 0, 0}, /* WT_ITEM lower bound */                                             \
+      {NULL, 0, NULL, 0, 0}, /* WT_ITEM upper bound */                                             \
+      0                      /* uint32_t flags */                                                  \
     }
 
 /* Call a function without the evict reposition cursor flag, restore afterwards. */
diff --git a/src/third_party/wiredtiger/src/include/extern.h b/src/third_party/wiredtiger/src/include/extern.h
index 7c6d038a06e..5c33d826887 100644
--- a/src/third_party/wiredtiger/src/include/extern.h
+++ b/src/third_party/wiredtiger/src/include/extern.h
@@ -1928,6 +1928,8 @@ extern void __wt_cursor_set_key(WT_CURSOR *cursor, ...);
 extern void __wt_cursor_set_key_notsup(WT_CURSOR *cursor, ...);
 extern void __wt_cursor_set_notsup(WT_CURSOR *cursor);
 extern void __wt_cursor_set_raw_key(WT_CURSOR *cursor, WT_ITEM *key);
+extern void __wt_cursor_set_raw_key_value(WT_CURSOR *cursor, WT_ITEM *key, WT_ITEM *value);
+extern void __wt_cursor_set_raw_key_value_notsup(WT_CURSOR *cursor, WT_ITEM *key, WT_ITEM *value);
 extern void __wt_cursor_set_raw_value(WT_CURSOR *cursor, WT_ITEM *value);
 extern void __wt_cursor_set_value(WT_CURSOR *cursor, ...);
 extern void __wt_cursor_set_value_notsup(WT_CURSOR *cursor, ...);
diff --git a/src/third_party/wiredtiger/src/include/wiredtiger.in b/src/third_party/wiredtiger/src/include/wiredtiger.in
index f26429a24a4..3c21a5e3cb0 100644
--- a/src/third_party/wiredtiger/src/include/wiredtiger.in
+++ b/src/third_party/wiredtiger/src/include/wiredtiger.in
@@ -311,6 +311,25 @@ struct __wt_cursor {
      * simplifies error handling in applications.
      */
     void __F(set_value)(WT_CURSOR *cursor, ...);
+
+    /*!
+     * Set the raw key and value for the current record.
+     *
+     * @snippet ex_all.c Set the cursor's raw key and value
+     *
+     * @param cursor the cursor handle
+     * @param key pointer to an item that contains the raw key
+     * @param value pointer to an item that contains the raw value
+     *
+     * The caller should pass both the key and value to be set for the
+     * cursor.
+     *
+     * If an error occurs during this operation, a flag will be set in the
+     * cursor, and the next operation to access the key will fail.  This
+     * simplifies error handling in applications.
+     */
+    void __F(set_raw_key_value)(WT_CURSOR *cursor, WT_ITEM* key, WT_ITEM* value);
+
     /*! @} */
 
     /*!
diff --git a/src/third_party/wiredtiger/src/lsm/lsm_cursor.c b/src/third_party/wiredtiger/src/lsm/lsm_cursor.c
index 80be5ff314c..0ce39c56adb 100644
--- a/src/third_party/wiredtiger/src/lsm/lsm_cursor.c
+++ b/src/third_party/wiredtiger/src/lsm/lsm_cursor.c
@@ -1687,6 +1687,7 @@ __wt_clsm_open(WT_SESSION_IMPL *session, const char *uri, WT_CURSOR *owner, cons
       __wt_cursor_get_raw_key_value,                  /* get-value */
       __wt_cursor_set_key,                            /* set-key */
       __wt_cursor_set_value,                          /* set-value */
+      __wt_cursor_set_raw_key_value,                  /* set-raw-key-value */
       __clsm_compare,                                 /* compare */
       __wt_cursor_equals,                             /* equals */
       __clsm_next,                                    /* next */
diff --git a/src/third_party/wiredtiger/test/unittest/tests/cursors/test_cursor_get_raw_key_value.cpp b/src/third_party/wiredtiger/test/unittest/tests/cursors/test_cursor_get_raw_key_value.cpp
index a1dc47dac89..713af2f8bf6 100644
--- a/src/third_party/wiredtiger/test/unittest/tests/cursors/test_cursor_get_raw_key_value.cpp
+++ b/src/third_party/wiredtiger/test/unittest/tests/cursors/test_cursor_get_raw_key_value.cpp
@@ -12,16 +12,7 @@
 #include "../utils.h"
 #include "../wrappers/connection_wrapper.h"
 #include "../wrappers/item_wrapper.h"
-
-static void
-init_wt_item(WT_ITEM &item)
-{
-    item.data = nullptr;
-    item.size = 0;
-    item.mem = nullptr;
-    item.memsize = 0;
-    item.flags = 0;
-}
+#include "validate_key_value.h"
 
 static int
 insert_key_value(WT_CURSOR *cursor, const char *key, const char *value)
@@ -33,54 +24,6 @@ insert_key_value(WT_CURSOR *cursor, const char *key, const char *value)
     return cursor->insert(cursor);
 }
 
-static bool
-require_get_key_value(WT_CURSOR *cursor, const char *expected_key, const char *expected_value)
-{
-    const char *key = nullptr;
-    const char *value = nullptr;
-    REQUIRE(cursor->get_key(cursor, &key) == 0);
-    REQUIRE(cursor->get_value(cursor, &value) == 0);
-
-    bool keys_match = strcmp(key, expected_key) == 0;
-    bool values_match = strcmp(value, expected_value) == 0;
-    REQUIRE(keys_match);
-    REQUIRE(values_match);
-
-    return keys_match && values_match;
-}
-
-static bool
-check_item(WT_ITEM *item, const char *expected)
-{
-    bool match = true;
-    if (expected != nullptr) {
-        const char *key = static_cast<const char *>(item->data);
-        REQUIRE(key != nullptr);
-        match = strcmp(key, expected) == 0;
-    }
-    REQUIRE(match);
-    return match;
-}
-
-static bool
-require_get_raw_key_value(WT_CURSOR *cursor, const char *expected_key, const char *expected_value)
-{
-    WT_ITEM item_key;
-    init_wt_item(item_key);
-    WT_ITEM item_value;
-    init_wt_item(item_value);
-
-    WT_ITEM *p_item_key = (expected_key == nullptr) ? nullptr : &item_key;
-    WT_ITEM *p_item_value = (expected_value == nullptr) ? nullptr : &item_value;
-
-    REQUIRE(cursor->get_raw_key_value(cursor, p_item_key, p_item_value) == 0);
-
-    bool keys_match = check_item(p_item_key, expected_key);
-    bool values_match = check_item(p_item_value, expected_value);
-
-    return keys_match && values_match;
-}
-
 static void
 insert_sample_values(WT_CURSOR *cursor)
 {
