diff --git a/mysql-test/r/ndb_dd_basic.result b/mysql-test/r/ndb_dd_basic.result
index e8aa9edf751944e304eee2ebd40a7ec6e38b6e21..c0d52a2b3fcdcb48e1c34648d927abb7b84bbf28 100644
--- a/mysql-test/r/ndb_dd_basic.result
+++ b/mysql-test/r/ndb_dd_basic.result
@@ -422,6 +422,26 @@ SELECT COUNT(*) FROM t1;
 COUNT(*)
 0
 DROP TABLE t1;
+CREATE TABLE t1 (
+a int NOT NULL,
+b varchar(4000),  -- must use 2 pages undo
+PRIMARY KEY using hash (a)
+)
+TABLESPACE ts1 STORAGE DISK ENGINE=NDBCLUSTER;
+set autocommit = 0;
+insert into t1 values(0,'x');
+insert into t1 values(1,'x');
+insert into t1 values(2,'x');
+insert into t1 values(3,'x');
+insert into t1 values(4,'x');
+insert into t1 values(5,'x');
+insert into t1 values(6,'x');
+insert into t1 values(7,'x');
+insert into t1 values(8,'x');
+delete from t1 where a = 0;
+commit;
+set autocommit = 1;
+drop table t1;
 create table test.t1 (f1 varchar(50) primary key, f2 text,f3 int) 
 TABLESPACE ts1 STORAGE DISK engine=NDB;
 insert into test.t1 (f1,f2,f3)VALUES("111111","aaaaaa",1);
diff --git a/mysql-test/t/ndb_dd_basic.test b/mysql-test/t/ndb_dd_basic.test
index 08a4053aa2953b1e333c9a1a3c42d65dfb144240..5d43d7997b0f59a8aa21744765faeb3c24ddeab1 100644
--- a/mysql-test/t/ndb_dd_basic.test
+++ b/mysql-test/t/ndb_dd_basic.test
@@ -345,6 +345,31 @@ DELETE FROM t1 WHERE a=2;
 SELECT COUNT(*) FROM t1;
 DROP TABLE t1;
 
+# bug#20612 INS-DEL bug (not pgman bug)
+# found via disk data assert but is not pgman or disk data related
+
+CREATE TABLE t1 (
+  a int NOT NULL,
+  b varchar(4000),  -- must use 2 pages undo
+  PRIMARY KEY using hash (a)
+)
+TABLESPACE ts1 STORAGE DISK ENGINE=NDBCLUSTER;
+
+set autocommit = 0;
+insert into t1 values(0,'x');
+insert into t1 values(1,'x');
+insert into t1 values(2,'x');
+insert into t1 values(3,'x');
+insert into t1 values(4,'x');
+insert into t1 values(5,'x');
+insert into t1 values(6,'x');
+insert into t1 values(7,'x');
+insert into t1 values(8,'x');
+delete from t1 where a = 0;
+commit;
+set autocommit = 1;
+
+drop table t1;
 #############################
 # Customer posted order by test case
 # Org in ndb_dd_advance.test
diff --git a/storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp b/storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp
index dc1b194eed2262e973e6611f399067dfeaeb2851..3118164badda25e95d8e556f611567762c3ee456 100644
--- a/storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp
+++ b/storage/ndb/src/kernel/blocks/dbtup/DbtupExecQuery.cpp
@@ -1469,7 +1469,15 @@ int Dbtup::handleDeleteReq(Signal* signal,
   {
     Operationrec* prevOp= req_struct->prevOpPtr.p;
     regOperPtr->tupVersion= prevOp->tupVersion;
-    regOperPtr->m_copy_tuple_location= prevOp->m_copy_tuple_location;
+    // make copy since previous op is committed before this one
+    const Uint32* org = c_undo_buffer.get_ptr(&prevOp->m_copy_tuple_location);
+    Uint32* dst = c_undo_buffer.alloc_copy_tuple(
+        &regOperPtr->m_copy_tuple_location, regTabPtr->total_rec_size);
+    if (dst == 0) {
+      terrorCode = ZMEM_NOMEM_ERROR;
+      goto error;
+    }
+    memcpy(dst, org, regTabPtr->total_rec_size << 2);
   } 
   else 
   {