diff --git a/contrib/btree_gist/btree_ts.c b/contrib/btree_gist/btree_ts.c
index 3d5defe3db07a29bc214c58c99c7d57814cb34c7..37f72d3a516e1e4e972387fab35c6a97530c6095 100644
--- a/contrib/btree_gist/btree_ts.c
+++ b/contrib/btree_gist/btree_ts.c
@@ -1,6 +1,9 @@
 #include "btree_gist.h"
 #include "btree_utils_num.h"
 
+#include "utils/datetime.h"
+
+
 typedef struct
 {
 	Timestamp	lower;
diff --git a/contrib/spi/timetravel.c b/contrib/spi/timetravel.c
index ba4838af659e32cab4874ec40d10a7a6a89f1807..0eae24a5769d23f67d6d3bc4c533f3c2f54bbf24 100644
--- a/contrib/spi/timetravel.c
+++ b/contrib/spi/timetravel.c
@@ -8,6 +8,8 @@
 #include "executor/spi.h"		/* this is what you need to work with SPI */
 #include "commands/trigger.h"	/* -"- and triggers */
 #include "miscadmin.h"			/* for GetPgUserName() */
+#include "utils/nabstime.h"
+
 #include <ctype.h>				/* tolower () */
 
 #define ABSTIMEOID	702			/* it should be in pg_type.h */
diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c
index a5d53d3e1457381b140677ead6d89cadc6b646a0..1df9cfa7ba04ae6ff05948e38897e650369db1b7 100644
--- a/src/backend/access/transam/xact.c
+++ b/src/backend/access/transam/xact.c
@@ -10,7 +10,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/access/transam/xact.c,v 1.208 2005/06/28 05:08:51 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/access/transam/xact.c,v 1.209 2005/06/29 22:51:53 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -168,12 +168,11 @@ static SubTransactionId currentSubTransactionId;
 static CommandId currentCommandId;
 
 /*
- * These vars hold the value of now(), ie, the transaction start time.
+ * This is the value of now(), ie, the transaction start time.
  * This does not change as we enter and exit subtransactions, so we don't
  * keep it inside the TransactionState stack.
  */
-static AbsoluteTime xactStartTime;		/* integer part */
-static int	xactStartTimeUsec;	/* microsecond part */
+static TimestampTz xactStartTimestamp;
 
 /*
  * GID to be used for preparing the current transaction.  This is also
@@ -420,28 +419,15 @@ GetCurrentCommandId(void)
 	return currentCommandId;
 }
 
-
-/*
- *	GetCurrentTransactionStartTime
- */
-AbsoluteTime
-GetCurrentTransactionStartTime(void)
-{
-	return xactStartTime;
-}
-
-
 /*
- *	GetCurrentTransactionStartTimeUsec
+ *	GetCurrentTransactionStartTimestamp
  */
-AbsoluteTime
-GetCurrentTransactionStartTimeUsec(int *msec)
+TimestampTz
+GetCurrentTransactionStartTimestamp(void)
 {
-	*msec = xactStartTimeUsec;
-	return xactStartTime;
+	return xactStartTimestamp;
 }
 
-
 /*
  *	GetCurrentTransactionNestLevel
  *
@@ -1391,7 +1377,7 @@ StartTransaction(void)
 	/*
 	 * set now()
 	 */
-	xactStartTime = GetCurrentAbsoluteTimeUsec(&(xactStartTimeUsec));
+	xactStartTimestamp = GetCurrentTimestamp();
 
 	/*
 	 * initialize current transaction state fields
@@ -1633,8 +1619,6 @@ PrepareTransaction(void)
 	TransactionId		xid = GetCurrentTransactionId();
 	GlobalTransaction	gxact;
 	TimestampTz			prepared_at;
-	AbsoluteTime		PreparedSec;	/* integer part */
-	int			PreparedUSec;	/* microsecond part */
 
 	ShowTransactionState("PrepareTransaction");
 
@@ -1697,8 +1681,7 @@ PrepareTransaction(void)
 	 */
 	s->state = TRANS_PREPARE;
 
-	PreparedSec = GetCurrentAbsoluteTimeUsec(&PreparedUSec);
-	prepared_at = AbsoluteTimeUsecToTimestampTz(PreparedSec, PreparedUSec);
+	prepared_at = GetCurrentTimestamp();
 
 	/* Tell bufmgr and smgr to prepare for commit */
 	BufmgrCommit();
diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 3a55a521c17b68027d511cd9d3ff94649cc5eadd..93f8d75e6cc05319153aaa0e4dcd9045f7343cff 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.203 2005/06/19 21:34:01 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.204 2005/06/29 22:51:53 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -43,6 +43,7 @@
 #include "storage/spin.h"
 #include "utils/builtins.h"
 #include "utils/guc.h"
+#include "utils/nabstime.h"
 #include "utils/relcache.h"
 
 
diff --git a/src/backend/bootstrap/bootparse.y b/src/backend/bootstrap/bootparse.y
index 1945c4074d964282bb247ea2cea9c51a4919c478..fc42ba83af3c6de9d40b90eed7584c5de1c62962 100644
--- a/src/backend/bootstrap/bootparse.y
+++ b/src/backend/bootstrap/bootparse.y
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/bootstrap/bootparse.y,v 1.76 2005/04/14 01:38:15 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/bootstrap/bootparse.y,v 1.77 2005/06/29 22:51:54 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -47,7 +47,6 @@
 #include "storage/off.h"
 #include "storage/smgr.h"
 #include "tcop/dest.h"
-#include "utils/nabstime.h"
 #include "utils/rel.h"
 
 #define atooid(x)	((Oid) strtoul((x), NULL, 10))
diff --git a/src/backend/bootstrap/bootscanner.l b/src/backend/bootstrap/bootscanner.l
index 2cec26078af37bcb2c56af6ecd428bbc49db323d..5c2fce29f0e7197179b590c54dd74639ee03a720 100644
--- a/src/backend/bootstrap/bootscanner.l
+++ b/src/backend/bootstrap/bootscanner.l
@@ -9,7 +9,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/bootstrap/bootscanner.l,v 1.39 2005/03/11 19:13:42 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/backend/bootstrap/bootscanner.l,v 1.40 2005/06/29 22:51:54 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -34,7 +34,6 @@
 #include "storage/fd.h"
 #include "storage/itemptr.h"
 #include "storage/off.h"
-#include "utils/nabstime.h"
 #include "utils/rel.h"
 
 /* Not needed now that this file is compiled as part of bootparse. */
diff --git a/src/backend/libpq/crypt.c b/src/backend/libpq/crypt.c
index d9c95d1b9ac8567b1da3768e3851464af56a1951..297db1eea914ad69790dd8e08bfa8cedb78ce4bb 100644
--- a/src/backend/libpq/crypt.c
+++ b/src/backend/libpq/crypt.c
@@ -9,7 +9,7 @@
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/backend/libpq/crypt.c,v 1.63 2005/06/28 05:08:56 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/libpq/crypt.c,v 1.64 2005/06/29 22:51:54 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -25,7 +25,7 @@
 #include "miscadmin.h"
 #include "storage/fd.h"
 #include "nodes/pg_list.h"
-#include "utils/nabstime.h"
+#include "utils/timestamp.h"
 
 
 int
@@ -149,19 +149,13 @@ md5_crypt_verify(const Port *port, const char *role, char *client_pass)
 		else
 		{
 			TimestampTz vuntil;
-			AbsoluteTime sec;
-			int			usec;
-			TimestampTz curtime;
 
 			vuntil = DatumGetTimestampTz(DirectFunctionCall3(timestamptz_in,
 								CStringGetDatum(valuntil),
 								ObjectIdGetDatum(InvalidOid),
 								Int32GetDatum(-1)));
 
-			sec = GetCurrentAbsoluteTimeUsec(&usec);
-			curtime = AbsoluteTimeUsecToTimestampTz(sec, usec);
-
-			if (vuntil < curtime)
+			if (vuntil < GetCurrentTimestamp())
 				retval = STATUS_ERROR;
 			else
 				retval = STATUS_OK;
diff --git a/src/backend/postmaster/pgstat.c b/src/backend/postmaster/pgstat.c
index b429275d9f65041ece7982b49c0e4769019771e4..86b873ab36b3b528b471b9a172868824a45968b4 100644
--- a/src/backend/postmaster/pgstat.c
+++ b/src/backend/postmaster/pgstat.c
@@ -13,7 +13,7 @@
  *
  *	Copyright (c) 2001-2005, PostgreSQL Global Development Group
  *
- *	$PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.97 2005/06/28 05:08:59 tgl Exp $
+ *	$PostgreSQL: pgsql/src/backend/postmaster/pgstat.c,v 1.98 2005/06/29 22:51:55 tgl Exp $
  * ----------
  */
 #include "postgres.h"
@@ -2026,10 +2026,8 @@ pgstat_add_backend(PgStat_MsgHdr *msg)
 
 	/* Put this new backend into the slot */
 	beentry->procpid = msg->m_procpid;
-	beentry->start_sec = 
-		GetCurrentAbsoluteTimeUsec(&beentry->start_usec);
-	beentry->activity_start_sec = 0;
-	beentry->activity_start_usec = 0;
+	beentry->start_timestamp = GetCurrentTimestamp();
+	beentry->activity_start_timestamp = 0;
 	beentry->activity[0] = '\0';
 
 	/*
@@ -2665,8 +2663,7 @@ pgstat_recv_activity(PgStat_MsgActivity *msg, int len)
 
 	StrNCpy(entry->activity, msg->m_what, PGSTAT_ACTIVITY_SIZE);
 
-	entry->activity_start_sec =
-		GetCurrentAbsoluteTimeUsec(&entry->activity_start_usec);
+	entry->activity_start_timestamp = GetCurrentTimestamp();
 }
 
 
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index 27b28b89f544e6e9259d21df47619220694d6535..c1ac2ed59772823790f83ed694a51db0e69aea65 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -37,7 +37,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.455 2005/06/28 05:08:59 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.456 2005/06/29 22:51:55 tgl Exp $
  *
  * NOTES
  *
@@ -118,6 +118,7 @@
 #include "storage/proc.h"
 #include "tcop/tcopprot.h"
 #include "utils/builtins.h"
+#include "utils/datetime.h"
 #include "utils/guc.h"
 #include "utils/memutils.h"
 #include "utils/ps_status.h"
@@ -222,9 +223,6 @@ static bool FatalError = false; /* T if recovering from backend crash */
 bool		ClientAuthInProgress = false;		/* T during new-client
 												 * authentication */
 
-/* Backend startup time */
-TimestampTz	StartTime;
-
 /*
  * State for assigning random salts and cancel keys.
  * Also, the global MyCancelKey passes the cancel key assigned to a given
@@ -333,7 +331,7 @@ typedef struct
 	InheritableSocket pgStatPipe0;
 	InheritableSocket pgStatPipe1;
 	pid_t PostmasterPid;
-	TimestampTz StartTime;
+	TimestampTz PgStartTime;
 #ifdef WIN32
 	HANDLE PostmasterHandle;
 	HANDLE initial_signal_pipe;
@@ -376,9 +374,6 @@ PostmasterMain(int argc, char *argv[])
 	char	   *userDoption = NULL;
 	int			i;
 
-	AbsoluteTime		StartTimeSec;	/* integer part */
-	int			StartTimeUSec;	/* microsecond part */
-
 	/* This will call exit() if strdup() fails. */
 	progname = get_progname(argv[0]);	
 
@@ -922,10 +917,9 @@ PostmasterMain(int argc, char *argv[])
 	StartupPID = StartupDataBase();
 
 	/*
-	 * Get start up time
+	 * Remember postmaster startup time
 	 */
-	StartTimeSec = GetCurrentAbsoluteTimeUsec(&StartTimeUSec);
-	StartTime = AbsoluteTimeUsecToTimestampTz(StartTimeSec, StartTimeUSec);
+	PgStartTime = GetCurrentTimestamp();
 
 	status = ServerLoop();
 
@@ -3613,7 +3607,7 @@ save_backend_variables(BackendParameters *param, Port *port,
 	write_inheritable_socket(&param->pgStatPipe1, pgStatPipe[1], childPid);
 
 	param->PostmasterPid = PostmasterPid;
-	param->StartTime = StartTime;
+	param->PgStartTime = PgStartTime;
 
 #ifdef WIN32
 	param->PostmasterHandle = PostmasterHandle;
@@ -3816,7 +3810,7 @@ restore_backend_variables(BackendParameters *param, Port *port)
 	read_inheritable_socket(&pgStatPipe[1], &param->pgStatPipe1);
 
 	PostmasterPid = param->PostmasterPid;
-	StartTime = param->StartTime;
+	PgStartTime = param->PgStartTime;
 
 #ifdef WIN32
 	PostmasterHandle = param->PostmasterHandle;
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index a676edd9a971b3de3f7e3704a701dbe38319ec81..534e4796611c1c8aa94f089ddbc7fd05e07aca27 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.450 2005/06/22 17:45:45 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.451 2005/06/29 22:51:55 tgl Exp $
  *
  * NOTES
  *	  this is the "main" module of the postgres backend and
@@ -149,9 +149,6 @@ static int	UseNewLine = 0;		/* Use EOF as query delimiters */
 #endif   /* TCOP_DONTUSENEWLINE */
 
 
-/* Backend startup time */
-TimestampTz	StartTime;
-
 /* ----------------------------------------------------------------
  *		decls for routines only used in this file
  * ----------------------------------------------------------------
@@ -2373,9 +2370,6 @@ PostgresMain(int argc, char *argv[], const char *username)
 	sigjmp_buf	local_sigjmp_buf;
 	volatile bool send_rfq = true;
 
-	AbsoluteTime            StartTimeSec;   /* integer part */
-      int                     StartTimeUSec;  /* microsecond part */
-
 #define PendingConfigOption(name,val) \
 	(guc_names = lappend(guc_names, pstrdup(name)), \
 	 guc_values = lappend(guc_values, pstrdup(val)))
@@ -2966,13 +2960,10 @@ PostgresMain(int argc, char *argv[], const char *username)
 	pgstat_bestart();
 
 	/*
-	 * Get stand-alone backend startup time
+	 * Remember stand-alone backend startup time
 	 */
 	if (!IsUnderPostmaster)
-	{
-		StartTimeSec = GetCurrentAbsoluteTimeUsec(&StartTimeUSec);
-		StartTime = AbsoluteTimeUsecToTimestampTz(StartTimeSec, StartTimeUSec);
-	}
+		PgStartTime = GetCurrentTimestamp();
 
 	/*
 	 * POSTGRES main processing loop begins here
diff --git a/src/backend/utils/adt/datetime.c b/src/backend/utils/adt/datetime.c
index 260c8abb3416a49b64f934f792a19a0256ef6a4d..6ac81b2fa568c1890944f4fcc6af978a6df01042 100644
--- a/src/backend/utils/adt/datetime.c
+++ b/src/backend/utils/adt/datetime.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/utils/adt/datetime.c,v 1.150 2005/05/27 21:31:23 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/backend/utils/adt/datetime.c,v 1.151 2005/06/29 22:51:56 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -20,6 +20,7 @@
 #include <limits.h>
 #include <math.h>
 
+#include "access/xact.h"
 #include "miscadmin.h"
 #include "utils/datetime.h"
 #include "utils/guc.h"
@@ -674,6 +675,41 @@ j2day(int date)
 }	/* j2day() */
 
 
+/*
+ * GetCurrentDateTime()
+ *
+ * Get the transaction start time ("now()") broken down as a struct pg_tm.
+ */
+void
+GetCurrentDateTime(struct pg_tm * tm)
+{
+	int			tz;
+	fsec_t		fsec;
+
+	timestamp2tm(GetCurrentTransactionStartTimestamp(), &tz, tm, &fsec,
+				 NULL, NULL);
+	/* Note: don't pass NULL tzp to timestamp2tm; affects behavior */
+}
+
+/*
+ * GetCurrentTimeUsec()
+ *
+ * Get the transaction start time ("now()") broken down as a struct pg_tm,
+ * including fractional seconds and timezone offset.
+ */
+void
+GetCurrentTimeUsec(struct pg_tm * tm, fsec_t *fsec, int *tzp)
+{
+	int			tz;
+
+	timestamp2tm(GetCurrentTransactionStartTimestamp(), &tz, tm, fsec,
+				 NULL, NULL);
+	/* Note: don't pass NULL tzp to timestamp2tm; affects behavior */
+	if (tzp != NULL)
+		*tzp = tz;
+}
+
+
 /* TrimTrailingZeros()
  * ... resulting from printing numbers with full precision.
  */
diff --git a/src/backend/utils/adt/nabstime.c b/src/backend/utils/adt/nabstime.c
index d712d9f8b46e42b9118bd9cae39381b0894b8236..dfbb982521f2741ba90401260917c6da88e5d7c3 100644
--- a/src/backend/utils/adt/nabstime.c
+++ b/src/backend/utils/adt/nabstime.c
@@ -10,7 +10,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/utils/adt/nabstime.c,v 1.133 2005/06/15 00:34:08 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/backend/utils/adt/nabstime.c,v 1.134 2005/06/29 22:51:56 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -27,7 +27,7 @@
 #include "miscadmin.h"
 #include "pgtime.h"
 #include "utils/builtins.h"
-#include "utils/timestamp.h"
+#include "utils/nabstime.h"
 
 #define MIN_DAYNUM -24856		/* December 13, 1901 */
 #define MAX_DAYNUM 24854		/* January 18, 2038 */
@@ -99,84 +99,6 @@ GetCurrentAbsoluteTime(void)
 }
 
 
-/*
- * GetCurrentAbsoluteTimeUsec()
- *
- * Get the current system time (relative to Unix epoch), including fractional
- * seconds expressed as microseconds.
- */
-AbsoluteTime
-GetCurrentAbsoluteTimeUsec(int *usec)
-{
-	time_t		now;
-	struct timeval tp;
-
-	gettimeofday(&tp, NULL);
-	now = tp.tv_sec;
-	*usec = tp.tv_usec;
-	return (AbsoluteTime) now;
-}
-
-
-/*
- * AbsoluteTimeUsecToTimestampTz()
- *
- * Convert system time including microseconds to TimestampTz representation.
- */
-TimestampTz
-AbsoluteTimeUsecToTimestampTz(AbsoluteTime sec, int usec)
-{
-	TimestampTz result;
-
-#ifdef HAVE_INT64_TIMESTAMP
-	result = ((sec - ((POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * SECS_PER_DAY))
-			  * USECS_PER_SEC) + usec;
-#else
-	result = sec - ((POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * SECS_PER_DAY)
-		+ (usec / 1000000.0);
-#endif
-
-	return result;
-}
-
-
-/*
- * GetCurrentDateTime()
- *
- * Get the transaction start time ("now()") broken down as a struct pg_tm.
- */
-void
-GetCurrentDateTime(struct pg_tm * tm)
-{
-	int			tz;
-
-	abstime2tm(GetCurrentTransactionStartTime(), &tz, tm, NULL);
-}
-
-/*
- * GetCurrentTimeUsec()
- *
- * Get the transaction start time ("now()") broken down as a struct pg_tm,
- * including fractional seconds and timezone offset.
- */
-void
-GetCurrentTimeUsec(struct pg_tm * tm, fsec_t *fsec, int *tzp)
-{
-	int			tz;
-	int			usec;
-
-	abstime2tm(GetCurrentTransactionStartTimeUsec(&usec), &tz, tm, NULL);
-	/* Note: don't pass NULL tzp to abstime2tm; affects behavior */
-	if (tzp != NULL)
-		*tzp = tz;
-#ifdef HAVE_INT64_TIMESTAMP
-	*fsec = usec;
-#else
-	*fsec = usec / 1000000.0;
-#endif
-}
-
-
 void
 abstime2tm(AbsoluteTime _time, int *tzp, struct pg_tm * tm, char **tzn)
 {
@@ -458,15 +380,6 @@ abstime_cmp_internal(AbsoluteTime a, AbsoluteTime b)
 	if (b == INVALID_ABSTIME)
 		return -1;				/* non-INVALID < INVALID */
 
-#if 0
-	/* CURRENT is no longer stored internally... */
-	/* XXX this is broken, should go away: */
-	if (a == CURRENT_ABSTIME)
-		a = GetCurrentTransactionStartTime();
-	if (b == CURRENT_ABSTIME)
-		b = GetCurrentTransactionStartTime();
-#endif
-
 	if (a > b)
 		return 1;
 	else if (a == b)
diff --git a/src/backend/utils/adt/pgstatfuncs.c b/src/backend/utils/adt/pgstatfuncs.c
index 870513fb9d512a98f413406f2a64e0b05614ce2b..b1bd11c9c2013b3b5aa2e3b9feec6fa563c587ed 100644
--- a/src/backend/utils/adt/pgstatfuncs.c
+++ b/src/backend/utils/adt/pgstatfuncs.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/utils/adt/pgstatfuncs.c,v 1.23 2005/06/28 05:09:00 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/utils/adt/pgstatfuncs.c,v 1.24 2005/06/29 22:51:56 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -341,13 +341,9 @@ pg_stat_get_backend_activity(PG_FUNCTION_ARGS)
 Datum
 pg_stat_get_backend_activity_start(PG_FUNCTION_ARGS)
 {
-	PgStat_StatBeEntry *beentry;
-	int32		beid;
-	AbsoluteTime sec;
-	int			usec;
+	int32		beid = PG_GETARG_INT32(0);
 	TimestampTz result;
-
-	beid = PG_GETARG_INT32(0);
+	PgStat_StatBeEntry *beentry;
 
 	if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
 		PG_RETURN_NULL();
@@ -355,31 +351,24 @@ pg_stat_get_backend_activity_start(PG_FUNCTION_ARGS)
 	if (!superuser() && beentry->userid != GetUserId())
 		PG_RETURN_NULL();
 
-	sec = beentry->activity_start_sec;
-	usec = beentry->activity_start_usec;
+	result = beentry->activity_start_timestamp;
 
 	/*
 	 * No time recorded for start of current query -- this is the case if
 	 * the user hasn't enabled query-level stats collection.
 	 */
-	if (sec == 0 && usec == 0)
+	if (result == 0)
 		PG_RETURN_NULL();
 
-	result = AbsoluteTimeUsecToTimestampTz(sec, usec);
-
 	PG_RETURN_TIMESTAMPTZ(result);
 }
 
 Datum
 pg_stat_get_backend_start(PG_FUNCTION_ARGS)
 {
-	PgStat_StatBeEntry *beentry;
-	int32       beid;
-	AbsoluteTime sec;
-	int         usec;
+	int32       beid = PG_GETARG_INT32(0);
 	TimestampTz result;
-
-	beid = PG_GETARG_INT32(0);
+	PgStat_StatBeEntry *beentry;
 
 	if ((beentry = pgstat_fetch_stat_beentry(beid)) == NULL)
 		PG_RETURN_NULL();
@@ -387,14 +376,11 @@ pg_stat_get_backend_start(PG_FUNCTION_ARGS)
 	if (!superuser() && beentry->userid != GetUserId())
 		PG_RETURN_NULL();
 
-	sec = beentry->start_sec;
-	usec = beentry->start_usec;
+	result = beentry->start_timestamp;
 
-	if (sec == 0 && usec == 0)
+	if (result == 0)			/* probably can't happen? */
 		PG_RETURN_NULL();
 
-	result = AbsoluteTimeUsecToTimestampTz(sec, usec);
-
 	PG_RETURN_TIMESTAMPTZ(result);
 }
 
diff --git a/src/backend/utils/adt/selfuncs.c b/src/backend/utils/adt/selfuncs.c
index 204d37bf4157b6343e4d6b243888c26fffe6e0ec..e8120d4e7b99ee0531aea968d588ac486fba03ac 100644
--- a/src/backend/utils/adt/selfuncs.c
+++ b/src/backend/utils/adt/selfuncs.c
@@ -15,7 +15,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/utils/adt/selfuncs.c,v 1.182 2005/06/13 23:14:48 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/backend/utils/adt/selfuncs.c,v 1.183 2005/06/29 22:51:56 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -105,6 +105,7 @@
 #include "utils/datum.h"
 #include "utils/int8.h"
 #include "utils/lsyscache.h"
+#include "utils/nabstime.h"
 #include "utils/pg_locale.h"
 #include "utils/selfuncs.h"
 #include "utils/syscache.h"
diff --git a/src/backend/utils/adt/timestamp.c b/src/backend/utils/adt/timestamp.c
index 035a422bfcc33361afb4ef2769e4107c434a7096..f9f4ec24b1a935baee90e1a6a277e270fcffd54b 100644
--- a/src/backend/utils/adt/timestamp.c
+++ b/src/backend/utils/adt/timestamp.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/backend/utils/adt/timestamp.c,v 1.126 2005/06/15 00:34:09 momjian Exp $
+ *	  $PostgreSQL: pgsql/src/backend/utils/adt/timestamp.c,v 1.127 2005/06/29 22:51:56 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -28,6 +28,8 @@
 #include "parser/scansup.h"
 #include "utils/array.h"
 #include "utils/builtins.h"
+#include "utils/datetime.h"
+
 
 /*
  * gcc's -ffast-math switch breaks routines that expect exact results from
@@ -38,6 +40,10 @@
 #endif
 
 
+/* Set at postmaster start */
+TimestampTz PgStartTime;
+
+
 #ifdef HAVE_INT64_TIMESTAMP
 static int64 time2t(const int hour, const int min, const int sec, const fsec_t fsec);
 
@@ -927,21 +933,39 @@ EncodeSpecialTimestamp(Timestamp dt, char *str)
 Datum
 now(PG_FUNCTION_ARGS)
 {
-	TimestampTz result;
-	AbsoluteTime sec;
-	int			usec;
-
-	sec = GetCurrentTransactionStartTimeUsec(&usec);
-
-	result = AbsoluteTimeUsecToTimestampTz(sec, usec);
-
-	PG_RETURN_TIMESTAMPTZ(result);
+	PG_RETURN_TIMESTAMPTZ(GetCurrentTransactionStartTimestamp());
 }
 
 Datum
 pgsql_postmaster_start_time(PG_FUNCTION_ARGS)
 {
-	PG_RETURN_TIMESTAMPTZ(StartTime);
+	PG_RETURN_TIMESTAMPTZ(PgStartTime);
+}
+
+/*
+ * GetCurrentTimestamp -- get the current operating system time
+ *
+ * Result is in the form of a TimestampTz value, and is expressed to the
+ * full precision of the gettimeofday() syscall
+ */
+TimestampTz
+GetCurrentTimestamp(void)
+{
+	TimestampTz result;
+	struct timeval tp;
+
+	gettimeofday(&tp, NULL);
+
+	result = tp.tv_sec -
+		((POSTGRES_EPOCH_JDATE - UNIX_EPOCH_JDATE) * SECS_PER_DAY);
+
+#ifdef HAVE_INT64_TIMESTAMP
+	result = (result * USECS_PER_SEC) + tp.tv_usec;
+#else
+	result = result + (tp.tv_usec / 1000000.0);
+#endif
+
+	return result;
 }
 
 void
diff --git a/src/include/access/xact.h b/src/include/access/xact.h
index 0c6b5580688e666b3e308a025d1101b6e90f423d..ae5722ecb4b97a1a38a9823dc1d42b7ccfa5c9eb 100644
--- a/src/include/access/xact.h
+++ b/src/include/access/xact.h
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/access/xact.h,v 1.77 2005/06/17 22:32:48 tgl Exp $
+ * $PostgreSQL: pgsql/src/include/access/xact.h,v 1.78 2005/06/29 22:51:57 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -17,7 +17,7 @@
 #include "access/xlog.h"
 #include "storage/relfilenode.h"
 #include "nodes/pg_list.h"
-#include "utils/nabstime.h"
+#include "utils/timestamp.h"
 
 
 /*
@@ -140,8 +140,7 @@ extern TransactionId GetCurrentTransactionId(void);
 extern TransactionId GetCurrentTransactionIdIfAny(void);
 extern SubTransactionId GetCurrentSubTransactionId(void);
 extern CommandId GetCurrentCommandId(void);
-extern AbsoluteTime GetCurrentTransactionStartTime(void);
-extern AbsoluteTime GetCurrentTransactionStartTimeUsec(int *usec);
+extern TimestampTz GetCurrentTransactionStartTimestamp(void);
 extern int	GetCurrentTransactionNestLevel(void);
 extern bool TransactionIdIsCurrentTransactionId(TransactionId xid);
 extern void CommandCounterIncrement(void);
diff --git a/src/include/pgstat.h b/src/include/pgstat.h
index b6015f536c0c5282c8c90c71d32d531e7f3e36a5..5612d9129097551b8a4998c817a57004dfdbcbe0 100644
--- a/src/include/pgstat.h
+++ b/src/include/pgstat.h
@@ -5,7 +5,7 @@
  *
  *	Copyright (c) 2001-2005, PostgreSQL Global Development Group
  *
- *	$PostgreSQL: pgsql/src/include/pgstat.h,v 1.31 2005/06/28 05:09:04 tgl Exp $
+ *	$PostgreSQL: pgsql/src/include/pgstat.h,v 1.32 2005/06/29 22:51:57 tgl Exp $
  * ----------
  */
 #ifndef PGSTAT_H
@@ -13,8 +13,8 @@
 
 #include "libpq/pqcomm.h"
 #include "utils/hsearch.h"
-#include "utils/nabstime.h"
 #include "utils/rel.h"
+#include "utils/timestamp.h"
 
 /* ----------
  * The types of backend/postmaster -> collector messages
@@ -233,10 +233,8 @@ typedef struct PgStat_StatBeEntry
 {
 	/* An entry is non-empty iff procpid > 0 */
 	int			procpid;
-	AbsoluteTime start_sec;
-	int         start_usec;
-	AbsoluteTime activity_start_sec;
-	int			activity_start_usec;
+	TimestampTz	start_timestamp;
+	TimestampTz	activity_start_timestamp;
 	char		activity[PGSTAT_ACTIVITY_SIZE];
 
 	/*
diff --git a/src/include/utils/nabstime.h b/src/include/utils/nabstime.h
index 4c7f1fe2d42f3935f0a061d9edefc2e8bd40451d..200004517b72f24e6b32a0ae9a7886f12bcb47df 100644
--- a/src/include/utils/nabstime.h
+++ b/src/include/utils/nabstime.h
@@ -7,7 +7,7 @@
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/utils/nabstime.h,v 1.45 2004/12/31 22:03:46 pgsql Exp $
+ * $PostgreSQL: pgsql/src/include/utils/nabstime.h,v 1.46 2005/06/29 22:51:57 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -162,8 +162,6 @@ extern Datum timeofday(PG_FUNCTION_ARGS);
 
 /* non-fmgr-callable support routines */
 extern AbsoluteTime GetCurrentAbsoluteTime(void);
-extern AbsoluteTime GetCurrentAbsoluteTimeUsec(int *usec);
-extern TimestampTz AbsoluteTimeUsecToTimestampTz(AbsoluteTime sec, int usec);
 extern void abstime2tm(AbsoluteTime time, int *tzp, struct pg_tm * tm, char **tzn);
 
 #endif   /* NABSTIME_H */
diff --git a/src/include/utils/timestamp.h b/src/include/utils/timestamp.h
index 7475dacbe7c0532cbff949076f813bdeb71f2cd6..1cd591326c748c0917ffac8b9879e8bf232c7a8d 100644
--- a/src/include/utils/timestamp.h
+++ b/src/include/utils/timestamp.h
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1996-2005, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/utils/timestamp.h,v 1.45 2005/06/15 00:34:10 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/utils/timestamp.h,v 1.46 2005/06/29 22:51:57 tgl Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -156,6 +156,10 @@ typedef double fsec_t;
 #define INTERVAL_RANGE(t) (((t) >> 16) & INTERVAL_RANGE_MASK)
 
 
+/* Set at postmaster start */
+extern TimestampTz PgStartTime;
+
+
 /*
  * timestamp.c prototypes
  */
@@ -258,10 +262,10 @@ extern Datum now(PG_FUNCTION_ARGS);
 
 extern Datum pgsql_postmaster_start_time(PG_FUNCTION_ARGS);
 
-extern TimestampTz StartTime;
-
 /* Internal routines (not fmgr-callable) */
 
+extern TimestampTz GetCurrentTimestamp(void);
+
 extern int	tm2timestamp(struct pg_tm * tm, fsec_t fsec, int *tzp, Timestamp *dt);
 extern int timestamp2tm(Timestamp dt, int *tzp, struct pg_tm * tm,
 			 fsec_t *fsec, char **tzn, pg_tz *attimezone);