diff --git a/scapy/scapypipes.py b/scapy/scapypipes.py
index 4f882d287810bfa124acd5e99923271646df2d8a..fcc1d772a89776a669ccc55dda541650007c307e 100644
--- a/scapy/scapypipes.py
+++ b/scapy/scapypipes.py
@@ -235,3 +235,62 @@ class TriggerDrain(Drain):
         if v:
             self._trigger(v)
         self._high_send(msg)
+
+class TriggeredValve(Drain):
+    """Let messages alternatively pass or not, changing on trigger
+     +------^------+
+  >>-|-[pass/stop]-|->>
+     |      |      |
+   >-|-[pass/stop]-|->
+     +------^------+
+"""
+    def __init__(self, start_state=True, name=None):
+        Drain.__init__(self, name=name)
+        self.opened = start_state
+    def push(self, msg):
+        if self.opened:
+            self._send(msg)
+    def high_push(self, msg):
+        if self.opened:
+            self._send(msg)
+    def on_trigger(self, msg):
+        self.opened ^= True
+        self._trigger(msg)
+
+class TriggeredQueueingValve(Drain):
+    """Let messages alternatively pass or queued, changing on trigger
+     +------^-------+
+  >>-|-[pass/queue]-|->>
+     |      |       |
+   >-|-[pass/queue]-|->
+     +------^-------+
+"""
+    def __init__(self, start_state=True, name=None):
+        Drain.__init__(self, name=name)
+        self.opened = start_state
+        self.q = Queue.Queue()
+    def start(self):
+        self.q = Queue.Queue()
+    def push(self, msg):
+        if self.opened:
+            self._send(msg)
+        else:
+            self.q.put((True,msg))
+    def high_push(self, msg):
+        if self.opened:
+            self._send(msg)
+        else:
+            self.hq.put((False,msg))
+    def on_trigger(self, msg):
+        self.opened ^= True
+        self._trigger(msg)
+        while True:
+            try:
+                low,msg = self.q.get(block=False)
+            except Queue.Empty:
+                break
+            else:
+                if low:
+                    self._send(msg)
+                else:
+                    self._high_send(msg)