diff --git a/README.md b/README.md
index 9228d767246c4f6dd0bb724032f9737e0f823ce8..521b5cb16edc4bebc0793779dbb3437765397fdc 100644
--- a/README.md
+++ b/README.md
@@ -85,3 +85,7 @@ All of these ANT scripts have the following main targets:
 * `buildLibAndSrc`: same as `buildLib` + building of a JAR file containing all the sources and the required libraries.
 * `buildJavadoc`: generate a JAR containing the Javadoc of the target library's classes.
 * `buildAll`: equivalent of `buildLibAndSrc` and `buildJavadoc` together. The result is 3 JARs: one with the compiled classes, one with the corresponding sources and the last one with the Javadoc.
+
+### Gradle build
+The code can be built with Gradle, either as a jar file to be included in other projects 
+or as a war file to be deployed in Tomcat.
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000000000000000000000000000000000000..2c62f1b45af54788e148d3bac744c745a3bc12a8
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,21 @@
+apply plugin: 'java'
+apply plugin: 'war'
+
+repositories {
+    jcenter()
+    mavenCentral()
+    mavenLocal()
+}
+
+dependencies {
+    compile fileTree(dir: 'lib', include: '*.jar')
+    compile 'javax.servlet:javax.servlet-api:3.0.1'
+    compile 'postgresql:postgresql:9.1-901.jdbc4'
+
+    testCompile 'simple-jndi:simple-jndi:0.11.4.1'
+    testCompile 'junit:junit:4.12'
+}
+
+sourceSets.main.java.srcDirs = ["src"]
+// the tests fail because they have environemnt specific parameters
+// sourceSets.test.java.srcDirs = ["test"]
diff --git a/src/adql/translator/SQLServerTranslator.java b/src/adql/translator/SQLServerTranslator.java
index 8eb7022d78709186396436a95507a56081f63eef..b147bee54053ac18631feaba821b519f2720f5fe 100644
--- a/src/adql/translator/SQLServerTranslator.java
+++ b/src/adql/translator/SQLServerTranslator.java
@@ -19,18 +19,9 @@ package adql.translator;
  * Copyright 2016 - Astronomisches Rechen Institut (ARI)
  */
 
-import java.util.ArrayList;
-import java.util.Iterator;
-
-import adql.db.DBChecker;
-import adql.db.DBColumn;
-import adql.db.DBTable;
-import adql.db.DBType;
+import adql.db.*;
 import adql.db.DBType.DBDatatype;
-import adql.db.DefaultDBColumn;
-import adql.db.DefaultDBTable;
 import adql.db.STCS.Region;
-import adql.db.SearchColumnList;
 import adql.db.exception.UnresolvedJoinException;
 import adql.parser.ADQLParser;
 import adql.parser.ParseException;
@@ -41,18 +32,10 @@ import adql.query.IdentifierField;
 import adql.query.from.ADQLJoin;
 import adql.query.operand.ADQLColumn;
 import adql.query.operand.function.MathFunction;
-import adql.query.operand.function.geometry.AreaFunction;
-import adql.query.operand.function.geometry.BoxFunction;
-import adql.query.operand.function.geometry.CentroidFunction;
-import adql.query.operand.function.geometry.CircleFunction;
-import adql.query.operand.function.geometry.ContainsFunction;
-import adql.query.operand.function.geometry.DistanceFunction;
-import adql.query.operand.function.geometry.ExtractCoord;
-import adql.query.operand.function.geometry.ExtractCoordSys;
-import adql.query.operand.function.geometry.IntersectsFunction;
-import adql.query.operand.function.geometry.PointFunction;
-import adql.query.operand.function.geometry.PolygonFunction;
-import adql.query.operand.function.geometry.RegionFunction;
+import adql.query.operand.function.geometry.*;
+
+import java.util.ArrayList;
+import java.util.Iterator;
 
 /**
  * <p>MS SQL Server translator.</p>
@@ -189,7 +172,7 @@ public class SQLServerTranslator extends JDBCTranslator {
 
 		for(int i = 0; i < clause.size(); i++){
 			if (i == 0){
-				sql = clause.getName() + (clause.hasLimit() ? " TOP " + clause.getLimit() + " " : "") + (clause.distinctColumns() ? " DISTINCT" : "");
+				sql = clause.getName() + (clause.distinctColumns() ? " DISTINCT" : "") + (clause.hasLimit() ? " TOP " + clause.getLimit() + " " : "");
 			}else
 				sql += " " + clause.getSeparator(i);
 
@@ -343,6 +326,8 @@ public class SQLServerTranslator extends JDBCTranslator {
 				return "round(" + ((fct.getNbParameters() >= 2) ? (translate(fct.getParameter(0)) + ", " + translate(fct.getParameter(1))) : "") + ",1)";
 			case MOD:
 				return ((fct.getNbParameters() >= 2) ? (translate(fct.getParameter(0)) + "% " + translate(fct.getParameter(1))) : "");
+			case ATAN2:
+				return "ATN2(" + translate(fct.getParameter(0)) + ", " + translate(fct.getParameter(1)) + ")";
 			default:
 				return getDefaultADQLFunction(fct);
 		}
diff --git a/src/tap/data/ResultSetTableIterator.java b/src/tap/data/ResultSetTableIterator.java
index d9b19e8ee354bd817925ebd9aa5158860c1af269..91a8faa980e0a9ffdec6271968dc32a8a57e6d50 100644
--- a/src/tap/data/ResultSetTableIterator.java
+++ b/src/tap/data/ResultSetTableIterator.java
@@ -734,7 +734,7 @@ public class ResultSetTableIterator implements TableIterator {
 			else if (colType != null && colValue != null && colType.type == DBDatatype.CHAR && (colType.length == 1 || colType.length <= 0) && colValue instanceof String)
 				colValue = ((String)colValue).charAt(0);
 			// if the column value is a geometrical object, it must be serialized in STC-S:
-			else if (translator != null && colType != null && colType.isGeometry()){
+			else if (translator != null && colType != null && colType.isGeometry()) {
 				try{
 					Region region = translator.translateGeometryFromDB(colValue);
 					if (region != null)