diff --git a/Makefile b/Makefile
index ce65db4827cf1beb4c0cc6952d3fa07d47d56d76..e1af715ffa8cc6317579dac5137995b0c6eab113 100644
--- a/Makefile
+++ b/Makefile
@@ -69,14 +69,9 @@ else
 	$(MAKE) _buildparts
 endif
 
-_buildparts: $(foreach path,$(wildcard cmd/*),build_$(patsubst cmd/%,%,$(path)))
 
-build_%:
-	@echo "PLATFORM: ${PLATFORM}"
-	@mkdir -p build/bin/${PLATFORM}
-	go build -tags $(TAGS) -ldflags "-s -w -X main.version=`git describe --tags` ${EXTRA_LDFLAGS}" -o build/bin/${PLATFORM}/$* ./cmd/$*
-	-@rm -rf build/${PROVIDER}/staging/${PLATFORM} && mkdir -p build/${PROVIDER}/staging/${PLATFORM}
-	-@ln -s ../../../bin/${PLATFORM}/$* build/${PROVIDER}/staging/${PLATFORM}/$*
+helper:
+	go build -ldflags "-X main.AppName=${PROVIDER}VPN -X main.Version=${VERSION}" cmd/bitmask-helper/main.go
 
 test:
 	@go test -tags "integration $(TAGS)" ./pkg/...
@@ -228,6 +223,13 @@ package_snap:
 package_deb:
 	@make -C build/${PROVIDER} pkg_deb
 
+installer_win:
+	cp qtbuild/release/bitmask.exe branding/qtinstaller/packages/root.win_x86_64/data/${PROVIDER}-vpn.exe
+	windeployqt --qmldir gui/qml branding/qtinstaller/packages/root.win_x86_64/data/${PROVIDER}-vpn.exe
+	"/c/Qt/QtIFW-3.2.2/bin/binarycreator.exe" -c ./branding/qtinstaller/config/config.xml -p ./branding/qtinstaller/packages build/${PROVIDER}-vpn-${VERSION}-installer.exe
+
+# FIXME --- old nsis installer. deprecate, but probably we need something similar to sign all the binaries (helper, main app, installer...)
+
 package_win_stage_1:
 	@make -C build/${PROVIDER} pkg_win_stage_1
 
diff --git a/bitmask.pro b/bitmask.pro
index db675ab111af049bebbe8e079b33398c99d7c494..7d4543a58f0f1ed544b1067713ba49dbc794d316 100644
--- a/bitmask.pro
+++ b/bitmask.pro
@@ -1,3 +1,4 @@
+#TARGET=bitmask
 #TARGET = $$BINARY_NAME
 
 CONFIG += qt staticlib
diff --git a/branding/qtinstaller/config/config.xml b/branding/qtinstaller/config/config.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4469d65a8a2cd4e033906c425d180e392c23ff14
--- /dev/null
+++ b/branding/qtinstaller/config/config.xml
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Installer>
+	<Name>DemoLibVPN</Name>
+	<Version>0.0.1</Version>
+	<Title>DemoLibVPN Installer</Title>
+	<Publisher>LEAP Encryption Access Project</Publisher>
+	<StartMenuDir>DemoLibVPN</StartMenuDir>
+	<TargetDir>@ApplicationsDir@/DemoLibVPN</TargetDir>
+</Installer>
diff --git a/branding/qtinstaller/packages/root.win_x86_64/.gitignore b/branding/qtinstaller/packages/root.win_x86_64/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..60baa9cb833f9e075739f327f4fe68477c84a093
--- /dev/null
+++ b/branding/qtinstaller/packages/root.win_x86_64/.gitignore
@@ -0,0 +1 @@
+data/*
diff --git a/branding/qtinstaller/packages/root.win_x86_64/meta/installscript.js b/branding/qtinstaller/packages/root.win_x86_64/meta/installscript.js
new file mode 100644
index 0000000000000000000000000000000000000000..691d1a4c0f28cb4ea9526fe81040a8b00b946159
--- /dev/null
+++ b/branding/qtinstaller/packages/root.win_x86_64/meta/installscript.js
@@ -0,0 +1,75 @@
+/*
+**
+** Copyright (C) 2020 LEAP Encryption Access Project.
+** 
+*/
+
+function cancelInstaller(message)
+{
+    installer.setDefaultPageVisible(QInstaller.Introduction, false);
+    installer.setDefaultPageVisible(QInstaller.TargetDirectory, false);
+    installer.setDefaultPageVisible(QInstaller.ComponentSelection, false);
+    installer.setDefaultPageVisible(QInstaller.ReadyForInstallation, false);
+    installer.setDefaultPageVisible(QInstaller.StartMenuSelection, false);
+    installer.setDefaultPageVisible(QInstaller.PerformInstallation, false);
+    installer.setDefaultPageVisible(QInstaller.LicenseCheck, false);
+
+    var abortText = "<font color='red'>" + message +"</font>";
+    installer.setValue("FinishedText", abortText);
+}
+function majorVersion(str)
+{
+    return parseInt(str.split(".", 1));
+}
+
+function Component()
+{
+    // Check whether OS is supported.
+    // start installer with -v to see debug output
+
+    console.log("OS: " + systemInfo.productType);
+    console.log("Kernel: " + systemInfo.kernelType + "/" + systemInfo.kernelVersion);
+
+    var validOs = false;
+
+    if (systemInfo.kernelType === "winnt") {
+        if (majorVersion(systemInfo.kernelVersion) >= 6)
+            validOs = true;
+    } else if (systemInfo.kernelType === "darwin") {
+        if (majorVersion(systemInfo.kernelVersion) >= 11)
+            validOs = true;
+    } else {
+        if (systemInfo.productType !== "ubuntu"
+                || systemInfo.productVersion !== "20.04") {
+            QMessageBox["warning"]("os.warning", "Installer",
+                                   "Note that the binaries are only tested on Ubuntu 20.04",
+                                   QMessageBox.Ok);
+        }
+        validOs = true;
+    }
+
+    if (!validOs) {
+        cancelInstaller("Installation on " + systemInfo.prettyProductName + " is not supported");
+        return;
+    }
+
+    console.log("CPU Architecture: " +  systemInfo.currentCpuArchitecture);
+
+    if ( systemInfo.kernelType === "winnt") {
+        installer.componentByName("root.win_x86_64").setValue("Default", "true");
+        installer.componentByName("root.win_x86_64").setValue("Virtual", "false");
+    }
+}
+
+Component.prototype.createOperations = function() 
+{
+	component.createOperations()
+	component.addElevatedOperation("Execute", "@TargetDir@/helper.exe", "install", "UNDOEXECUTE", "@TargetDir@/helper.exe", "remove");
+	component.addElevatedOperation("Execute", "@TargetDir@/helper.exe", "start", "UNDOEXECUTE", "@TargetDir@/helper.exe", "stop");
+        if (systemInfo.productType === "windows") {
+             console.log("Adding shortcut entries");
+             component.addElevatedOperation("Mkdir", "@StartMenuDir@");
+             component.addElevatedOperation("CreateShortcut", "@TargetDir@/demolib-vpn.exe", "@StartMenuDir@/DemoLibVPN.lnk", "workingDirectory=@TargetDir@", "iconPath=%SystemRoot%/system32/SHELL32.dll", "iconId=2", "description=Start DemoLibVPN");
+             component.addElevatedOperation("CreateShortcut", "@TargetDir@/maintenancetool.exe", "@StartMenuDir@/uninstall.lnk", "workingDirectory=@TargetDir@", "iconPath=%SystemRoot%/system32/SHELL32.dll", "iconId=2", "description=Uninstall application");
+        }
+}
diff --git a/branding/qtinstaller/packages/root.win_x86_64/meta/package.xml b/branding/qtinstaller/packages/root.win_x86_64/meta/package.xml
new file mode 100644
index 0000000000000000000000000000000000000000..11d630f104f9c86ba0afdd9ae7eaaaa21ee5d696
--- /dev/null
+++ b/branding/qtinstaller/packages/root.win_x86_64/meta/package.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Package>
+	<DisplayName>DemoLibVPN For Windows</DisplayName>
+	<Description>Install DemoLibVPN</Description>
+	<Version>0.0.1-1</Version>
+	<ReleaseDate>2020-09-15</ReleaseDate>
+	<Default>true</Default>
+	<RequiresAdminRights>true</RequiresAdminRights>
+	<Script>installscript.js</Script>
+</Package>
diff --git a/branding/qtinstaller/packages/root/meta/package.xml b/branding/qtinstaller/packages/root/meta/package.xml
new file mode 100644
index 0000000000000000000000000000000000000000..b4ca25e2e2eddf17c29c0ce88ea7c4873d6ccc3a
--- /dev/null
+++ b/branding/qtinstaller/packages/root/meta/package.xml
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<Package>
+	<DisplayName>DemoLibVPN</DisplayName>
+	<Version>0.0.1-1</Version>
+	<ReleaseDate>2020-09-15</ReleaseDate>
+	<Default>script</Default>
+</Package>
diff --git a/cmd/bitmask-helper/main.go b/cmd/bitmask-helper/main.go
index 4a627d94793f438d2b242414a1c591181cadbfd2..ec9868ef69eeb38971d6734c437a8cb03d3ca008 100644
--- a/cmd/bitmask-helper/main.go
+++ b/cmd/bitmask-helper/main.go
@@ -28,7 +28,10 @@ const (
 	logFile       = "helper.log"
 )
 
-var version string
+var (
+	Version string
+	AppName string
+)
 
 func main() {
 	logger, err := config.ConfigureLogger(path.Join(helper.LogFolder, logFile))
@@ -37,7 +40,8 @@ func main() {
 	} else {
 		defer logger.Close()
 	}
-	config.Version = version
+	helper.Version = Version
+	helper.AppName = AppName
 
 	// StartHelper is the main entry point - it also handles cli args in windows, and starts the http server.
 	helper.StartHelper(preferredPort)
diff --git a/gui/backend.go b/gui/backend.go
index e353a22e7f5b326c6566c99e7850715480130ab1..abacd852c3176b2ef314928ec4327e555c8a1a03 100644
--- a/gui/backend.go
+++ b/gui/backend.go
@@ -10,8 +10,8 @@ import (
 	"0xacab.org/leap/bitmask-vpn/pkg/backend"
 )
 
-//export GetVersion
-func GetVersion() *C.char {
+//export GetBitmaskVersion
+func GetBitmaskVersion() *C.char {
 	return (*C.char)(backend.GetVersion())
 }
 
diff --git a/gui/handlers.cpp b/gui/handlers.cpp
index f4fe10b6654c0fc72f3a08f4202b360190a2f7d3..6cafab54f69fc6fc225b7ec0e5dcd80b7bc6ea70 100644
--- a/gui/handlers.cpp
+++ b/gui/handlers.cpp
@@ -19,7 +19,7 @@ Backend::Backend(QObject *parent) : QObject(parent)
 
 QString Backend::getVersion()
 {
-    return QString(GetVersion());
+    return QString(GetBitmaskVersion());
 }
 
 void Backend::switchOn()
diff --git a/gui/qml/main.qml b/gui/qml/main.qml
index 4bd87bacfe4a9ae0e8df0d8a3fc87e4115ae8fb1..adf11bd2443862c722c56df0b806a0d3789f80d1 100644
--- a/gui/qml/main.qml
+++ b/gui/qml/main.qml
@@ -141,10 +141,20 @@ ApplicationWindow {
             // left and right click seem to be working fine, so let's ignore this for now.
             switch (reason) {
             case SystemTrayIcon.Unknown:
-                break
+	        console.debug("reason: unknown")
+                menu.open()
+		break
             case SystemTrayIcon.Context:
+	        console.debug("activated: context")
+		if (Qt.platform.os !== "linux") {
+			menu.open()
+		}
                 break
             case SystemTrayIcon.DoubleClick:
+	        console.debug("activated: double click")
+		if (Qt.platform.os !== "linux") {
+			menu.open()
+		}
                 break
             case SystemTrayIcon.Trigger:
                 break
diff --git a/pkg/bitmask/autostart.go b/pkg/bitmask/autostart.go
index f314dbc491acdf06d3114c65357f41418e804807..f8f0f19fb5109a1fb1c5cd2497b7c218ab1c648c 100644
--- a/pkg/bitmask/autostart.go
+++ b/pkg/bitmask/autostart.go
@@ -1,3 +1,5 @@
+// +build !windows
+
 // Copyright (C) 2018 LEAP
 //
 // This program is free software: you can redistribute it and/or modify
@@ -35,7 +37,7 @@ type Autostart interface {
 	Enable() error
 }
 
-// newAutostart creates a handler for the autostart of your platform
+// NewAutostart creates a handler for the autostart of your platform
 func NewAutostart(appName string, iconPath string) Autostart {
 	exec := os.Args
 	if os.Getenv("SNAP") != "" {
diff --git a/pkg/bitmask/init.go b/pkg/bitmask/init.go
index 00f145e8f4a0864dfa160422c58b192105b8f1a5..3e040b4c90c4ccde90794830fcc1ffb9549c2af3 100644
--- a/pkg/bitmask/init.go
+++ b/pkg/bitmask/init.go
@@ -16,8 +16,6 @@
 package bitmask
 
 import (
-	"errors"
-	"fmt"
 	"log"
 	"os"
 	"path"
@@ -91,7 +89,6 @@ func initBitmask() (Bitmask, error) {
 	b, err := vpn.Init()
 	if err != nil {
 		log.Printf("An error ocurred starting bitmask: %v", err)
-		err = errors.New(fmt.Sprintf(errorMsg, err))
 	}
 	return b, err
 }
diff --git a/pkg/helper/helper.go b/pkg/helper/helper.go
index 4fa88b2a8a7cae94d201ad81ff1512ac2e09bc90..9d0b330475439229eba38d79ee75d80d2cd605dc 100644
--- a/pkg/helper/helper.go
+++ b/pkg/helper/helper.go
@@ -22,13 +22,18 @@
 package helper
 
 import (
-	"0xacab.org/leap/bitmask-vpn/pkg/config"
 	"encoding/json"
 	"log"
 	"net/http"
 	"os/exec"
 )
 
+var (
+	AppName = "DemoLibVPN"
+	BinaryName = "bitmask"
+	Version = "git"
+)
+
 type openvpnT struct {
 	cmd *exec.Cmd
 }
@@ -82,6 +87,7 @@ func (openvpn *openvpnT) run(args []string) error {
 			return err
 		}
 	}
+	log.Println("OPENVPN PATH:", getOpenvpnPath())
 
 	// TODO: if it dies we should restart it
 	openvpn.cmd = exec.Command(getOpenvpnPath(), args...)
@@ -151,7 +157,7 @@ func firewallIsUpHandler(w http.ResponseWriter, r *http.Request) {
 }
 
 func versionHandler(w http.ResponseWriter, r *http.Request) {
-	w.Write([]byte(config.ApplicationName + "/" + config.Version + "\n"))
+	w.Write([]byte(AppName + "/" + Version + "\n"))
 	w.WriteHeader(http.StatusOK)
 }
 
diff --git a/pkg/helper/windows.go b/pkg/helper/windows.go
index 5eef863c9f7736302633820afe6605599630eb19..ef4f2719fef3eab566ff996de759a22e613dd12a 100644
--- a/pkg/helper/windows.go
+++ b/pkg/helper/windows.go
@@ -1,5 +1,5 @@
 // +build windows
-// Copyright (C) 2018 LEAP
+// Copyright (C) 2018-2020 LEAP
 //
 // This program is free software: you can redistribute it and/or modify
 // it under the terms of the GNU General Public License as published by
@@ -23,25 +23,20 @@ import (
 	"os/exec"
 	"strconv"
 	"strings"
+	"path"
 
-	"0xacab.org/leap/bitmask-vpn/pkg/config"
 	"golang.org/x/sys/windows"
 	"golang.org/x/sys/windows/svc"
 )
 
-const (
-	svcName          = config.BinaryName + `-helper-v2`
-	appPath          = `C:\Program Files\` + config.ApplicationName + `\`
-	LogFolder        = appPath
-	openvpnPath      = appPath + `openvpn.exe`
-	chocoOpenvpnPath = `C:\Program Files\OpenVPN\bin\openvpn.exe`
-)
 
-type httpConf struct {
-	BindAddr string
-}
 
 var (
+	svcName          = BinaryName + `-helper-v2`
+	appPath          = getExecDir()
+	LogFolder        = appPath
+	openvpnPath      = path.Join(appPath, "openvpn.exe")
+	chocoOpenvpnPath = `C:\Program Files\OpenVPN\bin\openvpn.exe`
 	platformOpenvpnFlags = []string{
 		"--script-security", "1",
 		"--block-outside-dns",
@@ -49,6 +44,19 @@ var (
 	httpServerConf = &httpConf{}
 )
 
+func getExecDir() string {
+	ex, err := os.Executable()
+	if err != nil {
+		log.Fatal("Cannot find executable path")
+	}
+	return path.Dir(ex)
+}
+
+type httpConf struct {
+	BindAddr string
+}
+
+
 // parseCliArgs allows the helper binary to install/uninstall itself. It requires admin privileges.
 // However, be warned: if you intend to use it from the command line, you will have to compile it with the Go compiler yourself.
 // the version we're shipping (ie, cross-compiled with the mingw compiler) apparently is not able to output to stdout/stderr properly.