Merge branch 'release/3.0.0-RC4'
diff --git a/core/api/src/main/java/org/apache/polygene/api/composite/DecoratorMixin.java b/core/api/src/main/java/org/apache/polygene/api/composite/DecoratorMixin.java
index 1707f3e..7e24da5 100644
--- a/core/api/src/main/java/org/apache/polygene/api/composite/DecoratorMixin.java
+++ b/core/api/src/main/java/org/apache/polygene/api/composite/DecoratorMixin.java
@@ -37,6 +37,8 @@
 public class DecoratorMixin
     implements InvocationHandler
 {
+    private static final String NL = System.getProperty( "line.separator" );
+
     private Object delegate;
 
     public DecoratorMixin( @Uses Object delegate )
@@ -78,15 +80,15 @@
     private String constructMessage( Method method, Object[] args )
     {
         StringBuilder builder = new StringBuilder();
-        builder.append( "\nmethod: " );
+        builder.append( NL ).append( "method: " );
         builder.append( method.getDeclaringClass().getName() );
         builder.append( "." );
         builder.append( method.getName() );
-        builder.append( "\ndelegate: " );
+        builder.append( NL ).append( "delegate: " );
         builder.append( delegate );
-        builder.append( "\ndelegateType: " );
+        builder.append( NL ).append( "delegateType: " );
         builder.append( delegate == null ? "n/a" : delegate.getClass().getName() );
-        builder.append( "\narguments: \n" );
+        builder.append( NL ).append( "arguments:" ).append( NL );
         for( Object arg : args )
         {
             builder.append( "    " );
@@ -99,7 +101,7 @@
             {
                 builder.append( argClass.getName() );
             }
-            builder.append( '\n' );
+            builder.append( NL );
         }
         return builder.toString();
     }
diff --git a/core/api/src/main/java/org/apache/polygene/api/composite/InvalidCompositeException.java b/core/api/src/main/java/org/apache/polygene/api/composite/InvalidCompositeException.java
index c7657b3..4d1ead2 100644
--- a/core/api/src/main/java/org/apache/polygene/api/composite/InvalidCompositeException.java
+++ b/core/api/src/main/java/org/apache/polygene/api/composite/InvalidCompositeException.java
@@ -34,6 +34,7 @@
  */
 public class InvalidCompositeException extends RuntimeException
 {
+    private static final String NL = System.getProperty( "line.separator" );
     private static boolean aggregateProblems = true;
     private static ThreadLocal<ArrayList<InvalidCompositeException>> report = ThreadLocal.withInitial( ArrayList::new );
     private ModuleDescriptor module;
@@ -73,13 +74,13 @@
     public String getMessage()
     {
         String typeNames = typesString();
-        String primary = primaryType == null ? "" : "    primary: " + primaryType.toGenericString() + "\n";
+        String primary = primaryType == null ? "" : "    primary: " + primaryType.toGenericString() + NL;
         String methodName = memberString();
-        String message = super.getMessage() == null ? "" : "    message: " + super.getMessage() + "\n";
-        String fragment = fragmentClass == null ? "" : "    fragmentClass: " + fragmentClass.getName() + "\n";
-        String valueType = this.valueType == null ? "" : "    valueType: " + this.valueType.getTypeName() + "\n";
-        String module = this.module == null ? "" : "    layer: " + this.module.layer().name() + "\n    module: "
-                                                   + this.module.name() + "\n";
+        String message = super.getMessage() == null ? "" : "    message: " + super.getMessage() + NL;
+        String fragment = fragmentClass == null ? "" : "    fragmentClass: " + fragmentClass.getName() + NL;
+        String valueType = this.valueType == null ? "" : "    valueType: " + this.valueType.getTypeName() + NL;
+        String module = this.module == null ? "" : "    layer: " + this.module.layer().name() + NL + "    module: "
+                                                   + this.module.name() + NL;
         return message + module + primary + fragment + methodName + valueType + typeNames;
     }
 
@@ -93,7 +94,7 @@
                + types.stream()
                       .map( Class::getSimpleName )
                       .collect( Collectors.joining( ",", "[", "]" ) )
-               + "\n";
+               + NL;
     }
 
     private String memberString()
@@ -108,12 +109,12 @@
             String parameters = Arrays.stream( method.getParameters() )
                                       .map( p -> p.getType().getSimpleName() + " " + p.getName() )
                                       .collect( Collectors.joining( ", ", "(", ")" ) );
-            return "    method: " + method.getReturnType().getSimpleName() + " " + method.getName() + parameters + "\n";
+            return "    method: " + method.getReturnType().getSimpleName() + " " + method.getName() + parameters + NL;
         }
         if( member instanceof Field )
         {
             Field field = (Field) member;
-            return "    field: " + field.getType().getSimpleName() + " " + field.getName() + "\n";
+            return "    field: " + field.getType().getSimpleName() + " " + field.getName() + NL;
         }
         return member.toString();
     }
@@ -122,10 +123,10 @@
     {
         if( report.get().size() > 0 )
         {
-            String reportText = "\nComposition Problems Report:\n"
+            String reportText = NL + "Composition Problems Report:" + NL
                                 + report.get().stream()
                                         .map( Throwable::getMessage )
-                                        .map( m -> m + "\n--\n" )
+                                        .map( m -> m + NL + "--" + NL )
                                         .collect( Collectors.joining() );
             report.set( new ArrayList<>() );
             return reportText;
diff --git a/core/api/src/main/java/org/apache/polygene/api/composite/NoSuchCompositeTypeException.java b/core/api/src/main/java/org/apache/polygene/api/composite/NoSuchCompositeTypeException.java
index 1d6f155..2fdaea3 100644
--- a/core/api/src/main/java/org/apache/polygene/api/composite/NoSuchCompositeTypeException.java
+++ b/core/api/src/main/java/org/apache/polygene/api/composite/NoSuchCompositeTypeException.java
@@ -32,6 +32,8 @@
  */
 public abstract class NoSuchCompositeTypeException extends InvalidApplicationException
 {
+    private static final String NL = System.getProperty( "line.separator" );
+
     private final String compositeType;
     private final String moduleName;
     private final String visibleTypes;
@@ -40,7 +42,7 @@
 
     protected NoSuchCompositeTypeException( String metaType, String compositeType, ModuleDescriptor module )
     {
-        super( "\n\tCould not find any visible " + metaType + " of type [" + compositeType + "] in module [" + module.name() + "]." );
+        super( NL + "\tCould not find any visible " + metaType + " of type [" + compositeType + "] in module [" + module.name() + "]." );
         this.metaType = metaType;
         this.compositeType = compositeType;
         this.moduleName = module.name();
@@ -71,7 +73,7 @@
     @Override
     public String getMessage()
     {
-        return super.getMessage() + "\n" + candidateTypes + "\n" + visibleTypes;
+        return super.getMessage() + NL + candidateTypes + NL + visibleTypes;
     }
 
     private String formatVisibleTypes( TypeLookup typeLookup )
@@ -85,7 +87,7 @@
                   } )
             .sorted()
             .distinct()
-            .collect( joining( "\n", "\tVisible " + metaType + " types are:\n", "" ) );
+            .collect( joining( NL, "\tVisible " + metaType + " types are:" + NL, "" ) );
     }
 
     private String findCandidateTypes( ModuleDescriptor module )
@@ -102,7 +104,7 @@
                                return "\t\t[ " + typeName + "] in [" + descriptor.module().name() + "] with visibility " + descriptor.visibility();
                            } )
                      .distinct()
-                     .collect( joining( "\n", "\tInvisible " + metaType + " types are:\n", "" ) );
+                     .collect( joining( NL, "\tInvisible " + metaType + " types are:" + NL, "" ) );
     }
 
     protected abstract Stream<? extends CompositeDescriptor> descriptors( TypeLookup typeLookup );
diff --git a/core/api/src/main/java/org/apache/polygene/api/constraint/ConstraintViolationException.java b/core/api/src/main/java/org/apache/polygene/api/constraint/ConstraintViolationException.java
index 0eecf04..83f9a8c 100644
--- a/core/api/src/main/java/org/apache/polygene/api/constraint/ConstraintViolationException.java
+++ b/core/api/src/main/java/org/apache/polygene/api/constraint/ConstraintViolationException.java
@@ -47,11 +47,12 @@
  */
 public class ConstraintViolationException extends IllegalArgumentException
 {
+    private static final String NL = System.getProperty( "line.separator" );
     private static final boolean longNames = Boolean.getBoolean( "polygene.constraints.longNames" );
-    private static final String DEFAULT_PATTERN = "\n\tConstraint Violation(s) in {0} of types [{3}].\n";
-    private static final String ENTITY_DEFAULT_PATTERN = "\n\tConstraint Violation(s) in entity {0} with id=[{2}].\n";
-    private static final String SERVICE_DEFAULT_PATTERN = "\n\tConstraint Violation(s) in service {0} with id=[{2}].\n";
-    private static final String MIXIN_DEFAULT_PATTERN = "\t\t@{2}({3}) on {0}.{1}(). Parameter [{4}] does not allow value [{5}].\n";
+    private static final String DEFAULT_PATTERN = NL + "\tConstraint Violation(s) in {0} of types [{3}]." + NL;
+    private static final String ENTITY_DEFAULT_PATTERN = NL + "\tConstraint Violation(s) in entity {0} with id=[{2}]." + NL;
+    private static final String SERVICE_DEFAULT_PATTERN = NL + "\tConstraint Violation(s) in service {0} with id=[{2}]." + NL;
+    private static final String MIXIN_DEFAULT_PATTERN = "\t\t@{2}({3}) on {0}.{1}(). Parameter [{4}] does not allow value [{5}]." + NL;
 
     private String instanceToString;                              // arg {0}
     private Class<?> primaryType;                                 // arg {1}
diff --git a/core/api/src/main/java/org/apache/polygene/api/object/NoSuchObjectTypeException.java b/core/api/src/main/java/org/apache/polygene/api/object/NoSuchObjectTypeException.java
index af1801f..dcbd4f3 100644
--- a/core/api/src/main/java/org/apache/polygene/api/object/NoSuchObjectTypeException.java
+++ b/core/api/src/main/java/org/apache/polygene/api/object/NoSuchObjectTypeException.java
@@ -30,6 +30,7 @@
     extends InvalidApplicationException
 {
     private static final long serialVersionUID = -1121690536365682511L;
+    private static final String NL = System.getProperty( "line.separator" );
 
     private final String objectType;
     private final String moduleName;
@@ -38,8 +39,8 @@
     {
         super( "Could not find any visible Object of type [" + type + "] in module ["
                + moduleName
-               + "]. The visible types are: \n"
-               + visible.map( Class::getName ).collect( Collectors.joining("\n") )
+               + "]. The visible types are: " + NL
+               + visible.map( Class::getName ).collect( Collectors.joining( NL ) )
         );
         this.objectType = type;
         this.moduleName = moduleName;
diff --git a/core/api/src/main/java/org/apache/polygene/api/unitofwork/ConcurrentEntityModificationException.java b/core/api/src/main/java/org/apache/polygene/api/unitofwork/ConcurrentEntityModificationException.java
index 7d439b0..d54b1ad 100644
--- a/core/api/src/main/java/org/apache/polygene/api/unitofwork/ConcurrentEntityModificationException.java
+++ b/core/api/src/main/java/org/apache/polygene/api/unitofwork/ConcurrentEntityModificationException.java
@@ -34,6 +34,7 @@
     extends UnitOfWorkCompletionException
 {
     private static final long serialVersionUID = 3872723845064767689L;
+    private static final String NL = System.getProperty( "line.separator" );
 
     private final Map<EntityComposite, HasTypes> concurrentlyModifiedEntities;
 
@@ -41,7 +42,7 @@
                                                   Usecase usecase
     )
     {
-        super( "Entities changed concurrently, and detected in usecase '" + usecase + "'\nModified entities : " + format( concurrentlyModifiedEntities ) );
+        super( "Entities changed concurrently, and detected in usecase '" + usecase + "'" + NL + "Modified entities : " + format( concurrentlyModifiedEntities ) );
         this.concurrentlyModifiedEntities = concurrentlyModifiedEntities;
     }
 
@@ -54,7 +55,7 @@
                       + entry.getValue().types().map( Class::getSimpleName )
                           .collect( Collectors.joining( "," ) )
             )
-            .collect( Collectors.joining( "\n" ) );
+            .collect( Collectors.joining( NL ) );
     }
 
     public Map<EntityComposite, HasTypes> concurrentlyModifiedEntities()
diff --git a/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/AssemblyReportException.java b/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/AssemblyReportException.java
index 4a2211e..2ca57cf 100644
--- a/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/AssemblyReportException.java
+++ b/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/AssemblyReportException.java
@@ -21,7 +21,6 @@
 
 import java.io.ByteArrayOutputStream;
 import java.io.PrintStream;
-import java.util.List;
 import java.util.Set;
 import java.util.stream.Collectors;
 
@@ -30,6 +29,8 @@
  */
 public class AssemblyReportException extends AssemblyException
 {
+    private static final String NL = System.getProperty( "line.separator" );
+
     private Set<Throwable> problems;
     private String modelReport;
 
@@ -44,7 +45,7 @@
         String message;
         if( modelReport == null )
         {
-            message = "\nComposition Problems Report:\n";
+            message = NL+ "Composition Problems Report:" + NL;
         }
         else
         {
@@ -52,7 +53,7 @@
         }
         return message + problems.stream()
                                  .map( this::composeMessage )
-                                 .map( m -> m + "\n--\n" )
+                                 .map( m -> m + NL + "--" + NL )
                                  .collect( Collectors.joining() );
     }
 
diff --git a/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/Energy4Java.java b/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/Energy4Java.java
index a4cf0c3..13941c1 100644
--- a/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/Energy4Java.java
+++ b/core/bootstrap/src/main/java/org/apache/polygene/bootstrap/Energy4Java.java
@@ -76,7 +76,8 @@
             String modelReport = InvalidCompositeException.modelReport();
             if( modelReport != null )
             {
-                throw new AssemblyException( "Composition problems\n\n" + modelReport );
+                String nl = System.getProperty( "line.separator" );
+                throw new AssemblyException( "Composition problems" + nl + nl + modelReport );
             }
             return model;
         }
diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/bootstrap/CompositeAssemblyImpl.java b/core/runtime/src/main/java/org/apache/polygene/runtime/bootstrap/CompositeAssemblyImpl.java
index 7f69916..e25bfe7 100644
--- a/core/runtime/src/main/java/org/apache/polygene/runtime/bootstrap/CompositeAssemblyImpl.java
+++ b/core/runtime/src/main/java/org/apache/polygene/runtime/bootstrap/CompositeAssemblyImpl.java
@@ -338,7 +338,7 @@
         {
             return implementMethodWithClass( method, mixinClass );
         }
-        handleInvalidCompositeType( "No implementation found for method ", null, null, null, null, method, types );
+        handleInvalidCompositeType( "No implementation found for method", null, null, null, null, method, types );
         return null;
     }
 
diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/composite/CompositeMethodsModel.java b/core/runtime/src/main/java/org/apache/polygene/runtime/composite/CompositeMethodsModel.java
index 2223091..dd2bfb6 100644
--- a/core/runtime/src/main/java/org/apache/polygene/runtime/composite/CompositeMethodsModel.java
+++ b/core/runtime/src/main/java/org/apache/polygene/runtime/composite/CompositeMethodsModel.java
@@ -39,6 +39,8 @@
 public final class CompositeMethodsModel
     implements VisitableHierarchy<Object, Object>, Dependencies
 {
+    private static final String NL = System.getProperty( "line.separator" );
+
     private final LinkedHashMap<Method, CompositeMethodModel> methods;
     private final MixinsModel mixinsModel;
 
@@ -102,14 +104,15 @@
 //                return method.invoke( proxy, args );
                 String message = "We have detected a default method on an interface that is not backed by a Composite. "
                                  + "Please report this to dev@polygene.apache.org together with the information below, "
-                                 + "that/those class(es) and the relevant assembly information. Thank you\nMethod:"
+                                 + "that/those class(es) and the relevant assembly information. Thank you"
+                                 + NL + "Method:"
                                  + method.toGenericString()
-                                 + "\nDeclaring Class:"
+                                 + NL + "Declaring Class:"
                                  + method.getDeclaringClass().toGenericString()
-                                 + "\nTypes:"
+                                 + NL + "Types:"
                                  + mixinsModel.mixinTypes()
                                               .map( Class::toGenericString )
-                                              .collect( Collectors.joining( "\n" ) );
+                                              .collect( Collectors.joining( NL ) );
                 throw new UnsupportedOperationException( message );
             }
             throw new MissingMethodException( "Method '" + method + "' is not implemented" );
diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/composite/ConstructorModel.java b/core/runtime/src/main/java/org/apache/polygene/runtime/composite/ConstructorModel.java
index 026a4e1..a35227c 100644
--- a/core/runtime/src/main/java/org/apache/polygene/runtime/composite/ConstructorModel.java
+++ b/core/runtime/src/main/java/org/apache/polygene/runtime/composite/ConstructorModel.java
@@ -41,6 +41,8 @@
 public final class ConstructorModel
     implements ConstructorDescriptor, VisitableHierarchy<Object, Object>
 {
+    private static final String NL = System.getProperty( "line.separator" );
+
     private Constructor<?> constructor;
 
     private InjectedParametersModel parameters;
@@ -103,9 +105,9 @@
 
     private String createExceptionMessage( Object[] parametersInstance )
     {
-        return "Could not instantiate \n    " + constructor.getDeclaringClass()
-               + "\nusing constructor:\n    " + constructor.toGenericString()
-               + "\nparameter types:\n    " + Arrays.toString( parametersInstance );
+        return "Could not instantiate " + NL + "    " + constructor.getDeclaringClass()
+               + NL + "using constructor:" + NL + "    " + constructor.toGenericString()
+               + NL + "parameter types:" + NL + "    " + Arrays.toString( parametersInstance );
     }
 
     @Override
diff --git a/core/runtime/src/main/java/org/apache/polygene/runtime/injection/InjectedFieldModel.java b/core/runtime/src/main/java/org/apache/polygene/runtime/injection/InjectedFieldModel.java
index 553f1ff..8ce5597 100644
--- a/core/runtime/src/main/java/org/apache/polygene/runtime/injection/InjectedFieldModel.java
+++ b/core/runtime/src/main/java/org/apache/polygene/runtime/injection/InjectedFieldModel.java
@@ -47,6 +47,8 @@
 public final class InjectedFieldModel
     implements InjectedFieldDescriptor, Dependencies, VisitableHierarchy<InjectedFieldModel, DependencyModel>
 {
+    private static final String NL = System.getProperty( "line.separator" );
+
     private DependencyModel dependencyModel;
     private Field injectedField;
 
@@ -124,11 +126,11 @@
                 annotBuilder.append( " " );
             }
             String annots = annotBuilder.toString();
-            String message = "Can not inject the field\n    "
+            String message = "Can not inject the field" + NL + "    "
                              + injectedField.getDeclaringClass()
-                             + "\n    {\n        " + annots + "\n        "
+                             + NL + "    {" + NL + "        " + annots + NL + "        "
                              + injectedField.getType().getSimpleName() + " " + injectedField.getName()
-                             + "\n    }\nwith value \n    " + value + "\nof type\n    "
+                             + NL + "    }" + NL + "with value " + NL + "    " + value + NL + "of type" + NL + "    "
                              + valueClassName;
             throw new InjectionException( message, e );
         }
diff --git a/core/runtime/src/test/java/org/apache/polygene/bootstrap/ErrorReportingTest.java b/core/runtime/src/test/java/org/apache/polygene/bootstrap/ErrorReportingTest.java
index 8feca04..0ddb5e6 100644
--- a/core/runtime/src/test/java/org/apache/polygene/bootstrap/ErrorReportingTest.java
+++ b/core/runtime/src/test/java/org/apache/polygene/bootstrap/ErrorReportingTest.java
@@ -31,6 +31,8 @@
 
 public class ErrorReportingTest extends AbstractPolygeneTest
 {
+    private static final String NL = System.getProperty( "line.separator" );
+
     @Override
     public void assemble( ModuleAssembly module )
     {
@@ -41,18 +43,18 @@
     @Override
     protected void assemblyException( AssemblyException exception )
     {
-        assertThat( exception.getMessage(), containsString( "Composition Problems Report:\n" ) );
-        assertThat( exception.getMessage(), containsString( "    message: No implementation found for method \n"
-                                                            + "    method: Map doAnotherThing(String name, int value)\n"
-                                                            + "    types: [Person,ValueComposite]\n" ) );
+        assertThat( exception.getMessage(), containsString( "Composition Problems Report:" + NL ) );
+        assertThat( exception.getMessage(), containsString( "    message: No implementation found for method" + NL
+                                                            + "    method: Map doAnotherThing(String name, int value)" + NL
+                                                            + "    types: [Person,ValueComposite]" + NL ) );
 
-        assertThat( exception.getMessage(), containsString( "    message: No implementation found for method \n"
-                                                            + "    method: void doOneThing()\n"
-                                                            + "    types: [Person,ValueComposite]\n" ) );
+        assertThat( exception.getMessage(), containsString( "    message: No implementation found for method" + NL
+                                                            + "    method: void doOneThing()" + NL
+                                                            + "    types: [Person,ValueComposite]" + NL ) );
 
-        assertThat( exception.getMessage(), containsString( "    message: No implementation found for method \n"
-                                                            + "    method: void goForWalk(int minutes)\n"
-                                                            + "    types: [Pet,ValueComposite]\n" ) );
+        assertThat( exception.getMessage(), containsString( "    message: No implementation found for method" + NL
+                                                            + "    method: void goForWalk(int minutes)" + NL
+                                                            + "    types: [Pet,ValueComposite]" + NL ) );
     }
 
     @Test
diff --git a/core/spi/src/main/java/org/apache/polygene/spi/entitystore/ConcurrentEntityStateModificationException.java b/core/spi/src/main/java/org/apache/polygene/spi/entitystore/ConcurrentEntityStateModificationException.java
index f6bbfe8..132edb2 100644
--- a/core/spi/src/main/java/org/apache/polygene/spi/entitystore/ConcurrentEntityStateModificationException.java
+++ b/core/spi/src/main/java/org/apache/polygene/spi/entitystore/ConcurrentEntityStateModificationException.java
@@ -29,6 +29,8 @@
 public class ConcurrentEntityStateModificationException
     extends EntityStoreException
 {
+    private static final String NL = System.getProperty( "line.separator" );
+
     private Collection<EntityReference> modifiedEntities;
 
     public ConcurrentEntityStateModificationException( Collection<EntityReference> modifiedEntities )
@@ -45,6 +47,6 @@
     @Override
     public String getMessage()
     {
-        return "Entities changed concurrently.\nModified entities are;\n" + modifiedEntities;
+        return "Entities changed concurrently." + NL + "Modified entities are;" + NL + modifiedEntities;
     }
 }
\ No newline at end of file
diff --git a/dependencies.gradle b/dependencies.gradle
index f9bc3de..b6446ad 100644
--- a/dependencies.gradle
+++ b/dependencies.gradle
@@ -183,7 +183,6 @@
 def dnsJavaVersion = '2.1.8'
 def dockerJUnitVersion = '0.3'
 def easyMockVersion = '3.4'
-def embedMongoVersion = '2.0.0' // 2.0.0 exists
 def h2Version = '1.4.196'
 def hamcrestVersion = '1.3'
 def jaxRsApiVersion = '2.0.1'
@@ -200,7 +199,6 @@
   dnsjava           : "dnsjava:dnsjava:$dnsJavaVersion",
   docker_junit      : "com.github.tdomzal:junit-docker-rule:$dockerJUnitVersion",
   easymock          : "org.easymock:easymock:$easyMockVersion",
-  embed_mongo       : "de.flapdoodle.embed:de.flapdoodle.embed.mongo:$embedMongoVersion",
   h2                : "com.h2database:h2:$h2Version",
   hamcrest          : [ "org.hamcrest:hamcrest-core:$hamcrestVersion",
                         "org.hamcrest:hamcrest-library:$hamcrestVersion" ],
diff --git a/extensions/entitystore-mongodb/build.gradle b/extensions/entitystore-mongodb/build.gradle
index 940db5a..1d5a0ba 100644
--- a/extensions/entitystore-mongodb/build.gradle
+++ b/extensions/entitystore-mongodb/build.gradle
@@ -33,7 +33,6 @@
   runtimeOnly polygene.core.runtime
 
   testImplementation polygene.internals.testsupport
-  testImplementation libraries.embed_mongo
 
   testRuntimeOnly libraries.logback
 }
diff --git a/extensions/entitystore-mongodb/src/test/java/org/apache/polygene/entitystore/mongodb/EmbedMongoDBMapEntityStoreTest.java b/extensions/entitystore-mongodb/src/test/java/org/apache/polygene/entitystore/mongodb/EmbedMongoDBMapEntityStoreTest.java
deleted file mode 100644
index c362490..0000000
--- a/extensions/entitystore-mongodb/src/test/java/org/apache/polygene/entitystore/mongodb/EmbedMongoDBMapEntityStoreTest.java
+++ /dev/null
@@ -1,88 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.polygene.entitystore.mongodb;
-
-import de.flapdoodle.embed.mongo.MongodExecutable;
-import de.flapdoodle.embed.mongo.MongodStarter;
-import de.flapdoodle.embed.mongo.config.MongodConfigBuilder;
-import de.flapdoodle.embed.mongo.config.Net;
-import de.flapdoodle.embed.mongo.distribution.Version;
-import de.flapdoodle.embed.process.runtime.Network;
-import java.io.IOException;
-import java.util.Collections;
-import org.apache.polygene.api.common.Visibility;
-import org.apache.polygene.bootstrap.AssemblyException;
-import org.apache.polygene.bootstrap.ModuleAssembly;
-import org.apache.polygene.entitystore.mongodb.assembly.MongoDBEntityStoreAssembler;
-import org.apache.polygene.test.EntityTestAssembler;
-import org.apache.polygene.test.entity.AbstractEntityStoreTest;
-import org.apache.polygene.test.util.FreePortFinder;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Rule;
-import org.junit.rules.TestName;
-
-public class EmbedMongoDBMapEntityStoreTest extends AbstractEntityStoreTest
-{
-    private static final MongodStarter MONGO_STARTER = MongodStarter.getDefaultInstance();
-
-    @Rule
-    public TestName testName = new TestName();
-    private static int port;
-    private static MongodExecutable mongod;
-
-    @BeforeClass
-    public static void startEmbedMongo()
-        throws IOException
-    {
-        port = FreePortFinder.findFreePortOnLoopback();
-        mongod = MONGO_STARTER.prepare( new MongodConfigBuilder()
-                                            .version( Version.Main.PRODUCTION )
-                                            .net( new Net( "localhost", port, Network.localhostIsIPv6() ) )
-                                            .build() );
-        mongod.start();
-    }
-
-    @AfterClass
-    public static void stopEmbedMongo()
-    {
-        if( mongod != null )
-        {
-            mongod.stop();
-        }
-    }
-
-    @Override
-    public void assemble( ModuleAssembly module )
-        throws AssemblyException
-    {
-        super.assemble( module );
-
-        ModuleAssembly config = module.layer().module( "config" );
-        new EntityTestAssembler().defaultServicesVisibleIn( Visibility.layer ).assemble( config );
-
-        new MongoDBEntityStoreAssembler().withConfig( config, Visibility.layer ).assemble( module );
-
-        MongoDBEntityStoreConfiguration mongoConfig = config.forMixin( MongoDBEntityStoreConfiguration.class )
-                                                            .declareDefaults();
-        mongoConfig.writeConcern().set( MongoDBEntityStoreConfiguration.WriteConcern.MAJORITY );
-        mongoConfig.database().set( "polygene-test" );
-        mongoConfig.collection().set( testName.getMethodName() );
-        mongoConfig.nodes().set( Collections.singletonList( "localhost:" + port ) );
-    }
-}
diff --git a/extensions/entitystore-mongodb/src/test/java/org/apache/polygene/entitystore/mongodb/EmbedMongoDBMapEntityStoreTestSuite.java b/extensions/entitystore-mongodb/src/test/java/org/apache/polygene/entitystore/mongodb/EmbedMongoDBMapEntityStoreTestSuite.java
deleted file mode 100644
index 57c1e16..0000000
--- a/extensions/entitystore-mongodb/src/test/java/org/apache/polygene/entitystore/mongodb/EmbedMongoDBMapEntityStoreTestSuite.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- *  Licensed to the Apache Software Foundation (ASF) under one
- *  or more contributor license agreements.  See the NOTICE file
- *  distributed with this work for additional information
- *  regarding copyright ownership.  The ASF licenses this file
- *  to you under the Apache License, Version 2.0 (the
- *  "License"); you may not use this file except in compliance
- *  with the License.  You may obtain a copy of the License at
- *
- *       http://www.apache.org/licenses/LICENSE-2.0
- *
- *  Unless required by applicable law or agreed to in writing, software
- *  distributed under the License is distributed on an "AS IS" BASIS,
- *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- *  See the License for the specific language governing permissions and
- *  limitations under the License.
- */
-package org.apache.polygene.entitystore.mongodb;
-
-import de.flapdoodle.embed.mongo.MongodExecutable;
-import de.flapdoodle.embed.mongo.MongodStarter;
-import de.flapdoodle.embed.mongo.config.MongodConfigBuilder;
-import de.flapdoodle.embed.mongo.config.Net;
-import de.flapdoodle.embed.mongo.distribution.Version;
-import de.flapdoodle.embed.process.runtime.Network;
-import java.io.IOException;
-import java.util.Collections;
-import org.apache.polygene.api.common.Visibility;
-import org.apache.polygene.bootstrap.ModuleAssembly;
-import org.apache.polygene.entitystore.mongodb.assembly.MongoDBEntityStoreAssembler;
-import org.apache.polygene.test.entity.model.EntityStoreTestSuite;
-import org.apache.polygene.test.util.FreePortFinder;
-import org.junit.AfterClass;
-import org.junit.BeforeClass;
-import org.junit.Rule;
-import org.junit.rules.TestName;
-
-public class EmbedMongoDBMapEntityStoreTestSuite extends EntityStoreTestSuite
-{
-    private static final MongodStarter MONGO_STARTER = MongodStarter.getDefaultInstance();
-
-    @Rule
-    public TestName testName = new TestName();
-    private static int port;
-    private static MongodExecutable mongod;
-
-    @BeforeClass
-    public static void startEmbedMongo()
-        throws IOException
-    {
-        port = FreePortFinder.findFreePortOnLoopback();
-        mongod = MONGO_STARTER.prepare( new MongodConfigBuilder()
-                                            .version( Version.Main.PRODUCTION )
-                                            .net( new Net( "localhost", port, Network.localhostIsIPv6() ) )
-                                            .build() );
-        mongod.start();
-    }
-
-    @AfterClass
-    public static void stopEmbedMongo()
-    {
-        if( mongod != null )
-        {
-            mongod.stop();
-        }
-    }
-
-    @Override
-    protected void defineStorageModule( ModuleAssembly module )
-    {
-        module.defaultServices();
-        new MongoDBEntityStoreAssembler()
-            .visibleIn( Visibility.application )
-            .withConfig( configModule, Visibility.application )
-            .assemble( module );
-
-        MongoDBEntityStoreConfiguration mongoConfig = configModule.forMixin( MongoDBEntityStoreConfiguration.class )
-                                                                  .declareDefaults();
-        mongoConfig.writeConcern().set( MongoDBEntityStoreConfiguration.WriteConcern.MAJORITY );
-        mongoConfig.database().set( "polygene-test" );
-        mongoConfig.collection().set( testName.getMethodName() );
-        mongoConfig.nodes().set( Collections.singletonList( "localhost:" + port ) );
-    }
-}
diff --git a/manual/src/docs/tutorials/howto-releasing-apache.txt b/manual/src/docs/tutorials/howto-releasing-apache.txt
index 9c2ae62..c67f269 100644
--- a/manual/src/docs/tutorials/howto-releasing-apache.txt
+++ b/manual/src/docs/tutorials/howto-releasing-apache.txt
@@ -33,6 +33,13 @@
 The instructions provided here are consistent with, but not a replacement for the https://www.apache.org/dev/release.html[ASF Release Guidelines].
 
 
+== TL;DR
+
+- Build and publish/stage release candidate bits
+- VOTE thread
+    - NO: clean things up
+    - YES: promote the release candidate bits as final and update all properties
+
 
 == Preparing a release
 
@@ -271,14 +278,6 @@
 [source,shell]
 ----
 .
-├── apache-polygene-java-<RELEASE-VERSION>-bin.tgz
-├── apache-polygene-java-<RELEASE-VERSION>-bin.tgz.MD5
-├── apache-polygene-java-<RELEASE-VERSION>-bin.tgz.SHA-512
-├── apache-polygene-java-<RELEASE-VERSION>-bin.tgz.asc
-├── apache-polygene-java-<RELEASE-VERSION>-bin.zip
-├── apache-polygene-java-<RELEASE-VERSION>-bin.zip.MD5
-├── apache-polygene-java-<RELEASE-VERSION>-bin.zip.SHA-512
-├── apache-polygene-java-<RELEASE-VERSION>-bin.zip.asc
 ├── apache-polygene-java-<RELEASE-VERSION>-src.tgz
 ├── apache-polygene-java-<RELEASE-VERSION>-src.tgz.MD5
 ├── apache-polygene-java-<RELEASE-VERSION>-src.tgz.SHA-512
@@ -330,7 +329,7 @@
 [source,shell]
 ----
 cd polygene-java
-./gradlew -Dversion="<RELEASE-VERSION>" publishAsfMavenArtifacts
+./gradlew -Dversion="<RELEASE-VERSION>" uploadArchives
 ----
 
 Close the staging Nexus repository by following the https://www.apache.org/dev/publishing-maven-artifacts.html#close-stage[Closing the staged repository] guide.
@@ -356,8 +355,8 @@
 
 === Upload RC distributions
 
-Source and binary distributions, checksums and signatures must be uploaded to https://dist.apache.org/repos/dist/dev/polygene/[dist.apache.org/repos/dist/dev/polygene].
-This build created these in the `buid/distributions` directory, named `apache-polygene-java-<RELEASE-VERSION>-[src|bin]*.*`.
+Source distribution, checksums and signatures must be uploaded to https://dist.apache.org/repos/dist/dev/polygene/[dist.apache.org/repos/dist/dev/polygene].
+This build created these in the `buid/distributions` directory, named `apache-polygene-java-<RELEASE-VERSION>-src*.*`.
 As this release still is a simple candidate, we'll rename them before upload to advertise this in their names.
 
 [source,shell]
@@ -380,24 +379,6 @@
    "polygene-dist/dev/polygene/apache-polygene-java-<RELEASE-VERSION>-RC#-src.tgz.SHA-512"
 cp "polygene-java/distributions/build/distributions/apache-polygene-java-<RELEASE-VERSION>-src.tgz.asc" \
    "polygene-dist/dev/polygene/apache-polygene-java-<RELEASE-VERSION>-RC#-src.tgz.asc"
-# Binary ZIP
-cp "polygene-java/distributions/build/distributions/apache-polygene-java-<RELEASE-VERSION>-bin.zip" \
-   "polygene-dist/dev/polygene/apache-polygene-java-<RELEASE-VERSION>-RC#-bin.zip"
-cp "polygene-java/distributions/build/distributions/apache-polygene-java-<RELEASE-VERSION>-bin.zip.MD5" \
-   "polygene-dist/dev/polygene/apache-polygene-java-<RELEASE-VERSION>-RC#-bin.zip.MD5"
-cp "polygene-java/distributions/build/distributions/apache-polygene-java-<RELEASE-VERSION>-bin.zip.SHA-512" \
-   "polygene-dist/dev/polygene/apache-polygene-java-<RELEASE-VERSION>-RC#-bin.zip.SHA-512"
-cp "polygene-java/distributions/build/distributions/apache-polygene-java-<RELEASE-VERSION>-bin.zip.asc" \
-   "polygene-dist/dev/polygene/apache-polygene-java-<RELEASE-VERSION>-RC#-bin.zip.asc"
-# Binary TAR.GZ
-cp "polygene-java/distributions/build/distributions/apache-polygene-java-<RELEASE-VERSION>-bin.tgz" \
-   "polygene-dist/dev/polygene/apache-polygene-java-<RELEASE-VERSION>-RC#-bin.tgz"
-cp "polygene-java/distributions/build/distributions/apache-polygene-java-<RELEASE-VERSION>-bin.tgz.MD5" \
-   "polygene-dist/dev/polygene/apache-polygene-java-<RELEASE-VERSION>-RC#-bin.tgz.MD5"
-cp "polygene-java/distributions/build/distributions/apache-polygene-java-<RELEASE-VERSION>-bin.tgz.SHA-512" \
-   "polygene-dist/dev/polygene/apache-polygene-java-<RELEASE-VERSION>-RC#-bin.tgz.SHA-512"
-cp "polygene-java/distributions/build/distributions/apache-polygene-java-<RELEASE-VERSION>-bin.tgz.asc" \
-   "polygene-dist/dev/polygene/apache-polygene-java-<RELEASE-VERSION>-RC#-bin.tgz.asc"
 ----
 
 And then upload them:
@@ -406,7 +387,7 @@
 ----
 cd polygene-dist/dev/polygene
 svn add * --force
-svn commit -m "polygene: upload <RELEASE-VERSION> to dist/dev/polygene"
+svn commit -m "polygene: upload <RELEASE-VERSION>-RC# to dist/dev/polygene"
 ----
 
 
@@ -447,10 +428,6 @@
 [ ]  0 I don't have a strong opinion about this, but I assume it's ok
 [ ] -1 Do not release Apache Polygene (Java Edition) <RELEASE-VERSION> because...
 
-Here is my vote:
-
-+1 (binding)
-
 Cheers
 ----
 
@@ -500,14 +477,6 @@
 [source,shell]
 ----
 cd polygene-check-rc
-wget https://dist.apache.org/repos/dist/dev/polygene/apache-polygene-java-<RELEASE-VERSION>-RC#-bin.tgz
-wget https://dist.apache.org/repos/dist/dev/polygene/apache-polygene-java-<RELEASE-VERSION>-RC#-bin.tgz.MD5
-wget https://dist.apache.org/repos/dist/dev/polygene/apache-polygene-java-<RELEASE-VERSION>-RC#-bin.tgz.SHA-512
-wget https://dist.apache.org/repos/dist/dev/polygene/apache-polygene-java-<RELEASE-VERSION>-RC#-bin.tgz.asc
-wget https://dist.apache.org/repos/dist/dev/polygene/apache-polygene-java-<RELEASE-VERSION>-RC#-bin.zip
-wget https://dist.apache.org/repos/dist/dev/polygene/apache-polygene-java-<RELEASE-VERSION>-RC#-bin.zip.MD5
-wget https://dist.apache.org/repos/dist/dev/polygene/apache-polygene-java-<RELEASE-VERSION>-RC#-bin.zip.SHA-512
-wget https://dist.apache.org/repos/dist/dev/polygene/apache-polygene-java-<RELEASE-VERSION>-RC#-bin.zip.asc
 wget https://dist.apache.org/repos/dist/dev/polygene/apache-polygene-java-<RELEASE-VERSION>-RC#-src.tgz
 wget https://dist.apache.org/repos/dist/dev/polygene/apache-polygene-java-<RELEASE-VERSION>-RC#-src.tgz.MD5
 wget https://dist.apache.org/repos/dist/dev/polygene/apache-polygene-java-<RELEASE-VERSION>-RC#-src.tgz.SHA-512
@@ -526,8 +495,6 @@
 [source,shell]
 ----
 cd polygene-check-rc
-gpg apache-polygene-java-<RELEASE-VERSION>-RC#-bin.tgz.asc
-gpg apache-polygene-java-<RELEASE-VERSION>-RC#-bin.zip.asc
 gpg apache-polygene-java-<RELEASE-VERSION>-RC#-src.tgz.asc
 gpg apache-polygene-java-<RELEASE-VERSION>-RC#-src.zip.asc
 ----
@@ -540,8 +507,6 @@
 [source,shell]
 ----
 cd polygene-check-rc
-echo "$(cat apache-polygene-java-<RELEASE-VERSION>-RC#-bin.tgz.MD5) apache-polygene-java-<RELEASE-VERSION>-RC#-bin.tgz" | md5sum -c -
-echo "$(cat apache-polygene-java-<RELEASE-VERSION>-RC#-bin.zip.MD5) apache-polygene-java-<RELEASE-VERSION>-RC#-bin.zip" | md5sum -c -
 echo "$(cat apache-polygene-java-<RELEASE-VERSION>-RC#-src.tgz.MD5) apache-polygene-java-<RELEASE-VERSION>-RC#-src.tgz" | md5sum -c -
 echo "$(cat apache-polygene-java-<RELEASE-VERSION>-RC#-src.zip.MD5) apache-polygene-java-<RELEASE-VERSION>-RC#-src.zip" | md5sum -c -
 ----
@@ -554,8 +519,6 @@
 [source,shell]
 ----
 cd polygene-check-rc
-echo "$(cat apache-polygene-java-<RELEASE-VERSION>-RC#-bin.tgz.MD5)  apache-polygene-java-<RELEASE-VERSION>-RC#-bin.tgz" | shasum -a 512 -c -
-echo "$(cat apache-polygene-java-<RELEASE-VERSION>-RC#-bin.zip.MD5)  apache-polygene-java-<RELEASE-VERSION>-RC#-bin.zip" | shasum -a 512 -c -
 echo "$(cat apache-polygene-java-<RELEASE-VERSION>-RC#-src.tgz.MD5)  apache-polygene-java-<RELEASE-VERSION>-RC#-src.tgz" | shasum -a 512 -c -
 echo "$(cat apache-polygene-java-<RELEASE-VERSION>-RC#-src.zip.MD5)  apache-polygene-java-<RELEASE-VERSION>-RC#-src.zip" | shasum -a 512 -c -
 ----
@@ -656,32 +619,6 @@
 svn move "$DIST_DEV_URL/apache-polygene-java-<RELEASE-VERSION>-RC#-src.tgz.asc" \
      "$DIST_RELEASE_URL/apache-polygene-java-<RELEASE-VERSION>-src.tgz.asc" \
      -m "polygene: promoting release <RELEASE-VERSION> distributions"
-# Binary ZIP
-svn move "$DIST_DEV_URL/apache-polygene-java-<RELEASE-VERSION>-RC#-bin.zip" \
-     "$DIST_RELEASE_URL/apache-polygene-java-<RELEASE-VERSION>-bin.zip" \
-     -m "polygene: promoting release <RELEASE-VERSION> distributions"
-svn move "$DIST_DEV_URL/apache-polygene-java-<RELEASE-VERSION>-RC#-bin.zip.MD5" \
-     "$DIST_RELEASE_URL/apache-polygene-java-<RELEASE-VERSION>-bin.zip.MD5" \
-     -m "polygene: promoting release <RELEASE-VERSION> distributions"
-svn move "$DIST_DEV_URL/apache-polygene-java-<RELEASE-VERSION>-RC#-bin.zip.SHA-512" \
-     "$DIST_RELEASE_URL/apache-polygene-java-<RELEASE-VERSION>-bin.zip.SHA-512" \
-     -m "polygene: promoting release <RELEASE-VERSION> distributions"
-svn move "$DIST_DEV_URL/apache-polygene-java-<RELEASE-VERSION>-RC#-bin.zip.asc" \
-     "$DIST_RELEASE_URL/apache-polygene-java-<RELEASE-VERSION>-bin.zip.asc" \
-     -m "polygene: promoting release <RELEASE-VERSION> distributions"
-# Binary TAR.GZ
-svn move "$DIST_DEV_URL/apache-polygene-java-<RELEASE-VERSION>-RC#-bin.tgz" \
-     "$DIST_RELEASE_URL/apache-polygene-java-<RELEASE-VERSION>-bin.tgz" \
-     -m "polygene: promoting release <RELEASE-VERSION> distributions"
-svn move "$DIST_DEV_URL/apache-polygene-java-<RELEASE-VERSION>-RC#-bin.tgz.MD5" \
-     "$DIST_RELEASE_URL/apache-polygene-java-<RELEASE-VERSION>-bin.tgz.MD5" \
-     -m "polygene: promoting release <RELEASE-VERSION> distributions"
-svn move "$DIST_DEV_URL/apache-polygene-java-<RELEASE-VERSION>-RC#-bin.tgz.SHA-512" \
-     "$DIST_RELEASE_URL/apache-polygene-java-<RELEASE-VERSION>-bin.tgz.SHA-512" \
-     -m "polygene: promoting release <RELEASE-VERSION> distributions"
-svn move "$DIST_DEV_URL/apache-polygene-java-<RELEASE-VERSION>-RC#-bin.tgz.asc" \
-     "$DIST_RELEASE_URL/apache-polygene-java-<RELEASE-VERSION>-bin.tgz.asc" \
-     -m "polygene: promoting release <RELEASE-VERSION> distributions"
 ----
 
 This produces one commit per file but keep svn history and runs fast, without re-uploading the distributions.
@@ -806,7 +743,7 @@
 
 === Announce
 
-Finally, send an announcement to mailto:dev@polygene.apache.org[dev@] and mailto:users@polygene.apache.org[users@] mailing lists. Email announcements should have the subject line:
+Finally, send an announcement to mailto:dev@polygene.apache.org[dev@] mailing list. Email announcements should have the subject line:
 
 [source,text]
 ----
@@ -817,7 +754,7 @@
 
 
 
-== VOTE fails
+== VOTE fails or is cancelled
 
 
 === Record failure
@@ -846,9 +783,8 @@
 [source,shell]
 ----
 cd polygene-dist/dev/polygene/
-rm "*<RELEASE-VERSION>-RC#*.*"
-svn add * --force
-svn commit -m "polygene: dropping <RELEASE-VERSION>-RC# from dist/dev/polygene as the vote failed"
+svn rm "*<RELEASE-VERSION>-RC#*.*"
+svn commit -m "polygene: dropping <RELEASE-VERSION>-RC# from dist/dev/polygene as the vote failed/was cancelled"
 ----
 
 Drop NPM packages: