diff --git a/branding/assets/demolib b/branding/assets/demolib
new file mode 120000
index 0000000000000000000000000000000000000000..efd261bf79519c997d1c2ac4154798d551f022dd
--- /dev/null
+++ b/branding/assets/demolib
@@ -0,0 +1 @@
+demo
\ No newline at end of file
diff --git a/branding/config/demolib-ca.crt b/branding/config/demolib-ca.crt
new file mode 100644
index 0000000000000000000000000000000000000000..ae726f4f0d34f408d9bd9b0c18dec15e386666b8
--- /dev/null
+++ b/branding/config/demolib-ca.crt
@@ -0,0 +1,10 @@
+-----BEGIN CERTIFICATE-----
+MIIBQzCB6aADAgECAgEBMAoGCCqGSM49BAMCMBcxFTATBgNVBAMTDExFQVAgUm9v
+dCBDQTAeFw0yMDA4MDYxOTA3NDRaFw0yNTA4MDYxOTEyNDRaMBcxFTATBgNVBAMT
+DExFQVAgUm9vdCBDQTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABIG5POr4cAdK
+kTavKpSJr8nW1V7HLpr27qKaShpk1TUy5ipaAlusmavGLxKsPE+i3AMlvf/f6ch3
+1MjAtIf5rYujJjAkMA4GA1UdDwEB/wQEAwICpDASBgNVHRMBAf8ECDAGAQH/AgEB
+MAoGCCqGSM49BAMCA0kAMEYCIQDXj280LNZbSbi0Y2WvtQrJBUw4wdm8qAeOeuH7
+6XiLEwIhAPBRsmst/ujcChsG2t6LpG+p8s4rfIfh8YLo/4qrcc5p
+-----END CERTIFICATE-----
+
diff --git a/branding/config/vendor.conf b/branding/config/vendor.conf
index a1aca33cd92824373abaf565306b547f82e80d4d..ac0f4b12008b9b7c39e2159a1707903d68139089 100644
--- a/branding/config/vendor.conf
+++ b/branding/config/vendor.conf
@@ -1,6 +1,6 @@
 [default]
 
-provider = riseup
+provider = demolib
 
 
 [riseup]
@@ -63,3 +63,23 @@ geolocationAPI      =
 
 askForDonations     = false
 donateURL           =
+
+[demolib]
+
+name                = demolib
+applicationName     = DemoLib
+binaryName          = demo-lib
+auth                = sip
+
+providerURL         = vpnlib.bitmask.net
+apiURL              = https://api.vpnlib.bitmask.net/
+caURL               = https://api.vpnlib.bitmask.net/ca.crt
+
+infoURL             = https://libraryvpn.org/
+tosURL              = https://libraryvpn.org/
+helpURL             = https://libraryvpn.org/
+
+geolocationAPI      = https://getmyip.vpnlib.bitmask.net/
+
+askForDonations     = false
+donateURL           =
diff --git a/gui/backend.go b/gui/backend.go
index 536ade3498b2f9f0d4667c89c4a303ade90ff41c..a5cb3abe3fa4c9136cd10805d07e55ad2b50e062 100644
--- a/gui/backend.go
+++ b/gui/backend.go
@@ -22,6 +22,11 @@ func GetAppName() *C.char {
 	return (*C.char)(backend.GetAppName())
 }
 
+//export Login
+func Login(username, password *C.char) {
+	backend.Login(C.GoString(username), C.GoString(password))
+}
+
 //export SwitchOn
 func SwitchOn() {
 	backend.SwitchOn()
diff --git a/gui/handlers.cpp b/gui/handlers.cpp
index ab64afb44db3ca859fa3e70efac28937c64a7d64..3959964b601c0e04e40331c12366af46fd99897f 100644
--- a/gui/handlers.cpp
+++ b/gui/handlers.cpp
@@ -35,6 +35,18 @@ void Backend::donateAccepted()
     DonateAccepted();
 }
 
+void Backend::login(QString username, QString password)
+{
+    // TODO: there has to be a cleaner way to do the conversion
+    char * u = new char [username.length()+1];
+    char * p = new char [password.length()+1];
+    strcpy(u, username.toStdString().c_str());
+    strcpy(p, password.toStdString().c_str());
+    Login(u, p);
+    delete [] u;
+    delete [] p;
+}
+
 void Backend::quit()
 {
     Quit();
diff --git a/gui/handlers.h b/gui/handlers.h
index 62a733d1d89763652522f5d2a26f2628d3ad2cc2..656a451672aa10655fa4744c0fe77515955b7341 100644
--- a/gui/handlers.h
+++ b/gui/handlers.h
@@ -35,6 +35,7 @@ public slots:
     void switchOn();
     void switchOff();
     void donateAccepted();
+    void login(QString username, QString password);
     void quit();
 };
 
diff --git a/gui/qml/LoginDialog.qml b/gui/qml/LoginDialog.qml
index 0c0f18ea17c120a285d5f336fe9853d915b70298..1724769dc8cf2b3344ed2937935a5329a8c26786 100644
--- a/gui/qml/LoginDialog.qml
+++ b/gui/qml/LoginDialog.qml
@@ -22,7 +22,6 @@ Dialog {
     }
 
     visible: false
-    //visible: ctx.showLogin == true
-    //onAccepted: backend.login(username.text, password.text)
-    onRejected: backend.quit()  // TODO: it doesn't close
+    onAccepted: backend.login(username.text, password.text)
+    onRejected: backend.quit()
 }
diff --git a/gui/qml/main.qml b/gui/qml/main.qml
index 09bbab5ce2781d2064d953ccdb966fb826f3f7ad..0242493417fc453df7c1147dfbd0c8ac31e749cb 100644
--- a/gui/qml/main.qml
+++ b/gui/qml/main.qml
@@ -19,6 +19,10 @@ ApplicationWindow {
                 console.debug(jsonModel.getJson())
                 donate.visible = true
             }
+            if (ctx.loginDialog == 'true') {
+                console.debug(jsonModel.getJson())
+                login.visible = true
+            }
             if (ctx.errors ) {
                if ( ctx.errors  == "nohelpers" ) {
                    showInitFailure(qsTr("Could not find helpers. Check your installation"))
diff --git a/pkg/backend/api.go b/pkg/backend/api.go
index ff8c1bbe2a3a5479a141f746b1404cf40f80e172..7b48906ee6207becb473ccf2aa167a48badddb07 100644
--- a/pkg/backend/api.go
+++ b/pkg/backend/api.go
@@ -13,6 +13,21 @@ import (
 	"0xacab.org/leap/bitmask-vpn/pkg/pickle"
 )
 
+func Login(username, password string) {
+	success, err := ctx.bm.DoLogin(username, password)
+	if err != nil {
+		// TODO
+		log.Printf("Error login: %v", err)
+	} else if success {
+		// TODO: Notify success
+		log.Printf("Logged in as %s", username)
+	} else {
+		// TODO: display login again with an err
+		log.Printf("Failed to login as %s", username)
+		ctx.LoginDialog = true
+	}
+}
+
 func SwitchOn() {
 	go setStatus(starting)
 	go startVPN()
@@ -57,6 +72,9 @@ func InitializeBitmaskContext(opts *InitOpts) {
 	initOnce.Do(func() { initializeContext(opts) })
 	runDonationReminder()
 	if ctx.bm != nil {
+		if ctx.bm.NeedsCredentials() {
+			ctx.LoginDialog = true
+		}
 		go ctx.updateStatus()
 	}
 }
diff --git a/pkg/backend/status.go b/pkg/backend/status.go
index 2bfb52da598184af3505fdfc73301f0d6efa1355..5e9a0f800cc1eda32ab89e011e51827452041d4b 100644
--- a/pkg/backend/status.go
+++ b/pkg/backend/status.go
@@ -37,6 +37,7 @@ type connectionCtx struct {
 	AskForDonations bool   `json:"askForDonations"`
 	DonateDialog    bool   `json:"donateDialog"`
 	DonateURL       string `json:"donateURL"`
+	LoginDialog     bool   `json:"loginDialog"`
 	Version         string `json:"version"`
 	Errors          string `json:"errors"`
 	Status          status `json:"status"`
diff --git a/pkg/config/config.go b/pkg/config/config.go
index 80f5df480cca00934635a9de35a01559382fd81b..e9866d2603d2b2e3f8bc33b875ed1c58c6ef938a 100644
--- a/pkg/config/config.go
+++ b/pkg/config/config.go
@@ -1,22 +1,22 @@
 // Code generated by go generate; DO NOT EDIT.
 // This file was generated by vendorize.py
-// At 2020-06-16 21:44:41
+// At 2020-08-13 22:38:42
 
 package config
 
 /* All these constants are defined in the vendor.conf file
  */
 const (
-	Provider        = "riseup.net"
-	ApplicationName = "RiseupVPN"
-	BinaryName      = "riseup-vpn"
-	Auth            = "anon"
-	DonateURL       = "https://riseup.net/vpn/donate"
-	AskForDonations = "true"
-	HelpURL         = "https://riseup.net/support"
-	TosURL          = "https://riseup.net/tos"
-	APIURL          = "https://api.black.riseup.net/"
-	GeolocationAPI  = "https://api.black.riseup.net:9001/json"
+	Provider        = "vpnlib.bitmask.net"
+	ApplicationName = "DemoLib"
+	BinaryName      = "demo-lib"
+	Auth            = "sip"
+	DonateURL       = ""
+	AskForDonations = "false"
+	HelpURL         = "https://libraryvpn.org/"
+	TosURL          = "https://libraryvpn.org/"
+	APIURL          = "https://api.vpnlib.bitmask.net/"
+	GeolocationAPI  = "https://getmyip.vpnlib.bitmask.net/"
 )
 
 var Version string
@@ -29,34 +29,11 @@ CaCert : a string containing a representation of the provider CA, used to
 
 */
 var CaCert = []byte(`-----BEGIN CERTIFICATE-----
-MIIFjTCCA3WgAwIBAgIBATANBgkqhkiG9w0BAQ0FADBZMRgwFgYDVQQKDA9SaXNl
-dXAgTmV0d29ya3MxGzAZBgNVBAsMEmh0dHBzOi8vcmlzZXVwLm5ldDEgMB4GA1UE
-AwwXUmlzZXVwIE5ldHdvcmtzIFJvb3QgQ0EwHhcNMTQwNDI4MDAwMDAwWhcNMjQw
-NDI4MDAwMDAwWjBZMRgwFgYDVQQKDA9SaXNldXAgTmV0d29ya3MxGzAZBgNVBAsM
-Emh0dHBzOi8vcmlzZXVwLm5ldDEgMB4GA1UEAwwXUmlzZXVwIE5ldHdvcmtzIFJv
-b3QgQ0EwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQC76J4ciMJ8Sg0m
-TP7DF2DT9zNe0Csk4myoMFC57rfJeqsAlJCv1XMzBmXrw8wq/9z7XHv6n/0sWU7a
-7cF2hLR33ktjwODlx7vorU39/lXLndo492ZBhXQtG1INMShyv+nlmzO6GT7ESfNE
-LliFitEzwIegpMqxCIHXFuobGSCWF4N0qLHkq/SYUMoOJ96O3hmPSl1kFDRMtWXY
-iw1SEKjUvpyDJpVs3NGxeLCaA7bAWhDY5s5Yb2fA1o8ICAqhowurowJpW7n5ZuLK
-5VNTlNy6nZpkjt1QycYvNycffyPOFm/Q/RKDlvnorJIrihPkyniV3YY5cGgP+Qkx
-HUOT0uLA6LHtzfiyaOqkXwc4b0ZcQD5Vbf6Prd20Ppt6ei0zazkUPwxld3hgyw58
-m/4UIjG3PInWTNf293GngK2Bnz8Qx9e/6TueMSAn/3JBLem56E0WtmbLVjvko+LF
-PM5xA+m0BmuSJtrD1MUCXMhqYTtiOvgLBlUm5zkNxALzG+cXB28k6XikXt6MRG7q
-hzIPG38zwkooM55yy5i1YfcIi5NjMH6A+t4IJxxwb67MSb6UFOwg5kFokdONZcwj
-shczHdG9gLKSBIvrKa03Nd3W2dF9hMbRu//STcQxOailDBQCnXXfAATj9pYzdY4k
-ha8VCAREGAKTDAex9oXf1yRuktES4QIDAQABo2AwXjAdBgNVHQ4EFgQUC4tdmLVu
-f9hwfK4AGliaet5KkcgwDgYDVR0PAQH/BAQDAgIEMAwGA1UdEwQFMAMBAf8wHwYD
-VR0jBBgwFoAUC4tdmLVuf9hwfK4AGliaet5KkcgwDQYJKoZIhvcNAQENBQADggIB
-AGzL+GRnYu99zFoy0bXJKOGCF5XUXP/3gIXPRDqQf5g7Cu/jYMID9dB3No4Zmf7v
-qHjiSXiS8jx1j/6/Luk6PpFbT7QYm4QLs1f4BlfZOti2KE8r7KRDPIecUsUXW6P/
-3GJAVYH/+7OjA39za9AieM7+H5BELGccGrM5wfl7JeEz8in+V2ZWDzHQO4hMkiTQ
-4ZckuaL201F68YpiItBNnJ9N5nHr1MRiGyApHmLXY/wvlrOpclh95qn+lG6/2jk7
-3AmihLOKYMlPwPakJg4PYczm3icFLgTpjV5sq2md9bRyAg3oPGfAuWHmKj2Ikqch
-Td5CHKGxEEWbGUWEMP0s1A/JHWiCbDigc4Cfxhy56CWG4q0tYtnc2GMw8OAUO6Wf
-Xu5pYKNkzKSEtT/MrNJt44tTZWbKV/Pi/N2Fx36my7TgTUj7g3xcE9eF4JV2H/sg
-tsK3pwE0FEqGnT4qMFbixQmc8bGyuakr23wjMvfO7eZUxBuWYR2SkcP26sozF9PF
-tGhbZHQVGZUTVPyvwahMUEhbPGVerOW0IYpxkm0x/eaWdTc4vPpf/rIlgbAjarnJ
-UN9SaWRlWKSdP4haujnzCoJbM7dU9bjvlGZNyXEekgeT0W2qFeGGp+yyUWw8tNsp
-0BuC1b7uW/bBn/xKm319wXVDvBgZgcktMolak39V7DVO
+MIIBQzCB6aADAgECAgEBMAoGCCqGSM49BAMCMBcxFTATBgNVBAMTDExFQVAgUm9v
+dCBDQTAeFw0yMDA4MDYxOTA3NDRaFw0yNTA4MDYxOTEyNDRaMBcxFTATBgNVBAMT
+DExFQVAgUm9vdCBDQTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABIG5POr4cAdK
+kTavKpSJr8nW1V7HLpr27qKaShpk1TUy5ipaAlusmavGLxKsPE+i3AMlvf/f6ch3
+1MjAtIf5rYujJjAkMA4GA1UdDwEB/wQEAwICpDASBgNVHRMBAf8ECDAGAQH/AgEB
+MAoGCCqGSM49BAMCA0kAMEYCIQDXj280LNZbSbi0Y2WvtQrJBUw4wdm8qAeOeuH7
+6XiLEwIhAPBRsmst/ujcChsG2t6LpG+p8s4rfIfh8YLo/4qrcc5p
 -----END CERTIFICATE-----`)