diff --git a/src/test/isolation/expected/tuplelock-subxact.out b/src/test/isolation/expected/tuplelock-subxact.out
new file mode 100644
index 0000000000..01e0c4ff57
--- /dev/null
+++ b/src/test/isolation/expected/tuplelock-subxact.out
@@ -0,0 +1,36 @@
+Parsed test spec with 3 sessions
+
+starting permutation: s1_b s1_u1 s1_u2 s1_u3 s2_u3 s1_subcommit2 s1_abort1 s3_u3 s1_c s1_s
+step s1_b: BEGIN;
+step s1_u1: UPDATE subxid_conflict SET b=1 WHERE a=1;
+step s1_u2: SAVEPOINT s1;	UPDATE subxid_conflict SET b=1 WHERE a=2;
+step s1_u3: SAVEPOINT s2;	UPDATE subxid_conflict SET b=1 WHERE a=3;
+step s2_u3: BEGIN;			UPDATE subxid_conflict SET b=2 WHERE a=3; COMMIT; <waiting ...>
+step s1_subcommit2: RELEASE SAVEPOINT s2;
+step s1_abort1: ROLLBACK TO s1;
+step s2_u3: <... completed>
+step s3_u3: BEGIN;			UPDATE subxid_conflict SET b=3 WHERE a=3; COMMIT;
+step s1_c: COMMIT;
+step s1_s: SELECT a, b FROM subxid_conflict WHERE a = 3;
+a|b
+-+-
+3|3
+(1 row)
+
+
+starting permutation: s1_b s1_u1 s1_u2 s1_u3 s2_u3 s1_abort2 s3_u3 s1_c s1_s
+step s1_b: BEGIN;
+step s1_u1: UPDATE subxid_conflict SET b=1 WHERE a=1;
+step s1_u2: SAVEPOINT s1;	UPDATE subxid_conflict SET b=1 WHERE a=2;
+step s1_u3: SAVEPOINT s2;	UPDATE subxid_conflict SET b=1 WHERE a=3;
+step s2_u3: BEGIN;			UPDATE subxid_conflict SET b=2 WHERE a=3; COMMIT; <waiting ...>
+step s1_abort2: ROLLBACK TO s2;
+step s2_u3: <... completed>
+step s3_u3: BEGIN;			UPDATE subxid_conflict SET b=3 WHERE a=3; COMMIT;
+step s1_c: COMMIT;
+step s1_s: SELECT a, b FROM subxid_conflict WHERE a = 3;
+a|b
+-+-
+3|3
+(1 row)
+
diff --git a/src/test/isolation/isolation_schedule b/src/test/isolation/isolation_schedule
index 041000a688..52b1679f2e 100644
--- a/src/test/isolation/isolation_schedule
+++ b/src/test/isolation/isolation_schedule
@@ -1,3 +1,4 @@
+test: tuplelock-subxact
 test: read-only-anomaly
 test: read-only-anomaly-2
 test: read-only-anomaly-3
diff --git a/src/test/isolation/specs/tuplelock-subxact.spec b/src/test/isolation/specs/tuplelock-subxact.spec
new file mode 100644
index 0000000000..8c1f680c3e
--- /dev/null
+++ b/src/test/isolation/specs/tuplelock-subxact.spec
@@ -0,0 +1,34 @@
+# Here we verify that XactLockTableWait() works with subxacts
+
+setup {
+	DROP TABLE IF EXISTS subxid_conflict;
+	CREATE TABLE subxid_conflict (a int primary key, b int);
+	INSERT INTO subxid_conflict VALUES (1, 0), (2, 0), (3, 0);
+}
+
+teardown {
+	DROP TABLE subxid_conflict;
+}
+
+session s1
+step s1_b  { BEGIN; }
+step s1_u1 { 				UPDATE subxid_conflict SET b=1 WHERE a=1; }
+step s1_u2 { SAVEPOINT s1;	UPDATE subxid_conflict SET b=1 WHERE a=2; }
+step s1_u3 { SAVEPOINT s2;	UPDATE subxid_conflict SET b=1 WHERE a=3; }
+step s1_subcommit2  { RELEASE SAVEPOINT s2; }
+# waiter should now wait for parent
+step s1_abort1  { ROLLBACK TO s1; }
+step s1_abort2  { ROLLBACK TO s2; }
+# waiters should now be released
+step s1_c { COMMIT; }
+step s1_s { SELECT a, b FROM subxid_conflict WHERE a = 3; }
+
+session s2
+step s2_u3 { BEGIN;			UPDATE subxid_conflict SET b=2 WHERE a=3; COMMIT; }
+
+session s3
+step s3_u3 { BEGIN;			UPDATE subxid_conflict SET b=3 WHERE a=3; COMMIT; }
+
+# result should be (1, 1), (2, 1), (3, 3)
+permutation s1_b s1_u1 s1_u2 s1_u3 s2_u3 s1_subcommit2 s1_abort1 s3_u3 s1_c s1_s
+permutation s1_b s1_u1 s1_u2 s1_u3 s2_u3               s1_abort2 s3_u3 s1_c s1_s
