         
         let playbackFactory = PlaybackFactory(loader: loader, options: playbackOptions)
         
-        playback?.removeFromSuperview()
-        playback = playbackFactory.createPlayback()
+        setPlayback(playbackFactory.createPlayback())
+        
         renderPlayback()
         trigger(ContainerEvent.sourceChanged)
+    }
+    
+    fileprivate func setPlayback(_ playback: Playback) {
+        if self.playback != playback {
+            trigger(InternalEvent.willChangePlayback.rawValue)
+            
+            self.playback?.removeFromSuperview()
+            self.playback = playback
+            
+            trigger(InternalEvent.didChangePlayback.rawValue)
+            stopListening()
+            bindEventListeners()
+        }
     }
     
     open override func render() {
         plugins.forEach(renderPlugin)
         renderPlayback()
     }
-
+    
     fileprivate func renderPlayback() {
         guard let playback = playback else {
             return
         }
-
+        
         addSubviewMatchingConstraints(playback)
         playback.render()
         sendSubview(toBack: playback)

        
        removeFromSuperview()
    }

    open func play() {
        playback?.play()
    }

    open func seek(timeInterval: TimeInterval) {
        playback?.seek(timeInterval)
    }
    
    fileprivate func loadPlugins() {
        for type in loader.containerPlugins {
            addPlugin(type.init(context: self) as! UIContainerPlugin)
        }
