Index: java/main/src/main/java/com/framsticks/util/dispatching/Dispatching.java
===================================================================
--- java/main/src/main/java/com/framsticks/util/dispatching/Dispatching.java	(revision 101)
+++ java/main/src/main/java/com/framsticks/util/dispatching/Dispatching.java	(revision 102)
@@ -3,8 +3,10 @@
 import java.util.Timer;
 
+import org.apache.logging.log4j.Level;
 import org.apache.logging.log4j.Logger;
 import org.apache.logging.log4j.LogManager;
 
 import com.framsticks.util.FramsticksException;
+import com.framsticks.util.Misc;
 
 /**
@@ -32,4 +34,8 @@
 	}
 
+	public static <C> void dispatch(Dispatcher<C> dispatcher, RunAt<? extends C> runnable) {
+		dispatcher.dispatch(runnable);
+	}
+
 	// public static boolean assertInvokeLater(Dispatcher dispatcher, RunAt runnable) {
 	//	dispatcher.invokeLater(runnable);
@@ -66,4 +72,5 @@
 
 	public static void use(final Joinable joinable, final JoinableParent owner) {
+		Misc.throwIfNull(joinable);
 		log.debug("using {} by {}", joinable, owner);
 		if (joinable.use(owner)) {
@@ -75,4 +82,5 @@
 
 	public static void drop(final Joinable joinable, final JoinableParent owner) {
+		Misc.throwIfNull(joinable);
 		log.debug("droping {} by {}", joinable, owner);
 		if (joinable.drop(owner)) {
@@ -84,4 +92,5 @@
 
 	public static void join(Joinable joinable) throws InterruptedException {
+		Misc.throwIfNull(joinable);
 		log.debug("joining {}", joinable);
 		try {
@@ -95,5 +104,5 @@
 
 	public static void childChangedState(final JoinableParent parent, final Joinable joinable, final JoinableState state) {
-		if (state.ordinal() <= JoinableState.RUNNING.ordinal()) {
+		if (state.ordinal() < JoinableState.RUNNING.ordinal()) {
 			return;
 		}
@@ -113,4 +122,5 @@
 			}
 		} catch (InterruptedException e) {
+			log.debug("failed to wait on {} because of: {}", object, e.getMessage());
 		}
 	}
@@ -123,4 +133,5 @@
 				return;
 			} catch (InterruptedException e) {
+				log.debug("failed to join {} because of: {}", joinable, e.getMessage());
 				// throw new FramsticksException().msg("failed to join").arg("dispatcher", dispatcher).cause(e);
 			}
@@ -192,38 +203,38 @@
 
 	// public static class DispatcherWaiter<C, T extends Dispatcher<C> & Joinable> implements Dispatcher<C> {
-	// 	// protected boolean done = false;
-	// 	protected final T dispatcher;
-	// 	protected RunAt<? extends C> runnable;
-
-	// 	/**
-	// 	 * @param joinable
-	// 	 */
-	// 	public DispatcherWaiter(T dispatcher) {
-	// 		this.dispatcher = dispatcher;
-	// 	}
-
-	// 	public synchronized void waitFor() {
-	// 		while ((runnable == null) && (dispatcher.getState().ordinal() <= JoinableState.RUNNING.ordinal())) {
-	// 			try {
-	// 				this.wait();
-	// 			} catch (InterruptedException e) {
-	// 			}
-	// 		}
-	// 		if (runnable != null) {
-	// 			runnable.run();
-	// 		}
-
-	// 	}
-
-	// 	@Override
-	// 	public boolean isActive() {
-	// 		return dispatcher.isActive();
-	// 	}
-
-	// 	@Override
-	// 	public synchronized void dispatch(RunAt<? extends C> runnable) {
-	// 		this.runnable = runnable;
-	// 		this.notifyAll();
-	// 	}
+	//	// protected boolean done = false;
+	//	protected final T dispatcher;
+	//	protected RunAt<? extends C> runnable;
+
+	//	/**
+	//	 * @param joinable
+	//	 */
+	//	public DispatcherWaiter(T dispatcher) {
+	//		this.dispatcher = dispatcher;
+	//	}
+
+	//	public synchronized void waitFor() {
+	//		while ((runnable == null) && (dispatcher.getState().ordinal() <= JoinableState.RUNNING.ordinal())) {
+	//			try {
+	//				this.wait();
+	//			} catch (InterruptedException e) {
+	//			}
+	//		}
+	//		if (runnable != null) {
+	//			runnable.run();
+	//		}
+
+	//	}
+
+	//	@Override
+	//	public boolean isActive() {
+	//		return dispatcher.isActive();
+	//	}
+
+	//	@Override
+	//	public synchronized void dispatch(RunAt<? extends C> runnable) {
+	//		this.runnable = runnable;
+	//		this.notifyAll();
+	//	}
 
 	// }
@@ -284,3 +295,14 @@
 	}
 
+	public static <C> void dispatchLog(final Dispatcher<C> dispatcher, final Logger logger, final Level level, final Object text) {
+		dispatcher.dispatch(new RunAt<C>(ThrowExceptionHandler.getInstance()) {
+
+			@Override
+			protected void runAt() {
+				logger.log(level, "message dispatched into {}: {}", dispatcher, text);
+			}
+		});
+
+	}
+
 }
