diff --git a/Makefile b/Makefile
index 1543286b67c6c7be20772a3b6932b9e0dcec27d5..342bbe4ce534e3336e38e0932045b28c2b65fe7b 100644
--- a/Makefile
+++ b/Makefile
@@ -57,7 +57,7 @@ formatting:
 
 # Compile into a standalone jar file
 jar: print-version easy-units
-	mvn package -DskipTests
+	mvn -e package -DskipTests
 	@pushd target ; \
 		ln -s caosdb-server-$(CAOSDB_SERVER_VERSION)-jar-with-dependencies.jar caosdb-server.jar; \
 		popd
diff --git a/pom.xml b/pom.xml
index d154147667726078da4f9e960b8d675c293df1ff..dbbd000b80991a5bb9437df82e9970a1ca6ce25c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -28,6 +28,9 @@
   <version>0.4.0-SNAPSHOT</version>
   <packaging>jar</packaging>
   <name>CaosDB Server</name>
+  <scm>
+    <connection>scm:git:https://gitlab.indiscale.com/caosdb/src/caosdb-server.git</connection>
+  </scm>
   <properties>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     <project.build.testSourceDirectory>src/test/java</project.build.testSourceDirectory>
@@ -214,6 +217,12 @@
     </dependency>
   </dependencies>
   <build>
+    <resources>
+      <resource>
+        <directory>${basedir}/src/main/</directory>
+        <includes><include>**/*.properties</include></includes>
+      </resource>
+    </resources>
     <sourceDirectory>${basedir}/src/main/java</sourceDirectory>
     <scriptSourceDirectory>${basedir}/src/main/scripts</scriptSourceDirectory>
     <testSourceDirectory>${basedir}/src/test/java</testSourceDirectory>
@@ -298,6 +307,28 @@
           <forkCount>0.5C</forkCount>
         </configuration>
       </plugin>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>buildnumber-maven-plugin</artifactId>
+        <version>1.4</version>
+        <executions>
+          <execution>
+            <phase>generate-resources</phase>
+            <goals>
+              <goal>create-metadata</goal>
+            </goals>
+          </execution>
+        </executions>
+        <configuration>
+          <addOutputDirectoryToResources>true</addOutputDirectoryToResources>
+          <applicationPropertyName>project.name</applicationPropertyName>
+          <revisionPropertyName>project.revision</revisionPropertyName>
+          <versionPropertyName>project.version</versionPropertyName>
+          <timestampPropertyName>build.timestamp</timestampPropertyName>
+          <outputDirectory>${basedir}/target/classes/org/caosdb/server/</outputDirectory>
+          <outputName>build.properties</outputName>
+        </configuration>
+      </plugin>
       <plugin>
         <groupId>org.codehaus.mojo</groupId>
         <artifactId>exec-maven-plugin</artifactId>
diff --git a/src/main/java/org/caosdb/server/ServerProperties.java b/src/main/java/org/caosdb/server/ServerProperties.java
index 3172a3e88e7790580af1b7865c024fa2b40c017b..1f1a40b25c6c103e5b4b2bf3324074bb2824ad2b 100644
--- a/src/main/java/org/caosdb/server/ServerProperties.java
+++ b/src/main/java/org/caosdb/server/ServerProperties.java
@@ -4,8 +4,8 @@
  *
  * Copyright (C) 2018 Research Group Biomedical Physics,
  * Max-Planck-Institute for Dynamics and Self-Organization Göttingen
- * Copyright (C) 2019 IndiScale GmbH
- * Copyright (C) 2019 Timm Fitschen (t.fitschen@indiscale.com)
+ * Copyright (C) 2019-2021 IndiScale GmbH <info@indiscale.com>
+ * Copyright (C) 2019-2021 Timm Fitschen <t.fitschen@indiscale.com>
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU Affero General Public License as
@@ -28,6 +28,7 @@ import java.io.BufferedInputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.IOException;
+import java.net.URL;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
@@ -134,6 +135,11 @@ public class ServerProperties extends Properties {
       "WEBUI_HTTP_HEADER_CACHE_MAX_AGE";
   public static final String KEY_AUTHTOKEN_CONFIG = "AUTHTOKEN_CONFIG";
 
+  public static final String KEY_PROJECT_VERSION = "project.version";
+  public static final String KEY_PROJECT_NAME = "project.name";
+  public static final String KEY_PROJECT_REVISTION = "project.revision";
+  public static final String KEY_BUILD_TIMESTAMP = "build.timestamp";
+
   /**
    * Read the config files and initialize the server properties.
    *
@@ -143,6 +149,9 @@ public class ServerProperties extends Properties {
     final Properties serverProperties = new Properties();
     final String basepath = System.getProperty("user.dir");
 
+    final URL url = CaosDBServer.class.getResource("/build.properties");
+    serverProperties.load(url.openStream());
+
     // load standard config
     loadConfigFile(serverProperties, new File(basepath + "/conf/core/server.conf"));
 
@@ -150,11 +159,11 @@ public class ServerProperties extends Properties {
     loadConfigFile(serverProperties, new File(basepath + "/conf/ext/server.conf"));
 
     // load ext/server.conf.d/ (ordering is determined by system collation)
-    File confDir = new File(basepath + "/conf/ext/server.conf.d");
+    final File confDir = new File(basepath + "/conf/ext/server.conf.d");
     if (confDir.exists() && confDir.isDirectory()) {
-      String[] confFiles = confDir.list();
+      final String[] confFiles = confDir.list();
       Arrays.sort(confFiles, Comparator.naturalOrder());
-      for (String confFile : confFiles) {
+      for (final String confFile : confFiles) {
         // prevent backup files from being read
         if (confFile.endsWith(".conf")) {
           loadConfigFile(serverProperties, new File(confDir, confFile));
@@ -163,7 +172,7 @@ public class ServerProperties extends Properties {
     }
 
     // load env vars
-    for (java.util.Map.Entry<String, String> envvar : System.getenv().entrySet()) {
+    for (final java.util.Map.Entry<String, String> envvar : System.getenv().entrySet()) {
       if (envvar.getKey().startsWith("CAOSDB_CONFIG_") && envvar.getKey().length() > 14) {
         serverProperties.setProperty(envvar.getKey().substring(14), envvar.getValue());
       }
@@ -171,11 +180,11 @@ public class ServerProperties extends Properties {
 
     // log configuration alphabetically
     if (logger.isInfoEnabled()) {
-      ArrayList<String> names = new ArrayList<>(serverProperties.stringPropertyNames());
+      final ArrayList<String> names = new ArrayList<>(serverProperties.stringPropertyNames());
       Collections.sort(names);
-      for (String name : names) {
-        String val =
-            (name.contains("PASSW") || name.contains("SECRET"))
+      for (final String name : names) {
+        final String val =
+            name.contains("PASSW") || name.contains("SECRET")
                 ? "****"
                 : serverProperties.getProperty(name);
         logger.info(name + "=" + val);
@@ -184,7 +193,7 @@ public class ServerProperties extends Properties {
     return serverProperties;
   }
 
-  private static void loadConfigFile(Properties serverProperties, File confFile)
+  private static void loadConfigFile(final Properties serverProperties, final File confFile)
       throws IOException {
     if (confFile.exists() && confFile.isFile()) {
       logger.info("Reading configuration from " + confFile.getAbsolutePath());
diff --git a/src/main/java/org/caosdb/server/grpc/EntityTransactionImpl.java b/src/main/java/org/caosdb/server/grpc/EntityTransactionImpl.java
index b312e25229e4b9dc19289191c89cf1a0f2f3fbbe..731df202385c0aad063f5b4b22a599c3a82af368 100644
--- a/src/main/java/org/caosdb/server/grpc/EntityTransactionImpl.java
+++ b/src/main/java/org/caosdb/server/grpc/EntityTransactionImpl.java
@@ -5,6 +5,8 @@ import org.caosdb.api.info.v1alpha1.GeneralInfoServiceGrpc.GeneralInfoServiceImp
 import org.caosdb.api.info.v1alpha1.GetVersionInfoRequest;
 import org.caosdb.api.info.v1alpha1.GetVersionInfoResponse;
 import org.caosdb.api.info.v1alpha1.VersionInfo;
+import org.caosdb.server.CaosDBServer;
+import org.caosdb.server.ServerProperties;
 
 public class EntityTransactionImpl extends GeneralInfoServiceImplBase {
 
@@ -13,8 +15,22 @@ public class EntityTransactionImpl extends GeneralInfoServiceImplBase {
       final GetVersionInfoRequest request,
       final StreamObserver<GetVersionInfoResponse> responseObserver) {
 
+    final String version[] =
+        CaosDBServer.getServerProperty(ServerProperties.KEY_PROJECT_VERSION).split("[\\.-]", 4);
+    final Integer major = Integer.parseInt(version[0]);
+    final Integer minor = Integer.parseInt(version[1]);
+    final Integer patch = Integer.parseInt(version[2]);
+    final String pre_release = version.length > 3 ? version[3] : null;
+    final String build = CaosDBServer.getServerProperty(ServerProperties.KEY_PROJECT_REVISTION);
+
     final VersionInfo versionInfo =
-        VersionInfo.newBuilder().setMajor(0).setMinor(0).setPatch(1).build();
+        VersionInfo.newBuilder()
+            .setMajor(major)
+            .setMinor(minor)
+            .setPatch(patch)
+            .setPreRelease(pre_release)
+            .setBuild(build)
+            .build();
     final GetVersionInfoResponse response =
         GetVersionInfoResponse.newBuilder().setVersionInfo(versionInfo).build();