diff --git a/common/source/java/ch/systemsx/cisd/common/utilities/BuildAndEnvironmentInfo.java b/common/source/java/ch/systemsx/cisd/common/utilities/BuildAndEnvironmentInfo.java
index af0cf5d54a81e92d9adce9c07853339dba410533..d030ba143bfe253b673e67ff0502e0c31aa382b2 100644
--- a/common/source/java/ch/systemsx/cisd/common/utilities/BuildAndEnvironmentInfo.java
+++ b/common/source/java/ch/systemsx/cisd/common/utilities/BuildAndEnvironmentInfo.java
@@ -28,11 +28,14 @@ import java.util.StringTokenizer;
  * Bean with build and environment information.
  * <p>
  * Does <em>not</em> depend on any library jar files.
+ * </p>
  * 
  * @author Franz-Josef Elmer
  */
 public final class BuildAndEnvironmentInfo
 {
+    private static final String UNKNOWN = "UNKNOWN";
+
     /**
      * The one-and-only instance.
      */
@@ -46,8 +49,8 @@ public final class BuildAndEnvironmentInfo
 
     private BuildAndEnvironmentInfo()
     {
-        String extractedVersion = "unknown";
-        String extractedRevision = "unknown";
+        String extractedVersion = UNKNOWN;
+        String extractedRevision = UNKNOWN;
         boolean extractedCleanFlag = false;
         InputStream stream = BuildAndEnvironmentInfo.class.getResourceAsStream("/BUILD.INFO");
         if (stream != null)
@@ -78,44 +81,66 @@ public final class BuildAndEnvironmentInfo
         this.cleanSources = extractedCleanFlag;
     }
 
+    private final static String getProperty(final String property)
+    {
+        return System.getProperty(property, UNKNOWN);
+    }
+
+    private final static boolean isUnknown(final String osName)
+    {
+        return osName.equals(UNKNOWN);
+    }
+
     /**
      * @return Name of the CPU architecture.
      */
-    public String getCPUArchitecture()
+    public final String getCPUArchitecture()
     {
-        return System.getProperty("os.arch");
+        return getProperty("os.arch");
     }
-    
+
     /**
      * @return Name and version of the operating system.
      */
-    public String getOS()
+    public final String getOS()
     {
-        return System.getProperty("os.name") + " " + System.getProperty("os.version");
+        final String osName = getProperty("os.name");
+        final String osVersion = getProperty("os.version");
+        if (isUnknown(osName) || isUnknown(osVersion))
+        {
+            return osName;
+        }
+        return osName + " (v" + osVersion + ")";
     }
 
     /**
      * @return Name and version of the Java Virtual Machine.
      */
-    public String getJavaVM()
+    public final String getJavaVM()
     {
-        return System.getProperty("java.vm.name") + " " + System.getProperty("java.vm.version");
+        final String vmName = getProperty("java.vm.name");
+        final String vmVersion = getProperty("java.vm.version");
+        if (isUnknown(vmName) || isUnknown(vmVersion))
+        {
+            return vmName;
+        }
+        return vmName + " (v" + vmVersion + ")";
     }
 
     /**
      * @return The version of the software.
      */
-    public String getVersion()
+    public final String getVersion()
     {
         return version;
     }
 
     /**
      * @return <code>true</code> if the versioned entities of the working copy have been clean when this build has
-     *         been made, in other words, whether the revision given by {@link #getRevision()} does really identify 
-     *         the source that is build has been produced from.
+     *         been made, in other words, whether the revision given by {@link #getRevision()} does really identify the
+     *         source that is build has been produced from.
      */
-    public boolean isCleanSources()
+    public final boolean isCleanSources()
     {
         return cleanSources;
     }
@@ -123,7 +148,7 @@ public final class BuildAndEnvironmentInfo
     /**
      * @return The revision number.
      */
-    public String getRevision()
+    public final String getRevision()
     {
         return revision;
     }
@@ -131,15 +156,28 @@ public final class BuildAndEnvironmentInfo
     /**
      * Returns the build number of the software,
      */
-    public String getBuildNumber()
+    public final String getBuildNumber()
     {
-        if (isCleanSources())
+        final StringBuilder builder = new StringBuilder();
+        final String rev = getRevision();
+        final boolean isDirty = isCleanSources() == false;
+        builder.append(getVersion());
+        if (isUnknown(rev) == false)
         {
-            return version + " (r" + revision + ")";
+            builder.append(" (r").append(rev);
+            if (isDirty)
+            {
+                builder.append("*");
+            }
+            builder.append(")");
         } else
         {
-            return version + " (r" + revision + "*)";
+            if (isDirty)
+            {
+                builder.append("*");
+            }
         }
+        return builder.toString();
     }
 
     /**
@@ -148,11 +186,11 @@ public final class BuildAndEnvironmentInfo
     public List<String> getEnvironmentInfo()
     {
         final List<String> environmentInfo = new ArrayList<String>();
-        environmentInfo.add("Version:\t" + getVersion());
-        environmentInfo.add("Build number:\t" + getBuildNumber());
-        environmentInfo.add("Java VM:\t" + getJavaVM());
-        environmentInfo.add("CPU architecture:\t" + getCPUArchitecture());
-        environmentInfo.add("OS:\t\t" + getOS());
+        environmentInfo.add("Version: " + getVersion());
+        environmentInfo.add("Build Number: " + getBuildNumber());
+        environmentInfo.add("Java VM: " + getJavaVM());
+        environmentInfo.add("CPU Architecture: " + getCPUArchitecture());
+        environmentInfo.add("OS: " + getOS());
         return environmentInfo;
     }