diff --git a/crowdin_sync.py b/crowdin_sync.py
index b5d5294..ddbcb00 100755
--- a/crowdin_sync.py
+++ b/crowdin_sync.py
@@ -49,11 +49,11 @@
     return comm, exit_code
 
 
-def push_as_commit(path, name, branch, username):
+def push_as_commit(base_path, path, name, branch, username):
     print('Committing %s on branch %s' % (name, branch))
 
     # Get path
-    path = os.path.join(os.getcwd(), path)
+    path = os.path.join(base_path, path)
     if not path.endswith('.git'):
         path = os.path.join(path, '.git')
 
@@ -93,8 +93,8 @@
         sys.exit(ret)
 
 
-def find_xml():
-    for dp, dn, file_names in os.walk(os.getcwd()):
+def find_xml(base_path):
+    for dp, dn, file_names in os.walk(base_path):
         for f in file_names:
             if os.path.splitext(f)[1] == '.xml':
                 yield os.path.join(dp, f)
@@ -128,9 +128,7 @@
     return True
 
 
-def load_xml(x='android/default.xml'):
-    # Variables regarding android/default.xml
-    print('Loading: %s' % x)
+def load_xml(x):
     try:
         return minidom.parse(x)
     except IOError:
@@ -142,10 +140,10 @@
         return None
 
 
-def check_files(branch):
-    files = ['crowdin/extra_packages_%s.xml' % branch,
-             'crowdin/crowdin_%s.yaml' % branch,
-             'crowdin/crowdin_%s_aosp.yaml' % branch
+def check_files(cwd, branch):
+    files = ['%s/crowdin/extra_packages_%s.xml' % (cwd, branch),
+             '%s/crowdin/crowdin_%s.yaml' % (cwd, branch),
+             '%s/crowdin/crowdin_%s_aosp.yaml' % (cwd, branch)
              ]
     for f in files:
         if not os.path.isfile(f):
@@ -156,36 +154,36 @@
 # ################################### MAIN ################################### #
 
 
-def upload_crowdin(branch, no_upload=False):
+def upload_crowdin(cwd, branch, no_upload=False):
     if no_upload:
         print('Skipping source translations upload')
         return
 
     print('\nUploading Crowdin source translations (AOSP supported languages)')
-    # Execute 'crowdin-cli upload sources' and show output
-    check_run(['crowdin-cli', '--config=crowdin/crowdin_%s.yaml' % branch,
+    check_run(['crowdin-cli',
+               '--config=%s/crowdin/crowdin_%s.yaml' % (cwd, branch),
                'upload', 'sources'])
 
     print('\nUploading Crowdin source translations '
           '(non-AOSP supported languages)')
-    # Execute 'crowdin-cli upload sources' and show output
-    check_run(['crowdin-cli', '--config=crowdin/crowdin_%s_aosp.yaml' % branch,
+    check_run(['crowdin-cli',
+               '--config=%s/crowdin/crowdin_%s_aosp.yaml' % (cwd, branch),
                'upload', 'sources'])
 
 
-def download_crowdin(branch, xml, username, no_download=False):
+def download_crowdin(base_path, cwd, branch, xml, username, no_download=False):
     if no_download:
         print('Skipping translations download')
         return
 
     print('\nDownloading Crowdin translations (AOSP supported languages)')
-    # Execute 'crowdin-cli download' and show output
-    check_run(['crowdin-cli', '--config=crowdin/crowdin_%s.yaml' % branch,
+    check_run(['crowdin-cli',
+               '--config=%s/crowdin/crowdin_%s.yaml' % (cwd, branch),
                'download', '--ignore-match'])
 
     print('\nDownloading Crowdin translations (non-AOSP supported languages)')
-    # Execute 'crowdin-cli download' and show output
-    check_run(['crowdin-cli', '--config=crowdin/crowdin_%s_aosp.yaml' % branch,
+    check_run(['crowdin-cli',
+               '--config=%s/crowdin/crowdin_%s_aosp.yaml' % (cwd, branch),
                'download', '--ignore-match'])
 
     print('\nRemoving useless empty translation files')
@@ -200,7 +198,7 @@
          ' xmlns:xliff="urn:oasis:names:tc:xliff:document:1.2"/>')
     }
     xf = None
-    for xml_file in find_xml():
+    for xml_file in find_xml(base_path):
         xf = open(xml_file).read()
         for line in empty_contents:
             if line in xf:
@@ -213,8 +211,8 @@
     # Get all files that Crowdin pushed
     paths = []
     files = [
-        ('crowdin/crowdin_%s.yaml' % branch),
-        ('crowdin/crowdin_%s_aosp.yaml' % branch)
+        ('%s/crowdin/crowdin_%s.yaml' % (cwd, branch)),
+        ('%s/crowdin/crowdin_%s_aosp.yaml' % (cwd, branch))
     ]
     for c in files:
         cmd = ['crowdin-cli', '--config=%s' % c, 'list', 'sources']
@@ -266,30 +264,44 @@
 
             br = project.getAttribute('revision') or branch
 
-            push_as_commit(result, project.getAttribute('name'), br, username)
+            push_as_commit(base_path, result,
+                           project.getAttribute('name'), br, username)
             break
 
 
 def main():
     args = parse_args()
     default_branch = args.branch
+    cwd = os.getcwd()
+
+    base_path = os.getenv('CM_CROWDIN_BASE_PATH')
+    if base_path is None:
+        print('You have not set CM_CROWDIN_BASE_PATH. Defaulting to %s' % cwd)
+        base_path = cwd
+    else:
+        base_path = os.path.join(os.path.realpath(base_path), default_branch)
+    if not os.path.isdir(base_path):
+        print('CM_CROWDIN_BASE_PATH + branch is not a real directory: %s'
+              % base_path)
+        sys.exit(1)
 
     if not check_dependencies():
         sys.exit(1)
 
-    xml_android = load_xml()
+    xml_android = load_xml(x='%s/android/default.xml' % base_path)
     if xml_android is None:
         sys.exit(1)
 
-    xml_extra = load_xml(x='crowdin/extra_packages_%s.xml' % default_branch)
+    xml_extra = load_xml(x='%s/crowdin/extra_packages_%s.xml'
+                           % (cwd, default_branch))
     if xml_extra is None:
         sys.exit(1)
 
-    if not check_files(default_branch):
+    if not check_files(cwd, default_branch):
         sys.exit(1)
 
-    upload_crowdin(default_branch, args.no_upload)
-    download_crowdin(default_branch, (xml_android, xml_extra),
+    upload_crowdin(cwd, default_branch, args.no_upload)
+    download_crowdin(base_path, cwd, default_branch, (xml_android, xml_extra),
                      args.username, args.no_download)
     print('\nDone!')
 
