         }
     }
 
-    fileprivate func unbindPlaybackEvents() {
+    private func unbindPlaybackEvents() {
         for id in playbackEventsListenIds {
             stopListening(id)
         }
 
         playbackEventsListenIds.removeAll()
     }
-
-    fileprivate func forward(_ event: Event, userInfo: EventUserInfo) {
-        trigger(event.rawValue, userInfo: userInfo)
-    }
     
     public static func register(plugin: Plugin.Type) {
-        plugins.append(plugin.self)
+        appPlugins.append(plugin.self)
     }
 
     @objc open func destroy() {

        return on(event.rawValue, callback: callback)
    }

    fileprivate func bindPlaybackEvents() {
        if let playback = core?.activePlayback {
            for event in playbackEventsToListen {
                let listenId = listenTo(

             Event.subtitleSelected.rawValue, Event.audioSelected.rawValue])

        Loader.shared.addExternalPlugins(externalPlugins)
        Loader.shared.addExternalPlugins(Player.appPlugins)

        setCore(Core(options: options))

        bindPlaybackEvents()
    }

    private func setCore(_ core: Core) {
        self.core?.stopListening()

        self.core = core

        self.core?.on(InternalEvent.willChangeActivePlayback.rawValue) { [weak self] _ in self?.unbindPlaybackEvents() }
        self.core?.on(InternalEvent.didChangeActivePlayback.rawValue) { [weak self] _ in self?.bindPlaybackEvents() }
        self.core?.on(InternalEvent.userRequestEnterInFullscreen.rawValue) { [weak self] (info: EventUserInfo) in self?.trigger(Event.requestFullscreen.rawValue, userInfo: info) }
        self.core?.on(InternalEvent.userRequestExitFullscreen.rawValue) { [weak self] (info: EventUserInfo) in self?.trigger(Event.exitFullscreen.rawValue, userInfo: info) }
    }

    @objc open func attachTo(_ view: UIView, controller: UIViewController) {
