diff --git a/doc/src/sgml/ref/pg_receivexlog.sgml b/doc/src/sgml/ref/pg_receivexlog.sgml
index a4c9892..451e6d4 100644
--- a/doc/src/sgml/ref/pg_receivexlog.sgml
+++ b/doc/src/sgml/ref/pg_receivexlog.sgml
@@ -93,16 +93,6 @@ PostgreSQL documentation
      </varlistentry>
 
      <varlistentry>
-      <term><option>--if-not-exists</option></term>
-      <listitem>
-       <para>
-        Do not not error out when <option>--create-slot</option> is specified
-        and a slot with the specified name already exists.
-       </para>
-      </listitem>
-     </varlistentry>
-
-     <varlistentry>
       <term><option>-n</option></term>
       <term><option>--no-loop</option></term>
       <listitem>
@@ -273,7 +263,7 @@ PostgreSQL documentation
       <listitem>
        <para>
         Create a new physical replication slot with the name specified in
-        <option>--slot</option>, then start to stream WAL.
+        <option>--slot</option>, then exit.
        </para>
       </listitem>
      </varlistentry>
diff --git a/doc/src/sgml/ref/pg_recvlogical.sgml b/doc/src/sgml/ref/pg_recvlogical.sgml
index 4eda9eb..3686acf 100644
--- a/doc/src/sgml/ref/pg_recvlogical.sgml
+++ b/doc/src/sgml/ref/pg_recvlogical.sgml
@@ -44,63 +44,6 @@ PostgreSQL documentation
   <title>Options</title>
 
    <para>
-    At least one of the following options must be specified to select an action:
-
-    <variablelist>
-
-     <varlistentry>
-      <term><option>--create-slot</option></term>
-      <listitem>
-       <para>
-        Create a new logical replication slot with the name specified by
-        <option>--slot</option>, using the output plugin specified by
-        <option>--plugin</option>, for the database specified
-        by <option>--dbname</option>.
-       </para>
-      </listitem>
-     </varlistentry>
-
-     <varlistentry>
-      <term><option>--drop-slot</option></term>
-      <listitem>
-       <para>
-        Drop the replication slot with the name specified
-        by <option>--slot</option>, then exit.
-       </para>
-      </listitem>
-     </varlistentry>
-
-     <varlistentry>
-      <term><option>--start</option></term>
-      <listitem>
-       <para>
-        Begin streaming changes from the logical replication slot specified
-        by <option>--slot</option>, continuing until terminated by a
-        signal. If the server side change stream ends with a server shutdown
-        or disconnect, retry in a loop unless
-        <option>--no-loop</option> is specified.
-       </para>
-
-       <para>
-        The stream format is determined by the output plugin specified when
-        the slot was created.
-       </para>
-
-       <para>
-        The connection must be to the same database used to create the slot.
-       </para>
-      </listitem>
-     </varlistentry>
-    </variablelist>
-   </para>
-
-   <para>
-    <option>--create-slot</option> and <option>--start</option> can be
-    specified together.  <option>--drop-slot</option> cannot be combined with
-    another action.
-   </para>
-
-   <para>
     The following command-line options control the location and format of the
     output and other replication behavior:
 
@@ -146,30 +89,20 @@ PostgreSQL documentation
       <term><option>--startpos=<replaceable>lsn</replaceable></option></term>
       <listitem>
        <para>
-        In <option>--start</option> mode, start replication from the given
-        LSN.  For details on the effect of this, see the documentation
-        in <xref linkend="logicaldecoding">
+        Start replication from the given LSN.  For details on the effect of
+        this, see the documentation in <xref linkend="logicaldecoding">
         and <xref linkend="protocol-replication">. Ignored in other modes.
        </para>
       </listitem>
      </varlistentry>
 
      <varlistentry>
-      <term><option>--if-not-exists</option></term>
-      <listitem>
-       <para>
-        Do not not error out when <option>--create-slot</option> is specified
-        and a slot with the specified name already exists.
-       </para>
-      </listitem>
-     </varlistentry>
-
-     <varlistentry>
       <term><option>-n</option></term>
       <term><option>--no-loop</option></term>
       <listitem>
        <para>
-        When the connection to the server is lost, do not retry in a loop, just exit.
+        When the connection to the server is lost, do not retry in a loop,
+        just exit.
        </para>
       </listitem>
      </varlistentry>
@@ -214,7 +147,7 @@ PostgreSQL documentation
       <term><option>--slot=<replaceable>slot_name</replaceable></option></term>
       <listitem>
        <para>
-        In <option>--start</option> mode, use the existing logical replication slot named
+        Use the existing logical replication slot named
         <replaceable>slot_name</replaceable>. In <option>--create-slot</option>
         mode, create the slot with this name. In <option>--drop-slot</option>
         mode, delete the slot with this name.
@@ -328,6 +261,49 @@ PostgreSQL documentation
    </para>
 
    <para>
+    <application>pg_recvlogical</application> can perform one of the two
+    following actions in order to control logical replication slots: 
+
+    <variablelist>
+     <varlistentry>
+      <term><option>--create-slot</option></term>
+      <listitem>
+       <para>
+        Create a new logical replication slot with the name specified by
+        <option>--slot</option>, using the output plugin specified by
+        <option>--plugin</option>, for the database specified
+        by <option>--dbname</option>, then exit.
+       </para>
+      </listitem>
+     </varlistentry>
+
+     <varlistentry>
+      <term><option>--drop-slot</option></term>
+      <listitem>
+       <para>
+        Drop the replication slot with the name specified
+        by <option>--slot</option>, then exit.
+       </para>
+      </listitem>
+     </varlistentry>
+    </variablelist>
+   </para>
+
+   <para>
+    The stream format is determined by the output plugin specified when
+    the slot was created.
+   </para>
+
+   <para>
+    The connection must be to the same database used to create the slot.
+   </para>
+       
+   <para>
+    <option>--create-slot</option> and <option>--drop-slot</option> cannot
+    be combined together.
+   </para>
+
+   <para>
     The following additional options are available:
 
     <variablelist>
diff --git a/src/bin/pg_basebackup/pg_receivexlog.c b/src/bin/pg_basebackup/pg_receivexlog.c
index 00536bd..0fde0f0 100644
--- a/src/bin/pg_basebackup/pg_receivexlog.c
+++ b/src/bin/pg_basebackup/pg_receivexlog.c
@@ -38,7 +38,6 @@ static int	noloop = 0;
 static int	standby_message_timeout = 10 * 1000;		/* 10 sec = default */
 static volatile bool time_to_abort = false;
 static bool do_create_slot = false;
-static bool slot_exists_ok = false;
 static bool do_drop_slot = false;
 static bool synchronous = false;
 
@@ -67,7 +66,6 @@ usage(void)
 	printf(_("  %s [OPTION]...\n"), progname);
 	printf(_("\nOptions:\n"));
 	printf(_("  -D, --directory=DIR    receive transaction log files into this directory\n"));
-	printf(_("      --if-not-exists    do not treat naming conflicts as an error when creating a slot\n"));
 	printf(_("  -n, --no-loop          do not loop on connection lost\n"));
 	printf(_("  -s, --status-interval=SECS\n"
 			 "                         time between status packets sent to server (default: %d)\n"), (standby_message_timeout / 1000));
@@ -373,8 +371,7 @@ main(int argc, char **argv)
 /* action */
 		{"create-slot", no_argument, NULL, 1},
 		{"drop-slot", no_argument, NULL, 2},
-		{"if-not-exists", no_argument, NULL, 3},
-		{"synchronous", no_argument, NULL, 4},
+		{"synchronous", no_argument, NULL, 3},
 		{NULL, 0, NULL, 0}
 	};
 
@@ -458,9 +455,6 @@ main(int argc, char **argv)
 				do_drop_slot = true;
 				break;
 			case 3:
-				slot_exists_ok = true;
-				break;
-			case 4:
 				synchronous = true;
 				break;
 			default:
@@ -508,7 +502,7 @@ main(int argc, char **argv)
 	/*
 	 * Required arguments
 	 */
-	if (basedir == NULL && !do_drop_slot)
+	if (basedir == NULL && !do_drop_slot && !do_create_slot)
 	{
 		fprintf(stderr, _("%s: no target directory specified\n"), progname);
 		fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
@@ -519,7 +513,7 @@ main(int argc, char **argv)
 	/*
 	 * Check existence of destination folder.
 	 */
-	if (!do_drop_slot)
+	if (!do_drop_slot && !do_create_slot)
 	{
 		DIR		   *dir = get_destination_dir(basedir);
 
@@ -581,9 +575,9 @@ main(int argc, char **argv)
 					_("%s: creating replication slot \"%s\"\n"),
 					progname, replication_slot);
 
-		if (!CreateReplicationSlot(conn, replication_slot, NULL, true,
-								   slot_exists_ok))
+		if (!CreateReplicationSlot(conn, replication_slot, NULL, true))
 			disconnect_and_exit(1);
+		disconnect_and_exit(0);
 	}
 
 	/*
diff --git a/src/bin/pg_basebackup/pg_recvlogical.c b/src/bin/pg_basebackup/pg_recvlogical.c
index f189f71..573fe7a 100644
--- a/src/bin/pg_basebackup/pg_recvlogical.c
+++ b/src/bin/pg_basebackup/pg_recvlogical.c
@@ -38,8 +38,6 @@ static int	standby_message_timeout = 10 * 1000;		/* 10 sec = default */
 static int	fsync_interval = 10 * 1000; /* 10 sec = default */
 static XLogRecPtr startpos = InvalidXLogRecPtr;
 static bool do_create_slot = false;
-static bool slot_exists_ok = false;
-static bool do_start_slot = false;
 static bool do_drop_slot = false;
 
 /* filled pairwise with option, value. value may be NULL */
@@ -68,15 +66,10 @@ usage(void)
 		   progname);
 	printf(_("Usage:\n"));
 	printf(_("  %s [OPTION]...\n"), progname);
-	printf(_("\nAction to be performed:\n"));
-	printf(_("      --create-slot      create a new replication slot (for the slot's name see --slot)\n"));
-	printf(_("      --drop-slot        drop the replication slot (for the slot's name see --slot)\n"));
-	printf(_("      --start            start streaming in a replication slot (for the slot's name see --slot)\n"));
 	printf(_("\nOptions:\n"));
 	printf(_("  -f, --file=FILE        receive log into this file, - for stdout\n"));
 	printf(_("  -F  --fsync-interval=SECS\n"
 			 "                         time between fsyncs to the output file (default: %d)\n"), (fsync_interval / 1000));
-	printf(_("      --if-not-exists    do not treat naming conflicts as an error when creating a slot\n"));
 	printf(_("  -I, --startpos=LSN     where in an existing slot should the streaming start\n"));
 	printf(_("  -n, --no-loop          do not loop on connection lost\n"));
 	printf(_("  -o, --option=NAME[=VALUE]\n"
@@ -96,6 +89,9 @@ usage(void)
 	printf(_("  -U, --username=NAME    connect as specified database user\n"));
 	printf(_("  -w, --no-password      never prompt for password\n"));
 	printf(_("  -W, --password         force password prompt (should happen automatically)\n"));
+	printf(_("\nOptional actions:\n"));
+	printf(_("      --create-slot      create a new replication slot (for the slot's name see --slot)\n"));
+	printf(_("      --drop-slot        drop the replication slot (for the slot's name see --slot)\n"));
 	printf(_("\nReport bugs to <pgsql-bugs@postgresql.org>.\n"));
 }
 
@@ -633,9 +629,7 @@ main(int argc, char **argv)
 		{"slot", required_argument, NULL, 'S'},
 /* action */
 		{"create-slot", no_argument, NULL, 1},
-		{"start", no_argument, NULL, 2},
-		{"drop-slot", no_argument, NULL, 3},
-		{"if-not-exists", no_argument, NULL, 4},
+		{"drop-slot", no_argument, NULL, 2},
 		{NULL, 0, NULL, 0}
 	};
 	int			c;
@@ -762,14 +756,8 @@ main(int argc, char **argv)
 				do_create_slot = true;
 				break;
 			case 2:
-				do_start_slot = true;
-				break;
-			case 3:
 				do_drop_slot = true;
 				break;
-			case 4:
-				slot_exists_ok = true;
-				break;
 
 			default:
 
@@ -806,7 +794,7 @@ main(int argc, char **argv)
 		exit(1);
 	}
 
-	if (do_start_slot && outfile == NULL)
+	if (outfile == NULL && !do_drop_slot && !do_create_slot)
 	{
 		fprintf(stderr, _("%s: no target file specified\n"), progname);
 		fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
@@ -822,17 +810,9 @@ main(int argc, char **argv)
 		exit(1);
 	}
 
-	if (!do_drop_slot && !do_create_slot && !do_start_slot)
-	{
-		fprintf(stderr, _("%s: at least one action needs to be specified\n"), progname);
-		fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
-				progname);
-		exit(1);
-	}
-
-	if (do_drop_slot && (do_create_slot || do_start_slot))
+	if (do_drop_slot && do_create_slot)
 	{
-		fprintf(stderr, _("%s: cannot use --create-slot or --start together with --drop-slot\n"), progname);
+		fprintf(stderr, _("%s: cannot use --create-slot together with --drop-slot\n"), progname);
 		fprintf(stderr, _("Try \"%s --help\" for more information.\n"),
 				progname);
 		exit(1);
@@ -886,6 +866,7 @@ main(int argc, char **argv)
 
 		if (!DropReplicationSlot(conn, replication_slot))
 			disconnect_and_exit(1);
+		disconnect_and_exit(0);
 	}
 
 	/* Create a replication slot. */
@@ -896,14 +877,10 @@ main(int argc, char **argv)
 					_("%s: creating replication slot \"%s\"\n"),
 					progname, replication_slot);
 
-		if (!CreateReplicationSlot(conn, replication_slot, plugin,
-								   false, slot_exists_ok))
+		if (!CreateReplicationSlot(conn, replication_slot, plugin, false))
 			disconnect_and_exit(1);
-		startpos = InvalidXLogRecPtr;
-	}
-
-	if (!do_start_slot)
 		disconnect_and_exit(0);
+	}
 
 	/* Stream loop */
 	while (true)
diff --git a/src/bin/pg_basebackup/streamutil.c b/src/bin/pg_basebackup/streamutil.c
index 91f919c..d61899c 100644
--- a/src/bin/pg_basebackup/streamutil.c
+++ b/src/bin/pg_basebackup/streamutil.c
@@ -316,7 +316,7 @@ RunIdentifySystem(PGconn *conn, char **sysid, TimeLineID *starttli,
  */
 bool
 CreateReplicationSlot(PGconn *conn, const char *slot_name, const char *plugin,
-					  bool is_physical, bool slot_exists_ok)
+					  bool is_physical)
 {
 	PQExpBuffer query;
 	PGresult   *res;
@@ -340,21 +340,12 @@ CreateReplicationSlot(PGconn *conn, const char *slot_name, const char *plugin,
 	{
 		const char *sqlstate = PQresultErrorField(res, PG_DIAG_SQLSTATE);
 
-		if (slot_exists_ok && strcmp(sqlstate, ERRCODE_DUPLICATE_OBJECT) == 0)
-		{
-			destroyPQExpBuffer(query);
-			PQclear(res);
-			return true;
-		}
-		else
-		{
-			fprintf(stderr, _("%s: could not send replication command \"%s\": %s"),
-					progname, query->data, PQerrorMessage(conn));
+		fprintf(stderr, _("%s: could not send replication command \"%s\": %s"),
+				progname, query->data, PQerrorMessage(conn));
 
-			destroyPQExpBuffer(query);
-			PQclear(res);
-			return false;
-		}
+		destroyPQExpBuffer(query);
+		PQclear(res);
+		return false;
 	}
 
 	if (PQntuples(res) != 1 || PQnfields(res) != 4)
diff --git a/src/bin/pg_basebackup/streamutil.h b/src/bin/pg_basebackup/streamutil.h
index b95f83f..6d5e88d 100644
--- a/src/bin/pg_basebackup/streamutil.h
+++ b/src/bin/pg_basebackup/streamutil.h
@@ -32,8 +32,7 @@ extern PGconn *GetConnection(void);
 
 /* Replication commands */
 extern bool CreateReplicationSlot(PGconn *conn, const char *slot_name,
-					  const char *plugin, bool is_physical,
-					  bool slot_exists_ok);
+								  const char *plugin, bool is_physical);
 extern bool DropReplicationSlot(PGconn *conn, const char *slot_name);
 extern bool RunIdentifySystem(PGconn *conn, char **sysid,
 				  TimeLineID *starttli,
