diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c
index 98ad33866be2878a8c9e03f7d60d7f3aa74838a2..90e5c2b96c42c096b420382f18da9876a494e0cc 100644
--- a/src/backend/bootstrap/bootstrap.c
+++ b/src/backend/bootstrap/bootstrap.c
@@ -8,7 +8,7 @@
  * Portions Copyright (c) 1994, Regents of the University of California
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/bootstrap/bootstrap.c,v 1.135 2002/08/02 22:36:05 tgl Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/bootstrap/bootstrap.c,v 1.136 2002/08/04 06:26:38 thomas Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -223,6 +223,7 @@ BootstrapMain(int argc, char *argv[])
 	int			flag;
 	int			xlogop = BS_XLOG_NOP;
 	char	   *potential_DataDir = NULL;
+	char	   *potential_XLogDir = NULL;
 
 	/*
 	 * initialize globals
@@ -250,17 +251,22 @@ BootstrapMain(int argc, char *argv[])
 	if (!IsUnderPostmaster)
 	{
 		InitializeGUCOptions();
-		potential_DataDir = getenv("PGDATA");	/* Null if no PGDATA
-												 * variable */
+		/* Null if no PGDATA variable */
+		potential_DataDir = getenv("PGDATA");
+		/* Null if no PGXLOG variable */
+		potential_XLogDir = getenv("PGXLOG");
 	}
 
-	while ((flag = getopt(argc, argv, "B:d:D:Fo:px:")) != -1)
+	while ((flag = getopt(argc, argv, "B:d:D:X:Fo:px:")) != -1)
 	{
 		switch (flag)
 		{
 			case 'D':
 				potential_DataDir = optarg;
 				break;
+			case 'X':
+				potential_XLogDir = optarg;
+				break;
 			case 'd':
 			{
 				/* Turn on debugging for the bootstrap process. */
@@ -315,6 +321,7 @@ BootstrapMain(int argc, char *argv[])
 			proc_exit(1);
 		}
 		SetDataDir(potential_DataDir);
+		SetXLogDir(potential_XLogDir);
 	}
 
 	/* Validate we have been given a reasonable-looking DataDir */
diff --git a/src/backend/postmaster/postmaster.c b/src/backend/postmaster/postmaster.c
index f84bf27e92ba2778bfd206c6f92a09432371d8ca..acc4d0090b229f298aaa9b8f3c3cd8eda21632ba 100644
--- a/src/backend/postmaster/postmaster.c
+++ b/src/backend/postmaster/postmaster.c
@@ -37,7 +37,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.281 2002/07/13 01:02:14 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.282 2002/08/04 06:26:38 thomas Exp $
  *
  * NOTES
  *
@@ -347,6 +347,7 @@ PostmasterMain(int argc, char *argv[])
 	int			status;
 	char		original_extraoptions[MAXPGPATH];
 	char	   *potential_DataDir = NULL;
+	char	   *potential_XLogDir = NULL;
 
 	*original_extraoptions = '\0';
 
@@ -405,10 +406,11 @@ PostmasterMain(int argc, char *argv[])
 	InitializeGUCOptions();
 
 	potential_DataDir = getenv("PGDATA");		/* default value */
+	potential_XLogDir = getenv("PGXLOG");		/* default value */
 
 	opterr = 1;
 
-	while ((opt = getopt(argc, argv, "A:a:B:b:c:D:d:Fh:ik:lm:MN:no:p:Ss-:")) != -1)
+	while ((opt = getopt(argc, argv, "A:a:B:b:c:D:X:d:Fh:ik:lm:MN:no:p:Ss-:")) != -1)
 	{
 		switch (opt)
 		{
@@ -431,6 +433,9 @@ PostmasterMain(int argc, char *argv[])
 			case 'D':
 				potential_DataDir = optarg;
 				break;
+			case 'X':
+				potential_XLogDir = optarg;
+				break;
 			case 'd':
 			{
 				/* Turn on debugging for the postmaster. */
@@ -565,6 +570,7 @@ PostmasterMain(int argc, char *argv[])
 
 	checkDataDir(potential_DataDir);	/* issues error messages */
 	SetDataDir(potential_DataDir);
+	SetXLogDir(potential_XLogDir);
 
 	ProcessConfigFile(PGC_POSTMASTER);
 
diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c
index 976d366fe78472f1293dad4019f237702c489da8..d117f844603b170a1c73446abf0af9daf57a0c18 100644
--- a/src/backend/tcop/postgres.c
+++ b/src/backend/tcop/postgres.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.277 2002/08/04 04:31:44 momjian Exp $
+ *	  $Header: /cvsroot/pgsql/src/backend/tcop/postgres.c,v 1.278 2002/08/04 06:26:33 thomas Exp $
  *
  * NOTES
  *	  this is the "main" module of the postgres backend and
@@ -1146,6 +1146,7 @@ PostgresMain(int argc, char *argv[], const char *username)
 	StringInfo	parser_input;
 
 	char	   *potential_DataDir = NULL;
+	char	   *potential_XLogDir = NULL;
 
 	/*
 	 * Catch standard options before doing much else.  This even works on
@@ -1190,6 +1191,7 @@ PostgresMain(int argc, char *argv[], const char *username)
 	{
 		InitializeGUCOptions();
 		potential_DataDir = getenv("PGDATA");
+		potential_XLogDir = getenv("PGXLOG");
 	}
 
 	/* ----------------
@@ -1214,7 +1216,7 @@ PostgresMain(int argc, char *argv[], const char *username)
 	ctx = PGC_POSTMASTER;
 	gucsource = PGC_S_ARGV;		/* initial switches came from command line */
 
-	while ((flag = getopt(argc, argv, "A:B:c:CD:d:Eef:FiNOPo:p:S:st:v:W:x:-:")) != -1)
+	while ((flag = getopt(argc, argv, "A:B:c:CD:X:d:Eef:FiNOPo:p:S:st:v:W:x:-:")) != -1)
 		switch (flag)
 		{
 			case 'A':
@@ -1246,6 +1248,11 @@ PostgresMain(int argc, char *argv[], const char *username)
 					potential_DataDir = optarg;
 				break;
 
+			case 'X':			/* PGXLOG directory */
+				if (secure)
+					potential_XLogDir = optarg;
+				break;
+
 			case 'd':			/* debug level */
 				{
 					/* Set server debugging level. */
@@ -1537,8 +1544,10 @@ PostgresMain(int argc, char *argv[], const char *username)
 			proc_exit(1);
 		}
 		SetDataDir(potential_DataDir);
+		SetXLogDir(potential_XLogDir);
 	}
 	Assert(DataDir);
+	Assert(strlen(XLogDir) > 0);
 
 	/*
 	 * Set up signal handlers and masks.
@@ -1693,7 +1702,7 @@ PostgresMain(int argc, char *argv[], const char *username)
 	if (!IsUnderPostmaster)
 	{
 		puts("\nPOSTGRES backend interactive interface ");
-		puts("$Revision: 1.277 $ $Date: 2002/08/04 04:31:44 $\n");
+		puts("$Revision: 1.278 $ $Date: 2002/08/04 06:26:33 $\n");
 	}
 
 	/*
diff --git a/src/bin/initdb/initdb.sh b/src/bin/initdb/initdb.sh
index 007805992e51e4d9008264b49844a9ffc5b71e63..162a090c307c493e1d74366802c36ffce2f0bcfa 100644
--- a/src/bin/initdb/initdb.sh
+++ b/src/bin/initdb/initdb.sh
@@ -27,7 +27,7 @@
 # Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
 # Portions Copyright (c) 1994, Regents of the University of California
 #
-# $Header: /cvsroot/pgsql/src/bin/initdb/Attic/initdb.sh,v 1.163 2002/07/29 22:14:11 tgl Exp $
+# $Header: /cvsroot/pgsql/src/bin/initdb/Attic/initdb.sh,v 1.164 2002/08/04 06:26:38 thomas Exp $
 #
 #-------------------------------------------------------------------------
 
@@ -252,6 +252,19 @@ do
         -D*)
                 PGDATA=`echo $1 | sed 's/^-D//'`
                 ;;
+# Directory to hold WAL log files.
+        --pgxlog|-X)
+                PGXLOG="$2"
+                defined_pgxlog=yes
+                shift;;
+        --pgxlog=*)
+                PGXLOG=`echo $1 | sed 's/^--pgxlog=//'`
+                defined_pgxlog=yes
+                ;;
+        -X*)
+                PGXLOG=`echo $1 | sed 's/^-X//'`
+                defined_pgxlog=yes
+                ;;
 # The directory where the .bki input files are stored. Normally
 # they are in PREFIX/share and this option should be unnecessary.
         -L)
@@ -341,6 +354,7 @@ if [ "$usage" ]; then
     echo
     echo "Options:"
     echo " [-D, --pgdata] DATADIR       Location for this database cluster"
+    echo " [-X, --pgxlog] XLOGDIR       Location for the cluster transaction logs"
     echo "  -W, --pwprompt              Prompt for a password for the new superuser"
     if [ -n "$MULTIBYTE" ] ; then 
         echo "  -E, --encoding ENCODING     Set default encoding for new databases"
@@ -369,7 +383,7 @@ fi
 if [ "$MULTIBYTE" ]
 then
 	MULTIBYTEID=`$PGPATH/pg_encoding -b $MULTIBYTE`
-        if [ "$?" -ne 0 ]
+	if [ "$?" -ne 0 ]
 	then
               (
                 echo "$CMDNAME: pg_encoding failed"
@@ -401,6 +415,11 @@ then
     exit 1
 fi
 
+if [ -z "$PGXLOG" ]
+then
+    PGXLOG="$PGDATA"/pg_xlog
+fi
+
 
 #-------------------------------------------------------------------------
 # Find the input files
@@ -418,7 +437,7 @@ then
   (
     echo
     echo "initdb variables:"
-    for var in PGDATA datadir PGPATH MULTIBYTE MULTIBYTEID \
+    for var in PGDATA PGXLOG datadir PGPATH MULTIBYTE MULTIBYTEID \
         POSTGRES_SUPERUSERNAME POSTGRES_BKI \
         POSTGRES_DESCR POSTGRESQL_CONF_SAMPLE \
 	PG_HBA_SAMPLE PG_IDENT_SAMPLE ; do
@@ -503,44 +522,61 @@ then
       echo "$CMDNAME: The directory $PGDATA exists but is not empty."
       echo "If you want to create a new database system, either remove or empty"
       echo "the directory $PGDATA or run initdb with"
-      echo "an argument other than $PGDATA."
+      echo "an argument for -D other than $PGDATA."
+    ) 1>&2
+    exit 1
+fi
+
+# find out if transaction log directory is empty
+pgxlog_contents=`ls -A "$PGXLOG" 2>/dev/null`
+if [ x"$pgxlog_contents" != x ]
+then
+    (
+      echo "$CMDNAME: The directory $PGXLOG exists but is not empty."
+      echo "If you want to create a new transaction log, either remove or empty"
+      echo "the directory $PGXLOG or run initdb with"
+      echo "an argument for -X other than $PGXLOG."
     ) 1>&2
     exit 1
+fi
+
+if [ ! -d "$PGDATA" ]; then
+    $ECHO_N "creating directory $PGDATA... "$ECHO_C
+    mkdir -p "$PGDATA" >/dev/null 2>&1 || mkdir "$PGDATA" || exit_nicely
+    made_new_pgdata=yes
 else
-    if [ ! -d "$PGDATA" ]; then
-        $ECHO_N "creating directory $PGDATA... "$ECHO_C
-        mkdir -p "$PGDATA" >/dev/null 2>&1 || mkdir "$PGDATA" || exit_nicely
-        made_new_pgdata=yes
-    else
-        $ECHO_N "Fixing permissions on existing directory $PGDATA... "$ECHO_C
-	chmod go-rwx "$PGDATA" || exit_nicely
-    fi
-    echo "ok"
+    $ECHO_N "Fixing permissions on existing directory $PGDATA... "$ECHO_C
+chmod go-rwx "$PGDATA" || exit_nicely
+fi
+echo "ok"
 
-    if [ ! -d "$PGDATA"/base ]
-	then
-        $ECHO_N "creating directory $PGDATA/base... "$ECHO_C
-        mkdir "$PGDATA"/base || exit_nicely
-	echo "ok"
-    fi
-    if [ ! -d "$PGDATA"/global ]
-    then
-        $ECHO_N "creating directory $PGDATA/global... "$ECHO_C
-        mkdir "$PGDATA"/global || exit_nicely
-	echo "ok"
-    fi
-    if [ ! -d "$PGDATA"/pg_xlog ]
-    then
-        $ECHO_N "creating directory $PGDATA/pg_xlog... "$ECHO_C
-        mkdir "$PGDATA"/pg_xlog || exit_nicely
-	echo "ok"
-    fi
-    if [ ! -d "$PGDATA"/pg_clog ]
-    then
-        $ECHO_N "creating directory $PGDATA/pg_clog... "$ECHO_C
-        mkdir "$PGDATA"/pg_clog || exit_nicely
-	echo "ok"
-    fi
+if [ ! -d "$PGXLOG" ]; then
+    $ECHO_N "creating directory $PGXLOG... "$ECHO_C
+    mkdir -p "$PGXLOG" >/dev/null 2>&1 || mkdir "$PGXLOG" || exit_nicely
+    made_new_pgxlog=yes
+else
+    $ECHO_N "Fixing permissions on existing directory $PGXLOG... "$ECHO_C
+chmod go-rwx "$PGXLOG" || exit_nicely
+fi
+echo "ok"
+
+if [ ! -d "$PGDATA"/base ]
+then
+    $ECHO_N "creating directory $PGDATA/base... "$ECHO_C
+    mkdir "$PGDATA"/base || exit_nicely
+echo "ok"
+fi
+if [ ! -d "$PGDATA"/global ]
+then
+    $ECHO_N "creating directory $PGDATA/global... "$ECHO_C
+    mkdir "$PGDATA"/global || exit_nicely
+echo "ok"
+fi
+if [ ! -d "$PGDATA"/pg_clog ]
+then
+    $ECHO_N "creating directory $PGDATA/pg_clog... "$ECHO_C
+    mkdir "$PGDATA"/pg_clog || exit_nicely
+echo "ok"
 fi
 
 
@@ -549,7 +585,7 @@ fi
 # RUN BKI SCRIPT IN BOOTSTRAP MODE TO CREATE TEMPLATE1
 
 # common backend options
-PGSQL_OPT="-F -D$PGDATA"
+PGSQL_OPT="-F -D$PGDATA -X$PGXLOG"
 
 if [ "$debug" = yes ]
 then
@@ -677,7 +713,6 @@ EOF
     echo "ok"
 fi
 
-
 $ECHO_N "enabling unlimited row size for system tables... "$ECHO_C
 
 "$PGPATH"/postgres $PGSQL_OPT template1 >/dev/null <<EOF
@@ -1058,14 +1093,24 @@ echo "ok"
 #
 # FINISHED
 
+postmaster_startup="$PGPATH/postmaster -D $PGDATA"
+if [ x"$defined_pgxlog" != x ]; then
+    postmaster_startup="$postmaster_startup -X $PGXLOG"
+fi
+pg_ctl_startup="$PGPATH/pg_ctl -D $PGDATA"
+if [ x"$defined_pgxlog" != x ]; then
+    pg_ctl_startup="$pg_ctl_startup -X $PGXLOG"
+fi
+pg_ctl_startup="$pg_ctl_startup -l logfile start"
+
 echo
 echo "Success. You can now start the database server using:"
 echo ""
-echo "    $PGPATH/postmaster -D $PGDATA"
+echo "    $postmaster_startup"
 echo "or"
 # (Advertise -l option here, otherwise we have a background
 #  process writing to the terminal.)
-echo "    $PGPATH/pg_ctl -D $PGDATA -l logfile start"
+echo "    $pg_ctl_startup"
 echo
 
 exit 0
diff --git a/src/bin/pg_ctl/pg_ctl.sh b/src/bin/pg_ctl/pg_ctl.sh
index 618153387861d9f772c61f4bbfd97f80f2a28824..28459274d6c67dca1dddcf7639cc50e25aa6204e 100755
--- a/src/bin/pg_ctl/pg_ctl.sh
+++ b/src/bin/pg_ctl/pg_ctl.sh
@@ -8,7 +8,7 @@
 #
 #
 # IDENTIFICATION
-#    $Header: /cvsroot/pgsql/src/bin/pg_ctl/Attic/pg_ctl.sh,v 1.27 2002/07/19 15:31:42 momjian Exp $
+#    $Header: /cvsroot/pgsql/src/bin/pg_ctl/Attic/pg_ctl.sh,v 1.28 2002/08/04 06:26:38 thomas Exp $
 #
 #-------------------------------------------------------------------------
 
@@ -19,20 +19,23 @@ $CMDNAME is a utility to start, stop, restart, reload configuration files,
 or report the status of a PostgreSQL server.
 
 Usage:
-  $CMDNAME start   [-w] [-D DATADIR] [-s] [-l FILENAME] [-o \"OPTIONS\"]
+  $CMDNAME start   [-w] [-D DATADIR] [-s] [-X PGXLOG] [-l FILENAME] [-o \"OPTIONS\"]
   $CMDNAME stop    [-W] [-D DATADIR] [-s] [-m SHUTDOWN-MODE]
-  $CMDNAME restart [-w] [-D DATADIR] [-s] [-m SHUTDOWN-MODE] [-o \"OPTIONS\"]
+  $CMDNAME restart [-w] [-D DATADIR] [-s] [-X PGXLOG] [-m SHUTDOWN-MODE] [-o \"OPTIONS\"]
   $CMDNAME reload  [-D DATADIR] [-s]
   $CMDNAME status  [-D DATADIR]
 
 Common options:
   -D DATADIR            Location of the database storage area
+  -X XLOGDIR            Location of the WAL log file storage area
   -s                    Only print errors, no informational messages
   -w                    Wait until operation completes
   -W                    Do not wait until operation completes
 (The default is to wait for shutdown, but not for start or restart.)
 
 If the -D option is omitted, the environment variable PGDATA is used.
+If the -X option is omitted, the environment variable PGXLOG is used
+or the postmaster defaults to looking in $PGDATA/pg_xlog.
 
 Options for start or restart:
   -l FILENAME           Write (or append) server log to FILENAME.  The
@@ -132,6 +135,12 @@ do
 	    PGDATA="$1"
 	    export PGDATA
 	    ;;
+	-X)
+	    shift
+	    # pass environment into new postmaster
+	    PGXLOG="$1"
+	    export PGXLOG
+	    ;;
 	-l)
 	    logfile="$2"
 	    shift;;
diff --git a/src/include/access/xlog.h b/src/include/access/xlog.h
index 42241aee82e6243e639b441298049c296298bb97..19ff8dd2ce8cf3b588dcc699d391e35f581eb251 100644
--- a/src/include/access/xlog.h
+++ b/src/include/access/xlog.h
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1996-2002, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $Id: xlog.h,v 1.31 2002/06/20 20:29:43 momjian Exp $
+ * $Id: xlog.h,v 1.32 2002/08/04 06:26:38 thomas Exp $
  */
 #ifndef XLOG_H
 #define XLOG_H
@@ -175,6 +175,9 @@ typedef struct XLogRecData
 	struct XLogRecData *next;
 } XLogRecData;
 
+/* XLOG directory name */
+extern char XLogDir[];
+
 extern StartUpID ThisStartUpID; /* current SUI */
 extern bool InRecovery;
 extern XLogRecPtr MyLastRecPtr;
@@ -189,6 +192,7 @@ extern int	XLOG_DEBUG;
 extern char *XLOG_sync_method;
 extern const char XLOG_sync_method_default[];
 
+extern void SetXLogDir(char *path);
 
 extern XLogRecPtr XLogInsert(RmgrId rmid, uint8 info, XLogRecData *rdata);
 extern void XLogFlush(XLogRecPtr RecPtr);