diff --git a/src/playlist.c b/src/playlist.c
index e708ce00f..75fd23bf2 100644
--- a/src/playlist.c
+++ b/src/playlist.c
@@ -107,6 +107,12 @@ playlist_sync_with_queue(struct playlist *playlist)
 		playlist->current = playlist->queued;
 		playlist->queued = -1;
 
+		/* Set pause and remove the single mode. */
+		if(playlist->queue.single && !playlist->queue.repeat) {
+			playlist->queue.single = false;
+			pc_set_pause(true);
+		}
+
 		if(playlist->queue.consume)
 			playlist_delete(playlist, queue_order_to_position(&playlist->queue, current));
 
@@ -393,15 +399,10 @@ playlist_get_next_song(const struct playlist *playlist)
 {
 	if (playlist->current >= 0)
 	{
-		if (playlist->queue.single == 1)
-		{
-			if (playlist->queue.repeat == 1)
-				return queue_order_to_position(&playlist->queue,
-			                              playlist->current);
-			else
-				return -1;
-		}
-		if (playlist->current + 1 < (int)queue_length(&playlist->queue))
+		if (playlist->queue.single == 1 && playlist->queue.repeat == 1)
+			return queue_order_to_position(&playlist->queue,
+			                               playlist->current);
+		else if (playlist->current + 1 < (int)queue_length(&playlist->queue))
 			return queue_order_to_position(&playlist->queue,
 					       playlist->current + 1);
 		else if (playlist->queue.repeat == 1)
diff --git a/src/playlist_control.c b/src/playlist_control.c
index cd449b425..fa843c89e 100644
--- a/src/playlist_control.c
+++ b/src/playlist_control.c
@@ -147,8 +147,6 @@ playlist_next(struct playlist *playlist)
 
 	next_order = queue_next_order(&playlist->queue, playlist->current);
 	if (next_order < 0) {
-		/* cancel single */
-		playlist->queue.single = false;
 		/* no song after this one: stop playback */
 		playlist_stop(playlist);
 
diff --git a/src/queue.c b/src/queue.c
index d847f1138..dd0b48cb5 100644
--- a/src/queue.c
+++ b/src/queue.c
@@ -44,14 +44,9 @@ queue_next_order(const struct queue *queue, unsigned order)
 {
 	assert(order < queue->length);
 
-	if (queue->single)
-	{
-		if (queue->repeat && !queue->consume)
-			return order;
-		else
-			return -1;
-	}
-	if (order + 1 < queue->length)
+	if (queue->single && queue->repeat && !queue->consume)
+		return order;
+	else if (order + 1 < queue->length)
 		return order + 1;
 	else if (queue->repeat && (order > 0 || !queue->consume))
 		/* restart at first song */