protected function showUserpage( $step ) {
		global $wgRequest;

		$textareaId = 'userpagetext';

		$header = new HtmlTag( 'h2' );
		$step_message = 'translate-fs-userpage-title';
		$header->style( 'opacity', 0.4 )->content( wfMsg( $step_message ) );

		if ( $step ) {
			$this->out->addHtml( $header );
			return $step;
		}

		$userpage = $this->user->getUserPage();
		$preload = "I am My Name and....";

		if ( $wgRequest->wasPosted() &&
			$this->user->matchEditToken( $wgRequest->getVal( 'token' ) ) &&
			$wgRequest->getText( 'step' ) === 'userpage' )
		{
			$babel = array();
			for ( $i = 0; $i < 5; $i++ ) {
				$language = $wgRequest->getText( "babel-$i-language", '-' );
				if ( $language === '-' ) continue;
				$level = $wgRequest->getText( "babel-$i-level", '-' );
				$babel[$language] = $level;
			}

			arsort( $babel );
			$babeltext = '{{#babel:';
			foreach ( $babel as $language => $level ) {
				if ( $level === 'N' ) $level = '';
				else $level = "-$level";
				$babeltext .= "$language$level|";
			}
			$babeltext = trim( $babeltext, '|' );
			$babeltext .= "}}\n";

			$article = new Article( $userpage, 0 );
			$status = $article->doEdit( $babeltext . $wgRequest->getText( $textareaId ), $this->getTitle() );

			if ( $status->isOK() ) {
				$header->content( $header->content . wfMsg( 'translate-fs-pagetitle-done' ) );
				$this->out->addHtml( $header );
				$this->out->addWikiMsg( 'translate-fs-userpage-done' );

				return false;
			} else {
				$this->out->addWikiText( $status->getWikiText() );
				$preload = $wgRequest->getText( 'userpagetext' );
			}
		}

		if ( $userpage->exists() ) {
			$revision = Revision::newFromTitle( $userpage );
			$text = $revision->getText();
			$preload = $text;

			if ( preg_match( '/{{#babel:/i', $text ) ) {
				$header->content( $header->content . wfMsg( 'translate-fs-pagetitle-done' ) );
				$this->out->addHtml( $header );

				return false;
			}
		}

		$this->out->addHtml( $header->style( 'opacity', false ) );

		$this->out->addWikiMsg( 'translate-fs-userpage-help' );
		global $wgLang;

		$form = new HtmlTag( 'form' );
		$items = new TagContainer();
		$form->param( 'method', 'post' )->content( $items );

		$items[] = new RawHtml( Html::hidden( 'step', 'userpage' ) );
		$items[] = new RawHtml( Html::hidden( 'token', $this->user->editToken() ) );
		$items[] = new RawHtml( Html::hidden( 'title', $this->getTitle() ) );

		$languages = $this->languages( $wgLang->getCode() );
		$selector = new XmlSelect();
		$selector->addOption( wfMessage( 'translate-fs-selectlanguage' )->text(), '-' );
		$selector->addOptions( $languages );

		// Building a skill selector
		$skill = new XmlSelect();
		$levels = 'N,5,4,3,2,1';
		foreach ( explode( ',', $levels ) as $level ) {
			$skill->addOption( wfMessage( "translate-fs-userpage-level-$level" )->text(), $level );
		}
		for ( $i = 0; $i < 5; $i++ ) {
			// Prefill en-2 and [wgLang]-N if [wgLang] != en
			if ( $i === 0 ) {
				$skill->setDefault( '2' );
				$selector->setDefault( 'en' );
			} elseif ( $i === 1 && $wgLang->getCode() !== 'en' ) {
				$skill->setDefault( 'N' );
				$selector->setDefault( $wgLang->getCode() );
			} else {
				$skill->setDefault( false );
				$selector->setDefault( false );
			}

			// [skill level selector][language selector]
			$skill->setAttribute( 'name', "babel-$i-level" );
			$selector->setAttribute( 'name', "babel-$i-language" );
			$items[] = New RawHtml( $skill->getHtml() . $selector->getHtml() . '<br />' );
		}

		$textarea = new HtmlTag( 'textarea', $preload );
		$items[] = $textarea->param( 'rows' , 5 )->id( $textareaId )->param( 'name', $textareaId );
		$items[] = new RawHtml( Xml::submitButton( wfMsg( 'translate-fs-userpage-submit' ) ) );

		$this->out->addHtml( $form );

		return $step_message;
	}