public async Task<ExtractProgramResult> ExtractProgram(CancellationToken taskCancellationToken)
        {
            ExtractProgramResult _extractResult = new ExtractProgramResult { Status = ExtractProgramStatus.Success };

            try
            {
                if (_programStream == null && _onlineProgram == null)
                    throw new Exception(
                        "SetProgramStream or SetDownloadHeader have to be called before calling StartImportProgram.");

                if (_programStream == null && _onlineProgram == null)
                    throw new Exception("SetProgramStream and SetDownloadHeader cannot be used together.");

                // old simple portable downloader
                var cancellationTokenSource = new CancellationTokenSource();
                if (_onlineProgram != null)
                {
                    _programStream = await Task.Run(() => ServiceLocator.WebCommunicationService.DownloadAsync(
                        _onlineProgram.DownloadUrl, _onlineProgram.Name, cancellationTokenSource.Token), taskCancellationToken);
                }
                // new downloader
                //if (_onlineProgram != null)
                //{
                //    await Task.Run(() => ServiceLocator.WebCommunicationService.DownloadAsyncAlternativ(
                //        _onlineProgram.DownloadUrl, _onlineProgram.ProjectName), taskCancellationToken);
                //}
                //using (var storage = StorageSystem.GetStorage())
                //{
                //    var stream = await storage.OpenFileAsync(Path.Combine(StorageConstants.TempProgramImportZipPath, _onlineProgram.ProjectName + ".catrobat"),
                //            StorageFileMode.Open, StorageFileAccess.Read); 
                //    await ServiceLocator.ZipService.UnzipCatrobatPackageIntoIsolatedStorage(
                //       stream, StorageConstants.TempProgramImportPath);
                //}

                if (_cancellationTokenSource.Token.IsCancellationRequested == false)
                {
                    await ServiceLocator.ZipService.UnzipCatrobatPackageIntoIsolatedStorage(
                        _programStream, StorageConstants.TempProgramImportPath);
                }
            }
            catch (Exception)
            {
                _extractResult.Status = ExtractProgramStatus.Error;
            }

            using (var storage = StorageSystem.GetStorage())
            {
                await storage.DeleteDirectoryAsync(StorageConstants.TempProgramImportZipPath);
            }
            return _extractResult;
        }