diff --git a/gradle/javaproject.gradle b/gradle/javaproject.gradle
index 2b7844fe8bf4827e8a6a2a43aeeeb889afac9d2a..0a1cae015656c32809871c307873b51baeee7f07 100644
--- a/gradle/javaproject.gradle
+++ b/gradle/javaproject.gradle
@@ -63,51 +63,76 @@ buildscript {
 
 repositories repositoryConfig
 
-// Gathering version and revision
-def gatheringTask = new ch.systemsx.cisd.ant.task.subversion.GatherRevisionAndVersionTask()
-List names = new ArrayList()
-names.add(project.name)
-includeFlat = { String[] projectNames -> names.addAll(Arrays.asList(projectNames)) }
-try {
-    apply from: project.file('settings.gradle')
-} catch (Exception e) {
-    println "Warning: Couldn't evaluate 'settings.gradle' in ${project.projectDir}. Possible reason: Other statements than 'includeFlat': ${e}"
+def execute(command, arguments) {
+    new ByteArrayOutputStream().withStream { os ->
+        print "execute: ${command}"
+        arguments.collect({print " ${it}"})
+        println ''
+        def result = exec {
+            executable = command
+            args = arguments
+            standardOutput = os
+        }
+        return os.toString().split('\n')
+    }
 }
-gatheringTask.setProjectNames(names) 
-println "PROJECT: ${project.name}, gather revision for following projects: ${gatheringTask.projectNames}"
-def antProject = new org.apache.tools.ant.Project()
-antProject.setBaseDir(new File("${project.projectDir}"))
-gatheringTask.setProject(antProject)
-gatheringTask.setVersion("version")
-gatheringTask.setRevision("revision")
-gatheringTask.setClean("clean")
-
-try {
-    gatheringTask.execute()
-    versionNumber = antProject.getProperty("version")
-    revisionNumber = antProject.getProperty("revision")
-    cleanFlag = antProject.getProperty("clean")
-    
-    // set version
-    version=versionNumber+"-r"+revisionNumber
-    println "${project.name}: ${version}"
-    
-    // create BUILD INFO file
+
+def SVN_CMD = 'svn'
+
+def executeSVN(arguments) {
+    arguments.add(0, '--non-interactive')
+    return execute('svn', arguments)
+}
+
+def calculateCleanFlag() {
+    for (childProject in project.childProjects.values()) {
+        if (childProject.cleanFlag == 'dirty') {
+            return 'dirty'
+        }
+    }
+    def output = executeSVN(['status', '../' + project.name])
+    def lines = output.findAll({ (it.startsWith('?') || it.trim().isEmpty()) == false})
+    return lines.isEmpty() ? 'clean' : 'dirty'
+}
+
+def findMaximum(lines, key) {
+    return lines.findAll({ it.startsWith(key)}).collect({element -> element.split(':')[1].toInteger()}).max()
+}
+
+def calculateBuildInfo() {
+    def output = executeSVN(['info', '-R', '../' + project.name])
+    project.ext.revisionNumber = findMaximum(output, 'Revision:')
+    def maxLastChangedRev = findMaximum(output, 'Last Changed Rev:')
+    if (project.ext.revisionNumber < maxLastChangedRev) {
+        throw new GradleException("Maximum revision (${project.ext.revisionNumber}) is less than the maximum "
+                  + "last changed revision ($maxLastChangedRev).")
+    }
+    project.ext.versionNumber = 'SNAPSHOT'
+    def url = output.findAll({ it.startsWith('URL:')})[0].split('URL:')[1].trim()
+    if (url.contains('/trunk') == false) {
+        pathElements = url.split('/')
+        project.ext.versionNumber = 'libraries' == pathElements[-2] ? pathElements[-3] : pathElements[-2]
+    }
+    for (childProject in project.childProjects.values()) {
+        project.ext.revisionNumber = Math.max(project.ext.revisionNumber, childProject.revisionNumber)
+        if (project.ext.versionNumber != childProject.versionNumber) {
+            throw new GradleException("Inconsistent version numbers: "
+                        + "${project.name} at version ${project.ext.versionNumber} but "
+                        + "${childProject.name} at version ${childProject.versionNumber}.") 
+        } 
+    }
+    version = "${project.ext.versionNumber}-r${project.ext.revisionNumber}"
+    project.ext.cleanFlag = calculateCleanFlag()
+    def buildInfo = "${project.ext.versionNumber}:${project.ext.revisionNumber}:${project.ext.cleanFlag}"
+    println "BUILD INFO for $project: $buildInfo"
     def targetsDist = 'targets/dist'
-    def distFolder = new File("${project.projectDir}/${targetsDist}")
+    def distFolder = new File("${project.projectDir}/$targetsDist")
     distFolder.deleteDir()
     distFolder.mkdirs()
-    
-    def writer = new FileWriter("${project.projectDir}/${targetsDist}/BUILD-${project.name}.INFO")
-    try {
-        writer.println("${versionNumber}:${revisionNumber}:${cleanFlag}")
-    } finally {
-        writer.close()
-    }
-} catch (Exception e) {
-	println "skipping gathering"
+    file("${project.projectDir}/$targetsDist/BUILD-${project.name}.INFO") << buildInfo
 }
 
+calculateBuildInfo()
 
 group="cisd"