diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
new file mode 100644
index d7abde1..fb4b918
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -2938,7 +2938,8 @@ ExecBRUpdateTriggers(EState *estate, EPQ
 					 ItemPointer tupleid,
 					 HeapTuple fdw_trigtuple,
 					 TupleTableSlot *newslot,
-					 TM_FailureData *tmfd)
+					 TM_FailureData *tmfd,
+					 MergeActionState *relaction)
 {
 	TriggerDesc *trigdesc = relinfo->ri_TrigDesc;
 	TupleTableSlot *oldslot = ExecGetTriggerOldSlot(estate, relinfo);
@@ -2983,7 +2984,7 @@ ExecBRUpdateTriggers(EState *estate, EPQ
 			TupleTableSlot *epqslot_clean;
 
 			epqslot_clean = ExecGetUpdateNewTuple(relinfo, epqslot_candidate,
-												  oldslot);
+												  oldslot, relaction);
 
 			if (newslot != epqslot_clean)
 				ExecCopySlot(newslot, epqslot_clean);
diff --git a/src/backend/executor/execReplication.c b/src/backend/executor/execReplication.c
new file mode 100644
index c484f5c..afc946b
--- a/src/backend/executor/execReplication.c
+++ b/src/backend/executor/execReplication.c
@@ -486,7 +486,7 @@ ExecSimpleRelationUpdate(ResultRelInfo *
 		resultRelInfo->ri_TrigDesc->trig_update_before_row)
 	{
 		if (!ExecBRUpdateTriggers(estate, epqstate, resultRelInfo,
-								  tid, NULL, slot, NULL))
+								  tid, NULL, slot, NULL, NULL))
 			skip_tuple = true;	/* "do nothing" */
 	}
 
diff --git a/src/backend/executor/nodeModifyTable.c b/src/backend/executor/nodeModifyTable.c
new file mode 100644
index 6f0543a..5852bee
--- a/src/backend/executor/nodeModifyTable.c
+++ b/src/backend/executor/nodeModifyTable.c
@@ -708,14 +708,18 @@ ExecGetInsertNewTuple(ResultRelInfo *rel
 TupleTableSlot *
 ExecGetUpdateNewTuple(ResultRelInfo *relinfo,
 					  TupleTableSlot *planSlot,
-					  TupleTableSlot *oldSlot)
+					  TupleTableSlot *oldSlot,
+					  MergeActionState *relaction)
 {
 	/* Use a few extra Asserts to protect against outside callers */
 	Assert(relinfo->ri_projectNewInfoValid);
 	Assert(planSlot != NULL && !TTS_EMPTY(planSlot));
 	Assert(oldSlot != NULL && !TTS_EMPTY(oldSlot));
 
-	return internalGetUpdateNewTuple(relinfo, planSlot, oldSlot, NULL);
+	if (relaction)
+		return mergeGetUpdateNewTuple(relinfo, planSlot, oldSlot, relaction);
+	else
+		return internalGetUpdateNewTuple(relinfo, planSlot, oldSlot, NULL);
 }
 
 /*
@@ -1903,7 +1907,7 @@ ExecUpdatePrologue(ModifyTableContext *c
 
 		return ExecBRUpdateTriggers(context->estate, context->epqstate,
 									resultRelInfo, tupleid, oldtuple, slot,
-									&context->tmfd);
+									&context->tmfd, context->relaction);
 	}
 
 	return true;
@@ -2395,7 +2399,7 @@ redo_act:
 															   oldSlot))
 								elog(ERROR, "failed to fetch tuple being updated");
 							slot = ExecGetUpdateNewTuple(resultRelInfo,
-														 epqslot, oldSlot);
+														 epqslot, oldSlot, NULL);
 							goto redo_act;
 
 						case TM_Deleted:
diff --git a/src/include/commands/trigger.h b/src/include/commands/trigger.h
new file mode 100644
index 39d764d..52b4ae3
--- a/src/include/commands/trigger.h
+++ b/src/include/commands/trigger.h
@@ -232,7 +232,8 @@ extern bool ExecBRUpdateTriggers(EState
 								 ItemPointer tupleid,
 								 HeapTuple fdw_trigtuple,
 								 TupleTableSlot *newslot,
-								 TM_FailureData *tmfd);
+								 TM_FailureData *tmfd,
+								 MergeActionState *relaction);
 extern void ExecARUpdateTriggers(EState *estate,
 								 ResultRelInfo *relinfo,
 								 ResultRelInfo *src_partinfo,
diff --git a/src/include/executor/executor.h b/src/include/executor/executor.h
new file mode 100644
index e7e25c0..17e57ba
--- a/src/include/executor/executor.h
+++ b/src/include/executor/executor.h
@@ -659,7 +659,8 @@ extern void CheckSubscriptionRelkind(cha
  */
 extern TupleTableSlot *ExecGetUpdateNewTuple(ResultRelInfo *relinfo,
 											 TupleTableSlot *planSlot,
-											 TupleTableSlot *oldSlot);
+											 TupleTableSlot *oldSlot,
+											 MergeActionState *relaction);
 extern ResultRelInfo *ExecLookupResultRelByOid(ModifyTableState *node,
 											   Oid resultoid,
 											   bool missing_ok,
