=== modified file 'plugins/Dash/DashAudioPlayer.qml'
--- plugins/Dash/DashAudioPlayer.qml	2015-12-22 09:12:32 +0000
+++ plugins/Dash/DashAudioPlayer.qml	2016-08-26 08:08:57 +0000
@@ -20,16 +20,22 @@
 import Dash 0.1
 
 QtObject {
-    readonly property real progress: audio.position / audio.duration
-    readonly property bool playing: audio.playbackState === Audio.PlayingState
-    readonly property bool paused: audio.playbackState === Audio.PausedState
-    readonly property bool stopped: audio.playbackState === Audio.StoppedState
-    readonly property alias position: audio.position
-    readonly property url currentSource: audio.playlist.currentItemSource
+    id: root
+    readonly property real progress: priv.audio ? priv.audio.position / priv.audio.duration : 0.0
+    readonly property bool playing: priv.audio ? priv.audio.playbackState === Audio.PlayingState : false
+    readonly property bool paused: priv.audio ? priv.audio.playbackState === Audio.PausedState : false
+    readonly property bool stopped: priv.audio ? priv.audio.playbackState === Audio.StoppedState : true
+    readonly property int position: priv.audio ? priv.audio.position : 0
+    readonly property url currentSource: priv.audio ? priv.audio.playlist.currentItemSource : ""
+    readonly property Playlist playlist: priv.audio ? priv.audio.playlist : null
 
     function playSource(newSource, newPlaylist) {
+        if (!priv.audio) {
+            console.info("DashAudioPlayer: creating player");
+            priv.audio = priv.audioComponent.createObject(root);
+        }
         stop();
-        audio.playlist.clear();
+        priv.audio.playlist.clear();
         if (newPlaylist) {
             // Look for newSource in newPlaylist
             var sourceIndex = -1;
@@ -48,35 +54,53 @@
             for (var i in newPlaylist) {
                 urls.push(newPlaylist[i]);
             }
-            audio.playlist.addItems(urls);
-            audio.playlist.currentIndex = sourceIndex;
+            priv.audio.playlist.addItems(urls);
+            priv.audio.playlist.currentIndex = sourceIndex;
         } else {
-            audio.playlist.addItem(newSource);
-            audio.playlist.currentIndex = 0;
+            priv.audio.playlist.addItem(newSource);
+            priv.audio.playlist.currentIndex = 0;
         }
         play();
     }
 
     function stop() {
-        audio.stop();
+        if (priv.audio) {
+            priv.audio.stop();
+        }
     }
 
     function play() {
-        audio.play();
+        if (priv.audio) {
+            priv.audio.play();
+        }
     }
 
     function pause() {
-        audio.pause();
+        if (priv.audio) {
+            priv.audio.pause();
+        }
     }
 
-    property QtObject audio: Audio {
-        id: audio
-        objectName: "audio"
-        playlist: Playlist {
-            objectName: "playlist"
+    property QtObject priv: QtObject {
+        id: priv
+        property Audio audio: null
+        property Component audioComponent: Component {
+            Audio {
+                playlist: Playlist {
+                    objectName: "playlist"
+                }
+                /* Remove player in case of error so it gets recreated next time
+                 * we need it. Happens if backend media player restarted, for
+                 * instance. qtmultimedia should probably handle this
+                 * transparently (LP: #1616425).
+                 */
+                onError: {
+                    console.warn("DashAudioPlayer: error event (" +
+                                  priv.audio.errorString + "), destroying");
+                    priv.audio.destroy();
+                }
+            }
         }
-
-        onErrorStringChanged: console.warn("Dash Audio player error:", errorString)
     }
 
     function lengthToString(s) {

=== modified file 'qml/Components/NotificationAudio.qml'
--- qml/Components/NotificationAudio.qml	2016-04-29 20:06:54 +0000
+++ qml/Components/NotificationAudio.qml	2016-08-26 08:08:57 +0000
@@ -23,6 +23,10 @@
     readonly property var playbackState: priv.audio ? priv.audio.playbackState : 0
 
     function play() {
+        if (!priv.audio) {
+            console.info("NotificationAudio: creating player");
+            priv.audio = priv.audioComponent.createObject(root);
+        }
         if (priv.audio) {
             priv.audio.play();
         }
@@ -35,9 +39,22 @@
 
     QtObject {
         id: priv
-        property var audio: Audio {
-            source: root.source
-            audioRole: MediaPlayer.NotificationRole
+        property Audio audio: null
+        property Component audioComponent: Component {
+            Audio {
+                source: root.source
+                audioRole: MediaPlayer.NotificationRole
+                /* Remove player in case of error so it gets recreated next time
+                 * we need it. Happens if backend media player restarted, for
+                 * instance. qtmultimedia should probably handle this
+                 * transparently (LP: #1616425).
+                 */
+                onError: {
+                    console.warn("NotificationAudio: error event (" +
+                                  priv.audio.errorString + "), destroying");
+                    priv.audio.destroy();
+                }
+            }
         }
     }
 }

=== modified file 'tests/qmltests/Dash/Previews/tst_PreviewAudioPlayback.qml'
--- tests/qmltests/Dash/Previews/tst_PreviewAudioPlayback.qml	2016-02-15 15:27:09 +0000
+++ tests/qmltests/Dash/Previews/tst_PreviewAudioPlayback.qml	2016-08-26 08:08:57 +0000
@@ -127,8 +127,6 @@
             var track1PlayButton = findChild(track1Item, "playButton");
             var track2PlayButton = findChild(track2Item, "playButton");
 
-            var audio = DashAudioPlayer.audio;
-
             // All progress bars must be hidden in the beginning
             compare(track0ProgressBar.visible, false);
             compare(track1ProgressBar.visible, false);
@@ -137,7 +135,7 @@
             // Playing track 0 should make progress bar 0 visible
             mouseClick(track0PlayButton);
 
-            tryCompare(audio, "playbackState", Audio.PlayingState);
+            compare(DashAudioPlayer.playing, true);
             checkPlayerSource(0);
 
             tryCompare(track0ProgressBar, "visible", true);
@@ -146,25 +144,25 @@
 
             // Clicking the button again should pause it. The progress bar should stay visible
             mouseClick(track0PlayButton);
-            tryCompare(audio, "playbackState", Audio.PausedState);
+            compare(DashAudioPlayer.paused, true);
             checkPlayerSource(0);
             tryCompare(track0ProgressBar, "visible", true);
 
             // Continue playback
             mouseClick(track0PlayButton);
-            tryCompare(audio, "playbackState", Audio.PlayingState);
+            compare(DashAudioPlayer.playing, true);
             checkPlayerSource(0);
 
             // Playing track 1 should make progress bar 1 visible and hide progress bar 0 again
             mouseClick(track1PlayButton);
 
-            tryCompare(audio, "playbackState", Audio.PlayingState);
+            compare(DashAudioPlayer.playing, true);
             checkPlayerSource(1);
 
             // Check the playlist is song 0, 1, 2
-            checkPlayerUrls(tracksModel2["tracks"][0].source, audio.playlist.itemSource(0));
-            checkPlayerUrls(tracksModel2["tracks"][1].source, audio.playlist.itemSource(1));
-            checkPlayerUrls(tracksModel2["tracks"][2].source, audio.playlist.itemSource(2));
+            checkPlayerUrls(tracksModel2["tracks"][0].source, DashAudioPlayer.playlist.itemSource(0));
+            checkPlayerUrls(tracksModel2["tracks"][1].source, DashAudioPlayer.playlist.itemSource(1));
+            checkPlayerUrls(tracksModel2["tracks"][2].source, DashAudioPlayer.playlist.itemSource(2));
 
             tryCompare(track0ProgressBar, "visible", false);
             tryCompare(track1ProgressBar, "visible", true);
@@ -173,7 +171,7 @@
             // Playing track 2 should make progress bar 1 visible and hide progress bar 0 again
             mouseClick(track2PlayButton);
 
-            tryCompare(audio, "playbackState", Audio.PlayingState);
+            compare(DashAudioPlayer.playing, true);
             checkPlayerSource(2);
 
             tryCompare(track0ProgressBar, "visible", false);

