diff --git a/pkg/vpn/menshen/init.go b/pkg/vpn/menshen/init.go
index 62c8ff3f1a416edea56f2cbee908d3c5b88afae4..7db2ed0abdd24ebe216abb1be4078b38e039d069 100644
--- a/pkg/vpn/menshen/init.go
+++ b/pkg/vpn/menshen/init.go
@@ -1,10 +1,7 @@
 package menshen
 
 import (
-	"errors"
-	"net/url"
 	"os"
-	"strconv"
 	"strings"
 
 	"0xacab.org/leap/bitmask-core/models"
@@ -29,9 +26,7 @@ type Menshen struct {
 
 }
 
-// Parses API URL of menshen (config.APIURL). Can be overwritten during runtime by setting env API_URL.
-// Returns hostname/ip, port, useTLS of menshen
-func parseApiURL() (string, int, bool) {
+func New() (*Menshen, error) {
 	if os.Getenv("API_URL") != "" {
 		config.APIURL = os.Getenv("API_URL")
 		log.Debug().
@@ -39,49 +34,10 @@ func parseApiURL() (string, int, bool) {
 			Msg("Using API URL from env")
 	}
 
-	url, err := url.Parse(config.APIURL)
+	cfg, err := bootstrap.NewConfigFromURL(config.APIURL)
 	if err != nil {
-		log.Fatal().
-			Err(err).
-			Str("apiUrl", config.APIURL).
-			Msg("Could not parse API URL")
-	}
-
-	hostname := url.Hostname()
-	useTLS := url.Scheme != "http"
-
-	var port int
-	if url.Port() == "" {
-		port = 443
-	} else {
-		port, err = strconv.Atoi(url.Port())
-		if err != nil {
-			log.Fatal().
-				Err(err).
-				Str("port", url.Port()).
-				Msg("Could not parse port to int")
-		}
-	}
-
-	log.Trace().
-		Bool("useTLS", useTLS).
-		Str("hostname", hostname).
-		Int("port", port).
-		Msg("Parsed API URL")
-
-	return hostname, port, useTLS
-}
-
-func New() (*Menshen, error) {
-	hostname, port, useTLS := parseApiURL()
-	// URL schema parsing can be confusing. Parsing an empty string results in empty hostname
-	if hostname == "" {
-		return nil, errors.New("Could not initialize menshen object. Hostname is empty")
+		return nil, err
 	}
-	cfg := bootstrap.NewConfig()
-	cfg.Host = hostname
-	cfg.Port = port
-	cfg.UseTLS = useTLS
 
 	api, err := bootstrap.NewAPI(cfg)
 	if err != nil {