diff --git a/Makefile b/Makefile
index a93bf5ea4309e084275efc43116056d77243b3af..696fcea1228753575fafcf5625de456374b9704a 100644
--- a/Makefile
+++ b/Makefile
@@ -13,7 +13,7 @@ icon:
 	make -C icon
 
 get_deps:
-	 sudo apt install libzmq3-dev libgtk-3-dev libappindicator3-dev golang pkg-config
+	 sudo apt install libgtk-3-dev libappindicator3-dev golang pkg-config
 
 
 LANGS ?= $(foreach path,$(wildcard locales/*/messages.gotext.json),$(patsubst locales/%/messages.gotext.json,%,$(path)))
diff --git a/README.md b/README.md
index f0e55c5adb041337e834aec6985050d338425a2d..e0f3d1744bfd680efc521b2912979bb95c4967ae 100644
--- a/README.md
+++ b/README.md
@@ -3,7 +3,7 @@ Install it
 
 Install dependencies:
 ```
-  # apt install libzmq3-dev libgtk-3-dev libappindicator3-dev golang pkg-config
+  # apt install libgtk-3-dev libappindicator3-dev golang pkg-config
 ```
 
 Build the systray:
diff --git a/bitmask/darwin.go b/bitmask/darwin.go
index f4250780113b11dfb8b9670c68483a18e346baf6..b71271e51a124abfd97564076681f02b679d1b92 100644
--- a/bitmask/darwin.go
+++ b/bitmask/darwin.go
@@ -18,14 +18,6 @@ package bitmask
 
 import (
 	"os"
-
-	"github.com/pebbe/zmq4"
 )
 
-const coreEndpoint = "ipc:///var/tmp/bitmask.core.sock"
-
 var ConfigPath = os.Getenv("HOME") + "/Library/Preferences/leap"
-
-func hasCurve() bool {
-	return zmq4.HasCurve()
-}
diff --git a/bitmask/events.go b/bitmask/events.go
index f8b3725c7d600a52f617dd3ba3e8544a3ee3832d..e97804c6241e9ba317bb3ae784796f5c4be2ea01 100644
--- a/bitmask/events.go
+++ b/bitmask/events.go
@@ -16,63 +16,27 @@
 package bitmask
 
 import (
-	"io/ioutil"
 	"log"
-	"path/filepath"
-	"strings"
-
-	"github.com/pebbe/zmq4"
+	"net/http"
 )
 
 const (
-	eventsEndpoint = "tcp://127.0.0.1:9001"
-	statusEvent    = "VPN_STATUS_CHANGED"
+	statusEvent = "VPN_STATUS_CHANGED"
 )
 
-func initEvents() (*zmq4.Socket, error) {
-	socket, err := zmq4.NewSocket(zmq4.SUB)
-	if err != nil {
-		return nil, err
-	}
-
-	if hasCurve() {
-		err = initCurve(socket)
-		if err != nil {
-			return nil, err
-		}
-	}
-
-	err = socket.Connect(eventsEndpoint)
-	if err != nil {
-		return nil, err
-	}
-
-	err = socket.SetSubscribe(statusEvent)
-	return socket, err
-}
-
-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() {
+	b.send("events", "register", statusEvent)
+	client := &http.Client{
+		Timeout: 0,
+	}
 	for {
-		msg, err := b.eventsoc.RecvMessage(0)
-		if err != nil {
-			break
+		resJSON, err := send(b.apiToken, client, "events", "poll")
+		res, ok := resJSON.([]interface{})
+		if err != nil || !ok || len(res) < 1 {
+			continue
 		}
-		if msg[0][:len(statusEvent)] != statusEvent {
+		event, ok := res[0].(string)
+		if !ok || event != statusEvent {
 			continue
 		}
 
@@ -84,7 +48,3 @@ func (b *Bitmask) eventsHandler() {
 		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 a044c580113c45610392a0420f15e4e39ed7c6dd..e303adbff3838a2c37e2f0cae00c3ac433084294 100644
--- a/bitmask/main.go
+++ b/bitmask/main.go
@@ -16,40 +16,41 @@
 package bitmask
 
 import (
+	"bytes"
 	"encoding/json"
 	"errors"
+	"io/ioutil"
 	"log"
+	"net/http"
+	"path"
 	"time"
-
-	"github.com/pebbe/zmq4"
 )
 
 const (
-	timeout = time.Second * 15
+	timeout    = time.Second * 15
+	url        = "http://localhost:7070/API/"
+	headerAuth = "X-Bitmask-Auth"
 )
 
 // Bitmask holds the bitmask client data
 type Bitmask struct {
-	coresoc  *zmq4.Socket
-	eventsoc *zmq4.Socket
+	client   *http.Client
+	apiToken string
 	statusCh chan string
 }
 
 // Init the connection to bitmask
 func Init() (*Bitmask, error) {
 	statusCh := make(chan string)
-	coresoc, err := initCore()
-	if err != nil {
-		return nil, err
+	client := &http.Client{
+		Timeout: timeout,
 	}
-	eventsoc, err := initEvents()
+	apiToken, err := getToken()
 	if err != nil {
 		return nil, err
 	}
 
-	coresoc.SetRcvtimeo(timeout)
-
-	b := Bitmask{coresoc, eventsoc, statusCh}
+	b := Bitmask{client, apiToken, statusCh}
 	go b.eventsHandler()
 	return &b, nil
 }
@@ -65,24 +66,48 @@ func (b *Bitmask) Close() {
 	if err != nil {
 		log.Printf("Got an error stopping bitmaskd: %v", err)
 	}
-	b.coresoc.Close()
 }
 
 func (b *Bitmask) send(parts ...interface{}) (map[string]interface{}, error) {
-	_, err := b.coresoc.SendMessage(parts...)
+	resJSON, err := send(b.apiToken, b.client, parts...)
+	if err != nil {
+		return nil, err
+	}
+	result, ok := resJSON.(map[string]interface{})
+	if !ok {
+		return nil, errors.New("Not valid response")
+	}
+	return result, nil
+}
+
+func send(apiToken string, client *http.Client, parts ...interface{}) (interface{}, error) {
+	apiSection, _ := parts[0].(string)
+	reqBody, err := json.Marshal(parts[1:])
+	if err != nil {
+		return nil, err
+	}
+	req, err := http.NewRequest("POST", url+apiSection, bytes.NewReader(reqBody))
 	if err != nil {
 		return nil, err
 	}
-	resJSON, err := b.coresoc.RecvBytes(0)
+	req.Header.Add(headerAuth, apiToken)
+
+	resp, err := client.Do(req)
+	if err != nil {
+		return nil, err
+	}
+	defer resp.Body.Close()
+
+	resJSON, err := ioutil.ReadAll(resp.Body)
 	if err != nil {
 		return nil, err
 	}
 	return parseResponse(resJSON)
 }
 
-func parseResponse(resJSON []byte) (map[string]interface{}, error) {
+func parseResponse(resJSON []byte) (interface{}, error) {
 	var response struct {
-		Result map[string]interface{}
+		Result interface{}
 		Error  string
 	}
 	err := json.Unmarshal(resJSON, &response)
@@ -92,12 +117,8 @@ func parseResponse(resJSON []byte) (map[string]interface{}, error) {
 	return response.Result, err
 }
 
-func initCore() (*zmq4.Socket, error) {
-	socket, err := zmq4.NewSocket(zmq4.REQ)
-	if err != nil {
-		return nil, err
-	}
-
-	err = socket.Connect(coreEndpoint)
-	return socket, err
+func getToken() (string, error) {
+	path := path.Join(ConfigPath, "authtoken")
+	b, err := ioutil.ReadFile(path)
+	return string(b), err
 }
diff --git a/bitmask/unix.go b/bitmask/unix.go
index 321f1c0bae4a2bdc2e830690d62d561e52ae6d05..d276556c6aa63f21059c66adf325dfaac4f7a7f9 100644
--- a/bitmask/unix.go
+++ b/bitmask/unix.go
@@ -18,14 +18,6 @@ package bitmask
 
 import (
 	"os"
-
-	"github.com/pebbe/zmq4"
 )
 
-const coreEndpoint = "ipc:///var/tmp/bitmask.core.sock"
-
 var ConfigPath = os.Getenv("HOME") + "/.config/leap"
-
-func hasCurve() bool {
-	return zmq4.HasCurve()
-}
diff --git a/bitmask/windows.go b/bitmask/windows.go
index de7ece06bb73507b24a72f3ca46e1f65515bca7b..221d75b8d27238db4afa86118a9f255fa78ce8ff 100644
--- a/bitmask/windows.go
+++ b/bitmask/windows.go
@@ -18,10 +18,4 @@ package bitmask
 
 import "os"
 
-const coreEndpoint = "tcp://127.0.0.1:5001"
-
 var ConfigPath = os.Getenv("LOCALAPPDATA") + "\\leap"
-
-func hasCurve() bool {
-	return false
-}