public function template()
    {
        // load already migrated posts
        $migrated_posts_cache = get_option('podlove_migrated_posts_cache', array());
        // then begin to migrate
        $migration_settings = get_option('podlove_migration', array());
        // Basic Podcast Settings
        $podcast = Model\Podcast::get();
        $podcast->title = $migration_settings['podcast']['title'];
        $podcast->subtitle = $migration_settings['podcast']['subtitle'];
        $podcast->summary = $migration_settings['podcast']['summary'];
        $podcast->media_file_base_uri = \Podlove\Modules\Migration\get_media_file_base_url();
        // harvest low hanging podPress fruits
        if ($podPress_config = get_option('podPress_config')) {
            if (isset($podPress_config['iTunes']['image']) && !$podcast->cover_image) {
                $podcast->cover_image = $podPress_config['iTunes']['image'];
            }
        }
        // harvest low hanging PowerPress fruits
        if ($powerPress_config = get_option('powerpress_feed')) {
            if (isset($powerPress_config['itunes_image']) && !$podcast->cover_image) {
                $podcast->cover_image = $powerPress_config['itunes_image'];
            }
            if (isset($powerPress_config['itunes_cat_1']) && !$podcast->category_1) {
                $podcast->category_1 = $powerPress_config['itunes_cat_1'];
            }
            if (isset($powerPress_config['itunes_cat_2']) && !$podcast->category_2) {
                $podcast->category_2 = $powerPress_config['itunes_cat_2'];
            }
            if (isset($powerPress_config['itunes_cat_3']) && !$podcast->category_3) {
                $podcast->category_3 = $powerPress_config['itunes_cat_3'];
            }
        }
        $podcast->save();
        // Create Template
        $template = Model\Template::find_one_by_title('default');
        if (!$template) {
            $template = new Model\Template();
            $template->title = 'default';
            $template->content = <<<EOT
{{ episode.player }}
[podlove-episode-downloads]
EOT;
            $template->save();
        }
        $template_assignment = Model\TemplateAssignment::get_instance();
        if ($template_assignment->has_property($migration_settings['cleanup']['template'])) {
            $template_assignment->{$migration_settings}['cleanup']['template'] = $template->id;
            $template_assignment->save();
        }
        // Create Assets
        $assets = array();
        foreach ($migration_settings['file_types'] as $file_type_id => $_) {
            $file_type = Model\FileType::find_one_by_id($file_type_id);
            $is_image = in_array($file_type->extension, array('png', 'jpg', 'jpeg', 'gif'));
            $asset = Model\EpisodeAsset::find_one_by_file_type_id($file_type_id);
            if (!$asset) {
                $asset = new Model\EpisodeAsset();
                $asset->title = $file_type->name;
                $asset->file_type_id = $file_type_id;
                $asset->downloadable = !$is_image;
                $asset->save();
            }
            $assets[] = $asset;
            if ($is_image) {
                $asset_assignments = get_option('podlove_asset_assignment', array());
                if (!$asset_assignments['image']) {
                    $asset_assignments['image'] = $asset->id;
                    update_option('podlove_asset_assignment', $asset_assignments);
                }
            }
            // create feeds
            if (stripos($file_type->mime_type, 'audio') !== false) {
                $feed = Model\Feed::find_one_by_episode_asset_id($asset->id);
                if (!$feed) {
                    $feed = new Model\Feed();
                    $feed->episode_asset_id = $asset->id;
                    $feed->name = $file_type->name;
                    $feed->title = $file_type->name;
                    $feed->slug = $file_type->extension;
                    $feed->format = 'rss';
                    $feed->enable = true;
                    $feed->discoverable = true;
                    $feed->limit_items = -1;
                    $feed->save();
                }
            }
            // set web player settings
            $webplayer_formats = get_option('podlove_webplayer_formats', array());
            if (!isset($webplayer_formats['audio'])) {
                $webplayer_formats['audio'] = array();
            }
            if (stripos($file_type->mime_type, 'audio/mpeg') !== false) {
                $webplayer_formats['audio']['mp3'] = $asset->id;
            } elseif (stripos($file_type->mime_type, 'audio/mp4') !== false) {
                $webplayer_formats['audio']['mp4'] = $asset->id;
            } elseif (stripos($file_type->mime_type, 'audio/ogg') !== false) {
                $webplayer_formats['audio']['ogg'] = $asset->id;
            } elseif (stripos($file_type->mime_type, 'audio/opus') !== false) {
                $webplayer_formats['audio']['opus'] = $asset->id;
            }
            update_option('podlove_webplayer_formats', $webplayer_formats);
        }
        // flush rules after migration
        set_transient('podlove_needs_to_flush_rewrite_rules', true);
        ?>
		
		<form action="" method="POST">
			<input type="submit" name="prev" class="btn" value="<?php 
        echo __('Back', 'podlove');
        ?>
">
			<input type="submit" name="next" id="continue_to_finish_button" class="btn btn-primary disabled pull-right" value="<?php 
        echo __('Continue to last step', 'podlove');
        ?>
">
		</form>

		<div class="row-fluid">
			<div class="span12">
				<h3 id="migration-header">Migrating <small></small></h3>
			</div>
		</div>

		<div class="progress progress-striped active" id="migration_progress">
			<div class="bar" style="width:0%"></div>
		</div>

		<p>
			<input type="button" id="start_migration_button" class="btn btn-primary" value="<?php 
        echo __('Start Migration', 'podlove');
        ?>
">
			Starting the migration creates the actual episodes one by one.			
		</p>

		<table class="table table-condensed" id="posts_to_migrate">
			<thead>
				<tr>
					<th>Status</th>
					<th>Episode</th>
				</tr>
			</thead>
			<tbody>
				<?php 
        $migrated_post_ids = array_keys($migrated_posts_cache);
        ?>
				<?php 
        foreach ($migration_settings['episodes'] as $post_id => $_) {
            ?>
					<?php 
            $done = in_array($post_id, $migrated_post_ids);
            ?>
					<tr data-post-id="<?php 
            echo $post_id;
            ?>
" <?php 
            echo $done ? 'class="done"' : '';
            ?>
>
						<td class="status">
							<span class="waiting" <?php 
            echo !$done ? '' : 'style="display:none"';
            ?>
>not yet migrated</span>
							<span class="migrating" style="display:none"><i class="podlove-icon-spinner rotate"></i></span>
							<span class="done" <?php 
            echo $done ? '' : 'style="display:none"';
            ?>
><i class="podlove-icon-ok"></i></span>
						</td>
						<td class="episode">
							<?php 
            if ($done) {
                ?>
								<a href="<?php 
                echo get_edit_post_link($migrated_posts_cache[$post_id]);
                ?>
" target="_blank">
									<?php 
                echo get_the_title($post_id);
                ?>
								</a>
							<?php 
            } else {
                ?>
								<?php 
                echo get_the_title($post_id);
                ?>
							<?php 
            }
            ?>
						</td>
					</tr>
				<?php 
        }
        ?>
			</tbody>
		</table>

		<script type="text/javascript">
		jQuery(function($) {
			var posts_to_migrate = $("#posts_to_migrate tbody tr").length;

			$("#continue_to_finish_button").hide();

			function update_migration_progress_bar() {
				var posts_done = $("#posts_to_migrate tbody tr.done").length;
				progress = Math.round(posts_done / posts_to_migrate * 100)
				$("#migration_progress .bar")
					.css("width", progress + "%")
					.html(posts_done + " / " + posts_to_migrate);

				if ( progress == 100 ) {
					$("#migration_progress")
						.removeClass("active")
						.addClass("progress-success")
						.find(".bar").html("Done! Whoop whoop!");

					$("#migration-header small").html('');
					$("#start_migration_button").addClass("disabled");
					$("#continue_to_finish_button").removeClass("disabled").show();
				}
			};

			function podlove_migrate_one_post() {
				$("#posts_to_migrate tbody tr:not(.done):first").each(function() {
					var post_id = $(this).data("post-id")
					    that = $(this),
					    episode_title = $(".episode", that).html();

					$("#migration-header small").html(episode_title);

					var data = {
						action: 'podlove-migrate-post',
						post_id: post_id
					};

					$.ajax({
						url: ajaxurl,
						data: data,
						dataType: 'json',
						beforeSend: function(jqXHR, settings) {
							$(".waiting, .done", that).hide();
							$(".migrating", that).show();
						},
						success: function(result) {
							var episode_url = result.url;

							$(".waiting, .migrating", that).hide();
							$(".done", that).show();
							that.addClass("done");

							// add link
							$(".episode", that).html('<a href="' + episode_url + '" target="_blank">' + episode_title + '</a>')

							// update progress bar
							update_migration_progress_bar();

							// continue
							podlove_migrate_one_post();
						}
					});
				});
			}

			$("#start_migration_button").on("click", function(){
				if (!$(this).hasClass("disabled")) {
					$(this).addClass("disabled");
					podlove_migrate_one_post();
				}
			});
			update_migration_progress_bar();
		});
		</script>
		<?php 
    }