diff --git a/caplets/local-sniffer.cap b/caplets/local-sniffer.cap
index feb49537..e3103d0a 100644
--- a/caplets/local-sniffer.cap
+++ b/caplets/local-sniffer.cap
@@ -1,7 +1,7 @@
 events.stream off
 events.clear
-set events.stream.filter net.sniff
-events.stream on
+# set events.stream.filter net.sniff
+# events.stream on
 
 set net.sniff.verbose false
 set net.sniff.local true
diff --git a/modules/net_sniff_dns.go b/modules/net_sniff_dns.go
index bda356c1..a73054dc 100644
--- a/modules/net_sniff_dns.go
+++ b/modules/net_sniff_dns.go
@@ -34,14 +34,23 @@ func dnsParser(ip *layers.IPv4, pkt gopacket.Packet, udp *layers.UDP) bool {
 	}
 
 	for hostname, ips := range m {
-		SniffPrinter("[%s] %s %s > %s : %s is %s\n",
+		NewSnifferEvent(
+			pkt.Metadata().Timestamp,
+			"dns",
+			ip.SrcIP.String(),
+			ip.DstIP.String(),
+			SniffData{
+				"Hostname":  hostname,
+				"Addresses": ips,
+			},
+			"[%s] %s %s > %s : %s is %s",
 			vTime(pkt.Metadata().Timestamp),
 			core.W(core.BG_DGRAY+core.FG_WHITE, "dns"),
 			vIP(ip.SrcIP),
 			vIP(ip.DstIP),
 			core.Yellow(hostname),
 			core.Dim(strings.Join(ips, ", ")),
-		)
+		).Push()
 	}
 
 	return true
diff --git a/modules/net_sniff_event.go b/modules/net_sniff_event.go
new file mode 100644
index 00000000..2b37276d
--- /dev/null
+++ b/modules/net_sniff_event.go
@@ -0,0 +1,36 @@
+package modules
+
+import (
+	"fmt"
+	"time"
+
+	"github.com/evilsocket/bettercap-ng/session"
+)
+
+type SniffData map[string]interface{}
+
+type SnifferEvent struct {
+	PacketTime  time.Time
+	Protocol    string
+	Source      string
+	Destination string
+	Data        SniffData
+	Message     string
+}
+
+func NewSnifferEvent(t time.Time, proto string, src string, dst string, data SniffData, format string, args ...interface{}) SnifferEvent {
+	return SnifferEvent{
+		PacketTime:  t,
+		Protocol:    proto,
+		Source:      src,
+		Destination: dst,
+		Data:        data,
+		Message:     fmt.Sprintf(format, args...),
+	}
+}
+
+func (e SnifferEvent) Push() {
+	fmt.Printf("%s\n", e.Message)
+	session.I.Events.Add("net.sniff.leak."+e.Protocol, e.Data)
+	session.I.Input.Refresh()
+}
diff --git a/modules/net_sniff_http.go b/modules/net_sniff_http.go
index 092c654a..fdf97d1a 100644
--- a/modules/net_sniff_http.go
+++ b/modules/net_sniff_http.go
@@ -26,25 +26,40 @@ func httpParser(ip *layers.IPv4, pkt gopacket.Packet, tcp *layers.TCP) bool {
 		return false
 	}
 
+	method := string(m[1])
+	hostname := string(m[2])
+	path := string(m[3])
 	ua := ""
 	mu := uaRe.FindSubmatch(data)
 	if len(mu) == 2 {
 		ua = string(mu[1])
 	}
 
-	url := fmt.Sprintf("%s", core.Yellow(string(m[3])))
+	url := fmt.Sprintf("%s", core.Yellow(path))
 	if tcp.DstPort != 80 {
 		url += fmt.Sprintf(":%s", vPort(tcp.DstPort))
 	}
-	url += fmt.Sprintf("%s", string(m[2]))
+	url += fmt.Sprintf("%s", hostname)
 
-	SniffPrinter("[%s] %s %s %s %s %s\n",
+	NewSnifferEvent(
+		pkt.Metadata().Timestamp,
+		"http",
+		ip.SrcIP.String(),
+		hostname,
+		SniffData{
+			"Method":   method,
+			"Hostname": hostname,
+			"URL":      url,
+			"UA":       ua,
+		},
+		"[%s] %s %s %s %s %s",
 		vTime(pkt.Metadata().Timestamp),
 		core.W(core.BG_RED+core.FG_BLACK, "http"),
 		vIP(ip.SrcIP),
-		core.W(core.BG_LBLUE+core.FG_BLACK, vURL(string(m[1]))),
+		core.W(core.BG_LBLUE+core.FG_BLACK, method),
 		vURL(url),
-		core.Dim(ua))
+		core.Dim(ua),
+	).Push()
 
 	return true
 }
diff --git a/modules/net_sniff_parsers.go b/modules/net_sniff_parsers.go
index f1bcfcf1..6a4b88a0 100644
--- a/modules/net_sniff_parsers.go
+++ b/modules/net_sniff_parsers.go
@@ -5,20 +5,11 @@ import (
 
 	"github.com/evilsocket/bettercap-ng/core"
 	"github.com/evilsocket/bettercap-ng/log"
-	"github.com/evilsocket/bettercap-ng/session"
 
 	"github.com/google/gopacket"
 	"github.com/google/gopacket/layers"
 )
 
-type SniffPrinterType func(format string, args ...interface{}) (int, error)
-
-var SniffPrinter = SniffPrinterType(func(format string, args ...interface{}) (n int, e error) {
-	n, e = fmt.Printf(format, args...)
-	session.I.Input.Refresh()
-	return
-})
-
 func tcpParser(ip *layers.IPv4, pkt gopacket.Packet, verbose bool) {
 	tcp := pkt.Layer(layers.LayerTypeTCP).(*layers.TCP)
 
@@ -29,14 +20,23 @@ func tcpParser(ip *layers.IPv4, pkt gopacket.Packet, verbose bool) {
 	}
 
 	if verbose == true {
-		SniffPrinter("[%s] %s %s:%s > %s:%s %s\n",
+		NewSnifferEvent(
+			pkt.Metadata().Timestamp,
+			"tcp",
+			fmt.Sprintf("%s:%s", ip.SrcIP, vPort(tcp.SrcPort)),
+			fmt.Sprintf("%s:%s", ip.DstIP, vPort(tcp.DstPort)),
+			SniffData{
+				"Size": len(ip.Payload),
+			},
+			"[%s] %s %s:%s > %s:%s %s",
 			vTime(pkt.Metadata().Timestamp),
 			core.W(core.BG_LBLUE+core.FG_BLACK, "tcp"),
 			vIP(ip.SrcIP),
 			vPort(tcp.SrcPort),
 			vIP(ip.DstIP),
 			vPort(tcp.DstPort),
-			core.Dim(fmt.Sprintf("%d bytes", len(ip.Payload))))
+			core.Dim(fmt.Sprintf("%d bytes", len(ip.Payload))),
+		).Push()
 	}
 }
 
@@ -48,25 +48,43 @@ func udpParser(ip *layers.IPv4, pkt gopacket.Packet, verbose bool) {
 	}
 
 	if verbose == true {
-		SniffPrinter("[%s] %s %s:%s > %s:%s %s\n",
+		NewSnifferEvent(
+			pkt.Metadata().Timestamp,
+			"udp",
+			fmt.Sprintf("%s:%s", ip.SrcIP, vPort(udp.SrcPort)),
+			fmt.Sprintf("%s:%s", ip.DstIP, vPort(udp.DstPort)),
+			SniffData{
+				"Size": len(ip.Payload),
+			},
+			"[%s] %s %s:%s > %s:%s %s",
 			vTime(pkt.Metadata().Timestamp),
 			core.W(core.BG_DGRAY+core.FG_WHITE, "udp"),
 			vIP(ip.SrcIP),
 			vPort(udp.SrcPort),
 			vIP(ip.DstIP),
 			vPort(udp.DstPort),
-			core.Dim(fmt.Sprintf("%d bytes", len(ip.Payload))))
+			core.Dim(fmt.Sprintf("%d bytes", len(ip.Payload))),
+		).Push()
 	}
 }
 
 func unkParser(ip *layers.IPv4, pkt gopacket.Packet, verbose bool) {
 	if verbose == true {
-		SniffPrinter("[%s] [%s] %s > %s (%d bytes)\n",
-			vTime(pkt.Metadata().Timestamp),
-			pkt.TransportLayer().LayerType(),
+		NewSnifferEvent(
+			pkt.Metadata().Timestamp,
+			pkt.TransportLayer().LayerType().String(),
 			vIP(ip.SrcIP),
 			vIP(ip.DstIP),
-			len(ip.Payload))
+			SniffData{
+				"Size": len(ip.Payload),
+			},
+			"[%s] %s %s > %s %s",
+			vTime(pkt.Metadata().Timestamp),
+			core.W(core.BG_DGRAY+core.FG_WHITE, pkt.TransportLayer().LayerType().String()),
+			vIP(ip.SrcIP),
+			vIP(ip.DstIP),
+			core.Dim(fmt.Sprintf("%d bytes", len(ip.Payload))),
+		).Push()
 	}
 }
 
diff --git a/modules/net_sniff_sni.go b/modules/net_sniff_sni.go
index b6e7612b..935b51ec 100644
--- a/modules/net_sniff_sni.go
+++ b/modules/net_sniff_sni.go
@@ -31,11 +31,20 @@ func sniParser(ip *layers.IPv4, pkt gopacket.Packet, tcp *layers.TCP) bool {
 		domain = fmt.Sprintf("%s:%d", domain, tcp.DstPort)
 	}
 
-	SniffPrinter("[%s] %s %s > %s\n",
+	NewSnifferEvent(
+		pkt.Metadata().Timestamp,
+		"sni",
+		ip.SrcIP.String(),
+		domain,
+		SniffData{
+			"Domain": domain,
+		},
+		"[%s] %s %s > %s",
 		vTime(pkt.Metadata().Timestamp),
 		core.W(core.BG_YELLOW+core.FG_WHITE, "sni"),
 		vIP(ip.SrcIP),
-		core.Yellow("https://"+domain))
+		core.Yellow("https://"+domain),
+	).Push()
 
 	return true
 }