diff --git a/lib/app.php b/lib/app.php
index 0bef73812626382dec44999fece4812d4b64b253..f71c1c7015384181c39bc5888fdac674993e25a0 100644
--- a/lib/app.php
+++ b/lib/app.php
@@ -4,11 +4,21 @@ class OC_APP{
 	static private $apps = array();
 
 	/**
+	 * @brief loads all apps
+	 * @returns true/false
 	 *
+	 * This function walks through the owncloud directory and loads all apps
+	 * it can find. A directory contains an app if the file /appinfo/app.php
+	 * exists.
 	 */
 	public static function loadApps(){
 		global $SERVERROOT;
 
+		// Did we allready load everything?
+		if( $self::init ){
+			return true
+		}
+
 		// Get all appinfo
 		$dir = opendir( $SERVERROOT );
 		while( false !== ( $filename = readdir( $dir ))){
@@ -20,23 +30,278 @@ class OC_APP{
 		}
 		closedir( $dir );
 
+		$self::init = true;
+
 		// return
 		return true;
 	}
 
 	/**
+	 * @brief makes owncloud aware of this app
+	 * @param $data array with all information
+	 * @returns true/false
+	 *
+	 * This function registers the application. $data is an associative array.
+	 * The following keys are required:
+	 *   - id: id of the application, has to be unique ("addressbook")
+	 *   - name: Human readable name ("Addressbook")
+	 *
+	 * The following keys are optional:
+	 *   - order: integer, that influences the position of your application in
+	 *     a list of applications. Lower values come first.
 	 *
 	 */
-	public static function register( $data = array()){
+	public static function register( $data ){
 		OC_APP::$apps[] = $data;
 	}
 
 	/**
+	 * @brief returns information of all apps
+	 * @return array with all information
 	 *
+	 * This function returns all data it got via register().
 	 */
-	public static function getApps(){
+	public static function get(){
 		return OC_APP::$apps;
 	}
 
+	/**
+	 * @brief adds an entry to the navigation
+	 * @param $data array containing the data
+	 * @returns true/false
+	 *
+	 * This function adds a new entry to the navigation visible to users. $data
+	 * is an associative array.
+	 * The following keys are required:
+	 *   - id: unique id for this entry ("addressbook_index")
+	 *   - href: link to the page
+	 *   - name: Human readable name ("Addressbook")
+	 *
+	 * The following keys are optional:
+	 *   - icon: path to the icon of the app
+	 *   - order: integer, that influences the position of your application in
+	 *     the navigation. Lower values come first.
+	 */
+	public static function addNavigationEntry( $data ){
+		// TODO: write function
+		return true;
+	}
+
+	/**
+	 * @brief adds a sub entry to the navigation
+	 * @param $parent id of the parent
+	 * @param $data array containing the data
+	 * @returns true/false
+	 *
+	 * This function adds a new sub entry to the navigation visible to users.
+	 * these entries are visible only if the parent navigation entry is marked
+	 * as being active (see activateNavigationEntry()). $data is an associative
+	 * array.
+	 * The following keys are required:
+	 *   - id: unique id for this entry ("addressbook_index")
+	 *   - href: link to the page
+	 *   - name: Human readable name ("Addressbook")
+	 *
+	 * The following keys are optional:
+	 *   - icon: path to the icon of the app
+	 *   - order: integer, that influences the position of your application in
+	 *     the navigation. Lower values come first.
+	 */
+	public static function addNavigationSubEntry( $parent, $data ){
+		// TODO: write function
+		return true;
+	}
+
+	/**
+	 * @brief marks a navigation entry as active
+	 * @param $id id of the entry
+	 * @returns true/false
+	 *
+	 * This function sets a navigation entry as active and removes the "active"
+	 * property from all other entries. The templates can use this for
+	 * highlighting the current position of the user.
+	 */
+	public static function activateNavigationEntry( $id ){
+		// TODO: write function
+		return true;
+	}
+
+	/**
+	 * @brief adds an entry to the personal menu
+	 * @param $data array containing the data
+	 * @returns true/false
+	 *
+	 * This function adds a new entry to the personal menu visible to users
+	 * only. $data is an associative array.
+	 * The following keys are required:
+	 *   - id: unique id for this entry ("logout")
+	 *   - href: link to the page
+	 *   - name: Human readable name ("Logout")
+	 *
+	 * The following keys are optional:
+	 *   - order: integer, that influences the position of your application in
+	 *     the personal menu. Lower values come first.
+	 */
+	public static function addPersonalMenuEntry( $data ){
+		// TODO: write function
+		return true;
+	}
+
+	/**
+	 * @brief registers an admin page
+	 * @param $data array containing the data
+	 * @returns true/false
+	 *
+	 * This function registers a admin page that will be shown in the admin
+	 * menu. $data is an associative array.
+	 * The following keys are required:
+	 *   - id: unique id for this entry ("files_admin")
+	 *   - href: link to the admin page
+	 *   - name: Human readable name ("Files Administration")
+	 *
+	 * The following keys are optional:
+	 *   - order: integer, that influences the position of your application in
+	 *     the list. Lower values come first.
+	 */
+	public static function addAdminPage( $data = array()){
+		// TODO: write function
+		return true;
+	}
+
+	/**
+	 * @brief Returns the navigation
+	 * @returns associative array
+	 *
+	 * This function returns an array containing all entries added. The
+	 * entries are sorted by the key "order" ascending. Additional to the keys
+	 * given for each app the following keys exist:
+	 *   - active: boolean, signals if the user is on this navigation entry
+	 *   - children: array that is empty if the key "active" is false or
+	 *     contains the subentries if the key "active" is true
+	 */
+	public static function getNavigation( $data = array()){
+		// TODO: write function
+		return true;
+	}
+
+	/**
+	 * @brief Returns the personal menu
+	 * @returns associative array
+	 *
+	 * This function returns an array containing all personal menu entries
+	 * added. The entries are sorted by the key "order" ascending.
+	 */
+	public static function getPersonalMenu( $data = array()){
+		// TODO: write function
+		return true;
+	}
+
+	/**
+	 * @brief Returns the admin pages
+	 * @returns associative array
+	 *
+	 * This function returns an array containing all admin pages added. The
+	 * entries are sorted by the key "order" ascending.
+	 */
+	public static function getAdminPages( $data = array()){
+		// TODO: write function
+		return true;
+	}
+
+	/**
+	 * @brief Installs an appl
+	 * @param $data array with all information
+	 * @returns integer
+	 *
+	 * This function installs an app. All information needed are passed in the
+	 * associative array $data.
+	 * The following keys are required:
+	 *   - source: string, can be "path" or "http"
+	 *
+	 * One of the following keys is required:
+	 *   - path: path to the file containing the app
+	 *   - href: link to the downloadable file containing the app
+	 *
+	 * The following keys are optional:
+	 *   - pretend: boolean, if set true the system won't do anything
+	 *   - noinstall: boolean, if true the function oc_app_install will be
+	 *     skipped
+	 *   - inactive: boolean, if set true the appconfig/app.sample.php won't be
+	 *     renamed
+	 *
+	 * This function works as follows
+	 *   -# fetching the file
+	 *   -# unzipping it
+	 *   -# including appinfo/installer.php
+	 *   -# executing "oc_app_install()"
+	 *   -# renaming appinfo/app.sample.php to appinfo/app.php
+	 *
+	 * It is the task of oc_app_install to create the tables and do whatever is
+	 * needed to get the app working.
+	 */
+	public static function installApp( $data = array()){
+		// TODO: write function
+		return true;
+	}
+
+	/**
+	 * @brief Installs an application
+	 * @param $data array with all information
+	 * @returns integer
+	 *
+	 * This function installs an app. All information needed are passed in the
+	 * associative array $data.
+	 * The following keys are required:
+	 *   - source: string, can be "path" or "http"
+	 *
+	 * One of the following keys is required:
+	 *   - path: path to the file containing the app
+	 *   - href: link to the downloadable file containing the app
+	 *
+	 * The following keys are optional:
+	 *   - pretend: boolean, if set true the system won't do anything
+	 *   - noupgrade: boolean, if true the function oc_app_upgrade will be
+	 *     skipped
+	 *   - keepappinfo: boolean. If set true, the folder appinfo will not be
+	 *     deleted, appinfo/app.php will not be replaced by a new version
+	 *
+	 * This function works as follows
+	 *   -# fetching the file
+	 *   -# removing the old files
+	 *   -# unzipping new file
+	 *   -# including appinfo/installer.php
+	 *   -# executing "oc_app_upgrade( $options )"
+	 *   -# renaming appinfo/app.sample.php to appinfo/app.php
+	 */
+	public static function upgradeApp( $data = array()){
+		// TODO: write function
+		return true;
+	}
+
+	/**
+	 * @brief Removes an app
+	 * @param $name name of the application to remove
+	 * @param $options array with options
+	 * @returns true/false
+	 *
+	 * This function removes an app. $options is an associative array. The
+	 * following keys are optional:
+	 *   - keeppreferences: boolean, if true the user preferences won't be deleted
+	 *   - keepappconfig: boolean, if true the config will be kept
+	 *   - keeptables: boolean, if true the database will be kept
+	 *   - keepfiles: boolean, if true the user files will be kept
+	 *
+	 * This function works as follows
+	 *   -# including appinfo/installer.php
+	 *   -# executing "oc_app_uninstall( $options )"
+	 *   -# removing the files
+	 *
+	 * The function will not delete preferences, tables and the configuration,
+	 * this has to be done by the function oc_app_uninstall().
+	 */
+	public static function removeApp( $name, $options = array()){
+		// TODO: write function
+		return true;
+	}
 }
-?>
+?>
\ No newline at end of file