void ShowLoadingProgress(DeviceEngineControl engineControl, string title)
        {
            ProgressView progress = new ProgressView("Loading ..");

            engineControl.Content = progress;
            engineControl.Title   = title;
        }
        void InitEngineControl(DeviceEngineControl engineControl, AnalyticsEngine engine, AnalyticsArgs args, string ctrltoken = null)
        {
            //try to remove and clear all needed data
            if (engineControl.Content is IDisposable)
            {
                var disp = engineControl.Content as IDisposable;
                //try to remove content from disposables collection
                if (disposables.Contains(disp))
                {
                    disposables.Remove(disp);
                }
                //dispose existing control
                disp.Dispose();
            }

            //Begin load channels section
            disposables.Add(EnginesView.Load(engine, args.capabilities, args.nvtSession, args.odmSession, ctrltoken)
                            .ObserveOnCurrentDispatcher()
                            .Subscribe(ctrlArgs => {
                if (ctrlArgs.selectedEngineControl != null)
                {
                    engineControl.Title = ctrlArgs.engine.name + ": " + ctrlArgs.selectedEngineControl.name;
                }
                else
                {
                    engineControl.Title = ctrlArgs.engine.name;
                }

                EnginesView enginesView = new EnginesView(container);
                disposables.Add(enginesView);

                enginesView.Init(ctrlArgs);
                engineControl.Content = enginesView;
            }, err => {
                ErrorView errorView = new ErrorView(err);
                disposables.Add(errorView);

                engineControl.Content = errorView;
            }
                                       ));
        }
        void LoadEngine(AnalyticsEngine engine, AnalyticsArgs args)
        {
            try {
                //Create engine control
                DeviceEngineControl engineControl = new DeviceEngineControl();

                //add control to controls dictionary
                //if (engine.token == null) {
                //    throw new ArgumentNullException("Analytics engine token can not be null");
                //}
                engineControls.Add(new KeyValuePair <string, DeviceEngineControl>(engine.token, engineControl));

                //Display progress bar
                ShowLoadingProgress(engineControl, engine.token);

                //add control to parent UI panel
                parent.Children.Add(engineControl);

                InitEngineControl(engineControl, engine, args);

                //subscribe to control changed event
                var subsToken = eventAggregator.GetEvent <ControlChangedEvent>().Subscribe(evargs => {
                    if (evargs.engine.token == engine.token)
                    {
                        //reload channel with new profile
                        InitEngineControl(engineControl, engine, args, evargs.controlToken);
                    }
                }, false);
                disposables.Add(Disposable.Create(() => {
                    eventAggregator.GetEvent <ControlChangedEvent>().Unsubscribe(subsToken);
                }));
            } catch (Exception err) {
                ErrorView errorView = new ErrorView(err);
                disposables.Add(errorView);
                parent.Children.Add(errorView);
            }
        }