diff --git a/build.gradle b/build.gradle
index 2c535f4f..6a768618 100644
--- a/build.gradle
+++ b/build.gradle
@@ -38,6 +38,11 @@ subprojects {
     include '**/*'
   }
 
+  tasks.withType(JavaCompile) { 
+    sourceCompatibility = "1.7"
+    targetCompatibility = "1.7" 
+  }
+
   eclipseProject.dependsOn copySettings
 
   // create emacs JDEE project settings
diff --git a/gradle.properties b/gradle.properties
index 449ef9ba..77c2f3eb 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -18,4 +18,4 @@ org.gradle.jvmargs=-Xmx1024m -XX:MaxPermSize=512m
 
 # options to speed up compilation once everything else is working:
 org.gradle.parallel=false
-org.gradle.configureondemand=false
+org.gradle.configureondemand=true
diff --git a/jni/.cproject b/jni/.cproject
index 240904ed..7d6e691b 100644
--- a/jni/.cproject
+++ b/jni/.cproject
@@ -5,26 +5,42 @@
 			<storageModule buildSystemId="org.eclipse.cdt.managedbuilder.core.configurationDataProvider" id="cdt.managedbuild.toolchain.gnu.base.1587393048" moduleId="org.eclipse.cdt.core.settings" name="Default">
 				<externalSettings/>
 				<extensions>
-					<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
 					<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
 					<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
 					<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
 					<extension id="org.eclipse.cdt.core.GASErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
 					<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
+					<extension id="org.eclipse.cdt.core.ELF" point="org.eclipse.cdt.core.BinaryParser"/>
 				</extensions>
 			</storageModule>
 			<storageModule moduleId="cdtBuildSystem" version="4.0.0">
-				<configuration buildProperties="" id="cdt.managedbuild.toolchain.gnu.base.1587393048" name="Default" parent="org.eclipse.cdt.build.core.emptycfg">
+				<configuration buildProperties="" description="" id="cdt.managedbuild.toolchain.gnu.base.1587393048" name="Default" parent="org.eclipse.cdt.build.core.emptycfg">
 					<folderInfo id="cdt.managedbuild.toolchain.gnu.base.1587393048.116574534" name="/" resourcePath="">
 						<toolChain id="cdt.managedbuild.toolchain.gnu.base.223412825" name="cdt.managedbuild.toolchain.gnu.base" superClass="cdt.managedbuild.toolchain.gnu.base">
 							<targetPlatform archList="all" binaryParser="org.eclipse.cdt.core.ELF" id="cdt.managedbuild.target.gnu.platform.base.385578518" name="Debug Platform" osList="linux,hpux,aix,qnx" superClass="cdt.managedbuild.target.gnu.platform.base"/>
-							<builder id="cdt.managedbuild.target.gnu.builder.base.156937647" managedBuildOn="false" name="Gnu Make Builder.Default" superClass="cdt.managedbuild.target.gnu.builder.base"/>
+							<builder id="cdt.managedbuild.target.gnu.builder.base.156937647" keepEnvironmentInBuildfile="false" managedBuildOn="false" name="Gnu Make Builder" superClass="cdt.managedbuild.target.gnu.builder.base"/>
 							<tool id="cdt.managedbuild.tool.gnu.archiver.base.1823835369" name="GCC Archiver" superClass="cdt.managedbuild.tool.gnu.archiver.base"/>
-							<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.base.360207042" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.base"/>
-							<tool id="cdt.managedbuild.tool.gnu.c.compiler.base.1095290162" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.base"/>
+							<tool id="cdt.managedbuild.tool.gnu.cpp.compiler.base.360207042" name="GCC C++ Compiler" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.base">
+								<inputType id="cdt.managedbuild.tool.gnu.cpp.compiler.input.111801070" superClass="cdt.managedbuild.tool.gnu.cpp.compiler.input"/>
+							</tool>
+							<tool id="cdt.managedbuild.tool.gnu.c.compiler.base.1095290162" name="GCC C Compiler" superClass="cdt.managedbuild.tool.gnu.c.compiler.base">
+								<option id="gnu.c.compiler.option.include.paths.542022155" superClass="gnu.c.compiler.option.include.paths" valueType="includePath">
+									<listOptionValue builtIn="false" value="/usr/lib/jvm/java-7-openjdk-amd64/include"/>
+									<listOptionValue builtIn="false" value="/usr/lib/jvm/java-7-openjdk-amd64/include/linux"/>
+								</option>
+								<inputType id="cdt.managedbuild.tool.gnu.c.compiler.input.506992692" superClass="cdt.managedbuild.tool.gnu.c.compiler.input"/>
+							</tool>
 							<tool id="cdt.managedbuild.tool.gnu.c.linker.base.335083411" name="GCC C Linker" superClass="cdt.managedbuild.tool.gnu.c.linker.base"/>
-							<tool id="cdt.managedbuild.tool.gnu.cpp.linker.base.1727739418" name="GCC C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.base"/>
-							<tool id="cdt.managedbuild.tool.gnu.assembler.base.2019534622" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.base"/>
+							<tool id="cdt.managedbuild.tool.gnu.cpp.linker.base.1727739418" name="GCC C++ Linker" superClass="cdt.managedbuild.tool.gnu.cpp.linker.base">
+								<inputType id="cdt.managedbuild.tool.gnu.cpp.linker.input.1457207088" superClass="cdt.managedbuild.tool.gnu.cpp.linker.input">
+									<additionalInput kind="additionalinputdependency" paths="$(USER_OBJS)"/>
+									<additionalInput kind="additionalinput" paths="$(LIBS)"/>
+								</inputType>
+							</tool>
+							<tool id="cdt.managedbuild.tool.gnu.assembler.base.2019534622" name="GCC Assembler" superClass="cdt.managedbuild.tool.gnu.assembler.base">
+								<option id="gnu.both.asm.option.include.paths.66240236" name="Include paths (-I)" superClass="gnu.both.asm.option.include.paths" valueType="includePath"/>
+								<inputType id="cdt.managedbuild.tool.gnu.assembler.input.622641223" superClass="cdt.managedbuild.tool.gnu.assembler.input"/>
+							</tool>
 						</toolChain>
 					</folderInfo>
 				</configuration>
@@ -35,8 +51,14 @@
 	<storageModule moduleId="cdtBuildSystem" version="4.0.0">
 		<project id="vtm-jni.null.1777174385" name="vtm-jni"/>
 	</storageModule>
+	<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
 	<storageModule moduleId="scannerConfiguration">
 		<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+		<scannerConfigBuildInfo instanceId="cdt.managedbuild.toolchain.gnu.base.1587393048;cdt.managedbuild.toolchain.gnu.base.1587393048.116574534;cdt.managedbuild.tool.gnu.c.compiler.base.1095290162;cdt.managedbuild.tool.gnu.c.compiler.input.506992692">
+			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+		</scannerConfigBuildInfo>
+		<scannerConfigBuildInfo instanceId="cdt.managedbuild.toolchain.gnu.base.1587393048;cdt.managedbuild.toolchain.gnu.base.1587393048.116574534;cdt.managedbuild.tool.gnu.cpp.compiler.base.360207042;cdt.managedbuild.tool.gnu.cpp.compiler.input.111801070">
+			<autodiscovery enabled="true" problemReportingEnabled="true" selectedProfileId=""/>
+		</scannerConfigBuildInfo>
 	</storageModule>
-	<storageModule moduleId="org.eclipse.cdt.core.LanguageSettingsProviders"/>
 </cproject>
diff --git a/jni/.project b/jni/.project
deleted file mode 100644
index 591bc7f4..00000000
--- a/jni/.project
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>vtm-jni</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name>
-			<triggers>clean,full,incremental,</triggers>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder</name>
-			<triggers>full,incremental,</triggers>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-	<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.cdt.core.cnature</nature>
-		<nature>org.eclipse.cdt.core.ccnature</nature>
-		<nature>org.eclipse.cdt.managedbuilder.core.managedBuildNature</nature>
-		<nature>org.eclipse.cdt.managedbuilder.core.ScannerConfigNature</nature>
-	</natures>
-</projectDescription>
diff --git a/jni/BUILD_JNI.txt b/jni/BUILD_JNI.txt
index 84e3fc63..5ae68d68 100644
--- a/jni/BUILD_JNI.txt
+++ b/jni/BUILD_JNI.txt
@@ -1,18 +1,10 @@
-#!/bin/bash
-
 # Build native libraries:
-# - modify jni/builder/JniBuilder.java for your platform.
-# - get gdx-jnigen, then run:
-
-javac -cp ../vtm-ext-libs/gdx/gdx-jnigen.jar jni/builder/JniBuilder.java
-java -cp ../vtm-ext-libs/gdx/gdx-jnigen.jar:../vtm-ext-libs/gdx/gdx-jnigen-sources.jar:jni/builder JniBuilder
+- modify src/JniBuilder.java for your platform.
 
 ## to build android:
-export ANDROID_HOME=/home/jeff/android-sdk
-export NDK_HOME=/home/jeff/android-ndk-r8d
+export NDK_HOME=/path_to_android_sdk
 
 ## compile
-cd jni
 ant -v
 
 ## copy vtm/libs/armeabi* to vtm-android/libs
diff --git a/jni/build.gradle b/jni/build.gradle
new file mode 100644
index 00000000..ff131d77
--- /dev/null
+++ b/jni/build.gradle
@@ -0,0 +1,14 @@
+repositories {
+  maven { url "https://oss.sonatype.org/content/repositories/snapshots/" }
+}
+
+apply plugin: 'java'
+
+sourceSets {
+  main.java.srcDirs = ['src']
+  main.resources.srcDirs = ['src']
+}
+
+dependencies {
+  compile "com.badlogicgames.gdx:gdx-jnigen:$gdxVersion"
+}
diff --git a/jni/build.xml b/jni/build.xml
index 81c329b9..0869582c 100644
--- a/jni/build.xml
+++ b/jni/build.xml
@@ -1,17 +1,34 @@
 <project name="vtm-jni-natives" basedir="." default="all">
-	<target name="clean">
+  <target name="clean">
 
-	</target>
-	
-	<target name="compile-natives">
+  </target>
 
-	</target>
-	
-	<target name="pack-natives">
-		<jar destfile="../libs/vtm-jni-natives.jar">
+  <target name="compile-natives">
 
-		</jar>
-	</target>
+  </target>
 
-	<target name="all" depends="compile-natives,pack-natives"/>
+  <target name="pack-natives">
+    <jar destfile="../libs/vtm-jni-natives.jar">
+      <manifest>
+        <!-- Who is building this jar? -->
+        <attribute name="Built-By" value="${user.name}" />
+        <!-- Information about the program itself -->
+        <attribute name="Implementation-Vendor" value="VTM" />
+        <attribute name="Implementation-Title" value="VTM" />
+        <attribute name="Implementation-Version" value="0.5.9" />
+      </manifest>
+
+      <fileset dir="../libs/linux64" includes="libvtm-jni64.so" />
+    <!--    
+    <fileset dir="../libs/macosx32" includes="libvtm-jni.dylib"/>
+    <fileset dir="../libs/macosx64" includes="libvtm-jni64.dylib"/>
+    <fileset dir="../libs/windows32" includes="gdx.dll"/>
+    <fileset dir="../libs/windows64" includes="gdx64.dll"/>
+    <fileset dir="../libs/linux32" includes="libvtm-jni.so"/> 
+    -->
+
+    </jar>
+  </target>
+
+  <target name="all" depends="compile-natives,pack-natives" />
 </project>
diff --git a/jni/gl/utils.c b/jni/gl/utils.c
index ce0bcaf1..ff533779 100644
--- a/jni/gl/utils.c
+++ b/jni/gl/utils.c
@@ -97,6 +97,9 @@ transposeM(float* mTrans, int mTransOffset, float* m, int mOffset);
 static inline void
 matrix4_proj(float* mat, float* vec);
 
+static inline void
+matrix4_proj2D(float* mat, float* vec);
+
 jlong JNI(alloc)(JNIEnv *env, jclass* clazz)
 {
   return (long) calloc(16, sizeof(float));
@@ -244,12 +247,36 @@ void JNI(strans)(JNIEnv* env, jclass* clazz, jlong ptr_r, jlong ptr_a)
   transposeM(matr, 0, mata, 0);
 }
 
-void JNI(prj)(JNIEnv* env, jclass* clazz, jlong ptr, jfloatArray obj_vec)
+void JNI(prj)(JNIEnv* env, jclass* clazz, jlong ptr, jfloatArray obj_vec){
+  float* m = CAST(ptr);
+   float* vec = (float*) (*env)->GetPrimitiveArrayCritical(env, obj_vec, 0);
+
+   matrix4_proj(m, vec);
+
+   (*env)->ReleasePrimitiveArrayCritical(env, obj_vec, vec, 0);
+}
+
+void JNI(prj3D)(JNIEnv* env, jclass* clazz, jlong ptr, jfloatArray obj_vec, int offset, int cnt)
 {
   float* m = CAST(ptr);
   float* vec = (float*) (*env)->GetPrimitiveArrayCritical(env, obj_vec, 0);
 
-  matrix4_proj(m, vec);
+  int length = cnt * 3;
+  for (int i = offset * 3; i < length; i += 3)
+      matrix4_proj(m, (vec + i));
+
+  (*env)->ReleasePrimitiveArrayCritical(env, obj_vec, vec, 0);
+}
+
+void JNI(prj2D)(JNIEnv* env, jclass* clazz, jlong ptr, jfloatArray obj_vec, int offset, int cnt)
+{
+  float* m = CAST(ptr);
+  float* vec = (float*) (*env)->GetPrimitiveArrayCritical(env, obj_vec, 0);
+
+  int length = cnt * 2;
+
+  for (int i = offset * 2; i < length; i += 2)
+    matrix4_proj2D(m, (vec + i));
 
   (*env)->ReleasePrimitiveArrayCritical(env, obj_vec, vec, 0);
 }
@@ -490,3 +517,15 @@ matrix4_proj(float* mat, float* vec)
   vec[1] = y;
   vec[2] = z;
 }
+
+static inline void
+matrix4_proj2D(float* mat, float* vec)
+{
+
+  float inv_w = 1.0f / (vec[0] * mat[M30] + vec[1] * mat[M31] + mat[M33]);
+  float x = (vec[0] * mat[M00] + vec[1] * mat[M01] + mat[M03]) * inv_w;
+  float y = (vec[0] * mat[M10] + vec[1] * mat[M11] + mat[M13]) * inv_w;
+
+  vec[0] = x;
+  vec[1] = y;
+}
diff --git a/jni/builder/JniBuilder.java b/jni/src/JniBuilder.java
similarity index 100%
rename from jni/builder/JniBuilder.java
rename to jni/src/JniBuilder.java