diff --git a/org.eclipse.osbp.osgi.hybrid.api/META-INF/MANIFEST.MF b/org.eclipse.osbp.osgi.hybrid.api/META-INF/MANIFEST.MF
index ed2aa0e..a5f0ae1 100644
--- a/org.eclipse.osbp.osgi.hybrid.api/META-INF/MANIFEST.MF
+++ b/org.eclipse.osbp.osgi.hybrid.api/META-INF/MANIFEST.MF
@@ -22,7 +22,6 @@
  org.apache.httpcomponents.httpclient,
  org.jsoup,
  org.eclipse.osbp.runtime.web.vaadin.databinding;bundle-version="[0.9.0,0.10.0)",
- refresher.osgi;bundle-version="[1.2.3,1.2.4)",
  org.eclipse.osbp.preferences;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.webserver.messagequeue;bundle-version="[0.9.0,0.10.0)",
  org.eclipse.osbp.runtime.common;bundle-version="[0.9.0,0.10.0)",
diff --git a/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/AbstractHybridVaaclipseView.java b/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/AbstractHybridVaaclipseView.java
index 85af892..9b193bf 100644
--- a/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/AbstractHybridVaaclipseView.java
+++ b/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/AbstractHybridVaaclipseView.java
@@ -14,6 +14,8 @@
  */
 package org.eclipse.osbp.osgi.hybrid.api;
 
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
 import java.util.Collection;
 import java.util.List;
 import java.util.Map;
@@ -22,6 +24,7 @@
 import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.inject.Inject;
+import javax.swing.Timer;
 
 import org.eclipse.e4.core.contexts.IEclipseContext;
 import org.eclipse.e4.core.services.events.IEventBroker;
@@ -64,18 +67,11 @@
 
 	private static final Logger LOGGER = LoggerFactory.getLogger(AbstractHybridVaaclipseView.class);
 
-	public enum RenderMode {
-		SYNCHRONOUSLY, ASYNCHRONOUSLY
-	}
-
 	private IEclipseContext fEclipseContext;
 	private MApplication fE4App;
 	private VerticalLayout fParent;
 	private boolean fViewInitialized;
 
-	private RenderMode renderMode = RenderMode.ASYNCHRONOUSLY;
-	private boolean firstTime = true;
-	private int pollingInterval = 2000;
 	/** The beeper. */
 	private Beeper beeper = new Beeper();
 	private Audio audio = new Audio();
@@ -85,6 +81,8 @@
 
 	private EPartService partService;
 
+	private Timer timer;
+
 	public AbstractHybridVaaclipseView() {}
 	/**
 	 * <b><i><u>Warning:</u> never use initializing class attributes in the definition!<br>
@@ -101,7 +99,7 @@
 		fViewInitialized = false;
 		fParent = parent;
 		fRecursiveFocusBlurListener = RecursiveFocusBlurListener.attachFor(fParent);
-//		parent.addComponent(beeper);
+		parent.addComponent(beeper);
 //		audio.setShowControls(false);
 //		parent.addComponent(audio);
 //		video.setShowControls(false);
@@ -114,10 +112,10 @@
 		HybridVaadinVaaclipseConnector.instance(fEclipseContext).addListener(this);
 		HybridVaadinVaaclipseConnector.instance(fEclipseContext).setE4Application(fE4App);
 		VaadinObservables.getRealm(UI.getCurrent());
-		UI.getCurrent().setPollInterval(pollingInterval);
+//		UI.getCurrent().setPollInterval(pollingInterval);
 		createView(fParent);
 		postInit(null);
-		renderData(true);
+		renderData();
 	}
 
 	@PreDestroy
@@ -138,9 +136,6 @@
 		if	(getThemeResourceService() != null) {
 			msg.setIcon(getThemeResourceService().getThemeResource("locksview.gif", ThemeResourceType.IMAGE));
 		}
-		else {
-			LOGGER.error("themeResourceService not set!");
-		}
 		area.addComponent(msg);
 	}
 
@@ -218,44 +213,26 @@
 
 	protected abstract void createComponents();
 
-	// renderData is used for components that are not fully embedded in vaadin's connector structure
-	// and must be repainted when parent window resizes
-	// but can also be used to make component rendering asynchronously from view creation
 	public void renderData() {
-		LOGGER.debug("renderData not firsttime");
-		renderData(false);
-	}
-
-	public void renderData(boolean firstTime) {
-		// the first time we only want to be triggered by the initial createView process, not by changeLocale
-		if (this.firstTime) {
-			if (!firstTime) {
-				LOGGER.debug("renderData ignored because not firsttime");
-				return;
-			} else {
-				this.firstTime = false;
-			}
-		}
-		if (UI.getCurrent() == null) {
-			LOGGER.debug("renderData has no current ui");
-			return;
-		}
-		if (renderMode == RenderMode.SYNCHRONOUSLY) {
-			LOGGER.debug("render synchronously");
-			UI.getCurrent().accessSynchronously(new Runnable() {
-				@Override
-				public void run() {
-					createComponents();
-				}
-			});
+		LOGGER.debug("buffered render asynchronously. Class:{} ObjectID:{}", getClass().getName(), System.identityHashCode(this));
+		final UI currentUi = fEclipseContext.get(UI.class); 
+		if(timer != null && timer.isRunning()) {
+			LOGGER.debug("{}", "buffered render restarted.");
+			timer.restart();
 		} else {
-			LOGGER.debug("render asynchronously");
-			UI.getCurrent().access(new Runnable() {
-				@Override
-				public void run() {
-					createComponents();
-				}
-			});
+			timer = new Timer(500, e -> 
+				currentUi.access(new Runnable() {
+					@Override
+					public void run() {
+						LOGGER.debug("execute render asynchronously. Class:{} ObjectID:{}", getClass().getName(),
+								System.identityHashCode(this));
+						VaadinObservables.activateRealm(currentUi);
+						createComponents();
+					}
+				})
+			);
+			timer.setRepeats(false);
+			timer.start();
 		}
 	}
 
@@ -314,19 +291,6 @@
 	}
 
 	/**
-	 * Try to authenticate with the credentials given!<br>
-	 * {@link #setAuthenticated(boolean)} will explicit be called!
-	 * 
-	 * @param portalId
-	 * @param userName
-	 * @param password
-	 * @return true if the user was authenticated successful
-	 */
-	// protected boolean tryToAuthenticate(String portalId, String userName, String password) {
-	// return HybridVaadinVaaclipseConnector.instance().tryToAuthenticate(portalId, userName, password);
-	// }
-
-	/**
 	 * Logout from the Shiro API and send a LOGOUT event via ActiveMQ
 	 */
 	protected void logout() {
@@ -361,7 +325,6 @@
 	@Override
 	public void partActivated(MPart part) {
 		if(part != null) {
-			HybridVaadinVaaclipseConnector.instance(fEclipseContext).activatePartStateRefresher(part);
 			MPerspective active = HybridVaadinVaaclipseConnector.findCurrentPerspectiveFor(part);
 			if (active instanceof MPerspective) {
 				HybridVaadinVaaclipseConnector.instance(fEclipseContext).updatePerspectiveList();
@@ -372,23 +335,18 @@
 
 	@Override
 	public void partBroughtToTop(MPart part) {
-		HybridVaadinVaaclipseConnector.instance(fEclipseContext).activatePartStateRefresher(part);
-		LOGGER.debug("part {} brought to top", part);
 	}
 
 	@Override
 	public void partDeactivated(MPart part) {
-		LOGGER.debug("part {} deactivated", part);
 	}
 
 	@Override
 	public void partHidden(MPart part) {
-		LOGGER.debug("part {} hidden", part);
 	}
 
 	@Override
 	public void partVisible(MPart part) {
-		LOGGER.debug("part {} visible", part);
 	}
 
 	/**
@@ -404,22 +362,6 @@
 		return HybridVaadinVaaclipseConnector.instance(fEclipseContext).tryToAuthenticate(portalId, userName, password);
 	}
 
-	public RenderMode getRenderMode() {
-		return renderMode;
-	}
-
-	public void setRenderMode(RenderMode renderMode) {
-		this.renderMode = renderMode;
-	}
-
-	public int getPollingInterval() {
-		return pollingInterval;
-	}
-
-	public void setPollingInterval(int pollingInterval) {
-		this.pollingInterval = pollingInterval;
-	}
-	
 	public Beeper getBeeper() {
 		return beeper;
 	}
@@ -429,6 +371,4 @@
 	public Video getVideo() {
 		return video;
 	}
-//	abstract void activate(MPart part);
-//	abstract void deactivate(MPart part);
 }
diff --git a/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/HybridCredentials.java b/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/HybridCredentials.java
index df2a162..34c5cc7 100644
--- a/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/HybridCredentials.java
+++ b/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/HybridCredentials.java
@@ -14,16 +14,6 @@
  */
 package org.eclipse.osbp.osgi.hybrid.api;
 
-import java.io.Serializable;
-import java.net.URI;
-import java.util.List;
-
-import org.apache.http.NameValuePair;
-import org.apache.http.client.utils.URLEncodedUtils;
-
-import com.vaadin.server.Page;
-import com.vaadin.ui.UI;
-
 public class HybridCredentials {
 
 	private final String portalId;
diff --git a/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/HybridPartStateRefresher.java b/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/HybridPartStateRefresher.java
deleted file mode 100644
index 95dff23..0000000
--- a/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/HybridPartStateRefresher.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/**
- *                                                                            
- * Copyright (c) 2011, 2016 - Loetz GmbH&Co.KG (69115 Heidelberg, Germany)
- *                                                                            
- * All rights reserved. This program and the accompanying materials           
- * are made available under the terms of the Eclipse Public License 2.0        
- * which accompanies this distribution, and is available at                  
- * https://www.eclipse.org/legal/epl-2.0/                                 
- *                                 
- * SPDX-License-Identifier: EPL-2.0                                 
- *                                                                            
- * Contributors:   
- * Christophe Loetz (Loetz GmbH&Co.KG) - initial implementation 
- */
-package org.eclipse.osbp.osgi.hybrid.api;
-
-import com.github.wolfie.refresher.Refresher;
-
-import org.eclipse.osbp.preferences.ProductConfiguration;
-
-public class HybridPartStateRefresher extends Refresher {
-
-	private static final long serialVersionUID = 2627881764074882845L;
-	private boolean fActive;
-	private final int fIntervalActive;
-	private final int fIntervalInactive;
-	
-	public HybridPartStateRefresher(RefreshListener listener) {
-		fIntervalActive = ProductConfiguration.getHybridRefresherMilliSecsActive();
-		fIntervalInactive = ProductConfiguration.getHybridRefresherMilliSecsInactive();
-		addListener(listener);
-		setActive(true);
-	}
-	
-	public void setActive(boolean active) {
-		if	(fActive != active) {
-			fActive = active;
-			setRefreshInterval(fActive ? fIntervalActive : fIntervalInactive);
-		}
-	}
-	
-	public boolean isActive() {
-		return fActive;
-	}
-}
diff --git a/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/HybridServiceBinder.java b/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/HybridServiceBinder.java
index aa0fdcb..ac16549 100644
--- a/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/HybridServiceBinder.java
+++ b/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/HybridServiceBinder.java
@@ -27,7 +27,7 @@
 public class HybridServiceBinder {
 
 	private static final Set<IPresentationRenderer> sPresentationRenderers = new HashSet<>();
-	private final static Logger log = LoggerFactory.getLogger("servicebinder");
+	private static final Logger log = LoggerFactory.getLogger("servicebinder");
 	private static IUserAccessService userAccessService;
 
 
diff --git a/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/HybridVaadinVaaclipseConnector.java b/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/HybridVaadinVaaclipseConnector.java
index f3751af..508c2e6 100644
--- a/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/HybridVaadinVaaclipseConnector.java
+++ b/org.eclipse.osbp.osgi.hybrid.api/src/org/eclipse/osbp/osgi/hybrid/api/HybridVaadinVaaclipseConnector.java
@@ -17,7 +17,6 @@
 import java.awt.image.BufferedImage;
 import java.io.ByteArrayOutputStream;
 import java.io.InputStream;
-import java.lang.reflect.Method;
 import java.net.URI;
 import java.util.Collection;
 import java.util.HashSet;
@@ -37,7 +36,6 @@
 import org.eclipse.e4.ui.model.application.MApplication;
 import org.eclipse.e4.ui.model.application.ui.MUIElement;
 import org.eclipse.e4.ui.model.application.ui.advanced.MPerspective;
-import org.eclipse.e4.ui.model.application.ui.basic.MPart;
 import org.eclipse.e4.ui.workbench.modeling.EModelService;
 import org.eclipse.e4.ui.workbench.modeling.EPartService;
 import org.eclipse.osbp.dsl.common.datatypes.IDto;
@@ -56,15 +54,12 @@
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.github.wolfie.refresher.Refresher;
-import com.github.wolfie.refresher.Refresher.RefreshListener;
 import com.vaadin.server.AbstractClientConnector;
-import com.vaadin.server.Extension;
 import com.vaadin.server.Page;
 import com.vaadin.server.VaadinRequest;
 import com.vaadin.ui.UI;
 
-public class HybridVaadinVaaclipseConnector implements RefreshListener, IHybridVaadinVaaclipseListener {
+public class HybridVaadinVaaclipseConnector implements IHybridVaadinVaaclipseListener {
 
 	private static final long serialVersionUID = 7239729235615118954L;
 	private static final Logger LOGGER = LoggerFactory.getLogger(HybridVaadinVaaclipseConnector.class);
@@ -96,8 +91,6 @@
 	private String fLastFocusPerspectiveId = "";
 	private Queue<Map<String,Object>> fLastListOfPerspectives = new LinkedList<Map<String,Object>>();
 	private Queue<IEventForNextRefresh> fEventsForNextRefresh = null;
-	private HybridPartStateRefresher fPartStateRefresher = null;
-	private MPart fLastActivePart;
 	private AbstractClientConnector fLastExtensionHolder;
 	private boolean fPostInitForSessionHandled;
 	private boolean fPostInitForAuthenticationHandled;
@@ -158,13 +151,7 @@
 		return ((component != null) && "org.eclipse.osbp.vaaclipse.presentation.widgets.TrimmedWindowContent".equals(component.getClass().getCanonicalName()));
 	}
 	
-	@Override
-	public void refresh(Refresher source) {
-		// --- if not yet on TrimmedWindowContent ---
-		if	(!isTrimmedWindowContent()) {
-			// --- re-active a part state refresher ---
-			activatePartStateRefresher();
-		}
+	public void refresh() {
 		// --- handle all events received via ActiveMq ---
 		while	(!fEventsForNextRefresh.isEmpty()) {
 			IEventForNextRefresh event = fEventsForNextRefresh.poll();
@@ -330,100 +317,6 @@
 		fMqBrokerPort = ProductConfiguration.getActiveMqBrokerServerPort();
 	}
 
-	/**
-	 *  @return true if a refresher exists
-	 */
-	protected boolean refresherExisting() {
-		return (fPartStateRefresher != null);
-	}
-
-	/**
-	 *  re-create a refresher if it is needed and not yet added to a TrimmedWindowContent
-	 */
-	protected void activatePartStateRefresher() {
-		if	((fMqConsumer != null) && !isTrimmedWindowContent() && (fLastActivePart != null)) {
-			activatePartStateRefresher(fLastActivePart);
-		}
-	}
-
-	/**
-	 *  (re-)create a refresher for the MPart and not yet added to a TrimmedWindowContent
-	 *  @param part
-	 */
-	protected void activatePartStateRefresher(MPart part) {
-		fLastActivePart = part;
-		// --- create the event queue if it doesn't exists yet ---
-		if	(fEventsForNextRefresh == null) {
-			fEventsForNextRefresh = new LinkedList<IEventForNextRefresh>();			
-		}
-		// --- no refresher if not connected to any hybrid ---
-		if	(fMqConsumer == null) {
-			return;
-		}
-		// --- no re-create refresher if it is already set on a TrimmedWindowContent ---
-		if	(isTrimmedWindowContent()) {
-			return;
-		}
-		if	(part != null) {
-			Object object = part.getObject();
-			// --- get the view connected to the MPart ---
-			if	(object instanceof AbstractHybridVaaclipseView) {
-				AbstractHybridVaaclipseView view = (AbstractHybridVaaclipseView) object;
-				// --- get the parent component ---
-				AbstractClientConnector parent = view.getParent();
-				Method addExtension = null;
-				AbstractClientConnector extensionHolder = null;
-				try {
-					// --- traverse the parents to get the topmost extension holder ---
-					while  ((parent != null) && (parent.getParent() != null)) {
-						try {
-							// --- check each parent for ... ---
-							for	(Class cls = parent.getClass(); cls != null; cls = cls.getSuperclass()) {
-								try {
-									// --- ... each extended class ... ---
-									if  (cls.getDeclaredMethod("addExtension", Extension.class) != null) {
-										// --- if it has a method addExtension(Extension) ---
-										extensionHolder = parent;
-										addExtension = cls.getDeclaredMethod("addExtension", Extension.class);
-										break;
-									}
-								}
-								catch (Exception e) {} // NOP
-							}
-						}
-						catch (Exception e) {} // NOP
-						// --- the parent ---
-						parent = (AbstractClientConnector) parent.getParent();
-						// --- if this instance is a TrimmedWindowContent itself ---
-						if	(HybridVaadinVaaclipseConnector.isTrimmedWindowContent(extensionHolder)) {
-							break;
-						}
-					}
-					// --- if a possible extension holder was found ---
-					if	(extensionHolder != null) {
-						Collection<Extension> extensions = extensionHolder.getExtensions();
-						for	(Extension extension : extensions) {
-							// --- if it already has a refresher ---
-							if	(extension instanceof HybridPartStateRefresher) {
-								return;
-							}
-						}
-						if	(addExtension != null) {
-							// --- enable the accessability of the method ---
-							addExtension.setAccessible(true);
-							// --- generate a new refresher; they can't be moved to another parent ---
-							fPartStateRefresher = new HybridPartStateRefresher(this);
-							addExtension.invoke(extensionHolder, new Object[] { fPartStateRefresher });
-							// --- remember the last active extension holder ---
-							fLastExtensionHolder = extensionHolder;
-						}
-					}
-				}
-				catch (Exception e) {} // NOP
-			}
-		}
-	}
-	
 	public void setE4Application(MApplication e4Application) {
 		fE4Application = e4Application;
 	}
