[lxc-devel] [lxd/master] [RFC] Add support for external authentication via Macaroons

albertodonato on Github lxc-bot at linuxcontainers.org
Fri Jul 28 16:34:03 UTC 2017


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 301 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20170728/a9a93c0d/attachment.bin>
-------------- next part --------------
From 4dcb5788137a6245638c5a350b8c66b3de5ca96b Mon Sep 17 00:00:00 2001
From: Alberto Donato <alberto.donato at canonical.com>
Date: Wed, 19 Jul 2017 14:58:20 +0200
Subject: [PATCH 1/2] server: support for macaroons-based authentication

Signed-off-by: Alberto Donato <alberto.donato at canonical.com>
---
 doc/api-extensions.md       |   3 +
 doc/server.md               |  31 ++++----
 lxc/remote.go               |   6 +-
 lxd/api_1.0.go              |  16 +++--
 lxd/certificates.go         |   2 +-
 lxd/daemon.go               | 171 +++++++++++++++++++++++++++++++++++---------
 lxd/daemon_config.go        |  10 +++
 lxd/images.go               |  10 +--
 shared/api/server.go        |   1 +
 test/suites/serverconfig.sh |   9 +++
 10 files changed, 198 insertions(+), 61 deletions(-)

diff --git a/doc/api-extensions.md b/doc/api-extensions.md
index 4550b7d72..af004197a 100644
--- a/doc/api-extensions.md
+++ b/doc/api-extensions.md
@@ -322,3 +322,6 @@ This adds the ability to specify the ceph user.
 ## instance\_types
 This adds the "instance\_type" field to the container creation request.
 Its value is expanded to LXD resource limits.
+
+## external\_authentication
+This adds support for external authentication via Macaroons.
diff --git a/doc/server.md b/doc/server.md
index 5fa2fe3f2..54044a5d2 100644
--- a/doc/server.md
+++ b/doc/server.md
@@ -6,21 +6,22 @@ currently supported:
  - core (core daemon configuration)
  - images (image configuration)
 
-Key                             | Type      | Default   | API extension  | Description
-:--                             | :---      | :------   | :------------  | :----------
-core.https\_address             | string    | -         | -              | Address to bind for the remote API
-core.https\_allowed\_headers    | string    | -         | -              | Access-Control-Allow-Headers http header value
-core.https\_allowed\_methods    | string    | -         | -              | Access-Control-Allow-Methods http header value
-core.https\_allowed\_origin     | string    | -         | -              | Access-Control-Allow-Origin http header value
-core.https\_allowed\_credentials| boolean   | -         | -              | Whether to set Access-Control-Allow-Credentials http header value to "true"
-core.proxy\_http                | string    | -         | -              | http proxy to use, if any (falls back to HTTP\_PROXY environment variable)
-core.proxy\_https               | string    | -         | -              | https proxy to use, if any (falls back to HTTPS\_PROXY environment variable)
-core.proxy\_ignore\_hosts       | string    | -         | -              | hosts which don't need the proxy for use (similar format to NO\_PROXY, e.g. 1.2.3.4,1.2.3.5, falls back to NO\_PROXY environment variable)
-core.trust\_password            | string    | -         | -              | Password to be provided by clients to setup a trust
-images.auto\_update\_cached     | boolean   | true      | -              | Whether to automatically update any image that LXD caches
-images.auto\_update\_interval   | integer   | 6         | -              | Interval in hours at which to look for update to cached images (0 disables it)
-images.compression\_algorithm   | string    | gzip      | -              | Compression algorithm to use for new images (bzip2, gzip, lzma, xz or none)
-images.remote\_cache\_expiry    | integer   | 10        | -              | Number of days after which an unused cached remote image will be flushed
+Key                             | Type      | Default   | API extension           | Description
+:--                             | :---      | :------   | :------------           | :----------
+core.external\_auth.endpoint    | string    | -         | external_authentication | URL of the the external authentication endpoint
+core.https\_address             | string    | -         | -                       | Address to bind for the remote API
+core.https\_allowed\_headers    | string    | -         | -                       | Access-Control-Allow-Headers http header value
+core.https\_allowed\_methods    | string    | -         | -                       | Access-Control-Allow-Methods http header value
+core.https\_allowed\_origin     | string    | -         | -                       | Access-Control-Allow-Origin http header value
+core.https\_allowed\_credentials| boolean   | -         | -                       | Whether to set Access-Control-Allow-Credentials http header value to "true"
+core.proxy\_http                | string    | -         | -                       | http proxy to use, if any (falls back to HTTP\_PROXY environment variable)
+core.proxy\_https               | string    | -         | -                       | https proxy to use, if any (falls back to HTTPS\_PROXY environment variable)
+core.proxy\_ignore\_hosts       | string    | -         | -                       | hosts which don't need the proxy for use (similar format to NO\_PROXY, e.g. 1.2.3.4,1.2.3.5, falls back to NO\_PROXY environment variable)
+core.trust\_password            | string    | -         | -                       | Password to be provided by clients to setup a trust
+images.auto\_update\_cached     | boolean   | true      | -                       | Whether to automatically update any image that LXD caches
+images.auto\_update\_interval   | integer   | 6         | -                       | Interval in hours at which to look for update to cached images (0 disables it)
+images.compression\_algorithm   | string    | gzip      | -                       | Compression algorithm to use for new images (bzip2, gzip, lzma, xz or none)
+images.remote\_cache\_expiry    | integer   | 10        | -                       | Number of days after which an unused cached remote image will be flushed
 
 Those keys can be set using the lxc tool with:
 
diff --git a/lxc/remote.go b/lxc/remote.go
index 594d24566..a8e3c0888 100644
--- a/lxc/remote.go
+++ b/lxc/remote.go
@@ -318,10 +318,12 @@ func (c *remoteCmd) addServer(conf *config.Config, server string, addr string, a
 	}
 
 	if srv.Auth != "trusted" {
-		return fmt.Errorf(i18n.G("Server doesn't trust us after adding our cert"))
+		return fmt.Errorf(i18n.G("Server doesn't trust us after authentication"))
 	}
 
-	fmt.Println(i18n.G("Client certificate stored at server: "), server)
+	if authType == "tls" {
+		fmt.Println(i18n.G("Client certificate stored at server: "), server)
+	}
 	return nil
 }
 
diff --git a/lxd/api_1.0.go b/lxd/api_1.0.go
index f9a6c1b5c..7b8c4c0de 100644
--- a/lxd/api_1.0.go
+++ b/lxd/api_1.0.go
@@ -55,6 +55,10 @@ var api10 = []Command{
 }
 
 func api10Get(d *Daemon, r *http.Request) Response {
+	authMethods := []string{"tls"}
+	if daemonConfig["core.external_auth.endpoint"].Get() != "" {
+		authMethods = append(authMethods, "macaroons")
+	}
 	srv := api.ServerUntrusted{
 		/* List of API extensions in the order they were added.
 		 *
@@ -121,15 +125,17 @@ func api10Get(d *Daemon, r *http.Request) Response {
 			"storage_driver_ceph",
 			"storage_ceph_user_name",
 			"resource_limits",
+			"external_authentication",
 		},
-		APIStatus:  "stable",
-		APIVersion: version.APIVersion,
-		Public:     false,
-		Auth:       "untrusted",
+		APIStatus:   "stable",
+		APIVersion:  version.APIVersion,
+		Public:      false,
+		Auth:        "untrusted",
+		AuthMethods: authMethods,
 	}
 
 	// If untrusted, return now
-	if !d.isTrustedClient(r) {
+	if err := d.checkTrustedClient(r); err != nil {
 		return SyncResponseETag(true, srv, nil)
 	}
 
diff --git a/lxd/certificates.go b/lxd/certificates.go
index 6154b8be1..5daab22cf 100644
--- a/lxd/certificates.go
+++ b/lxd/certificates.go
@@ -95,7 +95,7 @@ func certificatesPost(d *Daemon, r *http.Request) Response {
 	}
 
 	// Access check
-	if !d.isTrustedClient(r) && d.PasswordCheck(req.Password) != nil {
+	if d.checkTrustedClient(r) != nil && d.PasswordCheck(req.Password) != nil {
 		return Forbidden
 	}
 
diff --git a/lxd/daemon.go b/lxd/daemon.go
index 0e5c3e306..985af4221 100644
--- a/lxd/daemon.go
+++ b/lxd/daemon.go
@@ -23,10 +23,12 @@ import (
 	"time"
 
 	"golang.org/x/crypto/scrypt"
+	"golang.org/x/net/context"
 
 	"github.com/gorilla/mux"
 	_ "github.com/mattn/go-sqlite3"
 	"github.com/syndtr/gocapability/capability"
+
 	"gopkg.in/tomb.v2"
 
 	"github.com/lxc/lxd/client"
@@ -37,6 +39,11 @@ import (
 	"github.com/lxc/lxd/shared/version"
 
 	log "gopkg.in/inconshreveable/log15.v2"
+
+	"github.com/juju/idmclient"
+
+	"gopkg.in/macaroon-bakery.v2-unstable/bakery"
+	"gopkg.in/macaroon-bakery.v2-unstable/httpbakery"
 )
 
 // AppArmor
@@ -92,6 +99,13 @@ type Daemon struct {
 	tlsConfig *tls.Config
 
 	proxy func(req *http.Request) (*url.URL, error)
+
+	externalAuth *externalAuth
+}
+
+type externalAuth struct {
+	endpoint string
+	bakery   *bakery.Bakery
 }
 
 // Command is the basic structure for every API call.
@@ -158,23 +172,62 @@ func readMyCert() (string, string, error) {
 	return certf, keyf, err
 }
 
-func (d *Daemon) isTrustedClient(r *http.Request) bool {
+// Check whether the request comes from a trusted client.
+func (d *Daemon) checkTrustedClient(r *http.Request) error {
 	if r.RemoteAddr == "@" {
 		// Unix socket
-		return true
+		return nil
 	}
 
 	if r.TLS == nil {
-		return false
+		return fmt.Errorf("no TLS")
+	}
+
+	if d.externalAuth != nil && r.Header.Get(httpbakery.BakeryProtocolHeader) != "" {
+		ctx := httpbakery.ContextWithRequest(context.TODO(), r)
+		authChecker := d.externalAuth.bakery.Checker.Auth(
+			httpbakery.RequestMacaroons(r)...)
+		ops := getBakeryOps(r)
+		_, err := authChecker.Allow(ctx, ops...)
+		return err
 	}
 
 	for i := range r.TLS.PeerCertificates {
 		if d.CheckTrustState(*r.TLS.PeerCertificates[i]) {
-			return true
+			return nil
 		}
 	}
+	return fmt.Errorf("unauthorized")
+}
 
-	return false
+// Return the bakery operations implied by the given HTTP request
+func getBakeryOps(r *http.Request) []bakery.Op {
+	elems := strings.SplitN(r.URL.Path, "/", 3)
+	entity := ""
+	if len(elems) >= 3 {
+		entity = elems[2]
+	}
+	return []bakery.Op{{
+		Entity: entity,
+		Action: r.Method,
+	}}
+}
+
+func writeMacaroonsRequiredResponse(b *bakery.Bakery, r *http.Request, w http.ResponseWriter, derr *bakery.DischargeRequiredError) {
+	ctx := httpbakery.ContextWithRequest(context.TODO(), r)
+	// Mint an appropriate macaroon and send it back to the client.
+	m, err := b.Oven.NewMacaroon(
+		ctx, httpbakery.RequestVersion(r), time.Now().Add(5*time.Minute), derr.Caveats, derr.Ops...)
+	if err != nil {
+		resp := errorResponse{http.StatusInternalServerError, err.Error()}
+		resp.Render(w)
+		return
+	}
+
+	herr := httpbakery.NewDischargeRequiredError(m, "/", derr)
+	herr.(*httpbakery.Error).Info.CookieNameSuffix = "auth"
+	httpbakery.WriteDischargeRequiredErrorForRequest(w, m, "", herr, r)
+	return
 }
 
 func isJSONRequest(r *http.Request) bool {
@@ -210,18 +263,20 @@ func (d *Daemon) createCmd(version string, c Command) {
 	d.mux.HandleFunc(uri, func(w http.ResponseWriter, r *http.Request) {
 		w.Header().Set("Content-Type", "application/json")
 
-		if d.isTrustedClient(r) {
+		untrustedOk := (r.Method == "GET" && c.untrustedGet) || (r.Method == "POST" && c.untrustedPost)
+
+		err := d.checkTrustedClient(r)
+		if err == nil {
 			logger.Debug(
 				"handling",
 				log.Ctx{"method": r.Method, "url": r.URL.RequestURI(), "ip": r.RemoteAddr})
-		} else if r.Method == "GET" && c.untrustedGet {
-			logger.Debug(
-				"allowing untrusted GET",
-				log.Ctx{"url": r.URL.RequestURI(), "ip": r.RemoteAddr})
-		} else if r.Method == "POST" && c.untrustedPost {
+		} else if untrustedOk && r.Header.Get("X-LXD-authenticated") == "" {
 			logger.Debug(
-				"allowing untrusted POST",
+				fmt.Sprintf("allowing untrusted %s", r.Method),
 				log.Ctx{"url": r.URL.RequestURI(), "ip": r.RemoteAddr})
+		} else if derr, ok := err.(*bakery.DischargeRequiredError); ok {
+			writeMacaroonsRequiredResponse(d.externalAuth.bakery, r, w, derr)
+			return
 		} else {
 			logger.Warn(
 				"rejecting request from untrusted client",
@@ -925,29 +980,12 @@ func (d *Daemon) Init() error {
 		readSavedClientCAList(d)
 	}
 
-	/* Setup the web server */
-	d.mux = mux.NewRouter()
-	d.mux.StrictSlash(false)
-
-	d.mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
-		w.Header().Set("Content-Type", "application/json")
-		SyncResponse(true, []string{"/1.0"}).Render(w)
-	})
-
-	for _, c := range api10 {
-		d.createCmd("1.0", c)
-	}
-
-	for _, c := range apiInternal {
-		d.createCmd("internal", c)
+	d.setupWebServer()
+	err = d.setupExternalAuthentication(daemonConfig["core.external_auth.endpoint"].Get())
+	if err != nil {
+		return err
 	}
 
-	d.mux.NotFoundHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
-		logger.Info("Sending top level 404", log.Ctx{"url": r.URL})
-		w.Header().Set("Content-Type", "application/json")
-		NotFound.Render(w)
-	})
-
 	// Prepare the list of listeners
 	listeners := d.GetListeners()
 	if len(listeners) > 0 {
@@ -1367,6 +1405,73 @@ func (d *Daemon) GetListeners() []net.Listener {
 	return listeners
 }
 
+// Setup the API web server
+func (d *Daemon) setupWebServer() {
+	/* Setup the web server */
+	d.mux = mux.NewRouter()
+	d.mux.StrictSlash(false)
+
+	d.mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
+		w.Header().Set("Content-Type", "application/json")
+		SyncResponse(true, []string{"/1.0"}).Render(w)
+	})
+
+	for _, c := range api10 {
+		d.createCmd("1.0", c)
+	}
+
+	for _, c := range apiInternal {
+		d.createCmd("internal", c)
+	}
+
+	d.mux.NotFoundHandler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
+		logger.Info("Sending top level 404", log.Ctx{"url": r.URL})
+		w.Header().Set("Content-Type", "application/json")
+		NotFound.Render(w)
+	})
+
+}
+
+// Setup external authentication
+func (d *Daemon) setupExternalAuthentication(authEndpoint string) error {
+	if authEndpoint == "" {
+		d.externalAuth = nil
+		logger.Infof("External authentication disabled")
+		return nil
+	}
+
+	idmClient, err := idmclient.New(idmclient.NewParams{
+		BaseURL: authEndpoint,
+	})
+	if err != nil {
+		return err
+	}
+	key, err := bakery.GenerateKey()
+	if err != nil {
+		return err
+	}
+	pkLocator := httpbakery.NewThirdPartyLocator(nil, nil)
+	pkLocator.AllowInsecure()
+	bakery := bakery.New(bakery.BakeryParams{
+		Key:            key,
+		Location:       authEndpoint,
+		Locator:        pkLocator,
+		Checker:        httpbakery.NewChecker(),
+		IdentityClient: idmClient,
+		Authorizer: bakery.ACLAuthorizer{
+			GetACL: func(ctx context.Context, op bakery.Op) ([]string, error) {
+				return []string{"everyone"}, nil
+			},
+		},
+	})
+	d.externalAuth = &externalAuth{
+		endpoint: authEndpoint,
+		bakery:   bakery,
+	}
+	logger.Info("External authentication enabled", log.Ctx{"endpoint": authEndpoint})
+	return nil
+}
+
 type lxdHttpServer struct {
 	r *mux.Router
 	d *Daemon
diff --git a/lxd/daemon_config.go b/lxd/daemon_config.go
index 15c55a429..35582b53a 100644
--- a/lxd/daemon_config.go
+++ b/lxd/daemon_config.go
@@ -183,6 +183,7 @@ func daemonConfigInit(db *sql.DB) error {
 		"core.proxy_https":               {valueType: "string", setter: daemonConfigSetProxy},
 		"core.proxy_ignore_hosts":        {valueType: "string", setter: daemonConfigSetProxy},
 		"core.trust_password":            {valueType: "string", hiddenValue: true, setter: daemonConfigSetPassword},
+		"core.external_auth.endpoint":    {valueType: "string", setter: daemonConfigSetExternalAuthEndpoint},
 
 		"images.auto_update_cached":    {valueType: "bool", defaultValue: "true"},
 		"images.auto_update_interval":  {valueType: "int", defaultValue: "6"},
@@ -272,6 +273,15 @@ func daemonConfigSetAddress(d *Daemon, key string, value string) (string, error)
 	return value, nil
 }
 
+func daemonConfigSetExternalAuthEndpoint(d *Daemon, key string, value string) (string, error) {
+	err := d.setupExternalAuthentication(value)
+	if err != nil {
+		return "", err
+	}
+
+	return value, nil
+}
+
 func daemonConfigSetProxy(d *Daemon, key string, value string) (string, error) {
 	// Get the current config
 	config := map[string]string{}
diff --git a/lxd/images.go b/lxd/images.go
index 8a89fd4ab..500380fb5 100644
--- a/lxd/images.go
+++ b/lxd/images.go
@@ -836,7 +836,7 @@ func doImagesGet(d *Daemon, recursion bool, public bool) (interface{}, error) {
 }
 
 func imagesGet(d *Daemon, r *http.Request) Response {
-	public := !d.isTrustedClient(r)
+	public := d.checkTrustedClient(r) != nil
 
 	result, err := doImagesGet(d, d.isRecursionRequest(r), public)
 	if err != nil {
@@ -1180,7 +1180,7 @@ func imageValidSecret(fingerprint string, secret string) bool {
 
 func imageGet(d *Daemon, r *http.Request) Response {
 	fingerprint := mux.Vars(r)["fingerprint"]
-	public := !d.isTrustedClient(r)
+	public := d.checkTrustedClient(r) != nil
 	secret := r.FormValue("secret")
 
 	info, response := doImageGet(d, fingerprint, false)
@@ -1341,7 +1341,7 @@ func aliasesGet(d *Daemon, r *http.Request) Response {
 			responseStr = append(responseStr, url)
 
 		} else {
-			_, alias, err := dbImageAliasGet(d.db, name, d.isTrustedClient(r))
+			_, alias, err := dbImageAliasGet(d.db, name, d.checkTrustedClient(r) == nil)
 			if err != nil {
 				continue
 			}
@@ -1359,7 +1359,7 @@ func aliasesGet(d *Daemon, r *http.Request) Response {
 func aliasGet(d *Daemon, r *http.Request) Response {
 	name := mux.Vars(r)["name"]
 
-	_, alias, err := dbImageAliasGet(d.db, name, d.isTrustedClient(r))
+	_, alias, err := dbImageAliasGet(d.db, name, d.checkTrustedClient(r) == nil)
 	if err != nil {
 		return SmartError(err)
 	}
@@ -1500,7 +1500,7 @@ func aliasPost(d *Daemon, r *http.Request) Response {
 func imageExport(d *Daemon, r *http.Request) Response {
 	fingerprint := mux.Vars(r)["fingerprint"]
 
-	public := !d.isTrustedClient(r)
+	public := d.checkTrustedClient(r) != nil
 	secret := r.FormValue("secret")
 
 	_, imgInfo, err := dbImageGet(d.db, fingerprint, false, false)
diff --git a/shared/api/server.go b/shared/api/server.go
index 53a4c81be..a986f062f 100644
--- a/shared/api/server.go
+++ b/shared/api/server.go
@@ -29,6 +29,7 @@ type ServerUntrusted struct {
 	APIStatus     string   `json:"api_status" yaml:"api_status"`
 	APIVersion    string   `json:"api_version" yaml:"api_version"`
 	Auth          string   `json:"auth" yaml:"auth"`
+	AuthMethods   []string `json:"auth_methods" yaml:"auth_methods"`
 	Public        bool     `json:"public" yaml:"public"`
 }
 
diff --git a/test/suites/serverconfig.sh b/test/suites/serverconfig.sh
index ba36f2040..7dbb1eb44 100644
--- a/test/suites/serverconfig.sh
+++ b/test/suites/serverconfig.sh
@@ -14,4 +14,13 @@ test_server_config() {
 
   # test untrusted server GET
   my_curl -X GET "https://$(cat "${LXD_SERVERCONFIG_DIR}/lxd.addr")/1.0" | grep -v -q environment
+
+  # test authentication type
+  curl --unix-socket "$LXD_DIR/unix.socket" "lxd/1.0" | jq .metadata.auth_methods | grep tls
+  # only tls is enabled by default
+  ! curl --unix-socket "$LXD_DIR/unix.socket" "lxd/1.0" | jq .metadata.auth_methods | grep macaroons
+  lxc config set core.external_auth.endpoint "https://localhost:8081"
+  # macaroons are also enabled
+  curl --unix-socket "$LXD_DIR/unix.socket" "lxd/1.0" | jq .metadata.auth_methods | grep macaroons
+  lxc config unset core.external_auth.endpoint
 }

From a74c1dcc480d04d1ef3ebbe8ec63238f7bf86e08 Mon Sep 17 00:00:00 2001
From: Alberto Donato <alberto.donato at canonical.com>
Date: Fri, 21 Jul 2017 14:19:22 +0200
Subject: [PATCH 2/2] client: support for macaroons-based authentication

Signed-off-by: Alberto Donato <alberto.donato at canonical.com>
---
 client/connection.go       |  17 +++++++
 client/interfaces.go       |   1 +
 client/lxd.go              |  62 +++++++++++++++++++++++++-
 client/lxd_containers.go   |   6 +--
 client/lxd_images.go       |   2 +-
 client/lxd_server.go       |   5 +++
 lxc/config/config.go       |  26 +++++++++++
 lxc/config/default.go      |   6 ---
 lxc/config/file.go         |  12 +++--
 lxc/config/remote.go       |   4 ++
 lxc/image.go               |   2 +-
 lxc/main.go                |   8 ++--
 lxc/remote.go              |  92 ++++++++++++++++++++++++++------------
 lxd/daemon.go              |   2 +-
 po/de.po                   | 107 ++++++++++++++++++++++++++------------------
 po/el.po                   | 106 ++++++++++++++++++++++++++------------------
 po/fr.po                   | 108 +++++++++++++++++++++++++++------------------
 po/it.po                   | 106 ++++++++++++++++++++++++++------------------
 po/ja.po                   | 108 +++++++++++++++++++++++++++------------------
 po/lxd.pot                 | 106 ++++++++++++++++++++++++++------------------
 po/nl.po                   | 106 ++++++++++++++++++++++++++------------------
 po/ru.po                   | 106 ++++++++++++++++++++++++++------------------
 po/sr.po                   | 106 ++++++++++++++++++++++++++------------------
 po/sv.po                   | 106 ++++++++++++++++++++++++++------------------
 po/tr.po                   | 106 ++++++++++++++++++++++++++------------------
 po/zh.po                   | 106 ++++++++++++++++++++++++++------------------
 po/zh_Hans.po              | 106 ++++++++++++++++++++++++++------------------
 test/lxd-benchmark/main.go |   2 +-
 test/suites/remote.sh      |   3 ++
 29 files changed, 1013 insertions(+), 620 deletions(-)

diff --git a/client/connection.go b/client/connection.go
index 759ac3d25..3f0d688c7 100644
--- a/client/connection.go
+++ b/client/connection.go
@@ -6,6 +6,8 @@ import (
 	"os"
 	"path/filepath"
 
+	"github.com/juju/persistent-cookiejar"
+
 	"github.com/lxc/lxd/shared/logger"
 	"github.com/lxc/lxd/shared/simplestreams"
 )
@@ -27,11 +29,17 @@ type ConnectionArgs struct {
 	// User agent string
 	UserAgent string
 
+	// Authentication type
+	AuthType string
+
 	// Custom proxy
 	Proxy func(*http.Request) (*url.URL, error)
 
 	// Custom HTTP Client (used as base for the connection)
 	HTTPClient *http.Client
+
+	// Persistent cookie jar
+	CookieJar *cookiejar.Jar
 }
 
 // ConnectLXD lets you connect to a remote LXD daemon over HTTPs.
@@ -150,13 +158,22 @@ func httpsLXD(url string, args *ConnectionArgs) (ContainerServer, error) {
 		httpProtocol:    "https",
 		httpUserAgent:   args.UserAgent,
 	}
+	if args.AuthType == "macaroons" {
+		server.RequireAuthenticated(true)
+	}
 
 	// Setup the HTTP client
 	httpClient, err := tlsHTTPClient(args.HTTPClient, args.TLSClientCert, args.TLSClientKey, args.TLSCA, args.TLSServerCert, args.Proxy)
 	if err != nil {
 		return nil, err
 	}
+	if args.CookieJar != nil {
+		httpClient.Jar = args.CookieJar
+	}
 	server.http = httpClient
+	if args.AuthType == "macaroons" {
+		server.setupBakeryClient()
+	}
 
 	// Test the connection and seed the server information
 	_, _, err = server.GetServer()
diff --git a/client/interfaces.go b/client/interfaces.go
index ed9b001a3..9efcb02b7 100644
--- a/client/interfaces.go
+++ b/client/interfaces.go
@@ -45,6 +45,7 @@ type ContainerServer interface {
 	GetServer() (server *api.Server, ETag string, err error)
 	UpdateServer(server api.ServerPut, ETag string) (err error)
 	HasExtension(extension string) bool
+	RequireAuthenticated(authenticated bool)
 
 	// Certificate functions
 	GetCertificateFingerprints() (fingerprints []string, err error)
diff --git a/client/lxd.go b/client/lxd.go
index 3473e317c..39670571e 100644
--- a/client/lxd.go
+++ b/client/lxd.go
@@ -5,11 +5,17 @@ import (
 	"encoding/json"
 	"fmt"
 	"net/http"
+	neturl "net/url"
 	"strings"
 	"sync"
 
 	"github.com/gorilla/websocket"
 
+	schemaform "gopkg.in/juju/environschema.v1/form"
+	"gopkg.in/macaroon-bakery.v2-unstable/bakery"
+	"gopkg.in/macaroon-bakery.v2-unstable/httpbakery"
+	"gopkg.in/macaroon-bakery.v2-unstable/httpbakery/form"
+
 	"github.com/lxc/lxd/shared"
 	"github.com/lxc/lxd/shared/api"
 	"github.com/lxc/lxd/shared/logger"
@@ -27,6 +33,9 @@ type ProtocolLXD struct {
 	httpHost        string
 	httpProtocol    string
 	httpUserAgent   string
+
+	bakeryClient         *httpbakery.Client
+	requireAuthenticated bool
 }
 
 // GetConnectionInfo returns the basic connection information used to interact with the server
@@ -62,6 +71,28 @@ func (r *ProtocolLXD) GetHTTPClient() (*http.Client, error) {
 	return r.http, nil
 }
 
+// Do performs a Request, using macaroon authentication if set.
+func (r *ProtocolLXD) Do(req *http.Request) (*http.Response, error) {
+	if r.bakeryClient != nil {
+		r.addMacaroonHeaders(req)
+		return r.bakeryClient.Do(req)
+	}
+	return r.http.Do(req)
+}
+
+func (r *ProtocolLXD) addMacaroonHeaders(req *http.Request) {
+	req.Header.Set(httpbakery.BakeryProtocolHeader, fmt.Sprint(bakery.LatestVersion))
+
+	for _, cookie := range r.http.Jar.Cookies(req.URL) {
+		req.AddCookie(cookie)
+	}
+}
+
+// RequireAuthenticated sets whether we expect to be authenticated with the server
+func (r *ProtocolLXD) RequireAuthenticated(authenticated bool) {
+	r.requireAuthenticated = authenticated
+}
+
 // RawQuery allows directly querying the LXD API
 //
 // This should only be used by internal LXD tools.
@@ -130,7 +161,8 @@ func (r *ProtocolLXD) rawQuery(method string, url string, data interface{}, ETag
 		}
 
 		// Some data to be sent along with the request
-		req, err = http.NewRequest(method, url, &buf)
+		// Use a reader since the request body needs to be seekable
+		req, err = http.NewRequest(method, url, bytes.NewReader(buf.Bytes()))
 		if err != nil {
 			return nil, "", err
 		}
@@ -158,8 +190,13 @@ func (r *ProtocolLXD) rawQuery(method string, url string, data interface{}, ETag
 		req.Header.Set("If-Match", ETag)
 	}
 
+	// Set the authentication header
+	if r.requireAuthenticated {
+		req.Header.Set("X-LXD-authenticated", "true")
+	}
+
 	// Send the request
-	resp, err := r.http.Do(req)
+	resp, err := r.Do(req)
 	if err != nil {
 		return nil, "", err
 	}
@@ -252,6 +289,20 @@ func (r *ProtocolLXD) rawWebsocket(url string) (*websocket.Conn, error) {
 		headers.Set("User-Agent", r.httpUserAgent)
 	}
 
+	if r.requireAuthenticated {
+		headers.Set("X-LXD-authenticated", "true")
+	}
+
+	//Set macaroons headers if needed
+	if r.bakeryClient != nil {
+		u, err := neturl.Parse(r.httpHost) // use the http url, not the ws one
+		if err != nil {
+			return nil, err
+		}
+		req := &http.Request{URL: u, Header: headers}
+		r.addMacaroonHeaders(req)
+	}
+
 	// Establish the connection
 	conn, _, err := dialer.Dial(url, headers)
 	if err != nil {
@@ -275,3 +326,10 @@ func (r *ProtocolLXD) websocket(path string) (*websocket.Conn, error) {
 
 	return r.rawWebsocket(url)
 }
+
+func (r *ProtocolLXD) setupBakeryClient() {
+	r.bakeryClient = httpbakery.NewClient()
+	r.bakeryClient.Client = r.http
+	r.bakeryClient.WebPageVisitor = httpbakery.NewMultiVisitor(
+		form.Visitor{Filler: schemaform.IOFiller{}})
+}
diff --git a/client/lxd_containers.go b/client/lxd_containers.go
index 421c60183..b0d191ef6 100644
--- a/client/lxd_containers.go
+++ b/client/lxd_containers.go
@@ -718,7 +718,7 @@ func (r *ProtocolLXD) GetContainerFile(containerName string, path string) (io.Re
 	}
 
 	// Send the request
-	resp, err := r.http.Do(req)
+	resp, err := r.Do(req)
 	if err != nil {
 		return nil, nil, err
 	}
@@ -824,7 +824,7 @@ func (r *ProtocolLXD) CreateContainerFile(containerName string, path string, arg
 	}
 
 	// Send the request
-	resp, err := r.http.Do(req)
+	resp, err := r.Do(req)
 	if err != nil {
 		return err
 	}
@@ -1246,7 +1246,7 @@ func (r *ProtocolLXD) GetContainerLogfile(name string, filename string) (io.Read
 	}
 
 	// Send the request
-	resp, err := r.http.Do(req)
+	resp, err := r.Do(req)
 	if err != nil {
 		return nil, err
 	}
diff --git a/client/lxd_images.go b/client/lxd_images.go
index 0ba289f34..79b5f35dc 100644
--- a/client/lxd_images.go
+++ b/client/lxd_images.go
@@ -404,7 +404,7 @@ func (r *ProtocolLXD) CreateImage(image api.ImagesPost, args *ImageCreateArgs) (
 	}
 
 	// Send the request
-	resp, err := r.http.Do(req)
+	resp, err := r.Do(req)
 	if err != nil {
 		return nil, err
 	}
diff --git a/client/lxd_server.go b/client/lxd_server.go
index 2e42f3944..745e17fbe 100644
--- a/client/lxd_server.go
+++ b/client/lxd_server.go
@@ -26,6 +26,11 @@ func (r *ProtocolLXD) GetServer() (*api.Server, string, error) {
 		}
 	}
 
+	if !server.Public && len(server.AuthMethods) == 0 {
+		// TLS is always available for LXD servers
+		server.AuthMethods = []string{"tls"}
+	}
+
 	// Add the value to the cache
 	r.server = &server
 
diff --git a/lxc/config/config.go b/lxc/config/config.go
index 7e5f3df1b..5fb3f6bde 100644
--- a/lxc/config/config.go
+++ b/lxc/config/config.go
@@ -3,6 +3,8 @@ package config
 import (
 	"fmt"
 	"path/filepath"
+
+	"github.com/juju/persistent-cookiejar"
 )
 
 // Config holds settings to be used by a client or daemon
@@ -23,6 +25,8 @@ type Config struct {
 
 	// The UserAgent to pass for all queries
 	UserAgent string `yaml:"-"`
+
+	cookiejar *cookiejar.Jar
 }
 
 // ConfigPath returns a joined path of the configuration directory and passed arguments
@@ -37,3 +41,25 @@ func (c *Config) ConfigPath(paths ...string) string {
 func (c *Config) ServerCertPath(remote string) string {
 	return c.ConfigPath("servercerts", fmt.Sprintf("%s.crt", remote))
 }
+
+// SaveCookies saves cookies to file
+func (c *Config) SaveCookies() {
+	if c.cookiejar != nil {
+		c.cookiejar.Save()
+	}
+}
+
+// NewConfig returns a Config, optionally using default remotes.
+func NewConfig(configDir string, defaults bool) *Config {
+	config := &Config{ConfigDir: configDir}
+	if defaults {
+		config.Remotes = DefaultRemotes
+		config.DefaultRemote = "local"
+	}
+	if configDir != "" {
+		config.cookiejar, _ = cookiejar.New(
+			&cookiejar.Options{
+				Filename: filepath.Join(configDir, "cookies")})
+	}
+	return config
+}
diff --git a/lxc/config/default.go b/lxc/config/default.go
index b16af972c..a6fe876f9 100644
--- a/lxc/config/default.go
+++ b/lxc/config/default.go
@@ -44,9 +44,3 @@ var DefaultRemotes = map[string]Remote{
 	"ubuntu":       UbuntuRemote,
 	"ubuntu-daily": UbuntuDailyRemote,
 }
-
-// DefaultConfig is the default configuration
-var DefaultConfig = Config{
-	Remotes:       DefaultRemotes,
-	DefaultRemote: "local",
-}
diff --git a/lxc/config/file.go b/lxc/config/file.go
index 716277445..86a707e79 100644
--- a/lxc/config/file.go
+++ b/lxc/config/file.go
@@ -21,24 +21,30 @@ func LoadConfig(path string) (*Config, error) {
 	}
 
 	// Decode the yaml document
-	c := Config{}
+	c := NewConfig(filepath.Dir(path), false)
 	err = yaml.Unmarshal(content, &c)
 	if err != nil {
 		return nil, fmt.Errorf("Unable to decode the configuration: %v", err)
 	}
 
+	for k, r := range c.Remotes {
+		if !r.Public && r.AuthType == "" {
+			r.AuthType = "tls"
+			c.Remotes[k] = r
+		}
+	}
+
 	// Set default values
 	if c.Remotes == nil {
 		c.Remotes = make(map[string]Remote)
 	}
-	c.ConfigDir = filepath.Dir(path)
 
 	// Apply the static remotes
 	for k, v := range StaticRemotes {
 		c.Remotes[k] = v
 	}
 
-	return &c, nil
+	return c, nil
 }
 
 // SaveConfig writes the provided configuration to the config file.
diff --git a/lxc/config/remote.go b/lxc/config/remote.go
index aaf2095b0..b6cd38ed9 100644
--- a/lxc/config/remote.go
+++ b/lxc/config/remote.go
@@ -14,6 +14,7 @@ type Remote struct {
 	Addr     string `yaml:"addr"`
 	Public   bool   `yaml:"public"`
 	Protocol string `yaml:"protocol,omitempty"`
+	AuthType string `yaml:"auth_type,omitempty"`
 	Static   bool   `yaml:"-"`
 }
 
@@ -133,8 +134,11 @@ func (c *Config) GetImageServer(name string) (lxd.ImageServer, error) {
 }
 
 func (c *Config) getConnectionArgs(name string) (*lxd.ConnectionArgs, error) {
+	remote, _ := c.Remotes[name]
 	args := lxd.ConnectionArgs{
 		UserAgent: c.UserAgent,
+		CookieJar: c.cookiejar,
+		AuthType:  remote.AuthType,
 	}
 
 	// Client certificate
diff --git a/lxc/image.go b/lxc/image.go
index 8b214375b..c660f9d26 100644
--- a/lxc/image.go
+++ b/lxc/image.go
@@ -359,7 +359,7 @@ func (c *imageCmd) run(conf *config.Config, args []string) error {
 		return c.doImageAlias(conf, args)
 
 	case "copy":
-		/* copy [<remote>:]<image> [<rmeote>:]<image> */
+		/* copy [<remote>:]<image> [<remote>:]<image> */
 		if len(args) != 3 {
 			return errArgs
 		}
diff --git a/lxc/main.go b/lxc/main.go
index 7d4dfeef8..e3750981d 100644
--- a/lxc/main.go
+++ b/lxc/main.go
@@ -90,17 +90,19 @@ func run() error {
 	var err error
 
 	if *forceLocal {
-		conf = &config.DefaultConfig
+		conf = config.NewConfig("", true)
 	} else if shared.PathExists(configPath) {
 		conf, err = config.LoadConfig(configPath)
 		if err != nil {
 			return err
 		}
 	} else {
-		conf = &config.DefaultConfig
-		conf.ConfigDir = filepath.Dir(configPath)
+		conf = config.NewConfig(filepath.Dir(configPath), true)
 	}
 
+	// Save cookies on exit
+	defer conf.SaveCookies()
+
 	// Set the user agent
 	conf.UserAgent = version.UserAgent
 
diff --git a/lxc/remote.go b/lxc/remote.go
index a8e3c0888..6fbc779a1 100644
--- a/lxc/remote.go
+++ b/lxc/remote.go
@@ -29,6 +29,7 @@ type remoteCmd struct {
 	password   string
 	public     bool
 	protocol   string
+	authType   string
 }
 
 func (c *remoteCmd) showByDefault() bool {
@@ -41,7 +42,7 @@ func (c *remoteCmd) usage() string {
 
 Manage the list of remote LXD servers.
 
-lxc remote add [<remote>] <IP|FQDN|URL> [--accept-certificate] [--password=PASSWORD] [--public] [--protocol=PROTOCOL]
+lxc remote add [<remote>] <IP|FQDN|URL> [--accept-certificate] [--password=PASSWORD] [--public] [--protocol=PROTOCOL] [--auth-type=AUTH_TYPE]
     Add the remote <remote> at <url>.
 
 lxc remote remove <remote>
@@ -67,6 +68,7 @@ func (c *remoteCmd) flags() {
 	gnuflag.BoolVar(&c.acceptCert, "accept-certificate", false, i18n.G("Accept certificate"))
 	gnuflag.StringVar(&c.password, "password", "", i18n.G("Remote admin password"))
 	gnuflag.StringVar(&c.protocol, "protocol", "", i18n.G("Server protocol (lxd or simplestreams)"))
+	gnuflag.StringVar(&c.authType, "auth-type", "", i18n.G("Server authentication type (tls or macaroons)"))
 	gnuflag.BoolVar(&c.public, "public", false, i18n.G("Public image server"))
 }
 
@@ -122,11 +124,18 @@ func (c *remoteCmd) getRemoteCertificate(address string) (*x509.Certificate, err
 	return resp.TLS.PeerCertificates[0], nil
 }
 
-func (c *remoteCmd) addServer(conf *config.Config, server string, addr string, acceptCert bool, password string, public bool, protocol string) error {
+func (c *remoteCmd) addServer(conf *config.Config, server string, addr string, acceptCert bool, password string, public bool, protocol string, authType string) error {
 	var rScheme string
 	var rHost string
 	var rPort string
 
+	if protocol == "" {
+		protocol = "lxd"
+	}
+	if authType == "" {
+		authType = "tls"
+	}
+
 	// Setup the remotes list
 	if conf.Remotes == nil {
 		conf.Remotes = make(map[string]config.Remote)
@@ -146,6 +155,8 @@ func (c *remoteCmd) addServer(conf *config.Config, server string, addr string, a
 
 		conf.Remotes[server] = config.Remote{Addr: addr, Public: true, Protocol: protocol}
 		return nil
+	} else if protocol != "lxd" {
+		return fmt.Errorf(i18n.G("Invalid protocol: %s"), protocol)
 	}
 
 	// Fix broken URL parser
@@ -202,13 +213,13 @@ func (c *remoteCmd) addServer(conf *config.Config, server string, addr string, a
 	// Finally, actually add the remote, almost...  If the remote is a private
 	// HTTPS server then we need to ensure we have a client certificate before
 	// adding the remote server.
-	if rScheme != "unix" && !public {
+	if rScheme != "unix" && authType == "tls" {
 		err = c.generateClientCertificate(conf)
 		if err != nil {
 			return err
 		}
 	}
-	conf.Remotes[server] = config.Remote{Addr: addr, Protocol: protocol}
+	conf.Remotes[server] = config.Remote{Addr: addr, Protocol: protocol, AuthType: authType}
 
 	// Attempt to connect
 	d, err := conf.GetContainerServer(server)
@@ -267,11 +278,30 @@ func (c *remoteCmd) addServer(conf *config.Config, server string, addr string, a
 		}
 	}
 
-	// Get server information
+	// Get server information with an unauthenticated requrest
+	if authType == "macaroons" {
+		d.RequireAuthenticated(false)
+	}
 	srv, _, err := d.GetServer()
 	if err != nil {
 		return err
 	}
+	if authType == "macaroons" {
+		d.RequireAuthenticated(true)
+	}
+
+	if !srv.Public {
+		validAuth := false
+		for _, method := range srv.AuthMethods {
+			if authType == method {
+				validAuth = true
+				break
+			}
+		}
+		if !validAuth {
+			return fmt.Errorf(i18n.G("Authentication type '%s' not supported by server"), authType)
+		}
+	}
 
 	// Detect a public remote
 	if srv.Public || public {
@@ -284,31 +314,35 @@ func (c *remoteCmd) addServer(conf *config.Config, server string, addr string, a
 		return nil
 	}
 
-	// Prompt for trust password
-	if password == "" {
-		fmt.Printf(i18n.G("Admin password for %s: "), server)
-		pwd, err := terminal.ReadPassword(0)
-		if err != nil {
-			/* We got an error, maybe this isn't a terminal, let's try to
-			 * read it as a file */
-			pwd, err = shared.ReadStdin()
+	if authType == "tls" {
+		// Prompt for trust password
+		if password == "" {
+			fmt.Printf(i18n.G("Admin password for %s: "), server)
+			pwd, err := terminal.ReadPassword(0)
 			if err != nil {
-				return err
+				/* We got an error, maybe this isn't a terminal, let's try to
+				 * read it as a file */
+				pwd, err = shared.ReadStdin()
+				if err != nil {
+					return err
+				}
 			}
+			fmt.Println("")
+			password = string(pwd)
 		}
-		fmt.Println("")
-		password = string(pwd)
-	}
 
-	// Add client certificate to trust store
-	req := api.CertificatesPost{
-		Password: password,
-	}
-	req.Type = "client"
+		// Add client certificate to trust store
+		req := api.CertificatesPost{
+			Password: password,
+		}
+		req.Type = "client"
 
-	err = d.CreateCertificate(req)
-	if err != nil {
-		return err
+		err = d.CreateCertificate(req)
+		if err != nil {
+			return err
+		}
+	} else {
+		d.RequireAuthenticated(true)
 	}
 
 	// And check if trusted now
@@ -355,7 +389,7 @@ func (c *remoteCmd) run(conf *config.Config, args []string) error {
 			return fmt.Errorf(i18n.G("remote %s exists as <%s>"), remote, rc.Addr)
 		}
 
-		err := c.addServer(conf, remote, fqdn, c.acceptCert, c.password, c.public, c.protocol)
+		err := c.addServer(conf, remote, fqdn, c.acceptCert, c.password, c.public, c.protocol, c.authType)
 		if err != nil {
 			delete(conf.Remotes, remote)
 			c.removeCertificate(conf, remote)
@@ -400,12 +434,15 @@ func (c *remoteCmd) run(conf *config.Config, args []string) error {
 			if rc.Protocol == "" {
 				rc.Protocol = "lxd"
 			}
+			if rc.AuthType == "" && !rc.Public {
+				rc.AuthType = "tls"
+			}
 
 			strName := name
 			if name == conf.DefaultRemote {
 				strName = fmt.Sprintf("%s (%s)", name, i18n.G("default"))
 			}
-			data = append(data, []string{strName, rc.Addr, rc.Protocol, strPublic, strStatic})
+			data = append(data, []string{strName, rc.Addr, rc.Protocol, rc.AuthType, strPublic, strStatic})
 		}
 
 		table := tablewriter.NewWriter(os.Stdout)
@@ -416,6 +453,7 @@ func (c *remoteCmd) run(conf *config.Config, args []string) error {
 			i18n.G("NAME"),
 			i18n.G("URL"),
 			i18n.G("PROTOCOL"),
+			i18n.G("AUTH TYPE"),
 			i18n.G("PUBLIC"),
 			i18n.G("STATIC")})
 		sort.Sort(byName(data))
diff --git a/lxd/daemon.go b/lxd/daemon.go
index 985af4221..52166fc8a 100644
--- a/lxd/daemon.go
+++ b/lxd/daemon.go
@@ -1460,7 +1460,7 @@ func (d *Daemon) setupExternalAuthentication(authEndpoint string) error {
 		IdentityClient: idmClient,
 		Authorizer: bakery.ACLAuthorizer{
 			GetACL: func(ctx context.Context, op bakery.Op) ([]string, error) {
-				return []string{"everyone"}, nil
+				return []string{bakery.Everyone}, nil
 			},
 		},
 	})
diff --git a/po/de.po b/po/de.po
index c9bc552dc..b32e78777 100644
--- a/po/de.po
+++ b/po/de.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: LXD\n"
 "Report-Msgid-Bugs-To: lxc-devel at lists.linuxcontainers.org\n"
-"POT-Creation-Date: 2017-07-27 18:42-0400\n"
+"POT-Creation-Date: 2017-07-28 18:33+0200\n"
 "PO-Revision-Date: 2017-02-14 17:11+0000\n"
 "Last-Translator: Tim Rose <tim at netlope.de>\n"
 "Language-Team: German <https://hosted.weblate.org/projects/linux-containers/"
@@ -295,11 +295,15 @@ msgstr ""
 msgid "ARCHITECTURE"
 msgstr ""
 
-#: lxc/remote.go:67
+#: lxc/remote.go:456
+msgid "AUTH TYPE"
+msgstr ""
+
+#: lxc/remote.go:68
 msgid "Accept certificate"
 msgstr "Akzeptiere Zertifikat"
 
-#: lxc/remote.go:289
+#: lxc/remote.go:320
 #, c-format
 msgid "Admin password for %s: "
 msgstr "Administrator Passwort für %s: "
@@ -314,6 +318,11 @@ msgstr "Aliasse:\n"
 msgid "Architecture: %s"
 msgstr "Architektur: %s\n"
 
+#: lxc/remote.go:302
+#, c-format
+msgid "Authentication type '%s' not supported by server"
+msgstr ""
+
 #: lxc/image.go:601
 #, c-format
 msgid "Auto update: %s"
@@ -372,12 +381,12 @@ msgstr ""
 msgid "Cannot provide container name to list"
 msgstr ""
 
-#: lxc/remote.go:236
+#: lxc/remote.go:247
 #, fuzzy, c-format
 msgid "Certificate fingerprint: %s"
 msgstr "Fingerabdruck des Zertifikats: % x\n"
 
-#: lxc/remote.go:324
+#: lxc/remote.go:359
 msgid "Client certificate stored at server: "
 msgstr "Gespeichertes Nutzerzertifikat auf dem Server: "
 
@@ -436,12 +445,12 @@ msgstr "Herunterfahren des Containers erzwingen."
 msgid "Copying the image: %s"
 msgstr ""
 
-#: lxc/remote.go:78
+#: lxc/remote.go:80
 #, fuzzy
 msgid "Could not create config dir"
 msgstr "Kann Verzeichnis für Zertifikate auf dem Server nicht erstellen"
 
-#: lxc/remote.go:251
+#: lxc/remote.go:262
 msgid "Could not create server cert dir"
 msgstr "Kann Verzeichnis für Zertifikate auf dem Server nicht erstellen"
 
@@ -630,7 +639,7 @@ msgstr ""
 msgid "Format (csv|json|table|yaml)"
 msgstr ""
 
-#: lxc/remote.go:89
+#: lxc/remote.go:91
 #, fuzzy
 msgid "Generating a client certificate. This may take a minute..."
 msgstr "Generiere Nutzerzertifikat. Dies kann wenige Minuten dauern...\n"
@@ -647,7 +656,7 @@ msgstr ""
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:163
+#: lxc/main.go:165
 msgid "If this is your first time using LXD, you should also run: lxd init"
 msgstr ""
 
@@ -685,7 +694,7 @@ msgstr ""
 msgid "Instance type"
 msgstr ""
 
-#: lxc/remote.go:159
+#: lxc/remote.go:170
 #, c-format
 msgid "Invalid URL scheme \"%s\" in \"%s\""
 msgstr ""
@@ -704,6 +713,11 @@ msgstr ""
 msgid "Invalid path %s"
 msgstr "Ungültiges Ziel %s"
 
+#: lxc/remote.go:159
+#, fuzzy, c-format
+msgid "Invalid protocol: %s"
+msgstr "Ungültiges Ziel %s"
+
 #: lxc/file.go:457
 #, c-format
 msgid "Invalid source %s"
@@ -795,12 +809,12 @@ msgstr ""
 msgid "Must supply container name for: "
 msgstr "der Name des Ursprung Containers muss angegeben werden"
 
-#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:414
+#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:453
 #: lxc/storage.go:653 lxc/storage.go:748
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:490 lxc/remote.go:388 lxc/remote.go:393
+#: lxc/network.go:490 lxc/remote.go:424 lxc/remote.go:429
 msgid "NO"
 msgstr ""
 
@@ -855,7 +869,7 @@ msgstr "Kein Fingerabdruck angegeben."
 msgid "Only \"custom\" volumes can be attached to containers."
 msgstr ""
 
-#: lxc/remote.go:144
+#: lxc/remote.go:153
 msgid "Only https URLs are supported for simplestreams"
 msgstr ""
 
@@ -867,7 +881,7 @@ msgstr ""
 msgid "Only managed networks can be modified."
 msgstr ""
 
-#: lxc/help.go:71 lxc/main.go:130 lxc/main.go:187
+#: lxc/help.go:71 lxc/main.go:132 lxc/main.go:189
 msgid "Options:"
 msgstr ""
 
@@ -887,11 +901,11 @@ msgstr ""
 msgid "PROFILES"
 msgstr ""
 
-#: lxc/remote.go:416
+#: lxc/remote.go:455
 msgid "PROTOCOL"
 msgstr ""
 
-#: lxc/image.go:230 lxc/remote.go:417
+#: lxc/image.go:230 lxc/remote.go:457
 msgid "PUBLIC"
 msgstr ""
 
@@ -913,7 +927,7 @@ msgstr "Alternatives config Verzeichnis."
 msgid "Path to an alternate server directory"
 msgstr "Alternatives config Verzeichnis."
 
-#: lxc/main.go:226
+#: lxc/main.go:228
 #, fuzzy
 msgid "Pause containers."
 msgstr "kann nicht zum selben Container Namen kopieren"
@@ -993,7 +1007,7 @@ msgstr "Profil %s erstellt\n"
 msgid "Properties:"
 msgstr "Eigenschaften:\n"
 
-#: lxc/remote.go:70
+#: lxc/remote.go:72
 msgid "Public image server"
 msgstr ""
 
@@ -1011,7 +1025,7 @@ msgstr ""
 msgid "Refreshing the image: %s"
 msgstr ""
 
-#: lxc/remote.go:68
+#: lxc/remote.go:69
 msgid "Remote admin password"
 msgstr "Entferntes Administrator Passwort"
 
@@ -1038,7 +1052,7 @@ msgstr ""
 msgid "Resources:"
 msgstr ""
 
-#: lxc/main.go:234
+#: lxc/main.go:236
 #, fuzzy
 msgid "Restart containers."
 msgstr "kann nicht zum selben Container Namen kopieren"
@@ -1064,7 +1078,7 @@ msgstr ""
 msgid "STATE"
 msgstr ""
 
-#: lxc/remote.go:418
+#: lxc/remote.go:458
 msgid "STATIC"
 msgstr ""
 
@@ -1072,16 +1086,21 @@ msgstr ""
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/remote.go:244
+#: lxc/remote.go:71
+msgid "Server authentication type (tls or macaroons)"
+msgstr ""
+
+#: lxc/remote.go:255
 msgid "Server certificate NACKed by user"
 msgstr "Server Zertifikat vom Benutzer nicht akzeptiert"
 
-#: lxc/remote.go:321
-msgid "Server doesn't trust us after adding our cert"
+#: lxc/remote.go:355
+#, fuzzy
+msgid "Server doesn't trust us after authentication"
 msgstr ""
 "Der Server vertraut uns nicht nachdem er unser Zertifikat hinzugefügt hat"
 
-#: lxc/remote.go:69
+#: lxc/remote.go:70
 msgid "Server protocol (lxd or simplestreams)"
 msgstr ""
 
@@ -1131,7 +1150,7 @@ msgstr "Anhalten des Containers fehlgeschlagen!"
 msgid "Source:"
 msgstr ""
 
-#: lxc/main.go:244
+#: lxc/main.go:246
 #, fuzzy
 msgid "Start containers."
 msgstr "kann nicht zum selben Container Namen kopieren"
@@ -1146,7 +1165,7 @@ msgstr ""
 msgid "Status: %s"
 msgstr ""
 
-#: lxc/main.go:250
+#: lxc/main.go:252
 #, fuzzy
 msgid "Stop containers."
 msgstr "Anhalten des Containers fehlgeschlagen!"
@@ -1280,7 +1299,7 @@ msgstr ""
 msgid "To create a new network, use: lxc network create"
 msgstr ""
 
-#: lxc/main.go:164
+#: lxc/main.go:166
 msgid "To start your first container, try: lxc launch ubuntu:16.04"
 msgstr ""
 
@@ -1315,7 +1334,7 @@ msgstr ""
 msgid "UPLOAD DATE"
 msgstr ""
 
-#: lxc/remote.go:415
+#: lxc/remote.go:454
 msgid "URL"
 msgstr ""
 
@@ -1327,7 +1346,7 @@ msgstr ""
 msgid "Unable to find help2man."
 msgstr ""
 
-#: lxc/remote.go:119
+#: lxc/remote.go:121
 msgid "Unable to read remote TLS certificate"
 msgstr ""
 
@@ -2095,7 +2114,7 @@ msgid ""
 "Publish containers as images."
 msgstr ""
 
-#: lxc/remote.go:39
+#: lxc/remote.go:40
 #, fuzzy
 msgid ""
 "Usage: lxc remote <subcommand> [options]\n"
@@ -2103,7 +2122,7 @@ msgid ""
 "Manage the list of remote LXD servers.\n"
 "\n"
 "lxc remote add [<remote>] <IP|FQDN|URL> [--accept-certificate] [--"
-"password=PASSWORD] [--public] [--protocol=PROTOCOL]\n"
+"password=PASSWORD] [--public] [--protocol=PROTOCOL] [--auth-type=AUTH_TYPE]\n"
 "    Add the remote <remote> at <url>.\n"
 "\n"
 "lxc remote remove <remote>\n"
@@ -2297,7 +2316,7 @@ msgstr ""
 msgid "Whether or not to snapshot the container's running state"
 msgstr "Zustand des laufenden Containers sichern oder nicht"
 
-#: lxc/network.go:492 lxc/remote.go:390 lxc/remote.go:395
+#: lxc/network.go:492 lxc/remote.go:426 lxc/remote.go:431
 msgid "YES"
 msgstr ""
 
@@ -2319,7 +2338,7 @@ msgstr "der Name des Ursprung Containers muss angegeben werden"
 msgid "`lxc config profile` is deprecated, please use `lxc profile`"
 msgstr ""
 
-#: lxc/remote.go:378
+#: lxc/remote.go:414
 msgid "can't remove the default remote"
 msgstr ""
 
@@ -2327,7 +2346,7 @@ msgstr ""
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr ""
 
-#: lxc/remote.go:404
+#: lxc/remote.go:443
 msgid "default"
 msgstr ""
 
@@ -2343,12 +2362,12 @@ msgstr ""
 msgid "enabled"
 msgstr ""
 
-#: lxc/action.go:134 lxc/main.go:29 lxc/main.go:183
+#: lxc/action.go:134 lxc/main.go:29 lxc/main.go:185
 #, fuzzy, c-format
 msgid "error: %v"
 msgstr "Fehler: %v\n"
 
-#: lxc/help.go:37 lxc/main.go:124
+#: lxc/help.go:37 lxc/main.go:126
 #, fuzzy, c-format
 msgid "error: unknown command: %s"
 msgstr "Fehler: unbekannter Befehl: %s\n"
@@ -2357,12 +2376,12 @@ msgstr "Fehler: unbekannter Befehl: %s\n"
 msgid "no"
 msgstr ""
 
-#: lxc/remote.go:237
+#: lxc/remote.go:248
 #, fuzzy
 msgid "ok (y/n)?"
 msgstr "OK (y/n)? "
 
-#: lxc/main.go:355 lxc/main.go:359
+#: lxc/main.go:357 lxc/main.go:361
 #, c-format
 msgid "processing aliases failed %s\n"
 msgstr ""
@@ -2371,22 +2390,22 @@ msgstr ""
 msgid "recursive edit doesn't make sense :("
 msgstr ""
 
-#: lxc/remote.go:440
+#: lxc/remote.go:480
 #, c-format
 msgid "remote %s already exists"
 msgstr "entfernte Instanz %s existiert bereits"
 
-#: lxc/remote.go:370 lxc/remote.go:432 lxc/remote.go:467 lxc/remote.go:483
+#: lxc/remote.go:406 lxc/remote.go:472 lxc/remote.go:507 lxc/remote.go:523
 #, c-format
 msgid "remote %s doesn't exist"
 msgstr "entfernte Instanz %s existiert nicht"
 
-#: lxc/remote.go:353
+#: lxc/remote.go:389
 #, c-format
 msgid "remote %s exists as <%s>"
 msgstr "entfernte Instanz %s existiert als <%s>"
 
-#: lxc/remote.go:374 lxc/remote.go:436 lxc/remote.go:471
+#: lxc/remote.go:410 lxc/remote.go:476 lxc/remote.go:511
 #, c-format
 msgid "remote %s is static and cannot be modified"
 msgstr ""
@@ -2404,7 +2423,7 @@ msgstr ""
 msgid "taken at %s"
 msgstr ""
 
-#: lxc/main.go:286
+#: lxc/main.go:288
 msgid "wrong number of subcommand arguments"
 msgstr "falsche Anzahl an Parametern für Unterbefehl"
 
diff --git a/po/el.po b/po/el.po
index eb1113eb4..0885ef347 100644
--- a/po/el.po
+++ b/po/el.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: lxd\n"
 "Report-Msgid-Bugs-To: lxc-devel at lists.linuxcontainers.org\n"
-"POT-Creation-Date: 2017-07-27 18:42-0400\n"
+"POT-Creation-Date: 2017-07-28 18:33+0200\n"
 "PO-Revision-Date: 2017-02-14 08:00+0000\n"
 "Last-Translator: Simos Xenitellis <simos.65 at gmail.com>\n"
 "Language-Team: Greek <https://hosted.weblate.org/projects/linux-containers/"
@@ -190,11 +190,15 @@ msgstr ""
 msgid "ARCHITECTURE"
 msgstr ""
 
-#: lxc/remote.go:67
+#: lxc/remote.go:456
+msgid "AUTH TYPE"
+msgstr ""
+
+#: lxc/remote.go:68
 msgid "Accept certificate"
 msgstr ""
 
-#: lxc/remote.go:289
+#: lxc/remote.go:320
 #, c-format
 msgid "Admin password for %s: "
 msgstr ""
@@ -208,6 +212,11 @@ msgstr ""
 msgid "Architecture: %s"
 msgstr ""
 
+#: lxc/remote.go:302
+#, c-format
+msgid "Authentication type '%s' not supported by server"
+msgstr ""
+
 #: lxc/image.go:601
 #, c-format
 msgid "Auto update: %s"
@@ -266,12 +275,12 @@ msgstr ""
 msgid "Cannot provide container name to list"
 msgstr ""
 
-#: lxc/remote.go:236
+#: lxc/remote.go:247
 #, c-format
 msgid "Certificate fingerprint: %s"
 msgstr ""
 
-#: lxc/remote.go:324
+#: lxc/remote.go:359
 msgid "Client certificate stored at server: "
 msgstr ""
 
@@ -328,11 +337,11 @@ msgstr ""
 msgid "Copying the image: %s"
 msgstr ""
 
-#: lxc/remote.go:78
+#: lxc/remote.go:80
 msgid "Could not create config dir"
 msgstr ""
 
-#: lxc/remote.go:251
+#: lxc/remote.go:262
 msgid "Could not create server cert dir"
 msgstr ""
 
@@ -516,7 +525,7 @@ msgstr ""
 msgid "Format (csv|json|table|yaml)"
 msgstr ""
 
-#: lxc/remote.go:89
+#: lxc/remote.go:91
 msgid "Generating a client certificate. This may take a minute..."
 msgstr ""
 
@@ -532,7 +541,7 @@ msgstr ""
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:163
+#: lxc/main.go:165
 msgid "If this is your first time using LXD, you should also run: lxd init"
 msgstr ""
 
@@ -569,7 +578,7 @@ msgstr ""
 msgid "Instance type"
 msgstr ""
 
-#: lxc/remote.go:159
+#: lxc/remote.go:170
 #, c-format
 msgid "Invalid URL scheme \"%s\" in \"%s\""
 msgstr ""
@@ -587,6 +596,11 @@ msgstr ""
 msgid "Invalid path %s"
 msgstr ""
 
+#: lxc/remote.go:159
+#, c-format
+msgid "Invalid protocol: %s"
+msgstr ""
+
 #: lxc/file.go:457
 #, c-format
 msgid "Invalid source %s"
@@ -675,12 +689,12 @@ msgstr ""
 msgid "Must supply container name for: "
 msgstr ""
 
-#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:414
+#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:453
 #: lxc/storage.go:653 lxc/storage.go:748
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:490 lxc/remote.go:388 lxc/remote.go:393
+#: lxc/network.go:490 lxc/remote.go:424 lxc/remote.go:429
 msgid "NO"
 msgstr ""
 
@@ -732,7 +746,7 @@ msgstr ""
 msgid "Only \"custom\" volumes can be attached to containers."
 msgstr ""
 
-#: lxc/remote.go:144
+#: lxc/remote.go:153
 msgid "Only https URLs are supported for simplestreams"
 msgstr ""
 
@@ -744,7 +758,7 @@ msgstr ""
 msgid "Only managed networks can be modified."
 msgstr ""
 
-#: lxc/help.go:71 lxc/main.go:130 lxc/main.go:187
+#: lxc/help.go:71 lxc/main.go:132 lxc/main.go:189
 msgid "Options:"
 msgstr ""
 
@@ -764,11 +778,11 @@ msgstr ""
 msgid "PROFILES"
 msgstr ""
 
-#: lxc/remote.go:416
+#: lxc/remote.go:455
 msgid "PROTOCOL"
 msgstr ""
 
-#: lxc/image.go:230 lxc/remote.go:417
+#: lxc/image.go:230 lxc/remote.go:457
 msgid "PUBLIC"
 msgstr ""
 
@@ -788,7 +802,7 @@ msgstr ""
 msgid "Path to an alternate server directory"
 msgstr ""
 
-#: lxc/main.go:226
+#: lxc/main.go:228
 msgid "Pause containers."
 msgstr ""
 
@@ -865,7 +879,7 @@ msgstr ""
 msgid "Properties:"
 msgstr ""
 
-#: lxc/remote.go:70
+#: lxc/remote.go:72
 msgid "Public image server"
 msgstr ""
 
@@ -883,7 +897,7 @@ msgstr ""
 msgid "Refreshing the image: %s"
 msgstr ""
 
-#: lxc/remote.go:68
+#: lxc/remote.go:69
 msgid "Remote admin password"
 msgstr ""
 
@@ -909,7 +923,7 @@ msgstr ""
 msgid "Resources:"
 msgstr ""
 
-#: lxc/main.go:234
+#: lxc/main.go:236
 msgid "Restart containers."
 msgstr ""
 
@@ -934,7 +948,7 @@ msgstr ""
 msgid "STATE"
 msgstr ""
 
-#: lxc/remote.go:418
+#: lxc/remote.go:458
 msgid "STATIC"
 msgstr ""
 
@@ -942,15 +956,19 @@ msgstr ""
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/remote.go:244
+#: lxc/remote.go:71
+msgid "Server authentication type (tls or macaroons)"
+msgstr ""
+
+#: lxc/remote.go:255
 msgid "Server certificate NACKed by user"
 msgstr ""
 
-#: lxc/remote.go:321
-msgid "Server doesn't trust us after adding our cert"
+#: lxc/remote.go:355
+msgid "Server doesn't trust us after authentication"
 msgstr ""
 
-#: lxc/remote.go:69
+#: lxc/remote.go:70
 msgid "Server protocol (lxd or simplestreams)"
 msgstr ""
 
@@ -1000,7 +1018,7 @@ msgstr ""
 msgid "Source:"
 msgstr ""
 
-#: lxc/main.go:244
+#: lxc/main.go:246
 msgid "Start containers."
 msgstr ""
 
@@ -1014,7 +1032,7 @@ msgstr ""
 msgid "Status: %s"
 msgstr ""
 
-#: lxc/main.go:250
+#: lxc/main.go:252
 msgid "Stop containers."
 msgstr ""
 
@@ -1139,7 +1157,7 @@ msgstr ""
 msgid "To create a new network, use: lxc network create"
 msgstr ""
 
-#: lxc/main.go:164
+#: lxc/main.go:166
 msgid "To start your first container, try: lxc launch ubuntu:16.04"
 msgstr ""
 
@@ -1174,7 +1192,7 @@ msgstr ""
 msgid "UPLOAD DATE"
 msgstr ""
 
-#: lxc/remote.go:415
+#: lxc/remote.go:454
 msgid "URL"
 msgstr ""
 
@@ -1186,7 +1204,7 @@ msgstr ""
 msgid "Unable to find help2man."
 msgstr ""
 
-#: lxc/remote.go:119
+#: lxc/remote.go:121
 msgid "Unable to read remote TLS certificate"
 msgstr ""
 
@@ -1816,14 +1834,14 @@ msgid ""
 "Publish containers as images."
 msgstr ""
 
-#: lxc/remote.go:39
+#: lxc/remote.go:40
 msgid ""
 "Usage: lxc remote <subcommand> [options]\n"
 "\n"
 "Manage the list of remote LXD servers.\n"
 "\n"
 "lxc remote add [<remote>] <IP|FQDN|URL> [--accept-certificate] [--"
-"password=PASSWORD] [--public] [--protocol=PROTOCOL]\n"
+"password=PASSWORD] [--public] [--protocol=PROTOCOL] [--auth-type=AUTH_TYPE]\n"
 "    Add the remote <remote> at <url>.\n"
 "\n"
 "lxc remote remove <remote>\n"
@@ -1995,7 +2013,7 @@ msgstr ""
 msgid "Whether or not to snapshot the container's running state"
 msgstr ""
 
-#: lxc/network.go:492 lxc/remote.go:390 lxc/remote.go:395
+#: lxc/network.go:492 lxc/remote.go:426 lxc/remote.go:431
 msgid "YES"
 msgstr ""
 
@@ -2015,7 +2033,7 @@ msgstr ""
 msgid "`lxc config profile` is deprecated, please use `lxc profile`"
 msgstr ""
 
-#: lxc/remote.go:378
+#: lxc/remote.go:414
 msgid "can't remove the default remote"
 msgstr ""
 
@@ -2023,7 +2041,7 @@ msgstr ""
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr ""
 
-#: lxc/remote.go:404
+#: lxc/remote.go:443
 msgid "default"
 msgstr ""
 
@@ -2039,12 +2057,12 @@ msgstr ""
 msgid "enabled"
 msgstr ""
 
-#: lxc/action.go:134 lxc/main.go:29 lxc/main.go:183
+#: lxc/action.go:134 lxc/main.go:29 lxc/main.go:185
 #, c-format
 msgid "error: %v"
 msgstr ""
 
-#: lxc/help.go:37 lxc/main.go:124
+#: lxc/help.go:37 lxc/main.go:126
 #, c-format
 msgid "error: unknown command: %s"
 msgstr ""
@@ -2053,11 +2071,11 @@ msgstr ""
 msgid "no"
 msgstr ""
 
-#: lxc/remote.go:237
+#: lxc/remote.go:248
 msgid "ok (y/n)?"
 msgstr ""
 
-#: lxc/main.go:355 lxc/main.go:359
+#: lxc/main.go:357 lxc/main.go:361
 #, c-format
 msgid "processing aliases failed %s\n"
 msgstr ""
@@ -2066,22 +2084,22 @@ msgstr ""
 msgid "recursive edit doesn't make sense :("
 msgstr ""
 
-#: lxc/remote.go:440
+#: lxc/remote.go:480
 #, c-format
 msgid "remote %s already exists"
 msgstr ""
 
-#: lxc/remote.go:370 lxc/remote.go:432 lxc/remote.go:467 lxc/remote.go:483
+#: lxc/remote.go:406 lxc/remote.go:472 lxc/remote.go:507 lxc/remote.go:523
 #, c-format
 msgid "remote %s doesn't exist"
 msgstr ""
 
-#: lxc/remote.go:353
+#: lxc/remote.go:389
 #, c-format
 msgid "remote %s exists as <%s>"
 msgstr ""
 
-#: lxc/remote.go:374 lxc/remote.go:436 lxc/remote.go:471
+#: lxc/remote.go:410 lxc/remote.go:476 lxc/remote.go:511
 #, c-format
 msgid "remote %s is static and cannot be modified"
 msgstr ""
@@ -2099,7 +2117,7 @@ msgstr ""
 msgid "taken at %s"
 msgstr ""
 
-#: lxc/main.go:286
+#: lxc/main.go:288
 msgid "wrong number of subcommand arguments"
 msgstr ""
 
diff --git a/po/fr.po b/po/fr.po
index 874436957..e87aac8bb 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: LXD\n"
 "Report-Msgid-Bugs-To: lxc-devel at lists.linuxcontainers.org\n"
-"POT-Creation-Date: 2017-07-27 18:42-0400\n"
+"POT-Creation-Date: 2017-07-28 18:33+0200\n"
 "PO-Revision-Date: 2017-06-07 15:24+0000\n"
 "Last-Translator: Stéphane Graber <stgraber at stgraber.org>\n"
 "Language-Team: French <https://hosted.weblate.org/projects/linux-containers/"
@@ -286,11 +286,16 @@ msgstr "ARCH"
 msgid "ARCHITECTURE"
 msgstr "ARCHITECTURE"
 
-#: lxc/remote.go:67
+#: lxc/remote.go:456
+#, fuzzy
+msgid "AUTH TYPE"
+msgstr "TYPE"
+
+#: lxc/remote.go:68
 msgid "Accept certificate"
 msgstr "Accepter le certificat"
 
-#: lxc/remote.go:289
+#: lxc/remote.go:320
 #, c-format
 msgid "Admin password for %s: "
 msgstr "Mot de passe administrateur pour %s : "
@@ -304,6 +309,11 @@ msgstr "Alias :"
 msgid "Architecture: %s"
 msgstr "Architecture : %s"
 
+#: lxc/remote.go:302
+#, c-format
+msgid "Authentication type '%s' not supported by server"
+msgstr ""
+
 #: lxc/image.go:601
 #, c-format
 msgid "Auto update: %s"
@@ -364,12 +374,12 @@ msgstr ""
 msgid "Cannot provide container name to list"
 msgstr "Impossible de fournir le nom du conteneur à lister"
 
-#: lxc/remote.go:236
+#: lxc/remote.go:247
 #, fuzzy, c-format
 msgid "Certificate fingerprint: %s"
 msgstr "Empreinte du certificat : %x"
 
-#: lxc/remote.go:324
+#: lxc/remote.go:359
 msgid "Client certificate stored at server: "
 msgstr "Certificat client enregistré sur le serveur : "
 
@@ -427,12 +437,12 @@ msgstr "Forcer le conteneur à s'arrêter"
 msgid "Copying the image: %s"
 msgstr "Copie de l'image : %s"
 
-#: lxc/remote.go:78
+#: lxc/remote.go:80
 #, fuzzy
 msgid "Could not create config dir"
 msgstr "Impossible de créer le dossier de stockage des certificats serveurs"
 
-#: lxc/remote.go:251
+#: lxc/remote.go:262
 msgid "Could not create server cert dir"
 msgstr "Impossible de créer le dossier de stockage des certificats serveurs"
 
@@ -619,7 +629,7 @@ msgstr "Forcer l'utilisation de la socket unix locale"
 msgid "Format (csv|json|table|yaml)"
 msgstr ""
 
-#: lxc/remote.go:89
+#: lxc/remote.go:91
 msgid "Generating a client certificate. This may take a minute..."
 msgstr "Génération d'un certificat client. Ceci peut prendre une minute…"
 
@@ -635,7 +645,7 @@ msgstr "IPv6"
 msgid "ISSUE DATE"
 msgstr "DATE D'ÉMISSION"
 
-#: lxc/main.go:163
+#: lxc/main.go:165
 #, fuzzy
 msgid "If this is your first time using LXD, you should also run: lxd init"
 msgstr ""
@@ -677,7 +687,7 @@ msgstr "Image copiée avec succès !"
 msgid "Instance type"
 msgstr ""
 
-#: lxc/remote.go:159
+#: lxc/remote.go:170
 #, c-format
 msgid "Invalid URL scheme \"%s\" in \"%s\""
 msgstr "Schème d'URL invalide \"%s\" in \"%s\""
@@ -695,6 +705,11 @@ msgstr "Clé de configuration invalide"
 msgid "Invalid path %s"
 msgstr "Cible invalide %s"
 
+#: lxc/remote.go:159
+#, fuzzy, c-format
+msgid "Invalid protocol: %s"
+msgstr "Cible invalide %s"
+
 #: lxc/file.go:457
 #, c-format
 msgid "Invalid source %s"
@@ -785,12 +800,12 @@ msgstr ""
 msgid "Must supply container name for: "
 msgstr "Vous devez fournir le nom d'un conteneur pour : "
 
-#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:414
+#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:453
 #: lxc/storage.go:653 lxc/storage.go:748
 msgid "NAME"
 msgstr "NOM"
 
-#: lxc/network.go:490 lxc/remote.go:388 lxc/remote.go:393
+#: lxc/network.go:490 lxc/remote.go:424 lxc/remote.go:429
 msgid "NO"
 msgstr "NON"
 
@@ -843,7 +858,7 @@ msgstr "Aucune empreinte n'a été indiquée."
 msgid "Only \"custom\" volumes can be attached to containers."
 msgstr "Seul les volumes \"personnalisés\" peuvent être attaché aux conteneurs"
 
-#: lxc/remote.go:144
+#: lxc/remote.go:153
 msgid "Only https URLs are supported for simplestreams"
 msgstr "Seules les URLs https sont supportées par simplestreams"
 
@@ -855,7 +870,7 @@ msgstr "Seul https:// est supporté par l'import d'images distantes."
 msgid "Only managed networks can be modified."
 msgstr "Seuls les réseaux gérés par LXD peuvent être modifiés."
 
-#: lxc/help.go:71 lxc/main.go:130 lxc/main.go:187
+#: lxc/help.go:71 lxc/main.go:132 lxc/main.go:189
 msgid "Options:"
 msgstr "Options :"
 
@@ -875,11 +890,11 @@ msgstr "PID"
 msgid "PROFILES"
 msgstr "PROFILS"
 
-#: lxc/remote.go:416
+#: lxc/remote.go:455
 msgid "PROTOCOL"
 msgstr "PROTOCOLE"
 
-#: lxc/image.go:230 lxc/remote.go:417
+#: lxc/image.go:230 lxc/remote.go:457
 msgid "PUBLIC"
 msgstr "PUBLIC"
 
@@ -899,7 +914,7 @@ msgstr "Chemin vers un dossier de configuration client alternatif"
 msgid "Path to an alternate server directory"
 msgstr "Chemin vers un dossier de configuration serveur alternatif"
 
-#: lxc/main.go:226
+#: lxc/main.go:228
 #, fuzzy
 msgid "Pause containers."
 msgstr "Création du conteneur"
@@ -977,7 +992,7 @@ msgstr "Profils : %s"
 msgid "Properties:"
 msgstr "Propriétés :"
 
-#: lxc/remote.go:70
+#: lxc/remote.go:72
 msgid "Public image server"
 msgstr "Serveur d'images public"
 
@@ -995,7 +1010,7 @@ msgstr "Pousser ou récupérer des fichiers récursivement"
 msgid "Refreshing the image: %s"
 msgstr "Récupération de l'image : %s"
 
-#: lxc/remote.go:68
+#: lxc/remote.go:69
 msgid "Remote admin password"
 msgstr "Mot de passe de l'administrateur distant"
 
@@ -1022,7 +1037,7 @@ msgstr "Requérir une confirmation de l'utilisateur"
 msgid "Resources:"
 msgstr "Ressources :"
 
-#: lxc/main.go:234
+#: lxc/main.go:236
 #, fuzzy
 msgid "Restart containers."
 msgstr "Création du conteneur"
@@ -1048,7 +1063,7 @@ msgstr "SOURCE"
 msgid "STATE"
 msgstr "ÉTAT"
 
-#: lxc/remote.go:418
+#: lxc/remote.go:458
 msgid "STATIC"
 msgstr "STATIQUE"
 
@@ -1056,16 +1071,21 @@ msgstr "STATIQUE"
 msgid "STORAGE POOL"
 msgstr "ENSEMBLE DE STOCKAGE"
 
-#: lxc/remote.go:244
+#: lxc/remote.go:71
+msgid "Server authentication type (tls or macaroons)"
+msgstr ""
+
+#: lxc/remote.go:255
 msgid "Server certificate NACKed by user"
 msgstr "Certificat serveur rejeté par l'utilisateur"
 
-#: lxc/remote.go:321
-msgid "Server doesn't trust us after adding our cert"
+#: lxc/remote.go:355
+#, fuzzy
+msgid "Server doesn't trust us after authentication"
 msgstr ""
 "Le serveur ne nous fait pas confiance après l'ajout de notre certificat"
 
-#: lxc/remote.go:69
+#: lxc/remote.go:70
 msgid "Server protocol (lxd or simplestreams)"
 msgstr "Protocole du serveur (lxd ou simplestreams)"
 
@@ -1115,7 +1135,7 @@ msgstr "L'arrêt du conteneur a échoué !"
 msgid "Source:"
 msgstr "Source :"
 
-#: lxc/main.go:244
+#: lxc/main.go:246
 #, fuzzy
 msgid "Start containers."
 msgstr "Création du conteneur"
@@ -1130,7 +1150,7 @@ msgstr "Démarrage de %s"
 msgid "Status: %s"
 msgstr "État : %s"
 
-#: lxc/main.go:250
+#: lxc/main.go:252
 #, fuzzy
 msgid "Stop containers."
 msgstr "L'arrêt du conteneur a échoué !"
@@ -1267,7 +1287,7 @@ msgstr "Pour attacher un réseau à un conteneur, utiliser : lxc network attach"
 msgid "To create a new network, use: lxc network create"
 msgstr "Pour créer un réseau, utiliser : lxc network create"
 
-#: lxc/main.go:164
+#: lxc/main.go:166
 msgid "To start your first container, try: lxc launch ubuntu:16.04"
 msgstr ""
 "Pour démarrer votre premier conteneur, essayer : lxc launch ubuntu:16.04"
@@ -1303,7 +1323,7 @@ msgstr "Type : persistant"
 msgid "UPLOAD DATE"
 msgstr "DATE DE PUBLICATION"
 
-#: lxc/remote.go:415
+#: lxc/remote.go:454
 msgid "URL"
 msgstr "URL"
 
@@ -1315,7 +1335,7 @@ msgstr "UTILISÉ PAR"
 msgid "Unable to find help2man."
 msgstr "Impossible de trouver help2man"
 
-#: lxc/remote.go:119
+#: lxc/remote.go:121
 msgid "Unable to read remote TLS certificate"
 msgstr "Impossible de lire le certificat TLS distant"
 
@@ -2344,7 +2364,7 @@ msgstr ""
 "lxc publish [<remote>:]<container>[/<snapshot>] [<remote>:] [--"
 "alias=ALIAS...] [prop-key=prop-value...]"
 
-#: lxc/remote.go:39
+#: lxc/remote.go:40
 #, fuzzy
 msgid ""
 "Usage: lxc remote <subcommand> [options]\n"
@@ -2352,7 +2372,7 @@ msgid ""
 "Manage the list of remote LXD servers.\n"
 "\n"
 "lxc remote add [<remote>] <IP|FQDN|URL> [--accept-certificate] [--"
-"password=PASSWORD] [--public] [--protocol=PROTOCOL]\n"
+"password=PASSWORD] [--public] [--protocol=PROTOCOL] [--auth-type=AUTH_TYPE]\n"
 "    Add the remote <remote> at <url>.\n"
 "\n"
 "lxc remote remove <remote>\n"
@@ -2578,7 +2598,7 @@ msgstr ""
 msgid "Whether or not to snapshot the container's running state"
 msgstr "Réaliser ou pas l'instantané de l'état de fonctionnement du conteneur"
 
-#: lxc/network.go:492 lxc/remote.go:390 lxc/remote.go:395
+#: lxc/network.go:492 lxc/remote.go:426 lxc/remote.go:431
 msgid "YES"
 msgstr "OUI"
 
@@ -2602,7 +2622,7 @@ msgstr ""
 "La commande `lxc config profile` est dépréciée, merci d'utiliser `lxc "
 "profile`"
 
-#: lxc/remote.go:378
+#: lxc/remote.go:414
 msgid "can't remove the default remote"
 msgstr "impossible de supprimer le serveur distant par défaut"
 
@@ -2610,7 +2630,7 @@ msgstr "impossible de supprimer le serveur distant par défaut"
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr "impossible de spécifier uid/gid/mode en mode récursif"
 
-#: lxc/remote.go:404
+#: lxc/remote.go:443
 msgid "default"
 msgstr "par défaut"
 
@@ -2626,12 +2646,12 @@ msgstr "désactivé"
 msgid "enabled"
 msgstr "activé"
 
-#: lxc/action.go:134 lxc/main.go:29 lxc/main.go:183
+#: lxc/action.go:134 lxc/main.go:29 lxc/main.go:185
 #, c-format
 msgid "error: %v"
 msgstr "erreur : %v"
 
-#: lxc/help.go:37 lxc/main.go:124
+#: lxc/help.go:37 lxc/main.go:126
 #, c-format
 msgid "error: unknown command: %s"
 msgstr "erreur : commande inconnue: %s"
@@ -2640,11 +2660,11 @@ msgstr "erreur : commande inconnue: %s"
 msgid "no"
 msgstr "non"
 
-#: lxc/remote.go:237
+#: lxc/remote.go:248
 msgid "ok (y/n)?"
 msgstr "ok (y/n) ?"
 
-#: lxc/main.go:355 lxc/main.go:359
+#: lxc/main.go:357 lxc/main.go:361
 #, c-format
 msgid "processing aliases failed %s\n"
 msgstr "l'analyse des alias a échoué %s\n"
@@ -2653,22 +2673,22 @@ msgstr "l'analyse des alias a échoué %s\n"
 msgid "recursive edit doesn't make sense :("
 msgstr "l'édition récursive ne fait aucun sens :("
 
-#: lxc/remote.go:440
+#: lxc/remote.go:480
 #, c-format
 msgid "remote %s already exists"
 msgstr "le serveur distant %s existe déjà"
 
-#: lxc/remote.go:370 lxc/remote.go:432 lxc/remote.go:467 lxc/remote.go:483
+#: lxc/remote.go:406 lxc/remote.go:472 lxc/remote.go:507 lxc/remote.go:523
 #, c-format
 msgid "remote %s doesn't exist"
 msgstr "le serveur distant %s n'existe pas"
 
-#: lxc/remote.go:353
+#: lxc/remote.go:389
 #, c-format
 msgid "remote %s exists as <%s>"
 msgstr "le serveur distant %s existe en tant que <%s>"
 
-#: lxc/remote.go:374 lxc/remote.go:436 lxc/remote.go:471
+#: lxc/remote.go:410 lxc/remote.go:476 lxc/remote.go:511
 #, c-format
 msgid "remote %s is static and cannot be modified"
 msgstr "le serveur distant %s est statique et ne peut être modifié"
@@ -2686,7 +2706,7 @@ msgstr "sans suivi d'état"
 msgid "taken at %s"
 msgstr "pris à %s"
 
-#: lxc/main.go:286
+#: lxc/main.go:288
 msgid "wrong number of subcommand arguments"
 msgstr "nombre d'arguments incorrect pour la sous-comande"
 
diff --git a/po/it.po b/po/it.po
index a88fb88a3..46e5726b2 100644
--- a/po/it.po
+++ b/po/it.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: lxd\n"
 "Report-Msgid-Bugs-To: lxc-devel at lists.linuxcontainers.org\n"
-"POT-Creation-Date: 2017-07-27 18:42-0400\n"
+"POT-Creation-Date: 2017-07-28 18:33+0200\n"
 "PO-Revision-Date: 2017-07-13 19:23+0000\n"
 "Last-Translator: Alberto Donato <alberto.donato at gmail.com>\n"
 "Language-Team: Italian <https://hosted.weblate.org/projects/linux-containers/"
@@ -211,11 +211,15 @@ msgstr "ARCH"
 msgid "ARCHITECTURE"
 msgstr "ARCHITETTURA"
 
-#: lxc/remote.go:67
+#: lxc/remote.go:456
+msgid "AUTH TYPE"
+msgstr ""
+
+#: lxc/remote.go:68
 msgid "Accept certificate"
 msgstr "Accetta certificato"
 
-#: lxc/remote.go:289
+#: lxc/remote.go:320
 #, c-format
 msgid "Admin password for %s: "
 msgstr "Password amministratore per %s: "
@@ -229,6 +233,11 @@ msgstr "Alias:"
 msgid "Architecture: %s"
 msgstr "Architettura: %s"
 
+#: lxc/remote.go:302
+#, c-format
+msgid "Authentication type '%s' not supported by server"
+msgstr ""
+
 #: lxc/image.go:601
 #, c-format
 msgid "Auto update: %s"
@@ -286,12 +295,12 @@ msgstr ""
 msgid "Cannot provide container name to list"
 msgstr ""
 
-#: lxc/remote.go:236
+#: lxc/remote.go:247
 #, c-format
 msgid "Certificate fingerprint: %s"
 msgstr ""
 
-#: lxc/remote.go:324
+#: lxc/remote.go:359
 msgid "Client certificate stored at server: "
 msgstr "Certificato del client salvato dal server: "
 
@@ -348,11 +357,11 @@ msgstr ""
 msgid "Copying the image: %s"
 msgstr ""
 
-#: lxc/remote.go:78
+#: lxc/remote.go:80
 msgid "Could not create config dir"
 msgstr ""
 
-#: lxc/remote.go:251
+#: lxc/remote.go:262
 msgid "Could not create server cert dir"
 msgstr ""
 
@@ -535,7 +544,7 @@ msgstr ""
 msgid "Format (csv|json|table|yaml)"
 msgstr ""
 
-#: lxc/remote.go:89
+#: lxc/remote.go:91
 msgid "Generating a client certificate. This may take a minute..."
 msgstr ""
 
@@ -551,7 +560,7 @@ msgstr ""
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:163
+#: lxc/main.go:165
 msgid "If this is your first time using LXD, you should also run: lxd init"
 msgstr ""
 
@@ -588,7 +597,7 @@ msgstr ""
 msgid "Instance type"
 msgstr ""
 
-#: lxc/remote.go:159
+#: lxc/remote.go:170
 #, c-format
 msgid "Invalid URL scheme \"%s\" in \"%s\""
 msgstr ""
@@ -606,6 +615,11 @@ msgstr ""
 msgid "Invalid path %s"
 msgstr ""
 
+#: lxc/remote.go:159
+#, fuzzy, c-format
+msgid "Invalid protocol: %s"
+msgstr "Proprietà errata: %s"
+
 #: lxc/file.go:457
 #, c-format
 msgid "Invalid source %s"
@@ -693,12 +707,12 @@ msgstr ""
 msgid "Must supply container name for: "
 msgstr ""
 
-#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:414
+#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:453
 #: lxc/storage.go:653 lxc/storage.go:748
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:490 lxc/remote.go:388 lxc/remote.go:393
+#: lxc/network.go:490 lxc/remote.go:424 lxc/remote.go:429
 msgid "NO"
 msgstr ""
 
@@ -749,7 +763,7 @@ msgstr ""
 msgid "Only \"custom\" volumes can be attached to containers."
 msgstr ""
 
-#: lxc/remote.go:144
+#: lxc/remote.go:153
 msgid "Only https URLs are supported for simplestreams"
 msgstr ""
 
@@ -761,7 +775,7 @@ msgstr ""
 msgid "Only managed networks can be modified."
 msgstr ""
 
-#: lxc/help.go:71 lxc/main.go:130 lxc/main.go:187
+#: lxc/help.go:71 lxc/main.go:132 lxc/main.go:189
 msgid "Options:"
 msgstr ""
 
@@ -781,11 +795,11 @@ msgstr ""
 msgid "PROFILES"
 msgstr ""
 
-#: lxc/remote.go:416
+#: lxc/remote.go:455
 msgid "PROTOCOL"
 msgstr ""
 
-#: lxc/image.go:230 lxc/remote.go:417
+#: lxc/image.go:230 lxc/remote.go:457
 msgid "PUBLIC"
 msgstr ""
 
@@ -805,7 +819,7 @@ msgstr ""
 msgid "Path to an alternate server directory"
 msgstr ""
 
-#: lxc/main.go:226
+#: lxc/main.go:228
 msgid "Pause containers."
 msgstr ""
 
@@ -882,7 +896,7 @@ msgstr ""
 msgid "Properties:"
 msgstr ""
 
-#: lxc/remote.go:70
+#: lxc/remote.go:72
 msgid "Public image server"
 msgstr ""
 
@@ -900,7 +914,7 @@ msgstr ""
 msgid "Refreshing the image: %s"
 msgstr ""
 
-#: lxc/remote.go:68
+#: lxc/remote.go:69
 msgid "Remote admin password"
 msgstr ""
 
@@ -926,7 +940,7 @@ msgstr ""
 msgid "Resources:"
 msgstr ""
 
-#: lxc/main.go:234
+#: lxc/main.go:236
 msgid "Restart containers."
 msgstr ""
 
@@ -951,7 +965,7 @@ msgstr ""
 msgid "STATE"
 msgstr ""
 
-#: lxc/remote.go:418
+#: lxc/remote.go:458
 msgid "STATIC"
 msgstr ""
 
@@ -959,15 +973,19 @@ msgstr ""
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/remote.go:244
+#: lxc/remote.go:71
+msgid "Server authentication type (tls or macaroons)"
+msgstr ""
+
+#: lxc/remote.go:255
 msgid "Server certificate NACKed by user"
 msgstr ""
 
-#: lxc/remote.go:321
-msgid "Server doesn't trust us after adding our cert"
+#: lxc/remote.go:355
+msgid "Server doesn't trust us after authentication"
 msgstr ""
 
-#: lxc/remote.go:69
+#: lxc/remote.go:70
 msgid "Server protocol (lxd or simplestreams)"
 msgstr ""
 
@@ -1017,7 +1035,7 @@ msgstr ""
 msgid "Source:"
 msgstr ""
 
-#: lxc/main.go:244
+#: lxc/main.go:246
 msgid "Start containers."
 msgstr ""
 
@@ -1031,7 +1049,7 @@ msgstr ""
 msgid "Status: %s"
 msgstr ""
 
-#: lxc/main.go:250
+#: lxc/main.go:252
 msgid "Stop containers."
 msgstr ""
 
@@ -1156,7 +1174,7 @@ msgstr ""
 msgid "To create a new network, use: lxc network create"
 msgstr ""
 
-#: lxc/main.go:164
+#: lxc/main.go:166
 msgid "To start your first container, try: lxc launch ubuntu:16.04"
 msgstr ""
 
@@ -1191,7 +1209,7 @@ msgstr ""
 msgid "UPLOAD DATE"
 msgstr ""
 
-#: lxc/remote.go:415
+#: lxc/remote.go:454
 msgid "URL"
 msgstr ""
 
@@ -1203,7 +1221,7 @@ msgstr ""
 msgid "Unable to find help2man."
 msgstr ""
 
-#: lxc/remote.go:119
+#: lxc/remote.go:121
 msgid "Unable to read remote TLS certificate"
 msgstr ""
 
@@ -1833,14 +1851,14 @@ msgid ""
 "Publish containers as images."
 msgstr ""
 
-#: lxc/remote.go:39
+#: lxc/remote.go:40
 msgid ""
 "Usage: lxc remote <subcommand> [options]\n"
 "\n"
 "Manage the list of remote LXD servers.\n"
 "\n"
 "lxc remote add [<remote>] <IP|FQDN|URL> [--accept-certificate] [--"
-"password=PASSWORD] [--public] [--protocol=PROTOCOL]\n"
+"password=PASSWORD] [--public] [--protocol=PROTOCOL] [--auth-type=AUTH_TYPE]\n"
 "    Add the remote <remote> at <url>.\n"
 "\n"
 "lxc remote remove <remote>\n"
@@ -2012,7 +2030,7 @@ msgstr ""
 msgid "Whether or not to snapshot the container's running state"
 msgstr ""
 
-#: lxc/network.go:492 lxc/remote.go:390 lxc/remote.go:395
+#: lxc/network.go:492 lxc/remote.go:426 lxc/remote.go:431
 msgid "YES"
 msgstr ""
 
@@ -2032,7 +2050,7 @@ msgstr "Occorre specificare un nome di container come origine"
 msgid "`lxc config profile` is deprecated, please use `lxc profile`"
 msgstr ""
 
-#: lxc/remote.go:378
+#: lxc/remote.go:414
 msgid "can't remove the default remote"
 msgstr ""
 
@@ -2040,7 +2058,7 @@ msgstr ""
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr ""
 
-#: lxc/remote.go:404
+#: lxc/remote.go:443
 msgid "default"
 msgstr ""
 
@@ -2056,12 +2074,12 @@ msgstr ""
 msgid "enabled"
 msgstr ""
 
-#: lxc/action.go:134 lxc/main.go:29 lxc/main.go:183
+#: lxc/action.go:134 lxc/main.go:29 lxc/main.go:185
 #, c-format
 msgid "error: %v"
 msgstr ""
 
-#: lxc/help.go:37 lxc/main.go:124
+#: lxc/help.go:37 lxc/main.go:126
 #, c-format
 msgid "error: unknown command: %s"
 msgstr ""
@@ -2070,11 +2088,11 @@ msgstr ""
 msgid "no"
 msgstr "no"
 
-#: lxc/remote.go:237
+#: lxc/remote.go:248
 msgid "ok (y/n)?"
 msgstr "ok (y/n)?"
 
-#: lxc/main.go:355 lxc/main.go:359
+#: lxc/main.go:357 lxc/main.go:361
 #, c-format
 msgid "processing aliases failed %s\n"
 msgstr "errore di processamento degli alias %s\n"
@@ -2083,22 +2101,22 @@ msgstr "errore di processamento degli alias %s\n"
 msgid "recursive edit doesn't make sense :("
 msgstr ""
 
-#: lxc/remote.go:440
+#: lxc/remote.go:480
 #, c-format
 msgid "remote %s already exists"
 msgstr "il remote %s esiste già"
 
-#: lxc/remote.go:370 lxc/remote.go:432 lxc/remote.go:467 lxc/remote.go:483
+#: lxc/remote.go:406 lxc/remote.go:472 lxc/remote.go:507 lxc/remote.go:523
 #, c-format
 msgid "remote %s doesn't exist"
 msgstr "il remote %s non esiste"
 
-#: lxc/remote.go:353
+#: lxc/remote.go:389
 #, c-format
 msgid "remote %s exists as <%s>"
 msgstr "il remote %s esiste come %s"
 
-#: lxc/remote.go:374 lxc/remote.go:436 lxc/remote.go:471
+#: lxc/remote.go:410 lxc/remote.go:476 lxc/remote.go:511
 #, c-format
 msgid "remote %s is static and cannot be modified"
 msgstr "il remote %s è statico e non può essere modificato"
@@ -2116,7 +2134,7 @@ msgstr "senza stato"
 msgid "taken at %s"
 msgstr "salvato alle %s"
 
-#: lxc/main.go:286
+#: lxc/main.go:288
 msgid "wrong number of subcommand arguments"
 msgstr "numero errato di argomenti del sottocomando"
 
diff --git a/po/ja.po b/po/ja.po
index 2905ac208..4b9067051 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: LXD\n"
 "Report-Msgid-Bugs-To: lxc-devel at lists.linuxcontainers.org\n"
-"POT-Creation-Date: 2017-07-27 18:42-0400\n"
+"POT-Creation-Date: 2017-07-28 18:33+0200\n"
 "PO-Revision-Date: 2017-07-20 00:30+0000\n"
 "Last-Translator: KATOH Yasufumi <karma at jazz.email.ne.jp>\n"
 "Language-Team: Japanese <https://hosted.weblate.org/projects/linux-"
@@ -191,11 +191,15 @@ msgstr ""
 msgid "ARCHITECTURE"
 msgstr ""
 
-#: lxc/remote.go:67
+#: lxc/remote.go:456
+msgid "AUTH TYPE"
+msgstr ""
+
+#: lxc/remote.go:68
 msgid "Accept certificate"
 msgstr "証明書を受け入れます"
 
-#: lxc/remote.go:289
+#: lxc/remote.go:320
 #, c-format
 msgid "Admin password for %s: "
 msgstr "%s の管理者パスワード: "
@@ -209,6 +213,11 @@ msgstr "エイリアス:"
 msgid "Architecture: %s"
 msgstr "アーキテクチャ: %s"
 
+#: lxc/remote.go:302
+#, c-format
+msgid "Authentication type '%s' not supported by server"
+msgstr ""
+
 #: lxc/image.go:601
 #, c-format
 msgid "Auto update: %s"
@@ -268,12 +277,12 @@ msgstr "キー '%s' が指定されていないので削除できません。"
 msgid "Cannot provide container name to list"
 msgstr "コンテナ名を取得できません"
 
-#: lxc/remote.go:236
+#: lxc/remote.go:247
 #, c-format
 msgid "Certificate fingerprint: %s"
 msgstr "証明書のフィンガープリント: %s"
 
-#: lxc/remote.go:324
+#: lxc/remote.go:359
 msgid "Client certificate stored at server: "
 msgstr "クライアント証明書がサーバに格納されました: "
 
@@ -330,12 +339,12 @@ msgstr "コンテナをコピーします (スナップショットはコピー
 msgid "Copying the image: %s"
 msgstr "イメージのコピー中: %s"
 
-#: lxc/remote.go:78
+#: lxc/remote.go:80
 #, fuzzy
 msgid "Could not create config dir"
 msgstr "サーバ証明書格納用のディレクトリを作成できません"
 
-#: lxc/remote.go:251
+#: lxc/remote.go:262
 msgid "Could not create server cert dir"
 msgstr "サーバ証明書格納用のディレクトリを作成できません"
 
@@ -519,7 +528,7 @@ msgstr "強制的にローカルのUNIXソケットを使います"
 msgid "Format (csv|json|table|yaml)"
 msgstr "フォーマット (csv|json|table|yaml)"
 
-#: lxc/remote.go:89
+#: lxc/remote.go:91
 msgid "Generating a client certificate. This may take a minute..."
 msgstr "クライアント証明書を生成します。1分ぐらいかかります..."
 
@@ -535,7 +544,7 @@ msgstr "IPV6"
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:163
+#: lxc/main.go:165
 msgid "If this is your first time using LXD, you should also run: lxd init"
 msgstr "初めて LXD を使う場合、lxd init と実行する必要があります"
 
@@ -572,7 +581,7 @@ msgstr "イメージの更新が成功しました!"
 msgid "Instance type"
 msgstr ""
 
-#: lxc/remote.go:159
+#: lxc/remote.go:170
 #, c-format
 msgid "Invalid URL scheme \"%s\" in \"%s\""
 msgstr "不正な URL スキーム \"%s\" (\"%s\" 内)"
@@ -590,6 +599,11 @@ msgstr "正しくない設定項目 (key) です"
 msgid "Invalid path %s"
 msgstr "不正なパス %s"
 
+#: lxc/remote.go:159
+#, fuzzy, c-format
+msgid "Invalid protocol: %s"
+msgstr "不正なパス %s"
+
 #: lxc/file.go:457
 #, c-format
 msgid "Invalid source %s"
@@ -679,12 +693,12 @@ msgstr "ディレクトリからのインポートは root で実行する必要
 msgid "Must supply container name for: "
 msgstr "コンテナ名を指定する必要があります: "
 
-#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:414
+#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:453
 #: lxc/storage.go:653 lxc/storage.go:748
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:490 lxc/remote.go:388 lxc/remote.go:393
+#: lxc/network.go:490 lxc/remote.go:424 lxc/remote.go:429
 msgid "NO"
 msgstr ""
 
@@ -735,7 +749,7 @@ msgstr "フィンガープリントが指定されていません。"
 msgid "Only \"custom\" volumes can be attached to containers."
 msgstr "\"カスタム\" のボリュームのみがコンテナにアタッチできます。"
 
-#: lxc/remote.go:144
+#: lxc/remote.go:153
 msgid "Only https URLs are supported for simplestreams"
 msgstr "simplestreams は https の URL のみサポートします"
 
@@ -747,7 +761,7 @@ msgstr "リモートイメージのインポートは https:// のみをサポ
 msgid "Only managed networks can be modified."
 msgstr "管理対象のネットワークのみ変更できます。"
 
-#: lxc/help.go:71 lxc/main.go:130 lxc/main.go:187
+#: lxc/help.go:71 lxc/main.go:132 lxc/main.go:189
 msgid "Options:"
 msgstr "オプション:"
 
@@ -767,11 +781,11 @@ msgstr "PID"
 msgid "PROFILES"
 msgstr ""
 
-#: lxc/remote.go:416
+#: lxc/remote.go:455
 msgid "PROTOCOL"
 msgstr ""
 
-#: lxc/image.go:230 lxc/remote.go:417
+#: lxc/image.go:230 lxc/remote.go:457
 msgid "PUBLIC"
 msgstr ""
 
@@ -791,7 +805,7 @@ msgstr "別のクライアント用設定ディレクトリ"
 msgid "Path to an alternate server directory"
 msgstr "別のサーバ用設定ディレクトリ"
 
-#: lxc/main.go:226
+#: lxc/main.go:228
 msgid "Pause containers."
 msgstr "コンテナを一時停止します。"
 
@@ -868,7 +882,7 @@ msgstr "プロファイル: %s"
 msgid "Properties:"
 msgstr "プロパティ:"
 
-#: lxc/remote.go:70
+#: lxc/remote.go:72
 msgid "Public image server"
 msgstr "Public なイメージサーバとして設定します"
 
@@ -886,7 +900,7 @@ msgstr "再帰的にファイルをpush/pullします"
 msgid "Refreshing the image: %s"
 msgstr "イメージの更新中: %s"
 
-#: lxc/remote.go:68
+#: lxc/remote.go:69
 msgid "Remote admin password"
 msgstr "リモートの管理者パスワード"
 
@@ -912,7 +926,7 @@ msgstr "ユーザの確認を要求する"
 msgid "Resources:"
 msgstr "リソース:"
 
-#: lxc/main.go:234
+#: lxc/main.go:236
 msgid "Restart containers."
 msgstr "コンテナを再起動します。"
 
@@ -937,7 +951,7 @@ msgstr ""
 msgid "STATE"
 msgstr ""
 
-#: lxc/remote.go:418
+#: lxc/remote.go:458
 msgid "STATIC"
 msgstr ""
 
@@ -945,15 +959,20 @@ msgstr ""
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/remote.go:244
+#: lxc/remote.go:71
+msgid "Server authentication type (tls or macaroons)"
+msgstr ""
+
+#: lxc/remote.go:255
 msgid "Server certificate NACKed by user"
 msgstr "ユーザによりサーバ証明書が拒否されました"
 
-#: lxc/remote.go:321
-msgid "Server doesn't trust us after adding our cert"
+#: lxc/remote.go:355
+#, fuzzy
+msgid "Server doesn't trust us after authentication"
 msgstr "サーバが我々の証明書を追加した後我々を信頼していません"
 
-#: lxc/remote.go:69
+#: lxc/remote.go:70
 msgid "Server protocol (lxd or simplestreams)"
 msgstr "サーバのプロトコル (lxd or simplestreams)"
 
@@ -1003,7 +1022,7 @@ msgstr "一部のコンテナで %s が失敗しました"
 msgid "Source:"
 msgstr "取得元:"
 
-#: lxc/main.go:244
+#: lxc/main.go:246
 msgid "Start containers."
 msgstr "コンテナを起動します。"
 
@@ -1017,7 +1036,7 @@ msgstr "%s を起動中"
 msgid "Status: %s"
 msgstr "状態: %s"
 
-#: lxc/main.go:250
+#: lxc/main.go:252
 msgid "Stop containers."
 msgstr "コンテナを停止します。"
 
@@ -1153,7 +1172,7 @@ msgid "To create a new network, use: lxc network create"
 msgstr ""
 "新しいネットワークを作成するには、lxc network create を使用してください"
 
-#: lxc/main.go:164
+#: lxc/main.go:166
 msgid "To start your first container, try: lxc launch ubuntu:16.04"
 msgstr ""
 "初めてコンテナを起動するには、\"lxc launch ubuntu:16.04\" と実行してみてくだ"
@@ -1190,7 +1209,7 @@ msgstr "タイプ: persistent"
 msgid "UPLOAD DATE"
 msgstr ""
 
-#: lxc/remote.go:415
+#: lxc/remote.go:454
 msgid "URL"
 msgstr ""
 
@@ -1202,7 +1221,7 @@ msgstr ""
 msgid "Unable to find help2man."
 msgstr "help2man が見つかりません。"
 
-#: lxc/remote.go:119
+#: lxc/remote.go:121
 msgid "Unable to read remote TLS certificate"
 msgstr "リモートの TLS 証明書を読めません"
 
@@ -2339,14 +2358,15 @@ msgstr ""
 "\n"
 "イメージとしてコンテナを publish します。"
 
-#: lxc/remote.go:39
+#: lxc/remote.go:40
+#, fuzzy
 msgid ""
 "Usage: lxc remote <subcommand> [options]\n"
 "\n"
 "Manage the list of remote LXD servers.\n"
 "\n"
 "lxc remote add [<remote>] <IP|FQDN|URL> [--accept-certificate] [--"
-"password=PASSWORD] [--public] [--protocol=PROTOCOL]\n"
+"password=PASSWORD] [--public] [--protocol=PROTOCOL] [--auth-type=AUTH_TYPE]\n"
 "    Add the remote <remote> at <url>.\n"
 "\n"
 "lxc remote remove <remote>\n"
@@ -2660,7 +2680,7 @@ msgstr ""
 msgid "Whether or not to snapshot the container's running state"
 msgstr "コンテナの稼動状態のスナップショットを取得するかどうか"
 
-#: lxc/network.go:492 lxc/remote.go:390 lxc/remote.go:395
+#: lxc/network.go:492 lxc/remote.go:426 lxc/remote.go:431
 msgid "YES"
 msgstr ""
 
@@ -2681,7 +2701,7 @@ msgstr "コピー元のコンテナ名を指定してください"
 msgid "`lxc config profile` is deprecated, please use `lxc profile`"
 msgstr "`lxc config profile` は廃止されました。`lxc profile` を使ってください"
 
-#: lxc/remote.go:378
+#: lxc/remote.go:414
 msgid "can't remove the default remote"
 msgstr "デフォルトのリモートは削除できません"
 
@@ -2689,7 +2709,7 @@ msgstr "デフォルトのリモートは削除できません"
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr "再帰 (recursive) モードでは uid/gid/mode を指定できません"
 
-#: lxc/remote.go:404
+#: lxc/remote.go:443
 msgid "default"
 msgstr ""
 
@@ -2707,12 +2727,12 @@ msgstr "無効"
 msgid "enabled"
 msgstr "有効"
 
-#: lxc/action.go:134 lxc/main.go:29 lxc/main.go:183
+#: lxc/action.go:134 lxc/main.go:29 lxc/main.go:185
 #, c-format
 msgid "error: %v"
 msgstr "エラー: %v"
 
-#: lxc/help.go:37 lxc/main.go:124
+#: lxc/help.go:37 lxc/main.go:126
 #, c-format
 msgid "error: unknown command: %s"
 msgstr "エラー: 未知のコマンド: %s"
@@ -2721,11 +2741,11 @@ msgstr "エラー: 未知のコマンド: %s"
 msgid "no"
 msgstr ""
 
-#: lxc/remote.go:237
+#: lxc/remote.go:248
 msgid "ok (y/n)?"
 msgstr "ok (y/n)?"
 
-#: lxc/main.go:355 lxc/main.go:359
+#: lxc/main.go:357 lxc/main.go:361
 #, c-format
 msgid "processing aliases failed %s\n"
 msgstr "エイリアスの処理が失敗しました %s\n"
@@ -2734,22 +2754,22 @@ msgstr "エイリアスの処理が失敗しました %s\n"
 msgid "recursive edit doesn't make sense :("
 msgstr "再帰的な edit は意味がありません :("
 
-#: lxc/remote.go:440
+#: lxc/remote.go:480
 #, c-format
 msgid "remote %s already exists"
 msgstr "リモート %s は既に存在します"
 
-#: lxc/remote.go:370 lxc/remote.go:432 lxc/remote.go:467 lxc/remote.go:483
+#: lxc/remote.go:406 lxc/remote.go:472 lxc/remote.go:507 lxc/remote.go:523
 #, c-format
 msgid "remote %s doesn't exist"
 msgstr "リモート %s は存在しません"
 
-#: lxc/remote.go:353
+#: lxc/remote.go:389
 #, c-format
 msgid "remote %s exists as <%s>"
 msgstr "リモート %s は <%s> として存在します"
 
-#: lxc/remote.go:374 lxc/remote.go:436 lxc/remote.go:471
+#: lxc/remote.go:410 lxc/remote.go:476 lxc/remote.go:511
 #, c-format
 msgid "remote %s is static and cannot be modified"
 msgstr "リモート %s は static ですので変更できません"
@@ -2767,7 +2787,7 @@ msgstr ""
 msgid "taken at %s"
 msgstr "%s に取得しました"
 
-#: lxc/main.go:286
+#: lxc/main.go:288
 msgid "wrong number of subcommand arguments"
 msgstr "サブコマンドの引数の数が正しくありません"
 
diff --git a/po/lxd.pot b/po/lxd.pot
index d8b60a0c0..a368ce4ca 100644
--- a/po/lxd.pot
+++ b/po/lxd.pot
@@ -7,7 +7,7 @@
 msgid   ""
 msgstr  "Project-Id-Version: lxd\n"
         "Report-Msgid-Bugs-To: lxc-devel at lists.linuxcontainers.org\n"
-        "POT-Creation-Date: 2017-07-27 18:42-0400\n"
+        "POT-Creation-Date: 2017-07-28 18:33+0200\n"
         "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
         "Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
         "Language-Team: LANGUAGE <LL at li.org>\n"
@@ -180,11 +180,15 @@ msgstr  ""
 msgid   "ARCHITECTURE"
 msgstr  ""
 
-#: lxc/remote.go:67
+#: lxc/remote.go:456
+msgid   "AUTH TYPE"
+msgstr  ""
+
+#: lxc/remote.go:68
 msgid   "Accept certificate"
 msgstr  ""
 
-#: lxc/remote.go:289
+#: lxc/remote.go:320
 #, c-format
 msgid   "Admin password for %s: "
 msgstr  ""
@@ -198,6 +202,11 @@ msgstr  ""
 msgid   "Architecture: %s"
 msgstr  ""
 
+#: lxc/remote.go:302
+#, c-format
+msgid   "Authentication type '%s' not supported by server"
+msgstr  ""
+
 #: lxc/image.go:601
 #, c-format
 msgid   "Auto update: %s"
@@ -255,12 +264,12 @@ msgstr  ""
 msgid   "Cannot provide container name to list"
 msgstr  ""
 
-#: lxc/remote.go:236
+#: lxc/remote.go:247
 #, c-format
 msgid   "Certificate fingerprint: %s"
 msgstr  ""
 
-#: lxc/remote.go:324
+#: lxc/remote.go:359
 msgid   "Client certificate stored at server: "
 msgstr  ""
 
@@ -316,11 +325,11 @@ msgstr  ""
 msgid   "Copying the image: %s"
 msgstr  ""
 
-#: lxc/remote.go:78
+#: lxc/remote.go:80
 msgid   "Could not create config dir"
 msgstr  ""
 
-#: lxc/remote.go:251
+#: lxc/remote.go:262
 msgid   "Could not create server cert dir"
 msgstr  ""
 
@@ -502,7 +511,7 @@ msgstr  ""
 msgid   "Format (csv|json|table|yaml)"
 msgstr  ""
 
-#: lxc/remote.go:89
+#: lxc/remote.go:91
 msgid   "Generating a client certificate. This may take a minute..."
 msgstr  ""
 
@@ -518,7 +527,7 @@ msgstr  ""
 msgid   "ISSUE DATE"
 msgstr  ""
 
-#: lxc/main.go:163
+#: lxc/main.go:165
 msgid   "If this is your first time using LXD, you should also run: lxd init"
 msgstr  ""
 
@@ -555,7 +564,7 @@ msgstr  ""
 msgid   "Instance type"
 msgstr  ""
 
-#: lxc/remote.go:159
+#: lxc/remote.go:170
 #, c-format
 msgid   "Invalid URL scheme \"%s\" in \"%s\""
 msgstr  ""
@@ -573,6 +582,11 @@ msgstr  ""
 msgid   "Invalid path %s"
 msgstr  ""
 
+#: lxc/remote.go:159
+#, c-format
+msgid   "Invalid protocol: %s"
+msgstr  ""
+
 #: lxc/file.go:457
 #, c-format
 msgid   "Invalid source %s"
@@ -660,11 +674,11 @@ msgstr  ""
 msgid   "Must supply container name for: "
 msgstr  ""
 
-#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:414 lxc/storage.go:653 lxc/storage.go:748
+#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:453 lxc/storage.go:653 lxc/storage.go:748
 msgid   "NAME"
 msgstr  ""
 
-#: lxc/network.go:490 lxc/remote.go:388 lxc/remote.go:393
+#: lxc/network.go:490 lxc/remote.go:424 lxc/remote.go:429
 msgid   "NO"
 msgstr  ""
 
@@ -715,7 +729,7 @@ msgstr  ""
 msgid   "Only \"custom\" volumes can be attached to containers."
 msgstr  ""
 
-#: lxc/remote.go:144
+#: lxc/remote.go:153
 msgid   "Only https URLs are supported for simplestreams"
 msgstr  ""
 
@@ -727,7 +741,7 @@ msgstr  ""
 msgid   "Only managed networks can be modified."
 msgstr  ""
 
-#: lxc/help.go:71 lxc/main.go:130 lxc/main.go:187
+#: lxc/help.go:71 lxc/main.go:132 lxc/main.go:189
 msgid   "Options:"
 msgstr  ""
 
@@ -747,11 +761,11 @@ msgstr  ""
 msgid   "PROFILES"
 msgstr  ""
 
-#: lxc/remote.go:416
+#: lxc/remote.go:455
 msgid   "PROTOCOL"
 msgstr  ""
 
-#: lxc/image.go:230 lxc/remote.go:417
+#: lxc/image.go:230 lxc/remote.go:457
 msgid   "PUBLIC"
 msgstr  ""
 
@@ -771,7 +785,7 @@ msgstr  ""
 msgid   "Path to an alternate server directory"
 msgstr  ""
 
-#: lxc/main.go:226
+#: lxc/main.go:228
 msgid   "Pause containers."
 msgstr  ""
 
@@ -847,7 +861,7 @@ msgstr  ""
 msgid   "Properties:"
 msgstr  ""
 
-#: lxc/remote.go:70
+#: lxc/remote.go:72
 msgid   "Public image server"
 msgstr  ""
 
@@ -865,7 +879,7 @@ msgstr  ""
 msgid   "Refreshing the image: %s"
 msgstr  ""
 
-#: lxc/remote.go:68
+#: lxc/remote.go:69
 msgid   "Remote admin password"
 msgstr  ""
 
@@ -891,7 +905,7 @@ msgstr  ""
 msgid   "Resources:"
 msgstr  ""
 
-#: lxc/main.go:234
+#: lxc/main.go:236
 msgid   "Restart containers."
 msgstr  ""
 
@@ -916,7 +930,7 @@ msgstr  ""
 msgid   "STATE"
 msgstr  ""
 
-#: lxc/remote.go:418
+#: lxc/remote.go:458
 msgid   "STATIC"
 msgstr  ""
 
@@ -924,15 +938,19 @@ msgstr  ""
 msgid   "STORAGE POOL"
 msgstr  ""
 
-#: lxc/remote.go:244
+#: lxc/remote.go:71
+msgid   "Server authentication type (tls or macaroons)"
+msgstr  ""
+
+#: lxc/remote.go:255
 msgid   "Server certificate NACKed by user"
 msgstr  ""
 
-#: lxc/remote.go:321
-msgid   "Server doesn't trust us after adding our cert"
+#: lxc/remote.go:355
+msgid   "Server doesn't trust us after authentication"
 msgstr  ""
 
-#: lxc/remote.go:69
+#: lxc/remote.go:70
 msgid   "Server protocol (lxd or simplestreams)"
 msgstr  ""
 
@@ -982,7 +1000,7 @@ msgstr  ""
 msgid   "Source:"
 msgstr  ""
 
-#: lxc/main.go:244
+#: lxc/main.go:246
 msgid   "Start containers."
 msgstr  ""
 
@@ -996,7 +1014,7 @@ msgstr  ""
 msgid   "Status: %s"
 msgstr  ""
 
-#: lxc/main.go:250
+#: lxc/main.go:252
 msgid   "Stop containers."
 msgstr  ""
 
@@ -1117,7 +1135,7 @@ msgstr  ""
 msgid   "To create a new network, use: lxc network create"
 msgstr  ""
 
-#: lxc/main.go:164
+#: lxc/main.go:166
 msgid   "To start your first container, try: lxc launch ubuntu:16.04"
 msgstr  ""
 
@@ -1152,7 +1170,7 @@ msgstr  ""
 msgid   "UPLOAD DATE"
 msgstr  ""
 
-#: lxc/remote.go:415
+#: lxc/remote.go:454
 msgid   "URL"
 msgstr  ""
 
@@ -1164,7 +1182,7 @@ msgstr  ""
 msgid   "Unable to find help2man."
 msgstr  ""
 
-#: lxc/remote.go:119
+#: lxc/remote.go:121
 msgid   "Unable to read remote TLS certificate"
 msgstr  ""
 
@@ -1729,12 +1747,12 @@ msgid   "Usage: lxc publish [<remote>:]<container>[/<snapshot>] [<remote>:] [--a
         "Publish containers as images."
 msgstr  ""
 
-#: lxc/remote.go:39
+#: lxc/remote.go:40
 msgid   "Usage: lxc remote <subcommand> [options]\n"
         "\n"
         "Manage the list of remote LXD servers.\n"
         "\n"
-        "lxc remote add [<remote>] <IP|FQDN|URL> [--accept-certificate] [--password=PASSWORD] [--public] [--protocol=PROTOCOL]\n"
+        "lxc remote add [<remote>] <IP|FQDN|URL> [--accept-certificate] [--password=PASSWORD] [--public] [--protocol=PROTOCOL] [--auth-type=AUTH_TYPE]\n"
         "    Add the remote <remote> at <url>.\n"
         "\n"
         "lxc remote remove <remote>\n"
@@ -1889,7 +1907,7 @@ msgstr  ""
 msgid   "Whether or not to snapshot the container's running state"
 msgstr  ""
 
-#: lxc/network.go:492 lxc/remote.go:390 lxc/remote.go:395
+#: lxc/network.go:492 lxc/remote.go:426 lxc/remote.go:431
 msgid   "YES"
 msgstr  ""
 
@@ -1909,7 +1927,7 @@ msgstr  ""
 msgid   "`lxc config profile` is deprecated, please use `lxc profile`"
 msgstr  ""
 
-#: lxc/remote.go:378
+#: lxc/remote.go:414
 msgid   "can't remove the default remote"
 msgstr  ""
 
@@ -1917,7 +1935,7 @@ msgstr  ""
 msgid   "can't supply uid/gid/mode in recursive mode"
 msgstr  ""
 
-#: lxc/remote.go:404
+#: lxc/remote.go:443
 msgid   "default"
 msgstr  ""
 
@@ -1933,12 +1951,12 @@ msgstr  ""
 msgid   "enabled"
 msgstr  ""
 
-#: lxc/action.go:134 lxc/main.go:29 lxc/main.go:183
+#: lxc/action.go:134 lxc/main.go:29 lxc/main.go:185
 #, c-format
 msgid   "error: %v"
 msgstr  ""
 
-#: lxc/help.go:37 lxc/main.go:124
+#: lxc/help.go:37 lxc/main.go:126
 #, c-format
 msgid   "error: unknown command: %s"
 msgstr  ""
@@ -1947,11 +1965,11 @@ msgstr  ""
 msgid   "no"
 msgstr  ""
 
-#: lxc/remote.go:237
+#: lxc/remote.go:248
 msgid   "ok (y/n)?"
 msgstr  ""
 
-#: lxc/main.go:355 lxc/main.go:359
+#: lxc/main.go:357 lxc/main.go:361
 #, c-format
 msgid   "processing aliases failed %s\n"
 msgstr  ""
@@ -1960,22 +1978,22 @@ msgstr  ""
 msgid   "recursive edit doesn't make sense :("
 msgstr  ""
 
-#: lxc/remote.go:440
+#: lxc/remote.go:480
 #, c-format
 msgid   "remote %s already exists"
 msgstr  ""
 
-#: lxc/remote.go:370 lxc/remote.go:432 lxc/remote.go:467 lxc/remote.go:483
+#: lxc/remote.go:406 lxc/remote.go:472 lxc/remote.go:507 lxc/remote.go:523
 #, c-format
 msgid   "remote %s doesn't exist"
 msgstr  ""
 
-#: lxc/remote.go:353
+#: lxc/remote.go:389
 #, c-format
 msgid   "remote %s exists as <%s>"
 msgstr  ""
 
-#: lxc/remote.go:374 lxc/remote.go:436 lxc/remote.go:471
+#: lxc/remote.go:410 lxc/remote.go:476 lxc/remote.go:511
 #, c-format
 msgid   "remote %s is static and cannot be modified"
 msgstr  ""
@@ -1993,7 +2011,7 @@ msgstr  ""
 msgid   "taken at %s"
 msgstr  ""
 
-#: lxc/main.go:286
+#: lxc/main.go:288
 msgid   "wrong number of subcommand arguments"
 msgstr  ""
 
diff --git a/po/nl.po b/po/nl.po
index 71a720753..23bf92a70 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: lxd\n"
 "Report-Msgid-Bugs-To: lxc-devel at lists.linuxcontainers.org\n"
-"POT-Creation-Date: 2017-07-27 18:42-0400\n"
+"POT-Creation-Date: 2017-07-28 18:33+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -187,11 +187,15 @@ msgstr ""
 msgid "ARCHITECTURE"
 msgstr ""
 
-#: lxc/remote.go:67
+#: lxc/remote.go:456
+msgid "AUTH TYPE"
+msgstr ""
+
+#: lxc/remote.go:68
 msgid "Accept certificate"
 msgstr ""
 
-#: lxc/remote.go:289
+#: lxc/remote.go:320
 #, c-format
 msgid "Admin password for %s: "
 msgstr ""
@@ -205,6 +209,11 @@ msgstr ""
 msgid "Architecture: %s"
 msgstr ""
 
+#: lxc/remote.go:302
+#, c-format
+msgid "Authentication type '%s' not supported by server"
+msgstr ""
+
 #: lxc/image.go:601
 #, c-format
 msgid "Auto update: %s"
@@ -262,12 +271,12 @@ msgstr ""
 msgid "Cannot provide container name to list"
 msgstr ""
 
-#: lxc/remote.go:236
+#: lxc/remote.go:247
 #, c-format
 msgid "Certificate fingerprint: %s"
 msgstr ""
 
-#: lxc/remote.go:324
+#: lxc/remote.go:359
 msgid "Client certificate stored at server: "
 msgstr ""
 
@@ -324,11 +333,11 @@ msgstr ""
 msgid "Copying the image: %s"
 msgstr ""
 
-#: lxc/remote.go:78
+#: lxc/remote.go:80
 msgid "Could not create config dir"
 msgstr ""
 
-#: lxc/remote.go:251
+#: lxc/remote.go:262
 msgid "Could not create server cert dir"
 msgstr ""
 
@@ -511,7 +520,7 @@ msgstr ""
 msgid "Format (csv|json|table|yaml)"
 msgstr ""
 
-#: lxc/remote.go:89
+#: lxc/remote.go:91
 msgid "Generating a client certificate. This may take a minute..."
 msgstr ""
 
@@ -527,7 +536,7 @@ msgstr ""
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:163
+#: lxc/main.go:165
 msgid "If this is your first time using LXD, you should also run: lxd init"
 msgstr ""
 
@@ -564,7 +573,7 @@ msgstr ""
 msgid "Instance type"
 msgstr ""
 
-#: lxc/remote.go:159
+#: lxc/remote.go:170
 #, c-format
 msgid "Invalid URL scheme \"%s\" in \"%s\""
 msgstr ""
@@ -582,6 +591,11 @@ msgstr ""
 msgid "Invalid path %s"
 msgstr ""
 
+#: lxc/remote.go:159
+#, c-format
+msgid "Invalid protocol: %s"
+msgstr ""
+
 #: lxc/file.go:457
 #, c-format
 msgid "Invalid source %s"
@@ -669,12 +683,12 @@ msgstr ""
 msgid "Must supply container name for: "
 msgstr ""
 
-#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:414
+#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:453
 #: lxc/storage.go:653 lxc/storage.go:748
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:490 lxc/remote.go:388 lxc/remote.go:393
+#: lxc/network.go:490 lxc/remote.go:424 lxc/remote.go:429
 msgid "NO"
 msgstr ""
 
@@ -725,7 +739,7 @@ msgstr ""
 msgid "Only \"custom\" volumes can be attached to containers."
 msgstr ""
 
-#: lxc/remote.go:144
+#: lxc/remote.go:153
 msgid "Only https URLs are supported for simplestreams"
 msgstr ""
 
@@ -737,7 +751,7 @@ msgstr ""
 msgid "Only managed networks can be modified."
 msgstr ""
 
-#: lxc/help.go:71 lxc/main.go:130 lxc/main.go:187
+#: lxc/help.go:71 lxc/main.go:132 lxc/main.go:189
 msgid "Options:"
 msgstr ""
 
@@ -757,11 +771,11 @@ msgstr ""
 msgid "PROFILES"
 msgstr ""
 
-#: lxc/remote.go:416
+#: lxc/remote.go:455
 msgid "PROTOCOL"
 msgstr ""
 
-#: lxc/image.go:230 lxc/remote.go:417
+#: lxc/image.go:230 lxc/remote.go:457
 msgid "PUBLIC"
 msgstr ""
 
@@ -781,7 +795,7 @@ msgstr ""
 msgid "Path to an alternate server directory"
 msgstr ""
 
-#: lxc/main.go:226
+#: lxc/main.go:228
 msgid "Pause containers."
 msgstr ""
 
@@ -858,7 +872,7 @@ msgstr ""
 msgid "Properties:"
 msgstr ""
 
-#: lxc/remote.go:70
+#: lxc/remote.go:72
 msgid "Public image server"
 msgstr ""
 
@@ -876,7 +890,7 @@ msgstr ""
 msgid "Refreshing the image: %s"
 msgstr ""
 
-#: lxc/remote.go:68
+#: lxc/remote.go:69
 msgid "Remote admin password"
 msgstr ""
 
@@ -902,7 +916,7 @@ msgstr ""
 msgid "Resources:"
 msgstr ""
 
-#: lxc/main.go:234
+#: lxc/main.go:236
 msgid "Restart containers."
 msgstr ""
 
@@ -927,7 +941,7 @@ msgstr ""
 msgid "STATE"
 msgstr ""
 
-#: lxc/remote.go:418
+#: lxc/remote.go:458
 msgid "STATIC"
 msgstr ""
 
@@ -935,15 +949,19 @@ msgstr ""
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/remote.go:244
+#: lxc/remote.go:71
+msgid "Server authentication type (tls or macaroons)"
+msgstr ""
+
+#: lxc/remote.go:255
 msgid "Server certificate NACKed by user"
 msgstr ""
 
-#: lxc/remote.go:321
-msgid "Server doesn't trust us after adding our cert"
+#: lxc/remote.go:355
+msgid "Server doesn't trust us after authentication"
 msgstr ""
 
-#: lxc/remote.go:69
+#: lxc/remote.go:70
 msgid "Server protocol (lxd or simplestreams)"
 msgstr ""
 
@@ -993,7 +1011,7 @@ msgstr ""
 msgid "Source:"
 msgstr ""
 
-#: lxc/main.go:244
+#: lxc/main.go:246
 msgid "Start containers."
 msgstr ""
 
@@ -1007,7 +1025,7 @@ msgstr ""
 msgid "Status: %s"
 msgstr ""
 
-#: lxc/main.go:250
+#: lxc/main.go:252
 msgid "Stop containers."
 msgstr ""
 
@@ -1132,7 +1150,7 @@ msgstr ""
 msgid "To create a new network, use: lxc network create"
 msgstr ""
 
-#: lxc/main.go:164
+#: lxc/main.go:166
 msgid "To start your first container, try: lxc launch ubuntu:16.04"
 msgstr ""
 
@@ -1167,7 +1185,7 @@ msgstr ""
 msgid "UPLOAD DATE"
 msgstr ""
 
-#: lxc/remote.go:415
+#: lxc/remote.go:454
 msgid "URL"
 msgstr ""
 
@@ -1179,7 +1197,7 @@ msgstr ""
 msgid "Unable to find help2man."
 msgstr ""
 
-#: lxc/remote.go:119
+#: lxc/remote.go:121
 msgid "Unable to read remote TLS certificate"
 msgstr ""
 
@@ -1809,14 +1827,14 @@ msgid ""
 "Publish containers as images."
 msgstr ""
 
-#: lxc/remote.go:39
+#: lxc/remote.go:40
 msgid ""
 "Usage: lxc remote <subcommand> [options]\n"
 "\n"
 "Manage the list of remote LXD servers.\n"
 "\n"
 "lxc remote add [<remote>] <IP|FQDN|URL> [--accept-certificate] [--"
-"password=PASSWORD] [--public] [--protocol=PROTOCOL]\n"
+"password=PASSWORD] [--public] [--protocol=PROTOCOL] [--auth-type=AUTH_TYPE]\n"
 "    Add the remote <remote> at <url>.\n"
 "\n"
 "lxc remote remove <remote>\n"
@@ -1988,7 +2006,7 @@ msgstr ""
 msgid "Whether or not to snapshot the container's running state"
 msgstr ""
 
-#: lxc/network.go:492 lxc/remote.go:390 lxc/remote.go:395
+#: lxc/network.go:492 lxc/remote.go:426 lxc/remote.go:431
 msgid "YES"
 msgstr ""
 
@@ -2008,7 +2026,7 @@ msgstr ""
 msgid "`lxc config profile` is deprecated, please use `lxc profile`"
 msgstr ""
 
-#: lxc/remote.go:378
+#: lxc/remote.go:414
 msgid "can't remove the default remote"
 msgstr ""
 
@@ -2016,7 +2034,7 @@ msgstr ""
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr ""
 
-#: lxc/remote.go:404
+#: lxc/remote.go:443
 msgid "default"
 msgstr ""
 
@@ -2032,12 +2050,12 @@ msgstr ""
 msgid "enabled"
 msgstr ""
 
-#: lxc/action.go:134 lxc/main.go:29 lxc/main.go:183
+#: lxc/action.go:134 lxc/main.go:29 lxc/main.go:185
 #, c-format
 msgid "error: %v"
 msgstr ""
 
-#: lxc/help.go:37 lxc/main.go:124
+#: lxc/help.go:37 lxc/main.go:126
 #, c-format
 msgid "error: unknown command: %s"
 msgstr ""
@@ -2046,11 +2064,11 @@ msgstr ""
 msgid "no"
 msgstr ""
 
-#: lxc/remote.go:237
+#: lxc/remote.go:248
 msgid "ok (y/n)?"
 msgstr ""
 
-#: lxc/main.go:355 lxc/main.go:359
+#: lxc/main.go:357 lxc/main.go:361
 #, c-format
 msgid "processing aliases failed %s\n"
 msgstr ""
@@ -2059,22 +2077,22 @@ msgstr ""
 msgid "recursive edit doesn't make sense :("
 msgstr ""
 
-#: lxc/remote.go:440
+#: lxc/remote.go:480
 #, c-format
 msgid "remote %s already exists"
 msgstr ""
 
-#: lxc/remote.go:370 lxc/remote.go:432 lxc/remote.go:467 lxc/remote.go:483
+#: lxc/remote.go:406 lxc/remote.go:472 lxc/remote.go:507 lxc/remote.go:523
 #, c-format
 msgid "remote %s doesn't exist"
 msgstr ""
 
-#: lxc/remote.go:353
+#: lxc/remote.go:389
 #, c-format
 msgid "remote %s exists as <%s>"
 msgstr ""
 
-#: lxc/remote.go:374 lxc/remote.go:436 lxc/remote.go:471
+#: lxc/remote.go:410 lxc/remote.go:476 lxc/remote.go:511
 #, c-format
 msgid "remote %s is static and cannot be modified"
 msgstr ""
@@ -2092,7 +2110,7 @@ msgstr ""
 msgid "taken at %s"
 msgstr ""
 
-#: lxc/main.go:286
+#: lxc/main.go:288
 msgid "wrong number of subcommand arguments"
 msgstr ""
 
diff --git a/po/ru.po b/po/ru.po
index c28bd749b..e40ac1344 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: lxd\n"
 "Report-Msgid-Bugs-To: lxc-devel at lists.linuxcontainers.org\n"
-"POT-Creation-Date: 2017-07-27 18:42-0400\n"
+"POT-Creation-Date: 2017-07-28 18:33+0200\n"
 "PO-Revision-Date: 2017-06-06 13:55+0000\n"
 "Last-Translator: Александр Киль <shorrey at gmail.com>\n"
 "Language-Team: Russian <https://hosted.weblate.org/projects/linux-containers/"
@@ -277,11 +277,15 @@ msgstr "ARCH"
 msgid "ARCHITECTURE"
 msgstr "АРХИТЕКТУРА"
 
-#: lxc/remote.go:67
+#: lxc/remote.go:456
+msgid "AUTH TYPE"
+msgstr ""
+
+#: lxc/remote.go:68
 msgid "Accept certificate"
 msgstr "Принять сертификат"
 
-#: lxc/remote.go:289
+#: lxc/remote.go:320
 #, c-format
 msgid "Admin password for %s: "
 msgstr "Пароль администратора для %s: "
@@ -295,6 +299,11 @@ msgstr "Псевдонимы:"
 msgid "Architecture: %s"
 msgstr "Архитектура: %s"
 
+#: lxc/remote.go:302
+#, c-format
+msgid "Authentication type '%s' not supported by server"
+msgstr ""
+
 #: lxc/image.go:601
 #, c-format
 msgid "Auto update: %s"
@@ -353,12 +362,12 @@ msgstr ""
 msgid "Cannot provide container name to list"
 msgstr "Невозможно добавить имя контейнера в список"
 
-#: lxc/remote.go:236
+#: lxc/remote.go:247
 #, c-format
 msgid "Certificate fingerprint: %s"
 msgstr ""
 
-#: lxc/remote.go:324
+#: lxc/remote.go:359
 msgid "Client certificate stored at server: "
 msgstr "Сертификат клиента хранится на сервере: "
 
@@ -415,12 +424,12 @@ msgstr ""
 msgid "Copying the image: %s"
 msgstr "Копирование образа: %s"
 
-#: lxc/remote.go:78
+#: lxc/remote.go:80
 #, fuzzy
 msgid "Could not create config dir"
 msgstr "Не удалось создать каталог сертификата сервера"
 
-#: lxc/remote.go:251
+#: lxc/remote.go:262
 msgid "Could not create server cert dir"
 msgstr "Не удалось создать каталог сертификата сервера"
 
@@ -604,7 +613,7 @@ msgstr ""
 msgid "Format (csv|json|table|yaml)"
 msgstr ""
 
-#: lxc/remote.go:89
+#: lxc/remote.go:91
 msgid "Generating a client certificate. This may take a minute..."
 msgstr ""
 
@@ -620,7 +629,7 @@ msgstr ""
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:163
+#: lxc/main.go:165
 msgid "If this is your first time using LXD, you should also run: lxd init"
 msgstr ""
 
@@ -657,7 +666,7 @@ msgstr ""
 msgid "Instance type"
 msgstr ""
 
-#: lxc/remote.go:159
+#: lxc/remote.go:170
 #, c-format
 msgid "Invalid URL scheme \"%s\" in \"%s\""
 msgstr ""
@@ -675,6 +684,11 @@ msgstr ""
 msgid "Invalid path %s"
 msgstr ""
 
+#: lxc/remote.go:159
+#, c-format
+msgid "Invalid protocol: %s"
+msgstr ""
+
 #: lxc/file.go:457
 #, c-format
 msgid "Invalid source %s"
@@ -763,12 +777,12 @@ msgstr ""
 msgid "Must supply container name for: "
 msgstr ""
 
-#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:414
+#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:453
 #: lxc/storage.go:653 lxc/storage.go:748
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:490 lxc/remote.go:388 lxc/remote.go:393
+#: lxc/network.go:490 lxc/remote.go:424 lxc/remote.go:429
 msgid "NO"
 msgstr ""
 
@@ -820,7 +834,7 @@ msgstr ""
 msgid "Only \"custom\" volumes can be attached to containers."
 msgstr ""
 
-#: lxc/remote.go:144
+#: lxc/remote.go:153
 msgid "Only https URLs are supported for simplestreams"
 msgstr ""
 
@@ -832,7 +846,7 @@ msgstr ""
 msgid "Only managed networks can be modified."
 msgstr ""
 
-#: lxc/help.go:71 lxc/main.go:130 lxc/main.go:187
+#: lxc/help.go:71 lxc/main.go:132 lxc/main.go:189
 msgid "Options:"
 msgstr ""
 
@@ -852,11 +866,11 @@ msgstr ""
 msgid "PROFILES"
 msgstr ""
 
-#: lxc/remote.go:416
+#: lxc/remote.go:455
 msgid "PROTOCOL"
 msgstr ""
 
-#: lxc/image.go:230 lxc/remote.go:417
+#: lxc/image.go:230 lxc/remote.go:457
 msgid "PUBLIC"
 msgstr ""
 
@@ -876,7 +890,7 @@ msgstr ""
 msgid "Path to an alternate server directory"
 msgstr ""
 
-#: lxc/main.go:226
+#: lxc/main.go:228
 msgid "Pause containers."
 msgstr ""
 
@@ -953,7 +967,7 @@ msgstr ""
 msgid "Properties:"
 msgstr ""
 
-#: lxc/remote.go:70
+#: lxc/remote.go:72
 msgid "Public image server"
 msgstr ""
 
@@ -971,7 +985,7 @@ msgstr ""
 msgid "Refreshing the image: %s"
 msgstr "Копирование образа: %s"
 
-#: lxc/remote.go:68
+#: lxc/remote.go:69
 msgid "Remote admin password"
 msgstr ""
 
@@ -997,7 +1011,7 @@ msgstr ""
 msgid "Resources:"
 msgstr ""
 
-#: lxc/main.go:234
+#: lxc/main.go:236
 msgid "Restart containers."
 msgstr ""
 
@@ -1022,7 +1036,7 @@ msgstr ""
 msgid "STATE"
 msgstr ""
 
-#: lxc/remote.go:418
+#: lxc/remote.go:458
 msgid "STATIC"
 msgstr ""
 
@@ -1030,15 +1044,19 @@ msgstr ""
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/remote.go:244
+#: lxc/remote.go:71
+msgid "Server authentication type (tls or macaroons)"
+msgstr ""
+
+#: lxc/remote.go:255
 msgid "Server certificate NACKed by user"
 msgstr ""
 
-#: lxc/remote.go:321
-msgid "Server doesn't trust us after adding our cert"
+#: lxc/remote.go:355
+msgid "Server doesn't trust us after authentication"
 msgstr ""
 
-#: lxc/remote.go:69
+#: lxc/remote.go:70
 msgid "Server protocol (lxd or simplestreams)"
 msgstr ""
 
@@ -1088,7 +1106,7 @@ msgstr "Невозможно добавить имя контейнера в с
 msgid "Source:"
 msgstr ""
 
-#: lxc/main.go:244
+#: lxc/main.go:246
 msgid "Start containers."
 msgstr ""
 
@@ -1102,7 +1120,7 @@ msgstr ""
 msgid "Status: %s"
 msgstr ""
 
-#: lxc/main.go:250
+#: lxc/main.go:252
 msgid "Stop containers."
 msgstr ""
 
@@ -1227,7 +1245,7 @@ msgstr ""
 msgid "To create a new network, use: lxc network create"
 msgstr ""
 
-#: lxc/main.go:164
+#: lxc/main.go:166
 msgid "To start your first container, try: lxc launch ubuntu:16.04"
 msgstr ""
 
@@ -1262,7 +1280,7 @@ msgstr ""
 msgid "UPLOAD DATE"
 msgstr ""
 
-#: lxc/remote.go:415
+#: lxc/remote.go:454
 msgid "URL"
 msgstr ""
 
@@ -1274,7 +1292,7 @@ msgstr ""
 msgid "Unable to find help2man."
 msgstr ""
 
-#: lxc/remote.go:119
+#: lxc/remote.go:121
 msgid "Unable to read remote TLS certificate"
 msgstr ""
 
@@ -1912,14 +1930,14 @@ msgid ""
 "Publish containers as images."
 msgstr ""
 
-#: lxc/remote.go:39
+#: lxc/remote.go:40
 msgid ""
 "Usage: lxc remote <subcommand> [options]\n"
 "\n"
 "Manage the list of remote LXD servers.\n"
 "\n"
 "lxc remote add [<remote>] <IP|FQDN|URL> [--accept-certificate] [--"
-"password=PASSWORD] [--public] [--protocol=PROTOCOL]\n"
+"password=PASSWORD] [--public] [--protocol=PROTOCOL] [--auth-type=AUTH_TYPE]\n"
 "    Add the remote <remote> at <url>.\n"
 "\n"
 "lxc remote remove <remote>\n"
@@ -2091,7 +2109,7 @@ msgstr ""
 msgid "Whether or not to snapshot the container's running state"
 msgstr ""
 
-#: lxc/network.go:492 lxc/remote.go:390 lxc/remote.go:395
+#: lxc/network.go:492 lxc/remote.go:426 lxc/remote.go:431
 msgid "YES"
 msgstr ""
 
@@ -2111,7 +2129,7 @@ msgstr ""
 msgid "`lxc config profile` is deprecated, please use `lxc profile`"
 msgstr ""
 
-#: lxc/remote.go:378
+#: lxc/remote.go:414
 msgid "can't remove the default remote"
 msgstr ""
 
@@ -2119,7 +2137,7 @@ msgstr ""
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr ""
 
-#: lxc/remote.go:404
+#: lxc/remote.go:443
 msgid "default"
 msgstr ""
 
@@ -2135,12 +2153,12 @@ msgstr ""
 msgid "enabled"
 msgstr ""
 
-#: lxc/action.go:134 lxc/main.go:29 lxc/main.go:183
+#: lxc/action.go:134 lxc/main.go:29 lxc/main.go:185
 #, c-format
 msgid "error: %v"
 msgstr ""
 
-#: lxc/help.go:37 lxc/main.go:124
+#: lxc/help.go:37 lxc/main.go:126
 #, c-format
 msgid "error: unknown command: %s"
 msgstr ""
@@ -2149,11 +2167,11 @@ msgstr ""
 msgid "no"
 msgstr ""
 
-#: lxc/remote.go:237
+#: lxc/remote.go:248
 msgid "ok (y/n)?"
 msgstr ""
 
-#: lxc/main.go:355 lxc/main.go:359
+#: lxc/main.go:357 lxc/main.go:361
 #, c-format
 msgid "processing aliases failed %s\n"
 msgstr ""
@@ -2162,22 +2180,22 @@ msgstr ""
 msgid "recursive edit doesn't make sense :("
 msgstr ""
 
-#: lxc/remote.go:440
+#: lxc/remote.go:480
 #, c-format
 msgid "remote %s already exists"
 msgstr ""
 
-#: lxc/remote.go:370 lxc/remote.go:432 lxc/remote.go:467 lxc/remote.go:483
+#: lxc/remote.go:406 lxc/remote.go:472 lxc/remote.go:507 lxc/remote.go:523
 #, c-format
 msgid "remote %s doesn't exist"
 msgstr ""
 
-#: lxc/remote.go:353
+#: lxc/remote.go:389
 #, c-format
 msgid "remote %s exists as <%s>"
 msgstr ""
 
-#: lxc/remote.go:374 lxc/remote.go:436 lxc/remote.go:471
+#: lxc/remote.go:410 lxc/remote.go:476 lxc/remote.go:511
 #, c-format
 msgid "remote %s is static and cannot be modified"
 msgstr ""
@@ -2195,7 +2213,7 @@ msgstr ""
 msgid "taken at %s"
 msgstr ""
 
-#: lxc/main.go:286
+#: lxc/main.go:288
 msgid "wrong number of subcommand arguments"
 msgstr ""
 
diff --git a/po/sr.po b/po/sr.po
index 332a2042f..5f47c851c 100644
--- a/po/sr.po
+++ b/po/sr.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: lxd\n"
 "Report-Msgid-Bugs-To: lxc-devel at lists.linuxcontainers.org\n"
-"POT-Creation-Date: 2017-07-27 18:42-0400\n"
+"POT-Creation-Date: 2017-07-28 18:33+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -187,11 +187,15 @@ msgstr ""
 msgid "ARCHITECTURE"
 msgstr ""
 
-#: lxc/remote.go:67
+#: lxc/remote.go:456
+msgid "AUTH TYPE"
+msgstr ""
+
+#: lxc/remote.go:68
 msgid "Accept certificate"
 msgstr ""
 
-#: lxc/remote.go:289
+#: lxc/remote.go:320
 #, c-format
 msgid "Admin password for %s: "
 msgstr ""
@@ -205,6 +209,11 @@ msgstr ""
 msgid "Architecture: %s"
 msgstr ""
 
+#: lxc/remote.go:302
+#, c-format
+msgid "Authentication type '%s' not supported by server"
+msgstr ""
+
 #: lxc/image.go:601
 #, c-format
 msgid "Auto update: %s"
@@ -262,12 +271,12 @@ msgstr ""
 msgid "Cannot provide container name to list"
 msgstr ""
 
-#: lxc/remote.go:236
+#: lxc/remote.go:247
 #, c-format
 msgid "Certificate fingerprint: %s"
 msgstr ""
 
-#: lxc/remote.go:324
+#: lxc/remote.go:359
 msgid "Client certificate stored at server: "
 msgstr ""
 
@@ -324,11 +333,11 @@ msgstr ""
 msgid "Copying the image: %s"
 msgstr ""
 
-#: lxc/remote.go:78
+#: lxc/remote.go:80
 msgid "Could not create config dir"
 msgstr ""
 
-#: lxc/remote.go:251
+#: lxc/remote.go:262
 msgid "Could not create server cert dir"
 msgstr ""
 
@@ -511,7 +520,7 @@ msgstr ""
 msgid "Format (csv|json|table|yaml)"
 msgstr ""
 
-#: lxc/remote.go:89
+#: lxc/remote.go:91
 msgid "Generating a client certificate. This may take a minute..."
 msgstr ""
 
@@ -527,7 +536,7 @@ msgstr ""
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:163
+#: lxc/main.go:165
 msgid "If this is your first time using LXD, you should also run: lxd init"
 msgstr ""
 
@@ -564,7 +573,7 @@ msgstr ""
 msgid "Instance type"
 msgstr ""
 
-#: lxc/remote.go:159
+#: lxc/remote.go:170
 #, c-format
 msgid "Invalid URL scheme \"%s\" in \"%s\""
 msgstr ""
@@ -582,6 +591,11 @@ msgstr ""
 msgid "Invalid path %s"
 msgstr ""
 
+#: lxc/remote.go:159
+#, c-format
+msgid "Invalid protocol: %s"
+msgstr ""
+
 #: lxc/file.go:457
 #, c-format
 msgid "Invalid source %s"
@@ -669,12 +683,12 @@ msgstr ""
 msgid "Must supply container name for: "
 msgstr ""
 
-#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:414
+#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:453
 #: lxc/storage.go:653 lxc/storage.go:748
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:490 lxc/remote.go:388 lxc/remote.go:393
+#: lxc/network.go:490 lxc/remote.go:424 lxc/remote.go:429
 msgid "NO"
 msgstr ""
 
@@ -725,7 +739,7 @@ msgstr ""
 msgid "Only \"custom\" volumes can be attached to containers."
 msgstr ""
 
-#: lxc/remote.go:144
+#: lxc/remote.go:153
 msgid "Only https URLs are supported for simplestreams"
 msgstr ""
 
@@ -737,7 +751,7 @@ msgstr ""
 msgid "Only managed networks can be modified."
 msgstr ""
 
-#: lxc/help.go:71 lxc/main.go:130 lxc/main.go:187
+#: lxc/help.go:71 lxc/main.go:132 lxc/main.go:189
 msgid "Options:"
 msgstr ""
 
@@ -757,11 +771,11 @@ msgstr ""
 msgid "PROFILES"
 msgstr ""
 
-#: lxc/remote.go:416
+#: lxc/remote.go:455
 msgid "PROTOCOL"
 msgstr ""
 
-#: lxc/image.go:230 lxc/remote.go:417
+#: lxc/image.go:230 lxc/remote.go:457
 msgid "PUBLIC"
 msgstr ""
 
@@ -781,7 +795,7 @@ msgstr ""
 msgid "Path to an alternate server directory"
 msgstr ""
 
-#: lxc/main.go:226
+#: lxc/main.go:228
 msgid "Pause containers."
 msgstr ""
 
@@ -858,7 +872,7 @@ msgstr ""
 msgid "Properties:"
 msgstr ""
 
-#: lxc/remote.go:70
+#: lxc/remote.go:72
 msgid "Public image server"
 msgstr ""
 
@@ -876,7 +890,7 @@ msgstr ""
 msgid "Refreshing the image: %s"
 msgstr ""
 
-#: lxc/remote.go:68
+#: lxc/remote.go:69
 msgid "Remote admin password"
 msgstr ""
 
@@ -902,7 +916,7 @@ msgstr ""
 msgid "Resources:"
 msgstr ""
 
-#: lxc/main.go:234
+#: lxc/main.go:236
 msgid "Restart containers."
 msgstr ""
 
@@ -927,7 +941,7 @@ msgstr ""
 msgid "STATE"
 msgstr ""
 
-#: lxc/remote.go:418
+#: lxc/remote.go:458
 msgid "STATIC"
 msgstr ""
 
@@ -935,15 +949,19 @@ msgstr ""
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/remote.go:244
+#: lxc/remote.go:71
+msgid "Server authentication type (tls or macaroons)"
+msgstr ""
+
+#: lxc/remote.go:255
 msgid "Server certificate NACKed by user"
 msgstr ""
 
-#: lxc/remote.go:321
-msgid "Server doesn't trust us after adding our cert"
+#: lxc/remote.go:355
+msgid "Server doesn't trust us after authentication"
 msgstr ""
 
-#: lxc/remote.go:69
+#: lxc/remote.go:70
 msgid "Server protocol (lxd or simplestreams)"
 msgstr ""
 
@@ -993,7 +1011,7 @@ msgstr ""
 msgid "Source:"
 msgstr ""
 
-#: lxc/main.go:244
+#: lxc/main.go:246
 msgid "Start containers."
 msgstr ""
 
@@ -1007,7 +1025,7 @@ msgstr ""
 msgid "Status: %s"
 msgstr ""
 
-#: lxc/main.go:250
+#: lxc/main.go:252
 msgid "Stop containers."
 msgstr ""
 
@@ -1132,7 +1150,7 @@ msgstr ""
 msgid "To create a new network, use: lxc network create"
 msgstr ""
 
-#: lxc/main.go:164
+#: lxc/main.go:166
 msgid "To start your first container, try: lxc launch ubuntu:16.04"
 msgstr ""
 
@@ -1167,7 +1185,7 @@ msgstr ""
 msgid "UPLOAD DATE"
 msgstr ""
 
-#: lxc/remote.go:415
+#: lxc/remote.go:454
 msgid "URL"
 msgstr ""
 
@@ -1179,7 +1197,7 @@ msgstr ""
 msgid "Unable to find help2man."
 msgstr ""
 
-#: lxc/remote.go:119
+#: lxc/remote.go:121
 msgid "Unable to read remote TLS certificate"
 msgstr ""
 
@@ -1809,14 +1827,14 @@ msgid ""
 "Publish containers as images."
 msgstr ""
 
-#: lxc/remote.go:39
+#: lxc/remote.go:40
 msgid ""
 "Usage: lxc remote <subcommand> [options]\n"
 "\n"
 "Manage the list of remote LXD servers.\n"
 "\n"
 "lxc remote add [<remote>] <IP|FQDN|URL> [--accept-certificate] [--"
-"password=PASSWORD] [--public] [--protocol=PROTOCOL]\n"
+"password=PASSWORD] [--public] [--protocol=PROTOCOL] [--auth-type=AUTH_TYPE]\n"
 "    Add the remote <remote> at <url>.\n"
 "\n"
 "lxc remote remove <remote>\n"
@@ -1988,7 +2006,7 @@ msgstr ""
 msgid "Whether or not to snapshot the container's running state"
 msgstr ""
 
-#: lxc/network.go:492 lxc/remote.go:390 lxc/remote.go:395
+#: lxc/network.go:492 lxc/remote.go:426 lxc/remote.go:431
 msgid "YES"
 msgstr ""
 
@@ -2008,7 +2026,7 @@ msgstr ""
 msgid "`lxc config profile` is deprecated, please use `lxc profile`"
 msgstr ""
 
-#: lxc/remote.go:378
+#: lxc/remote.go:414
 msgid "can't remove the default remote"
 msgstr ""
 
@@ -2016,7 +2034,7 @@ msgstr ""
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr ""
 
-#: lxc/remote.go:404
+#: lxc/remote.go:443
 msgid "default"
 msgstr ""
 
@@ -2032,12 +2050,12 @@ msgstr ""
 msgid "enabled"
 msgstr ""
 
-#: lxc/action.go:134 lxc/main.go:29 lxc/main.go:183
+#: lxc/action.go:134 lxc/main.go:29 lxc/main.go:185
 #, c-format
 msgid "error: %v"
 msgstr ""
 
-#: lxc/help.go:37 lxc/main.go:124
+#: lxc/help.go:37 lxc/main.go:126
 #, c-format
 msgid "error: unknown command: %s"
 msgstr ""
@@ -2046,11 +2064,11 @@ msgstr ""
 msgid "no"
 msgstr ""
 
-#: lxc/remote.go:237
+#: lxc/remote.go:248
 msgid "ok (y/n)?"
 msgstr ""
 
-#: lxc/main.go:355 lxc/main.go:359
+#: lxc/main.go:357 lxc/main.go:361
 #, c-format
 msgid "processing aliases failed %s\n"
 msgstr ""
@@ -2059,22 +2077,22 @@ msgstr ""
 msgid "recursive edit doesn't make sense :("
 msgstr ""
 
-#: lxc/remote.go:440
+#: lxc/remote.go:480
 #, c-format
 msgid "remote %s already exists"
 msgstr ""
 
-#: lxc/remote.go:370 lxc/remote.go:432 lxc/remote.go:467 lxc/remote.go:483
+#: lxc/remote.go:406 lxc/remote.go:472 lxc/remote.go:507 lxc/remote.go:523
 #, c-format
 msgid "remote %s doesn't exist"
 msgstr ""
 
-#: lxc/remote.go:353
+#: lxc/remote.go:389
 #, c-format
 msgid "remote %s exists as <%s>"
 msgstr ""
 
-#: lxc/remote.go:374 lxc/remote.go:436 lxc/remote.go:471
+#: lxc/remote.go:410 lxc/remote.go:476 lxc/remote.go:511
 #, c-format
 msgid "remote %s is static and cannot be modified"
 msgstr ""
@@ -2092,7 +2110,7 @@ msgstr ""
 msgid "taken at %s"
 msgstr ""
 
-#: lxc/main.go:286
+#: lxc/main.go:288
 msgid "wrong number of subcommand arguments"
 msgstr ""
 
diff --git a/po/sv.po b/po/sv.po
index 8db0134f7..b06cc776e 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: lxd\n"
 "Report-Msgid-Bugs-To: lxc-devel at lists.linuxcontainers.org\n"
-"POT-Creation-Date: 2017-07-27 18:42-0400\n"
+"POT-Creation-Date: 2017-07-28 18:33+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -187,11 +187,15 @@ msgstr ""
 msgid "ARCHITECTURE"
 msgstr ""
 
-#: lxc/remote.go:67
+#: lxc/remote.go:456
+msgid "AUTH TYPE"
+msgstr ""
+
+#: lxc/remote.go:68
 msgid "Accept certificate"
 msgstr ""
 
-#: lxc/remote.go:289
+#: lxc/remote.go:320
 #, c-format
 msgid "Admin password for %s: "
 msgstr ""
@@ -205,6 +209,11 @@ msgstr ""
 msgid "Architecture: %s"
 msgstr ""
 
+#: lxc/remote.go:302
+#, c-format
+msgid "Authentication type '%s' not supported by server"
+msgstr ""
+
 #: lxc/image.go:601
 #, c-format
 msgid "Auto update: %s"
@@ -262,12 +271,12 @@ msgstr ""
 msgid "Cannot provide container name to list"
 msgstr ""
 
-#: lxc/remote.go:236
+#: lxc/remote.go:247
 #, c-format
 msgid "Certificate fingerprint: %s"
 msgstr ""
 
-#: lxc/remote.go:324
+#: lxc/remote.go:359
 msgid "Client certificate stored at server: "
 msgstr ""
 
@@ -324,11 +333,11 @@ msgstr ""
 msgid "Copying the image: %s"
 msgstr ""
 
-#: lxc/remote.go:78
+#: lxc/remote.go:80
 msgid "Could not create config dir"
 msgstr ""
 
-#: lxc/remote.go:251
+#: lxc/remote.go:262
 msgid "Could not create server cert dir"
 msgstr ""
 
@@ -511,7 +520,7 @@ msgstr ""
 msgid "Format (csv|json|table|yaml)"
 msgstr ""
 
-#: lxc/remote.go:89
+#: lxc/remote.go:91
 msgid "Generating a client certificate. This may take a minute..."
 msgstr ""
 
@@ -527,7 +536,7 @@ msgstr ""
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:163
+#: lxc/main.go:165
 msgid "If this is your first time using LXD, you should also run: lxd init"
 msgstr ""
 
@@ -564,7 +573,7 @@ msgstr ""
 msgid "Instance type"
 msgstr ""
 
-#: lxc/remote.go:159
+#: lxc/remote.go:170
 #, c-format
 msgid "Invalid URL scheme \"%s\" in \"%s\""
 msgstr ""
@@ -582,6 +591,11 @@ msgstr ""
 msgid "Invalid path %s"
 msgstr ""
 
+#: lxc/remote.go:159
+#, c-format
+msgid "Invalid protocol: %s"
+msgstr ""
+
 #: lxc/file.go:457
 #, c-format
 msgid "Invalid source %s"
@@ -669,12 +683,12 @@ msgstr ""
 msgid "Must supply container name for: "
 msgstr ""
 
-#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:414
+#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:453
 #: lxc/storage.go:653 lxc/storage.go:748
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:490 lxc/remote.go:388 lxc/remote.go:393
+#: lxc/network.go:490 lxc/remote.go:424 lxc/remote.go:429
 msgid "NO"
 msgstr ""
 
@@ -725,7 +739,7 @@ msgstr ""
 msgid "Only \"custom\" volumes can be attached to containers."
 msgstr ""
 
-#: lxc/remote.go:144
+#: lxc/remote.go:153
 msgid "Only https URLs are supported for simplestreams"
 msgstr ""
 
@@ -737,7 +751,7 @@ msgstr ""
 msgid "Only managed networks can be modified."
 msgstr ""
 
-#: lxc/help.go:71 lxc/main.go:130 lxc/main.go:187
+#: lxc/help.go:71 lxc/main.go:132 lxc/main.go:189
 msgid "Options:"
 msgstr ""
 
@@ -757,11 +771,11 @@ msgstr ""
 msgid "PROFILES"
 msgstr ""
 
-#: lxc/remote.go:416
+#: lxc/remote.go:455
 msgid "PROTOCOL"
 msgstr ""
 
-#: lxc/image.go:230 lxc/remote.go:417
+#: lxc/image.go:230 lxc/remote.go:457
 msgid "PUBLIC"
 msgstr ""
 
@@ -781,7 +795,7 @@ msgstr ""
 msgid "Path to an alternate server directory"
 msgstr ""
 
-#: lxc/main.go:226
+#: lxc/main.go:228
 msgid "Pause containers."
 msgstr ""
 
@@ -858,7 +872,7 @@ msgstr ""
 msgid "Properties:"
 msgstr ""
 
-#: lxc/remote.go:70
+#: lxc/remote.go:72
 msgid "Public image server"
 msgstr ""
 
@@ -876,7 +890,7 @@ msgstr ""
 msgid "Refreshing the image: %s"
 msgstr ""
 
-#: lxc/remote.go:68
+#: lxc/remote.go:69
 msgid "Remote admin password"
 msgstr ""
 
@@ -902,7 +916,7 @@ msgstr ""
 msgid "Resources:"
 msgstr ""
 
-#: lxc/main.go:234
+#: lxc/main.go:236
 msgid "Restart containers."
 msgstr ""
 
@@ -927,7 +941,7 @@ msgstr ""
 msgid "STATE"
 msgstr ""
 
-#: lxc/remote.go:418
+#: lxc/remote.go:458
 msgid "STATIC"
 msgstr ""
 
@@ -935,15 +949,19 @@ msgstr ""
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/remote.go:244
+#: lxc/remote.go:71
+msgid "Server authentication type (tls or macaroons)"
+msgstr ""
+
+#: lxc/remote.go:255
 msgid "Server certificate NACKed by user"
 msgstr ""
 
-#: lxc/remote.go:321
-msgid "Server doesn't trust us after adding our cert"
+#: lxc/remote.go:355
+msgid "Server doesn't trust us after authentication"
 msgstr ""
 
-#: lxc/remote.go:69
+#: lxc/remote.go:70
 msgid "Server protocol (lxd or simplestreams)"
 msgstr ""
 
@@ -993,7 +1011,7 @@ msgstr ""
 msgid "Source:"
 msgstr ""
 
-#: lxc/main.go:244
+#: lxc/main.go:246
 msgid "Start containers."
 msgstr ""
 
@@ -1007,7 +1025,7 @@ msgstr ""
 msgid "Status: %s"
 msgstr ""
 
-#: lxc/main.go:250
+#: lxc/main.go:252
 msgid "Stop containers."
 msgstr ""
 
@@ -1132,7 +1150,7 @@ msgstr ""
 msgid "To create a new network, use: lxc network create"
 msgstr ""
 
-#: lxc/main.go:164
+#: lxc/main.go:166
 msgid "To start your first container, try: lxc launch ubuntu:16.04"
 msgstr ""
 
@@ -1167,7 +1185,7 @@ msgstr ""
 msgid "UPLOAD DATE"
 msgstr ""
 
-#: lxc/remote.go:415
+#: lxc/remote.go:454
 msgid "URL"
 msgstr ""
 
@@ -1179,7 +1197,7 @@ msgstr ""
 msgid "Unable to find help2man."
 msgstr ""
 
-#: lxc/remote.go:119
+#: lxc/remote.go:121
 msgid "Unable to read remote TLS certificate"
 msgstr ""
 
@@ -1809,14 +1827,14 @@ msgid ""
 "Publish containers as images."
 msgstr ""
 
-#: lxc/remote.go:39
+#: lxc/remote.go:40
 msgid ""
 "Usage: lxc remote <subcommand> [options]\n"
 "\n"
 "Manage the list of remote LXD servers.\n"
 "\n"
 "lxc remote add [<remote>] <IP|FQDN|URL> [--accept-certificate] [--"
-"password=PASSWORD] [--public] [--protocol=PROTOCOL]\n"
+"password=PASSWORD] [--public] [--protocol=PROTOCOL] [--auth-type=AUTH_TYPE]\n"
 "    Add the remote <remote> at <url>.\n"
 "\n"
 "lxc remote remove <remote>\n"
@@ -1988,7 +2006,7 @@ msgstr ""
 msgid "Whether or not to snapshot the container's running state"
 msgstr ""
 
-#: lxc/network.go:492 lxc/remote.go:390 lxc/remote.go:395
+#: lxc/network.go:492 lxc/remote.go:426 lxc/remote.go:431
 msgid "YES"
 msgstr ""
 
@@ -2008,7 +2026,7 @@ msgstr ""
 msgid "`lxc config profile` is deprecated, please use `lxc profile`"
 msgstr ""
 
-#: lxc/remote.go:378
+#: lxc/remote.go:414
 msgid "can't remove the default remote"
 msgstr ""
 
@@ -2016,7 +2034,7 @@ msgstr ""
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr ""
 
-#: lxc/remote.go:404
+#: lxc/remote.go:443
 msgid "default"
 msgstr ""
 
@@ -2032,12 +2050,12 @@ msgstr ""
 msgid "enabled"
 msgstr ""
 
-#: lxc/action.go:134 lxc/main.go:29 lxc/main.go:183
+#: lxc/action.go:134 lxc/main.go:29 lxc/main.go:185
 #, c-format
 msgid "error: %v"
 msgstr ""
 
-#: lxc/help.go:37 lxc/main.go:124
+#: lxc/help.go:37 lxc/main.go:126
 #, c-format
 msgid "error: unknown command: %s"
 msgstr ""
@@ -2046,11 +2064,11 @@ msgstr ""
 msgid "no"
 msgstr ""
 
-#: lxc/remote.go:237
+#: lxc/remote.go:248
 msgid "ok (y/n)?"
 msgstr ""
 
-#: lxc/main.go:355 lxc/main.go:359
+#: lxc/main.go:357 lxc/main.go:361
 #, c-format
 msgid "processing aliases failed %s\n"
 msgstr ""
@@ -2059,22 +2077,22 @@ msgstr ""
 msgid "recursive edit doesn't make sense :("
 msgstr ""
 
-#: lxc/remote.go:440
+#: lxc/remote.go:480
 #, c-format
 msgid "remote %s already exists"
 msgstr ""
 
-#: lxc/remote.go:370 lxc/remote.go:432 lxc/remote.go:467 lxc/remote.go:483
+#: lxc/remote.go:406 lxc/remote.go:472 lxc/remote.go:507 lxc/remote.go:523
 #, c-format
 msgid "remote %s doesn't exist"
 msgstr ""
 
-#: lxc/remote.go:353
+#: lxc/remote.go:389
 #, c-format
 msgid "remote %s exists as <%s>"
 msgstr ""
 
-#: lxc/remote.go:374 lxc/remote.go:436 lxc/remote.go:471
+#: lxc/remote.go:410 lxc/remote.go:476 lxc/remote.go:511
 #, c-format
 msgid "remote %s is static and cannot be modified"
 msgstr ""
@@ -2092,7 +2110,7 @@ msgstr ""
 msgid "taken at %s"
 msgstr ""
 
-#: lxc/main.go:286
+#: lxc/main.go:288
 msgid "wrong number of subcommand arguments"
 msgstr ""
 
diff --git a/po/tr.po b/po/tr.po
index bf77769d9..785c91c22 100644
--- a/po/tr.po
+++ b/po/tr.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: lxd\n"
 "Report-Msgid-Bugs-To: lxc-devel at lists.linuxcontainers.org\n"
-"POT-Creation-Date: 2017-07-27 18:42-0400\n"
+"POT-Creation-Date: 2017-07-28 18:33+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -187,11 +187,15 @@ msgstr ""
 msgid "ARCHITECTURE"
 msgstr ""
 
-#: lxc/remote.go:67
+#: lxc/remote.go:456
+msgid "AUTH TYPE"
+msgstr ""
+
+#: lxc/remote.go:68
 msgid "Accept certificate"
 msgstr ""
 
-#: lxc/remote.go:289
+#: lxc/remote.go:320
 #, c-format
 msgid "Admin password for %s: "
 msgstr ""
@@ -205,6 +209,11 @@ msgstr ""
 msgid "Architecture: %s"
 msgstr ""
 
+#: lxc/remote.go:302
+#, c-format
+msgid "Authentication type '%s' not supported by server"
+msgstr ""
+
 #: lxc/image.go:601
 #, c-format
 msgid "Auto update: %s"
@@ -262,12 +271,12 @@ msgstr ""
 msgid "Cannot provide container name to list"
 msgstr ""
 
-#: lxc/remote.go:236
+#: lxc/remote.go:247
 #, c-format
 msgid "Certificate fingerprint: %s"
 msgstr ""
 
-#: lxc/remote.go:324
+#: lxc/remote.go:359
 msgid "Client certificate stored at server: "
 msgstr ""
 
@@ -324,11 +333,11 @@ msgstr ""
 msgid "Copying the image: %s"
 msgstr ""
 
-#: lxc/remote.go:78
+#: lxc/remote.go:80
 msgid "Could not create config dir"
 msgstr ""
 
-#: lxc/remote.go:251
+#: lxc/remote.go:262
 msgid "Could not create server cert dir"
 msgstr ""
 
@@ -511,7 +520,7 @@ msgstr ""
 msgid "Format (csv|json|table|yaml)"
 msgstr ""
 
-#: lxc/remote.go:89
+#: lxc/remote.go:91
 msgid "Generating a client certificate. This may take a minute..."
 msgstr ""
 
@@ -527,7 +536,7 @@ msgstr ""
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:163
+#: lxc/main.go:165
 msgid "If this is your first time using LXD, you should also run: lxd init"
 msgstr ""
 
@@ -564,7 +573,7 @@ msgstr ""
 msgid "Instance type"
 msgstr ""
 
-#: lxc/remote.go:159
+#: lxc/remote.go:170
 #, c-format
 msgid "Invalid URL scheme \"%s\" in \"%s\""
 msgstr ""
@@ -582,6 +591,11 @@ msgstr ""
 msgid "Invalid path %s"
 msgstr ""
 
+#: lxc/remote.go:159
+#, c-format
+msgid "Invalid protocol: %s"
+msgstr ""
+
 #: lxc/file.go:457
 #, c-format
 msgid "Invalid source %s"
@@ -669,12 +683,12 @@ msgstr ""
 msgid "Must supply container name for: "
 msgstr ""
 
-#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:414
+#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:453
 #: lxc/storage.go:653 lxc/storage.go:748
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:490 lxc/remote.go:388 lxc/remote.go:393
+#: lxc/network.go:490 lxc/remote.go:424 lxc/remote.go:429
 msgid "NO"
 msgstr ""
 
@@ -725,7 +739,7 @@ msgstr ""
 msgid "Only \"custom\" volumes can be attached to containers."
 msgstr ""
 
-#: lxc/remote.go:144
+#: lxc/remote.go:153
 msgid "Only https URLs are supported for simplestreams"
 msgstr ""
 
@@ -737,7 +751,7 @@ msgstr ""
 msgid "Only managed networks can be modified."
 msgstr ""
 
-#: lxc/help.go:71 lxc/main.go:130 lxc/main.go:187
+#: lxc/help.go:71 lxc/main.go:132 lxc/main.go:189
 msgid "Options:"
 msgstr ""
 
@@ -757,11 +771,11 @@ msgstr ""
 msgid "PROFILES"
 msgstr ""
 
-#: lxc/remote.go:416
+#: lxc/remote.go:455
 msgid "PROTOCOL"
 msgstr ""
 
-#: lxc/image.go:230 lxc/remote.go:417
+#: lxc/image.go:230 lxc/remote.go:457
 msgid "PUBLIC"
 msgstr ""
 
@@ -781,7 +795,7 @@ msgstr ""
 msgid "Path to an alternate server directory"
 msgstr ""
 
-#: lxc/main.go:226
+#: lxc/main.go:228
 msgid "Pause containers."
 msgstr ""
 
@@ -858,7 +872,7 @@ msgstr ""
 msgid "Properties:"
 msgstr ""
 
-#: lxc/remote.go:70
+#: lxc/remote.go:72
 msgid "Public image server"
 msgstr ""
 
@@ -876,7 +890,7 @@ msgstr ""
 msgid "Refreshing the image: %s"
 msgstr ""
 
-#: lxc/remote.go:68
+#: lxc/remote.go:69
 msgid "Remote admin password"
 msgstr ""
 
@@ -902,7 +916,7 @@ msgstr ""
 msgid "Resources:"
 msgstr ""
 
-#: lxc/main.go:234
+#: lxc/main.go:236
 msgid "Restart containers."
 msgstr ""
 
@@ -927,7 +941,7 @@ msgstr ""
 msgid "STATE"
 msgstr ""
 
-#: lxc/remote.go:418
+#: lxc/remote.go:458
 msgid "STATIC"
 msgstr ""
 
@@ -935,15 +949,19 @@ msgstr ""
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/remote.go:244
+#: lxc/remote.go:71
+msgid "Server authentication type (tls or macaroons)"
+msgstr ""
+
+#: lxc/remote.go:255
 msgid "Server certificate NACKed by user"
 msgstr ""
 
-#: lxc/remote.go:321
-msgid "Server doesn't trust us after adding our cert"
+#: lxc/remote.go:355
+msgid "Server doesn't trust us after authentication"
 msgstr ""
 
-#: lxc/remote.go:69
+#: lxc/remote.go:70
 msgid "Server protocol (lxd or simplestreams)"
 msgstr ""
 
@@ -993,7 +1011,7 @@ msgstr ""
 msgid "Source:"
 msgstr ""
 
-#: lxc/main.go:244
+#: lxc/main.go:246
 msgid "Start containers."
 msgstr ""
 
@@ -1007,7 +1025,7 @@ msgstr ""
 msgid "Status: %s"
 msgstr ""
 
-#: lxc/main.go:250
+#: lxc/main.go:252
 msgid "Stop containers."
 msgstr ""
 
@@ -1132,7 +1150,7 @@ msgstr ""
 msgid "To create a new network, use: lxc network create"
 msgstr ""
 
-#: lxc/main.go:164
+#: lxc/main.go:166
 msgid "To start your first container, try: lxc launch ubuntu:16.04"
 msgstr ""
 
@@ -1167,7 +1185,7 @@ msgstr ""
 msgid "UPLOAD DATE"
 msgstr ""
 
-#: lxc/remote.go:415
+#: lxc/remote.go:454
 msgid "URL"
 msgstr ""
 
@@ -1179,7 +1197,7 @@ msgstr ""
 msgid "Unable to find help2man."
 msgstr ""
 
-#: lxc/remote.go:119
+#: lxc/remote.go:121
 msgid "Unable to read remote TLS certificate"
 msgstr ""
 
@@ -1809,14 +1827,14 @@ msgid ""
 "Publish containers as images."
 msgstr ""
 
-#: lxc/remote.go:39
+#: lxc/remote.go:40
 msgid ""
 "Usage: lxc remote <subcommand> [options]\n"
 "\n"
 "Manage the list of remote LXD servers.\n"
 "\n"
 "lxc remote add [<remote>] <IP|FQDN|URL> [--accept-certificate] [--"
-"password=PASSWORD] [--public] [--protocol=PROTOCOL]\n"
+"password=PASSWORD] [--public] [--protocol=PROTOCOL] [--auth-type=AUTH_TYPE]\n"
 "    Add the remote <remote> at <url>.\n"
 "\n"
 "lxc remote remove <remote>\n"
@@ -1988,7 +2006,7 @@ msgstr ""
 msgid "Whether or not to snapshot the container's running state"
 msgstr ""
 
-#: lxc/network.go:492 lxc/remote.go:390 lxc/remote.go:395
+#: lxc/network.go:492 lxc/remote.go:426 lxc/remote.go:431
 msgid "YES"
 msgstr ""
 
@@ -2008,7 +2026,7 @@ msgstr ""
 msgid "`lxc config profile` is deprecated, please use `lxc profile`"
 msgstr ""
 
-#: lxc/remote.go:378
+#: lxc/remote.go:414
 msgid "can't remove the default remote"
 msgstr ""
 
@@ -2016,7 +2034,7 @@ msgstr ""
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr ""
 
-#: lxc/remote.go:404
+#: lxc/remote.go:443
 msgid "default"
 msgstr ""
 
@@ -2032,12 +2050,12 @@ msgstr ""
 msgid "enabled"
 msgstr ""
 
-#: lxc/action.go:134 lxc/main.go:29 lxc/main.go:183
+#: lxc/action.go:134 lxc/main.go:29 lxc/main.go:185
 #, c-format
 msgid "error: %v"
 msgstr ""
 
-#: lxc/help.go:37 lxc/main.go:124
+#: lxc/help.go:37 lxc/main.go:126
 #, c-format
 msgid "error: unknown command: %s"
 msgstr ""
@@ -2046,11 +2064,11 @@ msgstr ""
 msgid "no"
 msgstr ""
 
-#: lxc/remote.go:237
+#: lxc/remote.go:248
 msgid "ok (y/n)?"
 msgstr ""
 
-#: lxc/main.go:355 lxc/main.go:359
+#: lxc/main.go:357 lxc/main.go:361
 #, c-format
 msgid "processing aliases failed %s\n"
 msgstr ""
@@ -2059,22 +2077,22 @@ msgstr ""
 msgid "recursive edit doesn't make sense :("
 msgstr ""
 
-#: lxc/remote.go:440
+#: lxc/remote.go:480
 #, c-format
 msgid "remote %s already exists"
 msgstr ""
 
-#: lxc/remote.go:370 lxc/remote.go:432 lxc/remote.go:467 lxc/remote.go:483
+#: lxc/remote.go:406 lxc/remote.go:472 lxc/remote.go:507 lxc/remote.go:523
 #, c-format
 msgid "remote %s doesn't exist"
 msgstr ""
 
-#: lxc/remote.go:353
+#: lxc/remote.go:389
 #, c-format
 msgid "remote %s exists as <%s>"
 msgstr ""
 
-#: lxc/remote.go:374 lxc/remote.go:436 lxc/remote.go:471
+#: lxc/remote.go:410 lxc/remote.go:476 lxc/remote.go:511
 #, c-format
 msgid "remote %s is static and cannot be modified"
 msgstr ""
@@ -2092,7 +2110,7 @@ msgstr ""
 msgid "taken at %s"
 msgstr ""
 
-#: lxc/main.go:286
+#: lxc/main.go:288
 msgid "wrong number of subcommand arguments"
 msgstr ""
 
diff --git a/po/zh.po b/po/zh.po
index 7f3239585..b258674ce 100644
--- a/po/zh.po
+++ b/po/zh.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: lxd\n"
 "Report-Msgid-Bugs-To: lxc-devel at lists.linuxcontainers.org\n"
-"POT-Creation-Date: 2017-07-27 18:42-0400\n"
+"POT-Creation-Date: 2017-07-28 18:33+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -187,11 +187,15 @@ msgstr ""
 msgid "ARCHITECTURE"
 msgstr ""
 
-#: lxc/remote.go:67
+#: lxc/remote.go:456
+msgid "AUTH TYPE"
+msgstr ""
+
+#: lxc/remote.go:68
 msgid "Accept certificate"
 msgstr ""
 
-#: lxc/remote.go:289
+#: lxc/remote.go:320
 #, c-format
 msgid "Admin password for %s: "
 msgstr ""
@@ -205,6 +209,11 @@ msgstr ""
 msgid "Architecture: %s"
 msgstr ""
 
+#: lxc/remote.go:302
+#, c-format
+msgid "Authentication type '%s' not supported by server"
+msgstr ""
+
 #: lxc/image.go:601
 #, c-format
 msgid "Auto update: %s"
@@ -262,12 +271,12 @@ msgstr ""
 msgid "Cannot provide container name to list"
 msgstr ""
 
-#: lxc/remote.go:236
+#: lxc/remote.go:247
 #, c-format
 msgid "Certificate fingerprint: %s"
 msgstr ""
 
-#: lxc/remote.go:324
+#: lxc/remote.go:359
 msgid "Client certificate stored at server: "
 msgstr ""
 
@@ -324,11 +333,11 @@ msgstr ""
 msgid "Copying the image: %s"
 msgstr ""
 
-#: lxc/remote.go:78
+#: lxc/remote.go:80
 msgid "Could not create config dir"
 msgstr ""
 
-#: lxc/remote.go:251
+#: lxc/remote.go:262
 msgid "Could not create server cert dir"
 msgstr ""
 
@@ -511,7 +520,7 @@ msgstr ""
 msgid "Format (csv|json|table|yaml)"
 msgstr ""
 
-#: lxc/remote.go:89
+#: lxc/remote.go:91
 msgid "Generating a client certificate. This may take a minute..."
 msgstr ""
 
@@ -527,7 +536,7 @@ msgstr ""
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:163
+#: lxc/main.go:165
 msgid "If this is your first time using LXD, you should also run: lxd init"
 msgstr ""
 
@@ -564,7 +573,7 @@ msgstr ""
 msgid "Instance type"
 msgstr ""
 
-#: lxc/remote.go:159
+#: lxc/remote.go:170
 #, c-format
 msgid "Invalid URL scheme \"%s\" in \"%s\""
 msgstr ""
@@ -582,6 +591,11 @@ msgstr ""
 msgid "Invalid path %s"
 msgstr ""
 
+#: lxc/remote.go:159
+#, c-format
+msgid "Invalid protocol: %s"
+msgstr ""
+
 #: lxc/file.go:457
 #, c-format
 msgid "Invalid source %s"
@@ -669,12 +683,12 @@ msgstr ""
 msgid "Must supply container name for: "
 msgstr ""
 
-#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:414
+#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:453
 #: lxc/storage.go:653 lxc/storage.go:748
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:490 lxc/remote.go:388 lxc/remote.go:393
+#: lxc/network.go:490 lxc/remote.go:424 lxc/remote.go:429
 msgid "NO"
 msgstr ""
 
@@ -725,7 +739,7 @@ msgstr ""
 msgid "Only \"custom\" volumes can be attached to containers."
 msgstr ""
 
-#: lxc/remote.go:144
+#: lxc/remote.go:153
 msgid "Only https URLs are supported for simplestreams"
 msgstr ""
 
@@ -737,7 +751,7 @@ msgstr ""
 msgid "Only managed networks can be modified."
 msgstr ""
 
-#: lxc/help.go:71 lxc/main.go:130 lxc/main.go:187
+#: lxc/help.go:71 lxc/main.go:132 lxc/main.go:189
 msgid "Options:"
 msgstr ""
 
@@ -757,11 +771,11 @@ msgstr ""
 msgid "PROFILES"
 msgstr ""
 
-#: lxc/remote.go:416
+#: lxc/remote.go:455
 msgid "PROTOCOL"
 msgstr ""
 
-#: lxc/image.go:230 lxc/remote.go:417
+#: lxc/image.go:230 lxc/remote.go:457
 msgid "PUBLIC"
 msgstr ""
 
@@ -781,7 +795,7 @@ msgstr ""
 msgid "Path to an alternate server directory"
 msgstr ""
 
-#: lxc/main.go:226
+#: lxc/main.go:228
 msgid "Pause containers."
 msgstr ""
 
@@ -858,7 +872,7 @@ msgstr ""
 msgid "Properties:"
 msgstr ""
 
-#: lxc/remote.go:70
+#: lxc/remote.go:72
 msgid "Public image server"
 msgstr ""
 
@@ -876,7 +890,7 @@ msgstr ""
 msgid "Refreshing the image: %s"
 msgstr ""
 
-#: lxc/remote.go:68
+#: lxc/remote.go:69
 msgid "Remote admin password"
 msgstr ""
 
@@ -902,7 +916,7 @@ msgstr ""
 msgid "Resources:"
 msgstr ""
 
-#: lxc/main.go:234
+#: lxc/main.go:236
 msgid "Restart containers."
 msgstr ""
 
@@ -927,7 +941,7 @@ msgstr ""
 msgid "STATE"
 msgstr ""
 
-#: lxc/remote.go:418
+#: lxc/remote.go:458
 msgid "STATIC"
 msgstr ""
 
@@ -935,15 +949,19 @@ msgstr ""
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/remote.go:244
+#: lxc/remote.go:71
+msgid "Server authentication type (tls or macaroons)"
+msgstr ""
+
+#: lxc/remote.go:255
 msgid "Server certificate NACKed by user"
 msgstr ""
 
-#: lxc/remote.go:321
-msgid "Server doesn't trust us after adding our cert"
+#: lxc/remote.go:355
+msgid "Server doesn't trust us after authentication"
 msgstr ""
 
-#: lxc/remote.go:69
+#: lxc/remote.go:70
 msgid "Server protocol (lxd or simplestreams)"
 msgstr ""
 
@@ -993,7 +1011,7 @@ msgstr ""
 msgid "Source:"
 msgstr ""
 
-#: lxc/main.go:244
+#: lxc/main.go:246
 msgid "Start containers."
 msgstr ""
 
@@ -1007,7 +1025,7 @@ msgstr ""
 msgid "Status: %s"
 msgstr ""
 
-#: lxc/main.go:250
+#: lxc/main.go:252
 msgid "Stop containers."
 msgstr ""
 
@@ -1132,7 +1150,7 @@ msgstr ""
 msgid "To create a new network, use: lxc network create"
 msgstr ""
 
-#: lxc/main.go:164
+#: lxc/main.go:166
 msgid "To start your first container, try: lxc launch ubuntu:16.04"
 msgstr ""
 
@@ -1167,7 +1185,7 @@ msgstr ""
 msgid "UPLOAD DATE"
 msgstr ""
 
-#: lxc/remote.go:415
+#: lxc/remote.go:454
 msgid "URL"
 msgstr ""
 
@@ -1179,7 +1197,7 @@ msgstr ""
 msgid "Unable to find help2man."
 msgstr ""
 
-#: lxc/remote.go:119
+#: lxc/remote.go:121
 msgid "Unable to read remote TLS certificate"
 msgstr ""
 
@@ -1809,14 +1827,14 @@ msgid ""
 "Publish containers as images."
 msgstr ""
 
-#: lxc/remote.go:39
+#: lxc/remote.go:40
 msgid ""
 "Usage: lxc remote <subcommand> [options]\n"
 "\n"
 "Manage the list of remote LXD servers.\n"
 "\n"
 "lxc remote add [<remote>] <IP|FQDN|URL> [--accept-certificate] [--"
-"password=PASSWORD] [--public] [--protocol=PROTOCOL]\n"
+"password=PASSWORD] [--public] [--protocol=PROTOCOL] [--auth-type=AUTH_TYPE]\n"
 "    Add the remote <remote> at <url>.\n"
 "\n"
 "lxc remote remove <remote>\n"
@@ -1988,7 +2006,7 @@ msgstr ""
 msgid "Whether or not to snapshot the container's running state"
 msgstr ""
 
-#: lxc/network.go:492 lxc/remote.go:390 lxc/remote.go:395
+#: lxc/network.go:492 lxc/remote.go:426 lxc/remote.go:431
 msgid "YES"
 msgstr ""
 
@@ -2008,7 +2026,7 @@ msgstr ""
 msgid "`lxc config profile` is deprecated, please use `lxc profile`"
 msgstr ""
 
-#: lxc/remote.go:378
+#: lxc/remote.go:414
 msgid "can't remove the default remote"
 msgstr ""
 
@@ -2016,7 +2034,7 @@ msgstr ""
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr ""
 
-#: lxc/remote.go:404
+#: lxc/remote.go:443
 msgid "default"
 msgstr ""
 
@@ -2032,12 +2050,12 @@ msgstr ""
 msgid "enabled"
 msgstr ""
 
-#: lxc/action.go:134 lxc/main.go:29 lxc/main.go:183
+#: lxc/action.go:134 lxc/main.go:29 lxc/main.go:185
 #, c-format
 msgid "error: %v"
 msgstr ""
 
-#: lxc/help.go:37 lxc/main.go:124
+#: lxc/help.go:37 lxc/main.go:126
 #, c-format
 msgid "error: unknown command: %s"
 msgstr ""
@@ -2046,11 +2064,11 @@ msgstr ""
 msgid "no"
 msgstr ""
 
-#: lxc/remote.go:237
+#: lxc/remote.go:248
 msgid "ok (y/n)?"
 msgstr ""
 
-#: lxc/main.go:355 lxc/main.go:359
+#: lxc/main.go:357 lxc/main.go:361
 #, c-format
 msgid "processing aliases failed %s\n"
 msgstr ""
@@ -2059,22 +2077,22 @@ msgstr ""
 msgid "recursive edit doesn't make sense :("
 msgstr ""
 
-#: lxc/remote.go:440
+#: lxc/remote.go:480
 #, c-format
 msgid "remote %s already exists"
 msgstr ""
 
-#: lxc/remote.go:370 lxc/remote.go:432 lxc/remote.go:467 lxc/remote.go:483
+#: lxc/remote.go:406 lxc/remote.go:472 lxc/remote.go:507 lxc/remote.go:523
 #, c-format
 msgid "remote %s doesn't exist"
 msgstr ""
 
-#: lxc/remote.go:353
+#: lxc/remote.go:389
 #, c-format
 msgid "remote %s exists as <%s>"
 msgstr ""
 
-#: lxc/remote.go:374 lxc/remote.go:436 lxc/remote.go:471
+#: lxc/remote.go:410 lxc/remote.go:476 lxc/remote.go:511
 #, c-format
 msgid "remote %s is static and cannot be modified"
 msgstr ""
@@ -2092,7 +2110,7 @@ msgstr ""
 msgid "taken at %s"
 msgstr ""
 
-#: lxc/main.go:286
+#: lxc/main.go:288
 msgid "wrong number of subcommand arguments"
 msgstr ""
 
diff --git a/po/zh_Hans.po b/po/zh_Hans.po
index 8d64fd0ab..9128432b5 100644
--- a/po/zh_Hans.po
+++ b/po/zh_Hans.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: lxd\n"
 "Report-Msgid-Bugs-To: lxc-devel at lists.linuxcontainers.org\n"
-"POT-Creation-Date: 2017-07-27 18:42-0400\n"
+"POT-Creation-Date: 2017-07-28 18:33+0200\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -187,11 +187,15 @@ msgstr ""
 msgid "ARCHITECTURE"
 msgstr ""
 
-#: lxc/remote.go:67
+#: lxc/remote.go:456
+msgid "AUTH TYPE"
+msgstr ""
+
+#: lxc/remote.go:68
 msgid "Accept certificate"
 msgstr ""
 
-#: lxc/remote.go:289
+#: lxc/remote.go:320
 #, c-format
 msgid "Admin password for %s: "
 msgstr ""
@@ -205,6 +209,11 @@ msgstr ""
 msgid "Architecture: %s"
 msgstr ""
 
+#: lxc/remote.go:302
+#, c-format
+msgid "Authentication type '%s' not supported by server"
+msgstr ""
+
 #: lxc/image.go:601
 #, c-format
 msgid "Auto update: %s"
@@ -262,12 +271,12 @@ msgstr ""
 msgid "Cannot provide container name to list"
 msgstr ""
 
-#: lxc/remote.go:236
+#: lxc/remote.go:247
 #, c-format
 msgid "Certificate fingerprint: %s"
 msgstr ""
 
-#: lxc/remote.go:324
+#: lxc/remote.go:359
 msgid "Client certificate stored at server: "
 msgstr ""
 
@@ -324,11 +333,11 @@ msgstr ""
 msgid "Copying the image: %s"
 msgstr ""
 
-#: lxc/remote.go:78
+#: lxc/remote.go:80
 msgid "Could not create config dir"
 msgstr ""
 
-#: lxc/remote.go:251
+#: lxc/remote.go:262
 msgid "Could not create server cert dir"
 msgstr ""
 
@@ -511,7 +520,7 @@ msgstr ""
 msgid "Format (csv|json|table|yaml)"
 msgstr ""
 
-#: lxc/remote.go:89
+#: lxc/remote.go:91
 msgid "Generating a client certificate. This may take a minute..."
 msgstr ""
 
@@ -527,7 +536,7 @@ msgstr ""
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:163
+#: lxc/main.go:165
 msgid "If this is your first time using LXD, you should also run: lxd init"
 msgstr ""
 
@@ -564,7 +573,7 @@ msgstr ""
 msgid "Instance type"
 msgstr ""
 
-#: lxc/remote.go:159
+#: lxc/remote.go:170
 #, c-format
 msgid "Invalid URL scheme \"%s\" in \"%s\""
 msgstr ""
@@ -582,6 +591,11 @@ msgstr ""
 msgid "Invalid path %s"
 msgstr ""
 
+#: lxc/remote.go:159
+#, c-format
+msgid "Invalid protocol: %s"
+msgstr ""
+
 #: lxc/file.go:457
 #, c-format
 msgid "Invalid source %s"
@@ -669,12 +683,12 @@ msgstr ""
 msgid "Must supply container name for: "
 msgstr ""
 
-#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:414
+#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:453
 #: lxc/storage.go:653 lxc/storage.go:748
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:490 lxc/remote.go:388 lxc/remote.go:393
+#: lxc/network.go:490 lxc/remote.go:424 lxc/remote.go:429
 msgid "NO"
 msgstr ""
 
@@ -725,7 +739,7 @@ msgstr ""
 msgid "Only \"custom\" volumes can be attached to containers."
 msgstr ""
 
-#: lxc/remote.go:144
+#: lxc/remote.go:153
 msgid "Only https URLs are supported for simplestreams"
 msgstr ""
 
@@ -737,7 +751,7 @@ msgstr ""
 msgid "Only managed networks can be modified."
 msgstr ""
 
-#: lxc/help.go:71 lxc/main.go:130 lxc/main.go:187
+#: lxc/help.go:71 lxc/main.go:132 lxc/main.go:189
 msgid "Options:"
 msgstr ""
 
@@ -757,11 +771,11 @@ msgstr ""
 msgid "PROFILES"
 msgstr ""
 
-#: lxc/remote.go:416
+#: lxc/remote.go:455
 msgid "PROTOCOL"
 msgstr ""
 
-#: lxc/image.go:230 lxc/remote.go:417
+#: lxc/image.go:230 lxc/remote.go:457
 msgid "PUBLIC"
 msgstr ""
 
@@ -781,7 +795,7 @@ msgstr ""
 msgid "Path to an alternate server directory"
 msgstr ""
 
-#: lxc/main.go:226
+#: lxc/main.go:228
 msgid "Pause containers."
 msgstr ""
 
@@ -858,7 +872,7 @@ msgstr ""
 msgid "Properties:"
 msgstr ""
 
-#: lxc/remote.go:70
+#: lxc/remote.go:72
 msgid "Public image server"
 msgstr ""
 
@@ -876,7 +890,7 @@ msgstr ""
 msgid "Refreshing the image: %s"
 msgstr ""
 
-#: lxc/remote.go:68
+#: lxc/remote.go:69
 msgid "Remote admin password"
 msgstr ""
 
@@ -902,7 +916,7 @@ msgstr ""
 msgid "Resources:"
 msgstr ""
 
-#: lxc/main.go:234
+#: lxc/main.go:236
 msgid "Restart containers."
 msgstr ""
 
@@ -927,7 +941,7 @@ msgstr ""
 msgid "STATE"
 msgstr ""
 
-#: lxc/remote.go:418
+#: lxc/remote.go:458
 msgid "STATIC"
 msgstr ""
 
@@ -935,15 +949,19 @@ msgstr ""
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/remote.go:244
+#: lxc/remote.go:71
+msgid "Server authentication type (tls or macaroons)"
+msgstr ""
+
+#: lxc/remote.go:255
 msgid "Server certificate NACKed by user"
 msgstr ""
 
-#: lxc/remote.go:321
-msgid "Server doesn't trust us after adding our cert"
+#: lxc/remote.go:355
+msgid "Server doesn't trust us after authentication"
 msgstr ""
 
-#: lxc/remote.go:69
+#: lxc/remote.go:70
 msgid "Server protocol (lxd or simplestreams)"
 msgstr ""
 
@@ -993,7 +1011,7 @@ msgstr ""
 msgid "Source:"
 msgstr ""
 
-#: lxc/main.go:244
+#: lxc/main.go:246
 msgid "Start containers."
 msgstr ""
 
@@ -1007,7 +1025,7 @@ msgstr ""
 msgid "Status: %s"
 msgstr ""
 
-#: lxc/main.go:250
+#: lxc/main.go:252
 msgid "Stop containers."
 msgstr ""
 
@@ -1132,7 +1150,7 @@ msgstr ""
 msgid "To create a new network, use: lxc network create"
 msgstr ""
 
-#: lxc/main.go:164
+#: lxc/main.go:166
 msgid "To start your first container, try: lxc launch ubuntu:16.04"
 msgstr ""
 
@@ -1167,7 +1185,7 @@ msgstr ""
 msgid "UPLOAD DATE"
 msgstr ""
 
-#: lxc/remote.go:415
+#: lxc/remote.go:454
 msgid "URL"
 msgstr ""
 
@@ -1179,7 +1197,7 @@ msgstr ""
 msgid "Unable to find help2man."
 msgstr ""
 
-#: lxc/remote.go:119
+#: lxc/remote.go:121
 msgid "Unable to read remote TLS certificate"
 msgstr ""
 
@@ -1809,14 +1827,14 @@ msgid ""
 "Publish containers as images."
 msgstr ""
 
-#: lxc/remote.go:39
+#: lxc/remote.go:40
 msgid ""
 "Usage: lxc remote <subcommand> [options]\n"
 "\n"
 "Manage the list of remote LXD servers.\n"
 "\n"
 "lxc remote add [<remote>] <IP|FQDN|URL> [--accept-certificate] [--"
-"password=PASSWORD] [--public] [--protocol=PROTOCOL]\n"
+"password=PASSWORD] [--public] [--protocol=PROTOCOL] [--auth-type=AUTH_TYPE]\n"
 "    Add the remote <remote> at <url>.\n"
 "\n"
 "lxc remote remove <remote>\n"
@@ -1988,7 +2006,7 @@ msgstr ""
 msgid "Whether or not to snapshot the container's running state"
 msgstr ""
 
-#: lxc/network.go:492 lxc/remote.go:390 lxc/remote.go:395
+#: lxc/network.go:492 lxc/remote.go:426 lxc/remote.go:431
 msgid "YES"
 msgstr ""
 
@@ -2008,7 +2026,7 @@ msgstr ""
 msgid "`lxc config profile` is deprecated, please use `lxc profile`"
 msgstr ""
 
-#: lxc/remote.go:378
+#: lxc/remote.go:414
 msgid "can't remove the default remote"
 msgstr ""
 
@@ -2016,7 +2034,7 @@ msgstr ""
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr ""
 
-#: lxc/remote.go:404
+#: lxc/remote.go:443
 msgid "default"
 msgstr ""
 
@@ -2032,12 +2050,12 @@ msgstr ""
 msgid "enabled"
 msgstr ""
 
-#: lxc/action.go:134 lxc/main.go:29 lxc/main.go:183
+#: lxc/action.go:134 lxc/main.go:29 lxc/main.go:185
 #, c-format
 msgid "error: %v"
 msgstr ""
 
-#: lxc/help.go:37 lxc/main.go:124
+#: lxc/help.go:37 lxc/main.go:126
 #, c-format
 msgid "error: unknown command: %s"
 msgstr ""
@@ -2046,11 +2064,11 @@ msgstr ""
 msgid "no"
 msgstr ""
 
-#: lxc/remote.go:237
+#: lxc/remote.go:248
 msgid "ok (y/n)?"
 msgstr ""
 
-#: lxc/main.go:355 lxc/main.go:359
+#: lxc/main.go:357 lxc/main.go:361
 #, c-format
 msgid "processing aliases failed %s\n"
 msgstr ""
@@ -2059,22 +2077,22 @@ msgstr ""
 msgid "recursive edit doesn't make sense :("
 msgstr ""
 
-#: lxc/remote.go:440
+#: lxc/remote.go:480
 #, c-format
 msgid "remote %s already exists"
 msgstr ""
 
-#: lxc/remote.go:370 lxc/remote.go:432 lxc/remote.go:467 lxc/remote.go:483
+#: lxc/remote.go:406 lxc/remote.go:472 lxc/remote.go:507 lxc/remote.go:523
 #, c-format
 msgid "remote %s doesn't exist"
 msgstr ""
 
-#: lxc/remote.go:353
+#: lxc/remote.go:389
 #, c-format
 msgid "remote %s exists as <%s>"
 msgstr ""
 
-#: lxc/remote.go:374 lxc/remote.go:436 lxc/remote.go:471
+#: lxc/remote.go:410 lxc/remote.go:476 lxc/remote.go:511
 #, c-format
 msgid "remote %s is static and cannot be modified"
 msgstr ""
@@ -2092,7 +2110,7 @@ msgstr ""
 msgid "taken at %s"
 msgstr ""
 
-#: lxc/main.go:286
+#: lxc/main.go:288
 msgid "wrong number of subcommand arguments"
 msgstr ""
 
diff --git a/test/lxd-benchmark/main.go b/test/lxd-benchmark/main.go
index 9c8eb3c11..858b623dc 100644
--- a/test/lxd-benchmark/main.go
+++ b/test/lxd-benchmark/main.go
@@ -137,7 +137,7 @@ func spawnContainers(c lxd.ContainerServer, count int, image string, privileged
 	if strings.Contains(image, ":") {
 		var remote string
 
-		defaultConfig := config.DefaultConfig
+		defaultConfig := config.NewConfig("", true)
 		defaultConfig.UserAgent = version.UserAgent
 
 		remote, fingerprint, err = defaultConfig.ParseRemote(image)
diff --git a/test/suites/remote.sh b/test/suites/remote.sh
index 79a168a52..8cb59e986 100644
--- a/test/suites/remote.sh
+++ b/test/suites/remote.sh
@@ -15,6 +15,9 @@ test_remote_url() {
     urls="images.linuxcontainers.org https://images.linuxcontainers.org ${urls}"
   fi
 
+  # an invalid protocol returns an error
+  ! lxc_remote remote add test "${url}" --accept-certificate --password foo --protocol foo
+
   for url in ${urls}; do
     lxc_remote remote add test "${url}"
     lxc_remote remote remove test


More information about the lxc-devel mailing list