diff --git a/src/song.c b/src/song.c
index bc6cb11c4..64f476b7e 100644
--- a/src/song.c
+++ b/src/song.c
@@ -42,6 +42,7 @@ song_alloc(const char *uri, struct directory *parent)
 	memcpy(song->uri, uri, uri_length + 1);
 	song->parent = parent;
 	song->mtime = 0;
+	song->start_ms = song->end_ms = 0;
 
 	return song;
 }
@@ -84,8 +85,11 @@ song_get_uri(const struct song *song)
 double
 song_get_duration(const struct song *song)
 {
+	if (song->end_ms > 0)
+		return (song->end_ms - song->start_ms) / 1000.0;
+
 	if (song->tag == NULL)
 		return 0;
 
-	return song->tag->time;
+	return song->tag->time - song->start_ms / 1000.0;
 }
diff --git a/src/song.h b/src/song.h
index 832f3d700..2bebee64e 100644
--- a/src/song.h
+++ b/src/song.h
@@ -31,6 +31,18 @@ struct song {
 	struct tag *tag;
 	struct directory *parent;
 	time_t mtime;
+
+	/**
+	 * Start of this sub-song within the file in milliseconds.
+	 */
+	unsigned start_ms;
+
+	/**
+	 * End of this sub-song within the file in milliseconds.
+	 * Unused if zero.
+	 */
+	unsigned end_ms;
+
 	char uri[sizeof(int)];
 };
 
diff --git a/src/song_print.c b/src/song_print.c
index 3e6252ed6..3ba653d1c 100644
--- a/src/song_print.c
+++ b/src/song_print.c
@@ -51,6 +51,19 @@ song_print_info(struct client *client, struct song *song)
 {
 	song_print_uri(client, song);
 
+	if (song->start_ms > 0 || song->end_ms > 0) {
+		if (song->end_ms > 0)
+			client_printf(client, "Range: %u.%03u-%u.%03u\n",
+				      song->start_ms / 1000,
+				      song->start_ms % 1000,
+				      song->end_ms / 1000,
+				      song->end_ms % 1000);
+		else
+			client_printf(client, "Range: %u.%03u-\n",
+				      song->start_ms / 1000,
+				      song->start_ms % 1000);
+	}
+
 	if (song->mtime > 0) {
 #ifndef G_OS_WIN32
 		struct tm tm;
diff --git a/test/dump_playlist.c b/test/dump_playlist.c
index bf31400fe..1a569dfcb 100644
--- a/test/dump_playlist.c
+++ b/test/dump_playlist.c
@@ -128,6 +128,14 @@ int main(int argc, char **argv)
 
 	while ((song = playlist_plugin_read(playlist)) != NULL) {
 		g_print("%s\n", song->uri);
+
+		if (song->start_ms > 0 || song->end_ms > 0)
+			g_print("range: %u:%02u..%u:%02u\n",
+				song->start_ms / 60000,
+				(song->start_ms / 1000) % 60,
+				song->end_ms / 60000,
+				(song->end_ms / 1000) % 60);
+
 		if (song->tag != NULL)
 			tag_save(stdout, song->tag);