diff --git a/src/main/java/teetime/framework/AbstractInterThreadPipe.java b/src/main/java/teetime/framework/AbstractInterThreadPipe.java
index 5b11b35fd6ef1cab297780ede1512a526a0dc58b..d359cf921e5c73cb5a704666ee2e81eeda5c0889 100644
--- a/src/main/java/teetime/framework/AbstractInterThreadPipe.java
+++ b/src/main/java/teetime/framework/AbstractInterThreadPipe.java
@@ -7,11 +7,14 @@ import org.jctools.queues.QueueFactory;
 import org.jctools.queues.spec.ConcurrentQueueSpec;
 import org.jctools.queues.spec.Ordering;
 import org.jctools.queues.spec.Preference;
+import org.slf4j.LoggerFactory;
 
 import teetime.framework.signal.ISignal;
 
 public abstract class AbstractInterThreadPipe extends AbstractPipe {
 
+	private static final org.slf4j.Logger LOGGER = LoggerFactory.getLogger(AbstractInterThreadPipe.class);
+
 	private final Queue<ISignal> signalQueue = QueueFactory.newQueue(new ConcurrentQueueSpec(1, 1, 0, Ordering.FIFO, Preference.THROUGHPUT));
 
 	protected <T> AbstractInterThreadPipe(final OutputPort<? extends T> sourcePort, final InputPort<T> targetPort) {
@@ -24,7 +27,7 @@ public abstract class AbstractInterThreadPipe extends AbstractPipe {
 
 		Thread owningThread = cachedTargetStage.getOwningThread();
 		if (owningThread == null) {
-			System.err.println("cachedTargetStage: " + cachedTargetStage);
+			LOGGER.warn("owningThread of " + cachedTargetStage + " is null.");
 		}
 		if (null != owningThread && isThreadWaiting(owningThread)) { // FIXME remove the null check for performance
 			owningThread.interrupt();