diff --git a/i18n/.tx/config b/i18n/.tx/config
index d7146be..3695b70 100644
--- a/i18n/.tx/config
+++ b/i18n/.tx/config
@@ -2,19 +2,19 @@
 host = https://www.transifex.com
 
 [josm.core]
-file_filter = po/<lang>.po
+file_filter = po/<lang>/core.po
 source_file = po/core.pot
 source_lang = en
 type = PO
 
 [josm.data]
-file_filter = po/<lang>.po
+file_filter = po/<lang>/data.po
 source_file = po/data.pot
 source_lang = en
 type = PO
 
 [josm.plugins]
-file_filter = po/<lang>.po
+file_filter = po/<lang>/plugins.po
 source_file = po/plugins.pot
 source_lang = en
 type = PO
diff --git a/i18n/build.xml b/i18n/build.xml
index 48200c7..f3c4c3f 100644
--- a/i18n/build.xml
+++ b/i18n/build.xml
@@ -1,6 +1,8 @@
 <?xml version="1.0" encoding="utf-8"?>
 <project name="JOSM i18n" default="build" basedir=".">
     <!-- compilation properties -->
+    <property name="languages" value="bg,ca,cs,da,de,el,en_AU,en_GB,es,et,eu,fi,fr,gl,hu,id,it,ja,nb,nl,pl,pt,pt_BR,ru,sk,sv,tr,uk,zh_CN,zh_TW"/>
+    <property name="transifex.bin" value="tx"/>
     <property name="josm.build.dir" value="../core"/>
     <property name="josm.presets" value="${josm.build.dir}/data/defaultpresets.xml"/>
     <property name="josm.style" value="${josm.build.dir}/styles/standard/elemstyles.xml"/>
@@ -44,15 +46,6 @@
         </exec>
         <copy file="specialmessages.java" todir="${i18n.build.dir}"/>
     </target>
-    <target name="po/josm.pot" description="Extracts message keys from the source code" depends="trans_.java,init">
-        <gettext-extract keysFile="josm.pot" poDirectory="po" keywords="-k -ktrc:1c,2 -kmarktrc:1c,2 -ktr -kmarktr -ktrn:1,2 -ktrnc:1c,2,3">
-            <fileset dir="${josm.build.dir}/src" includes="**/*.java"/>
-            <fileset dir="${i18n.build.dir}" includes="specialmessages.java"/>
-            <fileset dir="${i18n.build.dir}" includes="trans_*.java"/>
-            <fileset dir="${josm.build.dir}/data/validator" includes="*.mapcss"/>
-            <fileset dir="${plugin.dir}" includes="**/*.java"/>
-        </gettext-extract>
-    </target>
     <target name="po/core.pot" description="Extracts message keys from the JOSM core source code" depends="builddir,init">
         <gettext-extract keysFile="core.pot" poDirectory="po" keywords="-k -ktrc:1c,2 -kmarktrc:1c,2 -ktr -kmarktr -ktrn:1,2 -ktrnc:1c,2,3">
             <fileset dir="${josm.build.dir}/src" includes="**/*.java"/>
@@ -79,7 +72,7 @@
             <arg line="--unique po/core.pot ${i18n.build.dir}/core.2.pot ${i18n.build.dir}/plugins.raw.pot"/>
         </exec>
     </target>
-    <target name="build" depends="po/josm.pot,init">
+    <target name="build" depends="init">
         <gettext-merge keysFile="josm.pot" poDirectory="po"/>
         <antcall target="coretrans"/>
         <foreach param="path" target="plugintrans">
@@ -88,13 +81,12 @@
             </path>
         </foreach>
     </target>
-    <target name="singleplugintrans" depends="po/josm.pot,init">
+    <target name="singleplugintrans" depends="init">
         <antcall target="plugintrans">
             <param name="path" value="${plugin}"/>
         </antcall>
     </target>
-    <target name="buildcore" depends="po/josm.pot,init">
-        <gettext-merge keysFile="josm.pot" poDirectory="po"/>
+    <target name="buildcore" depends="init">
         <antcall target="coretrans"/>
     </target>
     <target name="coretrans">
@@ -106,7 +98,7 @@
             <fileset dir="${josm.build.dir}/data/validator" includes="*.mapcss"/>
         </gettext-extract>
         <copy todir="${po.build.dir}/core">
-            <fileset dir="po"/>
+            <fileset dir="po" includes="*.po"/>
         </copy>
         <gettext-merge keysFile="josm.pot" poDirectory="${po.build.dir}/core"/>
         <exec executable="perl">
@@ -127,7 +119,7 @@
             <available file="${po.build.dir}/plugin_${dir}/josm.pot"/>
             <then>
                 <copy todir="${po.build.dir}/plugin_${dir}">
-                    <fileset dir="po"/>
+                    <fileset dir="po" includes="*.po"/>
                 </copy>
                 <gettext-merge keysFile="josm.pot" poDirectory="${po.build.dir}/plugin_${dir}"/>
                 <exec executable="perl">
@@ -139,13 +131,8 @@
     </target>
     <target name="clean">
         <delete dir="${i18n.build.dir}"/>
-        <delete file="po/josm.pot"/>
-        <delete>
-            <fileset dir="po" includes="*.*~" defaultexcludes="false"/>
-        </delete>
-        <delete>
-            <fileset dir="po" includes="*.po" defaultexcludes="false"/>
-        </delete>
+        <delete dir="po"/>
+        <mkdir dir="po"/>
     </target>
     <target name="test">
         <mkdir dir="${i18n.build.dir}/test"/>
@@ -153,18 +140,33 @@
             <arg line="i18n.pl ${i18n.build.dir}/test/ po/*.po"/>
         </exec>
     </target>
-    <target name="pot" depends="po/josm.pot" />
+    <target name="pot" depends="transifex" />
     <target name="transifex" depends="po/core.pot,po/plugins.pot,po/data.pot" />
-    <target name="update">
-        <exec executable="perl">
-            <arg line="launchpad.pl bzronly"/>
+    <target name="fetch-po" depends="init">
+        <exec executable="${transifex.bin}">
+            <arg line="pull"/>
+            <arg line="--language=${languages}"/>
         </exec>
+        <foreach param="path" target="concatenate-po">
+            <path>
+                <dirset dir="po" includes="*"/>
+            </path>
+        </foreach>
+    </target>
+    <target name="concatenate-po">
+        <basename file="${path}" property="lang"/>
+        <echo message="Combining ${lang} language files"/>
+        <exec executable="msgcat">
+            <arg line="${path}/core.po"/>
+            <arg line="${path}/data.po"/>
+            <arg line="${path}/plugins.po"/>
+            <arg line="--output-file=po/${lang}.po"/>
+        </exec>
+    </target>
+    <target name="update" depends="fetch-po">
         <antcall target="build"/>       
     </target>
-    <target name="updatecore">
-        <exec executable="perl">
-            <arg line="launchpad.pl bzronly"/>
-        </exec>
+    <target name="updatecore" depends="fetch-po">
         <antcall target="buildcore"/>       
     </target>
 </project>
