diff --git a/doc/src/sgml/config.sgml b/doc/src/sgml/config.sgml
index 71097ee21c8c7c373fcdce8789e89e9e68e45cd0..c8c30c984155c323ce8551c235c9d2ce018bf825 100644
--- a/doc/src/sgml/config.sgml
+++ b/doc/src/sgml/config.sgml
@@ -1,4 +1,4 @@
-<!-- $PostgreSQL: pgsql/doc/src/sgml/config.sgml,v 1.246 2010/01/26 16:33:40 tgl Exp $ -->
+<!-- $PostgreSQL: pgsql/doc/src/sgml/config.sgml,v 1.247 2010/01/29 18:39:05 sriggs Exp $ -->
 
 <chapter Id="runtime-config">
   <title>Server Configuration</title>
@@ -1840,6 +1840,22 @@ archive_command = 'copy "%p" "C:\\server\\archivedir\\%f"'  # Windows
       </listitem>
      </varlistentry>
 
+     <varlistentry id="minimize-standby-conflicts" xreflabel="minimize_standby_conflicts">
+      <term><varname>minimize_standby_conflicts</varname> (<type>boolean</type>)</term>
+      <indexterm>
+       <primary><varname>minimize_standby_conflicts</> configuration parameter</primary>
+      </indexterm>
+      <listitem>
+       <para>
+        Generates additional information to the transaction log (WAL) to minimize
+        the number of false positive cancelations caused by recovery conflicts on
+        a standby server that consumes WAL data from this server.
+        There is additional performance cost to enabling this parameter.
+        Parameter has no effect during recovery, only in normal running.
+       </para>
+      </listitem>
+     </varlistentry>
+
      </variablelist>
     </sect2>
    </sect1>
diff --git a/src/backend/access/nbtree/nbtpage.c b/src/backend/access/nbtree/nbtpage.c
index 7cd76e10cf30a811ba0a7dd50df659bb43935141..5fa4724602f1ab4fc1763bce752325fc94531c1d 100644
--- a/src/backend/access/nbtree/nbtpage.c
+++ b/src/backend/access/nbtree/nbtpage.c
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/access/nbtree/nbtpage.c,v 1.115 2010/01/02 16:57:35 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/backend/access/nbtree/nbtpage.c,v 1.116 2010/01/29 18:39:05 sriggs Exp $
  *
  *	NOTES
  *	   Postgres btree pages look like ordinary relation pages.	The opaque
@@ -29,6 +29,7 @@
 #include "storage/freespace.h"
 #include "storage/indexfsm.h"
 #include "storage/lmgr.h"
+#include "storage/procarray.h"
 #include "utils/inval.h"
 #include "utils/snapmgr.h"
 
@@ -671,9 +672,18 @@ _bt_delitems(Relation rel, Buffer buf,
 {
 	Page		page = BufferGetPage(buf);
 	BTPageOpaque opaque;
+	TransactionId latestRemovedXid = InvalidTransactionId;
 
 	Assert(isVacuum || lastBlockVacuumed == 0);
 
+	/*
+	 * If allowed, calculate an accurate latestRemovedXid, otherwise
+	 * pass InvalidTransactionId which can cause false positive
+	 * conflicts to be assessed when we replay this WAL record.
+	 */
+	if (!isVacuum && XLogStandbyInfoActive() && MinimizeStandbyConflicts)
+		latestRemovedXid = GetOldestXmin(false, true);
+
 	/* No ereport(ERROR) until changes are logged */
 	START_CRIT_SECTION();
 
@@ -721,13 +731,7 @@ _bt_delitems(Relation rel, Buffer buf,
 			xlrec_delete.node = rel->rd_node;
 			xlrec_delete.block = BufferGetBlockNumber(buf);
 
-			/*
-			 * XXX: We would like to set an accurate latestRemovedXid, but
-			 * there is no easy way of obtaining a useful value. So we punt
-			 * and store InvalidTransactionId, which forces the standby to
-			 * wait for/cancel all currently running transactions.
-			 */
-			xlrec_delete.latestRemovedXid = InvalidTransactionId;
+			xlrec_delete.latestRemovedXid = latestRemovedXid;
 			rdata[0].data = (char *) &xlrec_delete;
 			rdata[0].len = SizeOfBtreeDelete;
 		}
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 5bee1d8837d260fcacfaed6466eeb5c765ca4120..8aa7976e3e3ca37c398b9a9e5399d814c44e25e7 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.364 2010/01/28 19:17:22 heikki Exp $
+ * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.365 2010/01/29 18:39:05 sriggs Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -71,6 +71,7 @@ bool		XLogArchiveMode = false;
 char	   *XLogArchiveCommand = NULL;
 bool 		XLogRequestRecoveryConnections = true;
 int			MaxStandbyDelay = 30;
+bool		MinimizeStandbyConflicts = false;
 bool		fullPageWrites = true;
 bool		log_checkpoints = false;
 int			sync_method = DEFAULT_SYNC_METHOD;
diff --git a/src/backend/utils/misc/guc.c b/src/backend/utils/misc/guc.c
index 00ea55d597906ec0ac1bdd265b629b0690fc7055..adf9f72b3596aa7ea8e9f05559034b5cf217a694 100644
--- a/src/backend/utils/misc/guc.c
+++ b/src/backend/utils/misc/guc.c
@@ -10,7 +10,7 @@
  * Written by Peter Eisentraut <peter_e@gmx.net>.
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.536 2010/01/26 16:33:40 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/utils/misc/guc.c,v 1.537 2010/01/29 18:39:05 sriggs Exp $
  *
  *--------------------------------------------------------------------
  */
@@ -1222,6 +1222,17 @@ static struct config_bool ConfigureNamesBool[] =
 		true, NULL, NULL
 	},
 
+	{
+		{"minimize_standby_conflicts", PGC_POSTMASTER, WAL_SETTINGS,
+			gettext_noop("Additional information is added to WAL records to"
+						 " minimize the number of false positive cancelations"
+						 " caused by recovery conflicts on WAL standby nodes."),
+			NULL
+		},
+		&MinimizeStandbyConflicts,
+		false, NULL, NULL
+	},
+
 	{
 		{"allow_system_table_mods", PGC_POSTMASTER, DEVELOPER_OPTIONS,
 			gettext_noop("Allows modifications of the structure of system tables."),
diff --git a/src/backend/utils/misc/postgresql.conf.sample b/src/backend/utils/misc/postgresql.conf.sample
index 95cab4d64fd61a9ad1b92997e6f86cb361e679e8..928ccc76edf85a011c7ed87fdde64cbc4857b728 100644
--- a/src/backend/utils/misc/postgresql.conf.sample
+++ b/src/backend/utils/misc/postgresql.conf.sample
@@ -181,7 +181,10 @@
 #archive_timeout = 0		# force a logfile segment switch after this
 				# number of seconds; 0 disables
 
+# - Hot Standby -
+
 #recovery_connections = on	# allows connections during recovery
+#minimize_standby_conflicts = on # additional WAL info to avoid conflicts
 #max_standby_delay = 30		# max acceptable standby lag (s) to help queries
 				# complete without conflict; -1 disables
 
diff --git a/src/include/access/xlog.h b/src/include/access/xlog.h
index d7aeb2fe06bedbdc8b085760cd0631db5a86e608..546452f282f30fac6e1375b510990a318ae09fda 100644
--- a/src/include/access/xlog.h
+++ b/src/include/access/xlog.h
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1996-2010, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/access/xlog.h,v 1.99 2010/01/28 07:31:42 heikki Exp $
+ * $PostgreSQL: pgsql/src/include/access/xlog.h,v 1.100 2010/01/29 18:39:05 sriggs Exp $
  */
 #ifndef XLOG_H
 #define XLOG_H
@@ -183,6 +183,7 @@ extern int	XLogArchiveTimeout;
 extern bool log_checkpoints;
 extern bool XLogRequestRecoveryConnections;
 extern int MaxStandbyDelay;
+extern bool MinimizeStandbyConflicts;
 
 #define XLogArchivingActive()	(XLogArchiveMode)
 #define XLogArchiveCommandSet() (XLogArchiveCommand[0] != '\0')