diff --git a/Makefile b/Makefile
index 233002f9ca26144bfaa3e754ad27a3a408297bc8..d269055c47448d9824225773e3f4d49d90d56dd1 100644
--- a/Makefile
+++ b/Makefile
@@ -29,6 +29,17 @@ SFLPHONE_APK=$(SRC)/bin/SFLphone-debug.apk
 NDK_DEBUG=1
 endif
 
+define build_apk
+	@echo
+	@echo "=== Building $(SFLPHONE_APK) for $(ARCH) ==="
+	@echo
+	date +"%Y-%m-%d" > $(SRC)/assets/builddate.txt
+	echo `id -u -n`@`hostname` > $(SRC)/assets/builder.txt
+	git rev-parse --short HEAD > $(SRC)/assets/revision.txt
+	./gen-env.sh $(SRC)
+	$(VERBOSE)cd $(SRC) && ant $(ANT_OPTS) $(ANT_TARGET)
+endef
+
 $(SFLPHONE_APK): $(LIBSFLPHONEJNI) $(JAVA_SOURCES)
 	@echo
 	@echo "=== Building $@ for $(ARCH) ==="
@@ -58,6 +69,9 @@ $(LIBSFLPHONEJNI): $(LIBSFLPHONEJNI_H)
 		NDK_DEBUG=$(NDK_DEBUG) \
 		TARGET_CFLAGS="$$SFLPHONE_EXTRA_CFLAGS"
 
+apk:
+	$(call build_apk)
+
 apkclean:
 	rm -f $(SFLPHONE_APK)
 
diff --git a/README.md b/README.md
index 4098b9cd14676be5fc5a36acf4a44e7b36795bdd..55cb67c02bcd8881776dab94a0bb8d3563ebc28c 100644
--- a/README.md
+++ b/README.md
@@ -16,8 +16,9 @@ export PATH=$ANDROID_SDK/platform-tools:${PATH}
 install swig-2.0.6 or later and python-2.7 or later on your system
 
 ## Build instructions
+Supported archs are: armeabi-v7a, armeabi, arm64-v8a, x86, x86_64 or mips
 
-export ANDROID_ABI=armeabi-v7a
+export ANDROID_ABI=[insert list of arch here with spaces]
 ./compile.sh
 
 We use a tested hash to build sflphone core, but if you want to use master:
diff --git a/compile.sh b/compile.sh
index e613d27b05f37e133fc0a4733dd22d2812be2d36..70aaa1a9296174230aa250d946ae995380ca92b6 100755
--- a/compile.sh
+++ b/compile.sh
@@ -6,23 +6,6 @@
 
 set -e
 
-BUILD=
-FETCH=
-case "$1" in
-    --fetch)
-    FETCH=1
-    shift
-    ;;
-    --build)
-    BUILD=1
-    shift
-    ;;
-    *)
-    FETCH=1
-    BUILD=1
-    ;;
-esac
-
 if [ -z "$ANDROID_NDK" -o -z "$ANDROID_SDK" ]; then
    echo "You must define ANDROID_NDK, ANDROID_SDK and ANDROID_ABI before starting."
    echo "They must point to your NDK and SDK directories.\n"
@@ -30,17 +13,109 @@ if [ -z "$ANDROID_NDK" -o -z "$ANDROID_SDK" ]; then
 fi
 
 if [ -z "$ANDROID_ABI" ]; then
-   echo "Please set ANDROID_ABI to your architecture: armeabi-v7a, armeabi, x86 or mips."
+   echo "Please set ANDROID_ABI to your architecture: armeabi-v7a, armeabi, arm64-v8a, x86, x86_64 or mips."
    exit 1
 fi
 
+if [ -z "$NO_FPU" ];then
+    NO_FPU=0
+fi
+if [ -z "$NO_ARMV6" ];then
+    NO_ARMV6=0
+fi
+
+BUILD=0
+FETCH=0
+RELEASE=0
+JNI=0
+
+for i in ${@}; do
+    case "$i" in
+        --fetch)
+        FETCH=1
+        ;;
+        --build)
+        BUILD=1
+        ;;
+        release|--release)
+        RELEASE=1
+        ;;
+        jni|--jni)
+        JNI=1
+        ;;
+        *)
+        ;;
+    esac
+done
+
+if [ "$BUILD" = 0 -a "$FETCH" = 0 ];then
+    BUILD=1
+    FETCH=1
+fi
+
+if [ `set -- ${ANDROID_ABI}; echo $#` -gt 1 ]; then
+    ANDROID_ABI_LIST="${ANDROID_ABI}"
+    echo "More than one ABI specified: ${ANDROID_ABI_LIST}"
+    for i in ${ANDROID_ABI_LIST}; do
+        echo "$i starts building"
+        ANDROID_NDK=$ANDROID_NDK ANDROID_SDK=$ANDROID_SDK \
+            NO_FPU=$NO_FPU NO_ARMV6=$NO_ARMV6 ANDROID_ABI=$i \
+            ./compile.sh $* --jni || { echo "$i build KO"; exit 1; }
+        mkdir -p obj/
+        cp -r sflphone-android/libs/$i obj
+        echo "$i build OK"
+    done
+    for i in ${ANDROID_ABI_LIST}; do
+        cp -r obj/$i sflphone-android/libs/
+        rm -rf obj/$i
+    done
+    make -b -j1 RELEASE=$RELEASE apk || exit 1
+    exit 0
+fi
+
+HAVE_ARM=0
+HAVE_X86=0
+HAVE_MIPS=0
+HAVE_64=0
+
+
+# Set up ABI variables
+if [ ${ANDROID_ABI} = "x86" ] ; then
+    TARGET_TUPLE="i686-linux-android"
+    PATH_HOST="x86"
+    HAVE_X86=1
+    PLATFORM_SHORT_ARCH="x86"
+elif [ ${ANDROID_ABI} = "x86_64" ] ; then
+    TARGET_TUPLE="x86_64-linux-android"
+    PATH_HOST="x86_64"
+    HAVE_X86=1
+    HAVE_64=1
+    PLATFORM_SHORT_ARCH="x86_64"
+elif [ ${ANDROID_ABI} = "mips" ] ; then
+    TARGET_TUPLE="mipsel-linux-android"
+    PATH_HOST=$TARGET_TUPLE
+    HAVE_MIPS=1
+    PLATFORM_SHORT_ARCH="mips"
+elif [ ${ANDROID_ABI} = "arm64-v8a" ] ; then
+    TARGET_TUPLE="aarch64-linux-android"
+    PATH_HOST=$TARGET_TUPLE
+    HAVE_ARM=1
+    HAVE_64=1
+    PLATFORM_SHORT_ARCH="arm64"
+else
+    TARGET_TUPLE="arm-linux-androideabi"
+    PATH_HOST=$TARGET_TUPLE
+    HAVE_ARM=1
+    PLATFORM_SHORT_ARCH="arm"
+fi
+
 # try to detect NDK version
 REL=$(grep -o '^r[0-9]*.*' $ANDROID_NDK/RELEASE.TXT 2>/dev/null|cut -b2-)
 case "$REL" in
     10*)
         if [ "${HAVE_64}" = 1 ];then
             GCCVER=4.9
-            ANDROID_API=android-L
+            ANDROID_API=android-21
         else
             GCCVER=4.8
             ANDROID_API=android-9
@@ -66,24 +141,6 @@ export GCCVER
 export CXXSTL
 export ANDROID_API
 
-# Set up ABI variables
-if [ ${ANDROID_ABI} = "x86" ] ; then
-    TARGET_TUPLE="i686-linux-android"
-    PATH_HOST="x86"
-    HAVE_X86=1
-    PLATFORM_SHORT_ARCH="x86"
-elif [ ${ANDROID_ABI} = "mips" ] ; then
-    TARGET_TUPLE="mipsel-linux-android"
-    PATH_HOST=$TARGET_TUPLE
-    HAVE_MIPS=1
-    PLATFORM_SHORT_ARCH="mips"
-else
-    TARGET_TUPLE="arm-linux-androideabi"
-    PATH_HOST=$TARGET_TUPLE
-    HAVE_ARM=1
-    PLATFORM_SHORT_ARCH="arm"
-fi
-
 # XXX : important!
 [ "$HAVE_ARM" = 1 ] && cat << EOF
 For an ARMv6 device without FPU:
@@ -99,6 +156,7 @@ export PATH_HOST
 export HAVE_ARM
 export HAVE_X86
 export HAVE_MIPS
+export HAVE_64
 export PLATFORM_SHORT_ARCH
 
 # Add the NDK toolchain to the PATH, needed both for contribs and for building
@@ -168,8 +226,12 @@ elif [ ${ANDROID_ABI} = "armeabi" ] ; then
             EXTRA_CFLAGS="-mfpu=vfp -mcpu=arm1136jf-s -mfloat-abi=softfp"
         fi
     fi
+elif [ ${ANDROID_ABI} = "arm64-v8a" ] ; then
+    EXTRA_CFLAGS=""
 elif [ ${ANDROID_ABI} = "x86" ] ; then
-    EXTRA_CFLAGS="-march=pentium"
+    EXTRA_CFLAGS="-march=pentium -m32"
+elif [ ${ANDROID_ABI} = "x86_64" ] ; then
+    EXTRA_CFLAGS=""
 elif [ ${ANDROID_ABI} = "mips" ] ; then
     EXTRA_CFLAGS="-march=mips32 -mtune=mips32r2 -mhard-float"
     # All MIPS Linux kernels since 2.4.4 will trap any unimplemented FPU
@@ -185,7 +247,7 @@ EXTRA_CFLAGS="${EXTRA_CFLAGS} -I${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++${CX
 EXTRA_CFLAGS="${EXTRA_CFLAGS} -I${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++${CXXSTL}/libs/${ANDROID_ABI}/include"
 
 # Setup LDFLAGS
-EXTRA_LDFLAGS="-l${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++${CXXSTL}/libs/${ANDROID_ABI}/libgnustl_static.a"
+EXTRA_LDFLAGS="-L${ANDROID_NDK}/sources/cxx-stl/gnu-libstdc++${CXXSTL}/libs/${ANDROID_ABI} -lgnustl_static"
 
 # Make in //
 UNAMES=$(uname -s)
@@ -259,31 +321,59 @@ which autopoint >/dev/null || make $MAKEFLAGS .gettext
 export PATH="$PATH:$PWD/../$TARGET_TUPLE/bin"
 
 export SFLPHONE_BUILD_DIR=sflphone/daemon/build-android-${TARGET_TUPLE}
+
 ############
 # Make SFLPHONE #
 ############
 cd ../.. && mkdir -p build-android-${TARGET_TUPLE} && cd build-android-${TARGET_TUPLE}
 
-if [ $# -eq 1 ] && [ "$1" = "jni" ]; then
+if [ "$JNI" = 1 ]; then
     CLEAN="jniclean"
     TARGET="sflphone-android/obj/local/${ANDROID_ABI}/libsflphone.so"
 else
     CLEAN="distclean"
-    if [ ! -f config.h ]; then
-        echo "Bootstraping"
-        cd ../
-        ./autogen.sh
-        cd ../../
-        cd sflphone-android
-        ./make-swig.sh
-        cd ../sflphone/daemon/build-android-${TARGET_TUPLE}
-        echo "Configuring"
-        echo `pwd`
-        ${ANDROID_PATH}/configure.sh ${OPTS}
-    fi
     TARGET=
 fi
 
+if [ ! -f config.h ]; then
+    echo "Bootstraping"
+    cd ../
+    ./autogen.sh
+    cd ../../
+    cd sflphone-android
+    ./make-swig.sh
+    cd ../sflphone/daemon/build-android-${TARGET_TUPLE}
+    echo "Configuring"
+    ${ANDROID_PATH}/configure.sh ${OPTS}
+fi
+
+# ANDROID NDK FIXUP (BLAME GOOGLE)
+config_undef ()
+{
+    previous_change=`stat -c "%y" config.h`
+    sed -i 's,#define '$1' 1,/\* #undef '$1' \*/,' config.h
+    # don't change modified date in order to don't trigger a full build
+    touch -d "$previous_change" config.h
+}
+
+# if config dependencies change, ./config.status --recheck
+# is run and overwrite previously hacked config.h. So call make Makefile here
+# and hack config.h after.
+
+make $MAKEFLAGS Makefile
+
+if [ ${ANDROID_ABI} = "x86" -a ${ANDROID_API} != "android-21" ] ; then
+    # NDK x86 libm.so has nanf symbol but no nanf definition, we don't known if
+    # intel devices has nanf. Assume they don't have it.
+    config_undef HAVE_NANF
+fi
+if [ ${ANDROID_API} = "android-21" ] ; then
+    # android-21 has empty sys/shm.h headers that triggers shm detection but it
+    # doesn't have any shm functions and/or symbols. */
+    config_undef HAVE_SYS_SHM_H
+fi
+# END OF ANDROID NDK FIXUP
+
 echo "Building libsflphone"
 make $MAKEFLAGS
 
diff --git a/gen-env.sh b/gen-env.sh
new file mode 100755
index 0000000000000000000000000000000000000000..73574344ce92b221cc029f1cc47d5f81b9341082
--- /dev/null
+++ b/gen-env.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+# Simple script to generate env.txt
+ENVTXT=$1/assets/env.txt
+
+function optional_var {
+	echo -n "$1=" >> $ENVTXT
+	ONE=\$$1
+	T=`eval echo $ONE`
+	if [ -z "$T" ]; then
+		echo -n "0" >> $ENVTXT
+	else
+		echo -n "$T" >> $ENVTXT
+	fi
+	echo -n -e "\n" >> $ENVTXT
+}
+
+rm -f $ENVTXT
+echo -e "ANDROID_ABI=$ANDROID_ABI" >> $ENVTXT
+optional_var "NO_FPU"
+optional_var "NO_ARMV6"