diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c
index fffc009..9315244 100644
--- a/src/backend/commands/trigger.c
+++ b/src/backend/commands/trigger.c
@@ -2815,7 +2815,8 @@ ExecBRUpdateTriggers(EState *estate, EPQState *epqstate,
 			return NULL;		/* "do nothing" */
 		}
 	}
-	if (trigtuple != fdw_trigtuple)
+	if (trigtuple != fdw_trigtuple &&
+		trigtuple != newtuple)
 		heap_freetuple(trigtuple);
 
 	if (newtuple != slottuple)
diff --git a/src/pl/plpgsql/src/expected/plpgsql_record.out b/src/pl/plpgsql/src/expected/plpgsql_record.out
index 29e42fd..0e898c2 100644
--- a/src/pl/plpgsql/src/expected/plpgsql_record.out
+++ b/src/pl/plpgsql/src/expected/plpgsql_record.out
@@ -479,6 +479,25 @@ table mutable;
  bar baz
 (2 rows)
 
+-- check returning old tuple
+create or replace function sillytrig() returns trigger language plpgsql as
+$$begin
+  raise notice 'old.ctid = %', old.ctid;
+  raise notice 'old.tableoid = %', old.tableoid::regclass;
+  return old;
+end$$;
+update mutable set f2 = f2 || ' baz';
+NOTICE:  old.ctid = (0,3)
+NOTICE:  old.tableoid = mutable
+NOTICE:  old.ctid = (0,4)
+NOTICE:  old.tableoid = mutable
+table mutable;
+   f2    
+---------
+ foo baz
+ bar baz
+(2 rows)
+
 -- check returning a composite datum from a trigger
 create or replace function sillytrig() returns trigger language plpgsql as
 $$begin
diff --git a/src/pl/plpgsql/src/sql/plpgsql_record.sql b/src/pl/plpgsql/src/sql/plpgsql_record.sql
index 781ccb0..0b5eaed 100644
--- a/src/pl/plpgsql/src/sql/plpgsql_record.sql
+++ b/src/pl/plpgsql/src/sql/plpgsql_record.sql
@@ -310,6 +310,16 @@ insert into mutable values ('foo'), ('bar');
 update mutable set f2 = f2 || ' baz';
 table mutable;
 
+-- check returning old tuple
+create or replace function sillytrig() returns trigger language plpgsql as
+$$begin
+  raise notice 'old.ctid = %', old.ctid;
+  raise notice 'old.tableoid = %', old.tableoid::regclass;
+  return old;
+end$$;
+update mutable set f2 = f2 || ' baz';
+table mutable;
+
 -- check returning a composite datum from a trigger
 
 create or replace function sillytrig() returns trigger language plpgsql as
