diff --git a/bitmask/darwin.go b/bitmask/darwin.go
new file mode 100644
index 0000000000000000000000000000000000000000..f3e92247c27761d37e859c3bbc3ac11a60d090f5
--- /dev/null
+++ b/bitmask/darwin.go
@@ -0,0 +1,7 @@
+// +build darwin
+
+package bitmask
+
+import "os"
+
+var configPath = os.Getenv("HOME") + "/Library/Preferences/leap"
diff --git a/bitmask/events.go b/bitmask/events.go
index 3fed26a36bb8e10ca726f5ae77d9d9846f4d4115..8645519b154ba9cd2a5e75840fd485d169232ea2 100644
--- a/bitmask/events.go
+++ b/bitmask/events.go
@@ -1,12 +1,17 @@
 package bitmask
 
 import (
+	"io/ioutil"
+	"log"
+	"path/filepath"
+	"strings"
+
 	"github.com/pebbe/zmq4"
 )
 
 const (
 	eventsEndpoint = "tcp://127.0.0.1:9001"
-	//serverKeyPath  = "/home/user/.config/leap/events/zmq_certificates/public_keys/server.key" // FIXME
+	statusEvent    = "VPN_STATUS_CHANGED"
 )
 
 func initEvents() (*zmq4.Socket, error) {
@@ -16,20 +21,47 @@ func initEvents() (*zmq4.Socket, error) {
 	}
 
 	if zmq4.HasCurve() {
-		// TODO
+		err = initCurve(socket)
+		if err != nil {
+			return nil, err
+		}
 	}
 
 	err = socket.Connect(eventsEndpoint)
 	if err != nil {
 		return nil, err
 	}
-	return socket, nil
+
+	err = socket.SetSubscribe(statusEvent)
+	return socket, err
 }
 
-func (b *Bitmask) fetchStatus() {
-	// TODO: this should be a subscription to the event
+func initCurve(socket *zmq4.Socket) error {
+	serverKeyData, err := ioutil.ReadFile(getServerKeyPath())
+	if err != nil {
+		return err
+	}
+
+	pubkey, seckey, err := zmq4.NewCurveKeypair()
+	if err != nil {
+		return err
+	}
+
+	serverkey := strings.Split(string(serverKeyData), "\"")[1]
+	return socket.ClientAuthCurve(serverkey, pubkey, seckey)
+}
+
+func (b *Bitmask) eventsHandler() {
 	for {
-		time.Sleep(time.Second)
+		msg, err := b.eventsoc.RecvMessage(0)
+		if err != nil {
+			break
+		}
+		log.Println(msg[0])
+		if msg[0][:len(statusEvent)] != statusEvent {
+			continue
+		}
+
 		status, err := b.GetStatus()
 		if err != nil {
 			log.Printf("Error receiving status: %v", err)
@@ -38,3 +70,7 @@ func (b *Bitmask) fetchStatus() {
 		b.statusCh <- status
 	}
 }
+
+func getServerKeyPath() string {
+	return filepath.Join(configPath, "events", "zmq_certificates", "public_keys", "server.key")
+}
diff --git a/bitmask/main.go b/bitmask/main.go
index b4607b3d0716721008ce8014f42e05037024fd6c..a6452ca014c1fe13a480c7d51fcd3bb75e81c2c0 100644
--- a/bitmask/main.go
+++ b/bitmask/main.go
@@ -14,21 +14,25 @@ const (
 
 // Bitmask holds the bitmask client data
 type Bitmask struct {
-	//eventsoc *zmq4.Socket
 	coresoc  *zmq4.Socket
+	eventsoc *zmq4.Socket
 	statusCh chan string
 }
 
 // Init the connection to bitmask
 func Init() (*Bitmask, error) {
 	statusCh := make(chan string)
-	socket, err := initCore()
+	coresoc, err := initCore()
+	if err != nil {
+		return nil, err
+	}
+	eventsoc, err := initEvents()
 	if err != nil {
 		return nil, err
 	}
 
-	b := Bitmask{socket, statusCh}
-	go b.fetchStatus()
+	b := Bitmask{coresoc, eventsoc, statusCh}
+	go b.eventsHandler()
 	return &b, nil
 }
 
diff --git a/bitmask/unix.go b/bitmask/unix.go
new file mode 100644
index 0000000000000000000000000000000000000000..5b50f24c13d0cacb327b5639134b6de9897498a3
--- /dev/null
+++ b/bitmask/unix.go
@@ -0,0 +1,7 @@
+// +build !windows,!darwin
+
+package bitmask
+
+import "os"
+
+var configPath = os.Getenv("HOME") + "/.config/leap"
diff --git a/bitmask/vpn.go b/bitmask/vpn.go
index 025e2e36f66cf313d61785e788977201dc39dc28..9d12f85927c1efd3d89c391c03cb44fc67edd2c2 100644
--- a/bitmask/vpn.go
+++ b/bitmask/vpn.go
@@ -1,10 +1,5 @@
 package bitmask
 
-import (
-	"log"
-	"time"
-)
-
 // StartVPN for provider
 func (b *Bitmask) StartVPN(provider string) error {
 	_, err := b.send("vpn", "start", provider)
diff --git a/bitmask/windows.go b/bitmask/windows.go
new file mode 100644
index 0000000000000000000000000000000000000000..a574c9667841430119575d8230a1ec308aa3dc10
--- /dev/null
+++ b/bitmask/windows.go
@@ -0,0 +1,7 @@
+// +build windows
+
+package bitmask
+
+import "os"
+
+var configPath = os.Getenv("APPDATA") + "\\leap"