diff --git a/branding/scripts/gen-providers-json.py b/branding/scripts/gen-providers-json.py
index b57965b9712758a239a26108a3344511a23fe8bf..8e1c10bd468c5bf395ca57638996dc31e813f0f1 100644
--- a/branding/scripts/gen-providers-json.py
+++ b/branding/scripts/gen-providers-json.py
@@ -23,10 +23,11 @@ def generateProvidersJSON(configPath, outputJSONPath):
     providers = {}
     defaultProvider = getDefaultProvider(config)
     providers['default'] = defaultProvider
+    providers['providers'] = []
     providerData = getProviderData(defaultProvider, config)
     addCaData(providerData, configPath)
 
-    providers[defaultProvider] = providerData
+    providers['providers'].append(providerData)
     with open(outputJSONPath, 'w', encoding='utf-8') as f:
         json.dump(providers, f, ensure_ascii=False, indent=4)
 
diff --git a/gui/backend.go b/gui/backend.go
index 5fa6134a128b95c2c10ebb151c77f9504eb04426..a1dafe8c6e3a3debeabcb521866b5a81018bcfcd 100644
--- a/gui/backend.go
+++ b/gui/backend.go
@@ -7,6 +7,7 @@ package main
 
 import (
 	"C"
+	"log"
 	"unsafe"
 
 	"0xacab.org/leap/bitmask-vpn/pkg/backend"
@@ -53,8 +54,11 @@ func SubscribeToEvent(event string, f unsafe.Pointer) {
 }
 
 //export InitializeBitmaskContext
-func InitializeBitmaskContext() {
-	opts := &backend.InitOpts{}
+func InitializeBitmaskContext(provider string, jsonPtr unsafe.Pointer, jsonLen C.int) {
+	log.Println("DEBUG: provider=", provider)
+	json := C.GoBytes(jsonPtr, jsonLen)
+	log.Println("DEBUG: json=", string(json))
+	opts := backend.InitOptsFromJSON(provider, string(json))
 	backend.InitializeBitmaskContext(opts)
 }
 
diff --git a/gui/handlers.cpp b/gui/handlers.cpp
index 71e5d38b07183a612792ef64c5fd74649b99048a..4910aa29577f969ddb50fd25a63796fb7ffcadec 100644
--- a/gui/handlers.cpp
+++ b/gui/handlers.cpp
@@ -8,7 +8,9 @@
 
 GoString toGoStr(QString s)
 {
-    char *c = s.toLocal8Bit().data();
+    // TODO verify that it's more correct 
+    // char *c = s.toLocal8Bit().data();
+    const char *c = s.toUtf8().constData();
     return (GoString){c, (long int)strlen(c)};
 }
 
diff --git a/gui/main.cpp b/gui/main.cpp
index 8c7de4f59dc032cf9d1ab630dce0d6de22dc551c..4ba9dd6f05ae8e94c2ab8588099c1fe29fb0cd52 100644
--- a/gui/main.cpp
+++ b/gui/main.cpp
@@ -145,8 +145,14 @@ int main(int argc, char **argv) {
     GoString statusChangedEvt = {stCh, (long int)strlen(stCh)};
     SubscribeToEvent(statusChangedEvt, (void *)onStatusChanged);
 
+    QJsonValue defaultProvider = providers->json().object().value("default");
+    /* we send json as bytes because it breaks as a simple string */
+    QString QProvidersJSON(providers->json().toJson(QJsonDocument::Compact));
+
     /* let the Go side initialize its internal state */
-    InitializeBitmaskContext();
+    InitializeBitmaskContext(
+            toGoStr(defaultProvider.toString()),
+            (char*)QProvidersJSON.toUtf8().data(), strlen(QProvidersJSON.toUtf8().data()));
 
     /* if requested, enable web api for controlling the VPN */
     if (webAPI) {
diff --git a/gui/providers/providers.json b/gui/providers/providers.json
index 7ba0ef970eba17863bdc07d0ee7e1e5883d58ac2..f0132f51fcd0812d5abb920e9f74af9279bb8ef3 100644
--- a/gui/providers/providers.json
+++ b/gui/providers/providers.json
@@ -1,4 +1,20 @@
-[
-    {"name": "provider1", "url": "https://example.com"},
-    {"name": "provider2", "url": "https://foobar.com"}
-]
+{
+    "default": "demolib",
+    "providers": [
+        {
+            "name": "demolib",
+            "applicationName": "DemoLib",
+            "binaryName": "demo-lib",
+            "auth": "sip",
+            "providerURL": "vpnlib.bitmask.net",
+            "tosURL": "https://libraryvpn.org/",
+            "helpURL": "https://libraryvpn.org/",
+            "askForDonations": "false",
+            "donateURL": "",
+            "apiURL": "https://api.vpnlib.bitmask.net:4430/",
+            "geolocationAPI": "https://getmyip.vpnlib.bitmask.net/json",
+            "caCertString": "-----BEGIN CERTIFICATE-----\nMIIBQzCB6aADAgECAgEBMAoGCCqGSM49BAMCMBcxFTATBgNVBAMTDExFQVAgUm9v\ndCBDQTAeFw0yMDA4MDYxOTA3NDRaFw0yNTA4MDYxOTEyNDRaMBcxFTATBgNVBAMT\nDExFQVAgUm9vdCBDQTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABIG5POr4cAdK\nkTavKpSJr8nW1V7HLpr27qKaShpk1TUy5ipaAlusmavGLxKsPE+i3AMlvf/f6ch3\n1MjAtIf5rYujJjAkMA4GA1UdDwEB/wQEAwICpDASBgNVHRMBAf8ECDAGAQH/AgEB\nMAoGCCqGSM49BAMCA0kAMEYCIQDXj280LNZbSbi0Y2WvtQrJBUw4wdm8qAeOeuH7\n6XiLEwIhAPBRsmst/ujcChsG2t6LpG+p8s4rfIfh8YLo/4qrcc5p\n-----END CERTIFICATE-----",
+            "timeStamp": "2020-09-08 01:01:08"
+        }
+    ]
+}
\ No newline at end of file
diff --git a/pkg/backend/api.go b/pkg/backend/api.go
index 125f7f5832709517e033cfcf2cb3b223a52477d1..59b386b4cf5dc2cbbfe1ac957830a308a16667ef 100644
--- a/pkg/backend/api.go
+++ b/pkg/backend/api.go
@@ -4,6 +4,7 @@ package backend
 
 import (
 	"C"
+	"encoding/json"
 	"log"
 	"strconv"
 	"unsafe"
@@ -61,10 +62,30 @@ func SubscribeToEvent(event string, f unsafe.Pointer) {
 	subscribe(event, f)
 }
 
+type Providers struct {
+	Default string `json:"default"`
+	Data    []InitOpts
+}
+
 type InitOpts struct {
-	Provider   string
-	AppName    string
-	SkipLaunch bool
+	Provider        string `json:"name"`
+	AppName         string `json:"applicationName"`
+	BinaryName      string `json:"binaryName"`
+	Auth            string `json:"auth"`
+	ProviderURL     string `json:"providerURL"`
+	TosURL          string `json:"tosURL"`
+	HelpURL         string `json:"helpURL"`
+	AskForDonations bool   `json:"askForDonations"`
+	SkipLaunch      bool
+}
+
+func InitOptsFromJSON(provider, providersJSON string) *InitOpts {
+	opts := InitOpts{}
+	err := json.Unmarshal([]byte(providersJSON), &opts)
+	if err != nil {
+		log.Println("ERROR: %v", err)
+	}
+	return &opts
 }
 
 func InitializeBitmaskContext(opts *InitOpts) {