diff --git a/src/backend/replication/logical/reorderbuffer.c b/src/backend/replication/logical/reorderbuffer.c
index 52c6986..b6f83f8 100644
*** a/src/backend/replication/logical/reorderbuffer.c
--- b/src/backend/replication/logical/reorderbuffer.c
*************** static void
*** 2449,2463 ****
  ReorderBufferRestoreChange(ReorderBuffer *rb, ReorderBufferTXN *txn,
  						   char *data)
  {
- 	ReorderBufferDiskChange *ondisk;
  	ReorderBufferChange *change;
  
- 	ondisk = (ReorderBufferDiskChange *) data;
- 
  	change = ReorderBufferGetChange(rb);
  
  	/* copy static part */
! 	memcpy(change, &ondisk->change, sizeof(ReorderBufferChange));
  
  	data += sizeof(ReorderBufferDiskChange);
  
--- 2449,2461 ----
  ReorderBufferRestoreChange(ReorderBuffer *rb, ReorderBufferTXN *txn,
  						   char *data)
  {
  	ReorderBufferChange *change;
  
  	change = ReorderBufferGetChange(rb);
  
  	/* copy static part */
! 	memcpy(change, data + offsetof(ReorderBufferDiskChange, change),
! 		   sizeof(ReorderBufferChange));
  
  	data += sizeof(ReorderBufferDiskChange);
  
*************** ReorderBufferRestoreChange(ReorderBuffer
*** 2471,2477 ****
  		case REORDER_BUFFER_CHANGE_INTERNAL_SPEC_INSERT:
  			if (change->data.tp.oldtuple)
  			{
! 				Size		tuplelen = ((HeapTuple) data)->t_len;
  
  				change->data.tp.oldtuple =
  					ReorderBufferGetTupleBuf(rb, tuplelen - SizeofHeapTupleHeader);
--- 2469,2479 ----
  		case REORDER_BUFFER_CHANGE_INTERNAL_SPEC_INSERT:
  			if (change->data.tp.oldtuple)
  			{
! 				uint32		tuplelen;
! 
! 				/* Must get tuplelen the hard way in case it's misaligned */
! 				memcpy(&tuplelen, data + offsetof(HeapTupleData, t_len),
! 					   sizeof(uint32));
  
  				change->data.tp.oldtuple =
  					ReorderBufferGetTupleBuf(rb, tuplelen - SizeofHeapTupleHeader);
*************** ReorderBufferRestoreChange(ReorderBuffer
*** 2492,2498 ****
  
  			if (change->data.tp.newtuple)
  			{
! 				Size		tuplelen = ((HeapTuple) data)->t_len;
  
  				change->data.tp.newtuple =
  					ReorderBufferGetTupleBuf(rb, tuplelen - SizeofHeapTupleHeader);
--- 2494,2504 ----
  
  			if (change->data.tp.newtuple)
  			{
! 				uint32		tuplelen;
! 
! 				/* Must get tuplelen the hard way in case it's misaligned */
! 				memcpy(&tuplelen, data + offsetof(HeapTupleData, t_len),
! 					   sizeof(uint32));
  
  				change->data.tp.newtuple =
  					ReorderBufferGetTupleBuf(rb, tuplelen - SizeofHeapTupleHeader);
*************** ReorderBufferRestoreChange(ReorderBuffer
*** 2538,2552 ****
  			}
  		case REORDER_BUFFER_CHANGE_INTERNAL_SNAPSHOT:
  			{
! 				Snapshot	oldsnap;
  				Snapshot	newsnap;
  				Size		size;
  
! 				oldsnap = (Snapshot) data;
  
  				size = sizeof(SnapshotData) +
! 					sizeof(TransactionId) * oldsnap->xcnt +
! 					sizeof(TransactionId) * (oldsnap->subxcnt + 0);
  
  				change->data.snapshot = MemoryContextAllocZero(rb->context, size);
  
--- 2544,2558 ----
  			}
  		case REORDER_BUFFER_CHANGE_INTERNAL_SNAPSHOT:
  			{
! 				SnapshotData oldsnap;
  				Snapshot	newsnap;
  				Size		size;
  
! 				memcpy(&oldsnap, data, sizeof(SnapshotData));
  
  				size = sizeof(SnapshotData) +
! 					sizeof(TransactionId) * oldsnap.xcnt +
! 					sizeof(TransactionId) * oldsnap.subxcnt;
  
  				change->data.snapshot = MemoryContextAllocZero(rb->context, size);
  
*************** ReorderBufferRestoreChange(ReorderBuffer
*** 2557,2562 ****
--- 2563,2570 ----
  					(((char *) newsnap) + sizeof(SnapshotData));
  				newsnap->subxip = newsnap->xip + newsnap->xcnt;
  				newsnap->copied = true;
+ 
+ 				data += size;
  				break;
  			}
  			/* the base struct contains all the data, easy peasy */
