diff --git a/scapy/scapypipes.py b/scapy/scapypipes.py
index c4685d5c6e01d72ef8e610350255daf8d42e60f3..5664f19dd40e046448d7a8af3faefdcc8985febf 100644
--- a/scapy/scapypipes.py
+++ b/scapy/scapypipes.py
@@ -196,3 +196,41 @@ class TCPListenPipe(TCPConnectPipe):
             self.fd.close()
             self.fd = fd
             self.connected = True
+
+class TriggeredMessage(Drain):
+    """Send a preloaded message when triggered and trigger in chain
+     +------^------+
+  >>-|      | /----|->>
+     |      |/     |
+   >-|-[ message ]-|->
+     +------^------+
+"""
+    def __init__(self, msg, name=None):
+        Drain.__init__(self, name=name)
+        self.msg = msg
+    def on_trigger(self, trigmsg):
+        self._send(self.msg)
+        self._high_send(self.msg)
+        self._trigger(trigmsg)
+
+class TriggerDrain(Drain):
+    """Pass messages and trigger when a condition is met
+     +------^------+
+  >>-|-[condition]-|->>
+     |      |      |
+   >-|-[condition]-|->
+     +-------------+
+"""
+    def __init__(self, f, name=None):
+        Drain.__init__(self, name=name)
+        self.f = f
+    def push(self, msg):
+        v = self.f(msg)
+        if v:
+            self._trigger(v)
+        self._send(msg)
+    def high_push(self, msg):
+        v = self.f(msg)
+        if v:
+            self._trigger(v)
+        self._high_send(msg)