diff --git a/core/l10n/javascript.php b/core/ajax/translations.php
similarity index 100%
rename from core/l10n/javascript.php
rename to core/ajax/translations.php
diff --git a/log/l10n/da.po b/l10n/da/log.po
similarity index 100%
rename from log/l10n/da.po
rename to l10n/da/log.po
diff --git a/core/l10n/de.po b/l10n/de/core.po
similarity index 100%
rename from core/l10n/de.po
rename to l10n/de/core.po
diff --git a/log/l10n/de.po b/l10n/de/log.po
similarity index 100%
rename from log/l10n/de.po
rename to l10n/de/log.po
diff --git a/l10n/l10n.pl b/l10n/l10n.pl
new file mode 100644
index 0000000000000000000000000000000000000000..5463e34e4dcaa6e4543f1e850369bcd2103bd830
--- /dev/null
+++ b/l10n/l10n.pl
@@ -0,0 +1,104 @@
+#!/usr/bin/perl
+use strict;
+use Locale::PO;
+use Cwd;
+use Data::Dumper;
+
+sub crawl{
+	my( $dir ) = @_;
+	my @found = ();
+
+	opendir( DIR, $dir );
+	my @files = readdir( DIR );
+	closedir( DIR );
+
+	foreach my $i ( @files ){
+		next if substr( $i, 0, 1 ) eq '.';
+		if( -d $dir.'/'.$i ){
+			push( @found, crawl( $dir.'/'.$i ));
+		}
+		elsif( $i eq 'xgettextfiles' ){
+			push( @found, $dir );
+		}
+	}
+
+	return @found;
+}
+
+my $task = shift( @ARGV );
+my $place = '..';
+
+die( "Usuage: l10n.pl task\ntask: read, write\n") unless $task && $place;
+
+# Where are i18n-files?
+my @dirs = crawl( $place );
+
+# Languages
+mkdir( 'templates' ) unless -d 'templates';
+
+my @languages = ();
+opendir( DIR, '.' );
+my @files = readdir( DIR );
+closedir( DIR );
+foreach my $i ( @files ){
+	push( @languages, $i ) if -d $i && substr( $i, 0, 1 ) ne '.';
+}
+
+# Our current position
+my $whereami = cwd();
+
+if( $task eq 'read' ){
+	foreach my $dir ( @dirs ){
+		my @temp = split( /\//, $dir );
+		pop( @temp );
+		my $app = pop( @temp );
+		chdir( $dir );
+		foreach my $language ( @languages ){
+			my $output = "${whereami}/$language/$app.po";
+			$output .= 't' if $language eq 'templates';
+			
+			if( -e $output ){
+				`xgettext --files-from=xgettextfiles --join-existing --output="$output" --keyword=t`
+			}
+			else{
+				`xgettext --files-from=xgettextfiles --output="$output" --keyword=t`
+			}
+		}
+		chdir( $whereami );
+	}
+}
+elsif( $task eq 'write' ){
+	foreach my $dir ( @dirs ){
+		my @temp = split( /\//, $dir );
+		pop( @temp );
+		my $app = pop( @temp );
+		chdir( $dir );
+		foreach my $language ( @languages ){
+			next if $language eq 'templates';
+			
+			my $input = "${whereami}/$language/$app.po";
+			next unless -e $input;
+
+			my $hash = Locale::PO->load_file_ashash( $input );
+
+			# Create array
+			my @strings = ();
+			foreach my $key ( keys( %{$hash} )){
+				next if $key eq '""';
+				next if $hash->{$key}->msgstr() eq '""';
+				push( @strings, $hash->{$key}->msgid()." => ".$hash->{$key}->msgstr());
+			}
+
+			# Write PHP file
+			open( OUT, ">$lang.php" );
+			print OUT "<?php \$TRANSLATIONS = array(\n";
+			print OUT join( ",\n", @strings );
+			print OUT "\n);\n";
+			close( OUT );
+		}
+		chdir( $whereami );
+	}
+}
+else{
+	print "unknown task!\n";
+}
diff --git a/core/l10n/nl.po b/l10n/nl/core.po
similarity index 100%
rename from core/l10n/nl.po
rename to l10n/nl/core.po
diff --git a/log/l10n/messages.pot b/l10n/nl/log.po
similarity index 100%
rename from log/l10n/messages.pot
rename to l10n/nl/log.po
diff --git a/settings/l10n/nl.po b/l10n/nl/settings.po
similarity index 100%
rename from settings/l10n/nl.po
rename to l10n/nl/settings.po
diff --git a/admin/l10n/messages.pot b/l10n/templates/admin.pot
similarity index 100%
rename from admin/l10n/messages.pot
rename to l10n/templates/admin.pot
diff --git a/core/l10n/messages.pot b/l10n/templates/core.pot
similarity index 100%
rename from core/l10n/messages.pot
rename to l10n/templates/core.pot
diff --git a/log/l10n/nl.po b/l10n/templates/log.pot
similarity index 100%
rename from log/l10n/nl.po
rename to l10n/templates/log.pot
diff --git a/settings/l10n/messages.pot b/l10n/templates/settings.pot
similarity index 100%
rename from settings/l10n/messages.pot
rename to l10n/templates/settings.pot
diff --git a/lib/l10n.php b/lib/l10n.php
index 729310825dd746643b1810a891b23cd43a289c8a..ff0238241a6802503623639092302e2dbbf4e8d2 100644
--- a/lib/l10n.php
+++ b/lib/l10n.php
@@ -81,9 +81,9 @@ class OC_L10N{
 				}
 			}
 
-			if( file_exists( $SERVERROOT.'/l10n/l10n-'.$lang.'.php' )){
+			if( file_exists( $SERVERROOT.'/core/l10n/l10n-'.$lang.'.php' )){
 				// Include the file, save the data from $CONFIG
-				include( $SERVERROOT.'/l10n/l10n-'.$lang.'.php' );
+				include( $SERVERROOT.'/core/l10n/l10n-'.$lang.'.php' );
 				if( isset( $LOCALIZATIONS ) && is_array( $LOCALIZATIONS )){
 					$this->localizations = array_merge( $this->localizations, $LOCALIZATIONS );
 				}
@@ -231,8 +231,8 @@ class OC_L10N{
 		global $SERVERROOT;
 		
 		// find the i18n dir
-		$i18ndir = $SERVERROOT.'/l10n/';
-		if( $app != 'core' && $app != '' ){
+		$i18ndir = $SERVERROOT.'/core/l10n/';
+		if( $app != '' ){
 			// Check if the app is in the app folder
 			if( file_exists( $SERVERROOT.'/apps/'.$app.'/l10n/' )){
 				$i18ndir = $SERVERROOT.'/apps/'.$app.'/l10n/';
diff --git a/log/l10n/log b/log/l10n/log
deleted file mode 100644
index f70eb6af3fefe084380d7a48b40131f3bf70296c..0000000000000000000000000000000000000000
--- a/log/l10n/log
+++ /dev/null
@@ -1,4 +0,0 @@
-[General]
-LangCode=de
-ProjectID=oc_log
-TargetLangCode=de