diff --git a/src/bin/pg_rewind/pg_rewind.c b/src/bin/pg_rewind/pg_rewind.c
index a2d9ca3..15ae30d 100644
--- a/src/bin/pg_rewind/pg_rewind.c
+++ b/src/bin/pg_rewind/pg_rewind.c
@@ -212,40 +212,45 @@ main(int argc, char **argv)
 	 * do.
 	 */
 	if (ControlFile_target.checkPointCopy.ThisTimeLineID == ControlFile_source.checkPointCopy.ThisTimeLineID)
-		pg_fatal("source and target cluster are on the same timeline\n");
-
-	findCommonAncestorTimeline(&divergerec, &lastcommontli);
-	printf(_("servers diverged at WAL position %X/%X on timeline %u\n"),
-		   (uint32) (divergerec >> 32), (uint32) divergerec, lastcommontli);
-
-	/*
-	 * Check for the possibility that the target is in fact a direct ancestor
-	 * of the source. In that case, there is no divergent history in the
-	 * target that needs rewinding.
-	 */
-	if (ControlFile_target.checkPoint >= divergerec)
 	{
-		rewind_needed = true;
+		printf(_("source and target cluster are on the same timeline\n"));
+		rewind_needed = false;
 	}
 	else
 	{
-		XLogRecPtr	chkptendrec;
-
-		/* Read the checkpoint record on the target to see where it ends. */
-		chkptendrec = readOneRecord(datadir_target,
-									ControlFile_target.checkPoint,
-						   ControlFile_target.checkPointCopy.ThisTimeLineID);
+		findCommonAncestorTimeline(&divergerec, &lastcommontli);
+		printf(_("servers diverged at WAL position %X/%X on timeline %u\n"),
+			   (uint32) (divergerec >> 32), (uint32) divergerec, lastcommontli);
 
 		/*
-		 * If the histories diverged exactly at the end of the shutdown
-		 * checkpoint record on the target, there are no WAL records in the
-		 * target that don't belong in the source's history, and no rewind is
-		 * needed.
+		 * Check for the possibility that the target is in fact a direct ancestor
+		 * of the source. In that case, there is no divergent history in the
+		 * target that needs rewinding.
 		 */
-		if (chkptendrec == divergerec)
-			rewind_needed = false;
-		else
+		if (ControlFile_target.checkPoint >= divergerec)
+		{
 			rewind_needed = true;
+		}
+		else
+		{
+			XLogRecPtr	chkptendrec;
+
+			/* Read the checkpoint record on the target to see where it ends. */
+			chkptendrec = readOneRecord(datadir_target,
+							ControlFile_target.checkPoint,
+							ControlFile_target.checkPointCopy.ThisTimeLineID);
+
+			/*
+			 * If the histories diverged exactly at the end of the shutdown
+			 * checkpoint record on the target, there are no WAL records in the
+			 * target that don't belong in the source's history, and no rewind is
+			 * needed.
+			 */
+			if (chkptendrec == divergerec)
+				rewind_needed = false;
+			else
+				rewind_needed = true;
+		}
 	}
 
 	if (!rewind_needed)
@@ -374,10 +379,11 @@ sanityChecks(void)
 	/*
 	 * Target cluster better not be running. This doesn't guard against
 	 * someone starting the cluster concurrently. Also, this is probably more
-	 * strict than necessary; it's OK if the master was not shut down cleanly,
+	 * strict than necessary; it's OK if the node was not shut down cleanly,
 	 * as long as it isn't running at the moment.
 	 */
-	if (ControlFile_target.state != DB_SHUTDOWNED)
+	if (ControlFile_target.state != DB_SHUTDOWNED_IN_RECOVERY &&
+		ControlFile_target.state != DB_SHUTDOWNED)
 		pg_fatal("target server must be shut down cleanly\n");
 
 	/*
@@ -385,7 +391,9 @@ sanityChecks(void)
 	 * server is shut down. There isn't any very strong reason for this
 	 * limitation, but better safe than sorry.
 	 */
-	if (datadir_source && ControlFile_source.state != DB_SHUTDOWNED)
+	if (datadir_source &&
+		ControlFile_source.state != DB_SHUTDOWNED_IN_RECOVERY &&
+		ControlFile_source.state != DB_SHUTDOWNED)
 		pg_fatal("source data directory must be shut down cleanly\n");
 }
 
diff --git a/src/bin/pg_rewind/t/005_same_timeline.pl b/src/bin/pg_rewind/t/005_same_timeline.pl
new file mode 100644
index 0000000..c7283e4
--- /dev/null
+++ b/src/bin/pg_rewind/t/005_same_timeline.pl
@@ -0,0 +1,15 @@
+use strict;
+use warnings;
+use TestLib;
+use Test::More tests => 1;
+
+use RewindTest;
+
+# Test that running pg_rewind if the two clusters are on the same
+# timeline runs successfully.
+
+RewindTest::setup_cluster();
+RewindTest::start_master();
+RewindTest::create_standby();
+RewindTest::run_pg_rewind('local');
+RewindTest::clean_rewind_test();
