diff --git a/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/ui/internal/workbench/ModelAssembler.java b/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/ui/internal/workbench/ModelAssembler.java
index 3c5f0ce..0059180 100644
--- a/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/ui/internal/workbench/ModelAssembler.java
+++ b/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/ui/internal/workbench/ModelAssembler.java
@@ -165,7 +165,7 @@
 						E4XMIResource applicationResource = (E4XMIResource) ((EObject) application).eResource();
 						ResourceSet resourceSet = applicationResource.getResourceSet();
 						if (attrURI == null) {
-							log(LogLevel.WARN, "Unable to find location for the model extension \"{0}\"", bundleName); //$NON-NLS-1$
+							log(LogLevel.WARN, "Unable to find location for the model extension {}", bundleName); //$NON-NLS-1$
 							return;
 						}
 
@@ -179,7 +179,7 @@
 								uri = URI.createPlatformPluginURI(path, false);
 							}
 						} catch (RuntimeException e) {
-							log(LogLevel.WARN, "Invalid location \"{0}\" of model extension \"\"", attrURI, bundleName, //$NON-NLS-1$
+							log(LogLevel.WARN, "Invalid location {} of model extension {}", attrURI, bundleName, //$NON-NLS-1$
 									e);
 							return;
 						}
@@ -188,7 +188,7 @@
 							Resource resource = resourceSet.getResource(uri, true);
 							resource.unload();
 						} catch (RuntimeException e) {
-							log(LogLevel.WARN, "Unable to read model extension from \"{0}\" of \"{1}\"", uri, //$NON-NLS-1$
+							log(LogLevel.WARN, "Unable to read model extension from {} of {}", uri, //$NON-NLS-1$
 									bundleName);
 						}
 					}
@@ -276,7 +276,7 @@
 				try {
 					ContextInjectionFactory.invoke(service, PreDestroy.class, context);
 				} catch (Exception e) {
-					log(LogLevel.WARN, "Could not run PreDestroy on processor {0}: {1}", contrib.getClass().getName(), //$NON-NLS-1$
+					log(LogLevel.WARN, "Could not run PreDestroy on processor {}: {}", contrib.getClass().getName(), //$NON-NLS-1$
 							e);
 				}
 			});
@@ -389,7 +389,7 @@
 
 			// check if the value for apply is valid
 			if (!ALWAYS.equals(apply) && !INITIAL.equals(apply) && !NOTEXISTS.equals(apply)) {
-				log(LogLevel.WARN, "Model-Fragment header apply attribute \"{0}\" is invalid, falling back to always", //$NON-NLS-1$
+				log(LogLevel.WARN, "Model-Fragment header apply attribute {} is invalid, falling back to always", //$NON-NLS-1$
 						apply);
 				apply = ALWAYS;
 			}
@@ -405,7 +405,7 @@
 				}
 			}
 		} else {
-			log(LogLevel.ERROR, "Model-Fragment header value \"{0}\" in bundle \\\"{1}\\\" is invalid", //$NON-NLS-1$
+			log(LogLevel.ERROR, "Model-Fragment header value {} in bundle {} is invalid", //$NON-NLS-1$
 					fragmentHeader, bundle.getSymbolicName());
 		}
 
@@ -515,7 +515,7 @@
 		int severity = validationResult.getSeverity();
 		if (severity == Diagnostic.ERROR) {
 			log(LogLevel.ERROR,
-					"Fragment from \"{0}\" of \"{1}\" could not be validated and was not merged: " //$NON-NLS-1$
+					"Fragment from {} of {} could not be validated and was not merged: " //$NON-NLS-1$
 							+ fragment, contributorURI, contributorName);
 		}
 
@@ -524,7 +524,7 @@
 			evalImports = true;
 			addedElements.addAll(merged);
 		} else {
-			log(LogLevel.DEBUG, "Nothing to merge for fragment \"{0}\" of \"{1}\"", contributorURI, //$NON-NLS-1$
+			log(LogLevel.DEBUG, "Nothing to merge for fragment {} of {}", contributorURI, //$NON-NLS-1$
 					contributorName);
 		}
 		if (evalImports && fragmentsContainer.getImports().size() > 0) {
@@ -536,7 +536,7 @@
 		E4XMIResource applicationResource = (E4XMIResource) ((EObject) application).eResource();
 		ResourceSet resourceSet = applicationResource.getResourceSet();
 		if (attrURI == null) {
-			log(LogLevel.WARN, "Unable to find location for the model extension \"{0}\"", bundleName); //$NON-NLS-1$
+			log(LogLevel.WARN, "Unable to find location for the model extension {}", bundleName); //$NON-NLS-1$
 			return null;
 		}
 
@@ -550,7 +550,7 @@
 				uri = URI.createPlatformPluginURI(path, false);
 			}
 		} catch (RuntimeException e) {
-			log(LogLevel.WARN, "Invalid location \"{0}\" of model extension \"\"", attrURI, bundleName, e); //$NON-NLS-1$
+			log(LogLevel.WARN, "Invalid location {} of model extension {}", attrURI, bundleName, e); //$NON-NLS-1$
 			return null;
 		}
 
@@ -558,7 +558,7 @@
 		try {
 			resource = resourceSet.getResource(uri, true);
 		} catch (RuntimeException e) {
-			log(LogLevel.WARN, "Unable to read model extension from \"{0}\" of \"{1}\"", uri, bundleName); //$NON-NLS-1$
+			log(LogLevel.WARN, "Unable to read model extension from {} of {}", uri, bundleName); //$NON-NLS-1$
 			return null;
 		}
 
@@ -570,7 +570,7 @@
 		Object extensionRoot = contents.get(0);
 
 		if (!(extensionRoot instanceof MModelFragments)) {
-			log(LogLevel.WARN, "Unable to create model extension \"{0}\"", bundleName); //$NON-NLS-1$
+			log(LogLevel.WARN, "Unable to create model extension {}", bundleName); //$NON-NLS-1$
 			return null;
 		}
 		return (MModelFragments) extensionRoot;
@@ -670,7 +670,7 @@
 			// check if the value for apply is valid
 			if (!ALWAYS.equals(apply) && !INITIAL.equals(apply)) {
 				log(LogLevel.WARN,
-						"IModelProcessorContribution apply property value \"{0}\" is invalid, falling back to always", //$NON-NLS-1$
+						"IModelProcessorContribution apply property value {} is invalid, falling back to always", //$NON-NLS-1$
 						apply);
 				apply = IModelProcessorContribution.APPLY_ALWAYS;
 			}
@@ -699,7 +699,7 @@
 
 			MApplicationElement el = ModelUtils.findElementById(application, id);
 			if (el == null) {
-				log(LogLevel.WARN, "Could not find element with id '{0}'", id); //$NON-NLS-1$
+				log(LogLevel.WARN, "Could not find element with id {}", id); //$NON-NLS-1$
 			}
 			localContext.set(key, el);
 		}
@@ -708,14 +708,14 @@
 			Object o = factory.create("bundleclass://" + ce.getContributor().getName() + "/" + ce.getAttribute("class"), //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$
 					context, localContext);
 			if (o == null) {
-				log(LogLevel.WARN, "Unable to create processor {0} from {1}", //$NON-NLS-1$
+				log(LogLevel.WARN, "Unable to create processor {} from {}", //$NON-NLS-1$
 						ce.getAttribute("class"), //$NON-NLS-1$
 						ce.getContributor().getName());
 			} else {
 				ContextInjectionFactory.invoke(o, Execute.class, context, localContext, null);
 			}
 		} catch (Exception e) {
-			log(LogLevel.WARN, "Could not run processor: {0}", e); //$NON-NLS-1$
+			log(LogLevel.WARN, "Could not run processor: {}", e); //$NON-NLS-1$
 		}
 	}
 
@@ -737,7 +737,7 @@
 
 			MApplicationElement el = ModelUtils.findElementById(application, id);
 			if (el == null) {
-				log(LogLevel.WARN, "Could not find element with id '{0}'", id); //$NON-NLS-1$
+				log(LogLevel.WARN, "Could not find element with id {}", id); //$NON-NLS-1$
 			}
 			localContext.set(key, el);
 		}
@@ -750,14 +750,14 @@
 				o = processor;
 			}
 			if (o == null) {
-				log(LogLevel.WARN, "Unable to create processor {0} from {1}", //$NON-NLS-1$
+				log(LogLevel.WARN, "Unable to create processor {} from {}", //$NON-NLS-1$
 						processor.getProcessorClass().getName(),
 						FrameworkUtil.getBundle(processor.getProcessorClass()).getSymbolicName());
 			} else {
 				ContextInjectionFactory.invoke(o, Execute.class, context, localContext, null);
 			}
 		} catch (Exception e) {
-			log(LogLevel.WARN, "Could not run processor: {0}", e); //$NON-NLS-1$
+			log(LogLevel.WARN, "Could not run processor: {}", e); //$NON-NLS-1$
 		}
 	}
 
@@ -799,7 +799,7 @@
 						el = importMaps.get((MApplicationElement) importObject);
 
 						if (el == null) {
-							log(LogLevel.WARN, "Could not resolve import for {0}", //$NON-NLS-1$
+							log(LogLevel.WARN, "Could not resolve import for {}", //$NON-NLS-1$
 									((MApplicationElement) importObject).getElementId());
 						}
 					}
@@ -812,7 +812,7 @@
 					commands.add(() -> {
 						if (internalFeature.isMany()) {
 							log(LogLevel.ERROR, MessageFormat.format(
-									"Replacing in {0}.\n\nFeature={1}.\n\nInternalElement={2} contributed by {3}.\n\nImportObject={4}", //$NON-NLS-1$
+									"Replacing in {}.\n\nFeature={}.\n\nInternalElement={} contributed by {}.\n\nImportObject={}", //$NON-NLS-1$
 									interalTarget, internalFeature.getName(), internalElement.getElementId(),
 									internalElement.getContributorURI(), internalImportObject));
 							@SuppressWarnings("unchecked")
diff --git a/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/workbench/ModelAssemblerTests.java b/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/workbench/ModelAssemblerTests.java
index 1d78e74..19b3738 100644
--- a/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/workbench/ModelAssemblerTests.java
+++ b/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/workbench/ModelAssemblerTests.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2016, 2020 EclipseSource Muenchen GmbH and others.
+ * Copyright (c) 2016, 2021 EclipseSource Muenchen GmbH and others.
  *
  *
  * This program and the accompanying materials
@@ -18,15 +18,14 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.verifyZeroInteractions;
-import static org.mockito.Mockito.when;
 
 import java.io.IOException;
 import java.io.InputStream;
+import java.util.ArrayDeque;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
 import javax.annotation.PostConstruct;
 import org.eclipse.core.internal.registry.ExtensionRegistry;
 import org.eclipse.core.runtime.ContributorFactorySimple;
@@ -63,13 +62,15 @@
 import org.eclipse.emf.ecore.resource.Resource;
 import org.eclipse.emf.ecore.resource.URIConverter;
 import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.equinox.log.ExtendedLogReaderService;
+import org.eclipse.equinox.log.LogFilter;
 import org.eclipse.swt.widgets.Display;
+import org.junit.After;
 import org.junit.Before;
 import org.junit.Ignore;
 import org.junit.Test;
-import org.mockito.ArgumentMatchers;
-import org.osgi.service.log.Logger;
-import org.osgi.service.log.LoggerFactory;
+import org.osgi.service.log.LogEntry;
+import org.osgi.service.log.LogListener;
 
 @SuppressWarnings("nls")
 public class ModelAssemblerTests {
@@ -82,9 +83,26 @@
 	private ResourceSetImpl resourceSet;
 	private E4XMIResource appResource;
 	private ModelAssembler assembler;
-	private Logger logger;
 	private EModelService modelService;
 
+	private static final int COUNTDOWN_TIMEOUT = 10_000;
+	private ArrayDeque<String> logMessages;
+	private ModelAssemblerTestLogListener logListener;
+
+	class ModelAssemblerTestLogListener implements LogListener {
+
+		CountDownLatch countDownLatch;
+
+		@Override
+		public void logged(LogEntry entry) {
+			logMessages.add(entry.getMessage());
+			if (countDownLatch != null) {
+				countDownLatch.countDown();
+			}
+		}
+
+	}
+
 	@Before
 	public void setup() {
 		appContext = E4Application.createDefaultContext();
@@ -92,10 +110,6 @@
 		application.setElementId(APPLICATION_ID);
 		application.setContext(appContext);
 
-		logger = mock(Logger.class);
-		LoggerFactory logFactory = mock(LoggerFactory.class);
-		when(logFactory.getLogger((Class<?>) ArgumentMatchers.any())).thenReturn(logger);
-
 		appContext.set(MApplication.class, application);
 		appContext.set(UISynchronize.class, new DisplayUISynchronize(Display.getDefault()));
 
@@ -105,14 +119,29 @@
 		resourceSet.getResources().add(appResource);
 		appResource.getContents().add((EObject) application);
 
-		assembler = new ModelAssembler();
+		assembler = appContext.get(ModelAssembler.class);
+		assembler.init(application, appContext, new DisplayUISynchronize(Display.getDefault()));
 		ContextInjectionFactory.invoke(assembler, PostConstruct.class, appContext);
 
-		assembler.setLogger(logFactory);
+		logMessages = new ArrayDeque<>();
+		logListener = new ModelAssemblerTestLogListener();
+
+		ExtendedLogReaderService log = appContext.get(ExtendedLogReaderService.class);
+		LogFilter logFilter = (bundle, loggerName, logLevel) -> {
+			return "org.eclipse.e4.ui.internal.workbench.ModelAssembler".equals(loggerName);
+		};
+
+		log.addLogListener(logListener, logFilter);
 
 		modelService = application.getContext().get(EModelService.class);
 	}
 
+	@After
+	public void tearDown() {
+		ExtendedLogReaderService log = appContext.get(ExtendedLogReaderService.class);
+		log.removeLogListener(logListener);
+	}
+
 	/**
 	 * Test the handling of a fragment contribution with no elements to merge.
 	 *
@@ -131,7 +160,7 @@
 						&& element.getContributorURI().equals(contributorURI));
 		assertTrue(modelElements.isEmpty());
 
-		verifyZeroInteractions(logger);
+		assertEquals(0, logMessages.size());
 	}
 
 	/**
@@ -170,9 +199,7 @@
 		assertEquals(window, found);
 		assertEquals(fragmentParentId, found.getParent().getElementId());
 
-		verifyZeroInteractions(logger);
-
-
+		assertEquals(0, logMessages.size());
 	}
 
 	@Test
@@ -214,7 +241,7 @@
 		MUIElement found = modelService.find(contributedElementId, application);
 		assertEquals(window1, found);
 
-		verifyZeroInteractions(logger);
+		assertEquals(0, logMessages.size());
 	}
 
 	/**
@@ -258,7 +285,7 @@
 		assertEquals(found, window2);
 		assertEquals(contributorID, found.getContributorURI());
 
-		verifyZeroInteractions(logger);
+		assertEquals(0, logMessages.size());
 	}
 
 	/** Tests that correctly configured imports are correctly handled. */
@@ -284,12 +311,13 @@
 
 		assembler.resolveImports(imports, addedElements);
 		assertEquals(realWindow1, placeholder.getRef());
-		verifyZeroInteractions(logger);
+
+		assertEquals(0, logMessages.size());
 	}
 
 	/** Tests the processing of an import with a null/incorrect element id. */
 	@Test
-	public void testImports_noImportElementId() {
+	public void testImports_noImportElementId() throws Exception {
 		List<MApplicationElement> imports = new ArrayList<>();
 		List<MApplicationElement> addedElements = new ArrayList<>();
 
@@ -306,10 +334,17 @@
 		placeholder.setRef(importWindow1);
 		addedElements.add(placeholder);
 
+		CountDownLatch countDownLatch = new CountDownLatch(1);
+		this.logListener.countDownLatch = countDownLatch;
+
 		assembler.resolveImports(imports, addedElements);
 		assertEquals(null, placeholder.getRef());
-		verify(logger).warn("Could not resolve import for {0}", new Object[] { null });
-		verifyZeroInteractions(logger);
+
+		boolean completed = countDownLatch.await(COUNTDOWN_TIMEOUT, TimeUnit.MILLISECONDS);
+		assertTrue("Timeout - no event received", completed);
+
+		assertEquals(1, logMessages.size());
+		assertEquals("Could not resolve import for null", logMessages.poll());
 	}
 
 	/**
@@ -356,7 +391,7 @@
 
 		// the testing was done in the post-processor; if we didn't fail there,
 		// everything went fine.
-		verifyZeroInteractions(logger);
+		assertEquals(0, logMessages.size());
 	}
 
 	/**
@@ -370,7 +405,7 @@
 		testProcessor("org.eclipse.e4.ui.tests/data/ModelAssembler/processors_always.xml", true, false);
 		assertEquals(1, application.getDescriptors().size());
 		assertEquals("simpleprocessor.pre", application.getDescriptors().get(0).getElementId());
-		verifyZeroInteractions(logger);
+		assertEquals(0, logMessages.size());
 	}
 
 	/**
@@ -384,7 +419,7 @@
 		testProcessor("org.eclipse.e4.ui.tests/data/ModelAssembler/processors_always.xml", false, false);
 		assertEquals(1, application.getDescriptors().size());
 		assertEquals("simpleprocessor.pre", application.getDescriptors().get(0).getElementId());
-		verifyZeroInteractions(logger);
+		assertEquals(0, logMessages.size());
 	}
 
 	/**
@@ -398,7 +433,7 @@
 		testProcessor("org.eclipse.e4.ui.tests/data/ModelAssembler/processors_initial.xml", true, false);
 		assertEquals(1, application.getDescriptors().size());
 		assertEquals("simpleprocessor.pre", application.getDescriptors().get(0).getElementId());
-		verifyZeroInteractions(logger);
+		assertEquals(0, logMessages.size());
 	}
 
 	/**
@@ -411,7 +446,7 @@
 	public void testPreProcessor_persistedState_initial() throws Exception {
 		testProcessor("org.eclipse.e4.ui.tests/data/ModelAssembler/processors_initial.xml", false, false);
 		assertEquals(0, application.getDescriptors().size());
-		verifyZeroInteractions(logger);
+		assertEquals(0, logMessages.size());
 	}
 
 	/**
@@ -425,7 +460,7 @@
 		testProcessor("org.eclipse.e4.ui.tests/data/ModelAssembler/processors_always.xml", false, true);
 		assertEquals(1, application.getDescriptors().size());
 		assertEquals("simpleprocessor.post", application.getDescriptors().get(0).getElementId());
-		verifyZeroInteractions(logger);
+		assertEquals(0, logMessages.size());
 	}
 
 	/**
@@ -439,7 +474,7 @@
 		testProcessor("org.eclipse.e4.ui.tests/data/ModelAssembler/processors_always.xml", true, true);
 		assertEquals(1, application.getDescriptors().size());
 		assertEquals("simpleprocessor.post", application.getDescriptors().get(0).getElementId());
-		verifyZeroInteractions(logger);
+		assertEquals(0, logMessages.size());
 	}
 
 	/**
@@ -453,7 +488,7 @@
 		testProcessor("org.eclipse.e4.ui.tests/data/ModelAssembler/processors_initial.xml", true, true);
 		assertEquals(1, application.getDescriptors().size());
 		assertEquals("simpleprocessor.post", application.getDescriptors().get(0).getElementId());
-		verifyZeroInteractions(logger);
+		assertEquals(0, logMessages.size());
 	}
 
 	/**
@@ -466,7 +501,7 @@
 	public void testPostProcessor_persistedState_initial() throws Exception {
 		testProcessor("org.eclipse.e4.ui.tests/data/ModelAssembler/processors_initial.xml", false, true);
 		assertEquals(0, application.getDescriptors().size());
-		verifyZeroInteractions(logger);
+		assertEquals(0, logMessages.size());
 	}
 
 	/**
@@ -477,11 +512,18 @@
 	 */
 	@Test
 	public void testProcessor_noProcessor() throws Exception {
+		CountDownLatch countDownLatch = new CountDownLatch(1);
+		this.logListener.countDownLatch = countDownLatch;
+
 		testProcessor("org.eclipse.e4.ui.tests/data/ModelAssembler/processor_null.xml", true, false);
-		verify(logger).warn("Unable to create processor {0} from {1}",
-				new Object[] { null, "org.eclipse.e4.ui.tests" });
+		boolean completed = countDownLatch.await(COUNTDOWN_TIMEOUT, TimeUnit.MILLISECONDS);
+		assertTrue("Timeout - no event received", completed);
+
+		assertEquals(1, logMessages.size());
+		assertEquals("Unable to create processor null from org.eclipse.e4.ui.tests", logMessages.poll());
+
 		assertEquals(0, application.getDescriptors().size());
-		verifyZeroInteractions(logger);
+		assertEquals(0, logMessages.size());
 	}
 
 	/**
@@ -492,14 +534,21 @@
 	 */
 	@Test
 	public void testProcessor_processorNotFound() throws Exception {
-		testProcessor("org.eclipse.e4.ui.tests/data/ModelAssembler/processor_wrongProcessorClass.xml", true, false);
-		verify(logger).warn("Unable to create processor {0} from {1}",
-				new Object[] { "org.eclipse.e4.ui.tests.workbench.SimplePreProcessor_NotFound",
-						"org.eclipse.e4.ui.tests" });
-		assertEquals(0, application.getDescriptors().size());
-		verifyZeroInteractions(logger);
-	}
+		CountDownLatch countDownLatch = new CountDownLatch(1);
+		this.logListener.countDownLatch = countDownLatch;
 
+		testProcessor("org.eclipse.e4.ui.tests/data/ModelAssembler/processor_wrongProcessorClass.xml", true, false);
+		boolean completed = countDownLatch.await(COUNTDOWN_TIMEOUT, TimeUnit.MILLISECONDS);
+		assertTrue("Timeout - no event received", completed);
+
+		assertEquals(1, logMessages.size());
+		assertEquals(
+				"Unable to create processor org.eclipse.e4.ui.tests.workbench.SimplePreProcessor_NotFound from org.eclipse.e4.ui.tests",
+				logMessages.poll());
+
+		assertEquals(0, application.getDescriptors().size());
+		assertEquals(0, logMessages.size());
+	}
 
 	/**
 	 * Tests a processor contribution that adds to the context an element with
@@ -510,11 +559,18 @@
 	 */
 	@Test
 	public void testProcessor_wrongAppId() throws Exception {
+		CountDownLatch countDownLatch = new CountDownLatch(1);
+		this.logListener.countDownLatch = countDownLatch;
+
 		application.setElementId("newID");
 		testProcessor("org.eclipse.e4.ui.tests/data/ModelAssembler/processors_initial.xml", true, true);
-		verify(logger).warn("Could not find element with id '{0}'",
-				new Object[] { "org.eclipse.e4.ui.tests.modelassembler.app" });
-		verifyZeroInteractions(logger);
+		boolean completed = countDownLatch.await(COUNTDOWN_TIMEOUT, TimeUnit.MILLISECONDS);
+		assertTrue("Timeout - no event received", completed);
+
+		assertEquals(1, logMessages.size());
+		assertEquals("Could not find element with id org.eclipse.e4.ui.tests.modelassembler.app", logMessages.poll());
+
+		assertEquals(0, logMessages.size());
 		assertEquals(1, application.getDescriptors().size());
 		assertEquals("simpleprocessor.post", application.getDescriptors().get(0).getElementId());
 	}
