diff --git a/scapy/pipetool.py b/scapy/pipetool.py
index b50ef01ad911e5d9c96532165b8f368ba844ea7f..e13ed09cbd07a7ed59812d172775100cb6a7ff87 100644
--- a/scapy/pipetool.py
+++ b/scapy/pipetool.py
@@ -166,10 +166,15 @@ class PipeEngine:
             for q in p.sinks:
                 g.append('\t"%i" -> "%i";' % (id(p), id(q)))
         g.append("")
-        g.append("\tedge [color=red, arrowhead=veevee];")
+        g.append("\tedge [color=purple, arrowhead=veevee];")
         for p in self.active_pipes:
             for q in p.high_sinks:
-                g.append('\t"%i" -> "%i" [color="red"];' % (id(p), id(q)))
+                g.append('\t"%i" -> "%i";' % (id(p), id(q)))
+        g.append("")
+        g.append("\tedge [color=red, arrowhead=diamond];")
+        for p in self.active_pipes:
+            for q in p.trigger_sinks:
+                g.append('\t"%i" -> "%i";' % (id(p), id(q)))
         g.append('}')
         graph = "\n".join(g)
         scapy.utils.do_graph(graph, **kargs) 
@@ -181,6 +186,8 @@ class _ConnectorLogic(object):
         self.sinks = set()
         self.high_sources = set()
         self.high_sinks = set()
+        self.trigger_sources = set()
+        self.trigger_sinks = set()
 
     def __lt__(self, other):
         other.sinks.add(self)
@@ -208,6 +215,10 @@ class _ConnectorLogic(object):
         other >> self
         return other
 
+    def __xor__(self, other):
+        self.trigger_sinks.add(other)
+        other.trigger_sources.add(self)
+        return other
 
 class Pipe(_ConnectorLogic):
     class __metaclass__(type):
@@ -226,6 +237,9 @@ class Pipe(_ConnectorLogic):
     def _high_send(self, msg):
         for s in self.high_sinks:
             s.high_push(msg)
+    def _trigger(self, msg):
+        for s in self.trigger_sinks:
+            s.on_trigger(msg)
 
     def __repr__(self):
         ct = conf.color_theme
@@ -252,6 +266,17 @@ class Pipe(_ConnectorLogic):
                              ct.punct(",").join(ct.field_name(s.name) for s in self.high_sinks))
             s += ct.punct("]")
 
+        if self.trigger_sources or self.trigger_sinks:
+            s+= " %s" % ct.punct("[")
+            if self.trigger_sources:
+                s+="%s%s" %  (ct.punct(",").join(ct.field_name(s.name) for s in self.trigger_sources),
+                              ct.field_value("^"))
+            s += ct.layer_name("#")
+            if self.trigger_sinks:
+                s+="%s%s" % (ct.field_value("^"),
+                             ct.punct(",").join(ct.field_name(s.name) for s in self.trigger_sinks))
+            s += ct.punct("]")
+
 
         s += ct.punct(">")
         return s