diff --git a/Makefile b/Makefile
index 2eb5264..be6c7ea 100644
--- a/Makefile
+++ b/Makefile
@@ -16,7 +16,6 @@ lint:
 		--enable=deadcode \
 		--enable=ineffassign \
 		--enable=dupl \
-		--enable=gotype \
 		--enable=varcheck \
 		--enable=interfacer \
 		--enable=goconst \
@@ -27,6 +26,8 @@ lint:
 		--enable=goimports \
 		./...
 
+		#--enable=gotype \
+
 fmt:
 	go fmt ./...
 
diff --git a/pkg/controllers/controllers.go b/pkg/controllers/controllers.go
index ce3e6c4..705c527 100644
--- a/pkg/controllers/controllers.go
+++ b/pkg/controllers/controllers.go
@@ -21,24 +21,16 @@ var (
 	maxProcessRetry = 6
 )
 
-// Controller are started in a persistent goroutine a program launch,
+// Controller are started in a persistent goroutine at program launch,
 // and are responsible for watching resources and calling notifiers.
 type Controller interface {
 	Start(wg *sync.WaitGroup)
 	Stop()
-	Init(c *config.KdnConfig) Controller
+	Init(c *config.KdnConfig, n notifiers.Notifier) Controller
 }
 
-// CommonController groups fields and funcs that most controllers would like
-// to implement (at least, controllers in the Kubernetes' client-go sense),
-// maybe by embedding (https://golang.org/doc/effective_go.html#embedding).
-// For example with:
-//  import "github.com/bpineau/kube-deployments-notifier/pkg/controllers"
-//  type MyThing struct {
-//      controllers.CommonController
-//  }
-// You would benefit for the common "Controller" interface implementation,
-// except for Init() that you need to implement.
+// CommonController groups fields and funcs that most controllers would
+// like to implement (controllers in the Kubernetes' client-go sense).
 type CommonController struct {
 	Conf      *config.KdnConfig
 	Queue     workqueue.RateLimitingInterface
@@ -47,6 +39,7 @@ type CommonController struct {
 	ListWatch cache.ListerWatcher
 	ObjType   runtime.Object
 	StopCh    chan struct{}
+	Notifiers notifiers.Notifier
 	wg        *sync.WaitGroup
 }
 
@@ -164,11 +157,11 @@ func (c *CommonController) processItem(key string) error {
 	jobj := fmt.Sprintf("%s", res)
 
 	if !exists {
-		notifiers.Deleted(c.Conf, jobj)
-		return nil
+		c.Notifiers.Deleted(c.Conf, jobj)
+		return nil // XXX
 	}
 
-	notifiers.Changed(c.Conf, jobj)
+	c.Notifiers.Changed(c.Conf, jobj)
 
-	return nil
+	return nil // XXX
 }
diff --git a/pkg/controllers/deployment/deployment.go b/pkg/controllers/deployment/deployment.go
index ada55c0..eb5f473 100644
--- a/pkg/controllers/deployment/deployment.go
+++ b/pkg/controllers/deployment/deployment.go
@@ -2,6 +2,7 @@ package deployment
 
 import (
 	"github.com/bpineau/kube-deployments-notifier/config"
+	"github.com/bpineau/kube-deployments-notifier/pkg/notifiers"
 	"github.com/bpineau/kube-deployments-notifier/pkg/controllers"
 
 	meta_v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
@@ -18,10 +19,11 @@ type Controller struct {
 }
 
 // Init initialize deployment controller
-func (c *Controller) Init(conf *config.KdnConfig) controllers.Controller {
+func (c *Controller) Init(conf *config.KdnConfig, n notifiers.Notifier) controllers.Controller {
 	c.CommonController = controllers.CommonController{
 		Conf: conf,
 		Name: "deployment",
+		Notifiers: n,
 	}
 
 	client := c.Conf.ClientSet
diff --git a/pkg/notifiers/notifiers.go b/pkg/notifiers/notifiers.go
index 16c6c89..941eb46 100644
--- a/pkg/notifiers/notifiers.go
+++ b/pkg/notifiers/notifiers.go
@@ -14,38 +14,50 @@ type Notifier interface {
 	Deleted(c *config.KdnConfig, msg string) error
 }
 
-// Notifiers maps all known notifiers
+// Notifiers maps all effective notifiers
 var Notifiers = []Notifier{
 	&log.Notifier{},
 	&http.Notifier{},
 }
 
+// Composite combine and chain several notifiers
+type Composite struct {
+	Notifiers []Notifier
+}
+
+// Init initialize a Composite structure
+func Init(notifiers []Notifier) *Composite {
+	return &Composite{Notifiers: notifiers}
+}
+
 // Changed send creation/change events to the notifiers
-func Changed(c *config.KdnConfig, msg string) {
+func (n *Composite) Changed(c *config.KdnConfig, msg string) error {
 	if c.DryRun {
 		fmt.Printf("Changed: %s\n", msg)
-		return
+		return nil
 	}
 
-	for _, notifier := range Notifiers {
+	for _, notifier := range n.Notifiers {
 		err := notifier.Changed(c, msg)
 		if err != nil {
 			c.Logger.Warningf("Failed to notify: %s", err)
 		}
 	}
+	return nil // XXX
 }
 
 // Deleted send deletion events to the notifiers
-func Deleted(c *config.KdnConfig, msg string) {
+func (n *Composite) Deleted(c *config.KdnConfig, msg string) error {
 	if c.DryRun {
 		fmt.Printf("Deleted: %s\n", msg)
-		return
+		return nil
 	}
 
-	for _, notifier := range Notifiers {
+	for _, notifier := range n.Notifiers {
 		err := notifier.Deleted(c, msg)
 		if err != nil {
 			c.Logger.Warningf("Failed to notify: %s", err)
 		}
 	}
+	return nil // XXX
 }
diff --git a/pkg/run/run.go b/pkg/run/run.go
index 25c7a54..3447420 100644
--- a/pkg/run/run.go
+++ b/pkg/run/run.go
@@ -7,6 +7,7 @@ import (
 	"syscall"
 
 	"github.com/bpineau/kube-deployments-notifier/config"
+	"github.com/bpineau/kube-deployments-notifier/pkg/notifiers"
 	"github.com/bpineau/kube-deployments-notifier/pkg/controllers"
 	"github.com/bpineau/kube-deployments-notifier/pkg/controllers/deployment"
 	"github.com/bpineau/kube-deployments-notifier/pkg/health"
@@ -22,8 +23,10 @@ func Run(config *config.KdnConfig) {
 	wg.Add(len(conts))
 	defer wg.Wait()
 
+	notifiers := notifiers.Init(notifiers.Notifiers)
+
 	for _, c := range conts {
-		go c.Init(config).Start(&wg)
+		go c.Init(config, notifiers).Start(&wg)
 		defer func(c controllers.Controller) {
 			go c.Stop()
 		}(c)
