diff --git a/lib/l10n.php b/lib/l10n.php
new file mode 100644
index 0000000000000000000000000000000000000000..47d331b3fc6282117e7c2477e6ddc14bc4dcd60f
--- /dev/null
+++ b/lib/l10n.php
@@ -0,0 +1,247 @@
+<?php
+/**
+ * ownCloud
+ *
+ * @author Jakob Sack
+ * @copyright 2010 Frank Karlitschek karlitschek@kde.org
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU AFFERO GENERAL PUBLIC LICENSE
+ * License as published by the Free Software Foundation; either
+ * version 3 of the License, or any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU AFFERO GENERAL PUBLIC LICENSE for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public
+ * License along with this library.  If not, see <http://www.gnu.org/licenses/>.
+ *
+ */
+
+/**
+ * This class is for i18n and l10n
+ */
+class OC_L10N{
+	/**
+	 * cache
+	 */
+	protected static $cache = array();
+	
+	/**
+	 * The best language
+	 */
+	protected static $language = '';
+	
+	/**
+	 * Translations
+	 */
+	private $translations = array();
+	
+	/**
+	 * Localization
+	 */
+	private $localizations = array(
+		'date' => 'd.m.Y',
+		'datetime' => 'd.m.Y H:i:s',
+		'time' => 'H:i:s' );
+	
+	/**
+	 * @brief The constructor
+	 * @param $app the app requesting l10n
+	 * @param $lang default: null Language
+	 * @returns OC_L10N-Object
+	 *
+	 * If language is not set, the constructor tries to find the right
+	 * language.
+	 */
+	public function __construct( $app, $lang = null ){
+		// Find the right language
+		if( is_null( $lang )){
+			self::findLanguage( $app );
+		}
+
+		// Use cache if possible
+		if(array_key_exists($app.'::'.$lang, self::$cache )){
+			$this->translations = self::$cache[$app.'::'.$lang]['t'];
+			$this->localizations = self::$cache[$app.'::'.$lang]['l'];
+		}
+		else{
+			$i18ndir = self::findI18nDir( $app );
+
+			// Localization is in /l10n, Texts are in $i18ndir
+			// (Just no need to define date/time format etc. twice)
+			if( file_exists( $i18ndir.$lang.'php' )){
+				// Include the file, save the data from $CONFIG
+				include( $i18ndir.$lang.'php' );
+				if( isset( $TRANSLATIONS ) && is_array( $TRANSLATIONS )){
+					$this->translations = $TRANSLATIONS;
+				}
+			}
+
+			if( file_exists( '/l10n/l10n-'.$lang.'php' )){
+				// Include the file, save the data from $CONFIG
+				include( $SERVERROOT.'/l10n/l10n-'.$lang.'php' );
+				if( isset( $LOCALIZATIONS ) && is_array( $LOCALIZATIONS )){
+					$this->localizations = array_merge( $this->localizations, $LOCALIZATIONS );
+				}
+			}
+
+			self::$cache[$app.'::'.$lang]['t'] = $this->translations;
+			self::$cache[$app.'::'.$lang]['l'] = $this->localizations;
+		}
+	}
+
+	/**
+	 * @brief Translating
+	 * @param $text The text we need a translation for
+	 * @returns Translation or the same text
+	 *
+	 * Returns the translation. If no translation is found, $text will be
+	 * returned.
+	 */
+	public function t($text){
+		if(array_key_exists($text, $this->translations)){
+			return $this->translations[$text];
+		}
+		return $text;
+	}
+
+	/**
+	 * @brief Localization
+	 * @param $type Type of localization
+	 * @param $params parameters for this localization
+	 * @returns String or false
+	 *
+	 * Returns the localized data.
+	 * 
+	 * Implemented types:
+	 *  - date
+	 *    - Creates a date
+	 *    - l10n-field: date
+	 *    - params: timestamp (int)
+	 *  - datetime
+	 *    - Creates date and time
+	 *    - l10n-field: datetime
+	 *    - params: timestamp (int)
+	 *  - time
+	 *    - Creates a time
+	 *    - l10n-field: time
+	 *    - params: timestamp (int)
+	 */
+	public function l($type, $data){
+		switch($type){
+			case 'date':
+				return date( $this->localizations['date'], $data );
+				break;
+			case 'datetime':
+				return date( $this->localizations['datetime'], $data );
+				break;
+			case 'time':
+				return date( $this->localizations['time'], $data );
+				break;
+			default:
+				return false;
+		}
+	}
+
+	/**
+	 * @brief Choose a language
+	 * @param $texts Associative Array with possible strings
+	 * @returns String
+	 *
+	 * $text is an array 'de' => 'hallo welt', 'en' => 'hello world', ...
+	 *
+	 * This function is useful to avoid loading thousands of files if only one
+	 * simple string is needed, for example in appinfo.php
+	 */
+	public static function selectLanguage( $text ){
+		$lang = self::findLanguage( array_keys( $text ));
+		return $text[$lang];
+	}
+
+	/**
+	 * @brief find the best language
+	 * @param $app Array or string, details below
+	 * @returns language
+	 *
+	 * If $app is an array, ownCloud assumes that these are the available
+	 * languages. Otherwise ownCloud tries to find the files in the l10n 
+	 * folder.
+	 *
+	 * If nothing works it returns 'en'
+	 */
+	public static function findLanguage( $app = null ){
+		if( !is_array( $app) && self::$language != '' ){
+			return self::$language;
+		}
+
+		$available = array();
+		if( is_array( $app )){
+			$available = $app;
+		}
+		else{
+			$dir = self::findI18nDir( $app );
+			if( file_exists($dir)){
+				$dh = opendir($dir);
+				while(( $file = readdir( $dh )) !== false ){
+					if( substr( $file, -4, 4 ) == '.php' ){
+						$i = substr( $file, 0, -4 );
+						if( $i != '' ){
+							$available[] = $i;
+						}
+					}
+				}
+				closedir($dh);
+			}
+		}
+
+		if( isset($_SESSION['user_id']) && OC_PREFERENCES::getValue( $_SESSION['user_id'], 'core', 'lang' )){
+			$lang = OC_PREFERENCES::getValue( $_SESSION['user_id'], 'core', 'lang' );
+			self::$language = $lang;
+			if( array_search( $lang, $available )){
+				return $lang;
+			}
+		}
+
+		if( isset( $_SERVER['HTTP_ACCEPT_LANGUAGE'] )){
+			$accepted_languages = preg_split( '/,\s*/', $_SERVER['HTTP_ACCEPT_LANGUAGE'] );
+			foreach( $accepted_languages as $i ){
+				$temp = explode( ';', $i );
+				$temp = explode( '-', $temp[0] );
+				if( array_key_exists( $temp[0], $available )){
+					return $temp[0];
+				}
+			}
+		}
+
+		// Last try: English
+		return 'en';
+	}
+
+	/**
+	 * @brief find the best language
+	 * @param $app App that needs to be translated
+	 * @returns language
+	 *
+	 * Finds the best language. Depends on user settings and browser
+	 * information
+	 */
+	protected static function findI18nDir( $app ){
+		global $SERVERROOT;
+		
+		// find the i18n dir
+		$i18ndir = $SERVERROOT.'/l10n/';
+		if( $app != 'core' && $app != '' ){
+			// Check if the app is in the app folder
+			if( file_exists( $SERVERROOT.'/apps/'.$app.'/l10n/' )){
+				$i18ndir = $SERVERROOT.'/apps/'.$app.'/l10n/';
+			}
+			else{
+				$i18ndir = $SERVERROOT.'/'.$app.'/l10n/';
+			}
+		}
+		return $i18ndir;
+	}
+}
\ No newline at end of file
diff --git a/lib/template.php b/lib/template.php
index 93adc35eca7fd0701f45e0df7537a2744a437641..6b9a1c38e11cccec969fd9ae0fd0532ab4b3b6a2 100644
--- a/lib/template.php
+++ b/lib/template.php
@@ -73,8 +73,9 @@ function human_file_size( $bytes ){
 class OC_TEMPLATE{
 	private $renderas; // Create a full page?
 	private $application; // template Application
-	private $vars; // The smarty object
-	private $template; // The smarty object
+	private $vars; // Vars
+	private $template; // The path to the template
+	private $l10n; // The l10n-Object
 
 	/**
 	 * @brief Constructor
@@ -113,6 +114,7 @@ class OC_TEMPLATE{
 		$this->application = $app;
 		$this->template = $template;
 		$this->vars = array();
+		$this->l10n = new OC_L10N($app);
 	}
 
 	/**
@@ -251,6 +253,7 @@ class OC_TEMPLATE{
 	private function _fetch(){
 		// Register the variables
 		$_ = $this->vars;
+		$l = $this->l10n;
 
 		// Execute the template
 		ob_start();