diff --git a/libs/ardour/ardour/audio_diskstream.h b/libs/ardour/ardour/audio_diskstream.h
index 21a1789..61d0e96 100644
--- a/libs/ardour/ardour/audio_diskstream.h
+++ b/libs/ardour/ardour/audio_diskstream.h
@@ -227,7 +227,8 @@ class LIBARDOUR_API AudioDiskstream : public Diskstream
 
 	int use_new_write_source (uint32_t n=0);
 
-	int find_and_use_playlist (const std::string &);
+	int find_and_use_playlist_by_name (const std::string &);
+	int find_and_use_playlist_by_id (const PBD::ID &);
 
 	void allocate_temporary_buffers ();
 
diff --git a/libs/ardour/ardour/diskstream.h b/libs/ardour/ardour/diskstream.h
index fb9be65..441c312 100644
--- a/libs/ardour/ardour/diskstream.h
+++ b/libs/ardour/ardour/diskstream.h
@@ -261,7 +261,8 @@ class LIBARDOUR_API Diskstream : public SessionObject, public PublicDiskstream
 
 	virtual int use_new_write_source (uint32_t n=0) = 0;
 
-	virtual int find_and_use_playlist (const std::string&) = 0;
+	virtual int find_and_use_playlist_by_name (const std::string&) = 0;
+	virtual int find_and_use_playlist_by_id (const PBD::ID&) = 0;
 
 	virtual void allocate_temporary_buffers () = 0;
 
diff --git a/libs/ardour/ardour/midi_diskstream.h b/libs/ardour/ardour/midi_diskstream.h
index 45f0176..974aab3 100644
--- a/libs/ardour/ardour/midi_diskstream.h
+++ b/libs/ardour/ardour/midi_diskstream.h
@@ -153,7 +153,8 @@ class LIBARDOUR_API MidiDiskstream : public Diskstream
 
 	int use_new_write_source (uint32_t n=0);
 
-	int find_and_use_playlist (const std::string&);
+	int find_and_use_playlist_by_name (const std::string&);
+	int find_and_use_playlist_by_id (const PBD::ID&);
 
 	void allocate_temporary_buffers ();
 
diff --git a/libs/ardour/audio_diskstream.cc b/libs/ardour/audio_diskstream.cc
index 6f7c2d6..173c754 100644
--- a/libs/ardour/audio_diskstream.cc
+++ b/libs/ardour/audio_diskstream.cc
@@ -245,7 +245,7 @@ AudioDiskstream::get_input_sources ()
 }
 
 int
-AudioDiskstream::find_and_use_playlist (const string& name)
+AudioDiskstream::find_and_use_playlist_by_name (const string& name)
 {
 	boost::shared_ptr<AudioPlaylist> playlist;
 
@@ -262,6 +262,21 @@ AudioDiskstream::find_and_use_playlist (const string& name)
 }
 
 int
+AudioDiskstream::find_and_use_playlist_by_id (const PBD::ID& p_id)
+{
+	boost::shared_ptr<AudioPlaylist> playlist;
+
+	playlist = boost::dynamic_pointer_cast<AudioPlaylist> (_session.playlists->by_id (p_id));
+
+	if (!playlist) {
+		error << string_compose(_("AudioDiskstream: Playlist \"%1\" isn't an audio playlist"), p_id.to_s()) << endmsg;
+		return -1;
+	}
+
+	return use_playlist (playlist);
+}
+
+int
 AudioDiskstream::use_playlist (boost::shared_ptr<Playlist> playlist)
 {
 	assert(boost::dynamic_pointer_cast<AudioPlaylist>(playlist));
diff --git a/libs/ardour/diskstream.cc b/libs/ardour/diskstream.cc
index 7f42140..919dc8f 100644
--- a/libs/ardour/diskstream.cc
+++ b/libs/ardour/diskstream.cc
@@ -465,6 +465,7 @@ Diskstream::get_state ()
 
 	node->add_property ("flags", enum_2_string (_flags));
 	node->add_property ("playlist", _playlist->name());
+	node->add_property("playlist-id", _playlist->id().to_s());
 	node->add_property("name", _name);
 	id().print (buf, sizeof (buf));
 	node->add_property("id", buf);
@@ -510,12 +511,23 @@ Diskstream::set_state (const XMLNode& node, int /*version*/)
                 set_align_choice (Automatic, true);
         }
 
-	if ((prop = node.property ("playlist")) == 0) {
-		return -1;
-	}
+	if ((prop = node.property ("playlist-id")) != 0) {
+		if (find_and_use_playlist_by_id (prop->value())) {
+			return -1;
+		}
 
-	if (find_and_use_playlist (prop->value())) {
-		return -1;
+	} else {
+		/*
+		 * "Old" Behavior
+		 * Permits "old" sessions to load
+		 */
+		if ((prop = node.property ("playlist")) == 0) {
+			return -1;
+		}
+
+		if( find_and_use_playlist_by_name (prop->value())) {
+			return -1;
+		}
 	}
 
 	if ((prop = node.property ("speed")) != 0) {
diff --git a/libs/ardour/midi_diskstream.cc b/libs/ardour/midi_diskstream.cc
index 485967b..207cc07 100644
--- a/libs/ardour/midi_diskstream.cc
+++ b/libs/ardour/midi_diskstream.cc
@@ -212,7 +212,7 @@ MidiDiskstream::non_realtime_input_change ()
 }
 
 int
-MidiDiskstream::find_and_use_playlist (const string& name)
+MidiDiskstream::find_and_use_playlist_by_name (const string& name)
 {
 	boost::shared_ptr<MidiPlaylist> playlist;
 
@@ -229,6 +229,21 @@ MidiDiskstream::find_and_use_playlist (const string& name)
 }
 
 int
+MidiDiskstream::find_and_use_playlist_by_id (const PBD::ID& p_id)
+{
+	boost::shared_ptr<MidiPlaylist> playlist;
+
+	playlist = boost::dynamic_pointer_cast<MidiPlaylist> (_session.playlists->by_id (p_id));
+
+	if (!playlist) {
+		error << string_compose(_("MidiDiskstream: Playlist \"%1\" isn't a midi playlist"), p_id.to_s()) << endmsg;
+		return -1;
+	}
+
+	return use_playlist (playlist);
+}
+
+int
 MidiDiskstream::use_playlist (boost::shared_ptr<Playlist> playlist)
 {
 	if (boost::dynamic_pointer_cast<MidiPlaylist>(playlist)) {
