function execute( $par ) {
		global $wgOut, $wgRequest;

		require_once( "forms.php" );
		require_once( "type.php" );
		require_once( "OmegaWikiAttributes.php" );
		require_once( "ViewInformation.php" );

		initializeOmegaWikiAttributes( new ViewInformation() );
		$wgOut->setPageTitle( wfMsg( 'ow_needs_xlation_title' ) );

		$destinationLanguageId = array_key_exists( 'to-lang', $_GET ) ? $_GET['to-lang']:'';
		$collectionId = array_key_exists( 'collection', $_GET ) ? $_GET['collection'] : '';
		$sourceLanguageId = array_key_exists( 'from-lang', $_GET ) ? $_GET['from-lang'] : '';
                                                                
		$wgOut->addHTML( getOptionPanel(
			array(
				wfMsg( 'ow_needs_xlation_dest_lang' ) => getSuggest( 'to-lang', 'language', array(), $destinationLanguageId, languageIdAsText( $destinationLanguageId ) ),
				wfMsg( 'ow_needs_xlation_source_lang' ) => getSuggest( 'from-lang', 'language', array(), $sourceLanguageId, languageIdAsText( $sourceLanguageId ) ),
				wfMsg( 'ow_Collection_colon' ) => getSuggest( 'collection', 'collection', array(), $collectionId, collectionIdAsText( $collectionId ) )
			)
		) );

		if ( $destinationLanguageId == '' )
			$wgOut->addHTML( '<p>' . wfMsg( 'ow_needs_xlation_no_dest_lang' ) . '</p>' );
		else
			$this->showExpressionsNeedingTranslation( $sourceLanguageId, $destinationLanguageId, $collectionId );
	}
	function execute( $parameter ) {
		global $wgOut;

		initializeOmegaWikiAttributes( new ViewInformation() );

		global
			$definedMeaningReferenceType,
			$wgDefinedMeaning;

		require_once( "WikiDataGlobals.php" );
		require_once( "forms.php" );
		require_once( "type.php" );
		require_once( "ViewInformation.php" );
		require_once( "WikiDataAPI.php" );
		require_once( "OmegaWikiAttributes.php" );
		require_once( "OmegaWikiRecordSets.php" );
		require_once( "OmegaWikiEditors.php" );

		$wgOut->setPageTitle( wfMsg( 'search' ) );

		$this->spellingAttribute = new Attribute( "found-word", wfMsg( 'datasearch_found_word' ), "short-text" );
		$this->languageAttribute = new Attribute( "language", wfMsg( 'ow_Language' ), "language" );

		$this->expressionStructure = new Structure( $this->spellingAttribute, $this->languageAttribute );
		$this->expressionAttribute = new Attribute( "expression", wfMsg( 'ow_Expression' ), $this->expressionStructure );

		$this->definedMeaningAttribute = new Attribute( $wgDefinedMeaning, wfMsg( 'ow_DefinedMeaning' ), $definedMeaningReferenceType );
		$this->definitionAttribute = new Attribute( "definition", wfMsg( 'ow_Definition' ), "definition" );

		$this->meaningStructure = new Structure( $this->definedMeaningAttribute, $this->definitionAttribute );
		$this->meaningAttribute = new Attribute( "meaning", wfMsg( 'datasearch_meaning' ), $this->meaningStructure );

		$this->externalIdentifierAttribute = new Attribute( "external-identifier", wfMsg( 'datasearch_ext_identifier' ), "short-text" );
		$this->collectionAttribute = new Attribute( "collection", wfMsg( 'ow_Collection' ), $definedMeaningReferenceType );
		$this->collectionMemberAttribute = new Attribute( "collection-member", wfMsg( 'ow_CollectionMember' ), $definedMeaningReferenceType );

		$this->externalIdentifierMatchStructure = new Structure(
			$this->externalIdentifierAttribute,
			$this->collectionAttribute,
			$this->collectionMemberAttribute
		);

		if ( array_key_exists( 'search-text', $_GET ) ) {
			$searchText = ltrim( $_GET['search-text'] );
		} else {
			$searchText = null;
		}

		if ( isset( $_GET['go'] ) )
			$this->go( $searchText );
		else
			$this->search( $searchText );
	}
	public function history() {
		global
			$wgOut, $wgTitle, $wgRequest;
			
		$wgOut->enableClientCache( false );

		$title = $wgTitle->getPrefixedText();

		if ( !$this->showClassicPageTitles )
			$title = $this->getTitle();

		$wgOut->setPageTitle( wfMsgSc( "history", $title ) );

		# Plain filter for the lifespan info about each record
		if ( isset( $_GET['show'] ) ) {
			$this->showRecordLifeSpan = isset( $_GET["show-record-life-span"] );
			$this->transaction = (int) $_GET["transaction"];
		}
		else {
			$this->showRecordLifeSpan = true;
			$this->transaction = 0;
		}
		
		# Up to which transaction to view the data
		if ( $this->transaction == 0 )
			$this->queryTransactionInformation = new QueryHistoryTransactionInformation();
		else
			$this->queryTransactionInformation = new QueryAtTransactionInformation( $this->transaction, $this->showRecordLifeSpan );
			
		$transactionId = $wgRequest->getInt( 'transaction' );

		$wgOut->addHTML( getOptionPanel(
			array(
				wfMsg( 'ow_history_transaction' ) => getSuggest( 'transaction', 'transaction', array(), $transactionId, getTransactionLabel( $transactionId ), array( 0, 2, 3 ) ),
				wfMsg( 'ow_history_show_life_span' ) => getCheckBox( 'show-record-life-span', $this->showRecordLifeSpan )
			),
			'history'
		) );

		$viewInformation = new ViewInformation();
		$viewInformation->filterLanguageId = $this->filterLanguageId;
		$viewInformation->showRecordLifeSpan = $this->showRecordLifeSpan;
		$viewInformation->queryTransactionInformation = $this->queryTransactionInformation;
		$viewInformation->setPropertyToColumnFilters( $this->propertyToColumnFilters );
		
		$this->viewInformation = $viewInformation;

		initializeOmegaWikiAttributes( $this->viewInformation );
		initializeObjectAttributeEditors( $viewInformation );
	}
	function execute( $parameter ) {
		global $wgOut;

		require_once( "WikiDataTables.php" );
		require_once( "OmegaWikiAttributes.php" );
		require_once( "OmegaWikiRecordSets.php" );
		require_once( "OmegaWikiEditors.php" );
		require_once( "RecordSetQueries.php" );
		require_once( "Transaction.php" );
		require_once( "Editor.php" );
		require_once( "Controller.php" );
		require_once( "type.php" );
		require_once( "ViewInformation.php" );

		initializeOmegaWikiAttributes( new ViewInformation() );
		initializeAttributes();

		@$fromTransactionId = (int) $_GET['from-transaction']; # FIXME - check parameter
		@$transactionCount = (int) $_GET['transaction-count']; # FIXME - check parameter
		@$userName = "" . $_GET['user-name']; # FIXME - check parameter
		@$showRollBackOptions = isset( $_GET['show-roll-back-options'] ); # FIXME - check parameter

		if ( isset( $_POST['roll-back'] ) ) {
			$fromTransactionId = (int) $_POST['from-transaction'];
			$transactionCount = (int) $_POST['transaction-count'];
			$userName = "" . $_POST['user-name'];

			if ( $fromTransactionId != 0 ) {
				$recordSet = getTransactionRecordSet( $fromTransactionId, $transactionCount, $userName );
				rollBackTransactions( $recordSet );
				$fromTransactionId = 0;
				$userName = "";
			}
		}

		if ( $fromTransactionId == 0 )
			$fromTransactionId = getLatestTransactionId();

		if ( $transactionCount == 0 )
			$transactionCount = 10;
		else
			$transactionCount = min( $transactionCount, 20 );

		$wgOut->setPageTitle( wfMsg( 'recentchanges' ) );
		$wgOut->addHTML( getFilterOptionsPanel( $fromTransactionId, $transactionCount, $userName, $showRollBackOptions ) );

		if ( $showRollBackOptions )
			$wgOut->addHTML(
				'<form method="post" action="">' .
				'<input type="hidden" name="from-transaction" value="' . $fromTransactionId . '"/>' .
				'<input type="hidden" name="transaction-count" value="' . $transactionCount . '"/>' .
				'<input type="hidden" name="user-name" value="' . $userName . '"/>'
			);

		$recordSet = getTransactionRecordSet( $fromTransactionId, $transactionCount, $userName );

		$wgOut->addHTML( getTransactionOverview( $recordSet, $showRollBackOptions ) );

		if ( $showRollBackOptions )
			$wgOut->addHTML(
				'<div class="option-panel">' .
					'<table cellpadding="0" cellspacing="0">' .
						'<tr>' .
							'<th>' . wfMsg( "summary" ) . ': </th>' .
							'<td class="option-field">' . getTextBox( "summary" ) . '</td>' .
						'</tr>' .
						'<tr><th/><td>' . getSubmitButton( "roll-back", wfMsg( 'ow_transaction_rollback_button' ) ) . '</td></tr>' .
					'</table>' .
				'</div>' .
				'</form>'
			);

		$wgOut->addHTML( DefaultEditor::getExpansionCss() );
		$wgOut->addHTML( "<script language='javascript'>/* <![CDATA[ */\nexpandEditors();\n/* ]]> */</script>" );
	}
	/**  
	 * FIXME - work in progress
	 *
	 */
	public function save() {
		initializeOmegaWikiAttributes( $this->viewInformation );
		initializeObjectAttributeEditors( $this->viewInformation );

		# Nice try sherlock, but we really need to get our DMID from elsewhere
		# $definedMeaningId = $this->getId(); 

		# Need 3 steps: copy defining expression, create new dm, then update

		$expression = $this->dupDefiningExpression();
		var_dump( $expression );
		# to make the expression really work, we may need to call
		# more here?
		$expression->createNewInDatabase();
		

		# shouldn't this stuff be protected?
		$expressionId = $expression->id;
		$languageId = $expression->languageId;
		
		$this->hackDC(); // XXX
		$text = $this->getDefiningExpression();
		$this->unhackDC(); // XXX


		# here we assume the DM is not there yet.. not entirely wise
		# in the long run.
		echo "id: $expressionId lang: $languageId";
		$newDefinedMeaningId = createNewDefinedMeaning( $expressionId, $languageId, $text );
		

		getDefinedMeaningEditor( $this->viewInformation )->save(
			$this->getIdStack( $newDefinedMeaningId ),
			$this->getRecord()
		);

		return $newDefinedMeaningId;
	}