[lxc-devel] [lxd/master] Port lxc to the new client library

stgraber on Github lxc-bot at linuxcontainers.org
Sat Jun 17 04:03:41 UTC 2017


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 682 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20170617/dfa2d91b/attachment.bin>
-------------- next part --------------
From abe8219220c8b9fb9df9bb4aa35bf2fe3c5e7c99 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Fri, 16 Jun 2017 23:48:55 -0400
Subject: [PATCH 01/28] client: Only set file headers if value is provided
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 client/lxd_containers.go | 14 +++++++++++---
 1 file changed, 11 insertions(+), 3 deletions(-)

diff --git a/client/lxd_containers.go b/client/lxd_containers.go
index 4f1b6c402..ba5fcee7e 100644
--- a/client/lxd_containers.go
+++ b/client/lxd_containers.go
@@ -537,9 +537,17 @@ func (r *ProtocolLXD) CreateContainerFile(containerName string, path string, arg
 	}
 
 	// Set the various headers
-	req.Header.Set("X-LXD-uid", fmt.Sprintf("%d", args.UID))
-	req.Header.Set("X-LXD-gid", fmt.Sprintf("%d", args.GID))
-	req.Header.Set("X-LXD-mode", fmt.Sprintf("%04o", args.Mode))
+	if args.UID > -1 {
+		req.Header.Set("X-LXD-uid", fmt.Sprintf("%d", args.UID))
+	}
+
+	if args.GID > -1 {
+		req.Header.Set("X-LXD-gid", fmt.Sprintf("%d", args.GID))
+	}
+
+	if args.Mode > -1 {
+		req.Header.Set("X-LXD-mode", fmt.Sprintf("%04o", args.Mode))
+	}
 
 	if args.Type != "" {
 		req.Header.Set("X-LXD-type", args.Type)

From 3488da4a08f8f0d6cc4c6cb97fc4314946209655 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Tue, 4 Apr 2017 00:00:14 -0400
Subject: [PATCH 02/28] config: Implement temporary Legacy function
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

This will be used for easier porting of the command line client.

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxc/config/legacy.go | 31 +++++++++++++++++++++++++++++++
 1 file changed, 31 insertions(+)
 create mode 100644 lxc/config/legacy.go

diff --git a/lxc/config/legacy.go b/lxc/config/legacy.go
new file mode 100644
index 000000000..d286f1f03
--- /dev/null
+++ b/lxc/config/legacy.go
@@ -0,0 +1,31 @@
+package config
+
+import (
+	"github.com/lxc/lxd"
+)
+
+// Legacy returns a legacy *lxd.Config
+func (c *Config) Legacy() *lxd.Config {
+	conf := &lxd.Config{
+		DefaultRemote: c.DefaultRemote,
+		Aliases:       c.Aliases,
+		ConfigDir:     c.ConfigDir,
+	}
+
+	remotes := map[string]lxd.RemoteConfig{}
+
+	for k, v := range c.Remotes {
+		remote := lxd.RemoteConfig{
+			Addr:     v.Addr,
+			Public:   v.Public,
+			Protocol: v.Protocol,
+			Static:   v.Static,
+		}
+
+		remotes[k] = remote
+	}
+
+	conf.Remotes = remotes
+
+	return conf
+}

From 2bedb3d9b38edd51a7973c84a010cea3df2e95fc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Tue, 4 Apr 2017 00:27:02 -0400
Subject: [PATCH 03/28] lxc: Port to lxc/config for config management
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxc/action.go    |  15 ++--
 lxc/config.go    | 216 +++++++++++++++++++++++++++++++++++--------------------
 lxc/copy.go      |  24 ++++---
 lxc/delete.go    |  10 ++-
 lxc/exec.go      |  12 ++--
 lxc/file.go      |  48 ++++++++-----
 lxc/finger.go    |  14 ++--
 lxc/help.go      |   4 +-
 lxc/image.go     | 133 +++++++++++++++++++++++++---------
 lxc/info.go      |  16 +++--
 lxc/init.go      |  26 ++++---
 lxc/launch.go    |  22 ++++--
 lxc/list.go      |  16 +++--
 lxc/main.go      |  46 +++++++-----
 lxc/main_test.go |   4 +-
 lxc/manpage.go   |   4 +-
 lxc/monitor.go   |  16 +++--
 lxc/move.go      |  20 ++++--
 lxc/network.go   |  27 ++++---
 lxc/profile.go   |  57 +++++++++------
 lxc/publish.go   |  25 ++++---
 lxc/remote.go    |  80 ++++++++++-----------
 lxc/restore.go   |  11 ++-
 lxc/snapshot.go  |  11 ++-
 lxc/storage.go   |  32 ++++++---
 lxc/utils.go     |  39 ++++++++++
 lxc/version.go   |   4 +-
 27 files changed, 628 insertions(+), 304 deletions(-)

diff --git a/lxc/action.go b/lxc/action.go
index d545cbb5c..5666d59ae 100644
--- a/lxc/action.go
+++ b/lxc/action.go
@@ -6,6 +6,7 @@ import (
 	"strings"
 
 	"github.com/lxc/lxd"
+	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared"
 	"github.com/lxc/lxd/shared/api"
 	"github.com/lxc/lxd/shared/gnuflag"
@@ -50,7 +51,7 @@ func (c *actionCmd) flags() {
 	gnuflag.BoolVar(&c.stateless, "stateless", false, i18n.G("Ignore the container state (only for start)"))
 }
 
-func (c *actionCmd) doAction(config *lxd.Config, nameArg string) error {
+func (c *actionCmd) doAction(conf *config.Config, nameArg string) error {
 	state := false
 
 	// Only store state if asked to
@@ -58,8 +59,12 @@ func (c *actionCmd) doAction(config *lxd.Config, nameArg string) error {
 		state = true
 	}
 
-	remote, name := config.ParseRemoteAndContainer(nameArg)
-	d, err := lxd.NewClient(config, remote)
+	remote, name, err := conf.ParseRemote(nameArg)
+	if err != nil {
+		return err
+	}
+
+	d, err := lxd.NewClient(conf.Legacy(), remote)
 	if err != nil {
 		return err
 	}
@@ -101,13 +106,13 @@ func (c *actionCmd) doAction(config *lxd.Config, nameArg string) error {
 	return nil
 }
 
-func (c *actionCmd) run(config *lxd.Config, args []string) error {
+func (c *actionCmd) run(conf *config.Config, args []string) error {
 	if len(args) == 0 {
 		return errArgs
 	}
 
 	// Run the action for every listed container
-	results := runBatch(args, func(name string) error { return c.doAction(config, name) })
+	results := runBatch(args, func(name string) error { return c.doAction(conf, name) })
 
 	// Single container is easy
 	if len(results) == 1 {
diff --git a/lxc/config.go b/lxc/config.go
index 884736828..ad2e62f71 100644
--- a/lxc/config.go
+++ b/lxc/config.go
@@ -14,6 +14,7 @@ import (
 	"gopkg.in/yaml.v2"
 
 	"github.com/lxc/lxd"
+	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared"
 	"github.com/lxc/lxd/shared/api"
 	"github.com/lxc/lxd/shared/gnuflag"
@@ -129,14 +130,18 @@ lxc config set core.trust_password blah
     Will set the server's trust password to blah.`)
 }
 
-func (c *configCmd) doSet(config *lxd.Config, args []string, unset bool) error {
+func (c *configCmd) doSet(conf *config.Config, args []string, unset bool) error {
 	if len(args) != 4 {
 		return errArgs
 	}
 
 	// [[lxc config]] set dakara:c1 limits.memory 200000
-	remote, container := config.ParseRemoteAndContainer(args[1])
-	d, err := lxd.NewClient(config, remote)
+	remote, container, err := conf.ParseRemote(args[1])
+	if err != nil {
+		return err
+	}
+
+	d, err := lxd.NewClient(conf.Legacy(), remote)
 	if err != nil {
 		return err
 	}
@@ -167,7 +172,7 @@ func (c *configCmd) doSet(config *lxd.Config, args []string, unset bool) error {
 	return d.SetContainerConfig(container, key, value)
 }
 
-func (c *configCmd) run(config *lxd.Config, args []string) error {
+func (c *configCmd) run(conf *config.Config, args []string) error {
 	if len(args) < 1 {
 		return errUsage
 	}
@@ -181,7 +186,7 @@ func (c *configCmd) run(config *lxd.Config, args []string) error {
 
 		// Deal with local server
 		if len(args) == 2 {
-			c, err := lxd.NewClient(config, config.DefaultRemote)
+			c, err := lxd.NewClient(conf.Legacy(), conf.DefaultRemote)
 			if err != nil {
 				return err
 			}
@@ -201,9 +206,13 @@ func (c *configCmd) run(config *lxd.Config, args []string) error {
 		}
 
 		// Deal with remote server
-		remote, container := config.ParseRemoteAndContainer(args[1])
+		remote, container, err := conf.ParseRemote(args[1])
+		if err != nil {
+			return err
+		}
+
 		if container == "" {
-			c, err := lxd.NewClient(config, remote)
+			c, err := lxd.NewClient(conf.Legacy(), remote)
 			if err != nil {
 				return err
 			}
@@ -224,7 +233,7 @@ func (c *configCmd) run(config *lxd.Config, args []string) error {
 
 		// Deal with container
 		args = append(args, "")
-		return c.doSet(config, args, true)
+		return c.doSet(conf, args, true)
 
 	case "set":
 		if len(args) < 3 {
@@ -233,7 +242,7 @@ func (c *configCmd) run(config *lxd.Config, args []string) error {
 
 		// Deal with local server
 		if len(args) == 3 {
-			c, err := lxd.NewClient(config, config.DefaultRemote)
+			c, err := lxd.NewClient(conf.Legacy(), conf.DefaultRemote)
 			if err != nil {
 				return err
 			}
@@ -243,9 +252,13 @@ func (c *configCmd) run(config *lxd.Config, args []string) error {
 		}
 
 		// Deal with remote server
-		remote, container := config.ParseRemoteAndContainer(args[1])
+		remote, container, err := conf.ParseRemote(args[1])
+		if err != nil {
+			return err
+		}
+
 		if container == "" {
-			c, err := lxd.NewClient(config, remote)
+			c, err := lxd.NewClient(conf.Legacy(), remote)
 			if err != nil {
 				return err
 			}
@@ -255,7 +268,7 @@ func (c *configCmd) run(config *lxd.Config, args []string) error {
 		}
 
 		// Deal with container
-		return c.doSet(config, args, false)
+		return c.doSet(conf, args, false)
 
 	case "trust":
 		if len(args) < 2 {
@@ -266,12 +279,16 @@ func (c *configCmd) run(config *lxd.Config, args []string) error {
 		case "list":
 			var remote string
 			if len(args) == 3 {
-				remote = config.ParseRemote(args[2])
+				var err error
+				remote, _, err = conf.ParseRemote(args[2])
+				if err != nil {
+					return err
+				}
 			} else {
-				remote = config.DefaultRemote
+				remote = conf.DefaultRemote
 			}
 
-			d, err := lxd.NewClient(config, remote)
+			d, err := lxd.NewClient(conf.Legacy(), remote)
 			if err != nil {
 				return err
 			}
@@ -320,12 +337,16 @@ func (c *configCmd) run(config *lxd.Config, args []string) error {
 			if len(args) < 3 {
 				return fmt.Errorf(i18n.G("No certificate provided to add"))
 			} else if len(args) == 4 {
-				remote = config.ParseRemote(args[2])
+				var err error
+				remote, _, err = conf.ParseRemote(args[2])
+				if err != nil {
+					return err
+				}
 			} else {
-				remote = config.DefaultRemote
+				remote = conf.DefaultRemote
 			}
 
-			d, err := lxd.NewClient(config, remote)
+			d, err := lxd.NewClient(conf.Legacy(), remote)
 			if err != nil {
 				return err
 			}
@@ -343,12 +364,16 @@ func (c *configCmd) run(config *lxd.Config, args []string) error {
 			if len(args) < 3 {
 				return fmt.Errorf(i18n.G("No fingerprint specified."))
 			} else if len(args) == 4 {
-				remote = config.ParseRemote(args[2])
+				var err error
+				remote, _, err = conf.ParseRemote(args[2])
+				if err != nil {
+					return err
+				}
 			} else {
-				remote = config.DefaultRemote
+				remote = conf.DefaultRemote
 			}
 
-			d, err := lxd.NewClient(config, remote)
+			d, err := lxd.NewClient(conf.Legacy(), remote)
 			if err != nil {
 				return err
 			}
@@ -359,13 +384,17 @@ func (c *configCmd) run(config *lxd.Config, args []string) error {
 		}
 
 	case "show":
-		remote := config.DefaultRemote
+		remote := conf.DefaultRemote
 		container := ""
 		if len(args) > 1 {
-			remote, container = config.ParseRemoteAndContainer(args[1])
+			var err error
+			remote, container, err = conf.ParseRemote(args[1])
+			if err != nil {
+				return err
+			}
 		}
 
-		d, err := lxd.NewClient(config, remote)
+		d, err := lxd.NewClient(conf.Legacy(), remote)
 		if err != nil {
 			return err
 		}
@@ -373,12 +402,12 @@ func (c *configCmd) run(config *lxd.Config, args []string) error {
 		var data []byte
 
 		if len(args) == 1 || container == "" {
-			config, err := d.ServerStatus()
+			server, err := d.ServerStatus()
 			if err != nil {
 				return err
 			}
 
-			brief := config.Writable()
+			brief := server.Writable()
 			data, err = yaml.Marshal(&brief)
 			if err != nil {
 				return err
@@ -386,35 +415,35 @@ func (c *configCmd) run(config *lxd.Config, args []string) error {
 		} else {
 			var brief api.ContainerPut
 			if shared.IsSnapshot(container) {
-				config, err := d.SnapshotInfo(container)
+				snap, err := d.SnapshotInfo(container)
 				if err != nil {
 					return err
 				}
 
 				brief = api.ContainerPut{
-					Profiles:  config.Profiles,
-					Config:    config.Config,
-					Devices:   config.Devices,
-					Ephemeral: config.Ephemeral,
+					Profiles:  snap.Profiles,
+					Config:    snap.Config,
+					Devices:   snap.Devices,
+					Ephemeral: snap.Ephemeral,
 				}
 				if c.expanded {
 					brief = api.ContainerPut{
-						Profiles:  config.Profiles,
-						Config:    config.ExpandedConfig,
-						Devices:   config.ExpandedDevices,
-						Ephemeral: config.Ephemeral,
+						Profiles:  snap.Profiles,
+						Config:    snap.ExpandedConfig,
+						Devices:   snap.ExpandedDevices,
+						Ephemeral: snap.Ephemeral,
 					}
 				}
 			} else {
-				config, err := d.ContainerInfo(container)
+				container, err := d.ContainerInfo(container)
 				if err != nil {
 					return err
 				}
 
-				brief = config.Writable()
+				brief = container.Writable()
 				if c.expanded {
-					brief.Config = config.ExpandedConfig
-					brief.Devices = config.ExpandedDevices
+					brief.Config = container.ExpandedConfig
+					brief.Devices = container.ExpandedDevices
 				}
 			}
 
@@ -433,15 +462,19 @@ func (c *configCmd) run(config *lxd.Config, args []string) error {
 			return errArgs
 		}
 
-		remote := config.DefaultRemote
+		remote := conf.DefaultRemote
 		container := ""
 		key := args[1]
 		if len(args) > 2 {
-			remote, container = config.ParseRemoteAndContainer(args[1])
+			var err error
+			remote, container, err = conf.ParseRemote(args[1])
+			if err != nil {
+				return err
+			}
 			key = args[2]
 		}
 
-		d, err := lxd.NewClient(config, remote)
+		d, err := lxd.NewClient(conf.Legacy(), remote)
 		if err != nil {
 			return err
 		}
@@ -478,19 +511,19 @@ func (c *configCmd) run(config *lxd.Config, args []string) error {
 		}
 		switch args[1] {
 		case "list":
-			return c.deviceList(config, "container", args)
+			return c.deviceList(conf, "container", args)
 		case "add":
-			return c.deviceAdd(config, "container", args)
+			return c.deviceAdd(conf, "container", args)
 		case "remove":
-			return c.deviceRm(config, "container", args)
+			return c.deviceRm(conf, "container", args)
 		case "get":
-			return c.deviceGet(config, "container", args)
+			return c.deviceGet(conf, "container", args)
 		case "set":
-			return c.deviceSet(config, "container", args)
+			return c.deviceSet(conf, "container", args)
 		case "unset":
-			return c.deviceUnset(config, "container", args)
+			return c.deviceUnset(conf, "container", args)
 		case "show":
-			return c.deviceShow(config, "container", args)
+			return c.deviceShow(conf, "container", args)
 		default:
 			return errArgs
 		}
@@ -500,13 +533,17 @@ func (c *configCmd) run(config *lxd.Config, args []string) error {
 			return errArgs
 		}
 
-		remote := config.DefaultRemote
+		remote := conf.DefaultRemote
 		container := ""
 		if len(args) > 1 {
-			remote, container = config.ParseRemoteAndContainer(args[1])
+			var err error
+			remote, container, err = conf.ParseRemote(args[1])
+			if err != nil {
+				return err
+			}
 		}
 
-		d, err := lxd.NewClient(config, remote)
+		d, err := lxd.NewClient(conf.Legacy(), remote)
 		if err != nil {
 			return err
 		}
@@ -541,12 +578,12 @@ func (c *configCmd) doContainerConfigEdit(client *lxd.Client, cont string) error
 	}
 
 	// Extract the current value
-	config, err := client.ContainerInfo(cont)
+	container, err := client.ContainerInfo(cont)
 	if err != nil {
 		return err
 	}
 
-	brief := config.Writable()
+	brief := container.Writable()
 	data, err := yaml.Marshal(&brief)
 	if err != nil {
 		return err
@@ -606,12 +643,12 @@ func (c *configCmd) doDaemonConfigEdit(client *lxd.Client) error {
 	}
 
 	// Extract the current value
-	config, err := client.ServerStatus()
+	server, err := client.ServerStatus()
 	if err != nil {
 		return err
 	}
 
-	brief := config.Writable()
+	brief := server.Writable()
 	data, err := yaml.Marshal(&brief)
 	if err != nil {
 		return err
@@ -652,13 +689,17 @@ func (c *configCmd) doDaemonConfigEdit(client *lxd.Client) error {
 	return nil
 }
 
-func (c *configCmd) deviceAdd(config *lxd.Config, which string, args []string) error {
+func (c *configCmd) deviceAdd(conf *config.Config, which string, args []string) error {
 	if len(args) < 5 {
 		return errArgs
 	}
-	remote, name := config.ParseRemoteAndContainer(args[2])
 
-	client, err := lxd.NewClient(config, remote)
+	remote, name, err := conf.ParseRemote(args[2])
+	if err != nil {
+		return err
+	}
+
+	client, err := lxd.NewClient(conf.Legacy(), remote)
 	if err != nil {
 		return err
 	}
@@ -690,14 +731,17 @@ func (c *configCmd) deviceAdd(config *lxd.Config, which string, args []string) e
 	return err
 }
 
-func (c *configCmd) deviceGet(config *lxd.Config, which string, args []string) error {
+func (c *configCmd) deviceGet(conf *config.Config, which string, args []string) error {
 	if len(args) < 5 {
 		return errArgs
 	}
 
-	remote, name := config.ParseRemoteAndContainer(args[2])
+	remote, name, err := conf.ParseRemote(args[2])
+	if err != nil {
+		return err
+	}
 
-	client, err := lxd.NewClient(config, remote)
+	client, err := lxd.NewClient(conf.Legacy(), remote)
 	if err != nil {
 		return err
 	}
@@ -734,14 +778,17 @@ func (c *configCmd) deviceGet(config *lxd.Config, which string, args []string) e
 	return nil
 }
 
-func (c *configCmd) deviceSet(config *lxd.Config, which string, args []string) error {
+func (c *configCmd) deviceSet(conf *config.Config, which string, args []string) error {
 	if len(args) < 6 {
 		return errArgs
 	}
 
-	remote, name := config.ParseRemoteAndContainer(args[2])
+	remote, name, err := conf.ParseRemote(args[2])
+	if err != nil {
+		return err
+	}
 
-	client, err := lxd.NewClient(config, remote)
+	client, err := lxd.NewClient(conf.Legacy(), remote)
 	if err != nil {
 		return err
 	}
@@ -791,14 +838,17 @@ func (c *configCmd) deviceSet(config *lxd.Config, which string, args []string) e
 	return err
 }
 
-func (c *configCmd) deviceUnset(config *lxd.Config, which string, args []string) error {
+func (c *configCmd) deviceUnset(conf *config.Config, which string, args []string) error {
 	if len(args) < 5 {
 		return errArgs
 	}
 
-	remote, name := config.ParseRemoteAndContainer(args[2])
+	remote, name, err := conf.ParseRemote(args[2])
+	if err != nil {
+		return err
+	}
 
-	client, err := lxd.NewClient(config, remote)
+	client, err := lxd.NewClient(conf.Legacy(), remote)
 	if err != nil {
 		return err
 	}
@@ -847,13 +897,17 @@ func (c *configCmd) deviceUnset(config *lxd.Config, which string, args []string)
 	return err
 }
 
-func (c *configCmd) deviceRm(config *lxd.Config, which string, args []string) error {
+func (c *configCmd) deviceRm(conf *config.Config, which string, args []string) error {
 	if len(args) < 4 {
 		return errArgs
 	}
-	remote, name := config.ParseRemoteAndContainer(args[2])
 
-	client, err := lxd.NewClient(config, remote)
+	remote, name, err := conf.ParseRemote(args[2])
+	if err != nil {
+		return err
+	}
+
+	client, err := lxd.NewClient(conf.Legacy(), remote)
 	if err != nil {
 		return err
 	}
@@ -877,13 +931,17 @@ func (c *configCmd) deviceRm(config *lxd.Config, which string, args []string) er
 	return err
 }
 
-func (c *configCmd) deviceList(config *lxd.Config, which string, args []string) error {
+func (c *configCmd) deviceList(conf *config.Config, which string, args []string) error {
 	if len(args) < 3 {
 		return errArgs
 	}
-	remote, name := config.ParseRemoteAndContainer(args[2])
 
-	client, err := lxd.NewClient(config, remote)
+	remote, name, err := conf.ParseRemote(args[2])
+	if err != nil {
+		return err
+	}
+
+	client, err := lxd.NewClient(conf.Legacy(), remote)
 	if err != nil {
 		return err
 	}
@@ -902,13 +960,17 @@ func (c *configCmd) deviceList(config *lxd.Config, which string, args []string)
 	return nil
 }
 
-func (c *configCmd) deviceShow(config *lxd.Config, which string, args []string) error {
+func (c *configCmd) deviceShow(conf *config.Config, which string, args []string) error {
 	if len(args) < 3 {
 		return errArgs
 	}
-	remote, name := config.ParseRemoteAndContainer(args[2])
 
-	client, err := lxd.NewClient(config, remote)
+	remote, name, err := conf.ParseRemote(args[2])
+	if err != nil {
+		return err
+	}
+
+	client, err := lxd.NewClient(conf.Legacy(), remote)
 	if err != nil {
 		return err
 	}
diff --git a/lxc/copy.go b/lxc/copy.go
index f380306e2..80cc266d9 100644
--- a/lxc/copy.go
+++ b/lxc/copy.go
@@ -5,6 +5,7 @@ import (
 	"strings"
 
 	"github.com/lxc/lxd"
+	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared"
 	"github.com/lxc/lxd/shared/api"
 	"github.com/lxc/lxd/shared/gnuflag"
@@ -39,9 +40,16 @@ func (c *copyCmd) flags() {
 	gnuflag.BoolVar(&c.containerOnly, "container-only", false, i18n.G("Copy the container without its snapshots"))
 }
 
-func (c *copyCmd) copyContainer(config *lxd.Config, sourceResource string, destResource string, keepVolatile bool, ephemeral int, stateful bool, containerOnly bool) error {
-	sourceRemote, sourceName := config.ParseRemoteAndContainer(sourceResource)
-	destRemote, destName := config.ParseRemoteAndContainer(destResource)
+func (c *copyCmd) copyContainer(conf *config.Config, sourceResource string, destResource string, keepVolatile bool, ephemeral int, stateful bool, containerOnly bool) error {
+	sourceRemote, sourceName, err := conf.ParseRemote(sourceResource)
+	if err != nil {
+		return err
+	}
+
+	destRemote, destName, err := conf.ParseRemote(destResource)
+	if err != nil {
+		return err
+	}
 
 	if sourceName == "" {
 		return fmt.Errorf(i18n.G("you must specify a source container name"))
@@ -51,7 +59,7 @@ func (c *copyCmd) copyContainer(config *lxd.Config, sourceResource string, destR
 		destName = sourceName
 	}
 
-	source, err := lxd.NewClient(config, sourceRemote)
+	source, err := lxd.NewClient(conf.Legacy(), sourceRemote)
 	if err != nil {
 		return err
 	}
@@ -146,7 +154,7 @@ func (c *copyCmd) copyContainer(config *lxd.Config, sourceResource string, destR
 		return nil
 	}
 
-	dest, err := lxd.NewClient(config, destRemote)
+	dest, err := lxd.NewClient(conf.Legacy(), destRemote)
 	if err != nil {
 		return err
 	}
@@ -280,7 +288,7 @@ func (c *copyCmd) copyContainer(config *lxd.Config, sourceResource string, destR
 	return fmt.Errorf(i18n.G("Migration failed on target host: %s"), migrationErrFromClient)
 }
 
-func (c *copyCmd) run(config *lxd.Config, args []string) error {
+func (c *copyCmd) run(conf *config.Config, args []string) error {
 	if len(args) < 1 {
 		return errArgs
 	}
@@ -291,8 +299,8 @@ func (c *copyCmd) run(config *lxd.Config, args []string) error {
 	}
 
 	if len(args) < 2 {
-		return c.copyContainer(config, args[0], "", false, ephem, false, c.containerOnly)
+		return c.copyContainer(conf, args[0], "", false, ephem, false, c.containerOnly)
 	}
 
-	return c.copyContainer(config, args[0], args[1], false, ephem, false, c.containerOnly)
+	return c.copyContainer(conf, args[0], args[1], false, ephem, false, c.containerOnly)
 }
diff --git a/lxc/delete.go b/lxc/delete.go
index efe565fb9..2b1a00235 100644
--- a/lxc/delete.go
+++ b/lxc/delete.go
@@ -7,6 +7,7 @@ import (
 	"strings"
 
 	"github.com/lxc/lxd"
+	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared"
 	"github.com/lxc/lxd/shared/api"
 	"github.com/lxc/lxd/shared/gnuflag"
@@ -57,15 +58,18 @@ func (c *deleteCmd) doDelete(d *lxd.Client, name string) error {
 	return d.WaitForSuccess(resp.Operation)
 }
 
-func (c *deleteCmd) run(config *lxd.Config, args []string) error {
+func (c *deleteCmd) run(conf *config.Config, args []string) error {
 	if len(args) == 0 {
 		return errArgs
 	}
 
 	for _, nameArg := range args {
-		remote, name := config.ParseRemoteAndContainer(nameArg)
+		remote, name, err := conf.ParseRemote(nameArg)
+		if err != nil {
+			return err
+		}
 
-		d, err := lxd.NewClient(config, remote)
+		d, err := lxd.NewClient(conf.Legacy(), remote)
 		if err != nil {
 			return err
 		}
diff --git a/lxc/exec.go b/lxc/exec.go
index c1d04564b..03829a8e5 100644
--- a/lxc/exec.go
+++ b/lxc/exec.go
@@ -13,7 +13,7 @@ import (
 
 	"github.com/gorilla/websocket"
 
-	"github.com/lxc/lxd"
+	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared/api"
 	"github.com/lxc/lxd/shared/gnuflag"
 	"github.com/lxc/lxd/shared/i18n"
@@ -116,7 +116,7 @@ func (c *execCmd) forwardSignal(control *websocket.Conn, sig syscall.Signal) err
 	return err
 }
 
-func (c *execCmd) run(config *lxd.Config, args []string) error {
+func (c *execCmd) run(conf *config.Config, args []string) error {
 	if len(args) < 2 {
 		return errArgs
 	}
@@ -129,8 +129,12 @@ func (c *execCmd) run(config *lxd.Config, args []string) error {
 		return fmt.Errorf(i18n.G("You can't pass -t or -T at the same time as --mode"))
 	}
 
-	remote, name := config.ParseRemoteAndContainer(args[0])
-	d, err := lxd.NewClient(config, remote)
+	remote, name, err := conf.ParseRemote(args[0])
+	if err != nil {
+		return err
+	}
+
+	d, err := lxd.NewClient(conf.Legacy(), remote)
 	if err != nil {
 		return err
 	}
diff --git a/lxc/file.go b/lxc/file.go
index 67ecbaf03..6821fefdd 100644
--- a/lxc/file.go
+++ b/lxc/file.go
@@ -11,6 +11,7 @@ import (
 	"syscall"
 
 	"github.com/lxc/lxd"
+	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared"
 	"github.com/lxc/lxd/shared/gnuflag"
 	"github.com/lxc/lxd/shared/i18n"
@@ -68,7 +69,7 @@ func (c *fileCmd) flags() {
 	gnuflag.BoolVar(&c.mkdirs, "p", false, i18n.G("Create any directories necessary"))
 }
 
-func (c *fileCmd) push(config *lxd.Config, send_file_perms bool, args []string) error {
+func (c *fileCmd) push(conf *config.Config, send_file_perms bool, args []string) error {
 	if len(args) < 2 {
 		return errArgs
 	}
@@ -80,7 +81,10 @@ func (c *fileCmd) push(config *lxd.Config, send_file_perms bool, args []string)
 		return fmt.Errorf(i18n.G("Invalid target %s"), target)
 	}
 
-	remote, container := config.ParseRemoteAndContainer(pathSpec[0])
+	remote, container, err := conf.ParseRemote(pathSpec[0])
+	if err != nil {
+		return err
+	}
 
 	targetIsDir := strings.HasSuffix(target, "/")
 	// re-add leading / that got stripped by the SplitN
@@ -95,7 +99,7 @@ func (c *fileCmd) push(config *lxd.Config, send_file_perms bool, args []string)
 
 	logger.Debugf("Pushing to: %s  (isdir: %t)", targetPath, targetIsDir)
 
-	d, err := lxd.NewClient(config, remote)
+	d, err := lxd.NewClient(conf.Legacy(), remote)
 	if err != nil {
 		return err
 	}
@@ -253,7 +257,7 @@ func (c *fileCmd) push(config *lxd.Config, send_file_perms bool, args []string)
 	return nil
 }
 
-func (c *fileCmd) pull(config *lxd.Config, args []string) error {
+func (c *fileCmd) pull(conf *config.Config, args []string) error {
 	if len(args) < 2 {
 		return errArgs
 	}
@@ -291,8 +295,12 @@ func (c *fileCmd) pull(config *lxd.Config, args []string) error {
 			return fmt.Errorf(i18n.G("Invalid source %s"), f)
 		}
 
-		remote, container := config.ParseRemoteAndContainer(pathSpec[0])
-		d, err := lxd.NewClient(config, remote)
+		remote, container, err := conf.ParseRemote(pathSpec[0])
+		if err != nil {
+			return err
+		}
+
+		d, err := lxd.NewClient(conf.Legacy(), remote)
 		if err != nil {
 			return err
 		}
@@ -346,7 +354,7 @@ func (c *fileCmd) pull(config *lxd.Config, args []string) error {
 	return nil
 }
 
-func (c *fileCmd) delete(config *lxd.Config, args []string) error {
+func (c *fileCmd) delete(conf *config.Config, args []string) error {
 	if len(args) < 1 {
 		return errArgs
 	}
@@ -357,8 +365,12 @@ func (c *fileCmd) delete(config *lxd.Config, args []string) error {
 			return fmt.Errorf(i18n.G("Invalid path %s"), f)
 		}
 
-		remote, container := config.ParseRemoteAndContainer(pathSpec[0])
-		d, err := lxd.NewClient(config, remote)
+		remote, container, err := conf.ParseRemote(pathSpec[0])
+		if err != nil {
+			return err
+		}
+
+		d, err := lxd.NewClient(conf.Legacy(), remote)
 		if err != nil {
 			return err
 		}
@@ -372,7 +384,7 @@ func (c *fileCmd) delete(config *lxd.Config, args []string) error {
 	return nil
 }
 
-func (c *fileCmd) edit(config *lxd.Config, args []string) error {
+func (c *fileCmd) edit(conf *config.Config, args []string) error {
 	if len(args) != 1 {
 		return errArgs
 	}
@@ -383,7 +395,7 @@ func (c *fileCmd) edit(config *lxd.Config, args []string) error {
 
 	// If stdin isn't a terminal, read text from it
 	if !termios.IsTerminal(int(syscall.Stdin)) {
-		return c.push(config, false, append([]string{os.Stdin.Name()}, args[0]))
+		return c.push(conf, false, append([]string{os.Stdin.Name()}, args[0]))
 	}
 
 	// Create temp file
@@ -394,7 +406,7 @@ func (c *fileCmd) edit(config *lxd.Config, args []string) error {
 	defer os.Remove(fname)
 
 	// Extract current value
-	err = c.pull(config, append([]string{args[0]}, fname))
+	err = c.pull(conf, append([]string{args[0]}, fname))
 	if err != nil {
 		return err
 	}
@@ -404,7 +416,7 @@ func (c *fileCmd) edit(config *lxd.Config, args []string) error {
 		return err
 	}
 
-	err = c.push(config, false, append([]string{fname}, args[0]))
+	err = c.push(conf, false, append([]string{fname}, args[0]))
 	if err != nil {
 		return err
 	}
@@ -412,20 +424,20 @@ func (c *fileCmd) edit(config *lxd.Config, args []string) error {
 	return nil
 }
 
-func (c *fileCmd) run(config *lxd.Config, args []string) error {
+func (c *fileCmd) run(conf *config.Config, args []string) error {
 	if len(args) < 1 {
 		return errUsage
 	}
 
 	switch args[0] {
 	case "push":
-		return c.push(config, true, args[1:])
+		return c.push(conf, true, args[1:])
 	case "pull":
-		return c.pull(config, args[1:])
+		return c.pull(conf, args[1:])
 	case "delete":
-		return c.delete(config, args[1:])
+		return c.delete(conf, args[1:])
 	case "edit":
-		return c.edit(config, args[1:])
+		return c.edit(conf, args[1:])
 	default:
 		return errArgs
 	}
diff --git a/lxc/finger.go b/lxc/finger.go
index ed192954f..911fee24b 100644
--- a/lxc/finger.go
+++ b/lxc/finger.go
@@ -2,6 +2,7 @@ package main
 
 import (
 	"github.com/lxc/lxd"
+	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared/i18n"
 )
 
@@ -20,25 +21,30 @@ Check if the LXD server is alive.`)
 
 func (c *fingerCmd) flags() {}
 
-func (c *fingerCmd) run(config *lxd.Config, args []string) error {
+func (c *fingerCmd) run(conf *config.Config, args []string) error {
 	if len(args) > 1 {
 		return errArgs
 	}
 
 	var remote string
 	if len(args) == 1 {
-		remote = config.ParseRemote(args[0])
+		var err error
+		remote, _, err = conf.ParseRemote(args[0])
+		if err != nil {
+			return err
+		}
 	} else {
-		remote = config.DefaultRemote
+		remote = conf.DefaultRemote
 	}
 
 	// New client may or may not need to connect to the remote host, but
 	// client.ServerStatus will at least request the basic information from
 	// the server.
-	client, err := lxd.NewClient(config, remote)
+	client, err := lxd.NewClient(conf.Legacy(), remote)
 	if err != nil {
 		return err
 	}
+
 	_, err = client.ServerStatus()
 	return err
 }
diff --git a/lxc/help.go b/lxc/help.go
index 27f0a82d7..fce7dfbd0 100644
--- a/lxc/help.go
+++ b/lxc/help.go
@@ -5,7 +5,7 @@ import (
 	"os"
 	"sort"
 
-	"github.com/lxc/lxd"
+	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared/gnuflag"
 	"github.com/lxc/lxd/shared/i18n"
 )
@@ -29,7 +29,7 @@ func (c *helpCmd) flags() {
 	gnuflag.BoolVar(&c.showAll, "all", false, i18n.G("Show all commands (not just interesting ones)"))
 }
 
-func (c *helpCmd) run(config *lxd.Config, args []string) error {
+func (c *helpCmd) run(conf *config.Config, args []string) error {
 	if len(args) > 0 {
 		for _, name := range args {
 			cmd, ok := commands[name]
diff --git a/lxc/image.go b/lxc/image.go
index bc2526124..b372a048e 100644
--- a/lxc/image.go
+++ b/lxc/image.go
@@ -15,6 +15,7 @@ import (
 	"gopkg.in/yaml.v2"
 
 	"github.com/lxc/lxd"
+	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared"
 	"github.com/lxc/lxd/shared/api"
 	"github.com/lxc/lxd/shared/gnuflag"
@@ -250,8 +251,10 @@ func (c *imageCmd) parseColumns() ([]imageColumn, error) {
 	return columns, nil
 }
 
-func (c *imageCmd) doImageAlias(config *lxd.Config, args []string) error {
+func (c *imageCmd) doImageAlias(conf *config.Config, args []string) error {
 	var remote string
+	var err error
+
 	switch args[1] {
 	case "list":
 		filters := []string{}
@@ -260,12 +263,21 @@ func (c *imageCmd) doImageAlias(config *lxd.Config, args []string) error {
 			result := strings.SplitN(args[2], ":", 2)
 			if len(result) == 1 {
 				filters = append(filters, args[2])
-				remote, _ = config.ParseRemoteAndContainer("")
+				remote, _, err = conf.ParseRemote("")
+				if err != nil {
+					return err
+				}
 			} else {
-				remote, _ = config.ParseRemoteAndContainer(args[2])
+				remote, _, err = conf.ParseRemote(args[2])
+				if err != nil {
+					return err
+				}
 			}
 		} else {
-			remote, _ = config.ParseRemoteAndContainer("")
+			remote, _, err = conf.ParseRemote("")
+			if err != nil {
+				return err
+			}
 		}
 
 		if len(args) > 3 {
@@ -274,7 +286,7 @@ func (c *imageCmd) doImageAlias(config *lxd.Config, args []string) error {
 			}
 		}
 
-		d, err := lxd.NewClient(config, remote)
+		d, err := lxd.NewClient(conf.Legacy(), remote)
 		if err != nil {
 			return err
 		}
@@ -292,9 +304,14 @@ func (c *imageCmd) doImageAlias(config *lxd.Config, args []string) error {
 		if len(args) < 4 {
 			return errArgs
 		}
-		remote, alias := config.ParseRemoteAndContainer(args[2])
+
+		remote, alias, err := conf.ParseRemote(args[2])
+		if err != nil {
+			return err
+		}
+
 		target := args[3]
-		d, err := lxd.NewClient(config, remote)
+		d, err := lxd.NewClient(conf.Legacy(), remote)
 		if err != nil {
 			return err
 		}
@@ -306,8 +323,13 @@ func (c *imageCmd) doImageAlias(config *lxd.Config, args []string) error {
 		if len(args) < 3 {
 			return errArgs
 		}
-		remote, alias := config.ParseRemoteAndContainer(args[2])
-		d, err := lxd.NewClient(config, remote)
+
+		remote, alias, err := conf.ParseRemote(args[2])
+		if err != nil {
+			return err
+		}
+
+		d, err := lxd.NewClient(conf.Legacy(), remote)
 		if err != nil {
 			return err
 		}
@@ -317,7 +339,7 @@ func (c *imageCmd) doImageAlias(config *lxd.Config, args []string) error {
 	return errArgs
 }
 
-func (c *imageCmd) run(config *lxd.Config, args []string) error {
+func (c *imageCmd) run(conf *config.Config, args []string) error {
 	var remote string
 
 	if len(args) < 1 {
@@ -329,7 +351,7 @@ func (c *imageCmd) run(config *lxd.Config, args []string) error {
 		if len(args) < 2 {
 			return errArgs
 		}
-		return c.doImageAlias(config, args)
+		return c.doImageAlias(conf, args)
 
 	case "copy":
 		/* copy [<remote>:]<image> [<rmeote>:]<image> */
@@ -337,22 +359,30 @@ func (c *imageCmd) run(config *lxd.Config, args []string) error {
 			return errArgs
 		}
 
-		remote, inName := config.ParseRemoteAndContainer(args[1])
+		remote, inName, err := conf.ParseRemote(args[1])
+		if err != nil {
+			return err
+		}
+
 		if inName == "" {
 			inName = "default"
 		}
 
-		destRemote, outName := config.ParseRemoteAndContainer(args[2])
+		destRemote, outName, err := conf.ParseRemote(args[2])
+		if err != nil {
+			return err
+		}
+
 		if outName != "" {
 			return errArgs
 		}
 
-		d, err := lxd.NewClient(config, remote)
+		d, err := lxd.NewClient(conf.Legacy(), remote)
 		if err != nil {
 			return err
 		}
 
-		dest, err := lxd.NewClient(config, destRemote)
+		dest, err := lxd.NewClient(conf.Legacy(), destRemote)
 		if err != nil {
 			return err
 		}
@@ -373,12 +403,17 @@ func (c *imageCmd) run(config *lxd.Config, args []string) error {
 		}
 
 		for _, arg := range args[1:] {
-			remote, inName := config.ParseRemoteAndContainer(arg)
+			var err error
+			remote, inName, err := conf.ParseRemote(arg)
+			if err != nil {
+				return err
+			}
+
 			if inName == "" {
 				inName = "default"
 			}
 
-			d, err := lxd.NewClient(config, remote)
+			d, err := lxd.NewClient(conf.Legacy(), remote)
 			if err != nil {
 				return err
 			}
@@ -430,12 +465,16 @@ func (c *imageCmd) run(config *lxd.Config, args []string) error {
 			return errArgs
 		}
 
-		remote, inName := config.ParseRemoteAndContainer(args[1])
+		remote, inName, err := conf.ParseRemote(args[1])
+		if err != nil {
+			return err
+		}
+
 		if inName == "" {
 			inName = "default"
 		}
 
-		d, err := lxd.NewClient(config, remote)
+		d, err := lxd.NewClient(conf.Legacy(), remote)
 		if err != nil {
 			return err
 		}
@@ -512,7 +551,11 @@ func (c *imageCmd) run(config *lxd.Config, args []string) error {
 			split := strings.Split(arg, "=")
 			if len(split) == 1 || shared.PathExists(arg) {
 				if strings.HasSuffix(arg, ":") {
-					remote = config.ParseRemote(arg)
+					var err error
+					remote, _, err = conf.ParseRemote(arg)
+					if err != nil {
+						return err
+					}
 				} else {
 					if imageFile == "" {
 						imageFile = args[1]
@@ -526,7 +569,7 @@ func (c *imageCmd) run(config *lxd.Config, args []string) error {
 		}
 
 		if remote == "" {
-			remote = config.DefaultRemote
+			remote = conf.DefaultRemote
 		}
 
 		if imageFile == "" {
@@ -534,7 +577,7 @@ func (c *imageCmd) run(config *lxd.Config, args []string) error {
 			properties = properties[1:]
 		}
 
-		d, err := lxd.NewClient(config, remote)
+		d, err := lxd.NewClient(conf.Legacy(), remote)
 		if err != nil {
 			return err
 		}
@@ -576,12 +619,22 @@ func (c *imageCmd) run(config *lxd.Config, args []string) error {
 			result := strings.SplitN(args[1], ":", 2)
 			if len(result) == 1 {
 				filters = append(filters, args[1])
-				remote, _ = config.ParseRemoteAndContainer("")
+
+				remote, _, err = conf.ParseRemote("")
+				if err != nil {
+					return err
+				}
 			} else {
-				remote, _ = config.ParseRemoteAndContainer(args[1])
+				remote, _, err = conf.ParseRemote(args[1])
+				if err != nil {
+					return err
+				}
 			}
 		} else {
-			remote, _ = config.ParseRemoteAndContainer("")
+			remote, _, err = conf.ParseRemote("")
+			if err != nil {
+				return err
+			}
 		}
 
 		if len(args) > 2 {
@@ -590,7 +643,7 @@ func (c *imageCmd) run(config *lxd.Config, args []string) error {
 			}
 		}
 
-		d, err := lxd.NewClient(config, remote)
+		d, err := lxd.NewClient(conf.Legacy(), remote)
 		if err != nil {
 			return err
 		}
@@ -616,12 +669,16 @@ func (c *imageCmd) run(config *lxd.Config, args []string) error {
 			return errArgs
 		}
 
-		remote, inName := config.ParseRemoteAndContainer(args[1])
+		remote, inName, err := conf.ParseRemote(args[1])
+		if err != nil {
+			return err
+		}
+
 		if inName == "" {
 			inName = "default"
 		}
 
-		d, err := lxd.NewClient(config, remote)
+		d, err := lxd.NewClient(conf.Legacy(), remote)
 		if err != nil {
 			return err
 		}
@@ -638,12 +695,16 @@ func (c *imageCmd) run(config *lxd.Config, args []string) error {
 			return errArgs
 		}
 
-		remote, inName := config.ParseRemoteAndContainer(args[1])
+		remote, inName, err := conf.ParseRemote(args[1])
+		if err != nil {
+			return err
+		}
+
 		if inName == "" {
 			inName = "default"
 		}
 
-		d, err := lxd.NewClient(config, remote)
+		d, err := lxd.NewClient(conf.Legacy(), remote)
 		if err != nil {
 			return err
 		}
@@ -670,12 +731,16 @@ func (c *imageCmd) run(config *lxd.Config, args []string) error {
 			return errArgs
 		}
 
-		remote, inName := config.ParseRemoteAndContainer(args[1])
+		remote, inName, err := conf.ParseRemote(args[1])
+		if err != nil {
+			return err
+		}
+
 		if inName == "" {
 			inName = "default"
 		}
 
-		d, err := lxd.NewClient(config, remote)
+		d, err := lxd.NewClient(conf.Legacy(), remote)
 		if err != nil {
 			return err
 		}
@@ -838,12 +903,12 @@ func (c *imageCmd) doImageEdit(client *lxd.Client, image string) error {
 	}
 
 	// Extract the current value
-	config, err := client.GetImageInfo(image)
+	imgInfo, err := client.GetImageInfo(image)
 	if err != nil {
 		return err
 	}
 
-	brief := config.Writable()
+	brief := imgInfo.Writable()
 	data, err := yaml.Marshal(&brief)
 	if err != nil {
 		return err
diff --git a/lxc/info.go b/lxc/info.go
index 80ce79509..fe6b6f6a3 100644
--- a/lxc/info.go
+++ b/lxc/info.go
@@ -8,6 +8,7 @@ import (
 	"gopkg.in/yaml.v2"
 
 	"github.com/lxc/lxd"
+	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared"
 	"github.com/lxc/lxd/shared/gnuflag"
 	"github.com/lxc/lxd/shared/i18n"
@@ -38,16 +39,23 @@ func (c *infoCmd) flags() {
 	gnuflag.BoolVar(&c.showLog, "show-log", false, i18n.G("Show the container's last 100 log lines?"))
 }
 
-func (c *infoCmd) run(config *lxd.Config, args []string) error {
+func (c *infoCmd) run(conf *config.Config, args []string) error {
 	var remote string
 	var cName string
+	var err error
 	if len(args) == 1 {
-		remote, cName = config.ParseRemoteAndContainer(args[0])
+		remote, cName, err = conf.ParseRemote(args[0])
+		if err != nil {
+			return err
+		}
 	} else {
-		remote, cName = config.ParseRemoteAndContainer("")
+		remote, cName, err = conf.ParseRemote("")
+		if err != nil {
+			return err
+		}
 	}
 
-	d, err := lxd.NewClient(config, remote)
+	d, err := lxd.NewClient(conf.Legacy(), remote)
 	if err != nil {
 		return err
 	}
diff --git a/lxc/init.go b/lxc/init.go
index cf3181294..17f611eb5 100644
--- a/lxc/init.go
+++ b/lxc/init.go
@@ -6,6 +6,7 @@ import (
 	"strings"
 
 	"github.com/lxc/lxd"
+	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared/api"
 	"github.com/lxc/lxd/shared/gnuflag"
 	"github.com/lxc/lxd/shared/i18n"
@@ -144,22 +145,31 @@ func (c *initCmd) flags() {
 	gnuflag.StringVar(&c.storagePool, "s", "", i18n.G("Storage pool name"))
 }
 
-func (c *initCmd) run(config *lxd.Config, args []string) error {
+func (c *initCmd) run(conf *config.Config, args []string) error {
 	if len(args) > 2 || len(args) < 1 {
 		return errArgs
 	}
 
-	iremote, image := config.ParseRemoteAndContainer(args[0])
+	iremote, image, err := conf.ParseRemote(args[0])
+	if err != nil {
+		return err
+	}
 
 	var name string
 	var remote string
 	if len(args) == 2 {
-		remote, name = config.ParseRemoteAndContainer(args[1])
+		remote, name, err = conf.ParseRemote(args[1])
+		if err != nil {
+			return err
+		}
 	} else {
-		remote, name = config.ParseRemoteAndContainer("")
+		remote, name, err = conf.ParseRemote("")
+		if err != nil {
+			return err
+		}
 	}
 
-	d, err := lxd.NewClient(config, remote)
+	d, err := lxd.NewClient(conf.Legacy(), remote)
 	if err != nil {
 		return err
 	}
@@ -182,7 +192,7 @@ func (c *initCmd) run(config *lxd.Config, args []string) error {
 		fmt.Printf(i18n.G("Creating %s")+"\n", name)
 	}
 
-	iremote, image = c.guessImage(config, d, remote, iremote, image)
+	iremote, image = c.guessImage(conf, d, remote, iremote, image)
 
 	devicesMap := map[string]map[string]string{}
 	if c.network != "" {
@@ -287,12 +297,12 @@ func (c *initCmd) initProgressTracker(d *lxd.Client, progress *ProgressRenderer,
 	go d.Monitor([]string{"operation"}, handler, nil)
 }
 
-func (c *initCmd) guessImage(config *lxd.Config, d *lxd.Client, remote string, iremote string, image string) (string, string) {
+func (c *initCmd) guessImage(conf *config.Config, d *lxd.Client, remote string, iremote string, image string) (string, string) {
 	if remote != iremote {
 		return iremote, image
 	}
 
-	_, ok := config.Remotes[image]
+	_, ok := conf.Remotes[image]
 	if !ok {
 		return iremote, image
 	}
diff --git a/lxc/launch.go b/lxc/launch.go
index 06897069d..424d85834 100644
--- a/lxc/launch.go
+++ b/lxc/launch.go
@@ -5,6 +5,7 @@ import (
 	"strings"
 
 	"github.com/lxc/lxd"
+	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared"
 	"github.com/lxc/lxd/shared/api"
 	"github.com/lxc/lxd/shared/i18n"
@@ -37,22 +38,31 @@ func (c *launchCmd) flags() {
 	c.init.flags()
 }
 
-func (c *launchCmd) run(config *lxd.Config, args []string) error {
+func (c *launchCmd) run(conf *config.Config, args []string) error {
 	if len(args) > 2 || len(args) < 1 {
 		return errArgs
 	}
 
-	iremote, image := config.ParseRemoteAndContainer(args[0])
+	iremote, image, err := conf.ParseRemote(args[0])
+	if err != nil {
+		return err
+	}
 
 	var name string
 	var remote string
 	if len(args) == 2 {
-		remote, name = config.ParseRemoteAndContainer(args[1])
+		remote, name, err = conf.ParseRemote(args[1])
+		if err != nil {
+			return err
+		}
 	} else {
-		remote, name = config.ParseRemoteAndContainer("")
+		remote, name, err = conf.ParseRemote("")
+		if err != nil {
+			return err
+		}
 	}
 
-	d, err := lxd.NewClient(config, remote)
+	d, err := lxd.NewClient(conf.Legacy(), remote)
 	if err != nil {
 		return err
 	}
@@ -67,7 +77,7 @@ func (c *launchCmd) run(config *lxd.Config, args []string) error {
 		profiles = append(profiles, p)
 	}
 
-	iremote, image = c.init.guessImage(config, d, remote, iremote, image)
+	iremote, image = c.init.guessImage(conf, d, remote, iremote, image)
 
 	devicesMap := map[string]map[string]string{}
 	if c.init.network != "" {
diff --git a/lxc/list.go b/lxc/list.go
index d4a465df5..0866156ce 100644
--- a/lxc/list.go
+++ b/lxc/list.go
@@ -15,6 +15,7 @@ import (
 	"gopkg.in/yaml.v2"
 
 	"github.com/lxc/lxd"
+	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared"
 	"github.com/lxc/lxd/shared/api"
 	"github.com/lxc/lxd/shared/gnuflag"
@@ -400,7 +401,7 @@ type listContainerItem struct {
 	Snapshots []api.ContainerSnapshot `json:"snapshots" yaml:"snapshots"`
 }
 
-func (c *listCmd) run(config *lxd.Config, args []string) error {
+func (c *listCmd) run(conf *config.Config, args []string) error {
 	var remote string
 	name := ""
 
@@ -409,20 +410,25 @@ func (c *listCmd) run(config *lxd.Config, args []string) error {
 	if len(args) != 0 {
 		filters = args
 		if strings.Contains(args[0], ":") && !strings.Contains(args[0], "=") {
-			remote, name = config.ParseRemoteAndContainer(args[0])
+			var err error
+			remote, name, err = conf.ParseRemote(args[0])
+			if err != nil {
+				return err
+			}
+
 			filters = args[1:]
 		} else if !strings.Contains(args[0], "=") {
-			remote = config.DefaultRemote
+			remote = conf.DefaultRemote
 			name = args[0]
 		}
 	}
 	filters = append(filters, name)
 
 	if remote == "" {
-		remote = config.DefaultRemote
+		remote = conf.DefaultRemote
 	}
 
-	d, err := lxd.NewClient(config, remote)
+	d, err := lxd.NewClient(conf.Legacy(), remote)
 	if err != nil {
 		return err
 	}
diff --git a/lxc/main.go b/lxc/main.go
index a8af4beab..3d0c245d9 100644
--- a/lxc/main.go
+++ b/lxc/main.go
@@ -5,15 +5,17 @@ import (
 	"os"
 	"os/exec"
 	"path"
+	"path/filepath"
 	"strings"
 	"syscall"
 
-	"github.com/lxc/lxd"
+	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared"
 	"github.com/lxc/lxd/shared/gnuflag"
 	"github.com/lxc/lxd/shared/i18n"
 	"github.com/lxc/lxd/shared/logger"
 	"github.com/lxc/lxd/shared/logging"
+	"github.com/lxc/lxd/shared/version"
 )
 
 var configPath string
@@ -25,7 +27,7 @@ func main() {
 	if err := run(); err != nil {
 		msg := fmt.Sprintf(i18n.G("error: %v"), err)
 
-		lxdErr := lxd.GetLocalLXDErr(err)
+		lxdErr := getLocalErr(err)
 		switch lxdErr {
 		case syscall.ENOENT:
 			msg = i18n.G("LXD socket not found; is LXD installed and running?")
@@ -74,18 +76,24 @@ func run() error {
 		os.Exit(1)
 	}
 
-	var config *lxd.Config
+	var conf *config.Config
 	var err error
 
 	if *forceLocal {
-		config = &lxd.DefaultConfig
-	} else {
-		config, err = lxd.LoadConfig(configPath)
+		conf = &config.DefaultConfig
+	} else if shared.PathExists(configPath) {
+		conf, err = config.LoadConfig(configPath)
 		if err != nil {
 			return err
 		}
+	} else {
+		conf = &config.DefaultConfig
+		conf.ConfigDir = filepath.Dir(configPath)
 	}
 
+	// Set the user agent
+	conf.UserAgent = version.UserAgent
+
 	// This is quite impolite, but it seems gnuflag needs us to shift our
 	// own exename out of the arguments before parsing them. However, this
 	// is useful for execIfAlias, which wants to know exactly the command
@@ -98,7 +106,7 @@ func run() error {
 	 * --no-alias by hand.
 	 */
 	if !shared.StringInSlice("--no-alias", origArgs) {
-		execIfAliases(config, origArgs)
+		execIfAliases(conf, origArgs)
 	}
 	cmd, ok := commands[name]
 	if !ok {
@@ -128,10 +136,16 @@ func run() error {
 	// and this is the first time the client has been run by the user, then check to see
 	// if LXD has been properly configured.  Don't display the message if the var path
 	// does not exist (LXD not installed), as the user may be targeting a remote daemon.
-	if os.Args[0] != "help" && os.Args[0] != "version" && shared.PathExists(shared.VarPath("")) && !shared.PathExists(config.ConfigDir) {
+	if os.Args[0] != "help" && os.Args[0] != "version" && shared.PathExists(shared.VarPath("")) && !shared.PathExists(conf.ConfigDir) {
 
 		// Create the config dir so that we don't get in here again for this user.
-		err = os.MkdirAll(config.ConfigDir, 0750)
+		err = os.MkdirAll(conf.ConfigDir, 0750)
+		if err != nil {
+			return err
+		}
+
+		// And save the initial configuration
+		err = conf.SaveConfig(configPath)
 		if err != nil {
 			return err
 		}
@@ -140,7 +154,7 @@ func run() error {
 		fmt.Fprintf(os.Stderr, i18n.G("To start your first container, try: lxc launch ubuntu:16.04")+"\n\n")
 	}
 
-	err = cmd.run(config, gnuflag.Args())
+	err = cmd.run(conf, gnuflag.Args())
 	if err == errArgs || err == errUsage {
 		out := os.Stdout
 		if err == errArgs {
@@ -148,7 +162,7 @@ func run() error {
 			 * expand this as an alias
 			 */
 			if !*noAlias {
-				execIfAliases(config, origArgs)
+				execIfAliases(conf, origArgs)
 			}
 
 			out = os.Stderr
@@ -177,7 +191,7 @@ type command interface {
 	usage() string
 	flags()
 	showByDefault() bool
-	run(config *lxd.Config, args []string) error
+	run(conf *config.Config, args []string) error
 }
 
 var commands = map[string]command{
@@ -286,8 +300,8 @@ func findAlias(aliases map[string]string, origArgs []string) ([]string, []string
 	return aliasKey, aliasValue, foundAlias
 }
 
-func expandAlias(config *lxd.Config, origArgs []string) ([]string, bool) {
-	aliasKey, aliasValue, foundAlias := findAlias(config.Aliases, origArgs)
+func expandAlias(conf *config.Config, origArgs []string) ([]string, bool) {
+	aliasKey, aliasValue, foundAlias := findAlias(conf.Aliases, origArgs)
 	if !foundAlias {
 		aliasKey, aliasValue, foundAlias = findAlias(defaultAliases, origArgs)
 		if !foundAlias {
@@ -320,8 +334,8 @@ func expandAlias(config *lxd.Config, origArgs []string) ([]string, bool) {
 	return newArgs, true
 }
 
-func execIfAliases(config *lxd.Config, origArgs []string) {
-	newArgs, expanded := expandAlias(config, origArgs)
+func execIfAliases(conf *config.Config, origArgs []string) {
+	newArgs, expanded := expandAlias(conf, origArgs)
 	if !expanded {
 		return
 	}
diff --git a/lxc/main_test.go b/lxc/main_test.go
index 30fc0cb6f..cb7fd81d6 100644
--- a/lxc/main_test.go
+++ b/lxc/main_test.go
@@ -3,7 +3,7 @@ package main
 import (
 	"testing"
 
-	"github.com/lxc/lxd"
+	"github.com/lxc/lxd/lxc/config"
 )
 
 type aliasTestcase struct {
@@ -54,7 +54,7 @@ func TestExpandAliases(t *testing.T) {
 		},
 	}
 
-	conf := &lxd.Config{Aliases: aliases}
+	conf := &config.Config{Aliases: aliases}
 
 	for _, tc := range testcases {
 		result, expanded := expandAlias(conf, tc.input)
diff --git a/lxc/manpage.go b/lxc/manpage.go
index 697f015d4..edf3ceb9e 100644
--- a/lxc/manpage.go
+++ b/lxc/manpage.go
@@ -6,7 +6,7 @@ import (
 	"os/exec"
 	"path/filepath"
 
-	"github.com/lxc/lxd"
+	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared/i18n"
 )
 
@@ -26,7 +26,7 @@ Generate all the LXD manpages.`)
 func (c *manpageCmd) flags() {
 }
 
-func (c *manpageCmd) run(_ *lxd.Config, args []string) error {
+func (c *manpageCmd) run(conf *config.Config, args []string) error {
 	if len(args) != 1 {
 		return errArgs
 	}
diff --git a/lxc/monitor.go b/lxc/monitor.go
index 3b5d1b8c7..4c428afe4 100644
--- a/lxc/monitor.go
+++ b/lxc/monitor.go
@@ -6,6 +6,7 @@ import (
 	"gopkg.in/yaml.v2"
 
 	"github.com/lxc/lxd"
+	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared/gnuflag"
 	"github.com/lxc/lxd/shared/i18n"
 )
@@ -56,7 +57,8 @@ func (c *monitorCmd) flags() {
 	gnuflag.Var(&c.typeArgs, "type", i18n.G("Event type to listen for"))
 }
 
-func (c *monitorCmd) run(config *lxd.Config, args []string) error {
+func (c *monitorCmd) run(conf *config.Config, args []string) error {
+	var err error
 	var remote string
 
 	if len(args) > 1 {
@@ -64,12 +66,18 @@ func (c *monitorCmd) run(config *lxd.Config, args []string) error {
 	}
 
 	if len(args) == 0 {
-		remote, _ = config.ParseRemoteAndContainer("")
+		remote, _, err = conf.ParseRemote("")
+		if err != nil {
+			return err
+		}
 	} else {
-		remote, _ = config.ParseRemoteAndContainer(args[0])
+		remote, _, err = conf.ParseRemote(args[0])
+		if err != nil {
+			return err
+		}
 	}
 
-	d, err := lxd.NewClient(config, remote)
+	d, err := lxd.NewClient(conf.Legacy(), remote)
 	if err != nil {
 		return err
 	}
diff --git a/lxc/move.go b/lxc/move.go
index 1e7e70ce4..27440fffd 100644
--- a/lxc/move.go
+++ b/lxc/move.go
@@ -2,6 +2,7 @@ package main
 
 import (
 	"github.com/lxc/lxd"
+	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared/i18n"
 
 	"github.com/lxc/lxd/shared/gnuflag"
@@ -35,13 +36,20 @@ func (c *moveCmd) flags() {
 	gnuflag.BoolVar(&c.containerOnly, "container-only", false, i18n.G("Move the container without its snapshots"))
 }
 
-func (c *moveCmd) run(config *lxd.Config, args []string) error {
+func (c *moveCmd) run(conf *config.Config, args []string) error {
 	if len(args) != 2 {
 		return errArgs
 	}
 
-	sourceRemote, sourceName := config.ParseRemoteAndContainer(args[0])
-	destRemote, destName := config.ParseRemoteAndContainer(args[1])
+	sourceRemote, sourceName, err := conf.ParseRemote(args[0])
+	if err != nil {
+		return err
+	}
+
+	destRemote, destName, err := conf.ParseRemote(args[1])
+	if err != nil {
+		return err
+	}
 
 	// As an optimization, if the source an destination are the same, do
 	// this via a simple rename. This only works for containers that aren't
@@ -49,7 +57,7 @@ func (c *moveCmd) run(config *lxd.Config, args []string) error {
 	// course, this changing of hostname isn't supported right now, so this
 	// simply won't work).
 	if sourceRemote == destRemote {
-		source, err := lxd.NewClient(config, sourceRemote)
+		source, err := lxd.NewClient(conf.Legacy(), sourceRemote)
 		if err != nil {
 			return err
 		}
@@ -66,10 +74,10 @@ func (c *moveCmd) run(config *lxd.Config, args []string) error {
 
 	// A move is just a copy followed by a delete; however, we want to
 	// keep the volatile entries around since we are moving the container.
-	err := cpy.copyContainer(config, args[0], args[1], true, -1, true, c.containerOnly)
+	err = cpy.copyContainer(conf, args[0], args[1], true, -1, true, c.containerOnly)
 	if err != nil {
 		return err
 	}
 
-	return commands["delete"].run(config, args[:1])
+	return commands["delete"].run(conf, args[:1])
 }
diff --git a/lxc/network.go b/lxc/network.go
index be0dfcd58..63f0fc222 100644
--- a/lxc/network.go
+++ b/lxc/network.go
@@ -12,6 +12,7 @@ import (
 	"gopkg.in/yaml.v2"
 
 	"github.com/lxc/lxd"
+	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared"
 	"github.com/lxc/lxd/shared/api"
 	"github.com/lxc/lxd/shared/i18n"
@@ -94,21 +95,25 @@ cat network.yaml | lxc network edit <network>
 
 func (c *networkCmd) flags() {}
 
-func (c *networkCmd) run(config *lxd.Config, args []string) error {
+func (c *networkCmd) run(conf *config.Config, args []string) error {
 	if len(args) < 1 {
 		return errUsage
 	}
 
 	if args[0] == "list" {
-		return c.doNetworkList(config, args)
+		return c.doNetworkList(conf, args)
 	}
 
 	if len(args) < 2 {
 		return errArgs
 	}
 
-	remote, network := config.ParseRemoteAndContainer(args[1])
-	client, err := lxd.NewClient(config, remote)
+	remote, network, err := conf.ParseRemote(args[1])
+	if err != nil {
+		return err
+	}
+
+	client, err := lxd.NewClient(conf.Legacy(), remote)
 	if err != nil {
 		return err
 	}
@@ -413,19 +418,25 @@ func (c *networkCmd) doNetworkGet(client *lxd.Client, name string, args []string
 	return nil
 }
 
-func (c *networkCmd) doNetworkList(config *lxd.Config, args []string) error {
+func (c *networkCmd) doNetworkList(conf *config.Config, args []string) error {
 	var remote string
+	var err error
+
 	if len(args) > 1 {
 		var name string
-		remote, name = config.ParseRemoteAndContainer(args[1])
+		remote, name, err = conf.ParseRemote(args[1])
+		if err != nil {
+			return err
+		}
+
 		if name != "" {
 			return fmt.Errorf(i18n.G("Cannot provide container name to list"))
 		}
 	} else {
-		remote = config.DefaultRemote
+		remote = conf.DefaultRemote
 	}
 
-	client, err := lxd.NewClient(config, remote)
+	client, err := lxd.NewClient(conf.Legacy(), remote)
 	if err != nil {
 		return err
 	}
diff --git a/lxc/profile.go b/lxc/profile.go
index 70221a499..6c9401659 100644
--- a/lxc/profile.go
+++ b/lxc/profile.go
@@ -11,6 +11,7 @@ import (
 	"gopkg.in/yaml.v2"
 
 	"github.com/lxc/lxd"
+	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared"
 	"github.com/lxc/lxd/shared/api"
 	"github.com/lxc/lxd/shared/i18n"
@@ -127,21 +128,25 @@ lxc profile assign foo ''
 
 func (c *profileCmd) flags() {}
 
-func (c *profileCmd) run(config *lxd.Config, args []string) error {
+func (c *profileCmd) run(conf *config.Config, args []string) error {
 	if len(args) < 1 {
 		return errUsage
 	}
 
 	if args[0] == "list" {
-		return c.doProfileList(config, args)
+		return c.doProfileList(conf, args)
 	}
 
 	if len(args) < 2 {
 		return errArgs
 	}
 
-	remote, profile := config.ParseRemoteAndContainer(args[1])
-	client, err := lxd.NewClient(config, remote)
+	remote, profile, err := conf.ParseRemote(args[1])
+	if err != nil {
+		return err
+	}
+
+	client, err := lxd.NewClient(conf.Legacy(), remote)
 	if err != nil {
 		return err
 	}
@@ -152,7 +157,7 @@ func (c *profileCmd) run(config *lxd.Config, args []string) error {
 	case "delete":
 		return c.doProfileDelete(client, profile)
 	case "device":
-		return c.doProfileDevice(config, args)
+		return c.doProfileDevice(conf, args)
 	case "edit":
 		return c.doProfileEdit(client, profile)
 	case "apply", "assign":
@@ -195,7 +200,7 @@ func (c *profileCmd) run(config *lxd.Config, args []string) error {
 	case "unset":
 		return c.doProfileUnset(client, profile, args[2:])
 	case "copy":
-		return c.doProfileCopy(config, client, profile, args[2:])
+		return c.doProfileCopy(conf, client, profile, args[2:])
 	case "show":
 		return c.doProfileShow(client, profile)
 	default:
@@ -363,16 +368,21 @@ func (c *profileCmd) doProfileShow(client *lxd.Client, p string) error {
 	return nil
 }
 
-func (c *profileCmd) doProfileCopy(config *lxd.Config, client *lxd.Client, p string, args []string) error {
+func (c *profileCmd) doProfileCopy(conf *config.Config, client *lxd.Client, p string, args []string) error {
 	if len(args) != 1 {
 		return errArgs
 	}
-	remote, newname := config.ParseRemoteAndContainer(args[0])
+
+	remote, newname, err := conf.ParseRemote(args[0])
+	if err != nil {
+		return err
+	}
+
 	if newname == "" {
 		newname = p
 	}
 
-	dest, err := lxd.NewClient(config, remote)
+	dest, err := lxd.NewClient(conf.Legacy(), remote)
 	if err != nil {
 		return err
 	}
@@ -380,7 +390,7 @@ func (c *profileCmd) doProfileCopy(config *lxd.Config, client *lxd.Client, p str
 	return client.ProfileCopy(p, newname, dest)
 }
 
-func (c *profileCmd) doProfileDevice(config *lxd.Config, args []string) error {
+func (c *profileCmd) doProfileDevice(conf *config.Config, args []string) error {
 	// device add b1 eth0 nic type=bridged
 	// device list b1
 	// device remove b1 eth0
@@ -392,19 +402,19 @@ func (c *profileCmd) doProfileDevice(config *lxd.Config, args []string) error {
 
 	switch args[1] {
 	case "add":
-		return cfg.deviceAdd(config, "profile", args)
+		return cfg.deviceAdd(conf, "profile", args)
 	case "remove":
-		return cfg.deviceRm(config, "profile", args)
+		return cfg.deviceRm(conf, "profile", args)
 	case "list":
-		return cfg.deviceList(config, "profile", args)
+		return cfg.deviceList(conf, "profile", args)
 	case "show":
-		return cfg.deviceShow(config, "profile", args)
+		return cfg.deviceShow(conf, "profile", args)
 	case "get":
-		return cfg.deviceGet(config, "profile", args)
+		return cfg.deviceGet(conf, "profile", args)
 	case "set":
-		return cfg.deviceSet(config, "profile", args)
+		return cfg.deviceSet(conf, "profile", args)
 	case "unset":
-		return cfg.deviceUnset(config, "profile", args)
+		return cfg.deviceUnset(conf, "profile", args)
 	default:
 		return errArgs
 	}
@@ -463,19 +473,24 @@ func (c *profileCmd) doProfileUnset(client *lxd.Client, p string, args []string)
 	return c.doProfileSet(client, p, args)
 }
 
-func (c *profileCmd) doProfileList(config *lxd.Config, args []string) error {
+func (c *profileCmd) doProfileList(conf *config.Config, args []string) error {
 	var remote string
 	if len(args) > 1 {
 		var name string
-		remote, name = config.ParseRemoteAndContainer(args[1])
+		var err error
+		remote, name, err = conf.ParseRemote(args[1])
+		if err != nil {
+			return err
+		}
+
 		if name != "" {
 			return fmt.Errorf(i18n.G("Cannot provide container name to list"))
 		}
 	} else {
-		remote = config.DefaultRemote
+		remote = conf.DefaultRemote
 	}
 
-	client, err := lxd.NewClient(config, remote)
+	client, err := lxd.NewClient(conf.Legacy(), remote)
 	if err != nil {
 		return err
 	}
diff --git a/lxc/publish.go b/lxc/publish.go
index b932dfac9..04305d025 100644
--- a/lxc/publish.go
+++ b/lxc/publish.go
@@ -5,6 +5,7 @@ import (
 	"strings"
 
 	"github.com/lxc/lxd"
+	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared/api"
 	"github.com/lxc/lxd/shared/gnuflag"
 	"github.com/lxc/lxd/shared/i18n"
@@ -38,9 +39,7 @@ func (c *publishCmd) flags() {
 	gnuflag.StringVar(&c.compression_algorithm, "compression", "", i18n.G("Define a compression algorithm: for image or none"))
 }
 
-func (c *publishCmd) run(config *lxd.Config, args []string) error {
-	var cRemote string
-	var cName string
+func (c *publishCmd) run(conf *config.Config, args []string) error {
 	iName := ""
 	iRemote := ""
 	properties := map[string]string{}
@@ -50,12 +49,22 @@ func (c *publishCmd) run(config *lxd.Config, args []string) error {
 		return errArgs
 	}
 
-	cRemote, cName = config.ParseRemoteAndContainer(args[0])
+	cRemote, cName, err := conf.ParseRemote(args[0])
+	if err != nil {
+		return err
+	}
+
 	if len(args) >= 2 && !strings.Contains(args[1], "=") {
 		firstprop = 2
-		iRemote, iName = config.ParseRemoteAndContainer(args[1])
+		iRemote, iName, err = conf.ParseRemote(args[1])
+		if err != nil {
+			return err
+		}
 	} else {
-		iRemote, iName = config.ParseRemoteAndContainer("")
+		iRemote, iName, err = conf.ParseRemote("")
+		if err != nil {
+			return err
+		}
 	}
 
 	if cName == "" {
@@ -65,14 +74,14 @@ func (c *publishCmd) run(config *lxd.Config, args []string) error {
 		return fmt.Errorf(i18n.G("There is no \"image name\".  Did you want an alias?"))
 	}
 
-	d, err := lxd.NewClient(config, iRemote)
+	d, err := lxd.NewClient(conf.Legacy(), iRemote)
 	if err != nil {
 		return err
 	}
 
 	s := d
 	if cRemote != iRemote {
-		s, err = lxd.NewClient(config, cRemote)
+		s, err = lxd.NewClient(conf.Legacy(), cRemote)
 		if err != nil {
 			return err
 		}
diff --git a/lxc/remote.go b/lxc/remote.go
index d9b04eddb..519dd584b 100644
--- a/lxc/remote.go
+++ b/lxc/remote.go
@@ -17,6 +17,7 @@ import (
 	"golang.org/x/crypto/ssh/terminal"
 
 	"github.com/lxc/lxd"
+	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared"
 	"github.com/lxc/lxd/shared/gnuflag"
 	"github.com/lxc/lxd/shared/i18n"
@@ -69,13 +70,13 @@ func (c *remoteCmd) flags() {
 	gnuflag.BoolVar(&c.public, "public", false, i18n.G("Public image server"))
 }
 
-func (c *remoteCmd) generateClientCertificate(config *lxd.Config) error {
+func (c *remoteCmd) generateClientCertificate(conf *config.Config) error {
 	// Generate a client certificate if necessary.  The default repositories are
 	// either local or public, neither of which requires a client certificate.
 	// Generation of the cert is delayed to avoid unnecessary overhead, e.g in
 	// testing scenarios where only the default repositories are used.
-	certf := config.ConfigPath("client.crt")
-	keyf := config.ConfigPath("client.key")
+	certf := conf.ConfigPath("client.crt")
+	keyf := conf.ConfigPath("client.key")
 	if !shared.PathExists(certf) || !shared.PathExists(keyf) {
 		fmt.Fprintf(os.Stderr, i18n.G("Generating a client certificate. This may take a minute...")+"\n")
 
@@ -113,14 +114,14 @@ func (c *remoteCmd) getRemoteCertificate(address string) (*x509.Certificate, err
 	return resp.TLS.PeerCertificates[0], nil
 }
 
-func (c *remoteCmd) addServer(config *lxd.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) error {
 	var rScheme string
 	var rHost string
 	var rPort string
 
 	// Setup the remotes list
-	if config.Remotes == nil {
-		config.Remotes = make(map[string]lxd.RemoteConfig)
+	if conf.Remotes == nil {
+		conf.Remotes = make(map[string]config.Remote)
 	}
 
 	/* Complex remote URL parsing */
@@ -135,7 +136,7 @@ func (c *remoteCmd) addServer(config *lxd.Config, server string, addr string, ac
 			return fmt.Errorf(i18n.G("Only https URLs are supported for simplestreams"))
 		}
 
-		config.Remotes[server] = lxd.RemoteConfig{Addr: addr, Public: true, Protocol: protocol}
+		conf.Remotes[server] = config.Remote{Addr: addr, Public: true, Protocol: protocol}
 		return nil
 	}
 
@@ -194,15 +195,14 @@ func (c *remoteCmd) addServer(config *lxd.Config, server string, addr string, ac
 	// HTTPS server then we need to ensure we have a client certificate before
 	// adding the remote server.
 	if rScheme != "unix" && !public {
-		err = c.generateClientCertificate(config)
+		err = c.generateClientCertificate(conf)
 		if err != nil {
 			return err
 		}
 	}
-	config.Remotes[server] = lxd.RemoteConfig{Addr: addr, Protocol: protocol}
+	conf.Remotes[server] = config.Remote{Addr: addr, Protocol: protocol}
 
-	remote := config.ParseRemote(server)
-	d, err := lxd.NewClient(config, remote)
+	d, err := lxd.NewClient(conf.Legacy(), server)
 	if err != nil {
 		return err
 	}
@@ -257,14 +257,14 @@ func (c *remoteCmd) addServer(config *lxd.Config, server string, addr string, ac
 		certOut.Close()
 
 		// Setup a new connection, this time with the remote certificate
-		d, err = lxd.NewClient(config, remote)
+		d, err = lxd.NewClient(conf.Legacy(), server)
 		if err != nil {
 			return err
 		}
 	}
 
 	if d.IsPublic() || public {
-		config.Remotes[server] = lxd.RemoteConfig{Addr: addr, Public: true}
+		conf.Remotes[server] = config.Remote{Addr: addr, Public: true}
 
 		if _, err := d.GetServerConfig(); err != nil {
 			return err
@@ -306,14 +306,14 @@ func (c *remoteCmd) addServer(config *lxd.Config, server string, addr string, ac
 	return nil
 }
 
-func (c *remoteCmd) removeCertificate(config *lxd.Config, remote string) {
-	certf := config.ServerCertPath(remote)
+func (c *remoteCmd) removeCertificate(conf *config.Config, remote string) {
+	certf := conf.ServerCertPath(remote)
 	logger.Debugf("Trying to remove %s", certf)
 
 	os.Remove(certf)
 }
 
-func (c *remoteCmd) run(config *lxd.Config, args []string) error {
+func (c *remoteCmd) run(conf *config.Config, args []string) error {
 	if len(args) < 1 {
 		return errUsage
 	}
@@ -330,14 +330,14 @@ func (c *remoteCmd) run(config *lxd.Config, args []string) error {
 			fqdn = args[2]
 		}
 
-		if rc, ok := config.Remotes[remote]; ok {
+		if rc, ok := conf.Remotes[remote]; ok {
 			return fmt.Errorf(i18n.G("remote %s exists as <%s>"), remote, rc.Addr)
 		}
 
-		err := c.addServer(config, remote, fqdn, c.acceptCert, c.password, c.public, c.protocol)
+		err := c.addServer(conf, remote, fqdn, c.acceptCert, c.password, c.public, c.protocol)
 		if err != nil {
-			delete(config.Remotes, remote)
-			c.removeCertificate(config, remote)
+			delete(conf.Remotes, remote)
+			c.removeCertificate(conf, remote)
 			return err
 		}
 
@@ -346,7 +346,7 @@ func (c *remoteCmd) run(config *lxd.Config, args []string) error {
 			return errArgs
 		}
 
-		rc, ok := config.Remotes[args[1]]
+		rc, ok := conf.Remotes[args[1]]
 		if !ok {
 			return fmt.Errorf(i18n.G("remote %s doesn't exist"), args[1])
 		}
@@ -355,17 +355,17 @@ func (c *remoteCmd) run(config *lxd.Config, args []string) error {
 			return fmt.Errorf(i18n.G("remote %s is static and cannot be modified"), args[1])
 		}
 
-		if config.DefaultRemote == args[1] {
+		if conf.DefaultRemote == args[1] {
 			return fmt.Errorf(i18n.G("can't remove the default remote"))
 		}
 
-		delete(config.Remotes, args[1])
+		delete(conf.Remotes, args[1])
 
-		c.removeCertificate(config, args[1])
+		c.removeCertificate(conf, args[1])
 
 	case "list":
 		data := [][]string{}
-		for name, rc := range config.Remotes {
+		for name, rc := range conf.Remotes {
 			strPublic := i18n.G("NO")
 			if rc.Public {
 				strPublic = i18n.G("YES")
@@ -381,7 +381,7 @@ func (c *remoteCmd) run(config *lxd.Config, args []string) error {
 			}
 
 			strName := name
-			if name == config.DefaultRemote {
+			if name == conf.DefaultRemote {
 				strName = fmt.Sprintf("%s (%s)", name, i18n.G("default"))
 			}
 			data = append(data, []string{strName, rc.Addr, rc.Protocol, strPublic, strStatic})
@@ -408,7 +408,7 @@ func (c *remoteCmd) run(config *lxd.Config, args []string) error {
 			return errArgs
 		}
 
-		rc, ok := config.Remotes[args[1]]
+		rc, ok := conf.Remotes[args[1]]
 		if !ok {
 			return fmt.Errorf(i18n.G("remote %s doesn't exist"), args[1])
 		}
@@ -417,13 +417,13 @@ func (c *remoteCmd) run(config *lxd.Config, args []string) error {
 			return fmt.Errorf(i18n.G("remote %s is static and cannot be modified"), args[1])
 		}
 
-		if _, ok := config.Remotes[args[2]]; ok {
+		if _, ok := conf.Remotes[args[2]]; ok {
 			return fmt.Errorf(i18n.G("remote %s already exists"), args[2])
 		}
 
 		// Rename the certificate file
-		oldPath := filepath.Join(config.ConfigPath("servercerts"), fmt.Sprintf("%s.crt", args[1]))
-		newPath := filepath.Join(config.ConfigPath("servercerts"), fmt.Sprintf("%s.crt", args[2]))
+		oldPath := filepath.Join(conf.ConfigPath("servercerts"), fmt.Sprintf("%s.crt", args[1]))
+		newPath := filepath.Join(conf.ConfigPath("servercerts"), fmt.Sprintf("%s.crt", args[2]))
 		if shared.PathExists(oldPath) {
 			err := os.Rename(oldPath, newPath)
 			if err != nil {
@@ -431,11 +431,11 @@ func (c *remoteCmd) run(config *lxd.Config, args []string) error {
 			}
 		}
 
-		config.Remotes[args[2]] = rc
-		delete(config.Remotes, args[1])
+		conf.Remotes[args[2]] = rc
+		delete(conf.Remotes, args[1])
 
-		if config.DefaultRemote == args[1] {
-			config.DefaultRemote = args[2]
+		if conf.DefaultRemote == args[1] {
+			conf.DefaultRemote = args[2]
 		}
 
 	case "set-url":
@@ -443,7 +443,7 @@ func (c *remoteCmd) run(config *lxd.Config, args []string) error {
 			return errArgs
 		}
 
-		rc, ok := config.Remotes[args[1]]
+		rc, ok := conf.Remotes[args[1]]
 		if !ok {
 			return fmt.Errorf(i18n.G("remote %s doesn't exist"), args[1])
 		}
@@ -452,28 +452,28 @@ func (c *remoteCmd) run(config *lxd.Config, args []string) error {
 			return fmt.Errorf(i18n.G("remote %s is static and cannot be modified"), args[1])
 		}
 
-		config.Remotes[args[1]] = lxd.RemoteConfig{Addr: args[2]}
+		conf.Remotes[args[1]] = config.Remote{Addr: args[2]}
 
 	case "set-default":
 		if len(args) != 2 {
 			return errArgs
 		}
 
-		_, ok := config.Remotes[args[1]]
+		_, ok := conf.Remotes[args[1]]
 		if !ok {
 			return fmt.Errorf(i18n.G("remote %s doesn't exist"), args[1])
 		}
-		config.DefaultRemote = args[1]
+		conf.DefaultRemote = args[1]
 
 	case "get-default":
 		if len(args) != 1 {
 			return errArgs
 		}
-		fmt.Println(config.DefaultRemote)
+		fmt.Println(conf.DefaultRemote)
 		return nil
 	default:
 		return errArgs
 	}
 
-	return lxd.SaveConfig(config, configPath)
+	return conf.SaveConfig(configPath)
 }
diff --git a/lxc/restore.go b/lxc/restore.go
index cd4024b44..e9d02a947 100644
--- a/lxc/restore.go
+++ b/lxc/restore.go
@@ -4,6 +4,7 @@ import (
 	"fmt"
 
 	"github.com/lxc/lxd"
+	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared"
 	"github.com/lxc/lxd/shared/gnuflag"
 	"github.com/lxc/lxd/shared/i18n"
@@ -37,15 +38,19 @@ func (c *restoreCmd) flags() {
 	gnuflag.BoolVar(&c.stateful, "stateful", false, i18n.G("Whether or not to restore the container's running state from snapshot (if available)"))
 }
 
-func (c *restoreCmd) run(config *lxd.Config, args []string) error {
+func (c *restoreCmd) run(conf *config.Config, args []string) error {
 	if len(args) < 2 {
 		return errArgs
 	}
 
 	var snapname = args[1]
 
-	remote, name := config.ParseRemoteAndContainer(args[0])
-	d, err := lxd.NewClient(config, remote)
+	remote, name, err := conf.ParseRemote(args[0])
+	if err != nil {
+		return err
+	}
+
+	d, err := lxd.NewClient(conf.Legacy(), remote)
 	if err != nil {
 		return err
 	}
diff --git a/lxc/snapshot.go b/lxc/snapshot.go
index 7f92b0432..9472e3b47 100644
--- a/lxc/snapshot.go
+++ b/lxc/snapshot.go
@@ -4,6 +4,7 @@ import (
 	"fmt"
 
 	"github.com/lxc/lxd"
+	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared"
 	"github.com/lxc/lxd/shared/gnuflag"
 	"github.com/lxc/lxd/shared/i18n"
@@ -35,7 +36,7 @@ func (c *snapshotCmd) flags() {
 	gnuflag.BoolVar(&c.stateful, "stateful", false, i18n.G("Whether or not to snapshot the container's running state"))
 }
 
-func (c *snapshotCmd) run(config *lxd.Config, args []string) error {
+func (c *snapshotCmd) run(conf *config.Config, args []string) error {
 	if len(args) < 1 {
 		return errArgs
 	}
@@ -47,8 +48,12 @@ func (c *snapshotCmd) run(config *lxd.Config, args []string) error {
 		snapname = args[1]
 	}
 
-	remote, name := config.ParseRemoteAndContainer(args[0])
-	d, err := lxd.NewClient(config, remote)
+	remote, name, err := conf.ParseRemote(args[0])
+	if err != nil {
+		return err
+	}
+
+	d, err := lxd.NewClient(conf.Legacy(), remote)
 	if err != nil {
 		return err
 	}
diff --git a/lxc/storage.go b/lxc/storage.go
index abd34efc7..484f6e13d 100644
--- a/lxc/storage.go
+++ b/lxc/storage.go
@@ -13,6 +13,7 @@ import (
 	"gopkg.in/yaml.v2"
 
 	"github.com/lxc/lxd"
+	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared"
 	"github.com/lxc/lxd/shared/api"
 	"github.com/lxc/lxd/shared/i18n"
@@ -143,21 +144,25 @@ lxc storage volume show default container/data
 
 func (c *storageCmd) flags() {}
 
-func (c *storageCmd) run(config *lxd.Config, args []string) error {
+func (c *storageCmd) run(conf *config.Config, args []string) error {
 	if len(args) < 1 {
 		return errUsage
 	}
 
 	if args[0] == "list" {
-		return c.doStoragePoolsList(config, args)
+		return c.doStoragePoolsList(conf, args)
 	}
 
 	if len(args) < 2 {
 		return errArgs
 	}
 
-	remote, sub := config.ParseRemoteAndContainer(args[1])
-	client, err := lxd.NewClient(config, remote)
+	remote, sub, err := conf.ParseRemote(args[1])
+	if err != nil {
+		return err
+	}
+
+	client, err := lxd.NewClient(conf.Legacy(), remote)
 	if err != nil {
 		return err
 	}
@@ -225,7 +230,7 @@ func (c *storageCmd) run(config *lxd.Config, args []string) error {
 				return errArgs
 			}
 			pool := args[2]
-			return c.doStoragePoolVolumesList(config, remote, pool, args)
+			return c.doStoragePoolVolumesList(conf, remote, pool, args)
 		case "set":
 			if len(args) < 4 {
 				return errArgs
@@ -570,19 +575,24 @@ func (c *storageCmd) doStoragePoolGet(client *lxd.Client, name string, args []st
 	return nil
 }
 
-func (c *storageCmd) doStoragePoolsList(config *lxd.Config, args []string) error {
+func (c *storageCmd) doStoragePoolsList(conf *config.Config, args []string) error {
 	var remote string
 	if len(args) > 1 {
 		var name string
-		remote, name = config.ParseRemoteAndContainer(args[1])
+		var err error
+		remote, name, err = conf.ParseRemote(args[1])
+		if err != nil {
+			return err
+		}
+
 		if name != "" {
 			return fmt.Errorf(i18n.G("Cannot provide container name to list"))
 		}
 	} else {
-		remote = config.DefaultRemote
+		remote = conf.DefaultRemote
 	}
 
-	client, err := lxd.NewClient(config, remote)
+	client, err := lxd.NewClient(conf.Legacy(), remote)
 	if err != nil {
 		return err
 	}
@@ -670,8 +680,8 @@ func (c *storageCmd) doStoragePoolShow(client *lxd.Client, name string) error {
 	return nil
 }
 
-func (c *storageCmd) doStoragePoolVolumesList(config *lxd.Config, remote string, pool string, args []string) error {
-	client, err := lxd.NewClient(config, remote)
+func (c *storageCmd) doStoragePoolVolumesList(conf *config.Config, remote string, pool string, args []string) error {
+	client, err := lxd.NewClient(conf.Legacy(), remote)
 	if err != nil {
 		return err
 	}
diff --git a/lxc/utils.go b/lxc/utils.go
index 0a717cf94..4693a8175 100644
--- a/lxc/utils.go
+++ b/lxc/utils.go
@@ -2,7 +2,11 @@ package main
 
 import (
 	"fmt"
+	"net"
+	"net/url"
+	"os"
 	"strings"
+	"syscall"
 
 	"github.com/lxc/lxd/client"
 	"github.com/lxc/lxd/shared/api"
@@ -194,3 +198,38 @@ func summaryLine(usage string) string {
 
 	return i18n.G("Missing summary.")
 }
+
+// Used to return a user friendly error
+func getLocalErr(err error) error {
+	t, ok := err.(*url.Error)
+	if !ok {
+		return nil
+	}
+
+	u, ok := t.Err.(*net.OpError)
+	if !ok {
+		return nil
+	}
+
+	if u.Op == "dial" && u.Net == "unix" {
+		var lxdErr error
+
+		sysErr, ok := u.Err.(*os.SyscallError)
+		if ok {
+			lxdErr = sysErr.Err
+		} else {
+			// syscall.Errno may be returned on some systems, e.g. CentOS
+			lxdErr, ok = u.Err.(syscall.Errno)
+			if !ok {
+				return nil
+			}
+		}
+
+		switch lxdErr {
+		case syscall.ENOENT, syscall.ECONNREFUSED, syscall.EACCES:
+			return lxdErr
+		}
+	}
+
+	return nil
+}
diff --git a/lxc/version.go b/lxc/version.go
index 38595fdd6..34981936c 100644
--- a/lxc/version.go
+++ b/lxc/version.go
@@ -3,7 +3,7 @@ package main
 import (
 	"fmt"
 
-	"github.com/lxc/lxd"
+	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared/i18n"
 	"github.com/lxc/lxd/shared/version"
 )
@@ -24,7 +24,7 @@ Print the version number of this client tool.`)
 func (c *versionCmd) flags() {
 }
 
-func (c *versionCmd) run(_ *lxd.Config, args []string) error {
+func (c *versionCmd) run(conf *config.Config, args []string) error {
 	if len(args) > 0 {
 		return errArgs
 	}

From 589523f52d7692e9b64fd157b7a31f68526cf661 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Tue, 4 Apr 2017 21:51:55 -0400
Subject: [PATCH 04/28] lxc/finger: Port to new client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxc/finger.go         | 17 ++++++-----------
 test/suites/remote.sh |  1 -
 2 files changed, 6 insertions(+), 12 deletions(-)

diff --git a/lxc/finger.go b/lxc/finger.go
index 911fee24b..ec449b5f1 100644
--- a/lxc/finger.go
+++ b/lxc/finger.go
@@ -1,7 +1,6 @@
 package main
 
 import (
-	"github.com/lxc/lxd"
 	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared/i18n"
 )
@@ -26,25 +25,21 @@ func (c *fingerCmd) run(conf *config.Config, args []string) error {
 		return errArgs
 	}
 
-	var remote string
-	if len(args) == 1 {
+	// Parse the remote
+	remote := conf.DefaultRemote
+	if len(args) > 0 {
 		var err error
 		remote, _, err = conf.ParseRemote(args[0])
 		if err != nil {
 			return err
 		}
-	} else {
-		remote = conf.DefaultRemote
 	}
 
-	// New client may or may not need to connect to the remote host, but
-	// client.ServerStatus will at least request the basic information from
-	// the server.
-	client, err := lxd.NewClient(conf.Legacy(), remote)
+	// Attempt to connect
+	_, err := conf.GetContainerServer(remote)
 	if err != nil {
 		return err
 	}
 
-	_, err = client.ServerStatus()
-	return err
+	return nil
 }
diff --git a/test/suites/remote.sh b/test/suites/remote.sh
index 845ef995e..a88354319 100644
--- a/test/suites/remote.sh
+++ b/test/suites/remote.sh
@@ -17,7 +17,6 @@ test_remote_url() {
 
   for url in ${urls}; do
     lxc_remote remote add test "${url}"
-    lxc_remote finger test:
     lxc_remote remote remove test
   done
 }

From 14a9778eac10d54ea9ce692f1b550f22301c69d2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Tue, 4 Apr 2017 22:18:41 -0400
Subject: [PATCH 05/28] lxc/action: Port to new client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxc/action.go | 21 ++++++++++++---------
 1 file changed, 12 insertions(+), 9 deletions(-)

diff --git a/lxc/action.go b/lxc/action.go
index 5666d59ae..50351e408 100644
--- a/lxc/action.go
+++ b/lxc/action.go
@@ -5,7 +5,6 @@ import (
 	"os"
 	"strings"
 
-	"github.com/lxc/lxd"
 	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared"
 	"github.com/lxc/lxd/shared/api"
@@ -64,7 +63,7 @@ func (c *actionCmd) doAction(conf *config.Config, nameArg string) error {
 		return err
 	}
 
-	d, err := lxd.NewClient(conf.Legacy(), remote)
+	d, err := conf.GetContainerServer(remote)
 	if err != nil {
 		return err
 	}
@@ -74,7 +73,7 @@ func (c *actionCmd) doAction(conf *config.Config, nameArg string) error {
 	}
 
 	if c.action == shared.Start {
-		current, err := d.ContainerInfo(name)
+		current, _, err := d.GetContainer(name)
 		if err != nil {
 			return err
 		}
@@ -90,16 +89,20 @@ func (c *actionCmd) doAction(conf *config.Config, nameArg string) error {
 		}
 	}
 
-	resp, err := d.Action(name, c.action, c.timeout, c.force, state)
-	if err != nil {
-		return err
+	req := api.ContainerStatePut{
+		Action:   string(c.action),
+		Timeout:  c.timeout,
+		Force:    c.force,
+		Stateful: state,
 	}
 
-	if resp.Type != api.AsyncResponse {
-		return fmt.Errorf(i18n.G("bad result type from action"))
+	op, err := d.UpdateContainerState(name, req, "")
+	if err != nil {
+		return err
 	}
 
-	if err := d.WaitForSuccess(resp.Operation); err != nil {
+	err = op.Wait()
+	if err != nil {
 		return fmt.Errorf("%s\n"+i18n.G("Try `lxc info --show-log %s` for more info"), err, nameArg)
 	}
 

From 658ae4c58d74edbf30a67cdca51edf0f40f03a6e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Tue, 4 Apr 2017 22:32:06 -0400
Subject: [PATCH 06/28] lxc/list: Port to new client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxc/list.go | 17 ++++++++---------
 1 file changed, 8 insertions(+), 9 deletions(-)

diff --git a/lxc/list.go b/lxc/list.go
index 0866156ce..3aeb4457b 100644
--- a/lxc/list.go
+++ b/lxc/list.go
@@ -14,7 +14,6 @@ import (
 	"github.com/olekukonko/tablewriter"
 	"gopkg.in/yaml.v2"
 
-	"github.com/lxc/lxd"
 	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared"
 	"github.com/lxc/lxd/shared/api"
@@ -215,7 +214,7 @@ func (c *listCmd) shouldShow(filters []string, state *api.Container) bool {
 	return true
 }
 
-func (c *listCmd) listContainers(d *lxd.Client, cinfos []api.Container, filters []string, columns []column) error {
+func (c *listCmd) listContainers(conf *config.Config, remote string, cinfos []api.Container, filters []string, columns []column) error {
 	headers := []string{}
 	for _, column := range columns {
 		headers = append(headers, column.Name)
@@ -239,7 +238,7 @@ func (c *listCmd) listContainers(d *lxd.Client, cinfos []api.Container, filters
 	for i := 0; i < threads; i++ {
 		cStatesWg.Add(1)
 		go func() {
-			d, err := lxd.NewClient(&d.Config, d.Name)
+			d, err := conf.GetContainerServer(remote)
 			if err != nil {
 				cStatesWg.Done()
 				return
@@ -251,7 +250,7 @@ func (c *listCmd) listContainers(d *lxd.Client, cinfos []api.Container, filters
 					break
 				}
 
-				state, err := d.ContainerState(cName)
+				state, _, err := d.GetContainerState(cName)
 				if err != nil {
 					continue
 				}
@@ -265,7 +264,7 @@ func (c *listCmd) listContainers(d *lxd.Client, cinfos []api.Container, filters
 
 		cSnapshotsWg.Add(1)
 		go func() {
-			d, err := lxd.NewClient(&d.Config, d.Name)
+			d, err := conf.GetContainerServer(remote)
 			if err != nil {
 				cSnapshotsWg.Done()
 				return
@@ -277,7 +276,7 @@ func (c *listCmd) listContainers(d *lxd.Client, cinfos []api.Container, filters
 					break
 				}
 
-				snaps, err := d.ListSnapshots(cName)
+				snaps, err := d.GetContainerSnapshots(cName)
 				if err != nil {
 					continue
 				}
@@ -428,13 +427,13 @@ func (c *listCmd) run(conf *config.Config, args []string) error {
 		remote = conf.DefaultRemote
 	}
 
-	d, err := lxd.NewClient(conf.Legacy(), remote)
+	d, err := conf.GetContainerServer(remote)
 	if err != nil {
 		return err
 	}
 
 	var cts []api.Container
-	ctslist, err := d.ListContainers()
+	ctslist, err := d.GetContainers()
 	if err != nil {
 		return err
 	}
@@ -452,7 +451,7 @@ func (c *listCmd) run(conf *config.Config, args []string) error {
 		return err
 	}
 
-	return c.listContainers(d, cts, filters, columns)
+	return c.listContainers(conf, remote, cts, filters, columns)
 }
 
 func (c *listCmd) parseColumns() ([]column, error) {

From b4317f4c73242644cd98d5481f553fe34a542921 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Tue, 4 Apr 2017 22:35:56 -0400
Subject: [PATCH 07/28] lxc/monitor: Port to new client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxc/monitor.go | 15 ++++++++++++---
 1 file changed, 12 insertions(+), 3 deletions(-)

diff --git a/lxc/monitor.go b/lxc/monitor.go
index 4c428afe4..41ec3ead3 100644
--- a/lxc/monitor.go
+++ b/lxc/monitor.go
@@ -5,7 +5,6 @@ import (
 
 	"gopkg.in/yaml.v2"
 
-	"github.com/lxc/lxd"
 	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared/gnuflag"
 	"github.com/lxc/lxd/shared/i18n"
@@ -77,7 +76,12 @@ func (c *monitorCmd) run(conf *config.Config, args []string) error {
 		}
 	}
 
-	d, err := lxd.NewClient(conf.Legacy(), remote)
+	d, err := conf.GetContainerServer(remote)
+	if err != nil {
+		return err
+	}
+
+	listener, err := d.GetEvents()
 	if err != nil {
 		return err
 	}
@@ -92,5 +96,10 @@ func (c *monitorCmd) run(conf *config.Config, args []string) error {
 		fmt.Printf("%s\n\n", render)
 	}
 
-	return d.Monitor(c.typeArgs, handler, nil)
+	_, err = listener.AddHandler(c.typeArgs, handler)
+	if err != nil {
+		return err
+	}
+
+	return listener.Wait()
 }

From 37244da92c4d8175f9e353e118fbfbc16bf794df Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Tue, 4 Apr 2017 22:40:22 -0400
Subject: [PATCH 08/28] lxc/delete: Port to new client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxc/delete.go        | 36 ++++++++++++++++++++++++------------
 test/suites/basic.sh |  4 ++--
 2 files changed, 26 insertions(+), 14 deletions(-)

diff --git a/lxc/delete.go b/lxc/delete.go
index 2b1a00235..d112c3d03 100644
--- a/lxc/delete.go
+++ b/lxc/delete.go
@@ -6,7 +6,7 @@ import (
 	"os"
 	"strings"
 
-	"github.com/lxc/lxd"
+	"github.com/lxc/lxd/client"
 	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared"
 	"github.com/lxc/lxd/shared/api"
@@ -49,13 +49,23 @@ func (c *deleteCmd) promptDelete(name string) error {
 	return nil
 }
 
-func (c *deleteCmd) doDelete(d *lxd.Client, name string) error {
-	resp, err := d.Delete(name)
+func (c *deleteCmd) doDelete(d lxd.ContainerServer, name string) error {
+	var op *lxd.Operation
+	var err error
+
+	if shared.IsSnapshot(name) {
+		// Snapshot delete
+		fields := strings.SplitN(name, shared.SnapshotDelimiter, 2)
+		op, err = d.DeleteContainerSnapshot(fields[0], fields[1])
+	} else {
+		// Container delete
+		op, err = d.DeleteContainer(name)
+	}
 	if err != nil {
 		return err
 	}
 
-	return d.WaitForSuccess(resp.Operation)
+	return op.Wait()
 }
 
 func (c *deleteCmd) run(conf *config.Config, args []string) error {
@@ -69,7 +79,7 @@ func (c *deleteCmd) run(conf *config.Config, args []string) error {
 			return err
 		}
 
-		d, err := lxd.NewClient(conf.Legacy(), remote)
+		d, err := conf.GetContainerServer(remote)
 		if err != nil {
 			return err
 		}
@@ -85,7 +95,7 @@ func (c *deleteCmd) run(conf *config.Config, args []string) error {
 			return c.doDelete(d, name)
 		}
 
-		ct, err := d.ContainerInfo(name)
+		ct, _, err := d.GetContainer(name)
 		if err != nil {
 			return err
 		}
@@ -95,18 +105,20 @@ func (c *deleteCmd) run(conf *config.Config, args []string) error {
 				return fmt.Errorf(i18n.G("The container is currently running, stop it first or pass --force."))
 			}
 
-			resp, err := d.Action(name, shared.Stop, -1, true, false)
-			if err != nil {
-				return err
+			req := api.ContainerStatePut{
+				Action:  "stop",
+				Timeout: -1,
+				Force:   true,
 			}
 
-			op, err := d.WaitFor(resp.Operation)
+			op, err := d.UpdateContainerState(name, req, "")
 			if err != nil {
 				return err
 			}
 
-			if op.StatusCode == api.Failure {
-				return fmt.Errorf(i18n.G("Stopping container failed!"))
+			err = op.Wait()
+			if err != nil {
+				return fmt.Errorf(i18n.G("Stopping the container failed: %s"), err)
 			}
 
 			if ct.Ephemeral == true {
diff --git a/test/suites/basic.sh b/test/suites/basic.sh
index 070b0c82d..318303be6 100644
--- a/test/suites/basic.sh
+++ b/test/suites/basic.sh
@@ -52,8 +52,8 @@ test_basic_usage() {
 
   # Test custom filename for image export
   lxc image export testimage "${LXD_DIR}/foo"
-  [ "${sum}" = "$(sha256sum "${LXD_DIR}/foo.tar.xz" | cut -d' ' -f1)" ]
-  rm "${LXD_DIR}/foo.tar.xz"
+  [ "${sum}" = "$(sha256sum "${LXD_DIR}/foo" | cut -d' ' -f1)" ]
+  rm "${LXD_DIR}/foo"
 
 
   # Test image export with a split image.

From 3fafb67c71a6c324a06b954cf8e92c474a990d18 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Tue, 4 Apr 2017 22:44:29 -0400
Subject: [PATCH 09/28] lxc/snapshot: Port to new client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxc/snapshot.go | 19 ++++++++++++-------
 1 file changed, 12 insertions(+), 7 deletions(-)

diff --git a/lxc/snapshot.go b/lxc/snapshot.go
index 9472e3b47..dd3f0a88f 100644
--- a/lxc/snapshot.go
+++ b/lxc/snapshot.go
@@ -3,9 +3,9 @@ package main
 import (
 	"fmt"
 
-	"github.com/lxc/lxd"
 	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared"
+	"github.com/lxc/lxd/shared/api"
 	"github.com/lxc/lxd/shared/gnuflag"
 	"github.com/lxc/lxd/shared/i18n"
 )
@@ -48,25 +48,30 @@ func (c *snapshotCmd) run(conf *config.Config, args []string) error {
 		snapname = args[1]
 	}
 
+	// we don't allow '/' in snapshot names
+	if shared.IsSnapshot(snapname) {
+		return fmt.Errorf(i18n.G("'/' not allowed in snapshot name"))
+	}
+
 	remote, name, err := conf.ParseRemote(args[0])
 	if err != nil {
 		return err
 	}
 
-	d, err := lxd.NewClient(conf.Legacy(), remote)
+	d, err := conf.GetContainerServer(remote)
 	if err != nil {
 		return err
 	}
 
-	// we don't allow '/' in snapshot names
-	if shared.IsSnapshot(snapname) {
-		return fmt.Errorf(i18n.G("'/' not allowed in snapshot name"))
+	req := api.ContainerSnapshotsPost{
+		Name:     snapname,
+		Stateful: c.stateful,
 	}
 
-	resp, err := d.Snapshot(name, snapname, c.stateful)
+	op, err := d.CreateContainerSnapshot(name, req)
 	if err != nil {
 		return err
 	}
 
-	return d.WaitForSuccess(resp.Operation)
+	return op.Wait()
 }

From d17424e43bdab72c7c1dc4f3dd94305e88d9de25 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Tue, 4 Apr 2017 22:53:29 -0400
Subject: [PATCH 10/28] lxc/restore: Port to new client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxc/restore.go | 13 +++++++++----
 1 file changed, 9 insertions(+), 4 deletions(-)

diff --git a/lxc/restore.go b/lxc/restore.go
index e9d02a947..abffd32ca 100644
--- a/lxc/restore.go
+++ b/lxc/restore.go
@@ -3,9 +3,9 @@ package main
 import (
 	"fmt"
 
-	"github.com/lxc/lxd"
 	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared"
+	"github.com/lxc/lxd/shared/api"
 	"github.com/lxc/lxd/shared/gnuflag"
 	"github.com/lxc/lxd/shared/i18n"
 )
@@ -50,7 +50,7 @@ func (c *restoreCmd) run(conf *config.Config, args []string) error {
 		return err
 	}
 
-	d, err := lxd.NewClient(conf.Legacy(), remote)
+	d, err := conf.GetContainerServer(remote)
 	if err != nil {
 		return err
 	}
@@ -59,10 +59,15 @@ func (c *restoreCmd) run(conf *config.Config, args []string) error {
 		snapname = fmt.Sprintf("%s/%s", name, snapname)
 	}
 
-	resp, err := d.RestoreSnapshot(name, snapname, c.stateful)
+	req := api.ContainerPut{
+		Restore:  snapname,
+		Stateful: c.stateful,
+	}
+
+	op, err := d.UpdateContainer(name, req, "")
 	if err != nil {
 		return err
 	}
 
-	return d.WaitForSuccess(resp.Operation)
+	return op.Wait()
 }

From fc6672bbdb177aecd3c3cdef0043fe257e046ae2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Tue, 4 Apr 2017 23:11:30 -0400
Subject: [PATCH 11/28] lxc/exec: Port to new client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxc/exec.go         | 31 +++++++++++++++++++++++++++----
 lxc/exec_unix.go    |  3 +--
 lxc/exec_windows.go |  3 +--
 3 files changed, 29 insertions(+), 8 deletions(-)

diff --git a/lxc/exec.go b/lxc/exec.go
index 03829a8e5..71278056f 100644
--- a/lxc/exec.go
+++ b/lxc/exec.go
@@ -13,6 +13,7 @@ import (
 
 	"github.com/gorilla/websocket"
 
+	"github.com/lxc/lxd/client"
 	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared/api"
 	"github.com/lxc/lxd/shared/gnuflag"
@@ -134,7 +135,7 @@ func (c *execCmd) run(conf *config.Config, args []string) error {
 		return err
 	}
 
-	d, err := lxd.NewClient(conf.Legacy(), remote)
+	d, err := conf.GetContainerServer(remote)
 	if err != nil {
 		return err
 	}
@@ -198,7 +199,29 @@ func (c *execCmd) run(conf *config.Config, args []string) error {
 	}
 
 	stdout := c.getStdout()
-	ret, err := d.Exec(name, args[1:], env, stdin, stdout, os.Stderr, handler, width, height)
+
+	req := api.ContainerExecPost{
+		Command:     args[1:],
+		WaitForWS:   true,
+		Interactive: interactive,
+		Environment: env,
+		Width:       width,
+		Height:      height,
+	}
+
+	execArgs := lxd.ContainerExecArgs{
+		Stdin:   stdin,
+		Stdout:  stdout,
+		Stderr:  os.Stderr,
+		Control: handler,
+	}
+
+	op, err := d.ExecContainer(name, req, &execArgs)
+	if err != nil {
+		return err
+	}
+
+	err = op.Wait()
 	if err != nil {
 		return err
 	}
@@ -214,6 +237,6 @@ func (c *execCmd) run(conf *config.Config, args []string) error {
 		termios.Restore(cfd, oldttystate)
 	}
 
-	os.Exit(ret)
-	return fmt.Errorf(i18n.G("unreachable return reached"))
+	os.Exit(int(op.Metadata["return"].(float64)))
+	return nil
 }
diff --git a/lxc/exec_unix.go b/lxc/exec_unix.go
index 7d3694663..7471e8423 100644
--- a/lxc/exec_unix.go
+++ b/lxc/exec_unix.go
@@ -10,7 +10,6 @@ import (
 
 	"github.com/gorilla/websocket"
 
-	"github.com/lxc/lxd"
 	"github.com/lxc/lxd/shared/logger"
 )
 
@@ -22,7 +21,7 @@ func (c *execCmd) getTERM() (string, bool) {
 	return os.LookupEnv("TERM")
 }
 
-func (c *execCmd) controlSocketHandler(d *lxd.Client, control *websocket.Conn) {
+func (c *execCmd) controlSocketHandler(control *websocket.Conn) {
 	ch := make(chan os.Signal, 10)
 	signal.Notify(ch,
 		syscall.SIGWINCH,
diff --git a/lxc/exec_windows.go b/lxc/exec_windows.go
index 21ec1b8f6..105219e29 100644
--- a/lxc/exec_windows.go
+++ b/lxc/exec_windows.go
@@ -9,7 +9,6 @@ import (
 	"github.com/gorilla/websocket"
 	"github.com/mattn/go-colorable"
 
-	"github.com/lxc/lxd"
 	"github.com/lxc/lxd/shared/logger"
 )
 
@@ -32,7 +31,7 @@ func (c *execCmd) getTERM() (string, bool) {
 	return "dumb", true
 }
 
-func (c *execCmd) controlSocketHandler(d *lxd.Client, control *websocket.Conn) {
+func (c *execCmd) controlSocketHandler(control *websocket.Conn) {
 	// TODO: figure out what the equivalent of signal.SIGWINCH is on
 	// windows and use that; for now if you resize your terminal it just
 	// won't work quite correctly.

From d7312d54815b3a3fec772d0898f71ccffb70435d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Tue, 4 Apr 2017 23:19:40 -0400
Subject: [PATCH 12/28] lxc/info: Port to new client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxc/info.go | 25 +++++++++++++------------
 1 file changed, 13 insertions(+), 12 deletions(-)

diff --git a/lxc/info.go b/lxc/info.go
index fe6b6f6a3..2d3a7c989 100644
--- a/lxc/info.go
+++ b/lxc/info.go
@@ -7,7 +7,7 @@ import (
 
 	"gopkg.in/yaml.v2"
 
-	"github.com/lxc/lxd"
+	"github.com/lxc/lxd/client"
 	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared"
 	"github.com/lxc/lxd/shared/gnuflag"
@@ -55,7 +55,7 @@ func (c *infoCmd) run(conf *config.Config, args []string) error {
 		}
 	}
 
-	d, err := lxd.NewClient(conf.Legacy(), remote)
+	d, err := conf.GetContainerServer(remote)
 	if err != nil {
 		return err
 	}
@@ -63,12 +63,12 @@ func (c *infoCmd) run(conf *config.Config, args []string) error {
 	if cName == "" {
 		return c.remoteInfo(d)
 	} else {
-		return c.containerInfo(d, cName, c.showLog)
+		return c.containerInfo(d, conf.Remotes[remote], cName, c.showLog)
 	}
 }
 
-func (c *infoCmd) remoteInfo(d *lxd.Client) error {
-	serverStatus, err := d.ServerStatus()
+func (c *infoCmd) remoteInfo(d lxd.ContainerServer) error {
+	serverStatus, _, err := d.GetServer()
 	if err != nil {
 		return err
 	}
@@ -83,13 +83,13 @@ func (c *infoCmd) remoteInfo(d *lxd.Client) error {
 	return nil
 }
 
-func (c *infoCmd) containerInfo(d *lxd.Client, name string, showLog bool) error {
-	ct, err := d.ContainerInfo(name)
+func (c *infoCmd) containerInfo(d lxd.ContainerServer, remote config.Remote, name string, showLog bool) error {
+	ct, _, err := d.GetContainer(name)
 	if err != nil {
 		return err
 	}
 
-	cs, err := d.ContainerState(name)
+	cs, _, err := d.GetContainerState(name)
 	if err != nil {
 		return err
 	}
@@ -97,9 +97,10 @@ func (c *infoCmd) containerInfo(d *lxd.Client, name string, showLog bool) error
 	const layout = "2006/01/02 15:04 UTC"
 
 	fmt.Printf(i18n.G("Name: %s")+"\n", ct.Name)
-	if d.Remote != nil && d.Remote.Addr != "" {
-		fmt.Printf(i18n.G("Remote: %s")+"\n", d.Remote.Addr)
+	if remote.Addr != "" {
+		fmt.Printf(i18n.G("Remote: %s")+"\n", remote.Addr)
 	}
+
 	fmt.Printf(i18n.G("Architecture: %s")+"\n", ct.Architecture)
 	if shared.TimeIsSet(ct.CreatedAt) {
 		fmt.Printf(i18n.G("Created: %s")+"\n", ct.CreatedAt.UTC().Format(layout))
@@ -208,7 +209,7 @@ func (c *infoCmd) containerInfo(d *lxd.Client, name string, showLog bool) error
 
 	// List snapshots
 	first_snapshot := true
-	snaps, err := d.ListSnapshots(name)
+	snaps, err := d.GetContainerSnapshots(name)
 	if err != nil {
 		return nil
 	}
@@ -236,7 +237,7 @@ func (c *infoCmd) containerInfo(d *lxd.Client, name string, showLog bool) error
 	}
 
 	if showLog {
-		log, err := d.GetLog(name, "lxc.log")
+		log, err := d.GetContainerLogfile(name, "lxc.log")
 		if err != nil {
 			return err
 		}

From 2bd1a33cedcd6916287817cec7432995e7faa6c7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Tue, 4 Apr 2017 23:31:47 -0400
Subject: [PATCH 13/28] lxc/remote: Port to new client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxc/remote.go | 59 +++++++++++++++++++++++++++++++++++------------------------
 1 file changed, 35 insertions(+), 24 deletions(-)

diff --git a/lxc/remote.go b/lxc/remote.go
index 519dd584b..8d1c8269d 100644
--- a/lxc/remote.go
+++ b/lxc/remote.go
@@ -16,9 +16,9 @@ import (
 
 	"golang.org/x/crypto/ssh/terminal"
 
-	"github.com/lxc/lxd"
 	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared"
+	"github.com/lxc/lxd/shared/api"
 	"github.com/lxc/lxd/shared/gnuflag"
 	"github.com/lxc/lxd/shared/i18n"
 	"github.com/lxc/lxd/shared/logger"
@@ -202,21 +202,16 @@ func (c *remoteCmd) addServer(conf *config.Config, server string, addr string, a
 	}
 	conf.Remotes[server] = config.Remote{Addr: addr, Protocol: protocol}
 
-	d, err := lxd.NewClient(conf.Legacy(), server)
-	if err != nil {
-		return err
-	}
+	// Attempt to connect
+	d, err := conf.GetContainerServer(server)
 
+	// Handle Unix socket connections
 	if strings.HasPrefix(addr, "unix:") {
-		// NewClient succeeded so there was a lxd there (we fingered
-		// it) so just accept it
-		return nil
+		return err
 	}
 
+	// Check if the system CA worked for the TLS connection
 	var certificate *x509.Certificate
-
-	/* Attempt to connect using the system root CA */
-	_, err = d.GetServerConfig()
 	if err != nil {
 		// Failed to connect using the system CA, so retrieve the remote certificate
 		certificate, err = c.getRemoteCertificate(addr)
@@ -225,6 +220,7 @@ func (c *remoteCmd) addServer(conf *config.Config, server string, addr string, a
 		}
 	}
 
+	// Handle certificate prompt
 	if certificate != nil {
 		if !acceptCert {
 			digest := shared.CertFingerprint(certificate)
@@ -241,13 +237,13 @@ func (c *remoteCmd) addServer(conf *config.Config, server string, addr string, a
 			}
 		}
 
-		dnam := d.Config.ConfigPath("servercerts")
+		dnam := conf.ConfigPath("servercerts")
 		err := os.MkdirAll(dnam, 0750)
 		if err != nil {
 			return fmt.Errorf(i18n.G("Could not create server cert dir"))
 		}
 
-		certf := fmt.Sprintf("%s/%s.crt", dnam, d.Name)
+		certf := fmt.Sprintf("%s/%s.crt", dnam, server)
 		certOut, err := os.Create(certf)
 		if err != nil {
 			return err
@@ -257,27 +253,30 @@ func (c *remoteCmd) addServer(conf *config.Config, server string, addr string, a
 		certOut.Close()
 
 		// Setup a new connection, this time with the remote certificate
-		d, err = lxd.NewClient(conf.Legacy(), server)
+		d, err = conf.GetContainerServer(server)
 		if err != nil {
 			return err
 		}
 	}
 
-	if d.IsPublic() || public {
-		conf.Remotes[server] = config.Remote{Addr: addr, Public: true}
-
-		if _, err := d.GetServerConfig(); err != nil {
-			return err
-		}
+	// Get server information
+	srv, _, err := d.GetServer()
+	if err != nil {
+		return err
+	}
 
+	// Detect a public remote
+	if srv.Public || public {
+		conf.Remotes[server] = config.Remote{Addr: addr, Public: true}
 		return nil
 	}
 
-	if d.AmTrusted() {
-		// server already has our cert, so we're done
+	// Check if our cert is already trusted
+	if srv.Auth == "trusted" {
 		return nil
 	}
 
+	// Prompt for trust password
 	if password == "" {
 		fmt.Printf(i18n.G("Admin password for %s: "), server)
 		pwd, err := terminal.ReadPassword(0)
@@ -293,12 +292,24 @@ func (c *remoteCmd) addServer(conf *config.Config, server string, addr string, a
 		password = string(pwd)
 	}
 
-	err = d.AddMyCertToServer(password)
+	// Add client certificate to trust store
+	req := api.CertificatesPost{
+		Password: password,
+	}
+	req.Type = "client"
+
+	err = d.CreateCertificate(req)
+	if err != nil {
+		return err
+	}
+
+	// And check if trusted now
+	srv, _, err = d.GetServer()
 	if err != nil {
 		return err
 	}
 
-	if !d.AmTrusted() {
+	if srv.Auth != "trusted" {
 		return fmt.Errorf(i18n.G("Server doesn't trust us after adding our cert"))
 	}
 

From ba2ca93f7db97be30f75585a0d45a285d4584f48 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Mon, 10 Apr 2017 13:48:56 -0400
Subject: [PATCH 14/28] lxc/network: Port to new client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxc/network.go | 173 +++++++++++++++++++++++++++++++++++++++------------------
 1 file changed, 118 insertions(+), 55 deletions(-)

diff --git a/lxc/network.go b/lxc/network.go
index 63f0fc222..96b826e03 100644
--- a/lxc/network.go
+++ b/lxc/network.go
@@ -11,7 +11,7 @@ import (
 	"github.com/olekukonko/tablewriter"
 	"gopkg.in/yaml.v2"
 
-	"github.com/lxc/lxd"
+	"github.com/lxc/lxd/client"
 	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared"
 	"github.com/lxc/lxd/shared/api"
@@ -113,7 +113,7 @@ func (c *networkCmd) run(conf *config.Config, args []string) error {
 		return err
 	}
 
-	client, err := lxd.NewClient(conf.Legacy(), remote)
+	client, err := conf.GetContainerServer(remote)
 	if err != nil {
 		return err
 	}
@@ -146,72 +146,120 @@ func (c *networkCmd) run(conf *config.Config, args []string) error {
 	}
 }
 
-func (c *networkCmd) doNetworkAttach(client *lxd.Client, name string, args []string) error {
+func (c *networkCmd) doNetworkAttach(client lxd.ContainerServer, name string, args []string) error {
 	if len(args) < 1 || len(args) > 3 {
 		return errArgs
 	}
 
-	container := args[0]
+	// Default name is same as network
 	devName := name
 	if len(args) > 1 {
 		devName = args[1]
 	}
 
-	network, err := client.NetworkGet(name)
+	// Get the network entry
+	network, _, err := client.GetNetwork(name)
 	if err != nil {
 		return err
 	}
 
-	nicType := "macvlan"
+	// Prepare the container's device entry
+	device := map[string]string{
+		"type":    "nic",
+		"nictype": "macvlan",
+		"parent":  name,
+	}
+
 	if network.Type == "bridge" {
-		nicType = "bridged"
+		device["nictype"] = "bridged"
 	}
 
-	props := []string{fmt.Sprintf("nictype=%s", nicType), fmt.Sprintf("parent=%s", name)}
 	if len(args) > 2 {
-		props = append(props, fmt.Sprintf("name=%s", args[2]))
+		device["name"] = args[2]
 	}
 
-	resp, err := client.ContainerDeviceAdd(container, devName, "nic", props)
+	// Get the container entry
+	ctn, ctnEtag, err := client.GetContainer(args[0])
+	if err != nil {
+		return err
+	}
+
+	// Check if the device already exists
+	_, ok := ctn.Devices[devName]
+	if ok {
+		return fmt.Errorf(i18n.G("Device already exists: %s"), devName)
+	}
+
+	// Add the device to the container
+	ctn.Devices[devName] = device
+
+	op, err := client.UpdateContainer(args[0], ctn.Writable(), ctnEtag)
 	if err != nil {
 		return err
 	}
 
-	return client.WaitForSuccess(resp.Operation)
+	return op.Wait()
 }
 
-func (c *networkCmd) doNetworkAttachProfile(client *lxd.Client, name string, args []string) error {
+func (c *networkCmd) doNetworkAttachProfile(client lxd.ContainerServer, name string, args []string) error {
 	if len(args) < 1 || len(args) > 3 {
 		return errArgs
 	}
 
-	profile := args[0]
+	// Default name is same as network
 	devName := name
 	if len(args) > 1 {
 		devName = args[1]
 	}
 
-	network, err := client.NetworkGet(name)
+	// Get the network entry
+	network, _, err := client.GetNetwork(name)
 	if err != nil {
 		return err
 	}
 
-	nicType := "macvlan"
+	// Prepare the profile's device entry
+	device := map[string]string{
+		"type":    "nic",
+		"nictype": "macvlan",
+		"parent":  name,
+	}
+
 	if network.Type == "bridge" {
-		nicType = "bridged"
+		device["nictype"] = "bridged"
 	}
 
-	props := []string{fmt.Sprintf("nictype=%s", nicType), fmt.Sprintf("parent=%s", name)}
 	if len(args) > 2 {
-		props = append(props, fmt.Sprintf("name=%s", args[2]))
+		device["name"] = args[2]
 	}
 
-	_, err = client.ProfileDeviceAdd(profile, devName, "nic", props)
-	return err
+	// Get the profile entry
+	profile, profileEtag, err := client.GetProfile(args[0])
+	if err != nil {
+		return err
+	}
+
+	// Check if the device already exists
+	_, ok := profile.Devices[devName]
+	if ok {
+		return fmt.Errorf(i18n.G("Device already exists: %s"), devName)
+	}
+
+	// Add the device to the container
+	profile.Devices[devName] = device
+
+	err = client.UpdateProfile(args[0], profile.Writable(), profileEtag)
+	if err != nil {
+		return err
+	}
+
+	return nil
 }
 
-func (c *networkCmd) doNetworkCreate(client *lxd.Client, name string, args []string) error {
-	config := map[string]string{}
+func (c *networkCmd) doNetworkCreate(client lxd.ContainerServer, name string, args []string) error {
+	network := api.NetworksPost{}
+	network.Name = name
+	network.Config = map[string]string{}
 
 	for i := 0; i < len(args); i++ {
 		entry := strings.SplitN(args[i], "=", 2)
@@ -219,33 +267,36 @@ func (c *networkCmd) doNetworkCreate(client *lxd.Client, name string, args []str
 			return errArgs
 		}
 
-		config[entry[0]] = entry[1]
+		network.Config[entry[0]] = entry[1]
 	}
 
-	err := client.NetworkCreate(name, config)
-	if err == nil {
-		fmt.Printf(i18n.G("Network %s created")+"\n", name)
+	err := client.CreateNetwork(network)
+	if err != nil {
+		return err
 	}
 
-	return err
+	fmt.Printf(i18n.G("Network %s created")+"\n", name)
+	return nil
 }
 
-func (c *networkCmd) doNetworkDetach(client *lxd.Client, name string, args []string) error {
+func (c *networkCmd) doNetworkDetach(client lxd.ContainerServer, name string, args []string) error {
 	if len(args) < 1 || len(args) > 2 {
 		return errArgs
 	}
 
-	containerName := args[0]
+	// Default name is same as network
 	devName := ""
 	if len(args) > 1 {
 		devName = args[1]
 	}
 
-	container, err := client.ContainerInfo(containerName)
+	// Get the container entry
+	container, etag, err := client.GetContainer(args[0])
 	if err != nil {
 		return err
 	}
 
+	// Find the device
 	if devName == "" {
 		for n, d := range container.Devices {
 			if d["type"] == "nic" && d["parent"] == name {
@@ -271,30 +322,34 @@ func (c *networkCmd) doNetworkDetach(client *lxd.Client, name string, args []str
 		return fmt.Errorf(i18n.G("The specified device doesn't match the network"))
 	}
 
-	resp, err := client.ContainerDeviceDelete(containerName, devName)
+	// Remove the device
+	delete(container.Devices, devName)
+	op, err := client.UpdateContainer(args[0], container.Writable(), etag)
 	if err != nil {
 		return err
 	}
 
-	return client.WaitForSuccess(resp.Operation)
+	return op.Wait()
 }
 
-func (c *networkCmd) doNetworkDetachProfile(client *lxd.Client, name string, args []string) error {
+func (c *networkCmd) doNetworkDetachProfile(client lxd.ContainerServer, name string, args []string) error {
 	if len(args) < 1 || len(args) > 2 {
 		return errArgs
 	}
 
-	profileName := args[0]
+	// Default name is same as network
 	devName := ""
 	if len(args) > 1 {
 		devName = args[1]
 	}
 
-	profile, err := client.ProfileConfig(profileName)
+	// Get the profile entry
+	profile, etag, err := client.GetProfile(args[0])
 	if err != nil {
 		return err
 	}
 
+	// Find the device
 	if devName == "" {
 		for n, d := range profile.Devices {
 			if d["type"] == "nic" && d["parent"] == name {
@@ -320,20 +375,27 @@ func (c *networkCmd) doNetworkDetachProfile(client *lxd.Client, name string, arg
 		return fmt.Errorf(i18n.G("The specified device doesn't match the network"))
 	}
 
-	_, err = client.ProfileDeviceDelete(profileName, devName)
-	return err
+	// Remove the device
+	delete(profile.Devices, devName)
+	err = client.UpdateProfile(args[0], profile.Writable(), etag)
+	if err != nil {
+		return err
+	}
+
+	return nil
 }
 
-func (c *networkCmd) doNetworkDelete(client *lxd.Client, name string) error {
-	err := client.NetworkDelete(name)
-	if err == nil {
-		fmt.Printf(i18n.G("Network %s deleted")+"\n", name)
+func (c *networkCmd) doNetworkDelete(client lxd.ContainerServer, name string) error {
+	err := client.DeleteNetwork(name)
+	if err != nil {
+		return err
 	}
 
-	return err
+	fmt.Printf(i18n.G("Network %s deleted")+"\n", name)
+	return nil
 }
 
-func (c *networkCmd) doNetworkEdit(client *lxd.Client, name string) error {
+func (c *networkCmd) doNetworkEdit(client lxd.ContainerServer, name string) error {
 	// If stdin isn't a terminal, read text from it
 	if !termios.IsTerminal(int(syscall.Stdin)) {
 		contents, err := ioutil.ReadAll(os.Stdin)
@@ -346,11 +408,12 @@ func (c *networkCmd) doNetworkEdit(client *lxd.Client, name string) error {
 		if err != nil {
 			return err
 		}
-		return client.NetworkPut(name, newdata)
+
+		return client.UpdateNetwork(name, newdata, "")
 	}
 
 	// Extract the current value
-	network, err := client.NetworkGet(name)
+	network, etag, err := client.GetNetwork(name)
 	if err != nil {
 		return err
 	}
@@ -375,7 +438,7 @@ func (c *networkCmd) doNetworkEdit(client *lxd.Client, name string) error {
 		newdata := api.NetworkPut{}
 		err = yaml.Unmarshal(content, &newdata)
 		if err == nil {
-			err = client.NetworkPut(name, newdata)
+			err = client.UpdateNetwork(name, newdata, etag)
 		}
 
 		// Respawn the editor
@@ -399,13 +462,13 @@ func (c *networkCmd) doNetworkEdit(client *lxd.Client, name string) error {
 	return nil
 }
 
-func (c *networkCmd) doNetworkGet(client *lxd.Client, name string, args []string) error {
+func (c *networkCmd) doNetworkGet(client lxd.ContainerServer, name string, args []string) error {
 	// we shifted @args so so it should read "<key>"
 	if len(args) != 1 {
 		return errArgs
 	}
 
-	resp, err := client.NetworkGet(name)
+	resp, _, err := client.GetNetwork(name)
 	if err != nil {
 		return err
 	}
@@ -436,12 +499,12 @@ func (c *networkCmd) doNetworkList(conf *config.Config, args []string) error {
 		remote = conf.DefaultRemote
 	}
 
-	client, err := lxd.NewClient(conf.Legacy(), remote)
+	client, err := conf.GetContainerServer(remote)
 	if err != nil {
 		return err
 	}
 
-	networks, err := client.ListNetworks()
+	networks, err := client.GetNetworks()
 	if err != nil {
 		return err
 	}
@@ -478,13 +541,13 @@ func (c *networkCmd) doNetworkList(conf *config.Config, args []string) error {
 	return nil
 }
 
-func (c *networkCmd) doNetworkSet(client *lxd.Client, name string, args []string) error {
+func (c *networkCmd) doNetworkSet(client lxd.ContainerServer, name string, args []string) error {
 	// we shifted @args so so it should read "<key> [<value>]"
 	if len(args) < 1 {
 		return errArgs
 	}
 
-	network, err := client.NetworkGet(name)
+	network, etag, err := client.GetNetwork(name)
 	if err != nil {
 		return err
 	}
@@ -511,15 +574,15 @@ func (c *networkCmd) doNetworkSet(client *lxd.Client, name string, args []string
 
 	network.Config[key] = value
 
-	return client.NetworkPut(name, network.Writable())
+	return client.UpdateNetwork(name, network.Writable(), etag)
 }
 
-func (c *networkCmd) doNetworkShow(client *lxd.Client, name string) error {
+func (c *networkCmd) doNetworkShow(client lxd.ContainerServer, name string) error {
 	if name == "" {
 		return errArgs
 	}
 
-	network, err := client.NetworkGet(name)
+	network, _, err := client.GetNetwork(name)
 	if err != nil {
 		return err
 	}

From f28a8682639e8a80d73fe220e8c3fabf6b218d08 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Mon, 24 Apr 2017 00:58:21 -0400
Subject: [PATCH 15/28] lxc: Move common code to utils.go
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxc/network.go | 36 ++++--------------------------------
 lxc/utils.go   | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 53 insertions(+), 32 deletions(-)

diff --git a/lxc/network.go b/lxc/network.go
index 96b826e03..c17d2b40b 100644
--- a/lxc/network.go
+++ b/lxc/network.go
@@ -178,27 +178,13 @@ func (c *networkCmd) doNetworkAttach(client lxd.ContainerServer, name string, ar
 		device["name"] = args[2]
 	}
 
-	// Get the container entry
-	ctn, ctnEtag, err := client.GetContainer(args[0])
-	if err != nil {
-		return err
-	}
-
-	// Check if the device already exists
-	_, ok := ctn.Devices[devName]
-	if ok {
-		return fmt.Errorf(i18n.G("Device already exists: %s"), devName)
-	}
-
 	// Add the device to the container
-	ctn.Devices[devName] = device
-
-	op, err := client.UpdateContainer(args[0], ctn.Writable(), ctnEtag)
+	err = containerDeviceAdd(client, args[0], devName, device)
 	if err != nil {
 		return err
 	}
 
-	return op.Wait()
+	return nil
 }
 
 func (c *networkCmd) doNetworkAttachProfile(client lxd.ContainerServer, name string, args []string) error {
@@ -233,22 +219,8 @@ func (c *networkCmd) doNetworkAttachProfile(client lxd.ContainerServer, name str
 		device["name"] = args[2]
 	}
 
-	// Get the profile entry
-	profile, profileEtag, err := client.GetProfile(args[0])
-	if err != nil {
-		return err
-	}
-
-	// Check if the device already exists
-	_, ok := profile.Devices[devName]
-	if ok {
-		return fmt.Errorf(i18n.G("Device already exists: %s"), devName)
-	}
-
-	// Add the device to the container
-	profile.Devices[devName] = device
-
-	err = client.UpdateProfile(args[0], profile.Writable(), profileEtag)
+	// Add the device to the profile
+	err = profileDeviceAdd(client, args[0], devName, device)
 	if err != nil {
 		return err
 	}
diff --git a/lxc/utils.go b/lxc/utils.go
index 4693a8175..4900ca0ac 100644
--- a/lxc/utils.go
+++ b/lxc/utils.go
@@ -233,3 +233,52 @@ func getLocalErr(err error) error {
 
 	return nil
 }
+
+// Add a device to a container
+func containerDeviceAdd(client lxd.ContainerServer, name string, devName string, dev map[string]string) error {
+	// Get the container entry
+	container, etag, err := client.GetContainer(name)
+	if err != nil {
+		return err
+	}
+
+	// Check if the device already exists
+	_, ok := container.Devices[devName]
+	if ok {
+		return fmt.Errorf(i18n.G("Device already exists: %s"), devName)
+	}
+
+	container.Devices[devName] = dev
+
+	op, err := client.UpdateContainer(name, container.Writable(), etag)
+	if err != nil {
+		return err
+	}
+
+	return op.Wait()
+}
+
+// Add a device to a profile
+func profileDeviceAdd(client lxd.ContainerServer, name string, devName string, dev map[string]string) error {
+	// Get the profile entry
+	profile, profileEtag, err := client.GetProfile(name)
+	if err != nil {
+		return err
+	}
+
+	// Check if the device already exists
+	_, ok := profile.Devices[devName]
+	if ok {
+		return fmt.Errorf(i18n.G("Device already exists: %s"), devName)
+	}
+
+	// Add the device to the container
+	profile.Devices[devName] = dev
+
+	err = client.UpdateProfile(name, profile.Writable(), profileEtag)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}

From f90a2a5044285e2132ae5f141f4ce258dc066ca9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Mon, 24 Apr 2017 00:58:42 -0400
Subject: [PATCH 16/28] lxc/storage: Port to new client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxc/storage.go | 251 ++++++++++++++++++++++++++++++++++++---------------------
 1 file changed, 161 insertions(+), 90 deletions(-)

diff --git a/lxc/storage.go b/lxc/storage.go
index 484f6e13d..b09bbe0d7 100644
--- a/lxc/storage.go
+++ b/lxc/storage.go
@@ -12,7 +12,7 @@ import (
 	"github.com/olekukonko/tablewriter"
 	"gopkg.in/yaml.v2"
 
-	"github.com/lxc/lxd"
+	"github.com/lxc/lxd/client"
 	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared"
 	"github.com/lxc/lxd/shared/api"
@@ -162,7 +162,7 @@ func (c *storageCmd) run(conf *config.Config, args []string) error {
 		return err
 	}
 
-	client, err := lxd.NewClient(conf.Legacy(), remote)
+	client, err := conf.GetContainerServer(remote)
 	if err != nil {
 		return err
 	}
@@ -305,12 +305,11 @@ func (c *storageCmd) parseVolume(name string) (string, string) {
 	return fields[1], fields[0]
 }
 
-func (c *storageCmd) doStoragePoolVolumeAttach(client *lxd.Client, pool string, volume string, args []string) error {
+func (c *storageCmd) doStoragePoolVolumeAttach(client lxd.ContainerServer, pool string, volume string, args []string) error {
 	if len(args) < 2 || len(args) > 3 {
 		return errArgs
 	}
 
-	container := args[0]
 	devPath := ""
 	devName := ""
 	if len(args) == 2 {
@@ -328,38 +327,46 @@ func (c *storageCmd) doStoragePoolVolumeAttach(client *lxd.Client, pool string,
 		return fmt.Errorf(i18n.G("Only \"custom\" volumes can be attached to containers."))
 	}
 
-	// Check if the requested storage volume actually
-	// exists on the requested storage pool.
-	vol, err := client.StoragePoolVolumeTypeGet(pool, volName, volType)
+	// Check if the requested storage volume actually exists
+	vol, _, err := client.GetStoragePoolVolume(pool, volType, volName)
 	if err != nil {
 		return err
 	}
 
-	props := []string{fmt.Sprintf("pool=%s", pool), fmt.Sprintf("path=%s", devPath), fmt.Sprintf("source=%s", vol.Name)}
-	resp, err := client.ContainerDeviceAdd(container, devName, "disk", props)
+	// Prepare the container's device entry
+	device := map[string]string{
+		"type":   "disk",
+		"pool":   pool,
+		"path":   devPath,
+		"source": vol.Name,
+	}
+
+	// Add the device to the container
+	err = containerDeviceAdd(client, args[0], devName, device)
 	if err != nil {
 		return err
 	}
 
-	return client.WaitForSuccess(resp.Operation)
+	return nil
 }
 
-func (c *storageCmd) doStoragePoolVolumeDetach(client *lxd.Client, pool string, volume string, args []string) error {
+func (c *storageCmd) doStoragePoolVolumeDetach(client lxd.ContainerServer, pool string, volume string, args []string) error {
 	if len(args) < 1 || len(args) > 2 {
 		return errArgs
 	}
 
-	containerName := args[0]
 	devName := ""
 	if len(args) == 2 {
 		devName = args[1]
 	}
 
-	container, err := client.ContainerInfo(containerName)
+	// Get the container entry
+	container, etag, err := client.GetContainer(args[0])
 	if err != nil {
 		return err
 	}
 
+	// Find the device
 	if devName == "" {
 		for n, d := range container.Devices {
 			if d["type"] == "disk" && d["pool"] == pool && d["source"] == volume {
@@ -381,20 +388,21 @@ func (c *storageCmd) doStoragePoolVolumeDetach(client *lxd.Client, pool string,
 		return fmt.Errorf(i18n.G("The specified device doesn't exist"))
 	}
 
-	resp, err := client.ContainerDeviceDelete(containerName, devName)
+	// Remove the device
+	delete(container.Devices, devName)
+	op, err := client.UpdateContainer(args[0], container.Writable(), etag)
 	if err != nil {
 		return err
 	}
 
-	return client.WaitForSuccess(resp.Operation)
+	return op.Wait()
 }
 
-func (c *storageCmd) doStoragePoolVolumeAttachProfile(client *lxd.Client, pool string, volume string, args []string) error {
+func (c *storageCmd) doStoragePoolVolumeAttachProfile(client lxd.ContainerServer, pool string, volume string, args []string) error {
 	if len(args) < 2 || len(args) > 3 {
 		return errArgs
 	}
 
-	profile := args[0]
 	devPath := ""
 	devName := ""
 	if len(args) == 2 {
@@ -412,54 +420,73 @@ func (c *storageCmd) doStoragePoolVolumeAttachProfile(client *lxd.Client, pool s
 		return fmt.Errorf(i18n.G("Only \"custom\" volumes can be attached to containers."))
 	}
 
-	// Check if the requested storage volume actually
-	// exists on the requested storage pool.
-	vol, err := client.StoragePoolVolumeTypeGet(pool, volName, volType)
+	// Check if the requested storage volume actually exists
+	vol, _, err := client.GetStoragePoolVolume(pool, volType, volName)
 	if err != nil {
 		return err
 	}
 
-	props := []string{fmt.Sprintf("pool=%s", pool), fmt.Sprintf("path=%s", devPath), fmt.Sprintf("source=%s", vol.Name)}
+	// Prepare the container's device entry
+	device := map[string]string{
+		"type":   "disk",
+		"pool":   pool,
+		"path":   devPath,
+		"source": vol.Name,
+	}
+
+	// Add the device to the container
+	err = profileDeviceAdd(client, args[0], devName, device)
+	if err != nil {
+		return err
+	}
 
-	_, err = client.ProfileDeviceAdd(profile, devName, "disk", props)
-	return err
+	return nil
 }
 
-func (c *storageCmd) doStoragePoolCreate(client *lxd.Client, name string, driver string, args []string) error {
-	config := map[string]string{}
+func (c *storageCmd) doStoragePoolCreate(client lxd.ContainerServer, name string, driver string, args []string) error {
+	// Create the new storage pool entry
+	pool := api.StoragePoolsPost{}
+	pool.Name = name
+	pool.Config = map[string]string{}
+	pool.Driver = driver
 
 	for i := 0; i < len(args); i++ {
 		entry := strings.SplitN(args[i], "=", 2)
 		if len(entry) < 2 {
 			return errArgs
 		}
-		config[entry[0]] = entry[1]
+
+		pool.Config[entry[0]] = entry[1]
 	}
 
-	err := client.StoragePoolCreate(name, driver, config)
-	if err == nil {
-		fmt.Printf(i18n.G("Storage pool %s created")+"\n", name)
+	// Create the pool
+	err := client.CreateStoragePool(pool)
+	if err != nil {
+		return err
 	}
 
-	return err
+	fmt.Printf(i18n.G("Storage pool %s created")+"\n", name)
+
+	return nil
 }
 
-func (c *storageCmd) doStoragePoolVolumeDetachProfile(client *lxd.Client, pool string, volume string, args []string) error {
+func (c *storageCmd) doStoragePoolVolumeDetachProfile(client lxd.ContainerServer, pool string, volume string, args []string) error {
 	if len(args) < 1 || len(args) > 2 {
 		return errArgs
 	}
 
-	profileName := args[0]
 	devName := ""
 	if len(args) > 1 {
 		devName = args[1]
 	}
 
-	profile, err := client.ProfileConfig(profileName)
+	// Get the profile entry
+	profile, etag, err := client.GetProfile(args[0])
 	if err != nil {
 		return err
 	}
 
+	// Find the device
 	if devName == "" {
 		for n, d := range profile.Devices {
 			if d["type"] == "disk" && d["pool"] == pool && d["source"] == volume {
@@ -481,20 +508,28 @@ func (c *storageCmd) doStoragePoolVolumeDetachProfile(client *lxd.Client, pool s
 		return fmt.Errorf(i18n.G("The specified device doesn't exist"))
 	}
 
-	_, err = client.ProfileDeviceDelete(profileName, devName)
-	return err
+	// Remove the device
+	delete(profile.Devices, devName)
+	err = client.UpdateProfile(args[0], profile.Writable(), etag)
+	if err != nil {
+		return err
+	}
+
+	return nil
 }
 
-func (c *storageCmd) doStoragePoolDelete(client *lxd.Client, name string) error {
-	err := client.StoragePoolDelete(name)
-	if err == nil {
-		fmt.Printf(i18n.G("Storage pool %s deleted")+"\n", name)
+func (c *storageCmd) doStoragePoolDelete(client lxd.ContainerServer, name string) error {
+	err := client.DeleteStoragePool(name)
+	if err != nil {
+		return err
 	}
 
-	return err
+	fmt.Printf(i18n.G("Storage pool %s deleted")+"\n", name)
+
+	return nil
 }
 
-func (c *storageCmd) doStoragePoolEdit(client *lxd.Client, name string) error {
+func (c *storageCmd) doStoragePoolEdit(client lxd.ContainerServer, name string) error {
 	// If stdin isn't a terminal, read text from it
 	if !termios.IsTerminal(int(syscall.Stdin)) {
 		contents, err := ioutil.ReadAll(os.Stdin)
@@ -502,16 +537,17 @@ func (c *storageCmd) doStoragePoolEdit(client *lxd.Client, name string) error {
 			return err
 		}
 
-		newdata := api.StoragePool{}
+		newdata := api.StoragePoolPut{}
 		err = yaml.Unmarshal(contents, &newdata)
 		if err != nil {
 			return err
 		}
-		return client.StoragePoolPut(name, newdata)
+
+		return client.UpdateStoragePool(name, newdata, "")
 	}
 
 	// Extract the current value
-	pool, err := client.StoragePoolGet(name)
+	pool, etag, err := client.GetStoragePool(name)
 	if err != nil {
 		return err
 	}
@@ -529,10 +565,10 @@ func (c *storageCmd) doStoragePoolEdit(client *lxd.Client, name string) error {
 
 	for {
 		// Parse the text received from the editor
-		newdata := api.StoragePool{}
+		newdata := api.StoragePoolPut{}
 		err = yaml.Unmarshal(content, &newdata)
 		if err == nil {
-			err = client.StoragePoolPut(name, newdata)
+			err = client.UpdateStoragePool(name, newdata, etag)
 		}
 
 		// Respawn the editor
@@ -556,13 +592,13 @@ func (c *storageCmd) doStoragePoolEdit(client *lxd.Client, name string) error {
 	return nil
 }
 
-func (c *storageCmd) doStoragePoolGet(client *lxd.Client, name string, args []string) error {
+func (c *storageCmd) doStoragePoolGet(client lxd.ContainerServer, name string, args []string) error {
 	// we shifted @args so so it should read "<key>"
 	if len(args) != 1 {
 		return errArgs
 	}
 
-	resp, err := client.StoragePoolGet(name)
+	resp, _, err := client.GetStoragePool(name)
 	if err != nil {
 		return err
 	}
@@ -592,12 +628,12 @@ func (c *storageCmd) doStoragePoolsList(conf *config.Config, args []string) erro
 		remote = conf.DefaultRemote
 	}
 
-	client, err := lxd.NewClient(conf.Legacy(), remote)
+	client, err := conf.GetContainerServer(remote)
 	if err != nil {
 		return err
 	}
 
-	pools, err := client.ListStoragePools()
+	pools, err := client.GetStoragePools()
 	if err != nil {
 		return err
 	}
@@ -626,18 +662,18 @@ func (c *storageCmd) doStoragePoolsList(conf *config.Config, args []string) erro
 	return nil
 }
 
-func (c *storageCmd) doStoragePoolSet(client *lxd.Client, name string, args []string) error {
-	// we shifted @args so so it should read "<key> [<value>]"
+func (c *storageCmd) doStoragePoolSet(client lxd.ContainerServer, name string, args []string) error {
 	if len(args) < 1 {
 		return errArgs
 	}
 
-	pool, err := client.StoragePoolGet(name)
+	// Get the pool entry
+	pool, etag, err := client.GetStoragePool(name)
 	if err != nil {
 		return err
 	}
 
-	key := args[0]
+	// Read the value
 	var value string
 	if len(args) < 2 {
 		value = ""
@@ -653,17 +689,23 @@ func (c *storageCmd) doStoragePoolSet(client *lxd.Client, name string, args []st
 		value = string(buf[:])
 	}
 
-	pool.Config[key] = value
+	// Update the pool
+	pool.Config[args[0]] = value
 
-	return client.StoragePoolPut(name, pool)
+	err = client.UpdateStoragePool(name, pool.Writable(), etag)
+	if err != nil {
+		return err
+	}
+
+	return nil
 }
 
-func (c *storageCmd) doStoragePoolShow(client *lxd.Client, name string) error {
+func (c *storageCmd) doStoragePoolShow(client lxd.ContainerServer, name string) error {
 	if name == "" {
 		return errArgs
 	}
 
-	pool, err := client.StoragePoolGet(name)
+	pool, _, err := client.GetStoragePool(name)
 	if err != nil {
 		return err
 	}
@@ -681,12 +723,12 @@ func (c *storageCmd) doStoragePoolShow(client *lxd.Client, name string) error {
 }
 
 func (c *storageCmd) doStoragePoolVolumesList(conf *config.Config, remote string, pool string, args []string) error {
-	client, err := lxd.NewClient(conf.Legacy(), remote)
+	client, err := conf.GetContainerServer(remote)
 	if err != nil {
 		return err
 	}
 
-	volumes, err := client.StoragePoolVolumesList(pool)
+	volumes, err := client.GetStoragePoolVolumes(pool)
 	if err != nil {
 		return err
 	}
@@ -713,44 +755,60 @@ func (c *storageCmd) doStoragePoolVolumesList(conf *config.Config, remote string
 	return nil
 }
 
-func (c *storageCmd) doStoragePoolVolumeCreate(client *lxd.Client, pool string, volume string, args []string) error {
-	config := map[string]string{}
+func (c *storageCmd) doStoragePoolVolumeCreate(client lxd.ContainerServer, pool string, volume string, args []string) error {
+	// Parse the input
+	volName, volType := c.parseVolume(volume)
+
+	// Create the storage volume entry
+	vol := api.StorageVolumesPost{}
+	vol.Name = volName
+	vol.Type = volType
+	vol.Config = map[string]string{}
 
 	for i := 0; i < len(args); i++ {
 		entry := strings.SplitN(args[i], "=", 2)
 		if len(entry) < 2 {
 			return errArgs
 		}
-		config[entry[0]] = entry[1]
+
+		vol.Config[entry[0]] = entry[1]
 	}
 
-	volName, volType := c.parseVolume(volume)
-	err := client.StoragePoolVolumeTypeCreate(pool, volName, volType, config)
-	if err == nil {
-		fmt.Printf(i18n.G("Storage volume %s created")+"\n", volume)
+	err := client.CreateStoragePoolVolume(pool, vol)
+	if err != nil {
+		return err
 	}
 
-	return err
+	fmt.Printf(i18n.G("Storage volume %s created")+"\n", volume)
+
+	return nil
 }
 
-func (c *storageCmd) doStoragePoolVolumeDelete(client *lxd.Client, pool string, volume string) error {
+func (c *storageCmd) doStoragePoolVolumeDelete(client lxd.ContainerServer, pool string, volume string) error {
+	// Parse the input
 	volName, volType := c.parseVolume(volume)
-	err := client.StoragePoolVolumeTypeDelete(pool, volName, volType)
-	if err == nil {
-		fmt.Printf(i18n.G("Storage volume %s deleted")+"\n", volume)
+
+	// Delete the volume
+	err := client.DeleteStoragePoolVolume(pool, volType, volName)
+	if err != nil {
+		return err
 	}
 
-	return err
+	fmt.Printf(i18n.G("Storage volume %s deleted")+"\n", volume)
+
+	return nil
 }
 
-func (c *storageCmd) doStoragePoolVolumeGet(client *lxd.Client, pool string, volume string, args []string) error {
-	// we shifted @args so so it should read "<key>"
+func (c *storageCmd) doStoragePoolVolumeGet(client lxd.ContainerServer, pool string, volume string, args []string) error {
 	if len(args) != 2 {
 		return errArgs
 	}
 
+	// Parse input
 	volName, volType := c.parseVolume(volume)
-	resp, err := client.StoragePoolVolumeTypeGet(pool, volName, volType)
+
+	// Get the storage volume entry
+	resp, _, err := client.GetStoragePoolVolume(pool, volType, volName)
 	if err != nil {
 		return err
 	}
@@ -760,21 +818,25 @@ func (c *storageCmd) doStoragePoolVolumeGet(client *lxd.Client, pool string, vol
 			fmt.Printf("%s\n", v)
 		}
 	}
+
 	return nil
 }
 
-func (c *storageCmd) doStoragePoolVolumeSet(client *lxd.Client, pool string, volume string, args []string) error {
-	// we shifted @args so so it should read "<key> [<value>]"
+func (c *storageCmd) doStoragePoolVolumeSet(client lxd.ContainerServer, pool string, volume string, args []string) error {
 	if len(args) < 2 {
 		return errArgs
 	}
 
+	// Parse the input
 	volName, volType := c.parseVolume(volume)
-	volumeConfig, err := client.StoragePoolVolumeTypeGet(pool, volName, volType)
+
+	// Get the storage volume entry
+	vol, etag, err := client.GetStoragePoolVolume(pool, volType, volName)
 	if err != nil {
 		return err
 	}
 
+	// Get the value
 	key := args[1]
 	var value string
 	if len(args) < 3 {
@@ -791,21 +853,29 @@ func (c *storageCmd) doStoragePoolVolumeSet(client *lxd.Client, pool string, vol
 		value = string(buf[:])
 	}
 
-	volumeConfig.Config[key] = value
+	// Update the volume
+	vol.Config[key] = value
+	err = client.UpdateStoragePoolVolume(pool, vol.Type, vol.Name, vol.Writable(), etag)
+	if err != nil {
+		return err
+	}
 
-	return client.StoragePoolVolumeTypePut(pool, volName, volType, volumeConfig)
+	return nil
 }
 
-func (c *storageCmd) doStoragePoolVolumeShow(client *lxd.Client, pool string, volume string) error {
+func (c *storageCmd) doStoragePoolVolumeShow(client lxd.ContainerServer, pool string, volume string) error {
+	// Parse the input
 	volName, volType := c.parseVolume(volume)
-	volumeStruct, err := client.StoragePoolVolumeTypeGet(pool, volName, volType)
+
+	// Get the storage volume entry
+	vol, _, err := client.GetStoragePoolVolume(pool, volType, volName)
 	if err != nil {
 		return err
 	}
 
-	sort.Strings(volumeStruct.UsedBy)
+	sort.Strings(vol.UsedBy)
 
-	data, err := yaml.Marshal(&volumeStruct)
+	data, err := yaml.Marshal(&vol)
 	if err != nil {
 		return err
 	}
@@ -815,7 +885,8 @@ func (c *storageCmd) doStoragePoolVolumeShow(client *lxd.Client, pool string, vo
 	return nil
 }
 
-func (c *storageCmd) doStoragePoolVolumeEdit(client *lxd.Client, pool string, volume string) error {
+func (c *storageCmd) doStoragePoolVolumeEdit(client lxd.ContainerServer, pool string, volume string) error {
+	// Parse the input
 	volName, volType := c.parseVolume(volume)
 
 	// If stdin isn't a terminal, read text from it
@@ -825,17 +896,17 @@ func (c *storageCmd) doStoragePoolVolumeEdit(client *lxd.Client, pool string, vo
 			return err
 		}
 
-		newdata := api.StorageVolume{}
+		newdata := api.StorageVolumePut{}
 		err = yaml.Unmarshal(contents, &newdata)
 		if err != nil {
 			return err
 		}
 
-		return client.StoragePoolVolumeTypePut(pool, volName, volType, newdata)
+		return client.UpdateStoragePoolVolume(pool, volType, volName, newdata, "")
 	}
 
 	// Extract the current value
-	vol, err := client.StoragePoolVolumeTypeGet(pool, volName, volType)
+	vol, etag, err := client.GetStoragePoolVolume(pool, volType, volName)
 	if err != nil {
 		return err
 	}
@@ -856,7 +927,7 @@ func (c *storageCmd) doStoragePoolVolumeEdit(client *lxd.Client, pool string, vo
 		newdata := api.StorageVolume{}
 		err = yaml.Unmarshal(content, &newdata)
 		if err == nil {
-			err = client.StoragePoolVolumeTypePut(pool, volName, volType, newdata)
+			err = client.UpdateStoragePoolVolume(pool, vol.Type, vol.Name, newdata.Writable(), etag)
 		}
 
 		// Respawn the editor

From b496be20016ac2b1700430661a98e5baf2f1306e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Mon, 24 Apr 2017 12:06:01 -0400
Subject: [PATCH 17/28] lxc/image: Port to new client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxc/image.go          | 340 ++++++++++++++++++++++++++++++++++++++------------
 test/suites/remote.sh |   7 +-
 2 files changed, 261 insertions(+), 86 deletions(-)

diff --git a/lxc/image.go b/lxc/image.go
index b372a048e..8cc78dd3b 100644
--- a/lxc/image.go
+++ b/lxc/image.go
@@ -4,8 +4,10 @@ import (
 	"encoding/csv"
 	"encoding/json"
 	"fmt"
+	"io"
 	"io/ioutil"
 	"os"
+	"path/filepath"
 	"regexp"
 	"sort"
 	"strings"
@@ -14,7 +16,7 @@ import (
 	"github.com/olekukonko/tablewriter"
 	"gopkg.in/yaml.v2"
 
-	"github.com/lxc/lxd"
+	"github.com/lxc/lxd/client"
 	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared"
 	"github.com/lxc/lxd/shared/api"
@@ -286,12 +288,12 @@ func (c *imageCmd) doImageAlias(conf *config.Config, args []string) error {
 			}
 		}
 
-		d, err := lxd.NewClient(conf.Legacy(), remote)
+		d, err := conf.GetImageServer(remote)
 		if err != nil {
 			return err
 		}
 
-		resp, err := d.ListAliases()
+		resp, err := d.GetImageAliases()
 		if err != nil {
 			return err
 		}
@@ -305,19 +307,21 @@ func (c *imageCmd) doImageAlias(conf *config.Config, args []string) error {
 			return errArgs
 		}
 
-		remote, alias, err := conf.ParseRemote(args[2])
+		remote, name, err := conf.ParseRemote(args[2])
 		if err != nil {
 			return err
 		}
 
-		target := args[3]
-		d, err := lxd.NewClient(conf.Legacy(), remote)
+		d, err := conf.GetContainerServer(remote)
 		if err != nil {
 			return err
 		}
-		/* TODO - what about description? */
-		err = d.PostAlias(alias, alias, target)
-		return err
+
+		alias := api.ImageAliasesPost{}
+		alias.Name = name
+		alias.Target = args[3]
+
+		return d.CreateImageAlias(alias)
 	case "delete":
 		/* alias delete [<remote>:]<alias> */
 		if len(args) < 3 {
@@ -329,11 +333,12 @@ func (c *imageCmd) doImageAlias(conf *config.Config, args []string) error {
 			return err
 		}
 
-		d, err := lxd.NewClient(conf.Legacy(), remote)
+		d, err := conf.GetContainerServer(remote)
 		if err != nil {
 			return err
 		}
-		err = d.DeleteAlias(alias)
+
+		err = d.DeleteImageAlias(alias)
 		return err
 	}
 	return errArgs
@@ -364,10 +369,6 @@ func (c *imageCmd) run(conf *config.Config, args []string) error {
 			return err
 		}
 
-		if inName == "" {
-			inName = "default"
-		}
-
 		destRemote, outName, err := conf.ParseRemote(args[2])
 		if err != nil {
 			return err
@@ -377,24 +378,63 @@ func (c *imageCmd) run(conf *config.Config, args []string) error {
 			return errArgs
 		}
 
-		d, err := lxd.NewClient(conf.Legacy(), remote)
+		d, err := conf.GetImageServer(remote)
+		if err != nil {
+			return err
+		}
+
+		dest, err := conf.GetContainerServer(destRemote)
+		if err != nil {
+			return err
+		}
+
+		// Check if an alias
+		fingerprint := c.dereferenceAlias(d, inName)
+
+		// Get the image
+		image, _, err := d.GetImage(fingerprint)
 		if err != nil {
 			return err
 		}
 
-		dest, err := lxd.NewClient(conf.Legacy(), destRemote)
+		// Setup the copy arguments
+		aliases := []api.ImageAlias{}
+		for _, entry := range c.addAliases {
+			alias := api.ImageAlias{}
+			alias.Name = entry
+			aliases = append(aliases, alias)
+		}
+
+		args := lxd.ImageCopyArgs{
+			Aliases:     aliases,
+			AutoUpdate:  c.autoUpdate,
+			CopyAliases: c.copyAliases,
+			Public:      c.publicImage,
+		}
+
+		// Do the copy
+		op, err := dest.CopyImage(d, *image, &args)
 		if err != nil {
 			return err
 		}
 
+		// Register progress handler
 		progress := ProgressRenderer{Format: i18n.G("Copying the image: %s")}
-		err = d.CopyImage(inName, dest, c.copyAliases, c.addAliases, c.publicImage, c.autoUpdate, progress.Update)
-		if err == nil {
-			progress.Done(i18n.G("Image copied successfully!"))
+		_, err = op.AddHandler(progress.UpdateOp)
+		if err != nil {
+			progress.Done("")
+			return err
 		}
-		progress.Done("")
 
-		return err
+		// Wait for operation to finish
+		err = op.Wait()
+		if err != nil {
+			progress.Done("")
+			return err
+		}
+
+		progress.Done(i18n.G("Image copied successfully!"))
+		return nil
 
 	case "delete":
 		/* delete [<remote>:]<image> [<remote>:][<image>...] */
@@ -409,17 +449,18 @@ func (c *imageCmd) run(conf *config.Config, args []string) error {
 				return err
 			}
 
-			if inName == "" {
-				inName = "default"
+			d, err := conf.GetContainerServer(remote)
+			if err != nil {
+				return err
 			}
 
-			d, err := lxd.NewClient(conf.Legacy(), remote)
+			image := c.dereferenceAlias(d, inName)
+			op, err := d.DeleteImage(image)
 			if err != nil {
 				return err
 			}
 
-			image := c.dereferenceAlias(d, inName)
-			err = d.DeleteImage(image)
+			err = op.Wait()
 			if err != nil {
 				return err
 			}
@@ -434,23 +475,33 @@ func (c *imageCmd) run(conf *config.Config, args []string) error {
 		}
 
 		for _, arg := range args[1:] {
-			remote, inName := config.ParseRemoteAndContainer(arg)
-			if inName == "" {
-				inName = "default"
+			remote, inName, err := conf.ParseRemote(arg)
+			if err != nil {
+				return err
 			}
 
-			d, err := lxd.NewClient(config, remote)
+			d, err := conf.GetContainerServer(remote)
 			if err != nil {
 				return err
 			}
 
 			image := c.dereferenceAlias(d, inName)
 			progress := ProgressRenderer{Format: i18n.G("Refreshing the image: %s")}
-			refreshed, err := d.RefreshImage(image, progress.Update)
+			op, err := d.RefreshImage(image)
 			if err != nil {
 				return err
 			}
 
+			// Register progress handler
+			_, err = op.AddHandler(progress.UpdateOp)
+
+			// Check if refreshed
+			refreshed := false
+			flag, ok := op.Metadata["refreshed"]
+			if ok {
+				refreshed = flag.(bool)
+			}
+
 			if refreshed {
 				progress.Done(i18n.G("Image refreshed successfully!"))
 			} else {
@@ -470,17 +521,13 @@ func (c *imageCmd) run(conf *config.Config, args []string) error {
 			return err
 		}
 
-		if inName == "" {
-			inName = "default"
-		}
-
-		d, err := lxd.NewClient(conf.Legacy(), remote)
+		d, err := conf.GetImageServer(remote)
 		if err != nil {
 			return err
 		}
 
 		image := c.dereferenceAlias(d, inName)
-		info, err := d.GetImageInfo(image)
+		info, _, err := d.GetImage(image)
 		if err != nil {
 			return err
 		}
@@ -541,7 +588,6 @@ func (c *imageCmd) run(conf *config.Config, args []string) error {
 			return errArgs
 		}
 
-		var fingerprint string
 		var imageFile string
 		var rootfsFile string
 		var properties []string
@@ -577,35 +623,103 @@ func (c *imageCmd) run(conf *config.Config, args []string) error {
 			properties = properties[1:]
 		}
 
-		d, err := lxd.NewClient(conf.Legacy(), remote)
+		d, err := conf.GetContainerServer(remote)
 		if err != nil {
 			return err
 		}
 
-		if strings.HasPrefix(imageFile, "https://") {
-			progress := ProgressRenderer{Format: i18n.G("Importing the image: %s")}
-			fingerprint, err = d.PostImageURL(imageFile, properties, c.publicImage, c.addAliases, progress.Update)
-			if err == nil {
-				progress.Done(fmt.Sprintf(i18n.G("Image imported with fingerprint: %s"), fingerprint))
-			}
-		} else if strings.HasPrefix(imageFile, "http://") {
+		if strings.HasPrefix(imageFile, "http://") {
 			return fmt.Errorf(i18n.G("Only https:// is supported for remote image import."))
+		}
+
+		var args *lxd.ImageCreateArgs
+		image := api.ImagesPost{}
+		image.Public = c.publicImage
+
+		// Handle aliases
+		aliases := []api.ImageAlias{}
+		for _, entry := range c.addAliases {
+			alias := api.ImageAlias{}
+			alias.Name = entry
+			aliases = append(aliases, alias)
+		}
+
+		// Handle properties
+		for _, entry := range properties {
+			fields := strings.SplitN(entry, "=", 2)
+			if len(fields) < 2 {
+				return fmt.Errorf(i18n.G("Bad property: %s"), entry)
+			}
+
+			image.Properties[strings.TrimSpace(fields[0])] = strings.TrimSpace(fields[1])
+		}
+
+		progress := ProgressRenderer{Format: i18n.G("Transferring image: %s")}
+		if strings.HasPrefix(imageFile, "https://") {
+			image.Source = &api.ImagesPostSource{}
+			image.Source.Type = "url"
+			image.Source.Mode = "pull"
+			image.Source.Protocol = "direct"
+			image.Source.URL = imageFile
 		} else {
-			progress := ProgressRenderer{Format: i18n.G("Transferring image: %s")}
-			handler := func(percent int64, speed int64) {
-				progress.Update(fmt.Sprintf("%d%% (%s/s)", percent, shared.GetByteSizeString(speed, 2)))
+			var meta io.ReadCloser
+			var rootfs io.ReadCloser
+
+			// Open meta
+			meta, err = os.Open(imageFile)
+			if err != nil {
+				return err
 			}
+			defer meta.Close()
 
-			fingerprint, err = d.PostImage(imageFile, rootfsFile, properties, c.publicImage, c.addAliases, handler)
-			if err == nil {
-				progress.Done(fmt.Sprintf(i18n.G("Image imported with fingerprint: %s"), fingerprint))
+			// Open rootfs
+			if rootfsFile != "" {
+				rootfs, err = os.Open(rootfsFile)
+				if err != nil {
+					return err
+				}
+				defer rootfs.Close()
 			}
+
+			args = &lxd.ImageCreateArgs{
+				MetaFile:        meta,
+				MetaName:        filepath.Base(imageFile),
+				RootfsFile:      rootfs,
+				RootfsName:      filepath.Base(rootfsFile),
+				ProgressHandler: progress.UpdateProgress,
+			}
+			image.Filename = args.MetaName
+		}
+
+		// Start the transfer
+		op, err := d.CreateImage(image, args)
+		if err != nil {
+			progress.Done("")
+			return err
 		}
 
+		err = op.Wait()
 		if err != nil {
+			progress.Done("")
 			return err
 		}
 
+		// Get the fingerprint
+		fingerprint := op.Metadata["fingerprint"].(string)
+		progress.Done(fmt.Sprintf(i18n.G("Image imported with fingerprint: %s"), fingerprint))
+
+		// Add the aliases
+		for _, entry := range c.addAliases {
+			alias := api.ImageAliasesPost{}
+			alias.Name = entry
+			alias.Target = fingerprint
+
+			err = d.CreateImageAlias(alias)
+			if err != nil {
+				return err
+			}
+		}
+
 		return nil
 
 	case "list":
@@ -643,13 +757,13 @@ func (c *imageCmd) run(conf *config.Config, args []string) error {
 			}
 		}
 
-		d, err := lxd.NewClient(conf.Legacy(), remote)
+		d, err := conf.GetImageServer(remote)
 		if err != nil {
 			return err
 		}
 
 		var images []api.Image
-		allImages, err := d.ListImages()
+		allImages, err := d.GetImages()
 		if err != nil {
 			return err
 		}
@@ -674,11 +788,7 @@ func (c *imageCmd) run(conf *config.Config, args []string) error {
 			return err
 		}
 
-		if inName == "" {
-			inName = "default"
-		}
-
-		d, err := lxd.NewClient(conf.Legacy(), remote)
+		d, err := conf.GetContainerServer(remote)
 		if err != nil {
 			return err
 		}
@@ -700,30 +810,92 @@ func (c *imageCmd) run(conf *config.Config, args []string) error {
 			return err
 		}
 
-		if inName == "" {
-			inName = "default"
-		}
-
-		d, err := lxd.NewClient(conf.Legacy(), remote)
+		d, err := conf.GetImageServer(remote)
 		if err != nil {
 			return err
 		}
 
-		image := c.dereferenceAlias(d, inName)
+		// Resolve aliases
+		fingerprint := c.dereferenceAlias(d, inName)
 
+		// Default target is current directory
 		target := "."
+		targetMeta := fingerprint
 		if len(args) > 2 {
 			target = args[2]
+			if shared.IsDir(args[2]) {
+				targetMeta = filepath.Join(args[2], targetMeta)
+			} else {
+				targetMeta = args[2]
+			}
+		}
+		targetRootfs := targetMeta + ".root"
+
+		// Prepare the files
+		dest, err := os.Create(targetMeta)
+		if err != nil {
+			return err
 		}
+		defer dest.Close()
 
-		outfile, err := d.ExportImage(image, target)
+		destRootfs, err := os.Create(targetRootfs)
 		if err != nil {
 			return err
 		}
+		defer destRootfs.Close()
 
-		if target != "-" {
-			fmt.Printf(i18n.G("Output is in %s")+"\n", outfile)
+		// Prepare the download request
+		progress := ProgressRenderer{Format: i18n.G("Exporting the image: %s")}
+		req := lxd.ImageFileRequest{
+			MetaFile:        io.WriteSeeker(dest),
+			RootfsFile:      io.WriteSeeker(destRootfs),
+			ProgressHandler: progress.UpdateProgress,
 		}
+
+		// Download the image
+		resp, err := d.GetImageFile(fingerprint, req)
+		if err != nil {
+			os.Remove(targetMeta)
+			os.Remove(targetRootfs)
+			progress.Done("")
+			return err
+		}
+
+		// Cleanup
+		if resp.RootfsSize == 0 {
+			err := os.Remove(targetRootfs)
+			if err != nil {
+				os.Remove(targetMeta)
+				os.Remove(targetRootfs)
+				progress.Done("")
+				return err
+			}
+		}
+
+		// Rename files
+		if shared.IsDir(target) {
+			if resp.MetaName != "" {
+				err := os.Rename(targetMeta, filepath.Join(target, resp.MetaName))
+				if err != nil {
+					os.Remove(targetMeta)
+					os.Remove(targetRootfs)
+					progress.Done("")
+					return err
+				}
+			}
+
+			if resp.RootfsSize > 0 && resp.RootfsName != "" {
+				err := os.Rename(targetRootfs, filepath.Join(target, resp.RootfsName))
+				if err != nil {
+					os.Remove(targetMeta)
+					os.Remove(targetRootfs)
+					progress.Done("")
+					return err
+				}
+			}
+		}
+
+		progress.Done(i18n.G("Image exported successfully!"))
 		return nil
 
 	case "show":
@@ -736,17 +908,13 @@ func (c *imageCmd) run(conf *config.Config, args []string) error {
 			return err
 		}
 
-		if inName == "" {
-			inName = "default"
-		}
-
-		d, err := lxd.NewClient(conf.Legacy(), remote)
+		d, err := conf.GetImageServer(remote)
 		if err != nil {
 			return err
 		}
 
 		image := c.dereferenceAlias(d, inName)
-		info, err := d.GetImageInfo(image)
+		info, _, err := d.GetImage(image)
 		if err != nil {
 			return err
 		}
@@ -762,12 +930,17 @@ func (c *imageCmd) run(conf *config.Config, args []string) error {
 	}
 }
 
-func (c *imageCmd) dereferenceAlias(d *lxd.Client, inName string) string {
-	result := d.GetAlias(inName)
-	if result == "" {
+func (c *imageCmd) dereferenceAlias(d lxd.ImageServer, inName string) string {
+	if inName == "" {
+		inName = "default"
+	}
+
+	result, _, _ := d.GetImageAlias(inName)
+	if result == nil {
 		return inName
 	}
-	return result
+
+	return result.Target
 }
 
 func (c *imageCmd) shortestAlias(list []api.ImageAlias) string {
@@ -886,7 +1059,7 @@ func (c *imageCmd) showAliases(aliases []api.ImageAliasesEntry, filters []string
 	return nil
 }
 
-func (c *imageCmd) doImageEdit(client *lxd.Client, image string) error {
+func (c *imageCmd) doImageEdit(client lxd.ContainerServer, image string) error {
 	// If stdin isn't a terminal, read text from it
 	if !termios.IsTerminal(int(syscall.Stdin)) {
 		contents, err := ioutil.ReadAll(os.Stdin)
@@ -899,11 +1072,12 @@ func (c *imageCmd) doImageEdit(client *lxd.Client, image string) error {
 		if err != nil {
 			return err
 		}
-		return client.PutImageInfo(image, newdata)
+
+		return client.UpdateImage(image, newdata, "")
 	}
 
 	// Extract the current value
-	imgInfo, err := client.GetImageInfo(image)
+	imgInfo, etag, err := client.GetImage(image)
 	if err != nil {
 		return err
 	}
@@ -925,7 +1099,7 @@ func (c *imageCmd) doImageEdit(client *lxd.Client, image string) error {
 		newdata := api.ImagePut{}
 		err = yaml.Unmarshal(content, &newdata)
 		if err == nil {
-			err = client.PutImageInfo(image, newdata)
+			err = client.UpdateImage(image, newdata, etag)
 		}
 
 		// Respawn the editor
diff --git a/test/suites/remote.sh b/test/suites/remote.sh
index a88354319..d53ee123e 100644
--- a/test/suites/remote.sh
+++ b/test/suites/remote.sh
@@ -81,10 +81,11 @@ test_remote_usage() {
   lxc_remote remote add lxd2 "${LXD2_ADDR}" --accept-certificate --password foo
 
   # we need a public image on localhost
-  img=$(lxc_remote image export localhost:testimage "${LXD_DIR}/foo" | grep -o "foo.*")
+
+  lxc_remote image export localhost:testimage "${LXD_DIR}/foo"
   lxc_remote image delete localhost:testimage
-  sum=$(sha256sum "${LXD_DIR}/${img}" | cut -d' ' -f1)
-  lxc_remote image import "${LXD_DIR}/${img}" localhost: --public
+  sum=$(sha256sum "${LXD_DIR}/foo" | cut -d' ' -f1)
+  lxc_remote image import "${LXD_DIR}/foo" localhost: --public
   lxc_remote image alias create localhost:testimage "${sum}"
 
   lxc_remote image delete "lxd2:${sum}" || true

From 00c4885476386f41090c018761a9717c917e837b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Fri, 26 May 2017 18:31:31 -0400
Subject: [PATCH 18/28] lxc/publish: Port to new client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxc/publish.go | 112 +++++++++++++++++++++++++++++++++++++++++++++------------
 1 file changed, 89 insertions(+), 23 deletions(-)

diff --git a/lxc/publish.go b/lxc/publish.go
index 04305d025..4254d4e8b 100644
--- a/lxc/publish.go
+++ b/lxc/publish.go
@@ -4,7 +4,7 @@ import (
 	"fmt"
 	"strings"
 
-	"github.com/lxc/lxd"
+	"github.com/lxc/lxd/client"
 	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared/api"
 	"github.com/lxc/lxd/shared/gnuflag"
@@ -74,21 +74,21 @@ func (c *publishCmd) run(conf *config.Config, args []string) error {
 		return fmt.Errorf(i18n.G("There is no \"image name\".  Did you want an alias?"))
 	}
 
-	d, err := lxd.NewClient(conf.Legacy(), iRemote)
+	d, err := conf.GetContainerServer(iRemote)
 	if err != nil {
 		return err
 	}
 
 	s := d
 	if cRemote != iRemote {
-		s, err = lxd.NewClient(conf.Legacy(), cRemote)
+		s, err = conf.GetContainerServer(cRemote)
 		if err != nil {
 			return err
 		}
 	}
 
 	if !shared.IsSnapshot(cName) {
-		ct, err := s.ContainerInfo(cName)
+		ct, etag, err := s.GetContainer(cName)
 		if err != nil {
 			return err
 		}
@@ -103,38 +103,57 @@ func (c *publishCmd) run(conf *config.Config, args []string) error {
 
 			if ct.Ephemeral {
 				ct.Ephemeral = false
-				err := s.UpdateContainerConfig(cName, ct.Writable())
+				op, err := s.UpdateContainer(cName, ct.Writable(), etag)
+				if err != nil {
+					return err
+				}
+
+				err = op.Wait()
+				if err != nil {
+					return err
+				}
+
+				// Refresh the ETag
+				_, etag, err = s.GetContainer(cName)
 				if err != nil {
 					return err
 				}
 			}
 
-			resp, err := s.Action(cName, shared.Stop, -1, true, false)
-			if err != nil {
-				return err
+			req := api.ContainerStatePut{
+				Action:  string(shared.Stop),
+				Timeout: -1,
+				Force:   true,
 			}
 
-			op, err := s.WaitFor(resp.Operation)
+			op, err := s.UpdateContainerState(cName, req, "")
 			if err != nil {
 				return err
 			}
 
-			if op.StatusCode == api.Failure {
+			err = op.Wait()
+			if err != nil {
 				return fmt.Errorf(i18n.G("Stopping container failed!"))
 			}
 
 			defer func() {
-				resp, err := s.Action(cName, shared.Start, -1, true, false)
+				req.Action = string(shared.Start)
+				op, err = s.UpdateContainerState(cName, req, "")
 				if err != nil {
 					return
 				}
 
-				s.WaitFor(resp.Operation)
+				op.Wait()
 			}()
 
 			if wasEphemeral {
 				ct.Ephemeral = true
-				err := s.UpdateContainerConfig(cName, ct.Writable())
+				op, err := s.UpdateContainer(cName, ct.Writable(), etag)
+				if err != nil {
+					return err
+				}
+
+				err = op.Wait()
 				if err != nil {
 					return err
 				}
@@ -160,27 +179,74 @@ func (c *publishCmd) run(conf *config.Config, args []string) error {
 		properties = nil
 	}
 
-	// Optimized local publish
+	// Reformat aliases
+	aliases := []api.ImageAlias{}
+	for _, entry := range c.pAliases {
+		alias := api.ImageAlias{}
+		alias.Name = entry
+		aliases = append(aliases, alias)
+	}
+
+	// Create the image
+	req := api.ImagesPost{
+		Source: &api.ImagesPostSource{
+			Type: "container",
+			Name: cName,
+		},
+		CompressionAlgorithm: c.compression_algorithm,
+	}
+	req.Properties = properties
+
+	if shared.IsSnapshot(cName) {
+		req.Source.Type = "snapshot"
+	}
+
 	if cRemote == iRemote {
-		fp, err = d.ImageFromContainer(cName, c.makePublic, c.pAliases, properties, c.compression_algorithm)
-		if err != nil {
-			return err
-		}
-		fmt.Printf(i18n.G("Container published with fingerprint: %s")+"\n", fp)
-		return nil
+		req.Aliases = aliases
+		req.Public = c.makePublic
 	}
 
-	fp, err = s.ImageFromContainer(cName, false, nil, properties, c.compression_algorithm)
+	op, err := s.CreateImage(req, nil)
 	if err != nil {
 		return err
 	}
-	defer s.DeleteImage(fp)
 
-	err = s.CopyImage(fp, d, false, c.pAliases, c.makePublic, false, nil)
+	err = op.Wait()
 	if err != nil {
 		return err
 	}
 
+	// Grab the fingerprint
+	fingerprint := op.Metadata["fingerprint"].(string)
+
+	// For remote publish, copy to target now
+	if cRemote != iRemote {
+		defer s.DeleteImage(fingerprint)
+
+		// Get the source image
+		image, _, err := s.GetImage(fingerprint)
+		if err != nil {
+			return err
+		}
+
+		// Image copy arguments
+		args := lxd.ImageCopyArgs{
+			Aliases: aliases,
+			Public:  c.makePublic,
+		}
+
+		// Copy the image to the destination host
+		op, err := d.CopyImage(s, *image, &args)
+		if err != nil {
+			return err
+		}
+
+		err = op.Wait()
+		if err != nil {
+			return err
+		}
+	}
+
 	fmt.Printf(i18n.G("Container published with fingerprint: %s")+"\n", fp)
 
 	return nil

From 98ca7a7548c8a23fe9a0e9fd0970cbfc808d411f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Mon, 29 May 2017 23:59:11 -0400
Subject: [PATCH 19/28] lxc/init: Port to new client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxc/init.go   | 170 +++++++++++++++++++++++++++++++++-------------------------
 lxc/launch.go | 122 +++++------------------------------------
 2 files changed, 108 insertions(+), 184 deletions(-)

diff --git a/lxc/init.go b/lxc/init.go
index 17f611eb5..1a7934e3d 100644
--- a/lxc/init.go
+++ b/lxc/init.go
@@ -5,7 +5,7 @@ import (
 	"os"
 	"strings"
 
-	"github.com/lxc/lxd"
+	"github.com/lxc/lxd/client"
 	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared/api"
 	"github.com/lxc/lxd/shared/gnuflag"
@@ -146,13 +146,18 @@ func (c *initCmd) flags() {
 }
 
 func (c *initCmd) run(conf *config.Config, args []string) error {
+	_, _, err := c.create(conf, args)
+	return err
+}
+
+func (c *initCmd) create(conf *config.Config, args []string) (lxd.ContainerServer, string, error) {
 	if len(args) > 2 || len(args) < 1 {
-		return errArgs
+		return nil, "", errArgs
 	}
 
 	iremote, image, err := conf.ParseRemote(args[0])
 	if err != nil {
-		return err
+		return nil, "", err
 	}
 
 	var name string
@@ -160,22 +165,20 @@ func (c *initCmd) run(conf *config.Config, args []string) error {
 	if len(args) == 2 {
 		remote, name, err = conf.ParseRemote(args[1])
 		if err != nil {
-			return err
+			return nil, "", err
 		}
 	} else {
 		remote, name, err = conf.ParseRemote("")
 		if err != nil {
-			return err
+			return nil, "", err
 		}
 	}
 
-	d, err := lxd.NewClient(conf.Legacy(), remote)
+	d, err := conf.GetContainerServer(remote)
 	if err != nil {
-		return err
+		return nil, "", err
 	}
 
-	// TODO: implement the syntax for supporting other image types/remotes
-
 	/*
 	 * initRequestedEmptyProfiles means user requested empty
 	 * !initRequestedEmptyProfiles but len(profArgs) == 0 means use profile default
@@ -185,20 +188,17 @@ func (c *initCmd) run(conf *config.Config, args []string) error {
 		profiles = append(profiles, p)
 	}
 
-	var resp *api.Response
 	if name == "" {
 		fmt.Printf(i18n.G("Creating the container") + "\n")
 	} else {
 		fmt.Printf(i18n.G("Creating %s")+"\n", name)
 	}
 
-	iremote, image = c.guessImage(conf, d, remote, iremote, image)
-
 	devicesMap := map[string]map[string]string{}
 	if c.network != "" {
-		network, err := d.NetworkGet(c.network)
+		network, _, err := d.GetNetwork(c.network)
 		if err != nil {
-			return err
+			return nil, "", err
 		}
 
 		if network.Type == "bridge" {
@@ -210,10 +210,11 @@ func (c *initCmd) run(conf *config.Config, args []string) error {
 
 	// Check if the specified storage pool exists.
 	if c.storagePool != "" {
-		_, err := d.StoragePoolGet(c.storagePool)
+		_, _, err := d.GetStoragePool(c.storagePool)
 		if err != nil {
-			return err
+			return nil, "", err
 		}
+
 		devicesMap["root"] = map[string]string{
 			"type": "disk",
 			"path": "/",
@@ -221,32 +222,90 @@ func (c *initCmd) run(conf *config.Config, args []string) error {
 		}
 	}
 
+	// Get the image server and image info
+	iremote, image = c.guessImage(conf, d, remote, iremote, image)
+	var imgRemote lxd.ImageServer
+	var imgInfo *api.Image
+
+	// Connect to the image server
+	if iremote == remote {
+		imgRemote = d
+	} else {
+		imgRemote, err = conf.GetImageServer(iremote)
+		if err != nil {
+			return nil, "", err
+		}
+	}
+
+	// Deal with the default image
+	if image == "" {
+		image = "default"
+	}
+
+	// Setup container creation request
+	req := api.ContainersPost{
+		Name: name,
+	}
+	req.Config = configMap
+	req.Devices = devicesMap
 	if !initRequestedEmptyProfiles && len(profiles) == 0 {
-		resp, err = d.Init(name, iremote, image, nil, configMap, devicesMap, c.ephem)
+		req.Profiles = nil
 	} else {
-		resp, err = d.Init(name, iremote, image, &profiles, configMap, devicesMap, c.ephem)
+		req.Profiles = profiles
 	}
-	if err != nil {
-		return err
+	req.Ephemeral = c.ephem
+
+	// Optimisation for simplestreams
+	if conf.Remotes[iremote].Protocol == "simplestreams" {
+		imgInfo = &api.Image{}
+		imgInfo.Fingerprint = image
+		imgInfo.Public = true
+		req.Source.Alias = image
+	} else {
+		// Attempt to resolve an image alias
+		alias, _, err := imgRemote.GetImageAlias(image)
+		if err == nil {
+			req.Source.Alias = image
+			image = alias.Target
+		}
+
+		// Get the image info
+		imgInfo, _, err = imgRemote.GetImage(image)
+		if err != nil {
+			return nil, "", err
+		}
 	}
 
-	progress := ProgressRenderer{}
-	c.initProgressTracker(d, &progress, resp.Operation)
+	// Create the container
+	op, err := d.CreateContainerFromImage(imgRemote, *imgInfo, req)
+	if err != nil {
+		return nil, "", err
+	}
 
-	err = d.WaitForSuccess(resp.Operation)
-	progress.Done("")
+	// Watch the background operation
+	progress := ProgressRenderer{Format: i18n.G("Retrieving image: %s")}
+	_, err = op.AddHandler(progress.UpdateOp)
+	if err != nil {
+		progress.Done("")
+		return nil, "", err
+	}
 
+	err = op.Wait()
 	if err != nil {
-		return err
+		progress.Done("")
+		return nil, "", err
 	}
-	op, err := resp.MetadataAsOperation()
+	progress.Done("")
+
+	// Extract the container name
+	opInfo, err := op.GetTarget()
 	if err != nil {
-		return fmt.Errorf(i18n.G("didn't get any affected image, container or snapshot from server"))
+		return nil, "", err
 	}
 
-	containers, ok := op.Resources["containers"]
+	containers, ok := opInfo.Resources["containers"]
 	if !ok || len(containers) == 0 {
-		return fmt.Errorf(i18n.G("didn't get any affected image, container or snapshot from server"))
+		return nil, "", fmt.Errorf(i18n.G("didn't get any affected image, container or snapshot from server"))
 	}
 
 	if len(containers) == 1 && name == "" {
@@ -254,50 +313,13 @@ func (c *initCmd) run(conf *config.Config, args []string) error {
 		fmt.Printf(i18n.G("Container name is: %s")+"\n", fields[len(fields)-1])
 	}
 
+	// Validate the network setup
 	c.checkNetwork(d, name)
 
-	return nil
+	return d, name, nil
 }
 
-func (c *initCmd) initProgressTracker(d *lxd.Client, progress *ProgressRenderer, operation string) {
-	progress.Format = i18n.G("Retrieving image: %s")
-	handler := func(msg interface{}) {
-		if msg == nil {
-			return
-		}
-
-		event := msg.(map[string]interface{})
-		if event["type"].(string) != "operation" {
-			return
-		}
-
-		if event["metadata"] == nil {
-			return
-		}
-
-		md := event["metadata"].(map[string]interface{})
-		if !strings.HasSuffix(operation, md["id"].(string)) {
-			return
-		}
-
-		if md["metadata"] == nil {
-			return
-		}
-
-		if api.StatusCode(md["status_code"].(float64)).IsFinal() {
-			return
-		}
-
-		opMd := md["metadata"].(map[string]interface{})
-		_, ok := opMd["download_progress"]
-		if ok {
-			progress.Update(opMd["download_progress"].(string))
-		}
-	}
-	go d.Monitor([]string{"operation"}, handler, nil)
-}
-
-func (c *initCmd) guessImage(conf *config.Config, d *lxd.Client, remote string, iremote string, image string) (string, string) {
+func (c *initCmd) guessImage(conf *config.Config, d lxd.ContainerServer, remote string, iremote string, image string) (string, string) {
 	if remote != iremote {
 		return iremote, image
 	}
@@ -307,12 +329,12 @@ func (c *initCmd) guessImage(conf *config.Config, d *lxd.Client, remote string,
 		return iremote, image
 	}
 
-	target := d.GetAlias(image)
-	if target != "" {
+	_, _, err := d.GetImageAlias(image)
+	if err == nil {
 		return iremote, image
 	}
 
-	_, err := d.GetImageInfo(image)
+	_, _, err = d.GetImage(image)
 	if err == nil {
 		return iremote, image
 	}
@@ -321,8 +343,8 @@ func (c *initCmd) guessImage(conf *config.Config, d *lxd.Client, remote string,
 	return image, "default"
 }
 
-func (c *initCmd) checkNetwork(d *lxd.Client, name string) {
-	ct, err := d.ContainerInfo(name)
+func (c *initCmd) checkNetwork(d lxd.ContainerServer, name string) {
+	ct, _, err := d.GetContainer(name)
 	if err != nil {
 		return
 	}
diff --git a/lxc/launch.go b/lxc/launch.go
index 424d85834..98bf46ff1 100644
--- a/lxc/launch.go
+++ b/lxc/launch.go
@@ -2,14 +2,10 @@ package main
 
 import (
 	"fmt"
-	"strings"
 
-	"github.com/lxc/lxd"
 	"github.com/lxc/lxd/lxc/config"
-	"github.com/lxc/lxd/shared"
 	"github.com/lxc/lxd/shared/api"
 	"github.com/lxc/lxd/shared/i18n"
-	"github.com/lxc/lxd/shared/version"
 )
 
 type launchCmd struct {
@@ -39,133 +35,39 @@ func (c *launchCmd) flags() {
 }
 
 func (c *launchCmd) run(conf *config.Config, args []string) error {
-	if len(args) > 2 || len(args) < 1 {
-		return errArgs
-	}
-
-	iremote, image, err := conf.ParseRemote(args[0])
+	// Call the matching code from init
+	d, name, err := c.init.create(conf, args)
 	if err != nil {
 		return err
 	}
 
-	var name string
+	// Get the remote
 	var remote string
 	if len(args) == 2 {
-		remote, name, err = conf.ParseRemote(args[1])
+		remote, _, err = conf.ParseRemote(args[1])
 		if err != nil {
 			return err
 		}
 	} else {
-		remote, name, err = conf.ParseRemote("")
-		if err != nil {
-			return err
-		}
-	}
-
-	d, err := lxd.NewClient(conf.Legacy(), remote)
-	if err != nil {
-		return err
-	}
-
-	/*
-	 * initRequestedEmptyProfiles means user requested empty
-	 * !initRequestedEmptyProfiles but len(profArgs) == 0 means use profile default
-	 */
-	var resp *api.Response
-	profiles := []string{}
-	for _, p := range c.init.profArgs {
-		profiles = append(profiles, p)
-	}
-
-	iremote, image = c.init.guessImage(conf, d, remote, iremote, image)
-
-	devicesMap := map[string]map[string]string{}
-	if c.init.network != "" {
-		network, err := d.NetworkGet(c.init.network)
-		if err != nil {
-			return err
-		}
-
-		if network.Type == "bridge" {
-			devicesMap[c.init.network] = map[string]string{"type": "nic", "nictype": "bridged", "parent": c.init.network}
-		} else {
-			devicesMap[c.init.network] = map[string]string{"type": "nic", "nictype": "macvlan", "parent": c.init.network}
-		}
-	}
-
-	// Check if the specified storage pool exists.
-	if c.init.storagePool != "" {
-		_, err := d.StoragePoolGet(c.init.storagePool)
+		remote, _, err = conf.ParseRemote("")
 		if err != nil {
 			return err
 		}
-		devicesMap["root"] = map[string]string{
-			"type": "disk",
-			"path": "/",
-			"pool": c.init.storagePool,
-		}
 	}
 
-	if !initRequestedEmptyProfiles && len(profiles) == 0 {
-		resp, err = d.Init(name, iremote, image, nil, configMap, devicesMap, c.init.ephem)
-	} else {
-		resp, err = d.Init(name, iremote, image, &profiles, configMap, devicesMap, c.init.ephem)
-	}
-	if err != nil {
-		return err
-	}
-
-	progress := ProgressRenderer{}
-	c.init.initProgressTracker(d, &progress, resp.Operation)
-
-	if name == "" {
-		op, err := resp.MetadataAsOperation()
-		if err != nil {
-			progress.Done("")
-			return fmt.Errorf(i18n.G("didn't get any affected image, container or snapshot from server"))
-		}
-
-		containers, ok := op.Resources["containers"]
-		if !ok || len(containers) == 0 {
-			progress.Done("")
-			return fmt.Errorf(i18n.G("didn't get any affected image, container or snapshot from server"))
-		}
-
-		var restVersion string
-		toScan := strings.Replace(containers[0], "/", " ", -1)
-		count, err := fmt.Sscanf(toScan, " %s containers %s", &restVersion, &name)
-		if err != nil {
-			progress.Done("")
-			return err
-		}
-
-		if count != 2 {
-			progress.Done("")
-			return fmt.Errorf(i18n.G("bad number of things scanned from image, container or snapshot"))
-		}
-
-		if restVersion != version.APIVersion {
-			progress.Done("")
-			return fmt.Errorf(i18n.G("got bad version"))
-		}
-	}
-	fmt.Printf(i18n.G("Creating %s")+"\n", name)
-
-	if err = d.WaitForSuccess(resp.Operation); err != nil {
-		progress.Done("")
-		return err
+	// Start the container
+	fmt.Printf(i18n.G("Starting %s")+"\n", name)
+	req := api.ContainerStatePut{
+		Action:  "start",
+		Timeout: -1,
 	}
-	progress.Done("")
 
-	c.init.checkNetwork(d, name)
-
-	fmt.Printf(i18n.G("Starting %s")+"\n", name)
-	resp, err = d.Action(name, shared.Start, -1, false, false)
+	op, err := d.UpdateContainerState(name, req, "")
 	if err != nil {
 		return err
 	}
 
-	err = d.WaitForSuccess(resp.Operation)
+	err = op.Wait()
 	if err != nil {
 		prettyName := name
 		if remote != "" {

From 7d12d28ec2f8a4ebbd0892c56c553e42c7eda37c Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Thu, 1 Jun 2017 16:37:20 -0400
Subject: [PATCH 20/28] lxc/move: Port to new client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxc/move.go | 28 ++++++++++++++++++++++------
 1 file changed, 22 insertions(+), 6 deletions(-)

diff --git a/lxc/move.go b/lxc/move.go
index 27440fffd..9fcb3d229 100644
--- a/lxc/move.go
+++ b/lxc/move.go
@@ -1,11 +1,13 @@
 package main
 
 import (
-	"github.com/lxc/lxd"
-	"github.com/lxc/lxd/lxc/config"
-	"github.com/lxc/lxd/shared/i18n"
+	"strings"
 
+	"github.com/lxc/lxd/lxc/config"
+	"github.com/lxc/lxd/shared"
+	"github.com/lxc/lxd/shared/api"
 	"github.com/lxc/lxd/shared/gnuflag"
+	"github.com/lxc/lxd/shared/i18n"
 )
 
 type moveCmd struct {
@@ -57,17 +59,31 @@ func (c *moveCmd) run(conf *config.Config, args []string) error {
 	// course, this changing of hostname isn't supported right now, so this
 	// simply won't work).
 	if sourceRemote == destRemote {
-		source, err := lxd.NewClient(conf.Legacy(), sourceRemote)
+		source, err := conf.GetContainerServer(sourceRemote)
 		if err != nil {
 			return err
 		}
 
-		rename, err := source.Rename(sourceName, destName)
+		if shared.IsSnapshot(sourceName) {
+			// Snapshot rename
+			srcFields := strings.SplitN(sourceName, shared.SnapshotDelimiter, 2)
+			dstFields := strings.SplitN(destName, shared.SnapshotDelimiter, 2)
+
+			op, err := source.RenameContainerSnapshot(srcFields[0], srcFields[1], api.ContainerSnapshotPost{Name: dstFields[1]})
+			if err != nil {
+				return err
+			}
+
+			return op.Wait()
+		}
+
+		// Container rename
+		op, err := source.RenameContainer(sourceName, api.ContainerPost{Name: destName})
 		if err != nil {
 			return err
 		}
 
-		return source.WaitForSuccess(rename.Operation)
+		return op.Wait()
 	}
 
 	cpy := copyCmd{}

From 427ec1b166dd52c9ea3289726c5b8dcfa80b715d Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Thu, 15 Jun 2017 17:58:06 -0400
Subject: [PATCH 21/28] lxc/copy: Port to new client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxc/copy.go | 287 +++++++++++++++++++++++-------------------------------------
 1 file changed, 108 insertions(+), 179 deletions(-)

diff --git a/lxc/copy.go b/lxc/copy.go
index 80cc266d9..0ecdff7fd 100644
--- a/lxc/copy.go
+++ b/lxc/copy.go
@@ -4,10 +4,9 @@ import (
 	"fmt"
 	"strings"
 
-	"github.com/lxc/lxd"
+	"github.com/lxc/lxd/client"
 	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared"
-	"github.com/lxc/lxd/shared/api"
 	"github.com/lxc/lxd/shared/gnuflag"
 	"github.com/lxc/lxd/shared/i18n"
 )
@@ -41,266 +40,196 @@ func (c *copyCmd) flags() {
 }
 
 func (c *copyCmd) copyContainer(conf *config.Config, sourceResource string, destResource string, keepVolatile bool, ephemeral int, stateful bool, containerOnly bool) error {
+	// Parse the source
 	sourceRemote, sourceName, err := conf.ParseRemote(sourceResource)
 	if err != nil {
 		return err
 	}
 
+	// Parse the destination
 	destRemote, destName, err := conf.ParseRemote(destResource)
 	if err != nil {
 		return err
 	}
 
+	// Make sure we have a container or snapshot name
 	if sourceName == "" {
-		return fmt.Errorf(i18n.G("you must specify a source container name"))
+		return fmt.Errorf(i18n.G("You must specify a source container name"))
 	}
 
+	// If no destination name was provided, use the same as the source
 	if destName == "" && destResource != "" {
 		destName = sourceName
 	}
 
-	source, err := lxd.NewClient(conf.Legacy(), sourceRemote)
+	// Connect to the source host
+	source, err := conf.GetContainerServer(sourceRemote)
 	if err != nil {
 		return err
 	}
 
-	var status struct {
-		Architecture string
-		Devices      map[string]map[string]string
-		Config       map[string]string
-		Profiles     []string
-	}
-
-	// TODO: presumably we want to do this for copying snapshots too? We
-	// need to think a bit more about how we track the baseImage in the
-	// face of LVM and snapshots in general; this will probably make more
-	// sense once that work is done.
-	baseImage := ""
-
-	if !shared.IsSnapshot(sourceName) {
-		result, err := source.ContainerInfo(sourceName)
+	// Connect to the destination host
+	var dest lxd.ContainerServer
+	if sourceRemote == destRemote {
+		// Source and destination are the same
+		dest = source
+	} else {
+		// Destination is different, connect to it
+		dest, err = conf.GetContainerServer(destRemote)
 		if err != nil {
 			return err
 		}
+	}
 
-		status.Architecture = result.Architecture
-		status.Devices = result.Devices
-		status.Config = result.Config
-		status.Profiles = result.Profiles
+	var op *lxd.RemoteOperation
+	if shared.IsSnapshot(sourceName) {
+		// Prepare the container creation request
+		args := lxd.ContainerSnapshotCopyArgs{
+			Name: destName,
+		}
 
-	} else {
-		result, err := source.SnapshotInfo(sourceName)
+		// Copy of a snapshot into a new container
+		srcFields := strings.SplitN(sourceName, shared.SnapshotDelimiter, 2)
+		entry, _, err := source.GetContainerSnapshot(srcFields[0], srcFields[1])
 		if err != nil {
 			return err
 		}
 
-		status.Architecture = result.Architecture
-		status.Devices = result.Devices
-		status.Config = result.Config
-		status.Profiles = result.Profiles
-	}
+		// Allow adding additional profiles
+		if c.profArgs != nil {
+			entry.Profiles = append(entry.Profiles, c.profArgs...)
+		}
 
-	if c.profArgs != nil {
-		status.Profiles = append(status.Profiles, c.profArgs...)
-	}
+		// Allow setting additional config keys
+		if configMap != nil {
+			for key, value := range configMap {
+				entry.Config[key] = value
+			}
+		}
 
-	if configMap != nil {
-		for key, value := range configMap {
-			status.Config[key] = value
+		// Allow overriding the ephemeral status
+		if ephemeral == 1 {
+			entry.Ephemeral = true
+		} else if ephemeral == 0 {
+			entry.Ephemeral = false
 		}
-	}
 
-	baseImage = status.Config["volatile.base_image"]
+		// Strip the volatile keys if requested
+		if !keepVolatile {
+			for k := range entry.Config {
+				if k == "volatile.base_image" {
+					continue
+				}
 
-	if !keepVolatile {
-		for k := range status.Config {
-			if strings.HasPrefix(k, "volatile") {
-				delete(status.Config, k)
+				if strings.HasPrefix(k, "volatile") {
+					delete(entry.Config, k)
+				}
 			}
 		}
-	}
-
-	// Do a local copy if the remotes are the same, otherwise do a migration
-	if sourceRemote == destRemote {
-		if sourceName == destName {
-			return fmt.Errorf(i18n.G("can't copy to the same container name"))
-		}
 
-		cp, err := source.LocalCopy(sourceName, destName, status.Config, status.Profiles, ephemeral == 1, containerOnly)
+		// Do the actual copy
+		op, err = dest.CopyContainerSnapshot(source, *entry, &args)
 		if err != nil {
 			return err
 		}
+	} else {
+		// Prepare the container creation request
+		args := lxd.ContainerCopyArgs{
+			Name:          destName,
+			Live:          stateful,
+			ContainerOnly: containerOnly,
+		}
 
-		err = source.WaitForSuccess(cp.Operation)
+		// Copy of a container into a new container
+		entry, _, err := source.GetContainer(sourceName)
 		if err != nil {
 			return err
 		}
 
-		if destResource == "" {
-			op, err := cp.MetadataAsOperation()
-			if err != nil {
-				return fmt.Errorf(i18n.G("didn't get any affected image, container or snapshot from server"))
-			}
+		// Allow adding additional profiles
+		if c.profArgs != nil {
+			entry.Profiles = append(entry.Profiles, c.profArgs...)
+		}
 
-			containers, ok := op.Resources["containers"]
-			if !ok || len(containers) == 0 {
-				return fmt.Errorf(i18n.G("didn't get any affected image, container or snapshot from server"))
+		// Allow setting additional config keys
+		if configMap != nil {
+			for key, value := range configMap {
+				entry.Config[key] = value
 			}
-
-			fields := strings.Split(containers[0], "/")
-			fmt.Printf(i18n.G("Container name is: %s")+"\n", fields[len(fields)-1])
 		}
 
-		return nil
-	}
-
-	dest, err := lxd.NewClient(conf.Legacy(), destRemote)
-	if err != nil {
-		return err
-	}
-
-	sourceProfs := shared.NewStringSet(status.Profiles)
-	destProfs := []string{}
-
-	profiles, err := dest.ListProfiles()
-	if err != nil {
-		return err
-	}
+		// Allow overriding the ephemeral status
+		if ephemeral == 1 {
+			entry.Ephemeral = true
+		} else if ephemeral == 0 {
+			entry.Ephemeral = false
+		}
 
-	for _, profile := range profiles {
-		destProfs = append(destProfs, profile.Name)
-	}
+		// Strip the volatile keys if requested
+		if !keepVolatile {
+			for k := range entry.Config {
+				if k == "volatile.base_image" {
+					continue
+				}
 
-	if !sourceProfs.IsSubset(shared.NewStringSet(destProfs)) {
-		return fmt.Errorf(i18n.G("not all the profiles from the source exist on the target"))
-	}
+				if strings.HasPrefix(k, "volatile") {
+					delete(entry.Config, k)
+				}
+			}
+		}
 
-	if ephemeral == -1 {
-		ct, err := source.ContainerInfo(sourceName)
+		// Do the actual copy
+		op, err = dest.CopyContainer(source, *entry, &args)
 		if err != nil {
 			return err
 		}
-
-		if ct.Ephemeral {
-			ephemeral = 1
-		} else {
-			ephemeral = 0
-		}
 	}
 
-	sourceWSResponse, err := source.GetMigrationSourceWS(sourceName, stateful, containerOnly)
+	// Wait for the copy to complete
+	err = op.Wait()
 	if err != nil {
 		return err
 	}
 
-	secrets := map[string]string{}
-
-	op, err := sourceWSResponse.MetadataAsOperation()
-	if err != nil {
-		return err
-	}
-
-	for k, v := range op.Metadata {
-		secrets[k] = v.(string)
-	}
-
-	addresses, err := source.Addresses()
-	if err != nil {
-		return err
-	}
-
-	/* Since we're trying a bunch of different network ports that
-	 * may be invalid, we can get "bad handshake" errors when the
-	 * websocket code tries to connect. If the first error is a
-	 * real error, but the subsequent errors are only network
-	 * errors, we should try to report the first real error. Of
-	 * course, if all the errors are websocket errors, let's just
-	 * report that.
-	 */
-	waitchan := make(chan map[int]error, 2)
-	wait := func(cli *lxd.Client, op string, ch chan map[int]error, senderid int) {
-		ch <- map[int]error{senderid: cli.WaitForSuccess(op)}
-	}
-
-	var migrationErrFromClient error
-	for _, addr := range addresses {
-		var migration *api.Response
-
-		sourceWSUrl := "https://" + addr + sourceWSResponse.Operation
-		migration, migrationErrFromClient = dest.MigrateFrom(destName, sourceWSUrl, source.Certificate, secrets, status.Architecture, status.Config, status.Devices, status.Profiles, baseImage, ephemeral == 1, false, source, sourceWSResponse.Operation, containerOnly)
-		if migrationErrFromClient != nil {
-			continue
-		}
-
-		// If push mode is implemented then MigrateFrom will return a
-		// non-waitable operation. So this needs to be conditionalized
-		// on pull mode.
-		destOpId := 0
-		go wait(dest, migration.Operation, waitchan, destOpId)
-		sourceOpId := 1
-		go wait(source, sourceWSResponse.Operation, waitchan, sourceOpId)
-
-		var sourceOpErr error
-		var destOpErr error
-		for i := 0; i < cap(waitchan); i++ {
-			tmp := <-waitchan
-			err, ok := tmp[sourceOpId]
-			if ok {
-				sourceOpErr = err
-			} else {
-				destOpErr = err
-			}
-		}
-
-		if destOpErr != nil {
-			continue
-		}
-
-		if sourceOpErr != nil {
-			return sourceOpErr
+	// If choosing a random name, show it to the user
+	if destResource == "" {
+		// Get the succesful operation data
+		opInfo, err := op.GetTarget()
+		if err != nil {
+			return err
 		}
 
-		if destResource == "" {
-			op, err := migration.MetadataAsOperation()
-			if err != nil {
-				return fmt.Errorf(i18n.G("didn't get any affected image, container or snapshot from server"))
-			}
-
-			containers, ok := op.Resources["containers"]
-			if !ok || len(containers) == 0 {
-				return fmt.Errorf(i18n.G("didn't get any affected image, container or snapshot from server"))
-			}
-
-			fields := strings.Split(containers[0], "/")
-			fmt.Printf(i18n.G("Container name is: %s")+"\n", fields[len(fields)-1])
+		// Extract the list of affected containers
+		containers, ok := opInfo.Resources["containers"]
+		if !ok || len(containers) != 1 {
+			return fmt.Errorf(i18n.G("Failed to get the new container name"))
 		}
 
-		return nil
-	}
-
-	// Check for an error at the source
-	sourceOp, sourceErr := source.GetOperation(sourceWSResponse.Operation)
-	if sourceErr == nil && sourceOp.Err != "" {
-		return fmt.Errorf(i18n.G("Migration failed on source host: %s"), sourceOp.Err)
+		// Extract the name of the container
+		fields := strings.Split(containers[0], "/")
+		fmt.Printf(i18n.G("Container name is: %s")+"\n", fields[len(fields)-1])
 	}
 
-	// Return the error from destination
-	return fmt.Errorf(i18n.G("Migration failed on target host: %s"), migrationErrFromClient)
+	return nil
 }
 
 func (c *copyCmd) run(conf *config.Config, args []string) error {
+	// We at least need a source container name
 	if len(args) < 1 {
 		return errArgs
 	}
 
+	// For copies, default to non-ephemeral and allow override (move uses -1)
 	ephem := 0
 	if c.ephem {
 		ephem = 1
 	}
 
+	// If not target name is specified, one will be chosed by the server
 	if len(args) < 2 {
 		return c.copyContainer(conf, args[0], "", false, ephem, false, c.containerOnly)
 	}
 
+	// Normal copy with a pre-determined name
 	return c.copyContainer(conf, args[0], args[1], false, ephem, false, c.containerOnly)
 }

From 528157f2a763183843f18ef336e9d472598856e7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Fri, 16 Jun 2017 17:32:46 -0400
Subject: [PATCH 22/28] lxc/config: Port to new client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxc/config.go | 369 ++++++++++++++++++++++++++++++++++++++--------------------
 1 file changed, 243 insertions(+), 126 deletions(-)

diff --git a/lxc/config.go b/lxc/config.go
index ad2e62f71..f9b26642c 100644
--- a/lxc/config.go
+++ b/lxc/config.go
@@ -2,6 +2,7 @@ package main
 
 import (
 	"crypto/x509"
+	"encoding/base64"
 	"encoding/pem"
 	"fmt"
 	"io/ioutil"
@@ -13,7 +14,7 @@ import (
 	"github.com/olekukonko/tablewriter"
 	"gopkg.in/yaml.v2"
 
-	"github.com/lxc/lxd"
+	"github.com/lxc/lxd/client"
 	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared"
 	"github.com/lxc/lxd/shared/api"
@@ -136,12 +137,12 @@ func (c *configCmd) doSet(conf *config.Config, args []string, unset bool) error
 	}
 
 	// [[lxc config]] set dakara:c1 limits.memory 200000
-	remote, container, err := conf.ParseRemote(args[1])
+	remote, name, err := conf.ParseRemote(args[1])
 	if err != nil {
 		return err
 	}
 
-	d, err := lxd.NewClient(conf.Legacy(), remote)
+	d, err := conf.GetContainerServer(remote)
 	if err != nil {
 		return err
 	}
@@ -157,19 +158,28 @@ func (c *configCmd) doSet(conf *config.Config, args []string, unset bool) error
 		value = string(buf[:])
 	}
 
-	if unset {
-		st, err := d.ContainerInfo(container)
-		if err != nil {
-			return err
-		}
+	container, etag, err := d.GetContainer(name)
+	if err != nil {
+		return err
+	}
 
-		_, ok := st.Config[key]
+	if unset {
+		_, ok := container.Config[key]
 		if !ok {
-			return fmt.Errorf(i18n.G("Can't unset key '%s', it's not currently set."), key)
+			return fmt.Errorf(i18n.G("Can't unset key '%s', it's not currently set"), key)
 		}
+
+		delete(container.Config, key)
+	} else {
+		container.Config[key] = value
+	}
+
+	op, err := d.UpdateContainer(name, container.Writable(), etag)
+	if err != nil {
+		return err
 	}
 
-	return d.SetContainerConfig(container, key, value)
+	return op.Wait()
 }
 
 func (c *configCmd) run(conf *config.Config, args []string) error {
@@ -186,23 +196,23 @@ func (c *configCmd) run(conf *config.Config, args []string) error {
 
 		// Deal with local server
 		if len(args) == 2 {
-			c, err := lxd.NewClient(conf.Legacy(), conf.DefaultRemote)
+			c, err := conf.GetContainerServer(conf.DefaultRemote)
 			if err != nil {
 				return err
 			}
 
-			ss, err := c.ServerStatus()
+			server, etag, err := c.GetServer()
 			if err != nil {
 				return err
 			}
 
-			_, ok := ss.Config[args[1]]
+			_, ok := server.Config[args[1]]
 			if !ok {
 				return fmt.Errorf(i18n.G("Can't unset key '%s', it's not currently set."), args[1])
 			}
 
-			_, err = c.SetServerConfig(args[1], "")
-			return err
+			delete(server.Config, args[1])
+			return c.UpdateServer(server.Writable(), etag)
 		}
 
 		// Deal with remote server
@@ -212,23 +222,23 @@ func (c *configCmd) run(conf *config.Config, args []string) error {
 		}
 
 		if container == "" {
-			c, err := lxd.NewClient(conf.Legacy(), remote)
+			c, err := conf.GetContainerServer(remote)
 			if err != nil {
 				return err
 			}
 
-			ss, err := c.ServerStatus()
+			server, etag, err := c.GetServer()
 			if err != nil {
 				return err
 			}
 
-			_, ok := ss.Config[args[1]]
+			_, ok := server.Config[args[2]]
 			if !ok {
 				return fmt.Errorf(i18n.G("Can't unset key '%s', it's not currently set."), args[1])
 			}
 
-			_, err = c.SetServerConfig(args[2], "")
-			return err
+			delete(server.Config, args[2])
+			return c.UpdateServer(server.Writable(), etag)
 		}
 
 		// Deal with container
@@ -242,13 +252,19 @@ func (c *configCmd) run(conf *config.Config, args []string) error {
 
 		// Deal with local server
 		if len(args) == 3 {
-			c, err := lxd.NewClient(conf.Legacy(), conf.DefaultRemote)
+			c, err := conf.GetContainerServer(conf.DefaultRemote)
 			if err != nil {
 				return err
 			}
 
-			_, err = c.SetServerConfig(args[1], args[2])
-			return err
+			server, etag, err := c.GetServer()
+			if err != nil {
+				return err
+			}
+
+			server.Config[args[1]] = args[2]
+
+			return c.UpdateServer(server.Writable(), etag)
 		}
 
 		// Deal with remote server
@@ -258,13 +274,19 @@ func (c *configCmd) run(conf *config.Config, args []string) error {
 		}
 
 		if container == "" {
-			c, err := lxd.NewClient(conf.Legacy(), remote)
+			c, err := conf.GetContainerServer(remote)
 			if err != nil {
 				return err
 			}
 
-			_, err = c.SetServerConfig(args[2], args[3])
-			return err
+			server, etag, err := c.GetServer()
+			if err != nil {
+				return err
+			}
+
+			server.Config[args[2]] = args[3]
+
+			return c.UpdateServer(server.Writable(), etag)
 		}
 
 		// Deal with container
@@ -288,12 +310,12 @@ func (c *configCmd) run(conf *config.Config, args []string) error {
 				remote = conf.DefaultRemote
 			}
 
-			d, err := lxd.NewClient(conf.Legacy(), remote)
+			d, err := conf.GetContainerServer(remote)
 			if err != nil {
 				return err
 			}
 
-			trust, err := d.CertificateList()
+			trust, err := d.GetCertificates()
 			if err != nil {
 				return err
 			}
@@ -346,19 +368,24 @@ func (c *configCmd) run(conf *config.Config, args []string) error {
 				remote = conf.DefaultRemote
 			}
 
-			d, err := lxd.NewClient(conf.Legacy(), remote)
+			d, err := conf.GetContainerServer(remote)
 			if err != nil {
 				return err
 			}
 
 			fname := args[len(args)-1]
-			cert, err := shared.ReadCert(fname)
+			x509Cert, err := shared.ReadCert(fname)
 			if err != nil {
 				return err
 			}
-
 			name, _ := shared.SplitExt(fname)
-			return d.CertificateAdd(cert, name)
+
+			cert := api.CertificatesPost{}
+			cert.Certificate = base64.StdEncoding.EncodeToString(x509Cert.Raw)
+			cert.Name = name
+			cert.Type = "client"
+
+			return d.CreateCertificate(cert)
 		case "remove":
 			var remote string
 			if len(args) < 3 {
@@ -373,12 +400,12 @@ func (c *configCmd) run(conf *config.Config, args []string) error {
 				remote = conf.DefaultRemote
 			}
 
-			d, err := lxd.NewClient(conf.Legacy(), remote)
+			d, err := conf.GetContainerServer(remote)
 			if err != nil {
 				return err
 			}
 
-			return d.CertificateRemove(args[len(args)-1])
+			return d.DeleteCertificate(args[len(args)-1])
 		default:
 			return errArgs
 		}
@@ -394,7 +421,7 @@ func (c *configCmd) run(conf *config.Config, args []string) error {
 			}
 		}
 
-		d, err := lxd.NewClient(conf.Legacy(), remote)
+		d, err := conf.GetContainerServer(remote)
 		if err != nil {
 			return err
 		}
@@ -402,7 +429,7 @@ func (c *configCmd) run(conf *config.Config, args []string) error {
 		var data []byte
 
 		if len(args) == 1 || container == "" {
-			server, err := d.ServerStatus()
+			server, _, err := d.GetServer()
 			if err != nil {
 				return err
 			}
@@ -415,7 +442,9 @@ func (c *configCmd) run(conf *config.Config, args []string) error {
 		} else {
 			var brief api.ContainerPut
 			if shared.IsSnapshot(container) {
-				snap, err := d.SnapshotInfo(container)
+				fields := strings.Split(container, shared.SnapshotDelimiter)
+
+				snap, _, err := d.GetContainerSnapshot(fields[0], fields[1])
 				if err != nil {
 					return err
 				}
@@ -435,7 +464,7 @@ func (c *configCmd) run(conf *config.Config, args []string) error {
 					}
 				}
 			} else {
-				container, err := d.ContainerInfo(container)
+				container, _, err := d.GetContainer(container)
 				if err != nil {
 					return err
 				}
@@ -474,19 +503,19 @@ func (c *configCmd) run(conf *config.Config, args []string) error {
 			key = args[2]
 		}
 
-		d, err := lxd.NewClient(conf.Legacy(), remote)
+		d, err := conf.GetContainerServer(remote)
 		if err != nil {
 			return err
 		}
 
 		if container != "" {
-			resp, err := d.ContainerInfo(container)
+			resp, _, err := d.GetContainer(container)
 			if err != nil {
 				return err
 			}
 			fmt.Println(resp.Config[key])
 		} else {
-			resp, err := d.ServerStatus()
+			resp, _, err := d.GetServer()
 			if err != nil {
 				return err
 			}
@@ -543,7 +572,7 @@ func (c *configCmd) run(conf *config.Config, args []string) error {
 			}
 		}
 
-		d, err := lxd.NewClient(conf.Legacy(), remote)
+		d, err := conf.GetContainerServer(remote)
 		if err != nil {
 			return err
 		}
@@ -561,7 +590,7 @@ func (c *configCmd) run(conf *config.Config, args []string) error {
 	return errArgs
 }
 
-func (c *configCmd) doContainerConfigEdit(client *lxd.Client, cont string) error {
+func (c *configCmd) doContainerConfigEdit(client lxd.ContainerServer, cont string) error {
 	// If stdin isn't a terminal, read text from it
 	if !termios.IsTerminal(int(syscall.Stdin)) {
 		contents, err := ioutil.ReadAll(os.Stdin)
@@ -574,11 +603,17 @@ func (c *configCmd) doContainerConfigEdit(client *lxd.Client, cont string) error
 		if err != nil {
 			return err
 		}
-		return client.UpdateContainerConfig(cont, newdata)
+
+		op, err := client.UpdateContainer(cont, newdata, "")
+		if err != nil {
+			return err
+		}
+
+		return op.Wait()
 	}
 
 	// Extract the current value
-	container, err := client.ContainerInfo(cont)
+	container, etag, err := client.GetContainer(cont)
 	if err != nil {
 		return err
 	}
@@ -600,7 +635,11 @@ func (c *configCmd) doContainerConfigEdit(client *lxd.Client, cont string) error
 		newdata := api.ContainerPut{}
 		err = yaml.Unmarshal(content, &newdata)
 		if err == nil {
-			err = client.UpdateContainerConfig(cont, newdata)
+			var op *lxd.Operation
+			op, err = client.UpdateContainer(cont, newdata, etag)
+			if err == nil {
+				err = op.Wait()
+			}
 		}
 
 		// Respawn the editor
@@ -621,10 +660,11 @@ func (c *configCmd) doContainerConfigEdit(client *lxd.Client, cont string) error
 		}
 		break
 	}
+
 	return nil
 }
 
-func (c *configCmd) doDaemonConfigEdit(client *lxd.Client) error {
+func (c *configCmd) doDaemonConfigEdit(client lxd.ContainerServer) error {
 	// If stdin isn't a terminal, read text from it
 	if !termios.IsTerminal(int(syscall.Stdin)) {
 		contents, err := ioutil.ReadAll(os.Stdin)
@@ -638,12 +678,11 @@ func (c *configCmd) doDaemonConfigEdit(client *lxd.Client) error {
 			return err
 		}
 
-		_, err = client.UpdateServerConfig(newdata)
-		return err
+		return client.UpdateServer(newdata, "")
 	}
 
 	// Extract the current value
-	server, err := client.ServerStatus()
+	server, etag, err := client.GetServer()
 	if err != nil {
 		return err
 	}
@@ -665,7 +704,7 @@ func (c *configCmd) doDaemonConfigEdit(client *lxd.Client) error {
 		newdata := api.ServerPut{}
 		err = yaml.Unmarshal(content, &newdata)
 		if err == nil {
-			_, err = client.UpdateServerConfig(newdata)
+			err = client.UpdateServer(newdata, etag)
 		}
 
 		// Respawn the editor
@@ -686,6 +725,7 @@ func (c *configCmd) doDaemonConfigEdit(client *lxd.Client) error {
 		}
 		break
 	}
+
 	return nil
 }
 
@@ -699,36 +739,69 @@ func (c *configCmd) deviceAdd(conf *config.Config, which string, args []string)
 		return err
 	}
 
-	client, err := lxd.NewClient(conf.Legacy(), remote)
+	client, err := conf.GetContainerServer(remote)
 	if err != nil {
 		return err
 	}
 
 	devname := args[3]
-	devtype := args[4]
-	var props []string
+	device := map[string]string{}
+	device["type"] = args[4]
 	if len(args) > 5 {
-		props = args[5:]
-	} else {
-		props = []string{}
+		for _, prop := range args[5:] {
+			results := strings.SplitN(prop, "=", 2)
+			if len(results) != 2 {
+				return fmt.Errorf("No value found in %q", prop)
+			}
+			k := results[0]
+			v := results[1]
+			device[k] = v
+		}
 	}
 
-	var resp *api.Response
 	if which == "profile" {
-		resp, err = client.ProfileDeviceAdd(name, devname, devtype, props)
+		profile, etag, err := client.GetProfile(name)
+		if err != nil {
+			return err
+		}
+
+		_, ok := profile.Devices[devname]
+		if ok {
+			return fmt.Errorf(i18n.G("The device already exists"))
+		}
+
+		profile.Devices[devname] = device
+
+		err = client.UpdateProfile(name, profile.Writable(), etag)
+		if err != nil {
+			return err
+		}
 	} else {
-		resp, err = client.ContainerDeviceAdd(name, devname, devtype, props)
-	}
-	if err != nil {
-		return err
-	}
-	if which != "profile" {
-		err = client.WaitForSuccess(resp.Operation)
-	}
-	if err == nil {
-		fmt.Printf(i18n.G("Device %s added to %s")+"\n", devname, name)
+		container, etag, err := client.GetContainer(name)
+		if err != nil {
+			return err
+		}
+
+		_, ok := container.Devices[devname]
+		if ok {
+			return fmt.Errorf(i18n.G("The device already exists"))
+		}
+
+		container.Devices[devname] = device
+
+		op, err := client.UpdateContainer(name, container.Writable(), etag)
+		if err != nil {
+			return err
+		}
+
+		err = op.Wait()
+		if err != nil {
+			return err
+		}
 	}
-	return err
+
+	fmt.Printf(i18n.G("Device %s added to %s")+"\n", devname, name)
+	return nil
 }
 
 func (c *configCmd) deviceGet(conf *config.Config, which string, args []string) error {
@@ -741,7 +814,7 @@ func (c *configCmd) deviceGet(conf *config.Config, which string, args []string)
 		return err
 	}
 
-	client, err := lxd.NewClient(conf.Legacy(), remote)
+	client, err := conf.GetContainerServer(remote)
 	if err != nil {
 		return err
 	}
@@ -750,24 +823,24 @@ func (c *configCmd) deviceGet(conf *config.Config, which string, args []string)
 	key := args[4]
 
 	if which == "profile" {
-		st, err := client.ProfileConfig(name)
+		profile, _, err := client.GetProfile(name)
 		if err != nil {
 			return err
 		}
 
-		dev, ok := st.Devices[devname]
+		dev, ok := profile.Devices[devname]
 		if !ok {
 			return fmt.Errorf(i18n.G("The device doesn't exist"))
 		}
 
 		fmt.Println(dev[key])
 	} else {
-		st, err := client.ContainerInfo(name)
+		container, _, err := client.GetContainer(name)
 		if err != nil {
 			return err
 		}
 
-		dev, ok := st.Devices[devname]
+		dev, ok := container.Devices[devname]
 		if !ok {
 			return fmt.Errorf(i18n.G("The device doesn't exist"))
 		}
@@ -788,7 +861,7 @@ func (c *configCmd) deviceSet(conf *config.Config, which string, args []string)
 		return err
 	}
 
-	client, err := lxd.NewClient(conf.Legacy(), remote)
+	client, err := conf.GetContainerServer(remote)
 	if err != nil {
 		return err
 	}
@@ -798,44 +871,49 @@ func (c *configCmd) deviceSet(conf *config.Config, which string, args []string)
 	value := args[5]
 
 	if which == "profile" {
-		st, err := client.ProfileConfig(name)
+		profile, etag, err := client.GetProfile(name)
 		if err != nil {
 			return err
 		}
 
-		dev, ok := st.Devices[devname]
+		dev, ok := profile.Devices[devname]
 		if !ok {
 			return fmt.Errorf(i18n.G("The device doesn't exist"))
 		}
 
 		dev[key] = value
-		st.Devices[devname] = dev
+		profile.Devices[devname] = dev
 
-		err = client.PutProfile(name, st.Writable())
+		err = client.UpdateProfile(name, profile.Writable(), etag)
 		if err != nil {
 			return err
 		}
 	} else {
-		st, err := client.ContainerInfo(name)
+		container, etag, err := client.GetContainer(name)
 		if err != nil {
 			return err
 		}
 
-		dev, ok := st.Devices[devname]
+		dev, ok := container.Devices[devname]
 		if !ok {
 			return fmt.Errorf(i18n.G("The device doesn't exist"))
 		}
 
 		dev[key] = value
-		st.Devices[devname] = dev
+		container.Devices[devname] = dev
 
-		err = client.UpdateContainerConfig(name, st.Writable())
+		op, err := client.UpdateContainer(name, container.Writable(), etag)
+		if err != nil {
+			return err
+		}
+
+		err = op.Wait()
 		if err != nil {
 			return err
 		}
 	}
 
-	return err
+	return nil
 }
 
 func (c *configCmd) deviceUnset(conf *config.Config, which string, args []string) error {
@@ -848,7 +926,7 @@ func (c *configCmd) deviceUnset(conf *config.Config, which string, args []string
 		return err
 	}
 
-	client, err := lxd.NewClient(conf.Legacy(), remote)
+	client, err := conf.GetContainerServer(remote)
 	if err != nil {
 		return err
 	}
@@ -857,44 +935,47 @@ func (c *configCmd) deviceUnset(conf *config.Config, which string, args []string
 	key := args[4]
 
 	if which == "profile" {
-		st, err := client.ProfileConfig(name)
+		profile, etag, err := client.GetProfile(name)
 		if err != nil {
 			return err
 		}
 
-		dev, ok := st.Devices[devname]
+		dev, ok := profile.Devices[devname]
 		if !ok {
 			return fmt.Errorf(i18n.G("The device doesn't exist"))
 		}
-
 		delete(dev, key)
-		st.Devices[devname] = dev
+		profile.Devices[devname] = dev
 
-		err = client.PutProfile(name, st.Writable())
+		err = client.UpdateProfile(name, profile.Writable(), etag)
 		if err != nil {
 			return err
 		}
 	} else {
-		st, err := client.ContainerInfo(name)
+		container, etag, err := client.GetContainer(name)
 		if err != nil {
 			return err
 		}
 
-		dev, ok := st.Devices[devname]
+		dev, ok := container.Devices[devname]
 		if !ok {
 			return fmt.Errorf(i18n.G("The device doesn't exist"))
 		}
-
 		delete(dev, key)
-		st.Devices[devname] = dev
+		container.Devices[devname] = dev
+
+		op, err := client.UpdateContainer(name, container.Writable(), etag)
+		if err != nil {
+			return err
+		}
 
-		err = client.UpdateContainerConfig(name, st.Writable())
+		err = op.Wait()
 		if err != nil {
 			return err
 		}
 	}
 
-	return err
+	return nil
 }
 
 func (c *configCmd) deviceRm(conf *config.Config, which string, args []string) error {
@@ -907,28 +988,54 @@ func (c *configCmd) deviceRm(conf *config.Config, which string, args []string) e
 		return err
 	}
 
-	client, err := lxd.NewClient(conf.Legacy(), remote)
+	client, err := conf.GetContainerServer(remote)
 	if err != nil {
 		return err
 	}
 
 	devname := args[3]
-	var resp *api.Response
+
 	if which == "profile" {
-		resp, err = client.ProfileDeviceDelete(name, devname)
+		profile, etag, err := client.GetProfile(name)
+		if err != nil {
+			return err
+		}
+
+		_, ok := profile.Devices[devname]
+		if !ok {
+			return fmt.Errorf(i18n.G("The device doesn't exist"))
+		}
+		delete(profile.Devices, devname)
+
+		err = client.UpdateProfile(name, profile.Writable(), etag)
+		if err != nil {
+			return err
+		}
 	} else {
-		resp, err = client.ContainerDeviceDelete(name, devname)
-	}
-	if err != nil {
-		return err
-	}
-	if which != "profile" {
-		err = client.WaitForSuccess(resp.Operation)
-	}
-	if err == nil {
-		fmt.Printf(i18n.G("Device %s removed from %s")+"\n", devname, name)
+		container, etag, err := client.GetContainer(name)
+		if err != nil {
+			return err
+		}
+
+		_, ok := container.Devices[devname]
+		if !ok {
+			return fmt.Errorf(i18n.G("The device doesn't exist"))
+		}
+		delete(container.Devices, devname)
+
+		op, err := client.UpdateContainer(name, container.Writable(), etag)
+		if err != nil {
+			return err
+		}
+
+		err = op.Wait()
+		if err != nil {
+			return err
+		}
 	}
-	return err
+
+	fmt.Printf(i18n.G("Device %s removed from %s")+"\n", devname, name)
+	return nil
 }
 
 func (c *configCmd) deviceList(conf *config.Config, which string, args []string) error {
@@ -941,22 +1048,33 @@ func (c *configCmd) deviceList(conf *config.Config, which string, args []string)
 		return err
 	}
 
-	client, err := lxd.NewClient(conf.Legacy(), remote)
+	client, err := conf.GetContainerServer(remote)
 	if err != nil {
 		return err
 	}
 
-	var resp []string
+	var devices []string
 	if which == "profile" {
-		resp, err = client.ProfileListDevices(name)
+		profile, _, err := client.GetProfile(name)
+		if err != nil {
+			return err
+		}
+
+		for k := range profile.Devices {
+			devices = append(devices, k)
+		}
 	} else {
-		resp, err = client.ContainerListDevices(name)
-	}
-	if err != nil {
-		return err
+		container, _, err := client.GetContainer(name)
+		if err != nil {
+			return err
+		}
+
+		for k := range container.Devices {
+			devices = append(devices, k)
+		}
 	}
-	fmt.Printf("%s\n", strings.Join(resp, "\n"))
 
+	fmt.Printf("%s\n", strings.Join(devices, "\n"))
 	return nil
 }
 
@@ -970,26 +1088,26 @@ func (c *configCmd) deviceShow(conf *config.Config, which string, args []string)
 		return err
 	}
 
-	client, err := lxd.NewClient(conf.Legacy(), remote)
+	client, err := conf.GetContainerServer(remote)
 	if err != nil {
 		return err
 	}
 
 	var devices map[string]map[string]string
 	if which == "profile" {
-		resp, err := client.ProfileConfig(name)
+		profile, _, err := client.GetProfile(name)
 		if err != nil {
 			return err
 		}
 
-		devices = resp.Devices
+		devices = profile.Devices
 	} else {
-		resp, err := client.ContainerInfo(name)
+		container, _, err := client.GetContainer(name)
 		if err != nil {
 			return err
 		}
 
-		devices = resp.Devices
+		devices = container.Devices
 	}
 
 	data, err := yaml.Marshal(&devices)
@@ -998,6 +1116,5 @@ func (c *configCmd) deviceShow(conf *config.Config, which string, args []string)
 	}
 
 	fmt.Printf(string(data))
-
 	return nil
 }

From 8dfda04c2370fa1df0abf4239ceea5157b198908 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Fri, 16 Jun 2017 18:11:47 -0400
Subject: [PATCH 23/28] lxc/profile: Port to new client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxc/profile.go | 149 ++++++++++++++++++++++++++++++++++++---------------------
 1 file changed, 95 insertions(+), 54 deletions(-)

diff --git a/lxc/profile.go b/lxc/profile.go
index 6c9401659..fad41668b 100644
--- a/lxc/profile.go
+++ b/lxc/profile.go
@@ -5,12 +5,13 @@ import (
 	"io/ioutil"
 	"os"
 	"sort"
+	"strings"
 	"syscall"
 
 	"github.com/olekukonko/tablewriter"
 	"gopkg.in/yaml.v2"
 
-	"github.com/lxc/lxd"
+	"github.com/lxc/lxd/client"
 	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared"
 	"github.com/lxc/lxd/shared/api"
@@ -146,7 +147,7 @@ func (c *profileCmd) run(conf *config.Config, args []string) error {
 		return err
 	}
 
-	client, err := lxd.NewClient(conf.Legacy(), remote)
+	client, err := conf.GetContainerServer(remote)
 	if err != nil {
 		return err
 	}
@@ -208,15 +209,18 @@ func (c *profileCmd) run(conf *config.Config, args []string) error {
 	}
 }
 
-func (c *profileCmd) doProfileCreate(client *lxd.Client, p string) error {
-	err := client.ProfileCreate(p)
+func (c *profileCmd) doProfileCreate(client lxd.ContainerServer, p string) error {
+	profile := api.ProfilesPost{}
+	profile.Name = p
+
+	err := client.CreateProfile(profile)
 	if err == nil {
 		fmt.Printf(i18n.G("Profile %s created")+"\n", p)
 	}
 	return err
 }
 
-func (c *profileCmd) doProfileEdit(client *lxd.Client, p string) error {
+func (c *profileCmd) doProfileEdit(client lxd.ContainerServer, p string) error {
 	// If stdin isn't a terminal, read text from it
 	if !termios.IsTerminal(int(syscall.Stdin)) {
 		contents, err := ioutil.ReadAll(os.Stdin)
@@ -229,11 +233,12 @@ func (c *profileCmd) doProfileEdit(client *lxd.Client, p string) error {
 		if err != nil {
 			return err
 		}
-		return client.PutProfile(p, newdata)
+
+		return client.UpdateProfile(p, newdata, "")
 	}
 
 	// Extract the current value
-	profile, err := client.ProfileConfig(p)
+	profile, etag, err := client.GetProfile(p)
 	if err != nil {
 		return err
 	}
@@ -254,7 +259,7 @@ func (c *profileCmd) doProfileEdit(client *lxd.Client, p string) error {
 		newdata := api.ProfilePut{}
 		err = yaml.Unmarshal(content, &newdata)
 		if err == nil {
-			err = client.PutProfile(p, newdata)
+			err = client.UpdateProfile(p, newdata, etag)
 		}
 
 		// Respawn the editor
@@ -278,61 +283,80 @@ func (c *profileCmd) doProfileEdit(client *lxd.Client, p string) error {
 	return nil
 }
 
-func (c *profileCmd) doProfileDelete(client *lxd.Client, p string) error {
-	err := client.ProfileDelete(p)
-	if err == nil {
-		fmt.Printf(i18n.G("Profile %s deleted")+"\n", p)
+func (c *profileCmd) doProfileDelete(client lxd.ContainerServer, p string) error {
+	err := client.DeleteProfile(p)
+	if err != nil {
+		return err
 	}
-	return err
+
+	fmt.Printf(i18n.G("Profile %s deleted")+"\n", p)
+	return nil
 }
 
-func (c *profileCmd) doProfileAssign(client *lxd.Client, d string, p string) error {
-	resp, err := client.AssignProfile(d, p)
+func (c *profileCmd) doProfileAssign(client lxd.ContainerServer, d string, p string) error {
+	container, etag, err := client.GetContainer(d)
 	if err != nil {
 		return err
 	}
 
-	err = client.WaitForSuccess(resp.Operation)
-	if err == nil {
-		if p == "" {
-			p = i18n.G("(none)")
-		}
-		fmt.Printf(i18n.G("Profiles %s applied to %s")+"\n", p, d)
+	if p != "" {
+		container.Profiles = strings.Split(p, ",")
+	} else {
+		container.Profiles = nil
 	}
 
-	return err
+	op, err := client.UpdateContainer(d, container.Writable(), etag)
+	if err != nil {
+		return err
+	}
+
+	err = op.Wait()
+	if err != nil {
+		return err
+	}
+
+	if p == "" {
+		p = i18n.G("(none)")
+	}
+	fmt.Printf(i18n.G("Profiles %s applied to %s")+"\n", p, d)
+
+	return nil
 }
 
-func (c *profileCmd) doProfileAdd(client *lxd.Client, d string, p string) error {
-	ct, err := client.ContainerInfo(d)
+func (c *profileCmd) doProfileAdd(client lxd.ContainerServer, d string, p string) error {
+	container, etag, err := client.GetContainer(d)
 	if err != nil {
 		return err
 	}
 
-	ct.Profiles = append(ct.Profiles, p)
+	container.Profiles = append(container.Profiles, p)
 
-	err = client.UpdateContainerConfig(d, ct.Writable())
+	op, err := client.UpdateContainer(d, container.Writable(), etag)
 	if err != nil {
 		return err
 	}
 
-	fmt.Printf(i18n.G("Profile %s added to %s")+"\n", p, d)
+	err = op.Wait()
+	if err != nil {
+		return err
+	}
 
-	return err
+	fmt.Printf(i18n.G("Profile %s added to %s")+"\n", p, d)
+	return nil
 }
 
-func (c *profileCmd) doProfileRemove(client *lxd.Client, d string, p string) error {
-	ct, err := client.ContainerInfo(d)
+func (c *profileCmd) doProfileRemove(client lxd.ContainerServer, d string, p string) error {
+	container, etag, err := client.GetContainer(d)
 	if err != nil {
 		return err
 	}
 
-	if !shared.StringInSlice(p, ct.Profiles) {
+	if !shared.StringInSlice(p, container.Profiles) {
 		return fmt.Errorf("Profile %s isn't currently applied to %s", p, d)
 	}
 
 	profiles := []string{}
-	for _, profile := range ct.Profiles {
+	for _, profile := range container.Profiles {
 		if profile == p {
 			continue
 		}
@@ -340,20 +364,24 @@ func (c *profileCmd) doProfileRemove(client *lxd.Client, d string, p string) err
 		profiles = append(profiles, profile)
 	}
 
-	ct.Profiles = profiles
+	container.Profiles = profiles
 
-	err = client.UpdateContainerConfig(d, ct.Writable())
+	op, err := client.UpdateContainer(d, container.Writable(), etag)
 	if err != nil {
 		return err
 	}
 
-	fmt.Printf(i18n.G("Profile %s removed from %s")+"\n", p, d)
+	err = op.Wait()
+	if err != nil {
+		return err
+	}
 
-	return err
+	fmt.Printf(i18n.G("Profile %s removed from %s")+"\n", p, d)
+	return nil
 }
 
-func (c *profileCmd) doProfileShow(client *lxd.Client, p string) error {
-	profile, err := client.ProfileConfig(p)
+func (c *profileCmd) doProfileShow(client lxd.ContainerServer, p string) error {
+	profile, _, err := client.GetProfile(p)
 	if err != nil {
 		return err
 	}
@@ -368,7 +396,7 @@ func (c *profileCmd) doProfileShow(client *lxd.Client, p string) error {
 	return nil
 }
 
-func (c *profileCmd) doProfileCopy(conf *config.Config, client *lxd.Client, p string, args []string) error {
+func (c *profileCmd) doProfileCopy(conf *config.Config, client lxd.ContainerServer, p string, args []string) error {
 	if len(args) != 1 {
 		return errArgs
 	}
@@ -382,12 +410,22 @@ func (c *profileCmd) doProfileCopy(conf *config.Config, client *lxd.Client, p st
 		newname = p
 	}
 
-	dest, err := lxd.NewClient(conf.Legacy(), remote)
+	dest, err := conf.GetContainerServer(remote)
+	if err != nil {
+		return err
+	}
+
+	profile, _, err := client.GetProfile(p)
 	if err != nil {
 		return err
 	}
 
-	return client.ProfileCopy(p, newname, dest)
+	newProfile := api.ProfilesPost{
+		ProfilePut: profile.Writable(),
+		Name:       newname,
+	}
+
+	return dest.CreateProfile(newProfile)
 }
 
 func (c *profileCmd) doProfileDevice(conf *config.Config, args []string) error {
@@ -420,25 +458,22 @@ func (c *profileCmd) doProfileDevice(conf *config.Config, args []string) error {
 	}
 }
 
-func (c *profileCmd) doProfileGet(client *lxd.Client, p string, args []string) error {
+func (c *profileCmd) doProfileGet(client lxd.ContainerServer, p string, args []string) error {
 	// we shifted @args so so it should read "<key>"
 	if len(args) != 1 {
 		return errArgs
 	}
 
-	resp, err := client.GetProfileConfig(p)
+	profile, _, err := client.GetProfile(p)
 	if err != nil {
 		return err
 	}
-	for k, v := range resp {
-		if k == args[0] {
-			fmt.Printf("%s\n", v)
-		}
-	}
+
+	fmt.Printf("%s\n", profile.Config[args[0]])
 	return nil
 }
 
-func (c *profileCmd) doProfileSet(client *lxd.Client, p string, args []string) error {
+func (c *profileCmd) doProfileSet(client lxd.ContainerServer, p string, args []string) error {
 	// we shifted @args so so it should read "<key> [<value>]"
 	if len(args) < 1 {
 		return errArgs
@@ -460,11 +495,17 @@ func (c *profileCmd) doProfileSet(client *lxd.Client, p string, args []string) e
 		value = string(buf[:])
 	}
 
-	err := client.SetProfileConfigItem(p, key, value)
-	return err
+	profile, etag, err := client.GetProfile(p)
+	if err != nil {
+		return err
+	}
+
+	profile.Config[key] = value
+
+	return client.UpdateProfile(p, profile.Writable(), etag)
 }
 
-func (c *profileCmd) doProfileUnset(client *lxd.Client, p string, args []string) error {
+func (c *profileCmd) doProfileUnset(client lxd.ContainerServer, p string, args []string) error {
 	// we shifted @args so so it should read "<key> [<value>]"
 	if len(args) != 1 {
 		return errArgs
@@ -490,12 +531,12 @@ func (c *profileCmd) doProfileList(conf *config.Config, args []string) error {
 		remote = conf.DefaultRemote
 	}
 
-	client, err := lxd.NewClient(conf.Legacy(), remote)
+	client, err := conf.GetContainerServer(remote)
 	if err != nil {
 		return err
 	}
 
-	profiles, err := client.ListProfiles()
+	profiles, err := client.GetProfiles()
 	if err != nil {
 		return err
 	}

From e089379cdddde9e7448d6904c0c349f75e4f5928 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Fri, 16 Jun 2017 23:48:44 -0400
Subject: [PATCH 24/28] lxc/file: Port to new client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxc/file.go | 180 ++++++++++++++++++++++++++++++++++++++++++++++++++++++------
 1 file changed, 164 insertions(+), 16 deletions(-)

diff --git a/lxc/file.go b/lxc/file.go
index 6821fefdd..d56d46d0d 100644
--- a/lxc/file.go
+++ b/lxc/file.go
@@ -6,11 +6,12 @@ import (
 	"io/ioutil"
 	"os"
 	"path"
+	"path/filepath"
 	"strconv"
 	"strings"
 	"syscall"
 
-	"github.com/lxc/lxd"
+	"github.com/lxc/lxd/client"
 	"github.com/lxc/lxd/lxc/config"
 	"github.com/lxc/lxd/shared"
 	"github.com/lxc/lxd/shared/gnuflag"
@@ -69,6 +70,145 @@ func (c *fileCmd) flags() {
 	gnuflag.BoolVar(&c.mkdirs, "p", false, i18n.G("Create any directories necessary"))
 }
 
+func (c *fileCmd) recursivePullFile(d lxd.ContainerServer, container string, p string, targetDir string) error {
+	buf, resp, err := d.GetContainerFile(container, p)
+	if err != nil {
+		return err
+	}
+
+	target := filepath.Join(targetDir, filepath.Base(p))
+	if resp.Type == "directory" {
+		if err := os.Mkdir(target, os.FileMode(resp.Mode)); err != nil {
+			return err
+		}
+
+		for _, ent := range resp.Entries {
+			nextP := path.Join(p, ent)
+			if err := c.recursivePullFile(d, container, nextP, target); err != nil {
+				return err
+			}
+		}
+	} else if resp.Type == "file" {
+		f, err := os.Create(target)
+		if err != nil {
+			return err
+		}
+		defer f.Close()
+
+		err = os.Chmod(target, os.FileMode(resp.Mode))
+		if err != nil {
+			return err
+		}
+
+		_, err = io.Copy(f, buf)
+		if err != nil {
+			return err
+		}
+	} else {
+		return fmt.Errorf(i18n.G("Unknown file type '%s'"), resp.Type)
+	}
+
+	return nil
+}
+
+func (c *fileCmd) recursivePushFile(d lxd.ContainerServer, container string, source string, target string) error {
+	sourceDir, _ := filepath.Split(source)
+	sourceLen := len(sourceDir)
+
+	sendFile := func(p string, fInfo os.FileInfo, err error) error {
+		if err != nil {
+			return fmt.Errorf(i18n.G("Failed to walk path for %s: %s"), p, err)
+		}
+
+		// Detect symlinks
+		if !fInfo.Mode().IsRegular() && !fInfo.Mode().IsDir() {
+			return fmt.Errorf(i18n.G("'%s' isn't a regular file or directory."), p)
+		}
+
+		targetPath := path.Join(target, filepath.ToSlash(p[sourceLen:]))
+		if fInfo.IsDir() {
+			mode, uid, gid := shared.GetOwnerMode(fInfo)
+			args := lxd.ContainerFileArgs{
+				UID:  int64(uid),
+				GID:  int64(gid),
+				Mode: int(mode.Perm()),
+				Type: "directory",
+			}
+
+			return d.CreateContainerFile(container, targetPath, args)
+		}
+
+		f, err := os.Open(p)
+		if err != nil {
+			return err
+		}
+		defer f.Close()
+
+		mode, uid, gid := shared.GetOwnerMode(fInfo)
+
+		args := lxd.ContainerFileArgs{
+			Content: f,
+			UID:     int64(uid),
+			GID:     int64(gid),
+			Mode:    int(mode.Perm()),
+			Type:    "file",
+		}
+
+		return d.CreateContainerFile(container, targetPath, args)
+	}
+
+	return filepath.Walk(source, sendFile)
+}
+
+func (c *fileCmd) recursiveMkdir(d lxd.ContainerServer, container string, p string, mode os.FileMode, uid int64, gid int64) error {
+	/* special case, every container has a /, we don't need to do anything */
+	if p == "/" {
+		return nil
+	}
+
+	// Remove trailing "/" e.g. /A/B/C/. Otherwise we will end up with an
+	// empty array entry "" which will confuse the Mkdir() loop below.
+	pclean := filepath.Clean(p)
+	parts := strings.Split(pclean, "/")
+	i := len(parts)
+
+	for ; i >= 1; i-- {
+		cur := filepath.Join(parts[:i]...)
+		_, resp, err := d.GetContainerFile(container, cur)
+		if err != nil {
+			continue
+		}
+
+		if resp.Type != "directory" {
+			return fmt.Errorf(i18n.G("%s is not a directory"), cur)
+		}
+
+		i++
+		break
+	}
+
+	for ; i <= len(parts); i++ {
+		cur := filepath.Join(parts[:i]...)
+		if cur == "" {
+			continue
+		}
+
+		args := lxd.ContainerFileArgs{
+			UID:  uid,
+			GID:  gid,
+			Mode: int(mode.Perm()),
+			Type: "directory",
+		}
+
+		err := d.CreateContainerFile(container, cur, args)
+		if err != nil {
+			return err
+		}
+	}
+
+	return nil
+}
+
 func (c *fileCmd) push(conf *config.Config, send_file_perms bool, args []string) error {
 	if len(args) < 2 {
 		return errArgs
@@ -99,7 +239,7 @@ func (c *fileCmd) push(conf *config.Config, send_file_perms bool, args []string)
 
 	logger.Debugf("Pushing to: %s  (isdir: %t)", targetPath, targetIsDir)
 
-	d, err := lxd.NewClient(conf.Legacy(), remote)
+	d, err := conf.GetContainerServer(remote)
 	if err != nil {
 		return err
 	}
@@ -141,13 +281,13 @@ func (c *fileCmd) push(conf *config.Config, send_file_perms bool, args []string)
 			}
 
 			mode, uid, gid := shared.GetOwnerMode(finfo)
-			if err := d.MkdirP(container, targetPath, mode, uid, gid); err != nil {
+			if err := c.recursiveMkdir(d, container, targetPath, mode, int64(uid), int64(gid)); err != nil {
 				return err
 			}
 		}
 
 		for _, fname := range sourcefilenames {
-			if err := d.RecursivePushFile(container, fname, targetPath); err != nil {
+			if err := c.recursivePushFile(d, container, fname, targetPath); err != nil {
 				return err
 			}
 		}
@@ -214,11 +354,18 @@ func (c *fileCmd) push(conf *config.Config, send_file_perms bool, args []string)
 				}
 			}
 
-			if err := d.MkdirP(container, path.Dir(fpath), mode, uid, gid); err != nil {
+			if err := c.recursiveMkdir(d, container, path.Dir(fpath), mode, int64(uid), int64(gid)); err != nil {
 				return err
 			}
 		}
 
+		args := lxd.ContainerFileArgs{
+			Content: f,
+			UID:     -1,
+			GID:     -1,
+			Mode:    -1,
+		}
+
 		if send_file_perms {
 			if c.mode == "" || c.uid == -1 || c.gid == -1 {
 				finfo, err := f.Stat()
@@ -244,11 +391,12 @@ func (c *fileCmd) push(conf *config.Config, send_file_perms bool, args []string)
 				}
 			}
 
-			err = d.PushFile(container, fpath, gid, uid, fmt.Sprintf("%04o", mode.Perm()), f)
-		} else {
-			err = d.PushFile(container, fpath, -1, -1, "", f)
+			args.UID = int64(uid)
+			args.GID = int64(gid)
+			args.Mode = int(mode.Perm())
 		}
 
+		err = d.CreateContainerFile(container, fpath, args)
 		if err != nil {
 			return err
 		}
@@ -300,26 +448,26 @@ func (c *fileCmd) pull(conf *config.Config, args []string) error {
 			return err
 		}
 
-		d, err := lxd.NewClient(conf.Legacy(), remote)
+		d, err := conf.GetContainerServer(remote)
 		if err != nil {
 			return err
 		}
 
 		if c.recursive {
-			if err := d.RecursivePullFile(container, pathSpec[1], target); err != nil {
+			if err := c.recursivePullFile(d, container, pathSpec[1], target); err != nil {
 				return err
 			}
 
 			continue
 		}
 
-		_, _, mode, type_, buf, _, err := d.PullFile(container, pathSpec[1])
+		buf, resp, err := d.GetContainerFile(container, pathSpec[1])
 		if err != nil {
 			return err
 		}
 
-		if type_ == "directory" {
-			return fmt.Errorf(i18n.G("can't pull a directory without --recursive"))
+		if resp.Type == "directory" {
+			return fmt.Errorf(i18n.G("Can't pull a directory without --recursive"))
 		}
 
 		var targetPath string
@@ -339,7 +487,7 @@ func (c *fileCmd) pull(conf *config.Config, args []string) error {
 			}
 			defer f.Close()
 
-			err = os.Chmod(targetPath, os.FileMode(mode))
+			err = os.Chmod(targetPath, os.FileMode(resp.Mode))
 			if err != nil {
 				return err
 			}
@@ -370,12 +518,12 @@ func (c *fileCmd) delete(conf *config.Config, args []string) error {
 			return err
 		}
 
-		d, err := lxd.NewClient(conf.Legacy(), remote)
+		d, err := conf.GetContainerServer(remote)
 		if err != nil {
 			return err
 		}
 
-		err = d.DeleteFile(container, pathSpec[1])
+		err = d.DeleteContainerFile(container, pathSpec[1])
 		if err != nil {
 			return err
 		}

From 6cfa0514ae34f27d263ff9abf8ee2852cc53f5d7 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Thu, 27 Apr 2017 23:36:09 -0400
Subject: [PATCH 25/28] i18n: Update translations
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 po/de.po   | 648 ++++++++++++++++++++++++++++++-----------------------------
 po/el.po   | 618 ++++++++++++++++++++++++++++----------------------------
 po/fr.po   | 648 +++++++++++++++++++++++++++++++----------------------------
 po/it.po   | 618 ++++++++++++++++++++++++++++----------------------------
 po/ja.po   | 666 ++++++++++++++++++++++++++++++++-----------------------------
 po/lxd.pot | 609 ++++++++++++++++++++++++++++---------------------------
 po/nl.po   | 618 ++++++++++++++++++++++++++++----------------------------
 po/ru.po   | 618 ++++++++++++++++++++++++++++----------------------------
 po/sr.po   | 618 ++++++++++++++++++++++++++++----------------------------
 po/sv.po   | 618 ++++++++++++++++++++++++++++----------------------------
 po/tr.po   | 618 ++++++++++++++++++++++++++++----------------------------
 11 files changed, 3542 insertions(+), 3355 deletions(-)

diff --git a/po/de.po b/po/de.po
index 96d2c8983..b9de1d014 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-06-13 20:10+0200\n"
+"POT-Creation-Date: 2017-06-17 03:18+0000\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/"
@@ -19,7 +19,7 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 2.14-dev\n"
 
-#: lxc/storage.go:30
+#: lxc/storage.go:31
 #, fuzzy
 msgid ""
 "### This is a yaml representation of a storage pool.\n"
@@ -54,7 +54,7 @@ msgstr ""
 "###\n"
 "### Der Name wird zwar angezeigt, lässt sich jedoch nicht ändern.\n"
 
-#: lxc/storage.go:47
+#: lxc/storage.go:48
 #, fuzzy
 msgid ""
 "### This is a yaml representation of a storage volume.\n"
@@ -75,7 +75,7 @@ msgstr ""
 "### Zum Beispiel:\n"
 "###  description: Mein eigenes Abbild\n"
 
-#: lxc/config.go:37
+#: lxc/config.go:39
 #, fuzzy
 msgid ""
 "### This is a yaml representation of the configuration.\n"
@@ -114,7 +114,7 @@ msgstr ""
 "###\n"
 "### Der Name wird zwar angezeigt, lässt sich jedoch nicht ändern.\n"
 
-#: lxc/image.go:59
+#: lxc/image.go:62
 #, fuzzy
 msgid ""
 "### This is a yaml representation of the image properties.\n"
@@ -131,7 +131,7 @@ msgstr ""
 "### Zum Beispiel:\n"
 "###  description: Mein eigenes Abbild\n"
 
-#: lxc/network.go:29
+#: lxc/network.go:30
 #, fuzzy
 msgid ""
 "### This is a yaml representation of the network.\n"
@@ -169,7 +169,7 @@ msgstr ""
 "###\n"
 "### Der Name wird zwar angezeigt, lässt sich jedoch nicht ändern.\n"
 
-#: lxc/profile.go:28
+#: lxc/profile.go:30
 #, fuzzy
 msgid ""
 "### This is a yaml representation of the profile.\n"
@@ -208,109 +208,133 @@ msgstr ""
 "###\n"
 "### Der Name wird zwar angezeigt, lässt sich jedoch nicht ändern.\n"
 
-#: lxc/image.go:179
+#: lxc/image.go:182
 #, c-format
 msgid "%s (%d more)"
 msgstr ""
 
-#: lxc/snapshot.go:58
+#: lxc/file.go:183
+#, c-format
+msgid "%s is not a directory"
+msgstr ""
+
+#: lxc/file.go:125
+#, c-format
+msgid "'%s' isn't a regular file or directory."
+msgstr ""
+
+#: lxc/snapshot.go:53
 #, fuzzy
 msgid "'/' not allowed in snapshot name"
 msgstr "'/' ist kein gültiges Zeichen im Namen eines Sicherungspunktes\n"
 
-#: lxc/profile.go:293
+#: lxc/profile.go:319
 msgid "(none)"
 msgstr ""
 
-#: lxc/image.go:223 lxc/image.go:814
+#: lxc/image.go:226 lxc/image.go:1052
 msgid "ALIAS"
 msgstr ""
 
-#: lxc/image.go:224
+#: lxc/image.go:227
 msgid "ALIASES"
 msgstr ""
 
-#: lxc/image.go:228
+#: lxc/image.go:231
 msgid "ARCH"
 msgstr ""
 
-#: lxc/list.go:456
+#: lxc/list.go:461
 msgid "ARCHITECTURE"
 msgstr ""
 
-#: lxc/remote.go:66
+#: lxc/remote.go:67
 msgid "Accept certificate"
 msgstr "Akzeptiere Zertifikat"
 
-#: lxc/remote.go:282
+#: lxc/remote.go:281
 #, c-format
 msgid "Admin password for %s: "
 msgstr "Administrator Passwort für %s: "
 
-#: lxc/image.go:483
+#: lxc/image.go:569
 #, fuzzy
 msgid "Aliases:"
 msgstr "Aliasse:\n"
 
-#: lxc/image.go:461 lxc/info.go:95
+#: lxc/image.go:547 lxc/info.go:104
 #, fuzzy, c-format
 msgid "Architecture: %s"
 msgstr "Architektur: %s\n"
 
-#: lxc/image.go:491
+#: lxc/image.go:577
 #, c-format
 msgid "Auto update: %s"
 msgstr "automatisches Update: %s"
 
-#: lxc/info.go:188
+#: lxc/image.go:651
+#, fuzzy, c-format
+msgid "Bad property: %s"
+msgstr "Ungültige Abbild Eigenschaft: %s\n"
+
+#: lxc/info.go:197
 msgid "Bytes received"
 msgstr "Bytes empfangen"
 
-#: lxc/info.go:189
+#: lxc/info.go:198
 msgid "Bytes sent"
 msgstr "Bytes gesendet"
 
-#: lxc/config.go:310
+#: lxc/config.go:349
 msgid "COMMON NAME"
 msgstr ""
 
-#: lxc/info.go:152
+#: lxc/info.go:161
 msgid "CPU usage (in seconds)"
 msgstr ""
 
-#: lxc/info.go:156
+#: lxc/info.go:165
 #, fuzzy
 msgid "CPU usage:"
 msgstr " Prozessorauslastung:"
 
-#: lxc/list.go:457
+#: lxc/list.go:462
 msgid "CREATED AT"
 msgstr "ERSTELLT AM"
 
-#: lxc/config.go:150 lxc/network.go:496
+#: lxc/file.go:470
+msgid "Can't pull a directory without --recursive"
+msgstr ""
+
+#: lxc/config.go:156 lxc/network.go:542
 #, c-format
 msgid "Can't read from stdin: %s"
 msgstr ""
 
-#: lxc/config.go:163 lxc/config.go:196 lxc/config.go:218
+#: lxc/config.go:169
+#, c-format
+msgid "Can't unset key '%s', it's not currently set"
+msgstr ""
+
+#: lxc/config.go:211 lxc/config.go:237
 #, c-format
 msgid "Can't unset key '%s', it's not currently set."
 msgstr ""
 
-#: lxc/network.go:422 lxc/profile.go:472 lxc/storage.go:579
+#: lxc/network.go:468 lxc/profile.go:528 lxc/storage.go:625
 msgid "Cannot provide container name to list"
 msgstr ""
 
-#: lxc/remote.go:232
+#: lxc/remote.go:228
 #, fuzzy, c-format
 msgid "Certificate fingerprint: %s"
 msgstr "Fingerabdruck des Zertifikats: % x\n"
 
-#: lxc/remote.go:305
+#: lxc/remote.go:316
 msgid "Client certificate stored at server: "
 msgstr "Gespeichertes Nutzerzertifikat auf dem Server: "
 
-#: lxc/image.go:167 lxc/image.go:168 lxc/list.go:128 lxc/list.go:129
+#: lxc/image.go:170 lxc/image.go:171 lxc/list.go:128 lxc/list.go:129
 msgid "Columns"
 msgstr ""
 
@@ -318,36 +342,36 @@ msgstr ""
 msgid "Commands:"
 msgstr ""
 
-#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:135 lxc/init.go:136
+#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:136 lxc/init.go:137
 #, fuzzy
 msgid "Config key/value to apply to the new container"
 msgstr "kann nicht zum selben Container Namen kopieren"
 
-#: lxc/config.go:571 lxc/config.go:636 lxc/image.go:868 lxc/network.go:378
-#: lxc/profile.go:257 lxc/storage.go:535 lxc/storage.go:854
+#: lxc/config.go:647 lxc/config.go:712 lxc/image.go:1107 lxc/network.go:418
+#: lxc/profile.go:267 lxc/storage.go:576 lxc/storage.go:935
 #, fuzzy, c-format
 msgid "Config parsing error: %s"
 msgstr "YAML Analyse Fehler %v\n"
 
-#: lxc/main.go:33
+#: lxc/main.go:35
 msgid "Connection refused; is LXD running?"
 msgstr ""
 
-#: lxc/publish.go:62
+#: lxc/publish.go:71
 msgid "Container name is mandatory"
 msgstr ""
 
-#: lxc/copy.go:143 lxc/copy.go:267 lxc/init.go:244
+#: lxc/copy.go:210 lxc/init.go:313
 #, c-format
 msgid "Container name is: %s"
 msgstr ""
 
-#: lxc/publish.go:160 lxc/publish.go:175
+#: lxc/publish.go:250
 #, fuzzy, c-format
 msgid "Container published with fingerprint: %s"
 msgstr "Abbild mit Fingerabdruck %s importiert\n"
 
-#: lxc/image.go:170
+#: lxc/image.go:173
 msgid "Copy aliases from source"
 msgstr "Kopiere Aliasse von der Quelle"
 
@@ -356,89 +380,94 @@ msgstr "Kopiere Aliasse von der Quelle"
 msgid "Copy the container without its snapshots"
 msgstr "Herunterfahren des Containers erzwingen."
 
-#: lxc/image.go:360
+#: lxc/image.go:422
 #, c-format
 msgid "Copying the image: %s"
 msgstr ""
 
-#: lxc/remote.go:247
+#: lxc/remote.go:243
 msgid "Could not create server cert dir"
 msgstr "Kann Verzeichnis für Zertifikate auf dem Server nicht erstellen"
 
-#: lxc/file.go:67 lxc/file.go:68
+#: lxc/file.go:69 lxc/file.go:70
 msgid "Create any directories necessary"
 msgstr ""
 
-#: lxc/image.go:466 lxc/info.go:97
+#: lxc/image.go:552 lxc/info.go:106
 #, c-format
 msgid "Created: %s"
 msgstr ""
 
-#: lxc/init.go:182 lxc/launch.go:142
+#: lxc/init.go:194
 #, c-format
 msgid "Creating %s"
 msgstr ""
 
-#: lxc/init.go:180
+#: lxc/init.go:192
 #, fuzzy
 msgid "Creating the container"
 msgstr "kann nicht zum selben Container Namen kopieren"
 
-#: lxc/image.go:227 lxc/image.go:816 lxc/list.go:458 lxc/network.go:461
-#: lxc/storage.go:608 lxc/storage.go:697
+#: lxc/image.go:230 lxc/image.go:1054 lxc/list.go:463 lxc/network.go:507
+#: lxc/storage.go:654 lxc/storage.go:749
 msgid "DESCRIPTION"
 msgstr ""
 
-#: lxc/storage.go:609
+#: lxc/storage.go:655
 msgid "DRIVER"
 msgstr ""
 
-#: lxc/publish.go:38
+#: lxc/publish.go:39
 msgid "Define a compression algorithm: for image or none"
 msgstr ""
 
-#: lxc/config.go:688
+#: lxc/config.go:803
 #, fuzzy, c-format
 msgid "Device %s added to %s"
 msgstr "Gerät %s wurde zu %s hinzugefügt\n"
 
-#: lxc/config.go:875
+#: lxc/config.go:1037
 #, fuzzy, c-format
 msgid "Device %s removed from %s"
 msgstr "Gerät %s wurde von %s entfernt\n"
 
-#: lxc/exec.go:64
+#: lxc/utils.go:248 lxc/utils.go:272
+#, fuzzy, c-format
+msgid "Device already exists: %s"
+msgstr "entfernte Instanz %s existiert bereits"
+
+#: lxc/exec.go:65
 msgid "Disable pseudo-terminal allocation"
 msgstr ""
 
-#: lxc/exec.go:65
+#: lxc/exec.go:66
 msgid "Disable stdin (reads from /dev/null)"
 msgstr ""
 
-#: lxc/info.go:145
+#: lxc/info.go:154
 #, fuzzy
 msgid "Disk usage:"
 msgstr " Prozessorauslastung:"
 
-#: lxc/list.go:609
+#: lxc/list.go:614
 msgid "EPHEMERAL"
 msgstr ""
 
-#: lxc/config.go:312
+#: lxc/config.go:351
 msgid "EXPIRY DATE"
 msgstr ""
 
-#: lxc/main.go:45
+#: lxc/main.go:47
 #, fuzzy
 msgid "Enable debug mode"
 msgstr "Aktiviert Debug Modus"
 
-#: lxc/main.go:44
+#: lxc/main.go:46
 #, fuzzy
 msgid "Enable verbose mode"
 msgstr "Aktiviert ausführliche Ausgabe"
 
-#: lxc/exec.go:61
+#: lxc/exec.go:62
 msgid "Environment variable to set (e.g. HOME=/home/foo)"
 msgstr ""
 
@@ -446,7 +475,7 @@ msgstr ""
 msgid "Environment:"
 msgstr ""
 
-#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:139 lxc/init.go:140
+#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:140 lxc/init.go:141
 msgid "Ephemeral container"
 msgstr "Flüchtiger Container"
 
@@ -454,16 +483,21 @@ msgstr "Flüchtiger Container"
 msgid "Event type to listen for"
 msgstr ""
 
-#: lxc/image.go:470
+#: lxc/image.go:556
 #, c-format
 msgid "Expires: %s"
 msgstr ""
 
-#: lxc/image.go:472
+#: lxc/image.go:558
 msgid "Expires: never"
 msgstr ""
 
-#: lxc/config.go:309 lxc/image.go:225 lxc/image.go:815
+#: lxc/image.go:848
+#, c-format
+msgid "Exporting the image: %s"
+msgstr ""
+
+#: lxc/config.go:348 lxc/image.go:228 lxc/image.go:1053
 msgid "FINGERPRINT"
 msgstr ""
 
@@ -477,16 +511,26 @@ msgstr ""
 msgid "Failed to generate 'lxc.1': %v"
 msgstr ""
 
+#: lxc/copy.go:205
+#, fuzzy
+msgid "Failed to get the new container name"
+msgstr "kann nicht zum selben Container Namen kopieren"
+
+#: lxc/file.go:120
+#, c-format
+msgid "Failed to walk path for %s: %s"
+msgstr ""
+
 #: lxc/list.go:131
 msgid "Fast mode (same as --columns=nsacPt)"
 msgstr ""
 
-#: lxc/image.go:459
+#: lxc/image.go:545
 #, fuzzy, c-format
 msgid "Fingerprint: %s"
 msgstr "Fingerabdruck: %s\n"
 
-#: lxc/exec.go:63
+#: lxc/exec.go:64
 msgid "Force pseudo-terminal allocation"
 msgstr ""
 
@@ -495,40 +539,40 @@ msgstr ""
 msgid "Force the container to shutdown"
 msgstr "Herunterfahren des Containers erzwingen."
 
-#: lxc/delete.go:33 lxc/delete.go:34
+#: lxc/delete.go:34 lxc/delete.go:35
 msgid "Force the removal of stopped containers"
 msgstr ""
 
-#: lxc/main.go:46
+#: lxc/main.go:48
 msgid "Force using the local unix socket"
 msgstr ""
 
-#: lxc/image.go:173 lxc/list.go:130
+#: lxc/image.go:176 lxc/list.go:130
 msgid "Format (csv|json|table|yaml)"
 msgstr ""
 
-#: lxc/remote.go:80
+#: lxc/remote.go:81
 #, fuzzy
 msgid "Generating a client certificate. This may take a minute..."
 msgstr "Generiere Nutzerzertifikat. Dies kann wenige Minuten dauern...\n"
 
-#: lxc/list.go:454
+#: lxc/list.go:459
 msgid "IPV4"
 msgstr ""
 
-#: lxc/list.go:455
+#: lxc/list.go:460
 msgid "IPV6"
 msgstr ""
 
-#: lxc/config.go:311
+#: lxc/config.go:350
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:139
+#: lxc/main.go:153
 msgid "If this is your first time using LXD, you should also run: lxd init"
 msgstr ""
 
-#: lxc/main.go:47
+#: lxc/main.go:49
 msgid "Ignore aliases when determining what command to run"
 msgstr ""
 
@@ -537,254 +581,238 @@ msgstr ""
 msgid "Ignore the container state (only for start)"
 msgstr "Herunterfahren des Containers erzwingen."
 
-#: lxc/image.go:422
+#: lxc/image.go:508
 msgid "Image already up to date."
 msgstr ""
 
-#: lxc/image.go:363
+#: lxc/image.go:436
 msgid "Image copied successfully!"
 msgstr ""
 
-#: lxc/image.go:546 lxc/image.go:558
+#: lxc/image.go:898
+msgid "Image exported successfully!"
+msgstr ""
+
+#: lxc/image.go:709
 #, fuzzy, c-format
 msgid "Image imported with fingerprint: %s"
 msgstr "Abbild mit Fingerabdruck %s importiert\n"
 
-#: lxc/image.go:420
+#: lxc/image.go:506
 msgid "Image refreshed successfully!"
 msgstr ""
 
-#: lxc/image.go:543
-#, c-format
-msgid "Importing the image: %s"
-msgstr ""
-
-#: lxc/remote.go:150
+#: lxc/remote.go:151
 #, c-format
 msgid "Invalid URL scheme \"%s\" in \"%s\""
 msgstr ""
 
-#: lxc/config.go:290
+#: lxc/config.go:329
 #, fuzzy
 msgid "Invalid certificate"
 msgstr "Akzeptiere Zertifikat"
 
-#: lxc/init.go:30 lxc/init.go:35
+#: lxc/init.go:31 lxc/init.go:36
 msgid "Invalid configuration key"
 msgstr ""
 
-#: lxc/file.go:357
+#: lxc/file.go:513
 #, fuzzy, c-format
 msgid "Invalid path %s"
 msgstr "Ungültiges Ziel %s"
 
-#: lxc/file.go:291
+#: lxc/file.go:443
 #, c-format
 msgid "Invalid source %s"
 msgstr "Ungültige Quelle %s"
 
-#: lxc/file.go:80
+#: lxc/file.go:221
 #, c-format
 msgid "Invalid target %s"
 msgstr "Ungültiges Ziel %s"
 
-#: lxc/info.go:126
+#: lxc/info.go:135
 msgid "Ips:"
 msgstr ""
 
-#: lxc/image.go:171
+#: lxc/image.go:174
 msgid "Keep the image up to date after initial copy"
 msgstr ""
 
-#: lxc/list.go:459
+#: lxc/list.go:464
 msgid "LAST USED AT"
 msgstr ""
 
-#: lxc/main.go:31
+#: lxc/main.go:33
 msgid "LXD socket not found; is LXD installed and running?"
 msgstr ""
 
-#: lxc/image.go:475
+#: lxc/image.go:561
 #, c-format
 msgid "Last used: %s"
 msgstr ""
 
-#: lxc/image.go:477
+#: lxc/image.go:563
 msgid "Last used: never"
 msgstr ""
 
-#: lxc/info.go:241
+#: lxc/info.go:250
 msgid "Log:"
 msgstr ""
 
-#: lxc/network.go:460
+#: lxc/network.go:506
 msgid "MANAGED"
 msgstr ""
 
-#: lxc/image.go:169
+#: lxc/image.go:172
 msgid "Make image public"
 msgstr "Veröffentliche Abbild"
 
-#: lxc/publish.go:34
+#: lxc/publish.go:35
 #, fuzzy
 msgid "Make the image public"
 msgstr "Veröffentliche Abbild"
 
-#: lxc/info.go:163
+#: lxc/info.go:172
 msgid "Memory (current)"
 msgstr ""
 
-#: lxc/info.go:167
+#: lxc/info.go:176
 msgid "Memory (peak)"
 msgstr ""
 
-#: lxc/info.go:179
+#: lxc/info.go:188
 msgid "Memory usage:"
 msgstr ""
 
-#: lxc/copy.go:276
-#, c-format
-msgid "Migration failed on source host: %s"
-msgstr ""
-
-#: lxc/copy.go:280
-#, c-format
-msgid "Migration failed on target host: %s"
-msgstr ""
-
-#: lxc/utils.go:201
+#: lxc/utils.go:199
 msgid "Missing summary."
 msgstr "Fehlende Zusammenfassung."
 
-#: lxc/network.go:248 lxc/network.go:297 lxc/storage.go:362 lxc/storage.go:462
+#: lxc/network.go:276 lxc/network.go:329 lxc/storage.go:374 lxc/storage.go:494
 msgid "More than one device matches, specify the device name."
 msgstr ""
 
-#: lxc/file.go:279
+#: lxc/file.go:431
 msgid "More than one file to download, but target is not a directory"
 msgstr ""
 "Mehr als eine Datei herunterzuladen, aber das Ziel ist kein Verzeichnis"
 
-#: lxc/move.go:35
+#: lxc/move.go:38
 #, fuzzy
 msgid "Move the container without its snapshots"
 msgstr "Herunterfahren des Containers erzwingen."
 
-#: lxc/action.go:68
+#: lxc/action.go:72
 #, fuzzy
 msgid "Must supply container name for: "
 msgstr "der Name des Ursprung Containers muss angegeben werden"
 
-#: lxc/list.go:460 lxc/network.go:458 lxc/profile.go:499 lxc/remote.go:395
-#: lxc/storage.go:607 lxc/storage.go:696
+#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:406
+#: lxc/storage.go:653 lxc/storage.go:748
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:444 lxc/remote.go:369 lxc/remote.go:374
+#: lxc/network.go:490 lxc/remote.go:380 lxc/remote.go:385
 msgid "NO"
 msgstr ""
 
-#: lxc/info.go:91
+#: lxc/info.go:99
 #, c-format
 msgid "Name: %s"
 msgstr ""
 
-#: lxc/network.go:222
+#: lxc/network.go:250
 #, fuzzy, c-format
 msgid "Network %s created"
 msgstr "Profil %s erstellt\n"
 
-#: lxc/network.go:325
+#: lxc/network.go:366
 #, fuzzy, c-format
 msgid "Network %s deleted"
 msgstr "Profil %s gelöscht\n"
 
-#: lxc/init.go:141 lxc/init.go:142
+#: lxc/init.go:142 lxc/init.go:143
 msgid "Network name"
 msgstr ""
 
-#: lxc/info.go:196
+#: lxc/info.go:205
 #, fuzzy
 msgid "Network usage:"
 msgstr "Profil %s erstellt\n"
 
-#: lxc/image.go:172 lxc/publish.go:35
+#: lxc/image.go:175 lxc/publish.go:36
 msgid "New alias to define at target"
 msgstr ""
 
-#: lxc/config.go:321
+#: lxc/config.go:360
 #, fuzzy
 msgid "No certificate provided to add"
 msgstr "Kein Zertifikat zum hinzufügen bereitgestellt"
 
-#: lxc/network.go:257 lxc/network.go:306
+#: lxc/network.go:285 lxc/network.go:338
 #, fuzzy
 msgid "No device found for this network"
 msgstr "Kein Zertifikat für diese Verbindung"
 
-#: lxc/storage.go:371 lxc/storage.go:471
+#: lxc/storage.go:383 lxc/storage.go:503
 #, fuzzy
 msgid "No device found for this storage volume."
 msgstr "Kein Zertifikat für diese Verbindung"
 
-#: lxc/config.go:344
+#: lxc/config.go:392
 msgid "No fingerprint specified."
 msgstr "Kein Fingerabdruck angegeben."
 
-#: lxc/storage.go:323 lxc/storage.go:407
+#: lxc/storage.go:327 lxc/storage.go:420
 msgid "Only \"custom\" volumes can be attached to containers."
 msgstr ""
 
-#: lxc/remote.go:135
+#: lxc/remote.go:136
 msgid "Only https URLs are supported for simplestreams"
 msgstr ""
 
-#: lxc/image.go:549
+#: lxc/image.go:632
 msgid "Only https:// is supported for remote image import."
 msgstr ""
 
-#: lxc/network.go:354 lxc/network.go:482
+#: lxc/network.go:394 lxc/network.go:528
 msgid "Only managed networks can be modified."
 msgstr ""
 
-#: lxc/help.go:71 lxc/main.go:112 lxc/main.go:163
+#: lxc/help.go:71 lxc/main.go:120 lxc/main.go:177
 msgid "Options:"
 msgstr ""
 
-#: lxc/image.go:664
-#, c-format
-msgid "Output is in %s"
-msgstr ""
-
-#: lxc/exec.go:62
+#: lxc/exec.go:63
 msgid "Override the terminal mode (auto, interactive or non-interactive)"
 msgstr ""
 
-#: lxc/list.go:611
+#: lxc/list.go:616
 msgid "PERSISTENT"
 msgstr ""
 
-#: lxc/list.go:461
+#: lxc/list.go:466
 msgid "PID"
 msgstr ""
 
-#: lxc/list.go:462
+#: lxc/list.go:467
 msgid "PROFILES"
 msgstr ""
 
-#: lxc/remote.go:397
+#: lxc/remote.go:408
 msgid "PROTOCOL"
 msgstr ""
 
-#: lxc/image.go:226 lxc/remote.go:398
+#: lxc/image.go:229 lxc/remote.go:409
 msgid "PUBLIC"
 msgstr ""
 
-#: lxc/info.go:190
+#: lxc/info.go:199
 msgid "Packets received"
 msgstr ""
 
-#: lxc/info.go:191
+#: lxc/info.go:200
 msgid "Packets sent"
 msgstr ""
 
@@ -798,25 +826,25 @@ msgstr "Alternatives config Verzeichnis."
 msgid "Path to an alternate server directory"
 msgstr "Alternatives config Verzeichnis."
 
-#: lxc/main.go:202
+#: lxc/main.go:216
 #, fuzzy
 msgid "Pause containers."
 msgstr "kann nicht zum selben Container Namen kopieren"
 
-#: lxc/main.go:35
+#: lxc/main.go:37
 msgid "Permission denied, are you in the lxd group?"
 msgstr ""
 
-#: lxc/info.go:108
+#: lxc/info.go:117
 #, c-format
 msgid "Pid: %d"
 msgstr ""
 
-#: lxc/network.go:379 lxc/profile.go:258 lxc/storage.go:536 lxc/storage.go:855
+#: lxc/network.go:419 lxc/profile.go:268 lxc/storage.go:577 lxc/storage.go:936
 msgid "Press enter to open the editor again"
 msgstr ""
 
-#: lxc/config.go:572 lxc/config.go:637 lxc/image.go:869
+#: lxc/config.go:648 lxc/config.go:713 lxc/image.go:1108
 msgid "Press enter to start the editor again"
 msgstr ""
 
@@ -832,147 +860,147 @@ msgstr ""
 msgid "Print verbose information"
 msgstr ""
 
-#: lxc/info.go:132
+#: lxc/info.go:141
 #, fuzzy, c-format
 msgid "Processes: %d"
 msgstr "Profil %s erstellt\n"
 
-#: lxc/profile.go:314
+#: lxc/profile.go:344
 #, fuzzy, c-format
 msgid "Profile %s added to %s"
 msgstr "Profil %s wurde auf %s angewandt\n"
 
-#: lxc/profile.go:209
+#: lxc/profile.go:218
 #, fuzzy, c-format
 msgid "Profile %s created"
 msgstr "Profil %s erstellt\n"
 
-#: lxc/profile.go:279
+#: lxc/profile.go:292
 #, fuzzy, c-format
 msgid "Profile %s deleted"
 msgstr "Profil %s gelöscht\n"
 
-#: lxc/profile.go:345
+#: lxc/profile.go:379
 #, fuzzy, c-format
 msgid "Profile %s removed from %s"
 msgstr "Gerät %s wurde von %s entfernt\n"
 
-#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:137 lxc/init.go:138
+#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:138 lxc/init.go:139
 #, fuzzy
 msgid "Profile to apply to the new container"
 msgstr "kann nicht zum selben Container Namen kopieren"
 
-#: lxc/profile.go:295
+#: lxc/profile.go:321
 #, fuzzy, c-format
 msgid "Profiles %s applied to %s"
 msgstr "Profil %s wurde auf %s angewandt\n"
 
-#: lxc/info.go:106
+#: lxc/info.go:115
 #, fuzzy, c-format
 msgid "Profiles: %s"
 msgstr "Profil %s erstellt\n"
 
-#: lxc/image.go:479
+#: lxc/image.go:565
 #, fuzzy
 msgid "Properties:"
 msgstr "Eigenschaften:\n"
 
-#: lxc/remote.go:69
+#: lxc/remote.go:70
 msgid "Public image server"
 msgstr ""
 
-#: lxc/image.go:462
+#: lxc/image.go:548
 #, fuzzy, c-format
 msgid "Public: %s"
 msgstr "Öffentlich: %s\n"
 
-#: lxc/file.go:65 lxc/file.go:66
+#: lxc/file.go:67 lxc/file.go:68
 msgid "Recursively push or pull files"
 msgstr ""
 
-#: lxc/image.go:413
+#: lxc/image.go:489
 #, c-format
 msgid "Refreshing the image: %s"
 msgstr ""
 
-#: lxc/remote.go:67
+#: lxc/remote.go:68
 msgid "Remote admin password"
 msgstr "Entferntes Administrator Passwort"
 
-#: lxc/info.go:93
+#: lxc/info.go:101
 #, c-format
 msgid "Remote: %s"
 msgstr ""
 
-#: lxc/delete.go:41
+#: lxc/delete.go:42
 #, c-format
 msgid "Remove %s (yes/no): "
 msgstr ""
 
-#: lxc/delete.go:35 lxc/delete.go:36
+#: lxc/delete.go:36 lxc/delete.go:37
 msgid "Require user confirmation"
 msgstr ""
 
-#: lxc/info.go:129
+#: lxc/info.go:138
 msgid "Resources:"
 msgstr ""
 
-#: lxc/main.go:210
+#: lxc/main.go:224
 #, fuzzy
 msgid "Restart containers."
 msgstr "kann nicht zum selben Container Namen kopieren"
 
-#: lxc/init.go:253
+#: lxc/init.go:286
 #, c-format
 msgid "Retrieving image: %s"
 msgstr ""
 
-#: lxc/image.go:229
+#: lxc/image.go:232
 msgid "SIZE"
 msgstr ""
 
-#: lxc/list.go:463
+#: lxc/list.go:468
 msgid "SNAPSHOTS"
 msgstr ""
 
-#: lxc/storage.go:610
+#: lxc/storage.go:656
 msgid "SOURCE"
 msgstr ""
 
-#: lxc/list.go:464
+#: lxc/list.go:469
 msgid "STATE"
 msgstr ""
 
-#: lxc/remote.go:399
+#: lxc/remote.go:410
 msgid "STATIC"
 msgstr ""
 
-#: lxc/list.go:466
+#: lxc/list.go:471
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/remote.go:240
+#: lxc/remote.go:236
 msgid "Server certificate NACKed by user"
 msgstr "Server Zertifikat vom Benutzer nicht akzeptiert"
 
-#: lxc/remote.go:302
+#: lxc/remote.go:313
 msgid "Server doesn't trust us after adding our cert"
 msgstr ""
 "Der Server vertraut uns nicht nachdem er unser Zertifikat hinzugefügt hat"
 
-#: lxc/remote.go:68
+#: lxc/remote.go:69
 msgid "Server protocol (lxd or simplestreams)"
 msgstr ""
 
-#: lxc/file.go:63
+#: lxc/file.go:65
 msgid "Set the file's gid on push"
 msgstr "Setzt die gid der Datei beim Übertragen"
 
-#: lxc/file.go:64
+#: lxc/file.go:66
 msgid "Set the file's perms on push"
 msgstr "Setzt die Dateiberechtigungen beim Übertragen"
 
-#: lxc/file.go:62
+#: lxc/file.go:64
 msgid "Set the file's uid on push"
 msgstr "Setzt die uid der Datei beim Übertragen"
 
@@ -984,81 +1012,86 @@ msgstr "Zeigt alle Befehle (nicht nur die interessanten)"
 msgid "Show client version"
 msgstr ""
 
-#: lxc/info.go:38
+#: lxc/info.go:39
 msgid "Show the container's last 100 log lines?"
 msgstr "Zeige die letzten 100 Zeilen Protokoll des Containers?"
 
-#: lxc/config.go:33
+#: lxc/config.go:35
 msgid "Show the expanded configuration"
 msgstr ""
 
-#: lxc/image.go:460
+#: lxc/image.go:546
 #, fuzzy, c-format
 msgid "Size: %.2fMB"
 msgstr "Größe: %.2vMB\n"
 
-#: lxc/info.go:210
+#: lxc/info.go:219
 msgid "Snapshots:"
 msgstr ""
 
-#: lxc/action.go:134
+#: lxc/action.go:142
 #, fuzzy, c-format
 msgid "Some containers failed to %s"
 msgstr "Anhalten des Containers fehlgeschlagen!"
 
-#: lxc/image.go:493
+#: lxc/image.go:579
 msgid "Source:"
 msgstr ""
 
-#: lxc/main.go:220
+#: lxc/main.go:234
 #, fuzzy
 msgid "Start containers."
 msgstr "kann nicht zum selben Container Namen kopieren"
 
-#: lxc/launch.go:152
+#: lxc/launch.go:59
 #, c-format
 msgid "Starting %s"
 msgstr ""
 
-#: lxc/info.go:100
+#: lxc/info.go:109
 #, c-format
 msgid "Status: %s"
 msgstr ""
 
-#: lxc/main.go:226
+#: lxc/main.go:240
 #, fuzzy
 msgid "Stop containers."
 msgstr "Anhalten des Containers fehlgeschlagen!"
 
-#: lxc/publish.go:36 lxc/publish.go:37
+#: lxc/publish.go:37 lxc/publish.go:38
 msgid "Stop the container if currently running"
 msgstr ""
 
-#: lxc/delete.go:105 lxc/publish.go:114
+#: lxc/publish.go:136
 msgid "Stopping container failed!"
 msgstr "Anhalten des Containers fehlgeschlagen!"
 
-#: lxc/storage.go:436
+#: lxc/delete.go:121
+#, fuzzy, c-format
+msgid "Stopping the container failed: %s"
+msgstr "Anhalten des Containers fehlgeschlagen!"
+
+#: lxc/storage.go:468
 #, fuzzy, c-format
 msgid "Storage pool %s created"
 msgstr "Profil %s erstellt\n"
 
-#: lxc/storage.go:486
+#: lxc/storage.go:527
 #, fuzzy, c-format
 msgid "Storage pool %s deleted"
 msgstr "Profil %s gelöscht\n"
 
-#: lxc/init.go:143 lxc/init.go:144
+#: lxc/init.go:144 lxc/init.go:145
 #, fuzzy
 msgid "Storage pool name"
 msgstr "Profilname kann nicht geändert werden"
 
-#: lxc/storage.go:720
+#: lxc/storage.go:782
 #, fuzzy, c-format
 msgid "Storage volume %s created"
 msgstr "Profil %s erstellt\n"
 
-#: lxc/storage.go:730
+#: lxc/storage.go:797
 #, fuzzy, c-format
 msgid "Storage volume %s deleted"
 msgstr "Profil %s gelöscht\n"
@@ -1068,39 +1101,44 @@ msgstr "Profil %s gelöscht\n"
 msgid "Store the container state (only for stop)"
 msgstr "Herunterfahren des Containers erzwingen."
 
-#: lxc/info.go:171
+#: lxc/info.go:180
 msgid "Swap (current)"
 msgstr ""
 
-#: lxc/info.go:175
+#: lxc/info.go:184
 msgid "Swap (peak)"
 msgstr ""
 
-#: lxc/list.go:465 lxc/network.go:459 lxc/storage.go:695
+#: lxc/list.go:470 lxc/network.go:505 lxc/storage.go:747
 msgid "TYPE"
 msgstr ""
 
-#: lxc/delete.go:91
+#: lxc/delete.go:105
 msgid "The container is currently running, stop it first or pass --force."
 msgstr ""
 
-#: lxc/publish.go:92
+#: lxc/publish.go:101
 msgid ""
 "The container is currently running. Use --force to have it stopped and "
 "restarted."
 msgstr ""
 
-#: lxc/init.go:326
+#: lxc/init.go:358
 msgid "The container you are starting doesn't have any network attached to it."
 msgstr ""
 
-#: lxc/config.go:716 lxc/config.go:728 lxc/config.go:761 lxc/config.go:779
-#: lxc/config.go:817 lxc/config.go:835
+#: lxc/config.go:770 lxc/config.go:787
+#, fuzzy
+msgid "The device already exists"
+msgstr "entfernte Instanz %s existiert bereits"
+
+#: lxc/config.go:833 lxc/config.go:845 lxc/config.go:881 lxc/config.go:899
+#: lxc/config.go:945 lxc/config.go:962 lxc/config.go:1006 lxc/config.go:1022
 #, fuzzy
 msgid "The device doesn't exist"
 msgstr "entfernte Instanz %s existiert nicht"
 
-#: lxc/init.go:310
+#: lxc/init.go:342
 #, c-format
 msgid "The local image '%s' couldn't be found, trying '%s:' instead."
 msgstr ""
@@ -1109,17 +1147,17 @@ msgstr ""
 msgid "The opposite of \"lxc pause\" is \"lxc start\"."
 msgstr ""
 
-#: lxc/network.go:262 lxc/network.go:311 lxc/storage.go:376 lxc/storage.go:476
+#: lxc/network.go:290 lxc/network.go:343 lxc/storage.go:388 lxc/storage.go:508
 #, fuzzy
 msgid "The specified device doesn't exist"
 msgstr "entfernte Instanz %s existiert nicht"
 
-#: lxc/network.go:266 lxc/network.go:315
+#: lxc/network.go:294 lxc/network.go:347
 #, fuzzy
 msgid "The specified device doesn't match the network"
 msgstr "entfernte Instanz %s existiert nicht"
 
-#: lxc/publish.go:65
+#: lxc/publish.go:74
 msgid "There is no \"image name\".  Did you want an alias?"
 msgstr ""
 
@@ -1136,50 +1174,50 @@ msgstr ""
 msgid "Time to wait for the container before killing it"
 msgstr "Wartezeit bevor der Container gestoppt wird."
 
-#: lxc/image.go:463
+#: lxc/image.go:549
 #, fuzzy
 msgid "Timestamps:"
 msgstr "Zeitstempel:\n"
 
-#: lxc/init.go:328
+#: lxc/init.go:360
 msgid "To attach a network to a container, use: lxc network attach"
 msgstr ""
 
-#: lxc/init.go:327
+#: lxc/init.go:359
 msgid "To create a new network, use: lxc network create"
 msgstr ""
 
-#: lxc/main.go:140
+#: lxc/main.go:154
 msgid "To start your first container, try: lxc launch ubuntu:16.04"
 msgstr ""
 
-#: lxc/image.go:551
+#: lxc/image.go:657
 #, c-format
 msgid "Transferring image: %s"
 msgstr ""
 
-#: lxc/action.go:98 lxc/launch.go:165
+#: lxc/action.go:106 lxc/launch.go:77
 #, c-format
 msgid "Try `lxc info --show-log %s` for more info"
 msgstr ""
 
-#: lxc/info.go:102
+#: lxc/info.go:111
 msgid "Type: ephemeral"
 msgstr ""
 
-#: lxc/info.go:104
+#: lxc/info.go:113
 msgid "Type: persistent"
 msgstr ""
 
-#: lxc/image.go:230
+#: lxc/image.go:233
 msgid "UPLOAD DATE"
 msgstr ""
 
-#: lxc/remote.go:396
+#: lxc/remote.go:407
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:462 lxc/profile.go:500 lxc/storage.go:611 lxc/storage.go:698
+#: lxc/network.go:508 lxc/profile.go:556 lxc/storage.go:657 lxc/storage.go:750
 msgid "USED BY"
 msgstr ""
 
@@ -1187,11 +1225,16 @@ msgstr ""
 msgid "Unable to find help2man."
 msgstr ""
 
-#: lxc/remote.go:110
+#: lxc/remote.go:111
 msgid "Unable to read remote TLS certificate"
 msgstr ""
 
-#: lxc/image.go:468
+#: lxc/file.go:108
+#, fuzzy, c-format
+msgid "Unknown file type '%s'"
+msgstr "Unbekannter Befehl %s für Abbild"
+
+#: lxc/image.go:554
 #, c-format
 msgid "Uploaded: %s"
 msgstr ""
@@ -1214,7 +1257,7 @@ msgstr ""
 "Benutzung: lxc [Unterbefehl] [Optionen]\n"
 "Verfügbare Befehle:\n"
 
-#: lxc/config.go:58
+#: lxc/config.go:60
 #, fuzzy
 msgid ""
 "Usage: lxc config <subcommand> [options]\n"
@@ -1337,7 +1380,7 @@ msgstr ""
 "\n"
 "lxc copy <Quelle> <Ziel>\n"
 
-#: lxc/delete.go:26
+#: lxc/delete.go:27
 #, fuzzy
 msgid ""
 "Usage: lxc delete [<remote>:]<container>[/<snapshot>] "
@@ -1350,7 +1393,7 @@ msgstr ""
 "Entfernt einen Container (oder Sicherungspunkt) und alle dazugehörigen\n"
 "Daten (Konfiguration, Sicherungspunkte, ...).\n"
 
-#: lxc/exec.go:52
+#: lxc/exec.go:53
 #, fuzzy
 msgid ""
 "Usage: lxc exec [<remote>:]<container> [-t] [-T] [-n] [--mode=auto|"
@@ -1365,7 +1408,7 @@ msgstr ""
 "\n"
 "lxc exec <Container> [--env EDITOR=/usr/bin/vim]... <Befehl>\n"
 
-#: lxc/file.go:36
+#: lxc/file.go:38
 #, fuzzy
 msgid ""
 "Usage: lxc file <subcommand> [options]\n"
@@ -1418,7 +1461,7 @@ msgid ""
 "Help page for the LXD client."
 msgstr ""
 
-#: lxc/image.go:69
+#: lxc/image.go:72
 msgid ""
 "Usage: lxc image <subcommand> [options]\n"
 "\n"
@@ -1523,7 +1566,7 @@ msgid ""
 "image alias name."
 msgstr ""
 
-#: lxc/info.go:25
+#: lxc/info.go:26
 msgid ""
 "Usage: lxc info [<remote>:][<container>] [--show-log]\n"
 "\n"
@@ -1536,7 +1579,7 @@ msgid ""
 "    For LXD server information."
 msgstr ""
 
-#: lxc/init.go:75
+#: lxc/init.go:76
 #, fuzzy
 msgid ""
 "Usage: lxc init [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--"
@@ -1563,7 +1606,7 @@ msgstr ""
 "Beispiel:\n"
 "lxc launch ubuntu u1\n"
 
-#: lxc/launch.go:23
+#: lxc/launch.go:20
 #, fuzzy
 msgid ""
 "Usage: lxc launch [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--"
@@ -1719,7 +1762,7 @@ msgid ""
 "    Only show log message."
 msgstr ""
 
-#: lxc/move.go:19
+#: lxc/move.go:22
 #, fuzzy
 msgid ""
 "Usage: lxc move [<remote>:]<container>[/<snapshot>] [<remote>:][<container>[/"
@@ -1742,7 +1785,7 @@ msgstr ""
 "\n"
 "lxc move <Quelle> <Ziel>\n"
 
-#: lxc/network.go:49
+#: lxc/network.go:50
 msgid ""
 "Usage: lxc network <subcommand> [options]\n"
 "\n"
@@ -1795,7 +1838,7 @@ msgid ""
 "    Update a network using the content of network.yaml"
 msgstr ""
 
-#: lxc/profile.go:49
+#: lxc/profile.go:51
 #, fuzzy
 msgid ""
 "Usage: lxc profile <subcommand> [options]\n"
@@ -1911,7 +1954,7 @@ msgstr ""
 "Containern hinzu,\n"
 "    die dieses Profil verwenden.\n"
 
-#: lxc/publish.go:27
+#: lxc/publish.go:28
 msgid ""
 "Usage: lxc publish [<remote>:]<container>[/<snapshot>] [<remote>:] [--"
 "alias=ALIAS...] [prop-key=prop-value...]\n"
@@ -1919,7 +1962,7 @@ msgid ""
 "Publish containers as images."
 msgstr ""
 
-#: lxc/remote.go:38
+#: lxc/remote.go:39
 #, fuzzy
 msgid ""
 "Usage: lxc remote <subcommand> [options]\n"
@@ -1965,7 +2008,7 @@ msgstr ""
 "lxc remote get-default                                                    "
 "Gibt die Standard Instanz aus.\n"
 
-#: lxc/restore.go:21
+#: lxc/restore.go:22
 msgid ""
 "Usage: lxc restore [<remote>:]<container> <snapshot> [--stateful]\n"
 "\n"
@@ -1981,7 +2024,7 @@ msgid ""
 "    Restore the snapshot."
 msgstr ""
 
-#: lxc/snapshot.go:21
+#: lxc/snapshot.go:22
 msgid ""
 "Usage: lxc snapshot [<remote>:]<container> <snapshot name> [--stateful]\n"
 "\n"
@@ -1995,7 +2038,7 @@ msgid ""
 "    Create a snapshot of \"u1\" called \"snap0\"."
 msgstr ""
 
-#: lxc/storage.go:61
+#: lxc/storage.go:62
 msgid ""
 "Usage: lxc storage <subcommand> [options]\n"
 "\n"
@@ -2099,11 +2142,11 @@ msgstr ""
 "\n"
 "lxc version\n"
 
-#: lxc/delete.go:45
+#: lxc/delete.go:46
 msgid "User aborted delete operation."
 msgstr ""
 
-#: lxc/restore.go:37
+#: lxc/restore.go:38
 msgid ""
 "Whether or not to restore the container's running state from snapshot (if "
 "available)"
@@ -2111,153 +2154,138 @@ msgstr ""
 "Laufenden Zustand des Containers aus dem Sicherungspunkt (falls vorhanden) "
 "wiederherstellen oder nicht"
 
-#: lxc/snapshot.go:35
+#: lxc/snapshot.go:36
 msgid "Whether or not to snapshot the container's running state"
 msgstr "Zustand des laufenden Containers sichern oder nicht"
 
-#: lxc/network.go:446 lxc/remote.go:371 lxc/remote.go:376
+#: lxc/network.go:492 lxc/remote.go:382 lxc/remote.go:387
 msgid "YES"
 msgstr ""
 
-#: lxc/exec.go:125
+#: lxc/exec.go:126
 msgid "You can't pass -t and -T at the same time"
 msgstr ""
 
-#: lxc/exec.go:129
+#: lxc/exec.go:130
 #, fuzzy
 msgid "You can't pass -t or -T at the same time as --mode"
 msgstr "kann nicht zum selben Container Namen kopieren"
 
-#: lxc/main.go:56
-msgid "`lxc config profile` is deprecated, please use `lxc profile`"
-msgstr ""
-
-#: lxc/launch.go:134
-msgid "bad number of things scanned from image, container or snapshot"
-msgstr ""
-"Falsche Anzahl an Objekten im Abbild, Container oder Sicherungspunkt gelesen."
-
-#: lxc/action.go:94
-msgid "bad result type from action"
-msgstr ""
-
-#: lxc/copy.go:118
-msgid "can't copy to the same container name"
-msgstr "kann nicht zum selben Container Namen kopieren"
+#: lxc/copy.go:57
+#, fuzzy
+msgid "You must specify a source container name"
+msgstr "der Name des Ursprung Containers muss angegeben werden"
 
-#: lxc/file.go:314
-msgid "can't pull a directory without --recursive"
+#: lxc/main.go:58
+msgid "`lxc config profile` is deprecated, please use `lxc profile`"
 msgstr ""
 
-#: lxc/remote.go:359
+#: lxc/remote.go:370
 msgid "can't remove the default remote"
 msgstr ""
 
-#: lxc/file.go:125
+#: lxc/file.go:269
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr ""
 
-#: lxc/remote.go:385
+#: lxc/remote.go:396
 msgid "default"
 msgstr ""
 
-#: lxc/copy.go:134 lxc/copy.go:139 lxc/copy.go:258 lxc/copy.go:263
-#: lxc/init.go:234 lxc/init.go:239 lxc/launch.go:115 lxc/launch.go:121
+#: lxc/init.go:308
 msgid "didn't get any affected image, container or snapshot from server"
 msgstr ""
 
-#: lxc/image.go:454
+#: lxc/image.go:540
 msgid "disabled"
 msgstr ""
 
-#: lxc/image.go:456
+#: lxc/image.go:542
 msgid "enabled"
 msgstr ""
 
-#: lxc/action.go:126 lxc/main.go:26 lxc/main.go:159
+#: lxc/action.go:134 lxc/main.go:28 lxc/main.go:173
 #, fuzzy, c-format
 msgid "error: %v"
 msgstr "Fehler: %v\n"
 
-#: lxc/help.go:37 lxc/main.go:106
+#: lxc/help.go:37 lxc/main.go:114
 #, fuzzy, c-format
 msgid "error: unknown command: %s"
 msgstr "Fehler: unbekannter Befehl: %s\n"
 
-#: lxc/launch.go:139
-msgid "got bad version"
-msgstr "Versionskonflikt"
-
-#: lxc/image.go:202 lxc/image.go:449
+#: lxc/image.go:205 lxc/image.go:535
 msgid "no"
 msgstr ""
 
-#: lxc/copy.go:167
-msgid "not all the profiles from the source exist on the target"
-msgstr "nicht alle Profile der Quelle sind am Ziel vorhanden."
-
-#: lxc/remote.go:233
+#: lxc/remote.go:229
 #, fuzzy
 msgid "ok (y/n)?"
 msgstr "OK (y/n)? "
 
-#: lxc/main.go:331 lxc/main.go:335
+#: lxc/main.go:345 lxc/main.go:349
 #, c-format
 msgid "processing aliases failed %s\n"
 msgstr ""
 
-#: lxc/file.go:381
+#: lxc/file.go:541
 msgid "recursive edit doesn't make sense :("
 msgstr ""
 
-#: lxc/remote.go:421
+#: lxc/remote.go:432
 #, c-format
 msgid "remote %s already exists"
 msgstr "entfernte Instanz %s existiert bereits"
 
-#: lxc/remote.go:351 lxc/remote.go:413 lxc/remote.go:448 lxc/remote.go:464
+#: lxc/remote.go:362 lxc/remote.go:424 lxc/remote.go:459 lxc/remote.go:475
 #, c-format
 msgid "remote %s doesn't exist"
 msgstr "entfernte Instanz %s existiert nicht"
 
-#: lxc/remote.go:334
+#: lxc/remote.go:345
 #, c-format
 msgid "remote %s exists as <%s>"
 msgstr "entfernte Instanz %s existiert als <%s>"
 
-#: lxc/remote.go:355 lxc/remote.go:417 lxc/remote.go:452
+#: lxc/remote.go:366 lxc/remote.go:428 lxc/remote.go:463
 #, c-format
 msgid "remote %s is static and cannot be modified"
 msgstr ""
 
-#: lxc/info.go:221
+#: lxc/info.go:230
 msgid "stateful"
 msgstr ""
 
-#: lxc/info.go:223
+#: lxc/info.go:232
 msgid "stateless"
 msgstr ""
 
-#: lxc/info.go:217
+#: lxc/info.go:226
 #, c-format
 msgid "taken at %s"
 msgstr ""
 
-#: lxc/exec.go:214
-msgid "unreachable return reached"
-msgstr ""
-
-#: lxc/main.go:262
+#: lxc/main.go:276
 msgid "wrong number of subcommand arguments"
 msgstr "falsche Anzahl an Parametern für Unterbefehl"
 
-#: lxc/delete.go:44 lxc/image.go:200 lxc/image.go:451
+#: lxc/delete.go:45 lxc/image.go:203 lxc/image.go:537
 msgid "yes"
 msgstr ""
 
-#: lxc/copy.go:47
-msgid "you must specify a source container name"
-msgstr "der Name des Ursprung Containers muss angegeben werden"
+#~ msgid "can't copy to the same container name"
+#~ msgstr "kann nicht zum selben Container Namen kopieren"
+
+#~ msgid "not all the profiles from the source exist on the target"
+#~ msgstr "nicht alle Profile der Quelle sind am Ziel vorhanden."
+
+#~ msgid "bad number of things scanned from image, container or snapshot"
+#~ msgstr ""
+#~ "Falsche Anzahl an Objekten im Abbild, Container oder Sicherungspunkt "
+#~ "gelesen."
+
+#~ msgid "got bad version"
+#~ msgstr "Versionskonflikt"
 
 #, fuzzy
 #~ msgid ""
@@ -2317,10 +2345,6 @@ msgstr "der Name des Ursprung Containers muss angegeben werden"
 #~ "Abbilder importieren.\n"
 
 #, fuzzy
-#~ msgid "Bad image property: %s"
-#~ msgstr "Ungültige Abbild Eigenschaft: %s\n"
-
-#, fuzzy
 #~ msgid ""
 #~ "Create a read-only snapshot of a container.\n"
 #~ "\n"
@@ -2417,10 +2441,6 @@ msgstr "der Name des Ursprung Containers muss angegeben werden"
 #~ msgstr "Falsche Version in Profil URL"
 
 #, fuzzy
-#~ msgid "device already exists"
-#~ msgstr "entfernte Instanz %s existiert bereits"
-
-#, fuzzy
 #~ msgid "error."
 #~ msgstr "Fehler: %v\n"
 
@@ -2467,10 +2487,6 @@ msgstr "der Name des Ursprung Containers muss angegeben werden"
 #~ msgstr "ungültiges Argument %s"
 
 #, fuzzy
-#~ msgid "unknown profile cmd %s"
-#~ msgstr "Unbekannter Befehl %s für Abbild"
-
-#, fuzzy
 #~ msgid "Publish to remote server is not supported yet"
 #~ msgstr ""
 #~ "Anzeigen von Informationen über entfernte Instanzen wird noch nicht "
diff --git a/po/el.po b/po/el.po
index f7f53110d..06e5517b2 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-06-13 20:10+0200\n"
+"POT-Creation-Date: 2017-06-17 03:18+0000\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/"
@@ -19,7 +19,7 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 2.12-dev\n"
 
-#: lxc/storage.go:30
+#: lxc/storage.go:31
 msgid ""
 "### This is a yaml representation of a storage pool.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -36,7 +36,7 @@ msgid ""
 "###   zfs.pool_name: default"
 msgstr ""
 
-#: lxc/storage.go:47
+#: lxc/storage.go:48
 msgid ""
 "### This is a yaml representation of a storage volume.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -50,7 +50,7 @@ msgid ""
 "###   size: \"61203283968\""
 msgstr ""
 
-#: lxc/config.go:37
+#: lxc/config.go:39
 msgid ""
 "### This is a yaml representation of the configuration.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -71,7 +71,7 @@ msgid ""
 "### Note that the name is shown but cannot be changed"
 msgstr ""
 
-#: lxc/image.go:59
+#: lxc/image.go:62
 msgid ""
 "### This is a yaml representation of the image properties.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -81,7 +81,7 @@ msgid ""
 "###  description: My custom image"
 msgstr ""
 
-#: lxc/network.go:29
+#: lxc/network.go:30
 msgid ""
 "### This is a yaml representation of the network.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -101,7 +101,7 @@ msgid ""
 "### Note that only the configuration can be changed."
 msgstr ""
 
-#: lxc/profile.go:28
+#: lxc/profile.go:30
 msgid ""
 "### This is a yaml representation of the profile.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -122,107 +122,131 @@ msgid ""
 "### Note that the name is shown but cannot be changed"
 msgstr ""
 
-#: lxc/image.go:179
+#: lxc/image.go:182
 #, c-format
 msgid "%s (%d more)"
 msgstr ""
 
-#: lxc/snapshot.go:58
+#: lxc/file.go:183
+#, c-format
+msgid "%s is not a directory"
+msgstr ""
+
+#: lxc/file.go:125
+#, c-format
+msgid "'%s' isn't a regular file or directory."
+msgstr ""
+
+#: lxc/snapshot.go:53
 msgid "'/' not allowed in snapshot name"
 msgstr ""
 
-#: lxc/profile.go:293
+#: lxc/profile.go:319
 msgid "(none)"
 msgstr ""
 
-#: lxc/image.go:223 lxc/image.go:814
+#: lxc/image.go:226 lxc/image.go:1052
 msgid "ALIAS"
 msgstr ""
 
-#: lxc/image.go:224
+#: lxc/image.go:227
 msgid "ALIASES"
 msgstr ""
 
-#: lxc/image.go:228
+#: lxc/image.go:231
 msgid "ARCH"
 msgstr ""
 
-#: lxc/list.go:456
+#: lxc/list.go:461
 msgid "ARCHITECTURE"
 msgstr ""
 
-#: lxc/remote.go:66
+#: lxc/remote.go:67
 msgid "Accept certificate"
 msgstr ""
 
-#: lxc/remote.go:282
+#: lxc/remote.go:281
 #, c-format
 msgid "Admin password for %s: "
 msgstr ""
 
-#: lxc/image.go:483
+#: lxc/image.go:569
 msgid "Aliases:"
 msgstr ""
 
-#: lxc/image.go:461 lxc/info.go:95
+#: lxc/image.go:547 lxc/info.go:104
 #, c-format
 msgid "Architecture: %s"
 msgstr ""
 
-#: lxc/image.go:491
+#: lxc/image.go:577
 #, c-format
 msgid "Auto update: %s"
 msgstr ""
 
-#: lxc/info.go:188
+#: lxc/image.go:651
+#, c-format
+msgid "Bad property: %s"
+msgstr ""
+
+#: lxc/info.go:197
 msgid "Bytes received"
 msgstr ""
 
-#: lxc/info.go:189
+#: lxc/info.go:198
 msgid "Bytes sent"
 msgstr ""
 
-#: lxc/config.go:310
+#: lxc/config.go:349
 msgid "COMMON NAME"
 msgstr ""
 
-#: lxc/info.go:152
+#: lxc/info.go:161
 msgid "CPU usage (in seconds)"
 msgstr ""
 
-#: lxc/info.go:156
+#: lxc/info.go:165
 #, fuzzy
 msgid "CPU usage:"
 msgstr "  Χρήση CPU:"
 
-#: lxc/list.go:457
+#: lxc/list.go:462
 msgid "CREATED AT"
 msgstr ""
 
-#: lxc/config.go:150 lxc/network.go:496
+#: lxc/file.go:470
+msgid "Can't pull a directory without --recursive"
+msgstr ""
+
+#: lxc/config.go:156 lxc/network.go:542
 #, c-format
 msgid "Can't read from stdin: %s"
 msgstr ""
 
-#: lxc/config.go:163 lxc/config.go:196 lxc/config.go:218
+#: lxc/config.go:169
+#, c-format
+msgid "Can't unset key '%s', it's not currently set"
+msgstr ""
+
+#: lxc/config.go:211 lxc/config.go:237
 #, c-format
 msgid "Can't unset key '%s', it's not currently set."
 msgstr ""
 
-#: lxc/network.go:422 lxc/profile.go:472 lxc/storage.go:579
+#: lxc/network.go:468 lxc/profile.go:528 lxc/storage.go:625
 msgid "Cannot provide container name to list"
 msgstr ""
 
-#: lxc/remote.go:232
+#: lxc/remote.go:228
 #, c-format
 msgid "Certificate fingerprint: %s"
 msgstr ""
 
-#: lxc/remote.go:305
+#: lxc/remote.go:316
 msgid "Client certificate stored at server: "
 msgstr ""
 
-#: lxc/image.go:167 lxc/image.go:168 lxc/list.go:128 lxc/list.go:129
+#: lxc/image.go:170 lxc/image.go:171 lxc/list.go:128 lxc/list.go:129
 msgid "Columns"
 msgstr ""
 
@@ -230,35 +254,35 @@ msgstr ""
 msgid "Commands:"
 msgstr ""
 
-#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:135 lxc/init.go:136
+#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:136 lxc/init.go:137
 msgid "Config key/value to apply to the new container"
 msgstr ""
 
-#: lxc/config.go:571 lxc/config.go:636 lxc/image.go:868 lxc/network.go:378
-#: lxc/profile.go:257 lxc/storage.go:535 lxc/storage.go:854
+#: lxc/config.go:647 lxc/config.go:712 lxc/image.go:1107 lxc/network.go:418
+#: lxc/profile.go:267 lxc/storage.go:576 lxc/storage.go:935
 #, c-format
 msgid "Config parsing error: %s"
 msgstr ""
 
-#: lxc/main.go:33
+#: lxc/main.go:35
 msgid "Connection refused; is LXD running?"
 msgstr ""
 
-#: lxc/publish.go:62
+#: lxc/publish.go:71
 msgid "Container name is mandatory"
 msgstr ""
 
-#: lxc/copy.go:143 lxc/copy.go:267 lxc/init.go:244
+#: lxc/copy.go:210 lxc/init.go:313
 #, c-format
 msgid "Container name is: %s"
 msgstr ""
 
-#: lxc/publish.go:160 lxc/publish.go:175
+#: lxc/publish.go:250
 #, c-format
 msgid "Container published with fingerprint: %s"
 msgstr ""
 
-#: lxc/image.go:170
+#: lxc/image.go:173
 msgid "Copy aliases from source"
 msgstr ""
 
@@ -266,86 +290,91 @@ msgstr ""
 msgid "Copy the container without its snapshots"
 msgstr ""
 
-#: lxc/image.go:360
+#: lxc/image.go:422
 #, c-format
 msgid "Copying the image: %s"
 msgstr ""
 
-#: lxc/remote.go:247
+#: lxc/remote.go:243
 msgid "Could not create server cert dir"
 msgstr ""
 
-#: lxc/file.go:67 lxc/file.go:68
+#: lxc/file.go:69 lxc/file.go:70
 msgid "Create any directories necessary"
 msgstr ""
 
-#: lxc/image.go:466 lxc/info.go:97
+#: lxc/image.go:552 lxc/info.go:106
 #, c-format
 msgid "Created: %s"
 msgstr ""
 
-#: lxc/init.go:182 lxc/launch.go:142
+#: lxc/init.go:194
 #, c-format
 msgid "Creating %s"
 msgstr ""
 
-#: lxc/init.go:180
+#: lxc/init.go:192
 msgid "Creating the container"
 msgstr ""
 
-#: lxc/image.go:227 lxc/image.go:816 lxc/list.go:458 lxc/network.go:461
-#: lxc/storage.go:608 lxc/storage.go:697
+#: lxc/image.go:230 lxc/image.go:1054 lxc/list.go:463 lxc/network.go:507
+#: lxc/storage.go:654 lxc/storage.go:749
 msgid "DESCRIPTION"
 msgstr ""
 
-#: lxc/storage.go:609
+#: lxc/storage.go:655
 msgid "DRIVER"
 msgstr ""
 
-#: lxc/publish.go:38
+#: lxc/publish.go:39
 msgid "Define a compression algorithm: for image or none"
 msgstr ""
 
-#: lxc/config.go:688
+#: lxc/config.go:803
 #, c-format
 msgid "Device %s added to %s"
 msgstr ""
 
-#: lxc/config.go:875
+#: lxc/config.go:1037
 #, c-format
 msgid "Device %s removed from %s"
 msgstr ""
 
-#: lxc/exec.go:64
-msgid "Disable pseudo-terminal allocation"
+#: lxc/utils.go:248 lxc/utils.go:272
+#, c-format
+msgid "Device already exists: %s"
 msgstr ""
 
 #: lxc/exec.go:65
+msgid "Disable pseudo-terminal allocation"
+msgstr ""
+
+#: lxc/exec.go:66
 msgid "Disable stdin (reads from /dev/null)"
 msgstr ""
 
-#: lxc/info.go:145
+#: lxc/info.go:154
 #, fuzzy
 msgid "Disk usage:"
 msgstr "  Χρήση CPU:"
 
-#: lxc/list.go:609
+#: lxc/list.go:614
 msgid "EPHEMERAL"
 msgstr ""
 
-#: lxc/config.go:312
+#: lxc/config.go:351
 msgid "EXPIRY DATE"
 msgstr ""
 
-#: lxc/main.go:45
+#: lxc/main.go:47
 msgid "Enable debug mode"
 msgstr ""
 
-#: lxc/main.go:44
+#: lxc/main.go:46
 msgid "Enable verbose mode"
 msgstr ""
 
-#: lxc/exec.go:61
+#: lxc/exec.go:62
 msgid "Environment variable to set (e.g. HOME=/home/foo)"
 msgstr ""
 
@@ -353,7 +382,7 @@ msgstr ""
 msgid "Environment:"
 msgstr ""
 
-#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:139 lxc/init.go:140
+#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:140 lxc/init.go:141
 msgid "Ephemeral container"
 msgstr ""
 
@@ -361,16 +390,21 @@ msgstr ""
 msgid "Event type to listen for"
 msgstr ""
 
-#: lxc/image.go:470
+#: lxc/image.go:556
 #, c-format
 msgid "Expires: %s"
 msgstr ""
 
-#: lxc/image.go:472
+#: lxc/image.go:558
 msgid "Expires: never"
 msgstr ""
 
-#: lxc/config.go:309 lxc/image.go:225 lxc/image.go:815
+#: lxc/image.go:848
+#, c-format
+msgid "Exporting the image: %s"
+msgstr ""
+
+#: lxc/config.go:348 lxc/image.go:228 lxc/image.go:1053
 msgid "FINGERPRINT"
 msgstr ""
 
@@ -384,16 +418,25 @@ msgstr ""
 msgid "Failed to generate 'lxc.1': %v"
 msgstr ""
 
+#: lxc/copy.go:205
+msgid "Failed to get the new container name"
+msgstr ""
+
+#: lxc/file.go:120
+#, c-format
+msgid "Failed to walk path for %s: %s"
+msgstr ""
+
 #: lxc/list.go:131
 msgid "Fast mode (same as --columns=nsacPt)"
 msgstr ""
 
-#: lxc/image.go:459
+#: lxc/image.go:545
 #, c-format
 msgid "Fingerprint: %s"
 msgstr ""
 
-#: lxc/exec.go:63
+#: lxc/exec.go:64
 msgid "Force pseudo-terminal allocation"
 msgstr ""
 
@@ -401,39 +444,39 @@ msgstr ""
 msgid "Force the container to shutdown"
 msgstr ""
 
-#: lxc/delete.go:33 lxc/delete.go:34
+#: lxc/delete.go:34 lxc/delete.go:35
 msgid "Force the removal of stopped containers"
 msgstr ""
 
-#: lxc/main.go:46
+#: lxc/main.go:48
 msgid "Force using the local unix socket"
 msgstr ""
 
-#: lxc/image.go:173 lxc/list.go:130
+#: lxc/image.go:176 lxc/list.go:130
 msgid "Format (csv|json|table|yaml)"
 msgstr ""
 
-#: lxc/remote.go:80
+#: lxc/remote.go:81
 msgid "Generating a client certificate. This may take a minute..."
 msgstr ""
 
-#: lxc/list.go:454
+#: lxc/list.go:459
 msgid "IPV4"
 msgstr ""
 
-#: lxc/list.go:455
+#: lxc/list.go:460
 msgid "IPV6"
 msgstr ""
 
-#: lxc/config.go:311
+#: lxc/config.go:350
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:139
+#: lxc/main.go:153
 msgid "If this is your first time using LXD, you should also run: lxd init"
 msgstr ""
 
-#: lxc/main.go:47
+#: lxc/main.go:49
 msgid "Ignore aliases when determining what command to run"
 msgstr ""
 
@@ -441,247 +484,231 @@ msgstr ""
 msgid "Ignore the container state (only for start)"
 msgstr ""
 
-#: lxc/image.go:422
+#: lxc/image.go:508
 msgid "Image already up to date."
 msgstr ""
 
-#: lxc/image.go:363
+#: lxc/image.go:436
 msgid "Image copied successfully!"
 msgstr ""
 
-#: lxc/image.go:546 lxc/image.go:558
+#: lxc/image.go:898
+msgid "Image exported successfully!"
+msgstr ""
+
+#: lxc/image.go:709
 #, c-format
 msgid "Image imported with fingerprint: %s"
 msgstr ""
 
-#: lxc/image.go:420
+#: lxc/image.go:506
 msgid "Image refreshed successfully!"
 msgstr ""
 
-#: lxc/image.go:543
-#, c-format
-msgid "Importing the image: %s"
-msgstr ""
-
-#: lxc/remote.go:150
+#: lxc/remote.go:151
 #, c-format
 msgid "Invalid URL scheme \"%s\" in \"%s\""
 msgstr ""
 
-#: lxc/config.go:290
+#: lxc/config.go:329
 msgid "Invalid certificate"
 msgstr ""
 
-#: lxc/init.go:30 lxc/init.go:35
+#: lxc/init.go:31 lxc/init.go:36
 msgid "Invalid configuration key"
 msgstr ""
 
-#: lxc/file.go:357
+#: lxc/file.go:513
 #, c-format
 msgid "Invalid path %s"
 msgstr ""
 
-#: lxc/file.go:291
+#: lxc/file.go:443
 #, c-format
 msgid "Invalid source %s"
 msgstr ""
 
-#: lxc/file.go:80
+#: lxc/file.go:221
 #, c-format
 msgid "Invalid target %s"
 msgstr ""
 
-#: lxc/info.go:126
+#: lxc/info.go:135
 msgid "Ips:"
 msgstr ""
 
-#: lxc/image.go:171
+#: lxc/image.go:174
 msgid "Keep the image up to date after initial copy"
 msgstr ""
 
-#: lxc/list.go:459
+#: lxc/list.go:464
 msgid "LAST USED AT"
 msgstr ""
 
-#: lxc/main.go:31
+#: lxc/main.go:33
 msgid "LXD socket not found; is LXD installed and running?"
 msgstr ""
 
-#: lxc/image.go:475
+#: lxc/image.go:561
 #, c-format
 msgid "Last used: %s"
 msgstr ""
 
-#: lxc/image.go:477
+#: lxc/image.go:563
 msgid "Last used: never"
 msgstr ""
 
-#: lxc/info.go:241
+#: lxc/info.go:250
 msgid "Log:"
 msgstr ""
 
-#: lxc/network.go:460
+#: lxc/network.go:506
 msgid "MANAGED"
 msgstr ""
 
-#: lxc/image.go:169
+#: lxc/image.go:172
 msgid "Make image public"
 msgstr ""
 
-#: lxc/publish.go:34
+#: lxc/publish.go:35
 msgid "Make the image public"
 msgstr ""
 
-#: lxc/info.go:163
+#: lxc/info.go:172
 msgid "Memory (current)"
 msgstr ""
 
-#: lxc/info.go:167
+#: lxc/info.go:176
 msgid "Memory (peak)"
 msgstr ""
 
-#: lxc/info.go:179
+#: lxc/info.go:188
 #, fuzzy
 msgid "Memory usage:"
 msgstr "  Χρήση μνήμης:"
 
-#: lxc/copy.go:276
-#, c-format
-msgid "Migration failed on source host: %s"
-msgstr ""
-
-#: lxc/copy.go:280
-#, c-format
-msgid "Migration failed on target host: %s"
-msgstr ""
-
-#: lxc/utils.go:201
+#: lxc/utils.go:199
 msgid "Missing summary."
 msgstr ""
 
-#: lxc/network.go:248 lxc/network.go:297 lxc/storage.go:362 lxc/storage.go:462
+#: lxc/network.go:276 lxc/network.go:329 lxc/storage.go:374 lxc/storage.go:494
 msgid "More than one device matches, specify the device name."
 msgstr ""
 
-#: lxc/file.go:279
+#: lxc/file.go:431
 msgid "More than one file to download, but target is not a directory"
 msgstr ""
 
-#: lxc/move.go:35
+#: lxc/move.go:38
 msgid "Move the container without its snapshots"
 msgstr ""
 
-#: lxc/action.go:68
+#: lxc/action.go:72
 msgid "Must supply container name for: "
 msgstr ""
 
-#: lxc/list.go:460 lxc/network.go:458 lxc/profile.go:499 lxc/remote.go:395
-#: lxc/storage.go:607 lxc/storage.go:696
+#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:406
+#: lxc/storage.go:653 lxc/storage.go:748
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:444 lxc/remote.go:369 lxc/remote.go:374
+#: lxc/network.go:490 lxc/remote.go:380 lxc/remote.go:385
 msgid "NO"
 msgstr ""
 
-#: lxc/info.go:91
+#: lxc/info.go:99
 #, c-format
 msgid "Name: %s"
 msgstr ""
 
-#: lxc/network.go:222
+#: lxc/network.go:250
 #, c-format
 msgid "Network %s created"
 msgstr ""
 
-#: lxc/network.go:325
+#: lxc/network.go:366
 #, c-format
 msgid "Network %s deleted"
 msgstr ""
 
-#: lxc/init.go:141 lxc/init.go:142
+#: lxc/init.go:142 lxc/init.go:143
 msgid "Network name"
 msgstr ""
 
-#: lxc/info.go:196
+#: lxc/info.go:205
 #, fuzzy
 msgid "Network usage:"
 msgstr "  Χρήση δικτύου:"
 
-#: lxc/image.go:172 lxc/publish.go:35
+#: lxc/image.go:175 lxc/publish.go:36
 msgid "New alias to define at target"
 msgstr ""
 
-#: lxc/config.go:321
+#: lxc/config.go:360
 msgid "No certificate provided to add"
 msgstr ""
 
-#: lxc/network.go:257 lxc/network.go:306
+#: lxc/network.go:285 lxc/network.go:338
 msgid "No device found for this network"
 msgstr ""
 
-#: lxc/storage.go:371 lxc/storage.go:471
+#: lxc/storage.go:383 lxc/storage.go:503
 msgid "No device found for this storage volume."
 msgstr ""
 
-#: lxc/config.go:344
+#: lxc/config.go:392
 msgid "No fingerprint specified."
 msgstr ""
 
-#: lxc/storage.go:323 lxc/storage.go:407
+#: lxc/storage.go:327 lxc/storage.go:420
 msgid "Only \"custom\" volumes can be attached to containers."
 msgstr ""
 
-#: lxc/remote.go:135
+#: lxc/remote.go:136
 msgid "Only https URLs are supported for simplestreams"
 msgstr ""
 
-#: lxc/image.go:549
+#: lxc/image.go:632
 msgid "Only https:// is supported for remote image import."
 msgstr ""
 
-#: lxc/network.go:354 lxc/network.go:482
+#: lxc/network.go:394 lxc/network.go:528
 msgid "Only managed networks can be modified."
 msgstr ""
 
-#: lxc/help.go:71 lxc/main.go:112 lxc/main.go:163
+#: lxc/help.go:71 lxc/main.go:120 lxc/main.go:177
 msgid "Options:"
 msgstr ""
 
-#: lxc/image.go:664
-#, c-format
-msgid "Output is in %s"
-msgstr ""
-
-#: lxc/exec.go:62
+#: lxc/exec.go:63
 msgid "Override the terminal mode (auto, interactive or non-interactive)"
 msgstr ""
 
-#: lxc/list.go:611
+#: lxc/list.go:616
 msgid "PERSISTENT"
 msgstr ""
 
-#: lxc/list.go:461
+#: lxc/list.go:466
 msgid "PID"
 msgstr ""
 
-#: lxc/list.go:462
+#: lxc/list.go:467
 msgid "PROFILES"
 msgstr ""
 
-#: lxc/remote.go:397
+#: lxc/remote.go:408
 msgid "PROTOCOL"
 msgstr ""
 
-#: lxc/image.go:226 lxc/remote.go:398
+#: lxc/image.go:229 lxc/remote.go:409
 msgid "PUBLIC"
 msgstr ""
 
-#: lxc/info.go:190
+#: lxc/info.go:199
 msgid "Packets received"
 msgstr ""
 
-#: lxc/info.go:191
+#: lxc/info.go:200
 msgid "Packets sent"
 msgstr ""
 
@@ -693,24 +720,24 @@ msgstr ""
 msgid "Path to an alternate server directory"
 msgstr ""
 
-#: lxc/main.go:202
+#: lxc/main.go:216
 msgid "Pause containers."
 msgstr ""
 
-#: lxc/main.go:35
+#: lxc/main.go:37
 msgid "Permission denied, are you in the lxd group?"
 msgstr ""
 
-#: lxc/info.go:108
+#: lxc/info.go:117
 #, c-format
 msgid "Pid: %d"
 msgstr ""
 
-#: lxc/network.go:379 lxc/profile.go:258 lxc/storage.go:536 lxc/storage.go:855
+#: lxc/network.go:419 lxc/profile.go:268 lxc/storage.go:577 lxc/storage.go:936
 msgid "Press enter to open the editor again"
 msgstr ""
 
-#: lxc/config.go:572 lxc/config.go:637 lxc/image.go:869
+#: lxc/config.go:648 lxc/config.go:713 lxc/image.go:1108
 msgid "Press enter to start the editor again"
 msgstr ""
 
@@ -726,143 +753,143 @@ msgstr ""
 msgid "Print verbose information"
 msgstr ""
 
-#: lxc/info.go:132
+#: lxc/info.go:141
 #, c-format
 msgid "Processes: %d"
 msgstr ""
 
-#: lxc/profile.go:314
+#: lxc/profile.go:344
 #, c-format
 msgid "Profile %s added to %s"
 msgstr ""
 
-#: lxc/profile.go:209
+#: lxc/profile.go:218
 #, c-format
 msgid "Profile %s created"
 msgstr ""
 
-#: lxc/profile.go:279
+#: lxc/profile.go:292
 #, c-format
 msgid "Profile %s deleted"
 msgstr ""
 
-#: lxc/profile.go:345
+#: lxc/profile.go:379
 #, c-format
 msgid "Profile %s removed from %s"
 msgstr ""
 
-#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:137 lxc/init.go:138
+#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:138 lxc/init.go:139
 msgid "Profile to apply to the new container"
 msgstr ""
 
-#: lxc/profile.go:295
+#: lxc/profile.go:321
 #, c-format
 msgid "Profiles %s applied to %s"
 msgstr ""
 
-#: lxc/info.go:106
+#: lxc/info.go:115
 #, c-format
 msgid "Profiles: %s"
 msgstr ""
 
-#: lxc/image.go:479
+#: lxc/image.go:565
 msgid "Properties:"
 msgstr ""
 
-#: lxc/remote.go:69
+#: lxc/remote.go:70
 msgid "Public image server"
 msgstr ""
 
-#: lxc/image.go:462
+#: lxc/image.go:548
 #, c-format
 msgid "Public: %s"
 msgstr ""
 
-#: lxc/file.go:65 lxc/file.go:66
+#: lxc/file.go:67 lxc/file.go:68
 msgid "Recursively push or pull files"
 msgstr ""
 
-#: lxc/image.go:413
+#: lxc/image.go:489
 #, c-format
 msgid "Refreshing the image: %s"
 msgstr ""
 
-#: lxc/remote.go:67
+#: lxc/remote.go:68
 msgid "Remote admin password"
 msgstr ""
 
-#: lxc/info.go:93
+#: lxc/info.go:101
 #, c-format
 msgid "Remote: %s"
 msgstr ""
 
-#: lxc/delete.go:41
+#: lxc/delete.go:42
 #, c-format
 msgid "Remove %s (yes/no): "
 msgstr ""
 
-#: lxc/delete.go:35 lxc/delete.go:36
+#: lxc/delete.go:36 lxc/delete.go:37
 msgid "Require user confirmation"
 msgstr ""
 
-#: lxc/info.go:129
+#: lxc/info.go:138
 msgid "Resources:"
 msgstr ""
 
-#: lxc/main.go:210
+#: lxc/main.go:224
 msgid "Restart containers."
 msgstr ""
 
-#: lxc/init.go:253
+#: lxc/init.go:286
 #, c-format
 msgid "Retrieving image: %s"
 msgstr ""
 
-#: lxc/image.go:229
+#: lxc/image.go:232
 msgid "SIZE"
 msgstr ""
 
-#: lxc/list.go:463
+#: lxc/list.go:468
 msgid "SNAPSHOTS"
 msgstr ""
 
-#: lxc/storage.go:610
+#: lxc/storage.go:656
 msgid "SOURCE"
 msgstr ""
 
-#: lxc/list.go:464
+#: lxc/list.go:469
 msgid "STATE"
 msgstr ""
 
-#: lxc/remote.go:399
+#: lxc/remote.go:410
 msgid "STATIC"
 msgstr ""
 
-#: lxc/list.go:466
+#: lxc/list.go:471
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/remote.go:240
+#: lxc/remote.go:236
 msgid "Server certificate NACKed by user"
 msgstr ""
 
-#: lxc/remote.go:302
+#: lxc/remote.go:313
 msgid "Server doesn't trust us after adding our cert"
 msgstr ""
 
-#: lxc/remote.go:68
+#: lxc/remote.go:69
 msgid "Server protocol (lxd or simplestreams)"
 msgstr ""
 
-#: lxc/file.go:63
+#: lxc/file.go:65
 msgid "Set the file's gid on push"
 msgstr ""
 
-#: lxc/file.go:64
+#: lxc/file.go:66
 msgid "Set the file's perms on push"
 msgstr ""
 
-#: lxc/file.go:62
+#: lxc/file.go:64
 msgid "Set the file's uid on push"
 msgstr ""
 
@@ -874,78 +901,83 @@ msgstr ""
 msgid "Show client version"
 msgstr ""
 
-#: lxc/info.go:38
+#: lxc/info.go:39
 msgid "Show the container's last 100 log lines?"
 msgstr ""
 
-#: lxc/config.go:33
+#: lxc/config.go:35
 msgid "Show the expanded configuration"
 msgstr ""
 
-#: lxc/image.go:460
+#: lxc/image.go:546
 #, c-format
 msgid "Size: %.2fMB"
 msgstr ""
 
-#: lxc/info.go:210
+#: lxc/info.go:219
 msgid "Snapshots:"
 msgstr ""
 
-#: lxc/action.go:134
+#: lxc/action.go:142
 #, c-format
 msgid "Some containers failed to %s"
 msgstr ""
 
-#: lxc/image.go:493
+#: lxc/image.go:579
 msgid "Source:"
 msgstr ""
 
-#: lxc/main.go:220
+#: lxc/main.go:234
 msgid "Start containers."
 msgstr ""
 
-#: lxc/launch.go:152
+#: lxc/launch.go:59
 #, c-format
 msgid "Starting %s"
 msgstr ""
 
-#: lxc/info.go:100
+#: lxc/info.go:109
 #, c-format
 msgid "Status: %s"
 msgstr ""
 
-#: lxc/main.go:226
+#: lxc/main.go:240
 msgid "Stop containers."
 msgstr ""
 
-#: lxc/publish.go:36 lxc/publish.go:37
+#: lxc/publish.go:37 lxc/publish.go:38
 msgid "Stop the container if currently running"
 msgstr ""
 
-#: lxc/delete.go:105 lxc/publish.go:114
+#: lxc/publish.go:136
 msgid "Stopping container failed!"
 msgstr ""
 
-#: lxc/storage.go:436
+#: lxc/delete.go:121
+#, c-format
+msgid "Stopping the container failed: %s"
+msgstr ""
+
+#: lxc/storage.go:468
 #, c-format
 msgid "Storage pool %s created"
 msgstr ""
 
-#: lxc/storage.go:486
+#: lxc/storage.go:527
 #, c-format
 msgid "Storage pool %s deleted"
 msgstr ""
 
-#: lxc/init.go:143 lxc/init.go:144
+#: lxc/init.go:144 lxc/init.go:145
 msgid "Storage pool name"
 msgstr ""
 
-#: lxc/storage.go:720
+#: lxc/storage.go:782
 #, c-format
 msgid "Storage volume %s created"
 msgstr ""
 
-#: lxc/storage.go:730
+#: lxc/storage.go:797
 #, c-format
 msgid "Storage volume %s deleted"
 msgstr ""
@@ -954,38 +986,42 @@ msgstr ""
 msgid "Store the container state (only for stop)"
 msgstr ""
 
-#: lxc/info.go:171
+#: lxc/info.go:180
 msgid "Swap (current)"
 msgstr ""
 
-#: lxc/info.go:175
+#: lxc/info.go:184
 msgid "Swap (peak)"
 msgstr ""
 
-#: lxc/list.go:465 lxc/network.go:459 lxc/storage.go:695
+#: lxc/list.go:470 lxc/network.go:505 lxc/storage.go:747
 msgid "TYPE"
 msgstr ""
 
-#: lxc/delete.go:91
+#: lxc/delete.go:105
 msgid "The container is currently running, stop it first or pass --force."
 msgstr ""
 
-#: lxc/publish.go:92
+#: lxc/publish.go:101
 msgid ""
 "The container is currently running. Use --force to have it stopped and "
 "restarted."
 msgstr ""
 
-#: lxc/init.go:326
+#: lxc/init.go:358
 msgid "The container you are starting doesn't have any network attached to it."
 msgstr ""
 
-#: lxc/config.go:716 lxc/config.go:728 lxc/config.go:761 lxc/config.go:779
-#: lxc/config.go:817 lxc/config.go:835
+#: lxc/config.go:770 lxc/config.go:787
+msgid "The device already exists"
+msgstr ""
+
+#: lxc/config.go:833 lxc/config.go:845 lxc/config.go:881 lxc/config.go:899
+#: lxc/config.go:945 lxc/config.go:962 lxc/config.go:1006 lxc/config.go:1022
 msgid "The device doesn't exist"
 msgstr ""
 
-#: lxc/init.go:310
+#: lxc/init.go:342
 #, c-format
 msgid "The local image '%s' couldn't be found, trying '%s:' instead."
 msgstr ""
@@ -994,15 +1030,15 @@ msgstr ""
 msgid "The opposite of \"lxc pause\" is \"lxc start\"."
 msgstr ""
 
-#: lxc/network.go:262 lxc/network.go:311 lxc/storage.go:376 lxc/storage.go:476
+#: lxc/network.go:290 lxc/network.go:343 lxc/storage.go:388 lxc/storage.go:508
 msgid "The specified device doesn't exist"
 msgstr ""
 
-#: lxc/network.go:266 lxc/network.go:315
+#: lxc/network.go:294 lxc/network.go:347
 msgid "The specified device doesn't match the network"
 msgstr ""
 
-#: lxc/publish.go:65
+#: lxc/publish.go:74
 msgid "There is no \"image name\".  Did you want an alias?"
 msgstr ""
 
@@ -1018,49 +1054,49 @@ msgstr ""
 msgid "Time to wait for the container before killing it"
 msgstr ""
 
-#: lxc/image.go:463
+#: lxc/image.go:549
 msgid "Timestamps:"
 msgstr ""
 
-#: lxc/init.go:328
+#: lxc/init.go:360
 msgid "To attach a network to a container, use: lxc network attach"
 msgstr ""
 
-#: lxc/init.go:327
+#: lxc/init.go:359
 msgid "To create a new network, use: lxc network create"
 msgstr ""
 
-#: lxc/main.go:140
+#: lxc/main.go:154
 msgid "To start your first container, try: lxc launch ubuntu:16.04"
 msgstr ""
 
-#: lxc/image.go:551
+#: lxc/image.go:657
 #, c-format
 msgid "Transferring image: %s"
 msgstr ""
 
-#: lxc/action.go:98 lxc/launch.go:165
+#: lxc/action.go:106 lxc/launch.go:77
 #, c-format
 msgid "Try `lxc info --show-log %s` for more info"
 msgstr ""
 
-#: lxc/info.go:102
+#: lxc/info.go:111
 msgid "Type: ephemeral"
 msgstr ""
 
-#: lxc/info.go:104
+#: lxc/info.go:113
 msgid "Type: persistent"
 msgstr ""
 
-#: lxc/image.go:230
+#: lxc/image.go:233
 msgid "UPLOAD DATE"
 msgstr ""
 
-#: lxc/remote.go:396
+#: lxc/remote.go:407
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:462 lxc/profile.go:500 lxc/storage.go:611 lxc/storage.go:698
+#: lxc/network.go:508 lxc/profile.go:556 lxc/storage.go:657 lxc/storage.go:750
 msgid "USED BY"
 msgstr ""
 
@@ -1068,11 +1104,16 @@ msgstr ""
 msgid "Unable to find help2man."
 msgstr ""
 
-#: lxc/remote.go:110
+#: lxc/remote.go:111
 msgid "Unable to read remote TLS certificate"
 msgstr ""
 
-#: lxc/image.go:468
+#: lxc/file.go:108
+#, c-format
+msgid "Unknown file type '%s'"
+msgstr ""
+
+#: lxc/image.go:554
 #, c-format
 msgid "Uploaded: %s"
 msgstr ""
@@ -1089,7 +1130,7 @@ msgstr ""
 msgid "Usage: lxc <command> [options]"
 msgstr ""
 
-#: lxc/config.go:58
+#: lxc/config.go:60
 msgid ""
 "Usage: lxc config <subcommand> [options]\n"
 "\n"
@@ -1175,7 +1216,7 @@ msgid ""
 "Copy containers within or in between LXD instances."
 msgstr ""
 
-#: lxc/delete.go:26
+#: lxc/delete.go:27
 msgid ""
 "Usage: lxc delete [<remote>:]<container>[/<snapshot>] "
 "[[<remote>:]<container>[/<snapshot>]...]\n"
@@ -1183,7 +1224,7 @@ msgid ""
 "Delete containers and snapshots."
 msgstr ""
 
-#: lxc/exec.go:52
+#: lxc/exec.go:53
 msgid ""
 "Usage: lxc exec [<remote>:]<container> [-t] [-T] [-n] [--mode=auto|"
 "interactive|non-interactive] [--env KEY=VALUE...] [--] <command line>\n"
@@ -1194,7 +1235,7 @@ msgid ""
 "AND stdout are terminals (stderr is ignored)."
 msgstr ""
 
-#: lxc/file.go:36
+#: lxc/file.go:38
 msgid ""
 "Usage: lxc file <subcommand> [options]\n"
 "\n"
@@ -1238,7 +1279,7 @@ msgid ""
 "Help page for the LXD client."
 msgstr ""
 
-#: lxc/image.go:69
+#: lxc/image.go:72
 msgid ""
 "Usage: lxc image <subcommand> [options]\n"
 "\n"
@@ -1343,7 +1384,7 @@ msgid ""
 "image alias name."
 msgstr ""
 
-#: lxc/info.go:25
+#: lxc/info.go:26
 msgid ""
 "Usage: lxc info [<remote>:][<container>] [--show-log]\n"
 "\n"
@@ -1356,7 +1397,7 @@ msgid ""
 "    For LXD server information."
 msgstr ""
 
-#: lxc/init.go:75
+#: lxc/init.go:76
 msgid ""
 "Usage: lxc init [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--"
 "profile|-p <profile>...] [--config|-c <key=value>...] [--network|-n "
@@ -1371,7 +1412,7 @@ msgid ""
 "    lxc init ubuntu:16.04 u1"
 msgstr ""
 
-#: lxc/launch.go:23
+#: lxc/launch.go:20
 msgid ""
 "Usage: lxc launch [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--"
 "profile|-p <profile>...] [--config|-c <key=value>...] [--network|-n "
@@ -1500,7 +1541,7 @@ msgid ""
 "    Only show log message."
 msgstr ""
 
-#: lxc/move.go:19
+#: lxc/move.go:22
 msgid ""
 "Usage: lxc move [<remote>:]<container>[/<snapshot>] [<remote>:][<container>[/"
 "<snapshot>]] [--container-only]\n"
@@ -1519,7 +1560,7 @@ msgid ""
 "    Rename a snapshot."
 msgstr ""
 
-#: lxc/network.go:49
+#: lxc/network.go:50
 msgid ""
 "Usage: lxc network <subcommand> [options]\n"
 "\n"
@@ -1572,7 +1613,7 @@ msgid ""
 "    Update a network using the content of network.yaml"
 msgstr ""
 
-#: lxc/profile.go:49
+#: lxc/profile.go:51
 msgid ""
 "Usage: lxc profile <subcommand> [options]\n"
 "\n"
@@ -1654,7 +1695,7 @@ msgid ""
 "    Remove all profile from \"foo\""
 msgstr ""
 
-#: lxc/publish.go:27
+#: lxc/publish.go:28
 msgid ""
 "Usage: lxc publish [<remote>:]<container>[/<snapshot>] [<remote>:] [--"
 "alias=ALIAS...] [prop-key=prop-value...]\n"
@@ -1662,7 +1703,7 @@ msgid ""
 "Publish containers as images."
 msgstr ""
 
-#: lxc/remote.go:38
+#: lxc/remote.go:39
 msgid ""
 "Usage: lxc remote <subcommand> [options]\n"
 "\n"
@@ -1691,7 +1732,7 @@ msgid ""
 "    Print the default remote."
 msgstr ""
 
-#: lxc/restore.go:21
+#: lxc/restore.go:22
 msgid ""
 "Usage: lxc restore [<remote>:]<container> <snapshot> [--stateful]\n"
 "\n"
@@ -1707,7 +1748,7 @@ msgid ""
 "    Restore the snapshot."
 msgstr ""
 
-#: lxc/snapshot.go:21
+#: lxc/snapshot.go:22
 msgid ""
 "Usage: lxc snapshot [<remote>:]<container> <snapshot name> [--stateful]\n"
 "\n"
@@ -1721,7 +1762,7 @@ msgid ""
 "    Create a snapshot of \"u1\" called \"snap0\"."
 msgstr ""
 
-#: lxc/storage.go:61
+#: lxc/storage.go:62
 msgid ""
 "Usage: lxc storage <subcommand> [options]\n"
 "\n"
@@ -1821,157 +1862,128 @@ msgid ""
 "Print the version number of this client tool."
 msgstr ""
 
-#: lxc/delete.go:45
+#: lxc/delete.go:46
 msgid "User aborted delete operation."
 msgstr ""
 
-#: lxc/restore.go:37
+#: lxc/restore.go:38
 msgid ""
 "Whether or not to restore the container's running state from snapshot (if "
 "available)"
 msgstr ""
 
-#: lxc/snapshot.go:35
+#: lxc/snapshot.go:36
 msgid "Whether or not to snapshot the container's running state"
 msgstr ""
 
-#: lxc/network.go:446 lxc/remote.go:371 lxc/remote.go:376
+#: lxc/network.go:492 lxc/remote.go:382 lxc/remote.go:387
 msgid "YES"
 msgstr ""
 
-#: lxc/exec.go:125
+#: lxc/exec.go:126
 msgid "You can't pass -t and -T at the same time"
 msgstr ""
 
-#: lxc/exec.go:129
+#: lxc/exec.go:130
 msgid "You can't pass -t or -T at the same time as --mode"
 msgstr ""
 
-#: lxc/main.go:56
-msgid "`lxc config profile` is deprecated, please use `lxc profile`"
-msgstr ""
-
-#: lxc/launch.go:134
-msgid "bad number of things scanned from image, container or snapshot"
-msgstr ""
-
-#: lxc/action.go:94
-msgid "bad result type from action"
+#: lxc/copy.go:57
+msgid "You must specify a source container name"
 msgstr ""
 
-#: lxc/copy.go:118
-msgid "can't copy to the same container name"
-msgstr ""
-
-#: lxc/file.go:314
-msgid "can't pull a directory without --recursive"
+#: lxc/main.go:58
+msgid "`lxc config profile` is deprecated, please use `lxc profile`"
 msgstr ""
 
-#: lxc/remote.go:359
+#: lxc/remote.go:370
 msgid "can't remove the default remote"
 msgstr ""
 
-#: lxc/file.go:125
+#: lxc/file.go:269
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr ""
 
-#: lxc/remote.go:385
+#: lxc/remote.go:396
 msgid "default"
 msgstr ""
 
-#: lxc/copy.go:134 lxc/copy.go:139 lxc/copy.go:258 lxc/copy.go:263
-#: lxc/init.go:234 lxc/init.go:239 lxc/launch.go:115 lxc/launch.go:121
+#: lxc/init.go:308
 msgid "didn't get any affected image, container or snapshot from server"
 msgstr ""
 
-#: lxc/image.go:454
+#: lxc/image.go:540
 msgid "disabled"
 msgstr ""
 
-#: lxc/image.go:456
+#: lxc/image.go:542
 msgid "enabled"
 msgstr ""
 
-#: lxc/action.go:126 lxc/main.go:26 lxc/main.go:159
+#: lxc/action.go:134 lxc/main.go:28 lxc/main.go:173
 #, c-format
 msgid "error: %v"
 msgstr ""
 
-#: lxc/help.go:37 lxc/main.go:106
+#: lxc/help.go:37 lxc/main.go:114
 #, c-format
 msgid "error: unknown command: %s"
 msgstr ""
 
-#: lxc/launch.go:139
-msgid "got bad version"
-msgstr ""
-
-#: lxc/image.go:202 lxc/image.go:449
+#: lxc/image.go:205 lxc/image.go:535
 msgid "no"
 msgstr ""
 
-#: lxc/copy.go:167
-msgid "not all the profiles from the source exist on the target"
-msgstr ""
-
-#: lxc/remote.go:233
+#: lxc/remote.go:229
 msgid "ok (y/n)?"
 msgstr ""
 
-#: lxc/main.go:331 lxc/main.go:335
+#: lxc/main.go:345 lxc/main.go:349
 #, c-format
 msgid "processing aliases failed %s\n"
 msgstr ""
 
-#: lxc/file.go:381
+#: lxc/file.go:541
 msgid "recursive edit doesn't make sense :("
 msgstr ""
 
-#: lxc/remote.go:421
+#: lxc/remote.go:432
 #, c-format
 msgid "remote %s already exists"
 msgstr ""
 
-#: lxc/remote.go:351 lxc/remote.go:413 lxc/remote.go:448 lxc/remote.go:464
+#: lxc/remote.go:362 lxc/remote.go:424 lxc/remote.go:459 lxc/remote.go:475
 #, c-format
 msgid "remote %s doesn't exist"
 msgstr ""
 
-#: lxc/remote.go:334
+#: lxc/remote.go:345
 #, c-format
 msgid "remote %s exists as <%s>"
 msgstr ""
 
-#: lxc/remote.go:355 lxc/remote.go:417 lxc/remote.go:452
+#: lxc/remote.go:366 lxc/remote.go:428 lxc/remote.go:463
 #, c-format
 msgid "remote %s is static and cannot be modified"
 msgstr ""
 
-#: lxc/info.go:221
+#: lxc/info.go:230
 msgid "stateful"
 msgstr ""
 
-#: lxc/info.go:223
+#: lxc/info.go:232
 msgid "stateless"
 msgstr ""
 
-#: lxc/info.go:217
+#: lxc/info.go:226
 #, c-format
 msgid "taken at %s"
 msgstr ""
 
-#: lxc/exec.go:214
-msgid "unreachable return reached"
-msgstr ""
-
-#: lxc/main.go:262
+#: lxc/main.go:276
 msgid "wrong number of subcommand arguments"
 msgstr ""
 
-#: lxc/delete.go:44 lxc/image.go:200 lxc/image.go:451
+#: lxc/delete.go:45 lxc/image.go:203 lxc/image.go:537
 msgid "yes"
 msgstr ""
-
-#: lxc/copy.go:47
-msgid "you must specify a source container name"
-msgstr ""
diff --git a/po/fr.po b/po/fr.po
index 6b63b6f8d..c273397b4 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-06-13 20:10+0200\n"
+"POT-Creation-Date: 2017-06-17 03:18+0000\n"
 "PO-Revision-Date: 2017-03-30 21:35+0000\n"
 "Last-Translator: HazWard <starlysolon at gmail.com>\n"
 "Language-Team: French <https://hosted.weblate.org/projects/linux-containers/"
@@ -19,7 +19,7 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n > 1;\n"
 "X-Generator: Weblate 2.13-dev\n"
 
-#: lxc/storage.go:30
+#: lxc/storage.go:31
 msgid ""
 "### This is a yaml representation of a storage pool.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -50,7 +50,7 @@ msgstr ""
 "###   source: /home/chb/mnt/lxd_test/default.img\n"
 "###   zfs.pool_name: default"
 
-#: lxc/storage.go:47
+#: lxc/storage.go:48
 #, fuzzy
 msgid ""
 "### This is a yaml representation of a storage volume.\n"
@@ -71,7 +71,7 @@ msgstr ""
 "### Un exemple serait :\n"
 "###  description: Mon image personnalisée"
 
-#: lxc/config.go:37
+#: lxc/config.go:39
 msgid ""
 "### This is a yaml representation of the configuration.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -109,7 +109,7 @@ msgstr ""
 "###\n"
 "### Notez que le nom est affiché mais ne peut être modifié"
 
-#: lxc/image.go:59
+#: lxc/image.go:62
 msgid ""
 "### This is a yaml representation of the image properties.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -125,7 +125,7 @@ msgstr ""
 "### Un exemple serait :\n"
 "###  description: Mon image personnalisée"
 
-#: lxc/network.go:29
+#: lxc/network.go:30
 msgid ""
 "### This is a yaml representation of the network.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -162,7 +162,7 @@ msgstr ""
 "###\n"
 "### Notez que seule la configuration peut être modifiée."
 
-#: lxc/profile.go:28
+#: lxc/profile.go:30
 msgid ""
 "### This is a yaml representation of the profile.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -199,108 +199,134 @@ msgstr ""
 "###\n"
 "### Notez que le nom est affiché mais ne peut être modifié"
 
-#: lxc/image.go:179
+#: lxc/image.go:182
 #, c-format
 msgid "%s (%d more)"
 msgstr "%s (%d de plus)"
 
-#: lxc/snapshot.go:58
+#: lxc/file.go:183
+#, c-format
+msgid "%s is not a directory"
+msgstr ""
+
+#: lxc/file.go:125
+#, c-format
+msgid "'%s' isn't a regular file or directory."
+msgstr ""
+
+#: lxc/snapshot.go:53
 msgid "'/' not allowed in snapshot name"
 msgstr "'/' n'est pas autorisé dans le nom d'un instantané"
 
-#: lxc/profile.go:293
+#: lxc/profile.go:319
 msgid "(none)"
 msgstr "(aucun)"
 
-#: lxc/image.go:223 lxc/image.go:814
+#: lxc/image.go:226 lxc/image.go:1052
 msgid "ALIAS"
 msgstr "ALIAS"
 
-#: lxc/image.go:224
+#: lxc/image.go:227
 #, fuzzy
 msgid "ALIASES"
 msgstr "ALIAS"
 
-#: lxc/image.go:228
+#: lxc/image.go:231
 msgid "ARCH"
 msgstr "ARCH"
 
-#: lxc/list.go:456
+#: lxc/list.go:461
 msgid "ARCHITECTURE"
 msgstr "ARCHITECTURE"
 
-#: lxc/remote.go:66
+#: lxc/remote.go:67
 msgid "Accept certificate"
 msgstr "Accepter le certificat"
 
-#: lxc/remote.go:282
+#: lxc/remote.go:281
 #, c-format
 msgid "Admin password for %s: "
 msgstr "Mot de passe administrateur pour %s : "
 
-#: lxc/image.go:483
+#: lxc/image.go:569
 msgid "Aliases:"
 msgstr "Alias :"
 
-#: lxc/image.go:461 lxc/info.go:95
+#: lxc/image.go:547 lxc/info.go:104
 #, c-format
 msgid "Architecture: %s"
 msgstr "Architecture : %s"
 
-#: lxc/image.go:491
+#: lxc/image.go:577
 #, c-format
 msgid "Auto update: %s"
 msgstr "Mise à jour auto. : %s"
 
-#: lxc/info.go:188
+#: lxc/image.go:651
+#, c-format
+msgid "Bad property: %s"
+msgstr ""
+
+#: lxc/info.go:197
 msgid "Bytes received"
 msgstr "Octets reçus"
 
-#: lxc/info.go:189
+#: lxc/info.go:198
 msgid "Bytes sent"
 msgstr "Octets émis"
 
-#: lxc/config.go:310
+#: lxc/config.go:349
 msgid "COMMON NAME"
 msgstr "COMMON NAME"
 
-#: lxc/info.go:152
+#: lxc/info.go:161
 msgid "CPU usage (in seconds)"
 msgstr "CPU utilisé (en secondes)"
 
-#: lxc/info.go:156
+#: lxc/info.go:165
 msgid "CPU usage:"
 msgstr "CPU utilisé :"
 
-#: lxc/list.go:457
+#: lxc/list.go:462
 msgid "CREATED AT"
 msgstr "CRÉÉ À"
 
-#: lxc/config.go:150 lxc/network.go:496
+#: lxc/file.go:470
+#, fuzzy
+msgid "Can't pull a directory without --recursive"
+msgstr "impossible de récupérer un répertoire sans --recursive"
+
+#: lxc/config.go:156 lxc/network.go:542
 #, c-format
 msgid "Can't read from stdin: %s"
 msgstr "Impossible de lire depuis stdin : %s"
 
-#: lxc/config.go:163 lxc/config.go:196 lxc/config.go:218
+#: lxc/config.go:169
+#, fuzzy, c-format
+msgid "Can't unset key '%s', it's not currently set"
+msgstr ""
+"Impossible de désaffecter la clé '%s', elle n'est pas définie actuellement."
+
+#: lxc/config.go:211 lxc/config.go:237
 #, c-format
 msgid "Can't unset key '%s', it's not currently set."
 msgstr ""
 "Impossible de désaffecter la clé '%s', elle n'est pas définie actuellement."
 
-#: lxc/network.go:422 lxc/profile.go:472 lxc/storage.go:579
+#: lxc/network.go:468 lxc/profile.go:528 lxc/storage.go:625
 msgid "Cannot provide container name to list"
 msgstr "Impossible de fournir le nom du conteneur à lister"
 
-#: lxc/remote.go:232
+#: lxc/remote.go:228
 #, fuzzy, c-format
 msgid "Certificate fingerprint: %s"
 msgstr "Empreinte du certificat : %x"
 
-#: lxc/remote.go:305
+#: lxc/remote.go:316
 msgid "Client certificate stored at server: "
 msgstr "Certificat client enregistré sur le serveur : "
 
-#: lxc/image.go:167 lxc/image.go:168 lxc/list.go:128 lxc/list.go:129
+#: lxc/image.go:170 lxc/image.go:171 lxc/list.go:128 lxc/list.go:129
 msgid "Columns"
 msgstr "Colonnes"
 
@@ -308,35 +334,35 @@ msgstr "Colonnes"
 msgid "Commands:"
 msgstr "Commandes:"
 
-#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:135 lxc/init.go:136
+#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:136 lxc/init.go:137
 msgid "Config key/value to apply to the new container"
 msgstr "Clé/valeur de configuration à appliquer au nouveau conteneur"
 
-#: lxc/config.go:571 lxc/config.go:636 lxc/image.go:868 lxc/network.go:378
-#: lxc/profile.go:257 lxc/storage.go:535 lxc/storage.go:854
+#: lxc/config.go:647 lxc/config.go:712 lxc/image.go:1107 lxc/network.go:418
+#: lxc/profile.go:267 lxc/storage.go:576 lxc/storage.go:935
 #, c-format
 msgid "Config parsing error: %s"
 msgstr "Erreur lors de la lecture de la configuration : %s"
 
-#: lxc/main.go:33
+#: lxc/main.go:35
 msgid "Connection refused; is LXD running?"
 msgstr "Connexion refusée ; LXD est-il actif ?"
 
-#: lxc/publish.go:62
+#: lxc/publish.go:71
 msgid "Container name is mandatory"
 msgstr "Le nom du conteneur est obligatoire"
 
-#: lxc/copy.go:143 lxc/copy.go:267 lxc/init.go:244
+#: lxc/copy.go:210 lxc/init.go:313
 #, c-format
 msgid "Container name is: %s"
 msgstr "Le nom du conteneur est : %s"
 
-#: lxc/publish.go:160 lxc/publish.go:175
+#: lxc/publish.go:250
 #, c-format
 msgid "Container published with fingerprint: %s"
 msgstr "Conteneur publié avec l'empreinte : %s"
 
-#: lxc/image.go:170
+#: lxc/image.go:173
 msgid "Copy aliases from source"
 msgstr "Copier les alias depuis la source"
 
@@ -345,86 +371,91 @@ msgstr "Copier les alias depuis la source"
 msgid "Copy the container without its snapshots"
 msgstr "Forcer le conteneur à s'arrêter"
 
-#: lxc/image.go:360
+#: lxc/image.go:422
 #, c-format
 msgid "Copying the image: %s"
 msgstr "Copie de l'image : %s"
 
-#: lxc/remote.go:247
+#: lxc/remote.go:243
 msgid "Could not create server cert dir"
 msgstr "Impossible de créer le dossier de stockage des certificats serveurs"
 
-#: lxc/file.go:67 lxc/file.go:68
+#: lxc/file.go:69 lxc/file.go:70
 msgid "Create any directories necessary"
 msgstr "Créer tous répertoires nécessaires"
 
-#: lxc/image.go:466 lxc/info.go:97
+#: lxc/image.go:552 lxc/info.go:106
 #, c-format
 msgid "Created: %s"
 msgstr "Créé : %s"
 
-#: lxc/init.go:182 lxc/launch.go:142
+#: lxc/init.go:194
 #, c-format
 msgid "Creating %s"
 msgstr "Création de %s"
 
-#: lxc/init.go:180
+#: lxc/init.go:192
 msgid "Creating the container"
 msgstr "Création du conteneur"
 
-#: lxc/image.go:227 lxc/image.go:816 lxc/list.go:458 lxc/network.go:461
-#: lxc/storage.go:608 lxc/storage.go:697
+#: lxc/image.go:230 lxc/image.go:1054 lxc/list.go:463 lxc/network.go:507
+#: lxc/storage.go:654 lxc/storage.go:749
 msgid "DESCRIPTION"
 msgstr "DESCRIPTION"
 
-#: lxc/storage.go:609
+#: lxc/storage.go:655
 msgid "DRIVER"
 msgstr "PILOTE"
 
-#: lxc/publish.go:38
+#: lxc/publish.go:39
 msgid "Define a compression algorithm: for image or none"
 msgstr "Définir un algorithme de compression : pour image ou aucun"
 
-#: lxc/config.go:688
+#: lxc/config.go:803
 #, c-format
 msgid "Device %s added to %s"
 msgstr "Périphérique %s ajouté à %s"
 
-#: lxc/config.go:875
+#: lxc/config.go:1037
 #, c-format
 msgid "Device %s removed from %s"
 msgstr "Périphérique %s retiré de %s"
 
-#: lxc/exec.go:64
+#: lxc/utils.go:248 lxc/utils.go:272
+#, fuzzy, c-format
+msgid "Device already exists: %s"
+msgstr "le serveur distant %s existe déjà"
+
+#: lxc/exec.go:65
 msgid "Disable pseudo-terminal allocation"
 msgstr "Désactiver l'allocation pseudo-terminal"
 
-#: lxc/exec.go:65
+#: lxc/exec.go:66
 msgid "Disable stdin (reads from /dev/null)"
 msgstr "Désactiver stdin (lecture à partir de /dev/null)"
 
-#: lxc/info.go:145
+#: lxc/info.go:154
 #, fuzzy
 msgid "Disk usage:"
 msgstr "  Disque utilisé :"
 
-#: lxc/list.go:609
+#: lxc/list.go:614
 msgid "EPHEMERAL"
 msgstr "ÉPHÉMÈRE"
 
-#: lxc/config.go:312
+#: lxc/config.go:351
 msgid "EXPIRY DATE"
 msgstr "DATE D'EXPIRATION"
 
-#: lxc/main.go:45
+#: lxc/main.go:47
 msgid "Enable debug mode"
 msgstr "Activer le mode de débogage"
 
-#: lxc/main.go:44
+#: lxc/main.go:46
 msgid "Enable verbose mode"
 msgstr "Activer le mode verbeux"
 
-#: lxc/exec.go:61
+#: lxc/exec.go:62
 msgid "Environment variable to set (e.g. HOME=/home/foo)"
 msgstr "Variable d'environnement (de la forme HOME=/home/foo) à positionner"
 
@@ -432,7 +463,7 @@ msgstr "Variable d'environnement (de la forme HOME=/home/foo) à positionner"
 msgid "Environment:"
 msgstr "Environnement :"
 
-#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:139 lxc/init.go:140
+#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:140 lxc/init.go:141
 msgid "Ephemeral container"
 msgstr "Conteneur éphémère"
 
@@ -440,16 +471,21 @@ msgstr "Conteneur éphémère"
 msgid "Event type to listen for"
 msgstr "Type d'évènements à surveiller"
 
-#: lxc/image.go:470
+#: lxc/image.go:556
 #, c-format
 msgid "Expires: %s"
 msgstr "Expire : %s"
 
-#: lxc/image.go:472
+#: lxc/image.go:558
 msgid "Expires: never"
 msgstr "N'expire jamais"
 
-#: lxc/config.go:309 lxc/image.go:225 lxc/image.go:815
+#: lxc/image.go:848
+#, fuzzy, c-format
+msgid "Exporting the image: %s"
+msgstr "Import de l'image : %s"
+
+#: lxc/config.go:348 lxc/image.go:228 lxc/image.go:1053
 msgid "FINGERPRINT"
 msgstr "EMPREINTE"
 
@@ -463,17 +499,27 @@ msgstr "Échec lors de la génération de 'lxc.%s.1': %v"
 msgid "Failed to generate 'lxc.1': %v"
 msgstr "Échec lors de la génération de 'lxc.1': %v"
 
+#: lxc/copy.go:205
+#, fuzzy
+msgid "Failed to get the new container name"
+msgstr "Profil à appliquer au nouveau conteneur"
+
+#: lxc/file.go:120
+#, c-format
+msgid "Failed to walk path for %s: %s"
+msgstr ""
+
 #: lxc/list.go:131
 #, fuzzy
 msgid "Fast mode (same as --columns=nsacPt)"
 msgstr "Mode rapide (identique à --columns=nsacPt"
 
-#: lxc/image.go:459
+#: lxc/image.go:545
 #, c-format
 msgid "Fingerprint: %s"
 msgstr "Empreinte : %s"
 
-#: lxc/exec.go:63
+#: lxc/exec.go:64
 msgid "Force pseudo-terminal allocation"
 msgstr "Forcer l'allocation de pseudo-terminal "
 
@@ -481,42 +527,42 @@ msgstr "Forcer l'allocation de pseudo-terminal "
 msgid "Force the container to shutdown"
 msgstr "Forcer le conteneur à s'arrêter"
 
-#: lxc/delete.go:33 lxc/delete.go:34
+#: lxc/delete.go:34 lxc/delete.go:35
 msgid "Force the removal of stopped containers"
 msgstr "Forcer la suppression des conteneurs arrêtés"
 
-#: lxc/main.go:46
+#: lxc/main.go:48
 msgid "Force using the local unix socket"
 msgstr "Forcer l'utilisation de la socket unix locale"
 
-#: lxc/image.go:173 lxc/list.go:130
+#: lxc/image.go:176 lxc/list.go:130
 msgid "Format (csv|json|table|yaml)"
 msgstr ""
 
-#: lxc/remote.go:80
+#: lxc/remote.go:81
 msgid "Generating a client certificate. This may take a minute..."
 msgstr "Génération d'un certificat client. Ceci peut prendre une minute…"
 
-#: lxc/list.go:454
+#: lxc/list.go:459
 msgid "IPV4"
 msgstr "IPv4"
 
-#: lxc/list.go:455
+#: lxc/list.go:460
 msgid "IPV6"
 msgstr "IPv6"
 
-#: lxc/config.go:311
+#: lxc/config.go:350
 msgid "ISSUE DATE"
 msgstr "DATE D'ÉMISSION"
 
-#: lxc/main.go:139
+#: lxc/main.go:153
 #, fuzzy
 msgid "If this is your first time using LXD, you should also run: lxd init"
 msgstr ""
 "Si c'est la première fois que vous lancez LXD, vous devriez aussi lancer : "
 "sudo lxd init"
 
-#: lxc/main.go:47
+#: lxc/main.go:49
 msgid "Ignore aliases when determining what command to run"
 msgstr "Ignorer les alias pour déterminer la commande à exécuter"
 
@@ -524,251 +570,236 @@ msgstr "Ignorer les alias pour déterminer la commande à exécuter"
 msgid "Ignore the container state (only for start)"
 msgstr "Ignorer l'état du conteneur (seulement pour start)"
 
-#: lxc/image.go:422
+#: lxc/image.go:508
 msgid "Image already up to date."
 msgstr ""
 
-#: lxc/image.go:363
+#: lxc/image.go:436
 msgid "Image copied successfully!"
 msgstr "Image copiée avec succès !"
 
-#: lxc/image.go:546 lxc/image.go:558
+#: lxc/image.go:898
+#, fuzzy
+msgid "Image exported successfully!"
+msgstr "Image copiée avec succès !"
+
+#: lxc/image.go:709
 #, c-format
 msgid "Image imported with fingerprint: %s"
 msgstr "Image importée avec l'empreinte : %s"
 
-#: lxc/image.go:420
+#: lxc/image.go:506
 #, fuzzy
 msgid "Image refreshed successfully!"
 msgstr "Image copiée avec succès !"
 
-#: lxc/image.go:543
-#, c-format
-msgid "Importing the image: %s"
-msgstr "Import de l'image : %s"
-
-#: lxc/remote.go:150
+#: lxc/remote.go:151
 #, c-format
 msgid "Invalid URL scheme \"%s\" in \"%s\""
 msgstr "Schème d'URL invalide \"%s\" in \"%s\""
 
-#: lxc/config.go:290
+#: lxc/config.go:329
 msgid "Invalid certificate"
 msgstr "Certificat invalide"
 
-#: lxc/init.go:30 lxc/init.go:35
+#: lxc/init.go:31 lxc/init.go:36
 msgid "Invalid configuration key"
 msgstr "Clé de configuration invalide"
 
-#: lxc/file.go:357
+#: lxc/file.go:513
 #, fuzzy, c-format
 msgid "Invalid path %s"
 msgstr "Cible invalide %s"
 
-#: lxc/file.go:291
+#: lxc/file.go:443
 #, c-format
 msgid "Invalid source %s"
 msgstr "Source invalide %s"
 
-#: lxc/file.go:80
+#: lxc/file.go:221
 #, c-format
 msgid "Invalid target %s"
 msgstr "Cible invalide %s"
 
-#: lxc/info.go:126
+#: lxc/info.go:135
 msgid "Ips:"
 msgstr "IPs :"
 
-#: lxc/image.go:171
+#: lxc/image.go:174
 msgid "Keep the image up to date after initial copy"
 msgstr "Garder l'image à jour après la copie initiale"
 
-#: lxc/list.go:459
+#: lxc/list.go:464
 msgid "LAST USED AT"
 msgstr "DERNIÈRE UTILISATION À"
 
-#: lxc/main.go:31
+#: lxc/main.go:33
 msgid "LXD socket not found; is LXD installed and running?"
 msgstr "Socket LXD introuvable ; LXD est-il installé et actif ?"
 
-#: lxc/image.go:475
+#: lxc/image.go:561
 #, c-format
 msgid "Last used: %s"
 msgstr "Dernière utilisation : %s"
 
-#: lxc/image.go:477
+#: lxc/image.go:563
 msgid "Last used: never"
 msgstr "Dernière utilisation : jamais"
 
-#: lxc/info.go:241
+#: lxc/info.go:250
 msgid "Log:"
 msgstr "Journal : "
 
-#: lxc/network.go:460
+#: lxc/network.go:506
 msgid "MANAGED"
 msgstr "GÉRÉ"
 
-#: lxc/image.go:169
+#: lxc/image.go:172
 msgid "Make image public"
 msgstr "Rendre l'image publique"
 
-#: lxc/publish.go:34
+#: lxc/publish.go:35
 msgid "Make the image public"
 msgstr "Rendre l'image publique"
 
-#: lxc/info.go:163
+#: lxc/info.go:172
 msgid "Memory (current)"
 msgstr "Mémoire (courante)"
 
-#: lxc/info.go:167
+#: lxc/info.go:176
 msgid "Memory (peak)"
 msgstr "Mémoire (pointe)"
 
-#: lxc/info.go:179
+#: lxc/info.go:188
 #, fuzzy
 msgid "Memory usage:"
 msgstr "  Mémoire utilisée :"
 
-#: lxc/copy.go:276
-#, c-format
-msgid "Migration failed on source host: %s"
-msgstr "Échec lors de la migration vers l'hôte source: %s"
-
-#: lxc/copy.go:280
-#, c-format
-msgid "Migration failed on target host: %s"
-msgstr ""
-
-#: lxc/utils.go:201
+#: lxc/utils.go:199
 msgid "Missing summary."
 msgstr "Résumé manquant."
 
-#: lxc/network.go:248 lxc/network.go:297 lxc/storage.go:362 lxc/storage.go:462
+#: lxc/network.go:276 lxc/network.go:329 lxc/storage.go:374 lxc/storage.go:494
 msgid "More than one device matches, specify the device name."
 msgstr "Plus d'un périphérique correspond, spécifier le nom du périphérique."
 
-#: lxc/file.go:279
+#: lxc/file.go:431
 msgid "More than one file to download, but target is not a directory"
 msgstr ""
 "Plusieurs fichiers à télécharger, mais la destination n'est pas un dossier"
 
-#: lxc/move.go:35
+#: lxc/move.go:38
 #, fuzzy
 msgid "Move the container without its snapshots"
 msgstr "Forcer le conteneur à s'arrêter"
 
-#: lxc/action.go:68
+#: lxc/action.go:72
 msgid "Must supply container name for: "
 msgstr "Vous devez fournir le nom d'un conteneur pour : "
 
-#: lxc/list.go:460 lxc/network.go:458 lxc/profile.go:499 lxc/remote.go:395
-#: lxc/storage.go:607 lxc/storage.go:696
+#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:406
+#: lxc/storage.go:653 lxc/storage.go:748
 msgid "NAME"
 msgstr "NOM"
 
-#: lxc/network.go:444 lxc/remote.go:369 lxc/remote.go:374
+#: lxc/network.go:490 lxc/remote.go:380 lxc/remote.go:385
 msgid "NO"
 msgstr "NON"
 
-#: lxc/info.go:91
+#: lxc/info.go:99
 #, c-format
 msgid "Name: %s"
 msgstr "Nom : %s"
 
-#: lxc/network.go:222
+#: lxc/network.go:250
 #, c-format
 msgid "Network %s created"
 msgstr "Le réseau %s a été créé"
 
-#: lxc/network.go:325
+#: lxc/network.go:366
 #, c-format
 msgid "Network %s deleted"
 msgstr "Le réseau %s a été supprimé"
 
-#: lxc/init.go:141 lxc/init.go:142
+#: lxc/init.go:142 lxc/init.go:143
 msgid "Network name"
 msgstr "Nom du réseau"
 
-#: lxc/info.go:196
+#: lxc/info.go:205
 #, fuzzy
 msgid "Network usage:"
 msgstr "  Réseau utilisé :"
 
-#: lxc/image.go:172 lxc/publish.go:35
+#: lxc/image.go:175 lxc/publish.go:36
 msgid "New alias to define at target"
 msgstr "Nouvel alias à définir sur la cible"
 
-#: lxc/config.go:321
+#: lxc/config.go:360
 msgid "No certificate provided to add"
 msgstr "Un certificat à ajouter n'a pas été fourni"
 
-#: lxc/network.go:257 lxc/network.go:306
+#: lxc/network.go:285 lxc/network.go:338
 msgid "No device found for this network"
 msgstr "Aucun périphérique existant pour ce réseau"
 
-#: lxc/storage.go:371 lxc/storage.go:471
+#: lxc/storage.go:383 lxc/storage.go:503
 #, fuzzy
 msgid "No device found for this storage volume."
 msgstr "Aucun périphérique existant pour ce réseau"
 
-#: lxc/config.go:344
+#: lxc/config.go:392
 msgid "No fingerprint specified."
 msgstr "Aucune empreinte n'a été indiquée."
 
-#: lxc/storage.go:323 lxc/storage.go:407
+#: lxc/storage.go:327 lxc/storage.go:420
 msgid "Only \"custom\" volumes can be attached to containers."
 msgstr "Seul les volumes \"personnalisés\" peuvent être attaché aux conteneurs"
 
-#: lxc/remote.go:135
+#: lxc/remote.go:136
 msgid "Only https URLs are supported for simplestreams"
 msgstr "Seules les URLs https sont supportées par simplestreams"
 
-#: lxc/image.go:549
+#: lxc/image.go:632
 msgid "Only https:// is supported for remote image import."
 msgstr "Seul https:// est supporté par l'import d'images distantes."
 
-#: lxc/network.go:354 lxc/network.go:482
+#: lxc/network.go:394 lxc/network.go:528
 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:112 lxc/main.go:163
+#: lxc/help.go:71 lxc/main.go:120 lxc/main.go:177
 msgid "Options:"
 msgstr "Options :"
 
-#: lxc/image.go:664
-#, c-format
-msgid "Output is in %s"
-msgstr "Le résultat est dans %s"
-
-#: lxc/exec.go:62
+#: lxc/exec.go:63
 msgid "Override the terminal mode (auto, interactive or non-interactive)"
 msgstr "Surcharger le mode terminal (auto, interactif ou non-interactif)"
 
-#: lxc/list.go:611
+#: lxc/list.go:616
 msgid "PERSISTENT"
 msgstr "PERSISTANT"
 
-#: lxc/list.go:461
+#: lxc/list.go:466
 msgid "PID"
 msgstr "PID"
 
-#: lxc/list.go:462
+#: lxc/list.go:467
 msgid "PROFILES"
 msgstr "PROFILS"
 
-#: lxc/remote.go:397
+#: lxc/remote.go:408
 msgid "PROTOCOL"
 msgstr "PROTOCOLE"
 
-#: lxc/image.go:226 lxc/remote.go:398
+#: lxc/image.go:229 lxc/remote.go:409
 msgid "PUBLIC"
 msgstr "PUBLIC"
 
-#: lxc/info.go:190
+#: lxc/info.go:199
 msgid "Packets received"
 msgstr "Paquets reçus"
 
-#: lxc/info.go:191
+#: lxc/info.go:200
 msgid "Packets sent"
 msgstr "Paquets émis"
 
@@ -780,25 +811,25 @@ 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:202
+#: lxc/main.go:216
 #, fuzzy
 msgid "Pause containers."
 msgstr "Création du conteneur"
 
-#: lxc/main.go:35
+#: lxc/main.go:37
 msgid "Permission denied, are you in the lxd group?"
 msgstr "Permission refusée, êtes-vous dans le groupe lxd ?"
 
-#: lxc/info.go:108
+#: lxc/info.go:117
 #, c-format
 msgid "Pid: %d"
 msgstr "Pid : %d"
 
-#: lxc/network.go:379 lxc/profile.go:258 lxc/storage.go:536 lxc/storage.go:855
+#: lxc/network.go:419 lxc/profile.go:268 lxc/storage.go:577 lxc/storage.go:936
 msgid "Press enter to open the editor again"
 msgstr "Appuyer sur Entrée pour ouvrir à nouveau l'éditeur"
 
-#: lxc/config.go:572 lxc/config.go:637 lxc/image.go:869
+#: lxc/config.go:648 lxc/config.go:713 lxc/image.go:1108
 msgid "Press enter to start the editor again"
 msgstr "Appuyer sur Entrée pour lancer à nouveau l'éditeur"
 
@@ -814,145 +845,145 @@ msgstr "Afficher les commandes moins communes"
 msgid "Print verbose information"
 msgstr "Afficher des informations supplémentaires"
 
-#: lxc/info.go:132
+#: lxc/info.go:141
 #, c-format
 msgid "Processes: %d"
 msgstr "Processus : %d"
 
-#: lxc/profile.go:314
+#: lxc/profile.go:344
 #, c-format
 msgid "Profile %s added to %s"
 msgstr "Profil %s ajouté à %s"
 
-#: lxc/profile.go:209
+#: lxc/profile.go:218
 #, c-format
 msgid "Profile %s created"
 msgstr "Profil %s créé"
 
-#: lxc/profile.go:279
+#: lxc/profile.go:292
 #, c-format
 msgid "Profile %s deleted"
 msgstr "Profil %s supprimé"
 
-#: lxc/profile.go:345
+#: lxc/profile.go:379
 #, c-format
 msgid "Profile %s removed from %s"
 msgstr "Profil %s supprimé de %s"
 
-#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:137 lxc/init.go:138
+#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:138 lxc/init.go:139
 msgid "Profile to apply to the new container"
 msgstr "Profil à appliquer au nouveau conteneur"
 
-#: lxc/profile.go:295
+#: lxc/profile.go:321
 #, c-format
 msgid "Profiles %s applied to %s"
 msgstr "Profils %s appliqués à %s"
 
-#: lxc/info.go:106
+#: lxc/info.go:115
 #, c-format
 msgid "Profiles: %s"
 msgstr "Profils : %s"
 
-#: lxc/image.go:479
+#: lxc/image.go:565
 msgid "Properties:"
 msgstr "Propriétés :"
 
-#: lxc/remote.go:69
+#: lxc/remote.go:70
 msgid "Public image server"
 msgstr "Serveur d'images public"
 
-#: lxc/image.go:462
+#: lxc/image.go:548
 #, c-format
 msgid "Public: %s"
 msgstr "Public : %s"
 
-#: lxc/file.go:65 lxc/file.go:66
+#: lxc/file.go:67 lxc/file.go:68
 msgid "Recursively push or pull files"
 msgstr "Pousser ou récupérer des fichiers récursivement"
 
-#: lxc/image.go:413
+#: lxc/image.go:489
 #, fuzzy, c-format
 msgid "Refreshing the image: %s"
 msgstr "Récupération de l'image : %s"
 
-#: lxc/remote.go:67
+#: lxc/remote.go:68
 msgid "Remote admin password"
 msgstr "Mot de passe de l'administrateur distant"
 
-#: lxc/info.go:93
+#: lxc/info.go:101
 #, c-format
 msgid "Remote: %s"
 msgstr "Serveur distant : %s"
 
-#: lxc/delete.go:41
+#: lxc/delete.go:42
 #, c-format
 msgid "Remove %s (yes/no): "
 msgstr "Supprimer %s (oui/non) : "
 
-#: lxc/delete.go:35 lxc/delete.go:36
+#: lxc/delete.go:36 lxc/delete.go:37
 msgid "Require user confirmation"
 msgstr "Requérir une confirmation de l'utilisateur"
 
-#: lxc/info.go:129
+#: lxc/info.go:138
 msgid "Resources:"
 msgstr "Ressources :"
 
-#: lxc/main.go:210
+#: lxc/main.go:224
 #, fuzzy
 msgid "Restart containers."
 msgstr "Création du conteneur"
 
-#: lxc/init.go:253
+#: lxc/init.go:286
 #, c-format
 msgid "Retrieving image: %s"
 msgstr "Récupération de l'image : %s"
 
-#: lxc/image.go:229
+#: lxc/image.go:232
 msgid "SIZE"
 msgstr "TAILLE"
 
-#: lxc/list.go:463
+#: lxc/list.go:468
 msgid "SNAPSHOTS"
 msgstr "INSTANTANÉS"
 
-#: lxc/storage.go:610
+#: lxc/storage.go:656
 msgid "SOURCE"
 msgstr "SOURCE"
 
-#: lxc/list.go:464
+#: lxc/list.go:469
 msgid "STATE"
 msgstr "ÉTAT"
 
-#: lxc/remote.go:399
+#: lxc/remote.go:410
 msgid "STATIC"
 msgstr "STATIQUE"
 
-#: lxc/list.go:466
+#: lxc/list.go:471
 msgid "STORAGE POOL"
 msgstr "ENSEMBLE DE STOCKAGE"
 
-#: lxc/remote.go:240
+#: lxc/remote.go:236
 msgid "Server certificate NACKed by user"
 msgstr "Certificat serveur rejeté par l'utilisateur"
 
-#: lxc/remote.go:302
+#: lxc/remote.go:313
 msgid "Server doesn't trust us after adding our cert"
 msgstr ""
 "Le serveur ne nous fait pas confiance après l'ajout de notre certificat"
 
-#: lxc/remote.go:68
+#: lxc/remote.go:69
 msgid "Server protocol (lxd or simplestreams)"
 msgstr "Protocole du serveur (lxd ou simplestreams)"
 
-#: lxc/file.go:63
+#: lxc/file.go:65
 msgid "Set the file's gid on push"
 msgstr "Définir le gid du fichier lors de l'envoi"
 
-#: lxc/file.go:64
+#: lxc/file.go:66
 msgid "Set the file's perms on push"
 msgstr "Définir les permissions du fichier lors de l'envoi"
 
-#: lxc/file.go:62
+#: lxc/file.go:64
 msgid "Set the file's uid on push"
 msgstr "Définir l'uid du fichier lors de l'envoi"
 
@@ -964,80 +995,85 @@ msgstr "Afficher toutes les comandes (pas seulement les plus intéressantes)"
 msgid "Show client version"
 msgstr "Afficher la version du client"
 
-#: lxc/info.go:38
+#: lxc/info.go:39
 msgid "Show the container's last 100 log lines?"
 msgstr "Afficher les 100 dernières lignes du journal du conteneur ?"
 
-#: lxc/config.go:33
+#: lxc/config.go:35
 msgid "Show the expanded configuration"
 msgstr "Afficher la configuration étendue"
 
-#: lxc/image.go:460
+#: lxc/image.go:546
 #, c-format
 msgid "Size: %.2fMB"
 msgstr "Taille : %.2f Mo"
 
-#: lxc/info.go:210
+#: lxc/info.go:219
 msgid "Snapshots:"
 msgstr "Instantanés :"
 
-#: lxc/action.go:134
+#: lxc/action.go:142
 #, fuzzy, c-format
 msgid "Some containers failed to %s"
 msgstr "L'arrêt du conteneur a échoué !"
 
-#: lxc/image.go:493
+#: lxc/image.go:579
 msgid "Source:"
 msgstr "Source :"
 
-#: lxc/main.go:220
+#: lxc/main.go:234
 #, fuzzy
 msgid "Start containers."
 msgstr "Création du conteneur"
 
-#: lxc/launch.go:152
+#: lxc/launch.go:59
 #, c-format
 msgid "Starting %s"
 msgstr "Démarrage de %s"
 
-#: lxc/info.go:100
+#: lxc/info.go:109
 #, c-format
 msgid "Status: %s"
 msgstr "État : %s"
 
-#: lxc/main.go:226
+#: lxc/main.go:240
 #, fuzzy
 msgid "Stop containers."
 msgstr "L'arrêt du conteneur a échoué !"
 
-#: lxc/publish.go:36 lxc/publish.go:37
+#: lxc/publish.go:37 lxc/publish.go:38
 msgid "Stop the container if currently running"
 msgstr "Arrêter le conteneur s'il est en cours d'exécution"
 
-#: lxc/delete.go:105 lxc/publish.go:114
+#: lxc/publish.go:136
 msgid "Stopping container failed!"
 msgstr "L'arrêt du conteneur a échoué !"
 
-#: lxc/storage.go:436
+#: lxc/delete.go:121
+#, fuzzy, c-format
+msgid "Stopping the container failed: %s"
+msgstr "L'arrêt du conteneur a échoué !"
+
+#: lxc/storage.go:468
 #, fuzzy, c-format
 msgid "Storage pool %s created"
 msgstr "Le réseau %s a été créé"
 
-#: lxc/storage.go:486
+#: lxc/storage.go:527
 #, fuzzy, c-format
 msgid "Storage pool %s deleted"
 msgstr "Le réseau %s a été supprimé"
 
-#: lxc/init.go:143 lxc/init.go:144
+#: lxc/init.go:144 lxc/init.go:145
 msgid "Storage pool name"
 msgstr "Nom de l'ensemble de stockage"
 
-#: lxc/storage.go:720
+#: lxc/storage.go:782
 #, fuzzy, c-format
 msgid "Storage volume %s created"
 msgstr "Profil %s créé"
 
-#: lxc/storage.go:730
+#: lxc/storage.go:797
 #, fuzzy, c-format
 msgid "Storage volume %s deleted"
 msgstr "Profil %s supprimé"
@@ -1046,24 +1082,24 @@ msgstr "Profil %s supprimé"
 msgid "Store the container state (only for stop)"
 msgstr "Forcer l'arrêt du conteneur (seulement pour stop)"
 
-#: lxc/info.go:171
+#: lxc/info.go:180
 msgid "Swap (current)"
 msgstr "Swap (courant)"
 
-#: lxc/info.go:175
+#: lxc/info.go:184
 msgid "Swap (peak)"
 msgstr "Swap (pointe)"
 
-#: lxc/list.go:465 lxc/network.go:459 lxc/storage.go:695
+#: lxc/list.go:470 lxc/network.go:505 lxc/storage.go:747
 msgid "TYPE"
 msgstr "TYPE"
 
-#: lxc/delete.go:91
+#: lxc/delete.go:105
 msgid "The container is currently running, stop it first or pass --force."
 msgstr ""
 "Le conteneur est en cours d'exécution, l'arrêter d'abord ou ajouter --force."
 
-#: lxc/publish.go:92
+#: lxc/publish.go:101
 msgid ""
 "The container is currently running. Use --force to have it stopped and "
 "restarted."
@@ -1071,17 +1107,22 @@ msgstr ""
 "Le conteneur est en cours d'exécution. Utiliser --force pour qu'il soit "
 "arrêté et redémarré."
 
-#: lxc/init.go:326
+#: lxc/init.go:358
 msgid "The container you are starting doesn't have any network attached to it."
 msgstr ""
 "Le conteneur que vous démarrez n'est attaché à aucune interface réseau."
 
-#: lxc/config.go:716 lxc/config.go:728 lxc/config.go:761 lxc/config.go:779
-#: lxc/config.go:817 lxc/config.go:835
+#: lxc/config.go:770 lxc/config.go:787
+#, fuzzy
+msgid "The device already exists"
+msgstr "le serveur distant %s existe déjà"
+
+#: lxc/config.go:833 lxc/config.go:845 lxc/config.go:881 lxc/config.go:899
+#: lxc/config.go:945 lxc/config.go:962 lxc/config.go:1006 lxc/config.go:1022
 msgid "The device doesn't exist"
 msgstr "Le périphérique n'existe pas"
 
-#: lxc/init.go:310
+#: lxc/init.go:342
 #, c-format
 msgid "The local image '%s' couldn't be found, trying '%s:' instead."
 msgstr "L'image locale '%s' n'a pas été trouvée, essayer '%s:' à la place."
@@ -1091,15 +1132,15 @@ msgstr "L'image locale '%s' n'a pas été trouvée, essayer '%s:' à la place."
 msgid "The opposite of \"lxc pause\" is \"lxc start\"."
 msgstr "Le pendant de `lxc pause` est `lxc start`."
 
-#: lxc/network.go:262 lxc/network.go:311 lxc/storage.go:376 lxc/storage.go:476
+#: lxc/network.go:290 lxc/network.go:343 lxc/storage.go:388 lxc/storage.go:508
 msgid "The specified device doesn't exist"
 msgstr "Le périphérique indiqué n'existe pas"
 
-#: lxc/network.go:266 lxc/network.go:315
+#: lxc/network.go:294 lxc/network.go:347
 msgid "The specified device doesn't match the network"
 msgstr "le périphérique indiqué ne correspond pas au réseau"
 
-#: lxc/publish.go:65
+#: lxc/publish.go:74
 msgid "There is no \"image name\".  Did you want an alias?"
 msgstr "Il n'existe pas d'\"image\".  Vouliez-vous un alias ?"
 
@@ -1121,50 +1162,50 @@ msgstr ""
 msgid "Time to wait for the container before killing it"
 msgstr "Temps d'attente du conteneur avant de le tuer"
 
-#: lxc/image.go:463
+#: lxc/image.go:549
 msgid "Timestamps:"
 msgstr "Horodatage :"
 
-#: lxc/init.go:328
+#: lxc/init.go:360
 msgid "To attach a network to a container, use: lxc network attach"
 msgstr "Pour attacher un réseau à un conteneur, utiliser : lxc network attach"
 
-#: lxc/init.go:327
+#: lxc/init.go:359
 msgid "To create a new network, use: lxc network create"
 msgstr "Pour créer un réseau, utiliser : lxc network create"
 
-#: lxc/main.go:140
+#: lxc/main.go:154
 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"
 
-#: lxc/image.go:551
+#: lxc/image.go:657
 #, c-format
 msgid "Transferring image: %s"
 msgstr "Transfert de l'image : %s"
 
-#: lxc/action.go:98 lxc/launch.go:165
+#: lxc/action.go:106 lxc/launch.go:77
 #, c-format
 msgid "Try `lxc info --show-log %s` for more info"
 msgstr "Essayer `lxc info --show-log %s` pour plus d'informations"
 
-#: lxc/info.go:102
+#: lxc/info.go:111
 msgid "Type: ephemeral"
 msgstr "Type : éphémère"
 
-#: lxc/info.go:104
+#: lxc/info.go:113
 msgid "Type: persistent"
 msgstr "Type : persistant"
 
-#: lxc/image.go:230
+#: lxc/image.go:233
 msgid "UPLOAD DATE"
 msgstr "DATE DE PUBLICATION"
 
-#: lxc/remote.go:396
+#: lxc/remote.go:407
 msgid "URL"
 msgstr "URL"
 
-#: lxc/network.go:462 lxc/profile.go:500 lxc/storage.go:611 lxc/storage.go:698
+#: lxc/network.go:508 lxc/profile.go:556 lxc/storage.go:657 lxc/storage.go:750
 msgid "USED BY"
 msgstr "UTILISÉ PAR"
 
@@ -1172,11 +1213,16 @@ msgstr "UTILISÉ PAR"
 msgid "Unable to find help2man."
 msgstr "Impossible de trouver help2man"
 
-#: lxc/remote.go:110
+#: lxc/remote.go:111
 msgid "Unable to read remote TLS certificate"
 msgstr "Impossible de lire le certificat TLS distant"
 
-#: lxc/image.go:468
+#: lxc/file.go:108
+#, c-format
+msgid "Unknown file type '%s'"
+msgstr ""
+
+#: lxc/image.go:554
 #, c-format
 msgid "Uploaded: %s"
 msgstr "Publié : %s"
@@ -1196,7 +1242,7 @@ msgstr ""
 msgid "Usage: lxc <command> [options]"
 msgstr "Utilisation : lxc <commande> [options]"
 
-#: lxc/config.go:58
+#: lxc/config.go:60
 #, fuzzy
 msgid ""
 "Usage: lxc config <subcommand> [options]\n"
@@ -1344,7 +1390,7 @@ msgstr ""
 "lxc copy [<remote>:]<source>[/<snapshot>] [[<remote>:]<destination>] [--"
 "ephemeral|e] [--profile|-p <profile>...] [--config|-c <key=value>...]"
 
-#: lxc/delete.go:26
+#: lxc/delete.go:27
 #, fuzzy
 msgid ""
 "Usage: lxc delete [<remote>:]<container>[/<snapshot>] "
@@ -1360,7 +1406,7 @@ msgstr ""
 "Détruit les conteneurs ou les instantanés ainsi que toute donnée associée "
 "(configuration, instantanés, …)."
 
-#: lxc/exec.go:52
+#: lxc/exec.go:53
 #, fuzzy
 msgid ""
 "Usage: lxc exec [<remote>:]<container> [-t] [-T] [-n] [--mode=auto|"
@@ -1380,7 +1426,7 @@ msgstr ""
 "sélectionné si à la fois stdin et stdout sont des terminaux (stderr\n"
 "est ignoré)."
 
-#: lxc/file.go:36
+#: lxc/file.go:38
 #, fuzzy
 msgid ""
 "Usage: lxc file <subcommand> [options]\n"
@@ -1449,7 +1495,7 @@ msgstr ""
 "\n"
 "Page d'aide pour le client LXD."
 
-#: lxc/image.go:69
+#: lxc/image.go:72
 #, fuzzy
 msgid ""
 "Usage: lxc image <subcommand> [options]\n"
@@ -1631,7 +1677,7 @@ msgstr ""
 "    Lister les alias.  Les filtres peuvent être une partie de l'empreinte\n"
 "    de l'image ou une partie de l'alias de l'image."
 
-#: lxc/info.go:25
+#: lxc/info.go:26
 msgid ""
 "Usage: lxc info [<remote>:][<container>] [--show-log]\n"
 "\n"
@@ -1653,7 +1699,7 @@ msgstr ""
 "lxc info [<serveur distant>:]\n"
 "    Pour l'information du serveur LXD."
 
-#: lxc/init.go:75
+#: lxc/init.go:76
 #, fuzzy
 msgid ""
 "Usage: lxc init [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--"
@@ -1681,7 +1727,7 @@ msgstr ""
 "Exemple :\n"
 "    lxc init ubuntu:16.04 u1"
 
-#: lxc/launch.go:23
+#: lxc/launch.go:20
 #, fuzzy
 msgid ""
 "Usage: lxc launch [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--"
@@ -1899,7 +1945,7 @@ msgstr ""
 "Exemple :\n"
 "lxc monitor --type=logging"
 
-#: lxc/move.go:19
+#: lxc/move.go:22
 #, fuzzy
 msgid ""
 "Usage: lxc move [<remote>:]<container>[/<snapshot>] [<remote>:][<container>[/"
@@ -1930,7 +1976,7 @@ msgstr ""
 "lxc move <container>/<old snapshot name> <container>/<new snapshot name>\n"
 "    Renomme un instantané."
 
-#: lxc/network.go:49
+#: lxc/network.go:50
 #, fuzzy
 msgid ""
 "Usage: lxc network <subcommand> [options]\n"
@@ -2011,7 +2057,7 @@ msgstr ""
 "lxc network detach [<remote>:]<network> <container> [device name]\n"
 "lxc network detach-profile [<remote>:]<network> <container> [device name]"
 
-#: lxc/profile.go:49
+#: lxc/profile.go:51
 #, fuzzy
 msgid ""
 "Usage: lxc profile <subcommand> [options]\n"
@@ -2152,7 +2198,7 @@ msgstr ""
 "    Ajouter un périphérique de profil, comme un disque ou une\n"
 "    interface réseau, aux conteneurs utilisant le profil indiqué."
 
-#: lxc/publish.go:27
+#: lxc/publish.go:28
 #, fuzzy
 msgid ""
 "Usage: lxc publish [<remote>:]<container>[/<snapshot>] [<remote>:] [--"
@@ -2165,7 +2211,7 @@ msgstr ""
 "lxc publish [<remote>:]<container>[/<snapshot>] [<remote>:] [--"
 "alias=ALIAS...] [prop-key=prop-value...]"
 
-#: lxc/remote.go:38
+#: lxc/remote.go:39
 #, fuzzy
 msgid ""
 "Usage: lxc remote <subcommand> [options]\n"
@@ -2213,7 +2259,7 @@ msgstr ""
 "lxc remote get-default                                                      "
 "Afficher le serveur distant par défaut."
 
-#: lxc/restore.go:21
+#: lxc/restore.go:22
 #, fuzzy
 msgid ""
 "Usage: lxc restore [<remote>:]<container> <snapshot> [--stateful]\n"
@@ -2243,7 +2289,7 @@ msgstr ""
 "Restaurer un instantané :\n"
 "    lxc restore u1 snap0"
 
-#: lxc/snapshot.go:21
+#: lxc/snapshot.go:22
 #, fuzzy
 msgid ""
 "Usage: lxc snapshot [<remote>:]<container> <snapshot name> [--stateful]\n"
@@ -2273,7 +2319,7 @@ msgstr ""
 "Exemple :\n"
 "    lxc snapshot u1 snap0"
 
-#: lxc/storage.go:61
+#: lxc/storage.go:62
 msgid ""
 "Usage: lxc storage <subcommand> [options]\n"
 "\n"
@@ -2377,11 +2423,11 @@ msgstr ""
 "\n"
 "lxc version"
 
-#: lxc/delete.go:45
+#: lxc/delete.go:46
 msgid "User aborted delete operation."
 msgstr "L'utilisateur a annulé l'opération de suppression."
 
-#: lxc/restore.go:37
+#: lxc/restore.go:38
 msgid ""
 "Whether or not to restore the container's running state from snapshot (if "
 "available)"
@@ -2389,153 +2435,149 @@ msgstr ""
 "Restaurer ou pas l'état de fonctionnement du conteneur depuis l'instantané "
 "(s'il est disponible)"
 
-#: lxc/snapshot.go:35
+#: lxc/snapshot.go:36
 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:446 lxc/remote.go:371 lxc/remote.go:376
+#: lxc/network.go:492 lxc/remote.go:382 lxc/remote.go:387
 msgid "YES"
 msgstr "OUI"
 
-#: lxc/exec.go:125
+#: lxc/exec.go:126
 msgid "You can't pass -t and -T at the same time"
 msgstr "Il est impossible de passer -t et -T simultanément"
 
-#: lxc/exec.go:129
+#: lxc/exec.go:130
 #, fuzzy
 msgid "You can't pass -t or -T at the same time as --mode"
 msgstr "impossible de copier vers le même nom de conteneur"
 
-#: lxc/main.go:56
+#: lxc/copy.go:57
+#, fuzzy
+msgid "You must specify a source container name"
+msgstr "vous devez spécifier un nom de conteneur source"
+
+#: lxc/main.go:58
 msgid "`lxc config profile` is deprecated, please use `lxc profile`"
 msgstr ""
 "La commande `lxc config profile` est dépréciée, merci d'utiliser `lxc "
 "profile`"
 
-#: lxc/launch.go:134
-msgid "bad number of things scanned from image, container or snapshot"
-msgstr "mauvais nombre d'éléments dans l'image, conteneur ou instantané"
-
-#: lxc/action.go:94
-msgid "bad result type from action"
-msgstr "mauvais type de réponse renvoyé par l'action !"
-
-#: lxc/copy.go:118
-msgid "can't copy to the same container name"
-msgstr "impossible de copier vers le même nom de conteneur"
-
-#: lxc/file.go:314
-msgid "can't pull a directory without --recursive"
-msgstr "impossible de récupérer un répertoire sans --recursive"
-
-#: lxc/remote.go:359
+#: lxc/remote.go:370
 msgid "can't remove the default remote"
 msgstr "impossible de supprimer le serveur distant par défaut"
 
-#: lxc/file.go:125
+#: lxc/file.go:269
 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:385
+#: lxc/remote.go:396
 msgid "default"
 msgstr "par défaut"
 
-#: lxc/copy.go:134 lxc/copy.go:139 lxc/copy.go:258 lxc/copy.go:263
-#: lxc/init.go:234 lxc/init.go:239 lxc/launch.go:115 lxc/launch.go:121
+#: lxc/init.go:308
 msgid "didn't get any affected image, container or snapshot from server"
 msgstr "pas d'image, conteneur ou instantané affecté sur ce serveur"
 
-#: lxc/image.go:454
+#: lxc/image.go:540
 msgid "disabled"
 msgstr "désactivé"
 
-#: lxc/image.go:456
+#: lxc/image.go:542
 msgid "enabled"
 msgstr "activé"
 
-#: lxc/action.go:126 lxc/main.go:26 lxc/main.go:159
+#: lxc/action.go:134 lxc/main.go:28 lxc/main.go:173
 #, c-format
 msgid "error: %v"
 msgstr "erreur : %v"
 
-#: lxc/help.go:37 lxc/main.go:106
+#: lxc/help.go:37 lxc/main.go:114
 #, c-format
 msgid "error: unknown command: %s"
 msgstr "erreur : commande inconnue: %s"
 
-#: lxc/launch.go:139
-msgid "got bad version"
-msgstr "reçu une mauvaise version"
-
-#: lxc/image.go:202 lxc/image.go:449
+#: lxc/image.go:205 lxc/image.go:535
 msgid "no"
 msgstr "non"
 
-#: lxc/copy.go:167
-msgid "not all the profiles from the source exist on the target"
-msgstr "tous les profils de la source n'existent pas sur la cible"
-
-#: lxc/remote.go:233
+#: lxc/remote.go:229
 msgid "ok (y/n)?"
 msgstr "ok (y/n) ?"
 
-#: lxc/main.go:331 lxc/main.go:335
+#: lxc/main.go:345 lxc/main.go:349
 #, c-format
 msgid "processing aliases failed %s\n"
 msgstr "l'analyse des alias a échoué %s\n"
 
-#: lxc/file.go:381
+#: lxc/file.go:541
 msgid "recursive edit doesn't make sense :("
 msgstr "l'édition récursive ne fait aucun sens :("
 
-#: lxc/remote.go:421
+#: lxc/remote.go:432
 #, c-format
 msgid "remote %s already exists"
 msgstr "le serveur distant %s existe déjà"
 
-#: lxc/remote.go:351 lxc/remote.go:413 lxc/remote.go:448 lxc/remote.go:464
+#: lxc/remote.go:362 lxc/remote.go:424 lxc/remote.go:459 lxc/remote.go:475
 #, c-format
 msgid "remote %s doesn't exist"
 msgstr "le serveur distant %s n'existe pas"
 
-#: lxc/remote.go:334
+#: lxc/remote.go:345
 #, c-format
 msgid "remote %s exists as <%s>"
 msgstr "le serveur distant %s existe en tant que <%s>"
 
-#: lxc/remote.go:355 lxc/remote.go:417 lxc/remote.go:452
+#: lxc/remote.go:366 lxc/remote.go:428 lxc/remote.go:463
 #, c-format
 msgid "remote %s is static and cannot be modified"
 msgstr "le serveur distant %s est statique et ne peut être modifié"
 
-#: lxc/info.go:221
+#: lxc/info.go:230
 msgid "stateful"
 msgstr "à suivi d'état"
 
-#: lxc/info.go:223
+#: lxc/info.go:232
 msgid "stateless"
 msgstr "sans suivi d'état"
 
-#: lxc/info.go:217
+#: lxc/info.go:226
 #, c-format
 msgid "taken at %s"
 msgstr "pris à %s"
 
-#: lxc/exec.go:214
-msgid "unreachable return reached"
-msgstr "Un retour impossible à été renvoyé"
-
-#: lxc/main.go:262
+#: lxc/main.go:276
 msgid "wrong number of subcommand arguments"
 msgstr "nombre d'arguments incorrect pour la sous-comande"
 
-#: lxc/delete.go:44 lxc/image.go:200 lxc/image.go:451
+#: lxc/delete.go:45 lxc/image.go:203 lxc/image.go:537
 msgid "yes"
 msgstr "oui"
 
-#: lxc/copy.go:47
-msgid "you must specify a source container name"
-msgstr "vous devez spécifier un nom de conteneur source"
+#~ msgid "Migration failed on source host: %s"
+#~ msgstr "Échec lors de la migration vers l'hôte source: %s"
+
+#~ msgid "can't copy to the same container name"
+#~ msgstr "impossible de copier vers le même nom de conteneur"
+
+#~ msgid "not all the profiles from the source exist on the target"
+#~ msgstr "tous les profils de la source n'existent pas sur la cible"
+
+#~ msgid "Output is in %s"
+#~ msgstr "Le résultat est dans %s"
+
+#~ msgid "bad number of things scanned from image, container or snapshot"
+#~ msgstr "mauvais nombre d'éléments dans l'image, conteneur ou instantané"
+
+#~ msgid "bad result type from action"
+#~ msgstr "mauvais type de réponse renvoyé par l'action !"
+
+#~ msgid "got bad version"
+#~ msgstr "reçu une mauvaise version"
+
+#~ msgid "unreachable return reached"
+#~ msgstr "Un retour impossible à été renvoyé"
 
 #~ msgid "Format"
 #~ msgstr "Format"
diff --git a/po/it.po b/po/it.po
index 2839bfc32..edea7ffaa 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-06-13 20:10+0200\n"
+"POT-Creation-Date: 2017-06-17 03:18+0000\n"
 "PO-Revision-Date: 2017-05-09 20:42+0000\n"
 "Last-Translator: Alberto Donato <alberto.donato at gmail.com>\n"
 "Language-Team: Italian <https://hosted.weblate.org/projects/linux-containers/"
@@ -19,7 +19,7 @@ msgstr ""
 "Plural-Forms: nplurals=2; plural=n != 1;\n"
 "X-Generator: Weblate 2.14-dev\n"
 
-#: lxc/storage.go:30
+#: lxc/storage.go:31
 msgid ""
 "### This is a yaml representation of a storage pool.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -36,7 +36,7 @@ msgid ""
 "###   zfs.pool_name: default"
 msgstr ""
 
-#: lxc/storage.go:47
+#: lxc/storage.go:48
 msgid ""
 "### This is a yaml representation of a storage volume.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -50,7 +50,7 @@ msgid ""
 "###   size: \"61203283968\""
 msgstr ""
 
-#: lxc/config.go:37
+#: lxc/config.go:39
 msgid ""
 "### This is a yaml representation of the configuration.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -71,7 +71,7 @@ msgid ""
 "### Note that the name is shown but cannot be changed"
 msgstr ""
 
-#: lxc/image.go:59
+#: lxc/image.go:62
 msgid ""
 "### This is a yaml representation of the image properties.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -81,7 +81,7 @@ msgid ""
 "###  description: My custom image"
 msgstr ""
 
-#: lxc/network.go:29
+#: lxc/network.go:30
 msgid ""
 "### This is a yaml representation of the network.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -101,7 +101,7 @@ msgid ""
 "### Note that only the configuration can be changed."
 msgstr ""
 
-#: lxc/profile.go:28
+#: lxc/profile.go:30
 msgid ""
 "### This is a yaml representation of the profile.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -122,106 +122,130 @@ msgid ""
 "### Note that the name is shown but cannot be changed"
 msgstr ""
 
-#: lxc/image.go:179
+#: lxc/image.go:182
 #, c-format
 msgid "%s (%d more)"
 msgstr "%s (altri %d)"
 
-#: lxc/snapshot.go:58
+#: lxc/file.go:183
+#, c-format
+msgid "%s is not a directory"
+msgstr ""
+
+#: lxc/file.go:125
+#, c-format
+msgid "'%s' isn't a regular file or directory."
+msgstr ""
+
+#: lxc/snapshot.go:53
 msgid "'/' not allowed in snapshot name"
 msgstr "'/' non è permesso nel nome di uno snapshot"
 
-#: lxc/profile.go:293
+#: lxc/profile.go:319
 msgid "(none)"
 msgstr "(nessuno)"
 
-#: lxc/image.go:223 lxc/image.go:814
+#: lxc/image.go:226 lxc/image.go:1052
 msgid "ALIAS"
 msgstr ""
 
-#: lxc/image.go:224
+#: lxc/image.go:227
 msgid "ALIASES"
 msgstr ""
 
-#: lxc/image.go:228
+#: lxc/image.go:231
 msgid "ARCH"
 msgstr "ARCH"
 
-#: lxc/list.go:456
+#: lxc/list.go:461
 msgid "ARCHITECTURE"
 msgstr "ARCHITETTURA"
 
-#: lxc/remote.go:66
+#: lxc/remote.go:67
 msgid "Accept certificate"
 msgstr ""
 
-#: lxc/remote.go:282
+#: lxc/remote.go:281
 #, c-format
 msgid "Admin password for %s: "
 msgstr ""
 
-#: lxc/image.go:483
+#: lxc/image.go:569
 msgid "Aliases:"
 msgstr ""
 
-#: lxc/image.go:461 lxc/info.go:95
+#: lxc/image.go:547 lxc/info.go:104
 #, c-format
 msgid "Architecture: %s"
 msgstr ""
 
-#: lxc/image.go:491
+#: lxc/image.go:577
 #, c-format
 msgid "Auto update: %s"
 msgstr ""
 
-#: lxc/info.go:188
+#: lxc/image.go:651
+#, c-format
+msgid "Bad property: %s"
+msgstr ""
+
+#: lxc/info.go:197
 msgid "Bytes received"
 msgstr "Bytes ricevuti"
 
-#: lxc/info.go:189
+#: lxc/info.go:198
 msgid "Bytes sent"
 msgstr ""
 
-#: lxc/config.go:310
+#: lxc/config.go:349
 msgid "COMMON NAME"
 msgstr ""
 
-#: lxc/info.go:152
+#: lxc/info.go:161
 msgid "CPU usage (in seconds)"
 msgstr ""
 
-#: lxc/info.go:156
+#: lxc/info.go:165
 msgid "CPU usage:"
 msgstr ""
 
-#: lxc/list.go:457
+#: lxc/list.go:462
 msgid "CREATED AT"
 msgstr ""
 
-#: lxc/config.go:150 lxc/network.go:496
+#: lxc/file.go:470
+msgid "Can't pull a directory without --recursive"
+msgstr ""
+
+#: lxc/config.go:156 lxc/network.go:542
 #, c-format
 msgid "Can't read from stdin: %s"
 msgstr ""
 
-#: lxc/config.go:163 lxc/config.go:196 lxc/config.go:218
+#: lxc/config.go:169
+#, c-format
+msgid "Can't unset key '%s', it's not currently set"
+msgstr ""
+
+#: lxc/config.go:211 lxc/config.go:237
 #, c-format
 msgid "Can't unset key '%s', it's not currently set."
 msgstr ""
 
-#: lxc/network.go:422 lxc/profile.go:472 lxc/storage.go:579
+#: lxc/network.go:468 lxc/profile.go:528 lxc/storage.go:625
 msgid "Cannot provide container name to list"
 msgstr ""
 
-#: lxc/remote.go:232
+#: lxc/remote.go:228
 #, c-format
 msgid "Certificate fingerprint: %s"
 msgstr ""
 
-#: lxc/remote.go:305
+#: lxc/remote.go:316
 msgid "Client certificate stored at server: "
 msgstr ""
 
-#: lxc/image.go:167 lxc/image.go:168 lxc/list.go:128 lxc/list.go:129
+#: lxc/image.go:170 lxc/image.go:171 lxc/list.go:128 lxc/list.go:129
 msgid "Columns"
 msgstr ""
 
@@ -229,35 +253,35 @@ msgstr ""
 msgid "Commands:"
 msgstr ""
 
-#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:135 lxc/init.go:136
+#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:136 lxc/init.go:137
 msgid "Config key/value to apply to the new container"
 msgstr ""
 
-#: lxc/config.go:571 lxc/config.go:636 lxc/image.go:868 lxc/network.go:378
-#: lxc/profile.go:257 lxc/storage.go:535 lxc/storage.go:854
+#: lxc/config.go:647 lxc/config.go:712 lxc/image.go:1107 lxc/network.go:418
+#: lxc/profile.go:267 lxc/storage.go:576 lxc/storage.go:935
 #, c-format
 msgid "Config parsing error: %s"
 msgstr ""
 
-#: lxc/main.go:33
+#: lxc/main.go:35
 msgid "Connection refused; is LXD running?"
 msgstr ""
 
-#: lxc/publish.go:62
+#: lxc/publish.go:71
 msgid "Container name is mandatory"
 msgstr ""
 
-#: lxc/copy.go:143 lxc/copy.go:267 lxc/init.go:244
+#: lxc/copy.go:210 lxc/init.go:313
 #, c-format
 msgid "Container name is: %s"
 msgstr ""
 
-#: lxc/publish.go:160 lxc/publish.go:175
+#: lxc/publish.go:250
 #, c-format
 msgid "Container published with fingerprint: %s"
 msgstr ""
 
-#: lxc/image.go:170
+#: lxc/image.go:173
 msgid "Copy aliases from source"
 msgstr ""
 
@@ -265,85 +289,90 @@ msgstr ""
 msgid "Copy the container without its snapshots"
 msgstr ""
 
-#: lxc/image.go:360
+#: lxc/image.go:422
 #, c-format
 msgid "Copying the image: %s"
 msgstr ""
 
-#: lxc/remote.go:247
+#: lxc/remote.go:243
 msgid "Could not create server cert dir"
 msgstr ""
 
-#: lxc/file.go:67 lxc/file.go:68
+#: lxc/file.go:69 lxc/file.go:70
 msgid "Create any directories necessary"
 msgstr ""
 
-#: lxc/image.go:466 lxc/info.go:97
+#: lxc/image.go:552 lxc/info.go:106
 #, c-format
 msgid "Created: %s"
 msgstr ""
 
-#: lxc/init.go:182 lxc/launch.go:142
+#: lxc/init.go:194
 #, c-format
 msgid "Creating %s"
 msgstr ""
 
-#: lxc/init.go:180
+#: lxc/init.go:192
 msgid "Creating the container"
 msgstr ""
 
-#: lxc/image.go:227 lxc/image.go:816 lxc/list.go:458 lxc/network.go:461
-#: lxc/storage.go:608 lxc/storage.go:697
+#: lxc/image.go:230 lxc/image.go:1054 lxc/list.go:463 lxc/network.go:507
+#: lxc/storage.go:654 lxc/storage.go:749
 msgid "DESCRIPTION"
 msgstr ""
 
-#: lxc/storage.go:609
+#: lxc/storage.go:655
 msgid "DRIVER"
 msgstr ""
 
-#: lxc/publish.go:38
+#: lxc/publish.go:39
 msgid "Define a compression algorithm: for image or none"
 msgstr ""
 
-#: lxc/config.go:688
+#: lxc/config.go:803
 #, c-format
 msgid "Device %s added to %s"
 msgstr ""
 
-#: lxc/config.go:875
+#: lxc/config.go:1037
 #, c-format
 msgid "Device %s removed from %s"
 msgstr ""
 
-#: lxc/exec.go:64
-msgid "Disable pseudo-terminal allocation"
+#: lxc/utils.go:248 lxc/utils.go:272
+#, c-format
+msgid "Device already exists: %s"
 msgstr ""
 
 #: lxc/exec.go:65
+msgid "Disable pseudo-terminal allocation"
+msgstr ""
+
+#: lxc/exec.go:66
 msgid "Disable stdin (reads from /dev/null)"
 msgstr ""
 
-#: lxc/info.go:145
+#: lxc/info.go:154
 msgid "Disk usage:"
 msgstr ""
 
-#: lxc/list.go:609
+#: lxc/list.go:614
 msgid "EPHEMERAL"
 msgstr ""
 
-#: lxc/config.go:312
+#: lxc/config.go:351
 msgid "EXPIRY DATE"
 msgstr ""
 
-#: lxc/main.go:45
+#: lxc/main.go:47
 msgid "Enable debug mode"
 msgstr ""
 
-#: lxc/main.go:44
+#: lxc/main.go:46
 msgid "Enable verbose mode"
 msgstr ""
 
-#: lxc/exec.go:61
+#: lxc/exec.go:62
 msgid "Environment variable to set (e.g. HOME=/home/foo)"
 msgstr ""
 
@@ -351,7 +380,7 @@ msgstr ""
 msgid "Environment:"
 msgstr ""
 
-#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:139 lxc/init.go:140
+#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:140 lxc/init.go:141
 msgid "Ephemeral container"
 msgstr ""
 
@@ -359,16 +388,21 @@ msgstr ""
 msgid "Event type to listen for"
 msgstr ""
 
-#: lxc/image.go:470
+#: lxc/image.go:556
 #, c-format
 msgid "Expires: %s"
 msgstr ""
 
-#: lxc/image.go:472
+#: lxc/image.go:558
 msgid "Expires: never"
 msgstr ""
 
-#: lxc/config.go:309 lxc/image.go:225 lxc/image.go:815
+#: lxc/image.go:848
+#, c-format
+msgid "Exporting the image: %s"
+msgstr ""
+
+#: lxc/config.go:348 lxc/image.go:228 lxc/image.go:1053
 msgid "FINGERPRINT"
 msgstr ""
 
@@ -382,16 +416,25 @@ msgstr ""
 msgid "Failed to generate 'lxc.1': %v"
 msgstr ""
 
+#: lxc/copy.go:205
+msgid "Failed to get the new container name"
+msgstr ""
+
+#: lxc/file.go:120
+#, c-format
+msgid "Failed to walk path for %s: %s"
+msgstr ""
+
 #: lxc/list.go:131
 msgid "Fast mode (same as --columns=nsacPt)"
 msgstr ""
 
-#: lxc/image.go:459
+#: lxc/image.go:545
 #, c-format
 msgid "Fingerprint: %s"
 msgstr ""
 
-#: lxc/exec.go:63
+#: lxc/exec.go:64
 msgid "Force pseudo-terminal allocation"
 msgstr ""
 
@@ -399,39 +442,39 @@ msgstr ""
 msgid "Force the container to shutdown"
 msgstr ""
 
-#: lxc/delete.go:33 lxc/delete.go:34
+#: lxc/delete.go:34 lxc/delete.go:35
 msgid "Force the removal of stopped containers"
 msgstr ""
 
-#: lxc/main.go:46
+#: lxc/main.go:48
 msgid "Force using the local unix socket"
 msgstr ""
 
-#: lxc/image.go:173 lxc/list.go:130
+#: lxc/image.go:176 lxc/list.go:130
 msgid "Format (csv|json|table|yaml)"
 msgstr ""
 
-#: lxc/remote.go:80
+#: lxc/remote.go:81
 msgid "Generating a client certificate. This may take a minute..."
 msgstr ""
 
-#: lxc/list.go:454
+#: lxc/list.go:459
 msgid "IPV4"
 msgstr ""
 
-#: lxc/list.go:455
+#: lxc/list.go:460
 msgid "IPV6"
 msgstr ""
 
-#: lxc/config.go:311
+#: lxc/config.go:350
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:139
+#: lxc/main.go:153
 msgid "If this is your first time using LXD, you should also run: lxd init"
 msgstr ""
 
-#: lxc/main.go:47
+#: lxc/main.go:49
 msgid "Ignore aliases when determining what command to run"
 msgstr ""
 
@@ -439,245 +482,229 @@ msgstr ""
 msgid "Ignore the container state (only for start)"
 msgstr ""
 
-#: lxc/image.go:422
+#: lxc/image.go:508
 msgid "Image already up to date."
 msgstr ""
 
-#: lxc/image.go:363
+#: lxc/image.go:436
 msgid "Image copied successfully!"
 msgstr ""
 
-#: lxc/image.go:546 lxc/image.go:558
+#: lxc/image.go:898
+msgid "Image exported successfully!"
+msgstr ""
+
+#: lxc/image.go:709
 #, c-format
 msgid "Image imported with fingerprint: %s"
 msgstr ""
 
-#: lxc/image.go:420
+#: lxc/image.go:506
 msgid "Image refreshed successfully!"
 msgstr ""
 
-#: lxc/image.go:543
-#, c-format
-msgid "Importing the image: %s"
-msgstr ""
-
-#: lxc/remote.go:150
+#: lxc/remote.go:151
 #, c-format
 msgid "Invalid URL scheme \"%s\" in \"%s\""
 msgstr ""
 
-#: lxc/config.go:290
+#: lxc/config.go:329
 msgid "Invalid certificate"
 msgstr ""
 
-#: lxc/init.go:30 lxc/init.go:35
+#: lxc/init.go:31 lxc/init.go:36
 msgid "Invalid configuration key"
 msgstr ""
 
-#: lxc/file.go:357
+#: lxc/file.go:513
 #, c-format
 msgid "Invalid path %s"
 msgstr ""
 
-#: lxc/file.go:291
+#: lxc/file.go:443
 #, c-format
 msgid "Invalid source %s"
 msgstr ""
 
-#: lxc/file.go:80
+#: lxc/file.go:221
 #, c-format
 msgid "Invalid target %s"
 msgstr ""
 
-#: lxc/info.go:126
+#: lxc/info.go:135
 msgid "Ips:"
 msgstr ""
 
-#: lxc/image.go:171
+#: lxc/image.go:174
 msgid "Keep the image up to date after initial copy"
 msgstr ""
 
-#: lxc/list.go:459
+#: lxc/list.go:464
 msgid "LAST USED AT"
 msgstr ""
 
-#: lxc/main.go:31
+#: lxc/main.go:33
 msgid "LXD socket not found; is LXD installed and running?"
 msgstr ""
 
-#: lxc/image.go:475
+#: lxc/image.go:561
 #, c-format
 msgid "Last used: %s"
 msgstr ""
 
-#: lxc/image.go:477
+#: lxc/image.go:563
 msgid "Last used: never"
 msgstr ""
 
-#: lxc/info.go:241
+#: lxc/info.go:250
 msgid "Log:"
 msgstr ""
 
-#: lxc/network.go:460
+#: lxc/network.go:506
 msgid "MANAGED"
 msgstr ""
 
-#: lxc/image.go:169
+#: lxc/image.go:172
 msgid "Make image public"
 msgstr ""
 
-#: lxc/publish.go:34
+#: lxc/publish.go:35
 msgid "Make the image public"
 msgstr ""
 
-#: lxc/info.go:163
+#: lxc/info.go:172
 msgid "Memory (current)"
 msgstr ""
 
-#: lxc/info.go:167
+#: lxc/info.go:176
 msgid "Memory (peak)"
 msgstr ""
 
-#: lxc/info.go:179
+#: lxc/info.go:188
 msgid "Memory usage:"
 msgstr ""
 
-#: lxc/copy.go:276
-#, c-format
-msgid "Migration failed on source host: %s"
-msgstr ""
-
-#: lxc/copy.go:280
-#, c-format
-msgid "Migration failed on target host: %s"
-msgstr ""
-
-#: lxc/utils.go:201
+#: lxc/utils.go:199
 msgid "Missing summary."
 msgstr ""
 
-#: lxc/network.go:248 lxc/network.go:297 lxc/storage.go:362 lxc/storage.go:462
+#: lxc/network.go:276 lxc/network.go:329 lxc/storage.go:374 lxc/storage.go:494
 msgid "More than one device matches, specify the device name."
 msgstr ""
 
-#: lxc/file.go:279
+#: lxc/file.go:431
 msgid "More than one file to download, but target is not a directory"
 msgstr ""
 
-#: lxc/move.go:35
+#: lxc/move.go:38
 msgid "Move the container without its snapshots"
 msgstr ""
 
-#: lxc/action.go:68
+#: lxc/action.go:72
 msgid "Must supply container name for: "
 msgstr ""
 
-#: lxc/list.go:460 lxc/network.go:458 lxc/profile.go:499 lxc/remote.go:395
-#: lxc/storage.go:607 lxc/storage.go:696
+#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:406
+#: lxc/storage.go:653 lxc/storage.go:748
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:444 lxc/remote.go:369 lxc/remote.go:374
+#: lxc/network.go:490 lxc/remote.go:380 lxc/remote.go:385
 msgid "NO"
 msgstr ""
 
-#: lxc/info.go:91
+#: lxc/info.go:99
 #, c-format
 msgid "Name: %s"
 msgstr ""
 
-#: lxc/network.go:222
+#: lxc/network.go:250
 #, c-format
 msgid "Network %s created"
 msgstr ""
 
-#: lxc/network.go:325
+#: lxc/network.go:366
 #, c-format
 msgid "Network %s deleted"
 msgstr ""
 
-#: lxc/init.go:141 lxc/init.go:142
+#: lxc/init.go:142 lxc/init.go:143
 msgid "Network name"
 msgstr ""
 
-#: lxc/info.go:196
+#: lxc/info.go:205
 msgid "Network usage:"
 msgstr ""
 
-#: lxc/image.go:172 lxc/publish.go:35
+#: lxc/image.go:175 lxc/publish.go:36
 msgid "New alias to define at target"
 msgstr ""
 
-#: lxc/config.go:321
+#: lxc/config.go:360
 msgid "No certificate provided to add"
 msgstr ""
 
-#: lxc/network.go:257 lxc/network.go:306
+#: lxc/network.go:285 lxc/network.go:338
 msgid "No device found for this network"
 msgstr ""
 
-#: lxc/storage.go:371 lxc/storage.go:471
+#: lxc/storage.go:383 lxc/storage.go:503
 msgid "No device found for this storage volume."
 msgstr ""
 
-#: lxc/config.go:344
+#: lxc/config.go:392
 msgid "No fingerprint specified."
 msgstr ""
 
-#: lxc/storage.go:323 lxc/storage.go:407
+#: lxc/storage.go:327 lxc/storage.go:420
 msgid "Only \"custom\" volumes can be attached to containers."
 msgstr ""
 
-#: lxc/remote.go:135
+#: lxc/remote.go:136
 msgid "Only https URLs are supported for simplestreams"
 msgstr ""
 
-#: lxc/image.go:549
+#: lxc/image.go:632
 msgid "Only https:// is supported for remote image import."
 msgstr ""
 
-#: lxc/network.go:354 lxc/network.go:482
+#: lxc/network.go:394 lxc/network.go:528
 msgid "Only managed networks can be modified."
 msgstr ""
 
-#: lxc/help.go:71 lxc/main.go:112 lxc/main.go:163
+#: lxc/help.go:71 lxc/main.go:120 lxc/main.go:177
 msgid "Options:"
 msgstr ""
 
-#: lxc/image.go:664
-#, c-format
-msgid "Output is in %s"
-msgstr ""
-
-#: lxc/exec.go:62
+#: lxc/exec.go:63
 msgid "Override the terminal mode (auto, interactive or non-interactive)"
 msgstr ""
 
-#: lxc/list.go:611
+#: lxc/list.go:616
 msgid "PERSISTENT"
 msgstr ""
 
-#: lxc/list.go:461
+#: lxc/list.go:466
 msgid "PID"
 msgstr ""
 
-#: lxc/list.go:462
+#: lxc/list.go:467
 msgid "PROFILES"
 msgstr ""
 
-#: lxc/remote.go:397
+#: lxc/remote.go:408
 msgid "PROTOCOL"
 msgstr ""
 
-#: lxc/image.go:226 lxc/remote.go:398
+#: lxc/image.go:229 lxc/remote.go:409
 msgid "PUBLIC"
 msgstr ""
 
-#: lxc/info.go:190
+#: lxc/info.go:199
 msgid "Packets received"
 msgstr ""
 
-#: lxc/info.go:191
+#: lxc/info.go:200
 msgid "Packets sent"
 msgstr ""
 
@@ -689,24 +716,24 @@ msgstr ""
 msgid "Path to an alternate server directory"
 msgstr ""
 
-#: lxc/main.go:202
+#: lxc/main.go:216
 msgid "Pause containers."
 msgstr ""
 
-#: lxc/main.go:35
+#: lxc/main.go:37
 msgid "Permission denied, are you in the lxd group?"
 msgstr ""
 
-#: lxc/info.go:108
+#: lxc/info.go:117
 #, c-format
 msgid "Pid: %d"
 msgstr ""
 
-#: lxc/network.go:379 lxc/profile.go:258 lxc/storage.go:536 lxc/storage.go:855
+#: lxc/network.go:419 lxc/profile.go:268 lxc/storage.go:577 lxc/storage.go:936
 msgid "Press enter to open the editor again"
 msgstr ""
 
-#: lxc/config.go:572 lxc/config.go:637 lxc/image.go:869
+#: lxc/config.go:648 lxc/config.go:713 lxc/image.go:1108
 msgid "Press enter to start the editor again"
 msgstr ""
 
@@ -722,143 +749,143 @@ msgstr ""
 msgid "Print verbose information"
 msgstr ""
 
-#: lxc/info.go:132
+#: lxc/info.go:141
 #, c-format
 msgid "Processes: %d"
 msgstr ""
 
-#: lxc/profile.go:314
+#: lxc/profile.go:344
 #, c-format
 msgid "Profile %s added to %s"
 msgstr ""
 
-#: lxc/profile.go:209
+#: lxc/profile.go:218
 #, c-format
 msgid "Profile %s created"
 msgstr ""
 
-#: lxc/profile.go:279
+#: lxc/profile.go:292
 #, c-format
 msgid "Profile %s deleted"
 msgstr ""
 
-#: lxc/profile.go:345
+#: lxc/profile.go:379
 #, c-format
 msgid "Profile %s removed from %s"
 msgstr ""
 
-#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:137 lxc/init.go:138
+#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:138 lxc/init.go:139
 msgid "Profile to apply to the new container"
 msgstr ""
 
-#: lxc/profile.go:295
+#: lxc/profile.go:321
 #, c-format
 msgid "Profiles %s applied to %s"
 msgstr ""
 
-#: lxc/info.go:106
+#: lxc/info.go:115
 #, c-format
 msgid "Profiles: %s"
 msgstr ""
 
-#: lxc/image.go:479
+#: lxc/image.go:565
 msgid "Properties:"
 msgstr ""
 
-#: lxc/remote.go:69
+#: lxc/remote.go:70
 msgid "Public image server"
 msgstr ""
 
-#: lxc/image.go:462
+#: lxc/image.go:548
 #, c-format
 msgid "Public: %s"
 msgstr ""
 
-#: lxc/file.go:65 lxc/file.go:66
+#: lxc/file.go:67 lxc/file.go:68
 msgid "Recursively push or pull files"
 msgstr ""
 
-#: lxc/image.go:413
+#: lxc/image.go:489
 #, c-format
 msgid "Refreshing the image: %s"
 msgstr ""
 
-#: lxc/remote.go:67
+#: lxc/remote.go:68
 msgid "Remote admin password"
 msgstr ""
 
-#: lxc/info.go:93
+#: lxc/info.go:101
 #, c-format
 msgid "Remote: %s"
 msgstr ""
 
-#: lxc/delete.go:41
+#: lxc/delete.go:42
 #, c-format
 msgid "Remove %s (yes/no): "
 msgstr ""
 
-#: lxc/delete.go:35 lxc/delete.go:36
+#: lxc/delete.go:36 lxc/delete.go:37
 msgid "Require user confirmation"
 msgstr ""
 
-#: lxc/info.go:129
+#: lxc/info.go:138
 msgid "Resources:"
 msgstr ""
 
-#: lxc/main.go:210
+#: lxc/main.go:224
 msgid "Restart containers."
 msgstr ""
 
-#: lxc/init.go:253
+#: lxc/init.go:286
 #, c-format
 msgid "Retrieving image: %s"
 msgstr ""
 
-#: lxc/image.go:229
+#: lxc/image.go:232
 msgid "SIZE"
 msgstr ""
 
-#: lxc/list.go:463
+#: lxc/list.go:468
 msgid "SNAPSHOTS"
 msgstr ""
 
-#: lxc/storage.go:610
+#: lxc/storage.go:656
 msgid "SOURCE"
 msgstr ""
 
-#: lxc/list.go:464
+#: lxc/list.go:469
 msgid "STATE"
 msgstr ""
 
-#: lxc/remote.go:399
+#: lxc/remote.go:410
 msgid "STATIC"
 msgstr ""
 
-#: lxc/list.go:466
+#: lxc/list.go:471
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/remote.go:240
+#: lxc/remote.go:236
 msgid "Server certificate NACKed by user"
 msgstr ""
 
-#: lxc/remote.go:302
+#: lxc/remote.go:313
 msgid "Server doesn't trust us after adding our cert"
 msgstr ""
 
-#: lxc/remote.go:68
+#: lxc/remote.go:69
 msgid "Server protocol (lxd or simplestreams)"
 msgstr ""
 
-#: lxc/file.go:63
+#: lxc/file.go:65
 msgid "Set the file's gid on push"
 msgstr ""
 
-#: lxc/file.go:64
+#: lxc/file.go:66
 msgid "Set the file's perms on push"
 msgstr ""
 
-#: lxc/file.go:62
+#: lxc/file.go:64
 msgid "Set the file's uid on push"
 msgstr ""
 
@@ -870,78 +897,83 @@ msgstr ""
 msgid "Show client version"
 msgstr ""
 
-#: lxc/info.go:38
+#: lxc/info.go:39
 msgid "Show the container's last 100 log lines?"
 msgstr ""
 
-#: lxc/config.go:33
+#: lxc/config.go:35
 msgid "Show the expanded configuration"
 msgstr ""
 
-#: lxc/image.go:460
+#: lxc/image.go:546
 #, c-format
 msgid "Size: %.2fMB"
 msgstr ""
 
-#: lxc/info.go:210
+#: lxc/info.go:219
 msgid "Snapshots:"
 msgstr ""
 
-#: lxc/action.go:134
+#: lxc/action.go:142
 #, c-format
 msgid "Some containers failed to %s"
 msgstr ""
 
-#: lxc/image.go:493
+#: lxc/image.go:579
 msgid "Source:"
 msgstr ""
 
-#: lxc/main.go:220
+#: lxc/main.go:234
 msgid "Start containers."
 msgstr ""
 
-#: lxc/launch.go:152
+#: lxc/launch.go:59
 #, c-format
 msgid "Starting %s"
 msgstr ""
 
-#: lxc/info.go:100
+#: lxc/info.go:109
 #, c-format
 msgid "Status: %s"
 msgstr ""
 
-#: lxc/main.go:226
+#: lxc/main.go:240
 msgid "Stop containers."
 msgstr ""
 
-#: lxc/publish.go:36 lxc/publish.go:37
+#: lxc/publish.go:37 lxc/publish.go:38
 msgid "Stop the container if currently running"
 msgstr ""
 
-#: lxc/delete.go:105 lxc/publish.go:114
+#: lxc/publish.go:136
 msgid "Stopping container failed!"
 msgstr ""
 
-#: lxc/storage.go:436
+#: lxc/delete.go:121
+#, c-format
+msgid "Stopping the container failed: %s"
+msgstr ""
+
+#: lxc/storage.go:468
 #, c-format
 msgid "Storage pool %s created"
 msgstr ""
 
-#: lxc/storage.go:486
+#: lxc/storage.go:527
 #, c-format
 msgid "Storage pool %s deleted"
 msgstr ""
 
-#: lxc/init.go:143 lxc/init.go:144
+#: lxc/init.go:144 lxc/init.go:145
 msgid "Storage pool name"
 msgstr ""
 
-#: lxc/storage.go:720
+#: lxc/storage.go:782
 #, c-format
 msgid "Storage volume %s created"
 msgstr ""
 
-#: lxc/storage.go:730
+#: lxc/storage.go:797
 #, c-format
 msgid "Storage volume %s deleted"
 msgstr ""
@@ -950,38 +982,42 @@ msgstr ""
 msgid "Store the container state (only for stop)"
 msgstr ""
 
-#: lxc/info.go:171
+#: lxc/info.go:180
 msgid "Swap (current)"
 msgstr ""
 
-#: lxc/info.go:175
+#: lxc/info.go:184
 msgid "Swap (peak)"
 msgstr ""
 
-#: lxc/list.go:465 lxc/network.go:459 lxc/storage.go:695
+#: lxc/list.go:470 lxc/network.go:505 lxc/storage.go:747
 msgid "TYPE"
 msgstr ""
 
-#: lxc/delete.go:91
+#: lxc/delete.go:105
 msgid "The container is currently running, stop it first or pass --force."
 msgstr ""
 
-#: lxc/publish.go:92
+#: lxc/publish.go:101
 msgid ""
 "The container is currently running. Use --force to have it stopped and "
 "restarted."
 msgstr ""
 
-#: lxc/init.go:326
+#: lxc/init.go:358
 msgid "The container you are starting doesn't have any network attached to it."
 msgstr ""
 
-#: lxc/config.go:716 lxc/config.go:728 lxc/config.go:761 lxc/config.go:779
-#: lxc/config.go:817 lxc/config.go:835
+#: lxc/config.go:770 lxc/config.go:787
+msgid "The device already exists"
+msgstr ""
+
+#: lxc/config.go:833 lxc/config.go:845 lxc/config.go:881 lxc/config.go:899
+#: lxc/config.go:945 lxc/config.go:962 lxc/config.go:1006 lxc/config.go:1022
 msgid "The device doesn't exist"
 msgstr ""
 
-#: lxc/init.go:310
+#: lxc/init.go:342
 #, c-format
 msgid "The local image '%s' couldn't be found, trying '%s:' instead."
 msgstr ""
@@ -990,15 +1026,15 @@ msgstr ""
 msgid "The opposite of \"lxc pause\" is \"lxc start\"."
 msgstr ""
 
-#: lxc/network.go:262 lxc/network.go:311 lxc/storage.go:376 lxc/storage.go:476
+#: lxc/network.go:290 lxc/network.go:343 lxc/storage.go:388 lxc/storage.go:508
 msgid "The specified device doesn't exist"
 msgstr ""
 
-#: lxc/network.go:266 lxc/network.go:315
+#: lxc/network.go:294 lxc/network.go:347
 msgid "The specified device doesn't match the network"
 msgstr ""
 
-#: lxc/publish.go:65
+#: lxc/publish.go:74
 msgid "There is no \"image name\".  Did you want an alias?"
 msgstr ""
 
@@ -1014,49 +1050,49 @@ msgstr ""
 msgid "Time to wait for the container before killing it"
 msgstr ""
 
-#: lxc/image.go:463
+#: lxc/image.go:549
 msgid "Timestamps:"
 msgstr ""
 
-#: lxc/init.go:328
+#: lxc/init.go:360
 msgid "To attach a network to a container, use: lxc network attach"
 msgstr ""
 
-#: lxc/init.go:327
+#: lxc/init.go:359
 msgid "To create a new network, use: lxc network create"
 msgstr ""
 
-#: lxc/main.go:140
+#: lxc/main.go:154
 msgid "To start your first container, try: lxc launch ubuntu:16.04"
 msgstr ""
 
-#: lxc/image.go:551
+#: lxc/image.go:657
 #, c-format
 msgid "Transferring image: %s"
 msgstr ""
 
-#: lxc/action.go:98 lxc/launch.go:165
+#: lxc/action.go:106 lxc/launch.go:77
 #, c-format
 msgid "Try `lxc info --show-log %s` for more info"
 msgstr ""
 
-#: lxc/info.go:102
+#: lxc/info.go:111
 msgid "Type: ephemeral"
 msgstr ""
 
-#: lxc/info.go:104
+#: lxc/info.go:113
 msgid "Type: persistent"
 msgstr ""
 
-#: lxc/image.go:230
+#: lxc/image.go:233
 msgid "UPLOAD DATE"
 msgstr ""
 
-#: lxc/remote.go:396
+#: lxc/remote.go:407
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:462 lxc/profile.go:500 lxc/storage.go:611 lxc/storage.go:698
+#: lxc/network.go:508 lxc/profile.go:556 lxc/storage.go:657 lxc/storage.go:750
 msgid "USED BY"
 msgstr ""
 
@@ -1064,11 +1100,16 @@ msgstr ""
 msgid "Unable to find help2man."
 msgstr ""
 
-#: lxc/remote.go:110
+#: lxc/remote.go:111
 msgid "Unable to read remote TLS certificate"
 msgstr ""
 
-#: lxc/image.go:468
+#: lxc/file.go:108
+#, c-format
+msgid "Unknown file type '%s'"
+msgstr ""
+
+#: lxc/image.go:554
 #, c-format
 msgid "Uploaded: %s"
 msgstr ""
@@ -1085,7 +1126,7 @@ msgstr ""
 msgid "Usage: lxc <command> [options]"
 msgstr ""
 
-#: lxc/config.go:58
+#: lxc/config.go:60
 msgid ""
 "Usage: lxc config <subcommand> [options]\n"
 "\n"
@@ -1171,7 +1212,7 @@ msgid ""
 "Copy containers within or in between LXD instances."
 msgstr ""
 
-#: lxc/delete.go:26
+#: lxc/delete.go:27
 msgid ""
 "Usage: lxc delete [<remote>:]<container>[/<snapshot>] "
 "[[<remote>:]<container>[/<snapshot>]...]\n"
@@ -1179,7 +1220,7 @@ msgid ""
 "Delete containers and snapshots."
 msgstr ""
 
-#: lxc/exec.go:52
+#: lxc/exec.go:53
 msgid ""
 "Usage: lxc exec [<remote>:]<container> [-t] [-T] [-n] [--mode=auto|"
 "interactive|non-interactive] [--env KEY=VALUE...] [--] <command line>\n"
@@ -1190,7 +1231,7 @@ msgid ""
 "AND stdout are terminals (stderr is ignored)."
 msgstr ""
 
-#: lxc/file.go:36
+#: lxc/file.go:38
 msgid ""
 "Usage: lxc file <subcommand> [options]\n"
 "\n"
@@ -1234,7 +1275,7 @@ msgid ""
 "Help page for the LXD client."
 msgstr ""
 
-#: lxc/image.go:69
+#: lxc/image.go:72
 msgid ""
 "Usage: lxc image <subcommand> [options]\n"
 "\n"
@@ -1339,7 +1380,7 @@ msgid ""
 "image alias name."
 msgstr ""
 
-#: lxc/info.go:25
+#: lxc/info.go:26
 msgid ""
 "Usage: lxc info [<remote>:][<container>] [--show-log]\n"
 "\n"
@@ -1352,7 +1393,7 @@ msgid ""
 "    For LXD server information."
 msgstr ""
 
-#: lxc/init.go:75
+#: lxc/init.go:76
 msgid ""
 "Usage: lxc init [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--"
 "profile|-p <profile>...] [--config|-c <key=value>...] [--network|-n "
@@ -1367,7 +1408,7 @@ msgid ""
 "    lxc init ubuntu:16.04 u1"
 msgstr ""
 
-#: lxc/launch.go:23
+#: lxc/launch.go:20
 msgid ""
 "Usage: lxc launch [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--"
 "profile|-p <profile>...] [--config|-c <key=value>...] [--network|-n "
@@ -1496,7 +1537,7 @@ msgid ""
 "    Only show log message."
 msgstr ""
 
-#: lxc/move.go:19
+#: lxc/move.go:22
 msgid ""
 "Usage: lxc move [<remote>:]<container>[/<snapshot>] [<remote>:][<container>[/"
 "<snapshot>]] [--container-only]\n"
@@ -1515,7 +1556,7 @@ msgid ""
 "    Rename a snapshot."
 msgstr ""
 
-#: lxc/network.go:49
+#: lxc/network.go:50
 msgid ""
 "Usage: lxc network <subcommand> [options]\n"
 "\n"
@@ -1568,7 +1609,7 @@ msgid ""
 "    Update a network using the content of network.yaml"
 msgstr ""
 
-#: lxc/profile.go:49
+#: lxc/profile.go:51
 msgid ""
 "Usage: lxc profile <subcommand> [options]\n"
 "\n"
@@ -1650,7 +1691,7 @@ msgid ""
 "    Remove all profile from \"foo\""
 msgstr ""
 
-#: lxc/publish.go:27
+#: lxc/publish.go:28
 msgid ""
 "Usage: lxc publish [<remote>:]<container>[/<snapshot>] [<remote>:] [--"
 "alias=ALIAS...] [prop-key=prop-value...]\n"
@@ -1658,7 +1699,7 @@ msgid ""
 "Publish containers as images."
 msgstr ""
 
-#: lxc/remote.go:38
+#: lxc/remote.go:39
 msgid ""
 "Usage: lxc remote <subcommand> [options]\n"
 "\n"
@@ -1687,7 +1728,7 @@ msgid ""
 "    Print the default remote."
 msgstr ""
 
-#: lxc/restore.go:21
+#: lxc/restore.go:22
 msgid ""
 "Usage: lxc restore [<remote>:]<container> <snapshot> [--stateful]\n"
 "\n"
@@ -1703,7 +1744,7 @@ msgid ""
 "    Restore the snapshot."
 msgstr ""
 
-#: lxc/snapshot.go:21
+#: lxc/snapshot.go:22
 msgid ""
 "Usage: lxc snapshot [<remote>:]<container> <snapshot name> [--stateful]\n"
 "\n"
@@ -1717,7 +1758,7 @@ msgid ""
 "    Create a snapshot of \"u1\" called \"snap0\"."
 msgstr ""
 
-#: lxc/storage.go:61
+#: lxc/storage.go:62
 msgid ""
 "Usage: lxc storage <subcommand> [options]\n"
 "\n"
@@ -1817,157 +1858,128 @@ msgid ""
 "Print the version number of this client tool."
 msgstr ""
 
-#: lxc/delete.go:45
+#: lxc/delete.go:46
 msgid "User aborted delete operation."
 msgstr ""
 
-#: lxc/restore.go:37
+#: lxc/restore.go:38
 msgid ""
 "Whether or not to restore the container's running state from snapshot (if "
 "available)"
 msgstr ""
 
-#: lxc/snapshot.go:35
+#: lxc/snapshot.go:36
 msgid "Whether or not to snapshot the container's running state"
 msgstr ""
 
-#: lxc/network.go:446 lxc/remote.go:371 lxc/remote.go:376
+#: lxc/network.go:492 lxc/remote.go:382 lxc/remote.go:387
 msgid "YES"
 msgstr ""
 
-#: lxc/exec.go:125
+#: lxc/exec.go:126
 msgid "You can't pass -t and -T at the same time"
 msgstr ""
 
-#: lxc/exec.go:129
+#: lxc/exec.go:130
 msgid "You can't pass -t or -T at the same time as --mode"
 msgstr ""
 
-#: lxc/main.go:56
-msgid "`lxc config profile` is deprecated, please use `lxc profile`"
-msgstr ""
-
-#: lxc/launch.go:134
-msgid "bad number of things scanned from image, container or snapshot"
-msgstr ""
-
-#: lxc/action.go:94
-msgid "bad result type from action"
+#: lxc/copy.go:57
+msgid "You must specify a source container name"
 msgstr ""
 
-#: lxc/copy.go:118
-msgid "can't copy to the same container name"
-msgstr ""
-
-#: lxc/file.go:314
-msgid "can't pull a directory without --recursive"
+#: lxc/main.go:58
+msgid "`lxc config profile` is deprecated, please use `lxc profile`"
 msgstr ""
 
-#: lxc/remote.go:359
+#: lxc/remote.go:370
 msgid "can't remove the default remote"
 msgstr ""
 
-#: lxc/file.go:125
+#: lxc/file.go:269
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr ""
 
-#: lxc/remote.go:385
+#: lxc/remote.go:396
 msgid "default"
 msgstr ""
 
-#: lxc/copy.go:134 lxc/copy.go:139 lxc/copy.go:258 lxc/copy.go:263
-#: lxc/init.go:234 lxc/init.go:239 lxc/launch.go:115 lxc/launch.go:121
+#: lxc/init.go:308
 msgid "didn't get any affected image, container or snapshot from server"
 msgstr ""
 
-#: lxc/image.go:454
+#: lxc/image.go:540
 msgid "disabled"
 msgstr ""
 
-#: lxc/image.go:456
+#: lxc/image.go:542
 msgid "enabled"
 msgstr ""
 
-#: lxc/action.go:126 lxc/main.go:26 lxc/main.go:159
+#: lxc/action.go:134 lxc/main.go:28 lxc/main.go:173
 #, c-format
 msgid "error: %v"
 msgstr ""
 
-#: lxc/help.go:37 lxc/main.go:106
+#: lxc/help.go:37 lxc/main.go:114
 #, c-format
 msgid "error: unknown command: %s"
 msgstr ""
 
-#: lxc/launch.go:139
-msgid "got bad version"
-msgstr ""
-
-#: lxc/image.go:202 lxc/image.go:449
+#: lxc/image.go:205 lxc/image.go:535
 msgid "no"
 msgstr ""
 
-#: lxc/copy.go:167
-msgid "not all the profiles from the source exist on the target"
-msgstr ""
-
-#: lxc/remote.go:233
+#: lxc/remote.go:229
 msgid "ok (y/n)?"
 msgstr ""
 
-#: lxc/main.go:331 lxc/main.go:335
+#: lxc/main.go:345 lxc/main.go:349
 #, c-format
 msgid "processing aliases failed %s\n"
 msgstr ""
 
-#: lxc/file.go:381
+#: lxc/file.go:541
 msgid "recursive edit doesn't make sense :("
 msgstr ""
 
-#: lxc/remote.go:421
+#: lxc/remote.go:432
 #, c-format
 msgid "remote %s already exists"
 msgstr ""
 
-#: lxc/remote.go:351 lxc/remote.go:413 lxc/remote.go:448 lxc/remote.go:464
+#: lxc/remote.go:362 lxc/remote.go:424 lxc/remote.go:459 lxc/remote.go:475
 #, c-format
 msgid "remote %s doesn't exist"
 msgstr ""
 
-#: lxc/remote.go:334
+#: lxc/remote.go:345
 #, c-format
 msgid "remote %s exists as <%s>"
 msgstr ""
 
-#: lxc/remote.go:355 lxc/remote.go:417 lxc/remote.go:452
+#: lxc/remote.go:366 lxc/remote.go:428 lxc/remote.go:463
 #, c-format
 msgid "remote %s is static and cannot be modified"
 msgstr ""
 
-#: lxc/info.go:221
+#: lxc/info.go:230
 msgid "stateful"
 msgstr ""
 
-#: lxc/info.go:223
+#: lxc/info.go:232
 msgid "stateless"
 msgstr ""
 
-#: lxc/info.go:217
+#: lxc/info.go:226
 #, c-format
 msgid "taken at %s"
 msgstr ""
 
-#: lxc/exec.go:214
-msgid "unreachable return reached"
-msgstr ""
-
-#: lxc/main.go:262
+#: lxc/main.go:276
 msgid "wrong number of subcommand arguments"
 msgstr ""
 
-#: lxc/delete.go:44 lxc/image.go:200 lxc/image.go:451
+#: lxc/delete.go:45 lxc/image.go:203 lxc/image.go:537
 msgid "yes"
 msgstr ""
-
-#: lxc/copy.go:47
-msgid "you must specify a source container name"
-msgstr ""
diff --git a/po/ja.po b/po/ja.po
index c92a3b037..9221628ba 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-06-13 20:10+0200\n"
+"POT-Creation-Date: 2017-06-17 03:18+0000\n"
 "PO-Revision-Date: 2017-03-23 12:03+0000\n"
 "Last-Translator: KATOH Yasufumi <karma at jazz.email.ne.jp>\n"
 "Language-Team: Japanese <https://hosted.weblate.org/projects/linux-"
@@ -19,7 +19,7 @@ msgstr ""
 "Plural-Forms: nplurals=1; plural=0;\n"
 "X-Generator: Weblate 2.12\n"
 
-#: lxc/storage.go:30
+#: lxc/storage.go:31
 msgid ""
 "### This is a yaml representation of a storage pool.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -36,7 +36,7 @@ msgid ""
 "###   zfs.pool_name: default"
 msgstr ""
 
-#: lxc/storage.go:47
+#: lxc/storage.go:48
 msgid ""
 "### This is a yaml representation of a storage volume.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -50,7 +50,7 @@ msgid ""
 "###   size: \"61203283968\""
 msgstr ""
 
-#: lxc/config.go:37
+#: lxc/config.go:39
 msgid ""
 "### This is a yaml representation of the configuration.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -71,7 +71,7 @@ msgid ""
 "### Note that the name is shown but cannot be changed"
 msgstr ""
 
-#: lxc/image.go:59
+#: lxc/image.go:62
 msgid ""
 "### This is a yaml representation of the image properties.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -81,7 +81,7 @@ msgid ""
 "###  description: My custom image"
 msgstr ""
 
-#: lxc/network.go:29
+#: lxc/network.go:30
 msgid ""
 "### This is a yaml representation of the network.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -101,7 +101,7 @@ msgid ""
 "### Note that only the configuration can be changed."
 msgstr ""
 
-#: lxc/profile.go:28
+#: lxc/profile.go:30
 msgid ""
 "### This is a yaml representation of the profile.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -122,106 +122,132 @@ msgid ""
 "### Note that the name is shown but cannot be changed"
 msgstr ""
 
-#: lxc/image.go:179
+#: lxc/image.go:182
 #, c-format
 msgid "%s (%d more)"
 msgstr ""
 
-#: lxc/snapshot.go:58
+#: lxc/file.go:183
+#, c-format
+msgid "%s is not a directory"
+msgstr ""
+
+#: lxc/file.go:125
+#, c-format
+msgid "'%s' isn't a regular file or directory."
+msgstr ""
+
+#: lxc/snapshot.go:53
 msgid "'/' not allowed in snapshot name"
 msgstr "'/' はスナップショットの名前には使用できません"
 
-#: lxc/profile.go:293
+#: lxc/profile.go:319
 msgid "(none)"
 msgstr ""
 
-#: lxc/image.go:223 lxc/image.go:814
+#: lxc/image.go:226 lxc/image.go:1052
 msgid "ALIAS"
 msgstr ""
 
-#: lxc/image.go:224
+#: lxc/image.go:227
 msgid "ALIASES"
 msgstr ""
 
-#: lxc/image.go:228
+#: lxc/image.go:231
 msgid "ARCH"
 msgstr ""
 
-#: lxc/list.go:456
+#: lxc/list.go:461
 msgid "ARCHITECTURE"
 msgstr ""
 
-#: lxc/remote.go:66
+#: lxc/remote.go:67
 msgid "Accept certificate"
 msgstr "証明書を受け入れます"
 
-#: lxc/remote.go:282
+#: lxc/remote.go:281
 #, c-format
 msgid "Admin password for %s: "
 msgstr "%s の管理者パスワード: "
 
-#: lxc/image.go:483
+#: lxc/image.go:569
 msgid "Aliases:"
 msgstr "エイリアス:"
 
-#: lxc/image.go:461 lxc/info.go:95
+#: lxc/image.go:547 lxc/info.go:104
 #, c-format
 msgid "Architecture: %s"
 msgstr "アーキテクチャ: %s"
 
-#: lxc/image.go:491
+#: lxc/image.go:577
 #, c-format
 msgid "Auto update: %s"
 msgstr "自動更新: %s"
 
-#: lxc/info.go:188
+#: lxc/image.go:651
+#, fuzzy, c-format
+msgid "Bad property: %s"
+msgstr "(不正なイメージプロパティ形式: %s\n"
+
+#: lxc/info.go:197
 msgid "Bytes received"
 msgstr "受信バイト数"
 
-#: lxc/info.go:189
+#: lxc/info.go:198
 msgid "Bytes sent"
 msgstr "送信バイト数"
 
-#: lxc/config.go:310
+#: lxc/config.go:349
 msgid "COMMON NAME"
 msgstr ""
 
-#: lxc/info.go:152
+#: lxc/info.go:161
 msgid "CPU usage (in seconds)"
 msgstr "CPU使用量(秒)"
 
-#: lxc/info.go:156
+#: lxc/info.go:165
 msgid "CPU usage:"
 msgstr "CPU使用量:"
 
-#: lxc/list.go:457
+#: lxc/list.go:462
 msgid "CREATED AT"
 msgstr ""
 
-#: lxc/config.go:150 lxc/network.go:496
+#: lxc/file.go:470
+#, fuzzy
+msgid "Can't pull a directory without --recursive"
+msgstr ""
+"ディレクトリを pull する場合は --recursive オプションを使用してください"
+
+#: lxc/config.go:156 lxc/network.go:542
 #, c-format
 msgid "Can't read from stdin: %s"
 msgstr "標準入力から読み込めません: %s"
 
-#: lxc/config.go:163 lxc/config.go:196 lxc/config.go:218
+#: lxc/config.go:169
+#, fuzzy, c-format
+msgid "Can't unset key '%s', it's not currently set"
+msgstr "キー '%s' が指定されていないので削除できません。"
+
+#: lxc/config.go:211 lxc/config.go:237
 #, c-format
 msgid "Can't unset key '%s', it's not currently set."
 msgstr "キー '%s' が指定されていないので削除できません。"
 
-#: lxc/network.go:422 lxc/profile.go:472 lxc/storage.go:579
+#: lxc/network.go:468 lxc/profile.go:528 lxc/storage.go:625
 msgid "Cannot provide container name to list"
 msgstr "コンテナ名を取得できません"
 
-#: lxc/remote.go:232
+#: lxc/remote.go:228
 #, fuzzy, c-format
 msgid "Certificate fingerprint: %s"
 msgstr "証明書のフィンガープリント: %x"
 
-#: lxc/remote.go:305
+#: lxc/remote.go:316
 msgid "Client certificate stored at server: "
 msgstr "クライアント証明書がサーバに格納されました: "
 
-#: lxc/image.go:167 lxc/image.go:168 lxc/list.go:128 lxc/list.go:129
+#: lxc/image.go:170 lxc/image.go:171 lxc/list.go:128 lxc/list.go:129
 msgid "Columns"
 msgstr "カラムレイアウト"
 
@@ -229,35 +255,35 @@ msgstr "カラムレイアウト"
 msgid "Commands:"
 msgstr "コマンド:"
 
-#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:135 lxc/init.go:136
+#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:136 lxc/init.go:137
 msgid "Config key/value to apply to the new container"
 msgstr "新しいコンテナに適用するキー/値の設定"
 
-#: lxc/config.go:571 lxc/config.go:636 lxc/image.go:868 lxc/network.go:378
-#: lxc/profile.go:257 lxc/storage.go:535 lxc/storage.go:854
+#: lxc/config.go:647 lxc/config.go:712 lxc/image.go:1107 lxc/network.go:418
+#: lxc/profile.go:267 lxc/storage.go:576 lxc/storage.go:935
 #, c-format
 msgid "Config parsing error: %s"
 msgstr "設定の構文エラー: %s"
 
-#: lxc/main.go:33
+#: lxc/main.go:35
 msgid "Connection refused; is LXD running?"
 msgstr "接続が拒否されました。LXDが実行されていますか?"
 
-#: lxc/publish.go:62
+#: lxc/publish.go:71
 msgid "Container name is mandatory"
 msgstr "コンテナ名を指定する必要があります"
 
-#: lxc/copy.go:143 lxc/copy.go:267 lxc/init.go:244
+#: lxc/copy.go:210 lxc/init.go:313
 #, c-format
 msgid "Container name is: %s"
 msgstr "コンテナ名: %s"
 
-#: lxc/publish.go:160 lxc/publish.go:175
+#: lxc/publish.go:250
 #, c-format
 msgid "Container published with fingerprint: %s"
 msgstr "コンテナは以下のフィンガープリントで publish されます: %s"
 
-#: lxc/image.go:170
+#: lxc/image.go:173
 msgid "Copy aliases from source"
 msgstr "ソースからエイリアスをコピーしました"
 
@@ -266,85 +292,90 @@ msgstr "ソースからエイリアスをコピーしました"
 msgid "Copy the container without its snapshots"
 msgstr "コンテナを強制シャットダウンします"
 
-#: lxc/image.go:360
+#: lxc/image.go:422
 #, c-format
 msgid "Copying the image: %s"
 msgstr "イメージのコピー中: %s"
 
-#: lxc/remote.go:247
+#: lxc/remote.go:243
 msgid "Could not create server cert dir"
 msgstr "サーバ証明書格納用のディレクトリを作成できません"
 
-#: lxc/file.go:67 lxc/file.go:68
+#: lxc/file.go:69 lxc/file.go:70
 msgid "Create any directories necessary"
 msgstr "必要なディレクトリをすべて作成します"
 
-#: lxc/image.go:466 lxc/info.go:97
+#: lxc/image.go:552 lxc/info.go:106
 #, c-format
 msgid "Created: %s"
 msgstr "作成日時: %s"
 
-#: lxc/init.go:182 lxc/launch.go:142
+#: lxc/init.go:194
 #, c-format
 msgid "Creating %s"
 msgstr "%s を作成中"
 
-#: lxc/init.go:180
+#: lxc/init.go:192
 msgid "Creating the container"
 msgstr "コンテナを作成中"
 
-#: lxc/image.go:227 lxc/image.go:816 lxc/list.go:458 lxc/network.go:461
-#: lxc/storage.go:608 lxc/storage.go:697
+#: lxc/image.go:230 lxc/image.go:1054 lxc/list.go:463 lxc/network.go:507
+#: lxc/storage.go:654 lxc/storage.go:749
 msgid "DESCRIPTION"
 msgstr ""
 
-#: lxc/storage.go:609
+#: lxc/storage.go:655
 msgid "DRIVER"
 msgstr ""
 
-#: lxc/publish.go:38
+#: lxc/publish.go:39
 msgid "Define a compression algorithm: for image or none"
 msgstr "圧縮アルゴリズムを指定します: 圧縮アルゴリズム名 or none"
 
-#: lxc/config.go:688
+#: lxc/config.go:803
 #, c-format
 msgid "Device %s added to %s"
 msgstr "デバイス %s が %s に追加されました"
 
-#: lxc/config.go:875
+#: lxc/config.go:1037
 #, c-format
 msgid "Device %s removed from %s"
 msgstr "デバイス %s が %s から削除されました"
 
-#: lxc/exec.go:64
+#: lxc/utils.go:248 lxc/utils.go:272
+#, fuzzy, c-format
+msgid "Device already exists: %s"
+msgstr "リモート %s は既に存在します"
+
+#: lxc/exec.go:65
 msgid "Disable pseudo-terminal allocation"
 msgstr "擬似端末の割り当てを無効にします"
 
-#: lxc/exec.go:65
+#: lxc/exec.go:66
 msgid "Disable stdin (reads from /dev/null)"
 msgstr "標準入力を無効にします (/dev/null から読み込みます)"
 
-#: lxc/info.go:145
+#: lxc/info.go:154
 msgid "Disk usage:"
 msgstr "ディスク使用量:"
 
-#: lxc/list.go:609
+#: lxc/list.go:614
 msgid "EPHEMERAL"
 msgstr ""
 
-#: lxc/config.go:312
+#: lxc/config.go:351
 msgid "EXPIRY DATE"
 msgstr ""
 
-#: lxc/main.go:45
+#: lxc/main.go:47
 msgid "Enable debug mode"
 msgstr "デバッグモードを有効にします"
 
-#: lxc/main.go:44
+#: lxc/main.go:46
 msgid "Enable verbose mode"
 msgstr "詳細モードを有効にします"
 
-#: lxc/exec.go:61
+#: lxc/exec.go:62
 msgid "Environment variable to set (e.g. HOME=/home/foo)"
 msgstr "環境変数を設定します (例: HOME=/home/foo)"
 
@@ -352,7 +383,7 @@ msgstr "環境変数を設定します (例: HOME=/home/foo)"
 msgid "Environment:"
 msgstr "環境変数:"
 
-#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:139 lxc/init.go:140
+#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:140 lxc/init.go:141
 msgid "Ephemeral container"
 msgstr "Ephemeral コンテナ"
 
@@ -360,16 +391,21 @@ msgstr "Ephemeral コンテナ"
 msgid "Event type to listen for"
 msgstr "Listenするイベントタイプ"
 
-#: lxc/image.go:470
+#: lxc/image.go:556
 #, c-format
 msgid "Expires: %s"
 msgstr "失効日時: %s"
 
-#: lxc/image.go:472
+#: lxc/image.go:558
 msgid "Expires: never"
 msgstr "失効日時: 失効しない"
 
-#: lxc/config.go:309 lxc/image.go:225 lxc/image.go:815
+#: lxc/image.go:848
+#, fuzzy, c-format
+msgid "Exporting the image: %s"
+msgstr "イメージのインポート中: %s"
+
+#: lxc/config.go:348 lxc/image.go:228 lxc/image.go:1053
 msgid "FINGERPRINT"
 msgstr ""
 
@@ -383,17 +419,27 @@ msgstr "'lxc.%s.1' の生成が失敗しました: %v"
 msgid "Failed to generate 'lxc.1': %v"
 msgstr "'lxc.1' の生成が失敗しました: %v"
 
+#: lxc/copy.go:205
+#, fuzzy
+msgid "Failed to get the new container name"
+msgstr "新しいコンテナに適用するプロファイル"
+
+#: lxc/file.go:120
+#, c-format
+msgid "Failed to walk path for %s: %s"
+msgstr ""
+
 #: lxc/list.go:131
 #, fuzzy
 msgid "Fast mode (same as --columns=nsacPt)"
 msgstr "Fast モード (--columns=nsacPt と同じ)"
 
-#: lxc/image.go:459
+#: lxc/image.go:545
 #, c-format
 msgid "Fingerprint: %s"
 msgstr "証明書のフィンガープリント: %s"
 
-#: lxc/exec.go:63
+#: lxc/exec.go:64
 msgid "Force pseudo-terminal allocation"
 msgstr "強制的に擬似端末を割り当てます"
 
@@ -401,39 +447,39 @@ msgstr "強制的に擬似端末を割り当てます"
 msgid "Force the container to shutdown"
 msgstr "コンテナを強制シャットダウンします"
 
-#: lxc/delete.go:33 lxc/delete.go:34
+#: lxc/delete.go:34 lxc/delete.go:35
 msgid "Force the removal of stopped containers"
 msgstr "停止したコンテナを強制的に削除します"
 
-#: lxc/main.go:46
+#: lxc/main.go:48
 msgid "Force using the local unix socket"
 msgstr "強制的にローカルのUNIXソケットを使います"
 
-#: lxc/image.go:173 lxc/list.go:130
+#: lxc/image.go:176 lxc/list.go:130
 msgid "Format (csv|json|table|yaml)"
 msgstr ""
 
-#: lxc/remote.go:80
+#: lxc/remote.go:81
 msgid "Generating a client certificate. This may take a minute..."
 msgstr "クライアント証明書を生成します。1分ぐらいかかります..."
 
-#: lxc/list.go:454
+#: lxc/list.go:459
 msgid "IPV4"
 msgstr "IPV4"
 
-#: lxc/list.go:455
+#: lxc/list.go:460
 msgid "IPV6"
 msgstr "IPV6"
 
-#: lxc/config.go:311
+#: lxc/config.go:350
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:139
+#: lxc/main.go:153
 msgid "If this is your first time using LXD, you should also run: lxd init"
 msgstr "初めて LXD を使う場合、lxd init と実行する必要があります"
 
-#: lxc/main.go:47
+#: lxc/main.go:49
 msgid "Ignore aliases when determining what command to run"
 msgstr "どのコマンドを実行するか決める際にエイリアスを無視します"
 
@@ -441,249 +487,234 @@ msgstr "どのコマンドを実行するか決める際にエイリアスを無
 msgid "Ignore the container state (only for start)"
 msgstr "コンテナの状態を無視します (startのみ)"
 
-#: lxc/image.go:422
+#: lxc/image.go:508
 msgid "Image already up to date."
 msgstr ""
 
-#: lxc/image.go:363
+#: lxc/image.go:436
 msgid "Image copied successfully!"
 msgstr "イメージのコピーが成功しました!"
 
-#: lxc/image.go:546 lxc/image.go:558
+#: lxc/image.go:898
+#, fuzzy
+msgid "Image exported successfully!"
+msgstr "イメージのコピーが成功しました!"
+
+#: lxc/image.go:709
 #, c-format
 msgid "Image imported with fingerprint: %s"
 msgstr "イメージは以下のフィンガープリントでインポートされました: %s"
 
-#: lxc/image.go:420
+#: lxc/image.go:506
 #, fuzzy
 msgid "Image refreshed successfully!"
 msgstr "イメージのコピーが成功しました!"
 
-#: lxc/image.go:543
-#, c-format
-msgid "Importing the image: %s"
-msgstr "イメージのインポート中: %s"
-
-#: lxc/remote.go:150
+#: lxc/remote.go:151
 #, c-format
 msgid "Invalid URL scheme \"%s\" in \"%s\""
 msgstr "不正な URL スキーム \"%s\" (\"%s\" 内)"
 
-#: lxc/config.go:290
+#: lxc/config.go:329
 msgid "Invalid certificate"
 msgstr "不正な証明書です"
 
-#: lxc/init.go:30 lxc/init.go:35
+#: lxc/init.go:31 lxc/init.go:36
 msgid "Invalid configuration key"
 msgstr "正しくない設定項目 (key) です"
 
-#: lxc/file.go:357
+#: lxc/file.go:513
 #, c-format
 msgid "Invalid path %s"
 msgstr "不正なパス %s"
 
-#: lxc/file.go:291
+#: lxc/file.go:443
 #, c-format
 msgid "Invalid source %s"
 msgstr "不正なソース %s"
 
-#: lxc/file.go:80
+#: lxc/file.go:221
 #, c-format
 msgid "Invalid target %s"
 msgstr "不正な送り先 %s"
 
-#: lxc/info.go:126
+#: lxc/info.go:135
 msgid "Ips:"
 msgstr "IPアドレス:"
 
-#: lxc/image.go:171
+#: lxc/image.go:174
 msgid "Keep the image up to date after initial copy"
 msgstr "最初にコピーした後も常にイメージを最新の状態に保つ"
 
-#: lxc/list.go:459
+#: lxc/list.go:464
 msgid "LAST USED AT"
 msgstr ""
 
-#: lxc/main.go:31
+#: lxc/main.go:33
 msgid "LXD socket not found; is LXD installed and running?"
 msgstr "LXD のソケットが見つかりません。LXD が実行されていますか?"
 
-#: lxc/image.go:475
+#: lxc/image.go:561
 #, c-format
 msgid "Last used: %s"
 msgstr "最終使用: %s"
 
-#: lxc/image.go:477
+#: lxc/image.go:563
 msgid "Last used: never"
 msgstr "最終使用: 未使用"
 
-#: lxc/info.go:241
+#: lxc/info.go:250
 msgid "Log:"
 msgstr "ログ:"
 
-#: lxc/network.go:460
+#: lxc/network.go:506
 msgid "MANAGED"
 msgstr ""
 
-#: lxc/image.go:169
+#: lxc/image.go:172
 msgid "Make image public"
 msgstr "イメージを public にする"
 
-#: lxc/publish.go:34
+#: lxc/publish.go:35
 msgid "Make the image public"
 msgstr "イメージを public にする"
 
-#: lxc/info.go:163
+#: lxc/info.go:172
 msgid "Memory (current)"
 msgstr "メモリ (現在値)"
 
-#: lxc/info.go:167
+#: lxc/info.go:176
 msgid "Memory (peak)"
 msgstr "メモリ (ピーク)"
 
-#: lxc/info.go:179
+#: lxc/info.go:188
 msgid "Memory usage:"
 msgstr "メモリ消費量:"
 
-#: lxc/copy.go:276
-#, c-format
-msgid "Migration failed on source host: %s"
-msgstr "ソースのホスト上でマイグレーションが失敗しました: %s"
-
-#: lxc/copy.go:280
-#, c-format
-msgid "Migration failed on target host: %s"
-msgstr "コピー先のホストでマイグレーションが失敗しました: %s"
-
-#: lxc/utils.go:201
+#: lxc/utils.go:199
 msgid "Missing summary."
 msgstr "サマリーはありません。"
 
-#: lxc/network.go:248 lxc/network.go:297 lxc/storage.go:362 lxc/storage.go:462
+#: lxc/network.go:276 lxc/network.go:329 lxc/storage.go:374 lxc/storage.go:494
 msgid "More than one device matches, specify the device name."
 msgstr "複数のデバイスとマッチします。デバイス名を指定してください。"
 
-#: lxc/file.go:279
+#: lxc/file.go:431
 msgid "More than one file to download, but target is not a directory"
 msgstr ""
 "ダウンロード対象のファイルが複数ありますが、コピー先がディレクトリではありま"
 "せん"
 
-#: lxc/move.go:35
+#: lxc/move.go:38
 #, fuzzy
 msgid "Move the container without its snapshots"
 msgstr "コンテナを強制シャットダウンします"
 
-#: lxc/action.go:68
+#: lxc/action.go:72
 msgid "Must supply container name for: "
 msgstr "コンテナ名を指定する必要があります: "
 
-#: lxc/list.go:460 lxc/network.go:458 lxc/profile.go:499 lxc/remote.go:395
-#: lxc/storage.go:607 lxc/storage.go:696
+#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:406
+#: lxc/storage.go:653 lxc/storage.go:748
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:444 lxc/remote.go:369 lxc/remote.go:374
+#: lxc/network.go:490 lxc/remote.go:380 lxc/remote.go:385
 msgid "NO"
 msgstr ""
 
-#: lxc/info.go:91
+#: lxc/info.go:99
 #, c-format
 msgid "Name: %s"
 msgstr "コンテナ名: %s"
 
-#: lxc/network.go:222
+#: lxc/network.go:250
 #, c-format
 msgid "Network %s created"
 msgstr "ネットワーク %s を作成しました"
 
-#: lxc/network.go:325
+#: lxc/network.go:366
 #, c-format
 msgid "Network %s deleted"
 msgstr "ネットワーク %s を削除しました"
 
-#: lxc/init.go:141 lxc/init.go:142
+#: lxc/init.go:142 lxc/init.go:143
 msgid "Network name"
 msgstr "ネットワーク名:"
 
-#: lxc/info.go:196
+#: lxc/info.go:205
 msgid "Network usage:"
 msgstr "ネットワーク使用状況:"
 
-#: lxc/image.go:172 lxc/publish.go:35
+#: lxc/image.go:175 lxc/publish.go:36
 msgid "New alias to define at target"
 msgstr "新しいエイリアスを定義する"
 
-#: lxc/config.go:321
+#: lxc/config.go:360
 msgid "No certificate provided to add"
 msgstr "追加すべき証明書が提供されていません"
 
-#: lxc/network.go:257 lxc/network.go:306
+#: lxc/network.go:285 lxc/network.go:338
 msgid "No device found for this network"
 msgstr "このネットワークに対するデバイスがありません"
 
-#: lxc/storage.go:371 lxc/storage.go:471
+#: lxc/storage.go:383 lxc/storage.go:503
 msgid "No device found for this storage volume."
 msgstr "このストレージボリュームに対するデバイスがありません。"
 
-#: lxc/config.go:344
+#: lxc/config.go:392
 msgid "No fingerprint specified."
 msgstr "フィンガープリントが指定されていません。"
 
-#: lxc/storage.go:323 lxc/storage.go:407
+#: lxc/storage.go:327 lxc/storage.go:420
 msgid "Only \"custom\" volumes can be attached to containers."
 msgstr "\"カスタム\" のボリュームのみがコンテナにアタッチできます。"
 
-#: lxc/remote.go:135
+#: lxc/remote.go:136
 msgid "Only https URLs are supported for simplestreams"
 msgstr "simplestreams は https の URL のみサポートします"
 
-#: lxc/image.go:549
+#: lxc/image.go:632
 msgid "Only https:// is supported for remote image import."
 msgstr "リモートイメージのインポートは https:// のみをサポートします。"
 
-#: lxc/network.go:354 lxc/network.go:482
+#: lxc/network.go:394 lxc/network.go:528
 msgid "Only managed networks can be modified."
 msgstr "管理対象のネットワークのみ変更できます。"
 
-#: lxc/help.go:71 lxc/main.go:112 lxc/main.go:163
+#: lxc/help.go:71 lxc/main.go:120 lxc/main.go:177
 msgid "Options:"
 msgstr "オプション:"
 
-#: lxc/image.go:664
-#, c-format
-msgid "Output is in %s"
-msgstr "%s に出力されます"
-
-#: lxc/exec.go:62
+#: lxc/exec.go:63
 msgid "Override the terminal mode (auto, interactive or non-interactive)"
 msgstr "ターミナルモードを上書きします (auto, interactive, non-interactive)"
 
-#: lxc/list.go:611
+#: lxc/list.go:616
 msgid "PERSISTENT"
 msgstr ""
 
-#: lxc/list.go:461
+#: lxc/list.go:466
 msgid "PID"
 msgstr "PID"
 
-#: lxc/list.go:462
+#: lxc/list.go:467
 msgid "PROFILES"
 msgstr ""
 
-#: lxc/remote.go:397
+#: lxc/remote.go:408
 msgid "PROTOCOL"
 msgstr ""
 
-#: lxc/image.go:226 lxc/remote.go:398
+#: lxc/image.go:229 lxc/remote.go:409
 msgid "PUBLIC"
 msgstr ""
 
-#: lxc/info.go:190
+#: lxc/info.go:199
 msgid "Packets received"
 msgstr "受信パケット"
 
-#: lxc/info.go:191
+#: lxc/info.go:200
 msgid "Packets sent"
 msgstr "送信パケット"
 
@@ -695,24 +726,24 @@ msgstr "別のクライアント用設定ディレクトリ"
 msgid "Path to an alternate server directory"
 msgstr "別のサーバ用設定ディレクトリ"
 
-#: lxc/main.go:202
+#: lxc/main.go:216
 msgid "Pause containers."
 msgstr "コンテナを一時停止します。"
 
-#: lxc/main.go:35
+#: lxc/main.go:37
 msgid "Permission denied, are you in the lxd group?"
 msgstr "アクセスが拒否されました。lxd グループに所属していますか?"
 
-#: lxc/info.go:108
+#: lxc/info.go:117
 #, c-format
 msgid "Pid: %d"
 msgstr "Pid: %d"
 
-#: lxc/network.go:379 lxc/profile.go:258 lxc/storage.go:536 lxc/storage.go:855
+#: lxc/network.go:419 lxc/profile.go:268 lxc/storage.go:577 lxc/storage.go:936
 msgid "Press enter to open the editor again"
 msgstr "再度エディタを開くためには Enter キーを押します"
 
-#: lxc/config.go:572 lxc/config.go:637 lxc/image.go:869
+#: lxc/config.go:648 lxc/config.go:713 lxc/image.go:1108
 msgid "Press enter to start the editor again"
 msgstr "再度エディタを起動するには Enter キーを押します"
 
@@ -728,143 +759,143 @@ msgstr "全てのコマンドを表示します (主なコマンドだけでは
 msgid "Print verbose information"
 msgstr "詳細情報を表示します"
 
-#: lxc/info.go:132
+#: lxc/info.go:141
 #, c-format
 msgid "Processes: %d"
 msgstr "プロセス数: %d"
 
-#: lxc/profile.go:314
+#: lxc/profile.go:344
 #, c-format
 msgid "Profile %s added to %s"
 msgstr "プロファイル %s が %s に追加されました"
 
-#: lxc/profile.go:209
+#: lxc/profile.go:218
 #, c-format
 msgid "Profile %s created"
 msgstr "プロファイル %s を作成しました"
 
-#: lxc/profile.go:279
+#: lxc/profile.go:292
 #, c-format
 msgid "Profile %s deleted"
 msgstr "プロファイル %s を削除しました"
 
-#: lxc/profile.go:345
+#: lxc/profile.go:379
 #, c-format
 msgid "Profile %s removed from %s"
 msgstr "プロファイル %s が %s から削除されました"
 
-#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:137 lxc/init.go:138
+#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:138 lxc/init.go:139
 msgid "Profile to apply to the new container"
 msgstr "新しいコンテナに適用するプロファイル"
 
-#: lxc/profile.go:295
+#: lxc/profile.go:321
 #, c-format
 msgid "Profiles %s applied to %s"
 msgstr "プロファイル %s が %s に追加されました"
 
-#: lxc/info.go:106
+#: lxc/info.go:115
 #, c-format
 msgid "Profiles: %s"
 msgstr "プロファイル: %s"
 
-#: lxc/image.go:479
+#: lxc/image.go:565
 msgid "Properties:"
 msgstr "プロパティ:"
 
-#: lxc/remote.go:69
+#: lxc/remote.go:70
 msgid "Public image server"
 msgstr "Public なイメージサーバとして設定します"
 
-#: lxc/image.go:462
+#: lxc/image.go:548
 #, c-format
 msgid "Public: %s"
 msgstr "パブリック: %s"
 
-#: lxc/file.go:65 lxc/file.go:66
+#: lxc/file.go:67 lxc/file.go:68
 msgid "Recursively push or pull files"
 msgstr "再帰的にファイルをpush/pullします"
 
-#: lxc/image.go:413
+#: lxc/image.go:489
 #, fuzzy, c-format
 msgid "Refreshing the image: %s"
 msgstr "イメージの取得中: %s"
 
-#: lxc/remote.go:67
+#: lxc/remote.go:68
 msgid "Remote admin password"
 msgstr "リモートの管理者パスワード"
 
-#: lxc/info.go:93
+#: lxc/info.go:101
 #, c-format
 msgid "Remote: %s"
 msgstr "リモート名: %s"
 
-#: lxc/delete.go:41
+#: lxc/delete.go:42
 #, c-format
 msgid "Remove %s (yes/no): "
 msgstr "%s を消去しますか (yes/no): "
 
-#: lxc/delete.go:35 lxc/delete.go:36
+#: lxc/delete.go:36 lxc/delete.go:37
 msgid "Require user confirmation"
 msgstr "ユーザの確認を要求する"
 
-#: lxc/info.go:129
+#: lxc/info.go:138
 msgid "Resources:"
 msgstr "リソース:"
 
-#: lxc/main.go:210
+#: lxc/main.go:224
 msgid "Restart containers."
 msgstr "コンテナを再起動します。"
 
-#: lxc/init.go:253
+#: lxc/init.go:286
 #, c-format
 msgid "Retrieving image: %s"
 msgstr "イメージの取得中: %s"
 
-#: lxc/image.go:229
+#: lxc/image.go:232
 msgid "SIZE"
 msgstr ""
 
-#: lxc/list.go:463
+#: lxc/list.go:468
 msgid "SNAPSHOTS"
 msgstr ""
 
-#: lxc/storage.go:610
+#: lxc/storage.go:656
 msgid "SOURCE"
 msgstr ""
 
-#: lxc/list.go:464
+#: lxc/list.go:469
 msgid "STATE"
 msgstr ""
 
-#: lxc/remote.go:399
+#: lxc/remote.go:410
 msgid "STATIC"
 msgstr ""
 
-#: lxc/list.go:466
+#: lxc/list.go:471
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/remote.go:240
+#: lxc/remote.go:236
 msgid "Server certificate NACKed by user"
 msgstr "ユーザによりサーバ証明書が拒否されました"
 
-#: lxc/remote.go:302
+#: lxc/remote.go:313
 msgid "Server doesn't trust us after adding our cert"
 msgstr "サーバが我々の証明書を追加した後我々を信頼していません"
 
-#: lxc/remote.go:68
+#: lxc/remote.go:69
 msgid "Server protocol (lxd or simplestreams)"
 msgstr "サーバのプロトコル (lxd or simplestreams)"
 
-#: lxc/file.go:63
+#: lxc/file.go:65
 msgid "Set the file's gid on push"
 msgstr "プッシュ時にファイルのgidを設定します"
 
-#: lxc/file.go:64
+#: lxc/file.go:66
 msgid "Set the file's perms on push"
 msgstr "プッシュ時にファイルのパーミションを設定します"
 
-#: lxc/file.go:62
+#: lxc/file.go:64
 msgid "Set the file's uid on push"
 msgstr "プッシュ時にファイルのuidを設定します"
 
@@ -876,78 +907,83 @@ msgstr "全てコマンドを表示します (主なコマンドだけではな
 msgid "Show client version"
 msgstr "クライアントのバージョンを表示します"
 
-#: lxc/info.go:38
+#: lxc/info.go:39
 msgid "Show the container's last 100 log lines?"
 msgstr "コンテナログの最後の 100 行を表示しますか?"
 
-#: lxc/config.go:33
+#: lxc/config.go:35
 msgid "Show the expanded configuration"
 msgstr "拡張した設定を表示する"
 
-#: lxc/image.go:460
+#: lxc/image.go:546
 #, c-format
 msgid "Size: %.2fMB"
 msgstr "サイズ: %.2fMB"
 
-#: lxc/info.go:210
+#: lxc/info.go:219
 msgid "Snapshots:"
 msgstr "スナップショット:"
 
-#: lxc/action.go:134
+#: lxc/action.go:142
 #, c-format
 msgid "Some containers failed to %s"
 msgstr "一部のコンテナで %s が失敗しました"
 
-#: lxc/image.go:493
+#: lxc/image.go:579
 msgid "Source:"
 msgstr "取得元:"
 
-#: lxc/main.go:220
+#: lxc/main.go:234
 msgid "Start containers."
 msgstr "コンテナを起動します。"
 
-#: lxc/launch.go:152
+#: lxc/launch.go:59
 #, c-format
 msgid "Starting %s"
 msgstr "%s を起動中"
 
-#: lxc/info.go:100
+#: lxc/info.go:109
 #, c-format
 msgid "Status: %s"
 msgstr "状態: %s"
 
-#: lxc/main.go:226
+#: lxc/main.go:240
 msgid "Stop containers."
 msgstr "コンテナを停止します。"
 
-#: lxc/publish.go:36 lxc/publish.go:37
+#: lxc/publish.go:37 lxc/publish.go:38
 msgid "Stop the container if currently running"
 msgstr "実行中の場合、コンテナを停止します"
 
-#: lxc/delete.go:105 lxc/publish.go:114
+#: lxc/publish.go:136
 msgid "Stopping container failed!"
 msgstr "コンテナの停止に失敗しました!"
 
-#: lxc/storage.go:436
+#: lxc/delete.go:121
+#, fuzzy, c-format
+msgid "Stopping the container failed: %s"
+msgstr "コンテナの停止に失敗しました!"
+
+#: lxc/storage.go:468
 #, c-format
 msgid "Storage pool %s created"
 msgstr "ストレージプール %s を作成しました"
 
-#: lxc/storage.go:486
+#: lxc/storage.go:527
 #, c-format
 msgid "Storage pool %s deleted"
 msgstr "ストレージプール %s を削除しました"
 
-#: lxc/init.go:143 lxc/init.go:144
+#: lxc/init.go:144 lxc/init.go:145
 msgid "Storage pool name"
 msgstr "ストレージプール名"
 
-#: lxc/storage.go:720
+#: lxc/storage.go:782
 #, c-format
 msgid "Storage volume %s created"
 msgstr "ストレージボリューム %s を作成しました"
 
-#: lxc/storage.go:730
+#: lxc/storage.go:797
 #, c-format
 msgid "Storage volume %s deleted"
 msgstr "ストレージボリューム %s を削除しました"
@@ -956,23 +992,23 @@ msgstr "ストレージボリューム %s を削除しました"
 msgid "Store the container state (only for stop)"
 msgstr "コンテナの状態を保存します (stopのみ)"
 
-#: lxc/info.go:171
+#: lxc/info.go:180
 msgid "Swap (current)"
 msgstr "Swap (現在値)"
 
-#: lxc/info.go:175
+#: lxc/info.go:184
 msgid "Swap (peak)"
 msgstr "Swap (ピーク)"
 
-#: lxc/list.go:465 lxc/network.go:459 lxc/storage.go:695
+#: lxc/list.go:470 lxc/network.go:505 lxc/storage.go:747
 msgid "TYPE"
 msgstr ""
 
-#: lxc/delete.go:91
+#: lxc/delete.go:105
 msgid "The container is currently running, stop it first or pass --force."
 msgstr "コンテナは実行中です。先に停止させるか、--force を指定してください。"
 
-#: lxc/publish.go:92
+#: lxc/publish.go:101
 msgid ""
 "The container is currently running. Use --force to have it stopped and "
 "restarted."
@@ -980,16 +1016,21 @@ msgstr ""
 "コンテナは現在実行中です。停止して、再起動するために --force を使用してくだ\n"
 "さい。"
 
-#: lxc/init.go:326
+#: lxc/init.go:358
 msgid "The container you are starting doesn't have any network attached to it."
 msgstr "起動しようとしたコンテナに接続されているネットワークがありません。"
 
-#: lxc/config.go:716 lxc/config.go:728 lxc/config.go:761 lxc/config.go:779
-#: lxc/config.go:817 lxc/config.go:835
+#: lxc/config.go:770 lxc/config.go:787
+#, fuzzy
+msgid "The device already exists"
+msgstr "リモート %s は既に存在します"
+
+#: lxc/config.go:833 lxc/config.go:845 lxc/config.go:881 lxc/config.go:899
+#: lxc/config.go:945 lxc/config.go:962 lxc/config.go:1006 lxc/config.go:1022
 msgid "The device doesn't exist"
 msgstr "デバイスが存在しません"
 
-#: lxc/init.go:310
+#: lxc/init.go:342
 #, c-format
 msgid "The local image '%s' couldn't be found, trying '%s:' instead."
 msgstr ""
@@ -999,15 +1040,15 @@ msgstr ""
 msgid "The opposite of \"lxc pause\" is \"lxc start\"."
 msgstr "\"lxc pause\" の反対のコマンドは \"lxc start\" です。"
 
-#: lxc/network.go:262 lxc/network.go:311 lxc/storage.go:376 lxc/storage.go:476
+#: lxc/network.go:290 lxc/network.go:343 lxc/storage.go:388 lxc/storage.go:508
 msgid "The specified device doesn't exist"
 msgstr "指定したデバイスが存在しません"
 
-#: lxc/network.go:266 lxc/network.go:315
+#: lxc/network.go:294 lxc/network.go:347
 msgid "The specified device doesn't match the network"
 msgstr "指定したデバイスはネットワークとマッチしません"
 
-#: lxc/publish.go:65
+#: lxc/publish.go:74
 msgid "There is no \"image name\".  Did you want an alias?"
 msgstr ""
 "publish 先にはイメージ名は指定できません。\"--alias\" オプションを使ってくだ"
@@ -1029,53 +1070,53 @@ msgstr ""
 msgid "Time to wait for the container before killing it"
 msgstr "コンテナを強制停止するまでの時間"
 
-#: lxc/image.go:463
+#: lxc/image.go:549
 msgid "Timestamps:"
 msgstr "タイムスタンプ:"
 
-#: lxc/init.go:328
+#: lxc/init.go:360
 msgid "To attach a network to a container, use: lxc network attach"
 msgstr ""
 "コンテナにネットワークを接続するには、lxc network attach を使用してください"
 
-#: lxc/init.go:327
+#: lxc/init.go:359
 msgid "To create a new network, use: lxc network create"
 msgstr ""
 "新しいネットワークを作成するには、lxc network create を使用してください"
 
-#: lxc/main.go:140
+#: lxc/main.go:154
 msgid "To start your first container, try: lxc launch ubuntu:16.04"
 msgstr ""
 "初めてコンテナを起動するには、\"lxc launch ubuntu:16.04\" と実行してみてくだ"
 "さい"
 
-#: lxc/image.go:551
+#: lxc/image.go:657
 #, c-format
 msgid "Transferring image: %s"
 msgstr "イメージを転送中: %s"
 
-#: lxc/action.go:98 lxc/launch.go:165
+#: lxc/action.go:106 lxc/launch.go:77
 #, c-format
 msgid "Try `lxc info --show-log %s` for more info"
 msgstr "更に情報を得るために `lxc info --show-log %s` を実行してみてください"
 
-#: lxc/info.go:102
+#: lxc/info.go:111
 msgid "Type: ephemeral"
 msgstr "タイプ: ephemeral"
 
-#: lxc/info.go:104
+#: lxc/info.go:113
 msgid "Type: persistent"
 msgstr "タイプ: persistent"
 
-#: lxc/image.go:230
+#: lxc/image.go:233
 msgid "UPLOAD DATE"
 msgstr ""
 
-#: lxc/remote.go:396
+#: lxc/remote.go:407
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:462 lxc/profile.go:500 lxc/storage.go:611 lxc/storage.go:698
+#: lxc/network.go:508 lxc/profile.go:556 lxc/storage.go:657 lxc/storage.go:750
 msgid "USED BY"
 msgstr ""
 
@@ -1083,11 +1124,16 @@ msgstr ""
 msgid "Unable to find help2man."
 msgstr "help2man が見つかりません。"
 
-#: lxc/remote.go:110
+#: lxc/remote.go:111
 msgid "Unable to read remote TLS certificate"
 msgstr "リモートの TLS 証明書を読めません"
 
-#: lxc/image.go:468
+#: lxc/file.go:108
+#, fuzzy, c-format
+msgid "Unknown file type '%s'"
+msgstr "未知の設定コマンド %s"
+
+#: lxc/image.go:554
 #, c-format
 msgid "Uploaded: %s"
 msgstr "アップロード日時: %s"
@@ -1107,7 +1153,7 @@ msgstr ""
 msgid "Usage: lxc <command> [options]"
 msgstr "使い方: lxc <コマンド> [オプション]"
 
-#: lxc/config.go:58
+#: lxc/config.go:60
 msgid ""
 "Usage: lxc config <subcommand> [options]\n"
 "\n"
@@ -1258,7 +1304,7 @@ msgstr ""
 "\n"
 "LXDインスタンス内もしくはLXDインスタンス間でコンテナをコピーします。"
 
-#: lxc/delete.go:26
+#: lxc/delete.go:27
 msgid ""
 "Usage: lxc delete [<remote>:]<container>[/<snapshot>] "
 "[[<remote>:]<container>[/<snapshot>]...]\n"
@@ -1270,7 +1316,7 @@ msgstr ""
 "\n"
 "コンテナとコンテナのスナップショットを消去します。"
 
-#: lxc/exec.go:52
+#: lxc/exec.go:53
 msgid ""
 "Usage: lxc exec [<remote>:]<container> [-t] [-T] [-n] [--mode=auto|"
 "interactive|non-interactive] [--env KEY=VALUE...] [--] <command line>\n"
@@ -1288,7 +1334,7 @@ msgstr ""
 "デフォルトのモードは non-interactive です。もし標準入出力が両方ともターミナル"
 "の場合は interactive モードが選択されます (標準エラー出力は無視されます)。"
 
-#: lxc/file.go:36
+#: lxc/file.go:38
 msgid ""
 "Usage: lxc file <subcommand> [options]\n"
 "\n"
@@ -1364,7 +1410,7 @@ msgstr ""
 "\n"
 "LXD クライアントのヘルプを表示します。"
 
-#: lxc/image.go:69
+#: lxc/image.go:72
 #, fuzzy
 msgid ""
 "Usage: lxc image <subcommand> [options]\n"
@@ -1543,7 +1589,7 @@ msgstr ""
 "ス\n"
 "    名の一部をフィルタとして指定できます。"
 
-#: lxc/info.go:25
+#: lxc/info.go:26
 msgid ""
 "Usage: lxc info [<remote>:][<container>] [--show-log]\n"
 "\n"
@@ -1565,7 +1611,7 @@ msgstr ""
 "lxc info [<remote>:]\n"
 "    LXD サーバの情報を表示します。"
 
-#: lxc/init.go:75
+#: lxc/init.go:76
 msgid ""
 "Usage: lxc init [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--"
 "profile|-p <profile>...] [--config|-c <key=value>...] [--network|-n "
@@ -1591,7 +1637,7 @@ msgstr ""
 "例:\n"
 "    lxc init ubuntu:16.04 u1"
 
-#: lxc/launch.go:23
+#: lxc/launch.go:20
 msgid ""
 "Usage: lxc launch [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--"
 "profile|-p <profile>...] [--config|-c <key=value>...] [--network|-n "
@@ -1834,7 +1880,7 @@ msgstr ""
 "lxc monitor --type=logging\n"
 "    ログメッセージのみ表示します。"
 
-#: lxc/move.go:19
+#: lxc/move.go:22
 msgid ""
 "Usage: lxc move [<remote>:]<container>[/<snapshot>] [<remote>:][<container>[/"
 "<snapshot>]] [--container-only]\n"
@@ -1867,7 +1913,7 @@ msgstr ""
 "lxc move <container>/<old snapshot name> <container>/<new snapshot name>\n"
 "    スナップショットをリネームします。"
 
-#: lxc/network.go:49
+#: lxc/network.go:50
 msgid ""
 "Usage: lxc network <subcommand> [options]\n"
 "\n"
@@ -1970,7 +2016,7 @@ msgstr ""
 "cat network.yaml | lxc network edit <network>\n"
 "    network.yaml の内容でネットワークを更新します。"
 
-#: lxc/profile.go:49
+#: lxc/profile.go:51
 msgid ""
 "Usage: lxc profile <subcommand> [options]\n"
 "\n"
@@ -2130,7 +2176,7 @@ msgstr ""
 "lxc profile assign foo ''\n"
 "    \"foo\" からすべてのプロファイルを削除します。"
 
-#: lxc/publish.go:27
+#: lxc/publish.go:28
 msgid ""
 "Usage: lxc publish [<remote>:]<container>[/<snapshot>] [<remote>:] [--"
 "alias=ALIAS...] [prop-key=prop-value...]\n"
@@ -2142,7 +2188,7 @@ msgstr ""
 "\n"
 "イメージとしてコンテナを publish します。"
 
-#: lxc/remote.go:38
+#: lxc/remote.go:39
 msgid ""
 "Usage: lxc remote <subcommand> [options]\n"
 "\n"
@@ -2196,7 +2242,7 @@ msgstr ""
 "lxc remote get-default\n"
 "    デフォルトに設定されているリモートホストを表示します。"
 
-#: lxc/restore.go:21
+#: lxc/restore.go:22
 msgid ""
 "Usage: lxc restore [<remote>:]<container> <snapshot> [--stateful]\n"
 "\n"
@@ -2224,7 +2270,7 @@ msgstr ""
 "lxc restore u1 snap0\n"
 "    スナップショットからリストアします。"
 
-#: lxc/snapshot.go:21
+#: lxc/snapshot.go:22
 msgid ""
 "Usage: lxc snapshot [<remote>:]<container> <snapshot name> [--stateful]\n"
 "\n"
@@ -2248,7 +2294,7 @@ msgstr ""
 "lxc snapshot u1 snap0\n"
 "    \"u1\" のスナップショットを \"snap0\" という名前で作成します。"
 
-#: lxc/storage.go:61
+#: lxc/storage.go:62
 msgid ""
 "Usage: lxc storage <subcommand> [options]\n"
 "\n"
@@ -2440,165 +2486,163 @@ msgstr ""
 "\n"
 "お使いのクライアントのバージョン番号を表示します。"
 
-#: lxc/delete.go:45
+#: lxc/delete.go:46
 msgid "User aborted delete operation."
 msgstr "ユーザが削除操作を中断しました。"
 
-#: lxc/restore.go:37
+#: lxc/restore.go:38
 msgid ""
 "Whether or not to restore the container's running state from snapshot (if "
 "available)"
 msgstr ""
 "スナップショットからコンテナの稼動状態をリストアするかどうか (取得可能な場合)"
 
-#: lxc/snapshot.go:35
+#: lxc/snapshot.go:36
 msgid "Whether or not to snapshot the container's running state"
 msgstr "コンテナの稼動状態のスナップショットを取得するかどうか"
 
-#: lxc/network.go:446 lxc/remote.go:371 lxc/remote.go:376
+#: lxc/network.go:492 lxc/remote.go:382 lxc/remote.go:387
 msgid "YES"
 msgstr ""
 
-#: lxc/exec.go:125
+#: lxc/exec.go:126
 msgid "You can't pass -t and -T at the same time"
 msgstr "-t と -T は同時に指定できません"
 
-#: lxc/exec.go:129
+#: lxc/exec.go:130
 msgid "You can't pass -t or -T at the same time as --mode"
 msgstr "--mode と同時に -t または -T は指定できません"
 
-#: lxc/main.go:56
+#: lxc/copy.go:57
+#, fuzzy
+msgid "You must specify a source container name"
+msgstr "コピー元のコンテナ名を指定してください"
+
+#: lxc/main.go:58
 msgid "`lxc config profile` is deprecated, please use `lxc profile`"
 msgstr "`lxc config profile` は廃止されました。`lxc profile` を使ってください"
 
-#: lxc/launch.go:134
-msgid "bad number of things scanned from image, container or snapshot"
-msgstr ""
-"イメージ、コンテナ、スナップショットのいずれかからスキャンされた数が不正"
-
-#: lxc/action.go:94
-msgid "bad result type from action"
-msgstr "アクションからの結果タイプが不正です"
-
-#: lxc/copy.go:118
-msgid "can't copy to the same container name"
-msgstr "同じコンテナ名へはコピーできません"
-
-#: lxc/file.go:314
-msgid "can't pull a directory without --recursive"
-msgstr ""
-"ディレクトリを pull する場合は --recursive オプションを使用してください"
-
-#: lxc/remote.go:359
+#: lxc/remote.go:370
 msgid "can't remove the default remote"
 msgstr "デフォルトのリモートは削除できません"
 
-#: lxc/file.go:125
+#: lxc/file.go:269
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr "再帰 (recursive) モードでは uid/gid/mode を指定できません"
 
-#: lxc/remote.go:385
+#: lxc/remote.go:396
 msgid "default"
 msgstr ""
 
-#: lxc/copy.go:134 lxc/copy.go:139 lxc/copy.go:258 lxc/copy.go:263
-#: lxc/init.go:234 lxc/init.go:239 lxc/launch.go:115 lxc/launch.go:121
+#: lxc/init.go:308
 msgid "didn't get any affected image, container or snapshot from server"
 msgstr ""
 "サーバから変更されたイメージ、コンテナ、スナップショットを取得できませんで\n"
 "した"
 
-#: lxc/image.go:454
+#: lxc/image.go:540
 msgid "disabled"
 msgstr "無効"
 
-#: lxc/image.go:456
+#: lxc/image.go:542
 msgid "enabled"
 msgstr "有効"
 
-#: lxc/action.go:126 lxc/main.go:26 lxc/main.go:159
+#: lxc/action.go:134 lxc/main.go:28 lxc/main.go:173
 #, c-format
 msgid "error: %v"
 msgstr "エラー: %v"
 
-#: lxc/help.go:37 lxc/main.go:106
+#: lxc/help.go:37 lxc/main.go:114
 #, c-format
 msgid "error: unknown command: %s"
 msgstr "エラー: 未知のコマンド: %s"
 
-#: lxc/launch.go:139
-msgid "got bad version"
-msgstr "不正なバージョンを得ました"
-
-#: lxc/image.go:202 lxc/image.go:449
+#: lxc/image.go:205 lxc/image.go:535
 msgid "no"
 msgstr ""
 
-#: lxc/copy.go:167
-msgid "not all the profiles from the source exist on the target"
-msgstr "コピー元の全てのプロファイルがターゲットに存在しません"
-
-#: lxc/remote.go:233
+#: lxc/remote.go:229
 msgid "ok (y/n)?"
 msgstr "ok (y/n)?"
 
-#: lxc/main.go:331 lxc/main.go:335
+#: lxc/main.go:345 lxc/main.go:349
 #, c-format
 msgid "processing aliases failed %s\n"
 msgstr "エイリアスの処理が失敗しました %s\n"
 
-#: lxc/file.go:381
+#: lxc/file.go:541
 msgid "recursive edit doesn't make sense :("
 msgstr "再帰的な edit は意味がありません :("
 
-#: lxc/remote.go:421
+#: lxc/remote.go:432
 #, c-format
 msgid "remote %s already exists"
 msgstr "リモート %s は既に存在します"
 
-#: lxc/remote.go:351 lxc/remote.go:413 lxc/remote.go:448 lxc/remote.go:464
+#: lxc/remote.go:362 lxc/remote.go:424 lxc/remote.go:459 lxc/remote.go:475
 #, c-format
 msgid "remote %s doesn't exist"
 msgstr "リモート %s は存在しません"
 
-#: lxc/remote.go:334
+#: lxc/remote.go:345
 #, c-format
 msgid "remote %s exists as <%s>"
 msgstr "リモート %s は <%s> として存在します"
 
-#: lxc/remote.go:355 lxc/remote.go:417 lxc/remote.go:452
+#: lxc/remote.go:366 lxc/remote.go:428 lxc/remote.go:463
 #, c-format
 msgid "remote %s is static and cannot be modified"
 msgstr "リモート %s は static ですので変更できません"
 
-#: lxc/info.go:221
+#: lxc/info.go:230
 msgid "stateful"
 msgstr ""
 
-#: lxc/info.go:223
+#: lxc/info.go:232
 msgid "stateless"
 msgstr ""
 
-#: lxc/info.go:217
+#: lxc/info.go:226
 #, c-format
 msgid "taken at %s"
 msgstr "%s に取得しました"
 
-#: lxc/exec.go:214
-msgid "unreachable return reached"
-msgstr "到達しないはずのreturnに到達しました"
-
-#: lxc/main.go:262
+#: lxc/main.go:276
 msgid "wrong number of subcommand arguments"
 msgstr "サブコマンドの引数の数が正しくありません"
 
-#: lxc/delete.go:44 lxc/image.go:200 lxc/image.go:451
+#: lxc/delete.go:45 lxc/image.go:203 lxc/image.go:537
 msgid "yes"
 msgstr ""
 
-#: lxc/copy.go:47
-msgid "you must specify a source container name"
-msgstr "コピー元のコンテナ名を指定してください"
+#~ msgid "Migration failed on source host: %s"
+#~ msgstr "ソースのホスト上でマイグレーションが失敗しました: %s"
+
+#~ msgid "Migration failed on target host: %s"
+#~ msgstr "コピー先のホストでマイグレーションが失敗しました: %s"
+
+#~ msgid "can't copy to the same container name"
+#~ msgstr "同じコンテナ名へはコピーできません"
+
+#~ msgid "not all the profiles from the source exist on the target"
+#~ msgstr "コピー元の全てのプロファイルがターゲットに存在しません"
+
+#~ msgid "Output is in %s"
+#~ msgstr "%s に出力されます"
+
+#~ msgid "bad number of things scanned from image, container or snapshot"
+#~ msgstr ""
+#~ "イメージ、コンテナ、スナップショットのいずれかからスキャンされた数が不正"
+
+#~ msgid "bad result type from action"
+#~ msgstr "アクションからの結果タイプが不正です"
+
+#~ msgid "got bad version"
+#~ msgstr "不正なバージョンを得ました"
+
+#~ msgid "unreachable return reached"
+#~ msgstr "到達しないはずのreturnに到達しました"
 
 #~ msgid "Format"
 #~ msgstr "フォーマット"
@@ -2651,10 +2695,6 @@ msgstr "コピー元のコンテナ名を指定してください"
 #~ msgstr "使い方: %s"
 
 #, fuzzy
-#~ msgid "Bad image property: %s"
-#~ msgstr "(不正なイメージプロパティ形式: %s\n"
-
-#, fuzzy
 #~ msgid ""
 #~ "Create a read-only snapshot of a container.\n"
 #~ "\n"
@@ -2681,10 +2721,6 @@ msgstr "コピー元のコンテナ名を指定してください"
 #~ msgstr "プロファイルURL内のバージョンが不正"
 
 #, fuzzy
-#~ msgid "device already exists"
-#~ msgstr "リモート %s は既に存在します"
-
-#, fuzzy
 #~ msgid "error."
 #~ msgstr "エラー: %v\n"
 
@@ -2736,10 +2772,6 @@ msgstr "コピー元のコンテナ名を指定してください"
 #~ msgstr "不正な引数 %s"
 
 #, fuzzy
-#~ msgid "unknown profile cmd %s"
-#~ msgstr "未知の設定コマンド %s"
-
-#, fuzzy
 #~ msgid "Publish to remote server is not supported yet"
 #~ msgstr "リモートの情報表示はまだサポートされていません。\n"
 
diff --git a/po/lxd.pot b/po/lxd.pot
index 6c4b121e6..7808d68bb 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-06-13 20:10+0200\n"
+        "POT-Creation-Date: 2017-06-16 23:20-0400\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"
@@ -16,7 +16,7 @@ msgstr  "Project-Id-Version: lxd\n"
         "Content-Type: text/plain; charset=CHARSET\n"
         "Content-Transfer-Encoding: 8bit\n"
 
-#: lxc/storage.go:30
+#: lxc/storage.go:31
 msgid   "### This is a yaml representation of a storage pool.\n"
         "### Any line starting with a '# will be ignored.\n"
         "###\n"
@@ -32,7 +32,7 @@ msgid   "### This is a yaml representation of a storage pool.\n"
         "###   zfs.pool_name: default"
 msgstr  ""
 
-#: lxc/storage.go:47
+#: lxc/storage.go:48
 msgid   "### This is a yaml representation of a storage volume.\n"
         "### Any line starting with a '# will be ignored.\n"
         "###\n"
@@ -45,7 +45,7 @@ msgid   "### This is a yaml representation of a storage volume.\n"
         "###   size: \"61203283968\""
 msgstr  ""
 
-#: lxc/config.go:37
+#: lxc/config.go:39
 msgid   "### This is a yaml representation of the configuration.\n"
         "### Any line starting with a '# will be ignored.\n"
         "###\n"
@@ -65,7 +65,7 @@ msgid   "### This is a yaml representation of the configuration.\n"
         "### Note that the name is shown but cannot be changed"
 msgstr  ""
 
-#: lxc/image.go:59
+#: lxc/image.go:62
 msgid   "### This is a yaml representation of the image properties.\n"
         "### Any line starting with a '# will be ignored.\n"
         "###\n"
@@ -74,7 +74,7 @@ msgid   "### This is a yaml representation of the image properties.\n"
         "###  description: My custom image"
 msgstr  ""
 
-#: lxc/network.go:29
+#: lxc/network.go:30
 msgid   "### This is a yaml representation of the network.\n"
         "### Any line starting with a '# will be ignored.\n"
         "###\n"
@@ -93,7 +93,7 @@ msgid   "### This is a yaml representation of the network.\n"
         "### Note that only the configuration can be changed."
 msgstr  ""
 
-#: lxc/profile.go:28
+#: lxc/profile.go:30
 msgid   "### This is a yaml representation of the profile.\n"
         "### Any line starting with a '# will be ignored.\n"
         "###\n"
@@ -113,106 +113,130 @@ msgid   "### This is a yaml representation of the profile.\n"
         "### Note that the name is shown but cannot be changed"
 msgstr  ""
 
-#: lxc/image.go:179
+#: lxc/image.go:182
 #, c-format
 msgid   "%s (%d more)"
 msgstr  ""
 
-#: lxc/snapshot.go:58
+#: lxc/file.go:183
+#, c-format
+msgid   "%s is not a directory"
+msgstr  ""
+
+#: lxc/file.go:125
+#, c-format
+msgid   "'%s' isn't a regular file or directory."
+msgstr  ""
+
+#: lxc/snapshot.go:53
 msgid   "'/' not allowed in snapshot name"
 msgstr  ""
 
-#: lxc/profile.go:293
+#: lxc/profile.go:319
 msgid   "(none)"
 msgstr  ""
 
-#: lxc/image.go:223 lxc/image.go:814
+#: lxc/image.go:226 lxc/image.go:1052
 msgid   "ALIAS"
 msgstr  ""
 
-#: lxc/image.go:224
+#: lxc/image.go:227
 msgid   "ALIASES"
 msgstr  ""
 
-#: lxc/image.go:228
+#: lxc/image.go:231
 msgid   "ARCH"
 msgstr  ""
 
-#: lxc/list.go:456
+#: lxc/list.go:461
 msgid   "ARCHITECTURE"
 msgstr  ""
 
-#: lxc/remote.go:66
+#: lxc/remote.go:67
 msgid   "Accept certificate"
 msgstr  ""
 
-#: lxc/remote.go:282
+#: lxc/remote.go:281
 #, c-format
 msgid   "Admin password for %s: "
 msgstr  ""
 
-#: lxc/image.go:483
+#: lxc/image.go:569
 msgid   "Aliases:"
 msgstr  ""
 
-#: lxc/image.go:461 lxc/info.go:95
+#: lxc/image.go:547 lxc/info.go:104
 #, c-format
 msgid   "Architecture: %s"
 msgstr  ""
 
-#: lxc/image.go:491
+#: lxc/image.go:577
 #, c-format
 msgid   "Auto update: %s"
 msgstr  ""
 
-#: lxc/info.go:188
+#: lxc/image.go:651
+#, c-format
+msgid   "Bad property: %s"
+msgstr  ""
+
+#: lxc/info.go:197
 msgid   "Bytes received"
 msgstr  ""
 
-#: lxc/info.go:189
+#: lxc/info.go:198
 msgid   "Bytes sent"
 msgstr  ""
 
-#: lxc/config.go:310
+#: lxc/config.go:349
 msgid   "COMMON NAME"
 msgstr  ""
 
-#: lxc/info.go:152
+#: lxc/info.go:161
 msgid   "CPU usage (in seconds)"
 msgstr  ""
 
-#: lxc/info.go:156
+#: lxc/info.go:165
 msgid   "CPU usage:"
 msgstr  ""
 
-#: lxc/list.go:457
+#: lxc/list.go:462
 msgid   "CREATED AT"
 msgstr  ""
 
-#: lxc/config.go:150 lxc/network.go:496
+#: lxc/file.go:470
+msgid   "Can't pull a directory without --recursive"
+msgstr  ""
+
+#: lxc/config.go:156 lxc/network.go:542
 #, c-format
 msgid   "Can't read from stdin: %s"
 msgstr  ""
 
-#: lxc/config.go:163 lxc/config.go:196 lxc/config.go:218
+#: lxc/config.go:169
+#, c-format
+msgid   "Can't unset key '%s', it's not currently set"
+msgstr  ""
+
+#: lxc/config.go:211 lxc/config.go:237
 #, c-format
 msgid   "Can't unset key '%s', it's not currently set."
 msgstr  ""
 
-#: lxc/network.go:422 lxc/profile.go:472 lxc/storage.go:579
+#: lxc/network.go:468 lxc/profile.go:528 lxc/storage.go:625
 msgid   "Cannot provide container name to list"
 msgstr  ""
 
-#: lxc/remote.go:232
+#: lxc/remote.go:228
 #, c-format
 msgid   "Certificate fingerprint: %s"
 msgstr  ""
 
-#: lxc/remote.go:305
+#: lxc/remote.go:316
 msgid   "Client certificate stored at server: "
 msgstr  ""
 
-#: lxc/image.go:167 lxc/image.go:168 lxc/list.go:128 lxc/list.go:129
+#: lxc/image.go:170 lxc/image.go:171 lxc/list.go:128 lxc/list.go:129
 msgid   "Columns"
 msgstr  ""
 
@@ -220,34 +244,34 @@ msgstr  ""
 msgid   "Commands:"
 msgstr  ""
 
-#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:135 lxc/init.go:136
+#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:136 lxc/init.go:137
 msgid   "Config key/value to apply to the new container"
 msgstr  ""
 
-#: lxc/config.go:571 lxc/config.go:636 lxc/image.go:868 lxc/network.go:378 lxc/profile.go:257 lxc/storage.go:535 lxc/storage.go:854
+#: lxc/config.go:647 lxc/config.go:712 lxc/image.go:1107 lxc/network.go:418 lxc/profile.go:267 lxc/storage.go:576 lxc/storage.go:935
 #, c-format
 msgid   "Config parsing error: %s"
 msgstr  ""
 
-#: lxc/main.go:33
+#: lxc/main.go:35
 msgid   "Connection refused; is LXD running?"
 msgstr  ""
 
-#: lxc/publish.go:62
+#: lxc/publish.go:71
 msgid   "Container name is mandatory"
 msgstr  ""
 
-#: lxc/copy.go:143 lxc/copy.go:267 lxc/init.go:244
+#: lxc/copy.go:210 lxc/init.go:313
 #, c-format
 msgid   "Container name is: %s"
 msgstr  ""
 
-#: lxc/publish.go:160 lxc/publish.go:175
+#: lxc/publish.go:250
 #, c-format
 msgid   "Container published with fingerprint: %s"
 msgstr  ""
 
-#: lxc/image.go:170
+#: lxc/image.go:173
 msgid   "Copy aliases from source"
 msgstr  ""
 
@@ -255,84 +279,89 @@ msgstr  ""
 msgid   "Copy the container without its snapshots"
 msgstr  ""
 
-#: lxc/image.go:360
+#: lxc/image.go:422
 #, c-format
 msgid   "Copying the image: %s"
 msgstr  ""
 
-#: lxc/remote.go:247
+#: lxc/remote.go:243
 msgid   "Could not create server cert dir"
 msgstr  ""
 
-#: lxc/file.go:67 lxc/file.go:68
+#: lxc/file.go:69 lxc/file.go:70
 msgid   "Create any directories necessary"
 msgstr  ""
 
-#: lxc/image.go:466 lxc/info.go:97
+#: lxc/image.go:552 lxc/info.go:106
 #, c-format
 msgid   "Created: %s"
 msgstr  ""
 
-#: lxc/init.go:182 lxc/launch.go:142
+#: lxc/init.go:194
 #, c-format
 msgid   "Creating %s"
 msgstr  ""
 
-#: lxc/init.go:180
+#: lxc/init.go:192
 msgid   "Creating the container"
 msgstr  ""
 
-#: lxc/image.go:227 lxc/image.go:816 lxc/list.go:458 lxc/network.go:461 lxc/storage.go:608 lxc/storage.go:697
+#: lxc/image.go:230 lxc/image.go:1054 lxc/list.go:463 lxc/network.go:507 lxc/storage.go:654 lxc/storage.go:749
 msgid   "DESCRIPTION"
 msgstr  ""
 
-#: lxc/storage.go:609
+#: lxc/storage.go:655
 msgid   "DRIVER"
 msgstr  ""
 
-#: lxc/publish.go:38
+#: lxc/publish.go:39
 msgid   "Define a compression algorithm: for image or none"
 msgstr  ""
 
-#: lxc/config.go:688
+#: lxc/config.go:803
 #, c-format
 msgid   "Device %s added to %s"
 msgstr  ""
 
-#: lxc/config.go:875
+#: lxc/config.go:1037
 #, c-format
 msgid   "Device %s removed from %s"
 msgstr  ""
 
-#: lxc/exec.go:64
-msgid   "Disable pseudo-terminal allocation"
+#: lxc/utils.go:248 lxc/utils.go:272
+#, c-format
+msgid   "Device already exists: %s"
 msgstr  ""
 
 #: lxc/exec.go:65
+msgid   "Disable pseudo-terminal allocation"
+msgstr  ""
+
+#: lxc/exec.go:66
 msgid   "Disable stdin (reads from /dev/null)"
 msgstr  ""
 
-#: lxc/info.go:145
+#: lxc/info.go:154
 msgid   "Disk usage:"
 msgstr  ""
 
-#: lxc/list.go:609
+#: lxc/list.go:614
 msgid   "EPHEMERAL"
 msgstr  ""
 
-#: lxc/config.go:312
+#: lxc/config.go:351
 msgid   "EXPIRY DATE"
 msgstr  ""
 
-#: lxc/main.go:45
+#: lxc/main.go:47
 msgid   "Enable debug mode"
 msgstr  ""
 
-#: lxc/main.go:44
+#: lxc/main.go:46
 msgid   "Enable verbose mode"
 msgstr  ""
 
-#: lxc/exec.go:61
+#: lxc/exec.go:62
 msgid   "Environment variable to set (e.g. HOME=/home/foo)"
 msgstr  ""
 
@@ -340,7 +369,7 @@ msgstr  ""
 msgid   "Environment:"
 msgstr  ""
 
-#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:139 lxc/init.go:140
+#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:140 lxc/init.go:141
 msgid   "Ephemeral container"
 msgstr  ""
 
@@ -348,16 +377,21 @@ msgstr  ""
 msgid   "Event type to listen for"
 msgstr  ""
 
-#: lxc/image.go:470
+#: lxc/image.go:556
 #, c-format
 msgid   "Expires: %s"
 msgstr  ""
 
-#: lxc/image.go:472
+#: lxc/image.go:558
 msgid   "Expires: never"
 msgstr  ""
 
-#: lxc/config.go:309 lxc/image.go:225 lxc/image.go:815
+#: lxc/image.go:848
+#, c-format
+msgid   "Exporting the image: %s"
+msgstr  ""
+
+#: lxc/config.go:348 lxc/image.go:228 lxc/image.go:1053
 msgid   "FINGERPRINT"
 msgstr  ""
 
@@ -371,16 +405,25 @@ msgstr  ""
 msgid   "Failed to generate 'lxc.1': %v"
 msgstr  ""
 
+#: lxc/copy.go:205
+msgid   "Failed to get the new container name"
+msgstr  ""
+
+#: lxc/file.go:120
+#, c-format
+msgid   "Failed to walk path for %s: %s"
+msgstr  ""
+
 #: lxc/list.go:131
 msgid   "Fast mode (same as --columns=nsacPt)"
 msgstr  ""
 
-#: lxc/image.go:459
+#: lxc/image.go:545
 #, c-format
 msgid   "Fingerprint: %s"
 msgstr  ""
 
-#: lxc/exec.go:63
+#: lxc/exec.go:64
 msgid   "Force pseudo-terminal allocation"
 msgstr  ""
 
@@ -388,39 +431,39 @@ msgstr  ""
 msgid   "Force the container to shutdown"
 msgstr  ""
 
-#: lxc/delete.go:33 lxc/delete.go:34
+#: lxc/delete.go:34 lxc/delete.go:35
 msgid   "Force the removal of stopped containers"
 msgstr  ""
 
-#: lxc/main.go:46
+#: lxc/main.go:48
 msgid   "Force using the local unix socket"
 msgstr  ""
 
-#: lxc/image.go:173 lxc/list.go:130
+#: lxc/image.go:176 lxc/list.go:130
 msgid   "Format (csv|json|table|yaml)"
 msgstr  ""
 
-#: lxc/remote.go:80
+#: lxc/remote.go:81
 msgid   "Generating a client certificate. This may take a minute..."
 msgstr  ""
 
-#: lxc/list.go:454
+#: lxc/list.go:459
 msgid   "IPV4"
 msgstr  ""
 
-#: lxc/list.go:455
+#: lxc/list.go:460
 msgid   "IPV6"
 msgstr  ""
 
-#: lxc/config.go:311
+#: lxc/config.go:350
 msgid   "ISSUE DATE"
 msgstr  ""
 
-#: lxc/main.go:139
+#: lxc/main.go:153
 msgid   "If this is your first time using LXD, you should also run: lxd init"
 msgstr  ""
 
-#: lxc/main.go:47
+#: lxc/main.go:49
 msgid   "Ignore aliases when determining what command to run"
 msgstr  ""
 
@@ -428,244 +471,228 @@ msgstr  ""
 msgid   "Ignore the container state (only for start)"
 msgstr  ""
 
-#: lxc/image.go:422
+#: lxc/image.go:508
 msgid   "Image already up to date."
 msgstr  ""
 
-#: lxc/image.go:363
+#: lxc/image.go:436
 msgid   "Image copied successfully!"
 msgstr  ""
 
-#: lxc/image.go:546 lxc/image.go:558
+#: lxc/image.go:898
+msgid   "Image exported successfully!"
+msgstr  ""
+
+#: lxc/image.go:709
 #, c-format
 msgid   "Image imported with fingerprint: %s"
 msgstr  ""
 
-#: lxc/image.go:420
+#: lxc/image.go:506
 msgid   "Image refreshed successfully!"
 msgstr  ""
 
-#: lxc/image.go:543
-#, c-format
-msgid   "Importing the image: %s"
-msgstr  ""
-
-#: lxc/remote.go:150
+#: lxc/remote.go:151
 #, c-format
 msgid   "Invalid URL scheme \"%s\" in \"%s\""
 msgstr  ""
 
-#: lxc/config.go:290
+#: lxc/config.go:329
 msgid   "Invalid certificate"
 msgstr  ""
 
-#: lxc/init.go:30 lxc/init.go:35
+#: lxc/init.go:31 lxc/init.go:36
 msgid   "Invalid configuration key"
 msgstr  ""
 
-#: lxc/file.go:357
+#: lxc/file.go:513
 #, c-format
 msgid   "Invalid path %s"
 msgstr  ""
 
-#: lxc/file.go:291
+#: lxc/file.go:443
 #, c-format
 msgid   "Invalid source %s"
 msgstr  ""
 
-#: lxc/file.go:80
+#: lxc/file.go:221
 #, c-format
 msgid   "Invalid target %s"
 msgstr  ""
 
-#: lxc/info.go:126
+#: lxc/info.go:135
 msgid   "Ips:"
 msgstr  ""
 
-#: lxc/image.go:171
+#: lxc/image.go:174
 msgid   "Keep the image up to date after initial copy"
 msgstr  ""
 
-#: lxc/list.go:459
+#: lxc/list.go:464
 msgid   "LAST USED AT"
 msgstr  ""
 
-#: lxc/main.go:31
+#: lxc/main.go:33
 msgid   "LXD socket not found; is LXD installed and running?"
 msgstr  ""
 
-#: lxc/image.go:475
+#: lxc/image.go:561
 #, c-format
 msgid   "Last used: %s"
 msgstr  ""
 
-#: lxc/image.go:477
+#: lxc/image.go:563
 msgid   "Last used: never"
 msgstr  ""
 
-#: lxc/info.go:241
+#: lxc/info.go:250
 msgid   "Log:"
 msgstr  ""
 
-#: lxc/network.go:460
+#: lxc/network.go:506
 msgid   "MANAGED"
 msgstr  ""
 
-#: lxc/image.go:169
+#: lxc/image.go:172
 msgid   "Make image public"
 msgstr  ""
 
-#: lxc/publish.go:34
+#: lxc/publish.go:35
 msgid   "Make the image public"
 msgstr  ""
 
-#: lxc/info.go:163
+#: lxc/info.go:172
 msgid   "Memory (current)"
 msgstr  ""
 
-#: lxc/info.go:167
+#: lxc/info.go:176
 msgid   "Memory (peak)"
 msgstr  ""
 
-#: lxc/info.go:179
+#: lxc/info.go:188
 msgid   "Memory usage:"
 msgstr  ""
 
-#: lxc/copy.go:276
-#, c-format
-msgid   "Migration failed on source host: %s"
-msgstr  ""
-
-#: lxc/copy.go:280
-#, c-format
-msgid   "Migration failed on target host: %s"
-msgstr  ""
-
-#: lxc/utils.go:201
+#: lxc/utils.go:199
 msgid   "Missing summary."
 msgstr  ""
 
-#: lxc/network.go:248 lxc/network.go:297 lxc/storage.go:362 lxc/storage.go:462
+#: lxc/network.go:276 lxc/network.go:329 lxc/storage.go:374 lxc/storage.go:494
 msgid   "More than one device matches, specify the device name."
 msgstr  ""
 
-#: lxc/file.go:279
+#: lxc/file.go:431
 msgid   "More than one file to download, but target is not a directory"
 msgstr  ""
 
-#: lxc/move.go:35
+#: lxc/move.go:38
 msgid   "Move the container without its snapshots"
 msgstr  ""
 
-#: lxc/action.go:68
+#: lxc/action.go:72
 msgid   "Must supply container name for: "
 msgstr  ""
 
-#: lxc/list.go:460 lxc/network.go:458 lxc/profile.go:499 lxc/remote.go:395 lxc/storage.go:607 lxc/storage.go:696
+#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:406 lxc/storage.go:653 lxc/storage.go:748
 msgid   "NAME"
 msgstr  ""
 
-#: lxc/network.go:444 lxc/remote.go:369 lxc/remote.go:374
+#: lxc/network.go:490 lxc/remote.go:380 lxc/remote.go:385
 msgid   "NO"
 msgstr  ""
 
-#: lxc/info.go:91
+#: lxc/info.go:99
 #, c-format
 msgid   "Name: %s"
 msgstr  ""
 
-#: lxc/network.go:222
+#: lxc/network.go:250
 #, c-format
 msgid   "Network %s created"
 msgstr  ""
 
-#: lxc/network.go:325
+#: lxc/network.go:366
 #, c-format
 msgid   "Network %s deleted"
 msgstr  ""
 
-#: lxc/init.go:141 lxc/init.go:142
+#: lxc/init.go:142 lxc/init.go:143
 msgid   "Network name"
 msgstr  ""
 
-#: lxc/info.go:196
+#: lxc/info.go:205
 msgid   "Network usage:"
 msgstr  ""
 
-#: lxc/image.go:172 lxc/publish.go:35
+#: lxc/image.go:175 lxc/publish.go:36
 msgid   "New alias to define at target"
 msgstr  ""
 
-#: lxc/config.go:321
+#: lxc/config.go:360
 msgid   "No certificate provided to add"
 msgstr  ""
 
-#: lxc/network.go:257 lxc/network.go:306
+#: lxc/network.go:285 lxc/network.go:338
 msgid   "No device found for this network"
 msgstr  ""
 
-#: lxc/storage.go:371 lxc/storage.go:471
+#: lxc/storage.go:383 lxc/storage.go:503
 msgid   "No device found for this storage volume."
 msgstr  ""
 
-#: lxc/config.go:344
+#: lxc/config.go:392
 msgid   "No fingerprint specified."
 msgstr  ""
 
-#: lxc/storage.go:323 lxc/storage.go:407
+#: lxc/storage.go:327 lxc/storage.go:420
 msgid   "Only \"custom\" volumes can be attached to containers."
 msgstr  ""
 
-#: lxc/remote.go:135
+#: lxc/remote.go:136
 msgid   "Only https URLs are supported for simplestreams"
 msgstr  ""
 
-#: lxc/image.go:549
+#: lxc/image.go:632
 msgid   "Only https:// is supported for remote image import."
 msgstr  ""
 
-#: lxc/network.go:354 lxc/network.go:482
+#: lxc/network.go:394 lxc/network.go:528
 msgid   "Only managed networks can be modified."
 msgstr  ""
 
-#: lxc/help.go:71 lxc/main.go:112 lxc/main.go:163
+#: lxc/help.go:71 lxc/main.go:120 lxc/main.go:177
 msgid   "Options:"
 msgstr  ""
 
-#: lxc/image.go:664
-#, c-format
-msgid   "Output is in %s"
-msgstr  ""
-
-#: lxc/exec.go:62
+#: lxc/exec.go:63
 msgid   "Override the terminal mode (auto, interactive or non-interactive)"
 msgstr  ""
 
-#: lxc/list.go:611
+#: lxc/list.go:616
 msgid   "PERSISTENT"
 msgstr  ""
 
-#: lxc/list.go:461
+#: lxc/list.go:466
 msgid   "PID"
 msgstr  ""
 
-#: lxc/list.go:462
+#: lxc/list.go:467
 msgid   "PROFILES"
 msgstr  ""
 
-#: lxc/remote.go:397
+#: lxc/remote.go:408
 msgid   "PROTOCOL"
 msgstr  ""
 
-#: lxc/image.go:226 lxc/remote.go:398
+#: lxc/image.go:229 lxc/remote.go:409
 msgid   "PUBLIC"
 msgstr  ""
 
-#: lxc/info.go:190
+#: lxc/info.go:199
 msgid   "Packets received"
 msgstr  ""
 
-#: lxc/info.go:191
+#: lxc/info.go:200
 msgid   "Packets sent"
 msgstr  ""
 
@@ -677,24 +704,24 @@ msgstr  ""
 msgid   "Path to an alternate server directory"
 msgstr  ""
 
-#: lxc/main.go:202
+#: lxc/main.go:216
 msgid   "Pause containers."
 msgstr  ""
 
-#: lxc/main.go:35
+#: lxc/main.go:37
 msgid   "Permission denied, are you in the lxd group?"
 msgstr  ""
 
-#: lxc/info.go:108
+#: lxc/info.go:117
 #, c-format
 msgid   "Pid: %d"
 msgstr  ""
 
-#: lxc/network.go:379 lxc/profile.go:258 lxc/storage.go:536 lxc/storage.go:855
+#: lxc/network.go:419 lxc/profile.go:268 lxc/storage.go:577 lxc/storage.go:936
 msgid   "Press enter to open the editor again"
 msgstr  ""
 
-#: lxc/config.go:572 lxc/config.go:637 lxc/image.go:869
+#: lxc/config.go:648 lxc/config.go:713 lxc/image.go:1108
 msgid   "Press enter to start the editor again"
 msgstr  ""
 
@@ -710,143 +737,143 @@ msgstr  ""
 msgid   "Print verbose information"
 msgstr  ""
 
-#: lxc/info.go:132
+#: lxc/info.go:141
 #, c-format
 msgid   "Processes: %d"
 msgstr  ""
 
-#: lxc/profile.go:314
+#: lxc/profile.go:344
 #, c-format
 msgid   "Profile %s added to %s"
 msgstr  ""
 
-#: lxc/profile.go:209
+#: lxc/profile.go:218
 #, c-format
 msgid   "Profile %s created"
 msgstr  ""
 
-#: lxc/profile.go:279
+#: lxc/profile.go:292
 #, c-format
 msgid   "Profile %s deleted"
 msgstr  ""
 
-#: lxc/profile.go:345
+#: lxc/profile.go:379
 #, c-format
 msgid   "Profile %s removed from %s"
 msgstr  ""
 
-#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:137 lxc/init.go:138
+#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:138 lxc/init.go:139
 msgid   "Profile to apply to the new container"
 msgstr  ""
 
-#: lxc/profile.go:295
+#: lxc/profile.go:321
 #, c-format
 msgid   "Profiles %s applied to %s"
 msgstr  ""
 
-#: lxc/info.go:106
+#: lxc/info.go:115
 #, c-format
 msgid   "Profiles: %s"
 msgstr  ""
 
-#: lxc/image.go:479
+#: lxc/image.go:565
 msgid   "Properties:"
 msgstr  ""
 
-#: lxc/remote.go:69
+#: lxc/remote.go:70
 msgid   "Public image server"
 msgstr  ""
 
-#: lxc/image.go:462
+#: lxc/image.go:548
 #, c-format
 msgid   "Public: %s"
 msgstr  ""
 
-#: lxc/file.go:65 lxc/file.go:66
+#: lxc/file.go:67 lxc/file.go:68
 msgid   "Recursively push or pull files"
 msgstr  ""
 
-#: lxc/image.go:413
+#: lxc/image.go:489
 #, c-format
 msgid   "Refreshing the image: %s"
 msgstr  ""
 
-#: lxc/remote.go:67
+#: lxc/remote.go:68
 msgid   "Remote admin password"
 msgstr  ""
 
-#: lxc/info.go:93
+#: lxc/info.go:101
 #, c-format
 msgid   "Remote: %s"
 msgstr  ""
 
-#: lxc/delete.go:41
+#: lxc/delete.go:42
 #, c-format
 msgid   "Remove %s (yes/no): "
 msgstr  ""
 
-#: lxc/delete.go:35 lxc/delete.go:36
+#: lxc/delete.go:36 lxc/delete.go:37
 msgid   "Require user confirmation"
 msgstr  ""
 
-#: lxc/info.go:129
+#: lxc/info.go:138
 msgid   "Resources:"
 msgstr  ""
 
-#: lxc/main.go:210
+#: lxc/main.go:224
 msgid   "Restart containers."
 msgstr  ""
 
-#: lxc/init.go:253
+#: lxc/init.go:286
 #, c-format
 msgid   "Retrieving image: %s"
 msgstr  ""
 
-#: lxc/image.go:229
+#: lxc/image.go:232
 msgid   "SIZE"
 msgstr  ""
 
-#: lxc/list.go:463
+#: lxc/list.go:468
 msgid   "SNAPSHOTS"
 msgstr  ""
 
-#: lxc/storage.go:610
+#: lxc/storage.go:656
 msgid   "SOURCE"
 msgstr  ""
 
-#: lxc/list.go:464
+#: lxc/list.go:469
 msgid   "STATE"
 msgstr  ""
 
-#: lxc/remote.go:399
+#: lxc/remote.go:410
 msgid   "STATIC"
 msgstr  ""
 
-#: lxc/list.go:466
+#: lxc/list.go:471
 msgid   "STORAGE POOL"
 msgstr  ""
 
-#: lxc/remote.go:240
+#: lxc/remote.go:236
 msgid   "Server certificate NACKed by user"
 msgstr  ""
 
-#: lxc/remote.go:302
+#: lxc/remote.go:313
 msgid   "Server doesn't trust us after adding our cert"
 msgstr  ""
 
-#: lxc/remote.go:68
+#: lxc/remote.go:69
 msgid   "Server protocol (lxd or simplestreams)"
 msgstr  ""
 
-#: lxc/file.go:63
+#: lxc/file.go:65
 msgid   "Set the file's gid on push"
 msgstr  ""
 
-#: lxc/file.go:64
+#: lxc/file.go:66
 msgid   "Set the file's perms on push"
 msgstr  ""
 
-#: lxc/file.go:62
+#: lxc/file.go:64
 msgid   "Set the file's uid on push"
 msgstr  ""
 
@@ -858,78 +885,83 @@ msgstr  ""
 msgid   "Show client version"
 msgstr  ""
 
-#: lxc/info.go:38
+#: lxc/info.go:39
 msgid   "Show the container's last 100 log lines?"
 msgstr  ""
 
-#: lxc/config.go:33
+#: lxc/config.go:35
 msgid   "Show the expanded configuration"
 msgstr  ""
 
-#: lxc/image.go:460
+#: lxc/image.go:546
 #, c-format
 msgid   "Size: %.2fMB"
 msgstr  ""
 
-#: lxc/info.go:210
+#: lxc/info.go:219
 msgid   "Snapshots:"
 msgstr  ""
 
-#: lxc/action.go:134
+#: lxc/action.go:142
 #, c-format
 msgid   "Some containers failed to %s"
 msgstr  ""
 
-#: lxc/image.go:493
+#: lxc/image.go:579
 msgid   "Source:"
 msgstr  ""
 
-#: lxc/main.go:220
+#: lxc/main.go:234
 msgid   "Start containers."
 msgstr  ""
 
-#: lxc/launch.go:152
+#: lxc/launch.go:59
 #, c-format
 msgid   "Starting %s"
 msgstr  ""
 
-#: lxc/info.go:100
+#: lxc/info.go:109
 #, c-format
 msgid   "Status: %s"
 msgstr  ""
 
-#: lxc/main.go:226
+#: lxc/main.go:240
 msgid   "Stop containers."
 msgstr  ""
 
-#: lxc/publish.go:36 lxc/publish.go:37
+#: lxc/publish.go:37 lxc/publish.go:38
 msgid   "Stop the container if currently running"
 msgstr  ""
 
-#: lxc/delete.go:105 lxc/publish.go:114
+#: lxc/publish.go:136
 msgid   "Stopping container failed!"
 msgstr  ""
 
-#: lxc/storage.go:436
+#: lxc/delete.go:121
+#, c-format
+msgid   "Stopping the container failed: %s"
+msgstr  ""
+
+#: lxc/storage.go:468
 #, c-format
 msgid   "Storage pool %s created"
 msgstr  ""
 
-#: lxc/storage.go:486
+#: lxc/storage.go:527
 #, c-format
 msgid   "Storage pool %s deleted"
 msgstr  ""
 
-#: lxc/init.go:143 lxc/init.go:144
+#: lxc/init.go:144 lxc/init.go:145
 msgid   "Storage pool name"
 msgstr  ""
 
-#: lxc/storage.go:720
+#: lxc/storage.go:782
 #, c-format
 msgid   "Storage volume %s created"
 msgstr  ""
 
-#: lxc/storage.go:730
+#: lxc/storage.go:797
 #, c-format
 msgid   "Storage volume %s deleted"
 msgstr  ""
@@ -938,35 +970,39 @@ msgstr  ""
 msgid   "Store the container state (only for stop)"
 msgstr  ""
 
-#: lxc/info.go:171
+#: lxc/info.go:180
 msgid   "Swap (current)"
 msgstr  ""
 
-#: lxc/info.go:175
+#: lxc/info.go:184
 msgid   "Swap (peak)"
 msgstr  ""
 
-#: lxc/list.go:465 lxc/network.go:459 lxc/storage.go:695
+#: lxc/list.go:470 lxc/network.go:505 lxc/storage.go:747
 msgid   "TYPE"
 msgstr  ""
 
-#: lxc/delete.go:91
+#: lxc/delete.go:105
 msgid   "The container is currently running, stop it first or pass --force."
 msgstr  ""
 
-#: lxc/publish.go:92
+#: lxc/publish.go:101
 msgid   "The container is currently running. Use --force to have it stopped and restarted."
 msgstr  ""
 
-#: lxc/init.go:326
+#: lxc/init.go:358
 msgid   "The container you are starting doesn't have any network attached to it."
 msgstr  ""
 
-#: lxc/config.go:716 lxc/config.go:728 lxc/config.go:761 lxc/config.go:779 lxc/config.go:817 lxc/config.go:835
+#: lxc/config.go:770 lxc/config.go:787
+msgid   "The device already exists"
+msgstr  ""
+
+#: lxc/config.go:833 lxc/config.go:845 lxc/config.go:881 lxc/config.go:899 lxc/config.go:945 lxc/config.go:962 lxc/config.go:1006 lxc/config.go:1022
 msgid   "The device doesn't exist"
 msgstr  ""
 
-#: lxc/init.go:310
+#: lxc/init.go:342
 #, c-format
 msgid   "The local image '%s' couldn't be found, trying '%s:' instead."
 msgstr  ""
@@ -975,15 +1011,15 @@ msgstr  ""
 msgid   "The opposite of \"lxc pause\" is \"lxc start\"."
 msgstr  ""
 
-#: lxc/network.go:262 lxc/network.go:311 lxc/storage.go:376 lxc/storage.go:476
+#: lxc/network.go:290 lxc/network.go:343 lxc/storage.go:388 lxc/storage.go:508
 msgid   "The specified device doesn't exist"
 msgstr  ""
 
-#: lxc/network.go:266 lxc/network.go:315
+#: lxc/network.go:294 lxc/network.go:347
 msgid   "The specified device doesn't match the network"
 msgstr  ""
 
-#: lxc/publish.go:65
+#: lxc/publish.go:74
 msgid   "There is no \"image name\".  Did you want an alias?"
 msgstr  ""
 
@@ -998,49 +1034,49 @@ msgstr  ""
 msgid   "Time to wait for the container before killing it"
 msgstr  ""
 
-#: lxc/image.go:463
+#: lxc/image.go:549
 msgid   "Timestamps:"
 msgstr  ""
 
-#: lxc/init.go:328
+#: lxc/init.go:360
 msgid   "To attach a network to a container, use: lxc network attach"
 msgstr  ""
 
-#: lxc/init.go:327
+#: lxc/init.go:359
 msgid   "To create a new network, use: lxc network create"
 msgstr  ""
 
-#: lxc/main.go:140
+#: lxc/main.go:154
 msgid   "To start your first container, try: lxc launch ubuntu:16.04"
 msgstr  ""
 
-#: lxc/image.go:551
+#: lxc/image.go:657
 #, c-format
 msgid   "Transferring image: %s"
 msgstr  ""
 
-#: lxc/action.go:98 lxc/launch.go:165
+#: lxc/action.go:106 lxc/launch.go:77
 #, c-format
 msgid   "Try `lxc info --show-log %s` for more info"
 msgstr  ""
 
-#: lxc/info.go:102
+#: lxc/info.go:111
 msgid   "Type: ephemeral"
 msgstr  ""
 
-#: lxc/info.go:104
+#: lxc/info.go:113
 msgid   "Type: persistent"
 msgstr  ""
 
-#: lxc/image.go:230
+#: lxc/image.go:233
 msgid   "UPLOAD DATE"
 msgstr  ""
 
-#: lxc/remote.go:396
+#: lxc/remote.go:407
 msgid   "URL"
 msgstr  ""
 
-#: lxc/network.go:462 lxc/profile.go:500 lxc/storage.go:611 lxc/storage.go:698
+#: lxc/network.go:508 lxc/profile.go:556 lxc/storage.go:657 lxc/storage.go:750
 msgid   "USED BY"
 msgstr  ""
 
@@ -1048,11 +1084,16 @@ msgstr  ""
 msgid   "Unable to find help2man."
 msgstr  ""
 
-#: lxc/remote.go:110
+#: lxc/remote.go:111
 msgid   "Unable to read remote TLS certificate"
 msgstr  ""
 
-#: lxc/image.go:468
+#: lxc/file.go:108
+#, c-format
+msgid   "Unknown file type '%s'"
+msgstr  ""
+
+#: lxc/image.go:554
 #, c-format
 msgid   "Uploaded: %s"
 msgstr  ""
@@ -1068,7 +1109,7 @@ msgstr  ""
 msgid   "Usage: lxc <command> [options]"
 msgstr  ""
 
-#: lxc/config.go:58
+#: lxc/config.go:60
 msgid   "Usage: lxc config <subcommand> [options]\n"
         "\n"
         "Change container or server configuration options.\n"
@@ -1148,13 +1189,13 @@ msgid   "Usage: lxc copy [<remote>:]<source>[/<snapshot>] [[<remote>:]<destinati
         "Copy containers within or in between LXD instances."
 msgstr  ""
 
-#: lxc/delete.go:26
+#: lxc/delete.go:27
 msgid   "Usage: lxc delete [<remote>:]<container>[/<snapshot>] [[<remote>:]<container>[/<snapshot>]...]\n"
         "\n"
         "Delete containers and snapshots."
 msgstr  ""
 
-#: lxc/exec.go:52
+#: lxc/exec.go:53
 msgid   "Usage: lxc exec [<remote>:]<container> [-t] [-T] [-n] [--mode=auto|interactive|non-interactive] [--env KEY=VALUE...] [--] <command line>\n"
         "\n"
         "Execute commands in containers.\n"
@@ -1162,7 +1203,7 @@ msgid   "Usage: lxc exec [<remote>:]<container> [-t] [-T] [-n] [--mode=auto|inte
         "Mode defaults to non-interactive, interactive mode is selected if both stdin AND stdout are terminals (stderr is ignored)."
 msgstr  ""
 
-#: lxc/file.go:36
+#: lxc/file.go:38
 msgid   "Usage: lxc file <subcommand> [options]\n"
         "\n"
         "Manage files in containers.\n"
@@ -1199,7 +1240,7 @@ msgid   "Usage: lxc help [--all]\n"
         "Help page for the LXD client."
 msgstr  ""
 
-#: lxc/image.go:69
+#: lxc/image.go:72
 msgid   "Usage: lxc image <subcommand> [options]\n"
         "\n"
         "Manipulate container images.\n"
@@ -1296,7 +1337,7 @@ msgid   "Usage: lxc image <subcommand> [options]\n"
         "    List the aliases. Filters may be part of the image hash or part of the image alias name."
 msgstr  ""
 
-#: lxc/info.go:25
+#: lxc/info.go:26
 msgid   "Usage: lxc info [<remote>:][<container>] [--show-log]\n"
         "\n"
         "Show container or server information.\n"
@@ -1308,7 +1349,7 @@ msgid   "Usage: lxc info [<remote>:][<container>] [--show-log]\n"
         "    For LXD server information."
 msgstr  ""
 
-#: lxc/init.go:75
+#: lxc/init.go:76
 msgid   "Usage: lxc init [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--profile|-p <profile>...] [--config|-c <key=value>...] [--network|-n <network>] [--storage|-s <pool>]\n"
         "\n"
         "Create containers from images.\n"
@@ -1320,7 +1361,7 @@ msgid   "Usage: lxc init [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e]
         "    lxc init ubuntu:16.04 u1"
 msgstr  ""
 
-#: lxc/launch.go:23
+#: lxc/launch.go:20
 msgid   "Usage: lxc launch [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--profile|-p <profile>...] [--config|-c <key=value>...] [--network|-n <network>] [--storage|-s <pool>]\n"
         "\n"
         "Create and start containers from images.\n"
@@ -1435,7 +1476,7 @@ msgid   "Usage: lxc monitor [<remote>:] [--type=TYPE...]\n"
         "    Only show log message."
 msgstr  ""
 
-#: lxc/move.go:19
+#: lxc/move.go:22
 msgid   "Usage: lxc move [<remote>:]<container>[/<snapshot>] [<remote>:][<container>[/<snapshot>]] [--container-only]\n"
         "\n"
         "Move containers within or in between LXD instances.\n"
@@ -1450,7 +1491,7 @@ msgid   "Usage: lxc move [<remote>:]<container>[/<snapshot>] [<remote>:][<contai
         "    Rename a snapshot."
 msgstr  ""
 
-#: lxc/network.go:49
+#: lxc/network.go:50
 msgid   "Usage: lxc network <subcommand> [options]\n"
         "\n"
         "Manage and attach containers to networks.\n"
@@ -1496,7 +1537,7 @@ msgid   "Usage: lxc network <subcommand> [options]\n"
         "    Update a network using the content of network.yaml"
 msgstr  ""
 
-#: lxc/profile.go:49
+#: lxc/profile.go:51
 msgid   "Usage: lxc profile <subcommand> [options]\n"
         "\n"
         "Manage container configuration profiles.\n"
@@ -1575,13 +1616,13 @@ msgid   "Usage: lxc profile <subcommand> [options]\n"
         "    Remove all profile from \"foo\""
 msgstr  ""
 
-#: lxc/publish.go:27
+#: lxc/publish.go:28
 msgid   "Usage: lxc publish [<remote>:]<container>[/<snapshot>] [<remote>:] [--alias=ALIAS...] [prop-key=prop-value...]\n"
         "\n"
         "Publish containers as images."
 msgstr  ""
 
-#: lxc/remote.go:38
+#: lxc/remote.go:39
 msgid   "Usage: lxc remote <subcommand> [options]\n"
         "\n"
         "Manage the list of remote LXD servers.\n"
@@ -1608,7 +1649,7 @@ msgid   "Usage: lxc remote <subcommand> [options]\n"
         "    Print the default remote."
 msgstr  ""
 
-#: lxc/restore.go:21
+#: lxc/restore.go:22
 msgid   "Usage: lxc restore [<remote>:]<container> <snapshot> [--stateful]\n"
         "\n"
         "Restore containers from snapshots.\n"
@@ -1623,7 +1664,7 @@ msgid   "Usage: lxc restore [<remote>:]<container> <snapshot> [--stateful]\n"
         "    Restore the snapshot."
 msgstr  ""
 
-#: lxc/snapshot.go:21
+#: lxc/snapshot.go:22
 msgid   "Usage: lxc snapshot [<remote>:]<container> <snapshot name> [--stateful]\n"
         "\n"
         "Create container snapshots.\n"
@@ -1636,7 +1677,7 @@ msgid   "Usage: lxc snapshot [<remote>:]<container> <snapshot name> [--stateful]
         "    Create a snapshot of \"u1\" called \"snap0\"."
 msgstr  ""
 
-#: lxc/storage.go:61
+#: lxc/storage.go:62
 msgid   "Usage: lxc storage <subcommand> [options]\n"
         "\n"
         "Manage storage pools and volumes.\n"
@@ -1725,155 +1766,127 @@ msgid   "Usage: lxc version\n"
         "Print the version number of this client tool."
 msgstr  ""
 
-#: lxc/delete.go:45
+#: lxc/delete.go:46
 msgid   "User aborted delete operation."
 msgstr  ""
 
-#: lxc/restore.go:37
+#: lxc/restore.go:38
 msgid   "Whether or not to restore the container's running state from snapshot (if available)"
 msgstr  ""
 
-#: lxc/snapshot.go:35
+#: lxc/snapshot.go:36
 msgid   "Whether or not to snapshot the container's running state"
 msgstr  ""
 
-#: lxc/network.go:446 lxc/remote.go:371 lxc/remote.go:376
+#: lxc/network.go:492 lxc/remote.go:382 lxc/remote.go:387
 msgid   "YES"
 msgstr  ""
 
-#: lxc/exec.go:125
+#: lxc/exec.go:126
 msgid   "You can't pass -t and -T at the same time"
 msgstr  ""
 
-#: lxc/exec.go:129
+#: lxc/exec.go:130
 msgid   "You can't pass -t or -T at the same time as --mode"
 msgstr  ""
 
-#: lxc/main.go:56
-msgid   "`lxc config profile` is deprecated, please use `lxc profile`"
-msgstr  ""
-
-#: lxc/launch.go:134
-msgid   "bad number of things scanned from image, container or snapshot"
-msgstr  ""
-
-#: lxc/action.go:94
-msgid   "bad result type from action"
+#: lxc/copy.go:57
+msgid   "You must specify a source container name"
 msgstr  ""
 
-#: lxc/copy.go:118
-msgid   "can't copy to the same container name"
-msgstr  ""
-
-#: lxc/file.go:314
-msgid   "can't pull a directory without --recursive"
+#: lxc/main.go:58
+msgid   "`lxc config profile` is deprecated, please use `lxc profile`"
 msgstr  ""
 
-#: lxc/remote.go:359
+#: lxc/remote.go:370
 msgid   "can't remove the default remote"
 msgstr  ""
 
-#: lxc/file.go:125
+#: lxc/file.go:269
 msgid   "can't supply uid/gid/mode in recursive mode"
 msgstr  ""
 
-#: lxc/remote.go:385
+#: lxc/remote.go:396
 msgid   "default"
 msgstr  ""
 
-#: lxc/copy.go:134 lxc/copy.go:139 lxc/copy.go:258 lxc/copy.go:263 lxc/init.go:234 lxc/init.go:239 lxc/launch.go:115 lxc/launch.go:121
+#: lxc/init.go:308
 msgid   "didn't get any affected image, container or snapshot from server"
 msgstr  ""
 
-#: lxc/image.go:454
+#: lxc/image.go:540
 msgid   "disabled"
 msgstr  ""
 
-#: lxc/image.go:456
+#: lxc/image.go:542
 msgid   "enabled"
 msgstr  ""
 
-#: lxc/action.go:126 lxc/main.go:26 lxc/main.go:159
+#: lxc/action.go:134 lxc/main.go:28 lxc/main.go:173
 #, c-format
 msgid   "error: %v"
 msgstr  ""
 
-#: lxc/help.go:37 lxc/main.go:106
+#: lxc/help.go:37 lxc/main.go:114
 #, c-format
 msgid   "error: unknown command: %s"
 msgstr  ""
 
-#: lxc/launch.go:139
-msgid   "got bad version"
-msgstr  ""
-
-#: lxc/image.go:202 lxc/image.go:449
+#: lxc/image.go:205 lxc/image.go:535
 msgid   "no"
 msgstr  ""
 
-#: lxc/copy.go:167
-msgid   "not all the profiles from the source exist on the target"
-msgstr  ""
-
-#: lxc/remote.go:233
+#: lxc/remote.go:229
 msgid   "ok (y/n)?"
 msgstr  ""
 
-#: lxc/main.go:331 lxc/main.go:335
+#: lxc/main.go:345 lxc/main.go:349
 #, c-format
 msgid   "processing aliases failed %s\n"
 msgstr  ""
 
-#: lxc/file.go:381
+#: lxc/file.go:541
 msgid   "recursive edit doesn't make sense :("
 msgstr  ""
 
-#: lxc/remote.go:421
+#: lxc/remote.go:432
 #, c-format
 msgid   "remote %s already exists"
 msgstr  ""
 
-#: lxc/remote.go:351 lxc/remote.go:413 lxc/remote.go:448 lxc/remote.go:464
+#: lxc/remote.go:362 lxc/remote.go:424 lxc/remote.go:459 lxc/remote.go:475
 #, c-format
 msgid   "remote %s doesn't exist"
 msgstr  ""
 
-#: lxc/remote.go:334
+#: lxc/remote.go:345
 #, c-format
 msgid   "remote %s exists as <%s>"
 msgstr  ""
 
-#: lxc/remote.go:355 lxc/remote.go:417 lxc/remote.go:452
+#: lxc/remote.go:366 lxc/remote.go:428 lxc/remote.go:463
 #, c-format
 msgid   "remote %s is static and cannot be modified"
 msgstr  ""
 
-#: lxc/info.go:221
+#: lxc/info.go:230
 msgid   "stateful"
 msgstr  ""
 
-#: lxc/info.go:223
+#: lxc/info.go:232
 msgid   "stateless"
 msgstr  ""
 
-#: lxc/info.go:217
+#: lxc/info.go:226
 #, c-format
 msgid   "taken at %s"
 msgstr  ""
 
-#: lxc/exec.go:214
-msgid   "unreachable return reached"
-msgstr  ""
-
-#: lxc/main.go:262
+#: lxc/main.go:276
 msgid   "wrong number of subcommand arguments"
 msgstr  ""
 
-#: lxc/delete.go:44 lxc/image.go:200 lxc/image.go:451
+#: lxc/delete.go:45 lxc/image.go:203 lxc/image.go:537
 msgid   "yes"
 msgstr  ""
 
-#: lxc/copy.go:47
-msgid   "you must specify a source container name"
-msgstr  ""
-
diff --git a/po/nl.po b/po/nl.po
index 2642438d5..7b1400d6d 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-06-13 20:10+0200\n"
+"POT-Creation-Date: 2017-06-17 03:18+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -16,7 +16,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: lxc/storage.go:30
+#: lxc/storage.go:31
 msgid ""
 "### This is a yaml representation of a storage pool.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -33,7 +33,7 @@ msgid ""
 "###   zfs.pool_name: default"
 msgstr ""
 
-#: lxc/storage.go:47
+#: lxc/storage.go:48
 msgid ""
 "### This is a yaml representation of a storage volume.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -47,7 +47,7 @@ msgid ""
 "###   size: \"61203283968\""
 msgstr ""
 
-#: lxc/config.go:37
+#: lxc/config.go:39
 msgid ""
 "### This is a yaml representation of the configuration.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -68,7 +68,7 @@ msgid ""
 "### Note that the name is shown but cannot be changed"
 msgstr ""
 
-#: lxc/image.go:59
+#: lxc/image.go:62
 msgid ""
 "### This is a yaml representation of the image properties.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -78,7 +78,7 @@ msgid ""
 "###  description: My custom image"
 msgstr ""
 
-#: lxc/network.go:29
+#: lxc/network.go:30
 msgid ""
 "### This is a yaml representation of the network.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -98,7 +98,7 @@ msgid ""
 "### Note that only the configuration can be changed."
 msgstr ""
 
-#: lxc/profile.go:28
+#: lxc/profile.go:30
 msgid ""
 "### This is a yaml representation of the profile.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -119,106 +119,130 @@ msgid ""
 "### Note that the name is shown but cannot be changed"
 msgstr ""
 
-#: lxc/image.go:179
+#: lxc/image.go:182
 #, c-format
 msgid "%s (%d more)"
 msgstr ""
 
-#: lxc/snapshot.go:58
+#: lxc/file.go:183
+#, c-format
+msgid "%s is not a directory"
+msgstr ""
+
+#: lxc/file.go:125
+#, c-format
+msgid "'%s' isn't a regular file or directory."
+msgstr ""
+
+#: lxc/snapshot.go:53
 msgid "'/' not allowed in snapshot name"
 msgstr ""
 
-#: lxc/profile.go:293
+#: lxc/profile.go:319
 msgid "(none)"
 msgstr ""
 
-#: lxc/image.go:223 lxc/image.go:814
+#: lxc/image.go:226 lxc/image.go:1052
 msgid "ALIAS"
 msgstr ""
 
-#: lxc/image.go:224
+#: lxc/image.go:227
 msgid "ALIASES"
 msgstr ""
 
-#: lxc/image.go:228
+#: lxc/image.go:231
 msgid "ARCH"
 msgstr ""
 
-#: lxc/list.go:456
+#: lxc/list.go:461
 msgid "ARCHITECTURE"
 msgstr ""
 
-#: lxc/remote.go:66
+#: lxc/remote.go:67
 msgid "Accept certificate"
 msgstr ""
 
-#: lxc/remote.go:282
+#: lxc/remote.go:281
 #, c-format
 msgid "Admin password for %s: "
 msgstr ""
 
-#: lxc/image.go:483
+#: lxc/image.go:569
 msgid "Aliases:"
 msgstr ""
 
-#: lxc/image.go:461 lxc/info.go:95
+#: lxc/image.go:547 lxc/info.go:104
 #, c-format
 msgid "Architecture: %s"
 msgstr ""
 
-#: lxc/image.go:491
+#: lxc/image.go:577
 #, c-format
 msgid "Auto update: %s"
 msgstr ""
 
-#: lxc/info.go:188
+#: lxc/image.go:651
+#, c-format
+msgid "Bad property: %s"
+msgstr ""
+
+#: lxc/info.go:197
 msgid "Bytes received"
 msgstr ""
 
-#: lxc/info.go:189
+#: lxc/info.go:198
 msgid "Bytes sent"
 msgstr ""
 
-#: lxc/config.go:310
+#: lxc/config.go:349
 msgid "COMMON NAME"
 msgstr ""
 
-#: lxc/info.go:152
+#: lxc/info.go:161
 msgid "CPU usage (in seconds)"
 msgstr ""
 
-#: lxc/info.go:156
+#: lxc/info.go:165
 msgid "CPU usage:"
 msgstr ""
 
-#: lxc/list.go:457
+#: lxc/list.go:462
 msgid "CREATED AT"
 msgstr ""
 
-#: lxc/config.go:150 lxc/network.go:496
+#: lxc/file.go:470
+msgid "Can't pull a directory without --recursive"
+msgstr ""
+
+#: lxc/config.go:156 lxc/network.go:542
 #, c-format
 msgid "Can't read from stdin: %s"
 msgstr ""
 
-#: lxc/config.go:163 lxc/config.go:196 lxc/config.go:218
+#: lxc/config.go:169
+#, c-format
+msgid "Can't unset key '%s', it's not currently set"
+msgstr ""
+
+#: lxc/config.go:211 lxc/config.go:237
 #, c-format
 msgid "Can't unset key '%s', it's not currently set."
 msgstr ""
 
-#: lxc/network.go:422 lxc/profile.go:472 lxc/storage.go:579
+#: lxc/network.go:468 lxc/profile.go:528 lxc/storage.go:625
 msgid "Cannot provide container name to list"
 msgstr ""
 
-#: lxc/remote.go:232
+#: lxc/remote.go:228
 #, c-format
 msgid "Certificate fingerprint: %s"
 msgstr ""
 
-#: lxc/remote.go:305
+#: lxc/remote.go:316
 msgid "Client certificate stored at server: "
 msgstr ""
 
-#: lxc/image.go:167 lxc/image.go:168 lxc/list.go:128 lxc/list.go:129
+#: lxc/image.go:170 lxc/image.go:171 lxc/list.go:128 lxc/list.go:129
 msgid "Columns"
 msgstr ""
 
@@ -226,35 +250,35 @@ msgstr ""
 msgid "Commands:"
 msgstr ""
 
-#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:135 lxc/init.go:136
+#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:136 lxc/init.go:137
 msgid "Config key/value to apply to the new container"
 msgstr ""
 
-#: lxc/config.go:571 lxc/config.go:636 lxc/image.go:868 lxc/network.go:378
-#: lxc/profile.go:257 lxc/storage.go:535 lxc/storage.go:854
+#: lxc/config.go:647 lxc/config.go:712 lxc/image.go:1107 lxc/network.go:418
+#: lxc/profile.go:267 lxc/storage.go:576 lxc/storage.go:935
 #, c-format
 msgid "Config parsing error: %s"
 msgstr ""
 
-#: lxc/main.go:33
+#: lxc/main.go:35
 msgid "Connection refused; is LXD running?"
 msgstr ""
 
-#: lxc/publish.go:62
+#: lxc/publish.go:71
 msgid "Container name is mandatory"
 msgstr ""
 
-#: lxc/copy.go:143 lxc/copy.go:267 lxc/init.go:244
+#: lxc/copy.go:210 lxc/init.go:313
 #, c-format
 msgid "Container name is: %s"
 msgstr ""
 
-#: lxc/publish.go:160 lxc/publish.go:175
+#: lxc/publish.go:250
 #, c-format
 msgid "Container published with fingerprint: %s"
 msgstr ""
 
-#: lxc/image.go:170
+#: lxc/image.go:173
 msgid "Copy aliases from source"
 msgstr ""
 
@@ -262,85 +286,90 @@ msgstr ""
 msgid "Copy the container without its snapshots"
 msgstr ""
 
-#: lxc/image.go:360
+#: lxc/image.go:422
 #, c-format
 msgid "Copying the image: %s"
 msgstr ""
 
-#: lxc/remote.go:247
+#: lxc/remote.go:243
 msgid "Could not create server cert dir"
 msgstr ""
 
-#: lxc/file.go:67 lxc/file.go:68
+#: lxc/file.go:69 lxc/file.go:70
 msgid "Create any directories necessary"
 msgstr ""
 
-#: lxc/image.go:466 lxc/info.go:97
+#: lxc/image.go:552 lxc/info.go:106
 #, c-format
 msgid "Created: %s"
 msgstr ""
 
-#: lxc/init.go:182 lxc/launch.go:142
+#: lxc/init.go:194
 #, c-format
 msgid "Creating %s"
 msgstr ""
 
-#: lxc/init.go:180
+#: lxc/init.go:192
 msgid "Creating the container"
 msgstr ""
 
-#: lxc/image.go:227 lxc/image.go:816 lxc/list.go:458 lxc/network.go:461
-#: lxc/storage.go:608 lxc/storage.go:697
+#: lxc/image.go:230 lxc/image.go:1054 lxc/list.go:463 lxc/network.go:507
+#: lxc/storage.go:654 lxc/storage.go:749
 msgid "DESCRIPTION"
 msgstr ""
 
-#: lxc/storage.go:609
+#: lxc/storage.go:655
 msgid "DRIVER"
 msgstr ""
 
-#: lxc/publish.go:38
+#: lxc/publish.go:39
 msgid "Define a compression algorithm: for image or none"
 msgstr ""
 
-#: lxc/config.go:688
+#: lxc/config.go:803
 #, c-format
 msgid "Device %s added to %s"
 msgstr ""
 
-#: lxc/config.go:875
+#: lxc/config.go:1037
 #, c-format
 msgid "Device %s removed from %s"
 msgstr ""
 
-#: lxc/exec.go:64
-msgid "Disable pseudo-terminal allocation"
+#: lxc/utils.go:248 lxc/utils.go:272
+#, c-format
+msgid "Device already exists: %s"
 msgstr ""
 
 #: lxc/exec.go:65
+msgid "Disable pseudo-terminal allocation"
+msgstr ""
+
+#: lxc/exec.go:66
 msgid "Disable stdin (reads from /dev/null)"
 msgstr ""
 
-#: lxc/info.go:145
+#: lxc/info.go:154
 msgid "Disk usage:"
 msgstr ""
 
-#: lxc/list.go:609
+#: lxc/list.go:614
 msgid "EPHEMERAL"
 msgstr ""
 
-#: lxc/config.go:312
+#: lxc/config.go:351
 msgid "EXPIRY DATE"
 msgstr ""
 
-#: lxc/main.go:45
+#: lxc/main.go:47
 msgid "Enable debug mode"
 msgstr ""
 
-#: lxc/main.go:44
+#: lxc/main.go:46
 msgid "Enable verbose mode"
 msgstr ""
 
-#: lxc/exec.go:61
+#: lxc/exec.go:62
 msgid "Environment variable to set (e.g. HOME=/home/foo)"
 msgstr ""
 
@@ -348,7 +377,7 @@ msgstr ""
 msgid "Environment:"
 msgstr ""
 
-#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:139 lxc/init.go:140
+#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:140 lxc/init.go:141
 msgid "Ephemeral container"
 msgstr ""
 
@@ -356,16 +385,21 @@ msgstr ""
 msgid "Event type to listen for"
 msgstr ""
 
-#: lxc/image.go:470
+#: lxc/image.go:556
 #, c-format
 msgid "Expires: %s"
 msgstr ""
 
-#: lxc/image.go:472
+#: lxc/image.go:558
 msgid "Expires: never"
 msgstr ""
 
-#: lxc/config.go:309 lxc/image.go:225 lxc/image.go:815
+#: lxc/image.go:848
+#, c-format
+msgid "Exporting the image: %s"
+msgstr ""
+
+#: lxc/config.go:348 lxc/image.go:228 lxc/image.go:1053
 msgid "FINGERPRINT"
 msgstr ""
 
@@ -379,16 +413,25 @@ msgstr ""
 msgid "Failed to generate 'lxc.1': %v"
 msgstr ""
 
+#: lxc/copy.go:205
+msgid "Failed to get the new container name"
+msgstr ""
+
+#: lxc/file.go:120
+#, c-format
+msgid "Failed to walk path for %s: %s"
+msgstr ""
+
 #: lxc/list.go:131
 msgid "Fast mode (same as --columns=nsacPt)"
 msgstr ""
 
-#: lxc/image.go:459
+#: lxc/image.go:545
 #, c-format
 msgid "Fingerprint: %s"
 msgstr ""
 
-#: lxc/exec.go:63
+#: lxc/exec.go:64
 msgid "Force pseudo-terminal allocation"
 msgstr ""
 
@@ -396,39 +439,39 @@ msgstr ""
 msgid "Force the container to shutdown"
 msgstr ""
 
-#: lxc/delete.go:33 lxc/delete.go:34
+#: lxc/delete.go:34 lxc/delete.go:35
 msgid "Force the removal of stopped containers"
 msgstr ""
 
-#: lxc/main.go:46
+#: lxc/main.go:48
 msgid "Force using the local unix socket"
 msgstr ""
 
-#: lxc/image.go:173 lxc/list.go:130
+#: lxc/image.go:176 lxc/list.go:130
 msgid "Format (csv|json|table|yaml)"
 msgstr ""
 
-#: lxc/remote.go:80
+#: lxc/remote.go:81
 msgid "Generating a client certificate. This may take a minute..."
 msgstr ""
 
-#: lxc/list.go:454
+#: lxc/list.go:459
 msgid "IPV4"
 msgstr ""
 
-#: lxc/list.go:455
+#: lxc/list.go:460
 msgid "IPV6"
 msgstr ""
 
-#: lxc/config.go:311
+#: lxc/config.go:350
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:139
+#: lxc/main.go:153
 msgid "If this is your first time using LXD, you should also run: lxd init"
 msgstr ""
 
-#: lxc/main.go:47
+#: lxc/main.go:49
 msgid "Ignore aliases when determining what command to run"
 msgstr ""
 
@@ -436,245 +479,229 @@ msgstr ""
 msgid "Ignore the container state (only for start)"
 msgstr ""
 
-#: lxc/image.go:422
+#: lxc/image.go:508
 msgid "Image already up to date."
 msgstr ""
 
-#: lxc/image.go:363
+#: lxc/image.go:436
 msgid "Image copied successfully!"
 msgstr ""
 
-#: lxc/image.go:546 lxc/image.go:558
+#: lxc/image.go:898
+msgid "Image exported successfully!"
+msgstr ""
+
+#: lxc/image.go:709
 #, c-format
 msgid "Image imported with fingerprint: %s"
 msgstr ""
 
-#: lxc/image.go:420
+#: lxc/image.go:506
 msgid "Image refreshed successfully!"
 msgstr ""
 
-#: lxc/image.go:543
-#, c-format
-msgid "Importing the image: %s"
-msgstr ""
-
-#: lxc/remote.go:150
+#: lxc/remote.go:151
 #, c-format
 msgid "Invalid URL scheme \"%s\" in \"%s\""
 msgstr ""
 
-#: lxc/config.go:290
+#: lxc/config.go:329
 msgid "Invalid certificate"
 msgstr ""
 
-#: lxc/init.go:30 lxc/init.go:35
+#: lxc/init.go:31 lxc/init.go:36
 msgid "Invalid configuration key"
 msgstr ""
 
-#: lxc/file.go:357
+#: lxc/file.go:513
 #, c-format
 msgid "Invalid path %s"
 msgstr ""
 
-#: lxc/file.go:291
+#: lxc/file.go:443
 #, c-format
 msgid "Invalid source %s"
 msgstr ""
 
-#: lxc/file.go:80
+#: lxc/file.go:221
 #, c-format
 msgid "Invalid target %s"
 msgstr ""
 
-#: lxc/info.go:126
+#: lxc/info.go:135
 msgid "Ips:"
 msgstr ""
 
-#: lxc/image.go:171
+#: lxc/image.go:174
 msgid "Keep the image up to date after initial copy"
 msgstr ""
 
-#: lxc/list.go:459
+#: lxc/list.go:464
 msgid "LAST USED AT"
 msgstr ""
 
-#: lxc/main.go:31
+#: lxc/main.go:33
 msgid "LXD socket not found; is LXD installed and running?"
 msgstr ""
 
-#: lxc/image.go:475
+#: lxc/image.go:561
 #, c-format
 msgid "Last used: %s"
 msgstr ""
 
-#: lxc/image.go:477
+#: lxc/image.go:563
 msgid "Last used: never"
 msgstr ""
 
-#: lxc/info.go:241
+#: lxc/info.go:250
 msgid "Log:"
 msgstr ""
 
-#: lxc/network.go:460
+#: lxc/network.go:506
 msgid "MANAGED"
 msgstr ""
 
-#: lxc/image.go:169
+#: lxc/image.go:172
 msgid "Make image public"
 msgstr ""
 
-#: lxc/publish.go:34
+#: lxc/publish.go:35
 msgid "Make the image public"
 msgstr ""
 
-#: lxc/info.go:163
+#: lxc/info.go:172
 msgid "Memory (current)"
 msgstr ""
 
-#: lxc/info.go:167
+#: lxc/info.go:176
 msgid "Memory (peak)"
 msgstr ""
 
-#: lxc/info.go:179
+#: lxc/info.go:188
 msgid "Memory usage:"
 msgstr ""
 
-#: lxc/copy.go:276
-#, c-format
-msgid "Migration failed on source host: %s"
-msgstr ""
-
-#: lxc/copy.go:280
-#, c-format
-msgid "Migration failed on target host: %s"
-msgstr ""
-
-#: lxc/utils.go:201
+#: lxc/utils.go:199
 msgid "Missing summary."
 msgstr ""
 
-#: lxc/network.go:248 lxc/network.go:297 lxc/storage.go:362 lxc/storage.go:462
+#: lxc/network.go:276 lxc/network.go:329 lxc/storage.go:374 lxc/storage.go:494
 msgid "More than one device matches, specify the device name."
 msgstr ""
 
-#: lxc/file.go:279
+#: lxc/file.go:431
 msgid "More than one file to download, but target is not a directory"
 msgstr ""
 
-#: lxc/move.go:35
+#: lxc/move.go:38
 msgid "Move the container without its snapshots"
 msgstr ""
 
-#: lxc/action.go:68
+#: lxc/action.go:72
 msgid "Must supply container name for: "
 msgstr ""
 
-#: lxc/list.go:460 lxc/network.go:458 lxc/profile.go:499 lxc/remote.go:395
-#: lxc/storage.go:607 lxc/storage.go:696
+#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:406
+#: lxc/storage.go:653 lxc/storage.go:748
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:444 lxc/remote.go:369 lxc/remote.go:374
+#: lxc/network.go:490 lxc/remote.go:380 lxc/remote.go:385
 msgid "NO"
 msgstr ""
 
-#: lxc/info.go:91
+#: lxc/info.go:99
 #, c-format
 msgid "Name: %s"
 msgstr ""
 
-#: lxc/network.go:222
+#: lxc/network.go:250
 #, c-format
 msgid "Network %s created"
 msgstr ""
 
-#: lxc/network.go:325
+#: lxc/network.go:366
 #, c-format
 msgid "Network %s deleted"
 msgstr ""
 
-#: lxc/init.go:141 lxc/init.go:142
+#: lxc/init.go:142 lxc/init.go:143
 msgid "Network name"
 msgstr ""
 
-#: lxc/info.go:196
+#: lxc/info.go:205
 msgid "Network usage:"
 msgstr ""
 
-#: lxc/image.go:172 lxc/publish.go:35
+#: lxc/image.go:175 lxc/publish.go:36
 msgid "New alias to define at target"
 msgstr ""
 
-#: lxc/config.go:321
+#: lxc/config.go:360
 msgid "No certificate provided to add"
 msgstr ""
 
-#: lxc/network.go:257 lxc/network.go:306
+#: lxc/network.go:285 lxc/network.go:338
 msgid "No device found for this network"
 msgstr ""
 
-#: lxc/storage.go:371 lxc/storage.go:471
+#: lxc/storage.go:383 lxc/storage.go:503
 msgid "No device found for this storage volume."
 msgstr ""
 
-#: lxc/config.go:344
+#: lxc/config.go:392
 msgid "No fingerprint specified."
 msgstr ""
 
-#: lxc/storage.go:323 lxc/storage.go:407
+#: lxc/storage.go:327 lxc/storage.go:420
 msgid "Only \"custom\" volumes can be attached to containers."
 msgstr ""
 
-#: lxc/remote.go:135
+#: lxc/remote.go:136
 msgid "Only https URLs are supported for simplestreams"
 msgstr ""
 
-#: lxc/image.go:549
+#: lxc/image.go:632
 msgid "Only https:// is supported for remote image import."
 msgstr ""
 
-#: lxc/network.go:354 lxc/network.go:482
+#: lxc/network.go:394 lxc/network.go:528
 msgid "Only managed networks can be modified."
 msgstr ""
 
-#: lxc/help.go:71 lxc/main.go:112 lxc/main.go:163
+#: lxc/help.go:71 lxc/main.go:120 lxc/main.go:177
 msgid "Options:"
 msgstr ""
 
-#: lxc/image.go:664
-#, c-format
-msgid "Output is in %s"
-msgstr ""
-
-#: lxc/exec.go:62
+#: lxc/exec.go:63
 msgid "Override the terminal mode (auto, interactive or non-interactive)"
 msgstr ""
 
-#: lxc/list.go:611
+#: lxc/list.go:616
 msgid "PERSISTENT"
 msgstr ""
 
-#: lxc/list.go:461
+#: lxc/list.go:466
 msgid "PID"
 msgstr ""
 
-#: lxc/list.go:462
+#: lxc/list.go:467
 msgid "PROFILES"
 msgstr ""
 
-#: lxc/remote.go:397
+#: lxc/remote.go:408
 msgid "PROTOCOL"
 msgstr ""
 
-#: lxc/image.go:226 lxc/remote.go:398
+#: lxc/image.go:229 lxc/remote.go:409
 msgid "PUBLIC"
 msgstr ""
 
-#: lxc/info.go:190
+#: lxc/info.go:199
 msgid "Packets received"
 msgstr ""
 
-#: lxc/info.go:191
+#: lxc/info.go:200
 msgid "Packets sent"
 msgstr ""
 
@@ -686,24 +713,24 @@ msgstr ""
 msgid "Path to an alternate server directory"
 msgstr ""
 
-#: lxc/main.go:202
+#: lxc/main.go:216
 msgid "Pause containers."
 msgstr ""
 
-#: lxc/main.go:35
+#: lxc/main.go:37
 msgid "Permission denied, are you in the lxd group?"
 msgstr ""
 
-#: lxc/info.go:108
+#: lxc/info.go:117
 #, c-format
 msgid "Pid: %d"
 msgstr ""
 
-#: lxc/network.go:379 lxc/profile.go:258 lxc/storage.go:536 lxc/storage.go:855
+#: lxc/network.go:419 lxc/profile.go:268 lxc/storage.go:577 lxc/storage.go:936
 msgid "Press enter to open the editor again"
 msgstr ""
 
-#: lxc/config.go:572 lxc/config.go:637 lxc/image.go:869
+#: lxc/config.go:648 lxc/config.go:713 lxc/image.go:1108
 msgid "Press enter to start the editor again"
 msgstr ""
 
@@ -719,143 +746,143 @@ msgstr ""
 msgid "Print verbose information"
 msgstr ""
 
-#: lxc/info.go:132
+#: lxc/info.go:141
 #, c-format
 msgid "Processes: %d"
 msgstr ""
 
-#: lxc/profile.go:314
+#: lxc/profile.go:344
 #, c-format
 msgid "Profile %s added to %s"
 msgstr ""
 
-#: lxc/profile.go:209
+#: lxc/profile.go:218
 #, c-format
 msgid "Profile %s created"
 msgstr ""
 
-#: lxc/profile.go:279
+#: lxc/profile.go:292
 #, c-format
 msgid "Profile %s deleted"
 msgstr ""
 
-#: lxc/profile.go:345
+#: lxc/profile.go:379
 #, c-format
 msgid "Profile %s removed from %s"
 msgstr ""
 
-#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:137 lxc/init.go:138
+#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:138 lxc/init.go:139
 msgid "Profile to apply to the new container"
 msgstr ""
 
-#: lxc/profile.go:295
+#: lxc/profile.go:321
 #, c-format
 msgid "Profiles %s applied to %s"
 msgstr ""
 
-#: lxc/info.go:106
+#: lxc/info.go:115
 #, c-format
 msgid "Profiles: %s"
 msgstr ""
 
-#: lxc/image.go:479
+#: lxc/image.go:565
 msgid "Properties:"
 msgstr ""
 
-#: lxc/remote.go:69
+#: lxc/remote.go:70
 msgid "Public image server"
 msgstr ""
 
-#: lxc/image.go:462
+#: lxc/image.go:548
 #, c-format
 msgid "Public: %s"
 msgstr ""
 
-#: lxc/file.go:65 lxc/file.go:66
+#: lxc/file.go:67 lxc/file.go:68
 msgid "Recursively push or pull files"
 msgstr ""
 
-#: lxc/image.go:413
+#: lxc/image.go:489
 #, c-format
 msgid "Refreshing the image: %s"
 msgstr ""
 
-#: lxc/remote.go:67
+#: lxc/remote.go:68
 msgid "Remote admin password"
 msgstr ""
 
-#: lxc/info.go:93
+#: lxc/info.go:101
 #, c-format
 msgid "Remote: %s"
 msgstr ""
 
-#: lxc/delete.go:41
+#: lxc/delete.go:42
 #, c-format
 msgid "Remove %s (yes/no): "
 msgstr ""
 
-#: lxc/delete.go:35 lxc/delete.go:36
+#: lxc/delete.go:36 lxc/delete.go:37
 msgid "Require user confirmation"
 msgstr ""
 
-#: lxc/info.go:129
+#: lxc/info.go:138
 msgid "Resources:"
 msgstr ""
 
-#: lxc/main.go:210
+#: lxc/main.go:224
 msgid "Restart containers."
 msgstr ""
 
-#: lxc/init.go:253
+#: lxc/init.go:286
 #, c-format
 msgid "Retrieving image: %s"
 msgstr ""
 
-#: lxc/image.go:229
+#: lxc/image.go:232
 msgid "SIZE"
 msgstr ""
 
-#: lxc/list.go:463
+#: lxc/list.go:468
 msgid "SNAPSHOTS"
 msgstr ""
 
-#: lxc/storage.go:610
+#: lxc/storage.go:656
 msgid "SOURCE"
 msgstr ""
 
-#: lxc/list.go:464
+#: lxc/list.go:469
 msgid "STATE"
 msgstr ""
 
-#: lxc/remote.go:399
+#: lxc/remote.go:410
 msgid "STATIC"
 msgstr ""
 
-#: lxc/list.go:466
+#: lxc/list.go:471
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/remote.go:240
+#: lxc/remote.go:236
 msgid "Server certificate NACKed by user"
 msgstr ""
 
-#: lxc/remote.go:302
+#: lxc/remote.go:313
 msgid "Server doesn't trust us after adding our cert"
 msgstr ""
 
-#: lxc/remote.go:68
+#: lxc/remote.go:69
 msgid "Server protocol (lxd or simplestreams)"
 msgstr ""
 
-#: lxc/file.go:63
+#: lxc/file.go:65
 msgid "Set the file's gid on push"
 msgstr ""
 
-#: lxc/file.go:64
+#: lxc/file.go:66
 msgid "Set the file's perms on push"
 msgstr ""
 
-#: lxc/file.go:62
+#: lxc/file.go:64
 msgid "Set the file's uid on push"
 msgstr ""
 
@@ -867,78 +894,83 @@ msgstr ""
 msgid "Show client version"
 msgstr ""
 
-#: lxc/info.go:38
+#: lxc/info.go:39
 msgid "Show the container's last 100 log lines?"
 msgstr ""
 
-#: lxc/config.go:33
+#: lxc/config.go:35
 msgid "Show the expanded configuration"
 msgstr ""
 
-#: lxc/image.go:460
+#: lxc/image.go:546
 #, c-format
 msgid "Size: %.2fMB"
 msgstr ""
 
-#: lxc/info.go:210
+#: lxc/info.go:219
 msgid "Snapshots:"
 msgstr ""
 
-#: lxc/action.go:134
+#: lxc/action.go:142
 #, c-format
 msgid "Some containers failed to %s"
 msgstr ""
 
-#: lxc/image.go:493
+#: lxc/image.go:579
 msgid "Source:"
 msgstr ""
 
-#: lxc/main.go:220
+#: lxc/main.go:234
 msgid "Start containers."
 msgstr ""
 
-#: lxc/launch.go:152
+#: lxc/launch.go:59
 #, c-format
 msgid "Starting %s"
 msgstr ""
 
-#: lxc/info.go:100
+#: lxc/info.go:109
 #, c-format
 msgid "Status: %s"
 msgstr ""
 
-#: lxc/main.go:226
+#: lxc/main.go:240
 msgid "Stop containers."
 msgstr ""
 
-#: lxc/publish.go:36 lxc/publish.go:37
+#: lxc/publish.go:37 lxc/publish.go:38
 msgid "Stop the container if currently running"
 msgstr ""
 
-#: lxc/delete.go:105 lxc/publish.go:114
+#: lxc/publish.go:136
 msgid "Stopping container failed!"
 msgstr ""
 
-#: lxc/storage.go:436
+#: lxc/delete.go:121
+#, c-format
+msgid "Stopping the container failed: %s"
+msgstr ""
+
+#: lxc/storage.go:468
 #, c-format
 msgid "Storage pool %s created"
 msgstr ""
 
-#: lxc/storage.go:486
+#: lxc/storage.go:527
 #, c-format
 msgid "Storage pool %s deleted"
 msgstr ""
 
-#: lxc/init.go:143 lxc/init.go:144
+#: lxc/init.go:144 lxc/init.go:145
 msgid "Storage pool name"
 msgstr ""
 
-#: lxc/storage.go:720
+#: lxc/storage.go:782
 #, c-format
 msgid "Storage volume %s created"
 msgstr ""
 
-#: lxc/storage.go:730
+#: lxc/storage.go:797
 #, c-format
 msgid "Storage volume %s deleted"
 msgstr ""
@@ -947,38 +979,42 @@ msgstr ""
 msgid "Store the container state (only for stop)"
 msgstr ""
 
-#: lxc/info.go:171
+#: lxc/info.go:180
 msgid "Swap (current)"
 msgstr ""
 
-#: lxc/info.go:175
+#: lxc/info.go:184
 msgid "Swap (peak)"
 msgstr ""
 
-#: lxc/list.go:465 lxc/network.go:459 lxc/storage.go:695
+#: lxc/list.go:470 lxc/network.go:505 lxc/storage.go:747
 msgid "TYPE"
 msgstr ""
 
-#: lxc/delete.go:91
+#: lxc/delete.go:105
 msgid "The container is currently running, stop it first or pass --force."
 msgstr ""
 
-#: lxc/publish.go:92
+#: lxc/publish.go:101
 msgid ""
 "The container is currently running. Use --force to have it stopped and "
 "restarted."
 msgstr ""
 
-#: lxc/init.go:326
+#: lxc/init.go:358
 msgid "The container you are starting doesn't have any network attached to it."
 msgstr ""
 
-#: lxc/config.go:716 lxc/config.go:728 lxc/config.go:761 lxc/config.go:779
-#: lxc/config.go:817 lxc/config.go:835
+#: lxc/config.go:770 lxc/config.go:787
+msgid "The device already exists"
+msgstr ""
+
+#: lxc/config.go:833 lxc/config.go:845 lxc/config.go:881 lxc/config.go:899
+#: lxc/config.go:945 lxc/config.go:962 lxc/config.go:1006 lxc/config.go:1022
 msgid "The device doesn't exist"
 msgstr ""
 
-#: lxc/init.go:310
+#: lxc/init.go:342
 #, c-format
 msgid "The local image '%s' couldn't be found, trying '%s:' instead."
 msgstr ""
@@ -987,15 +1023,15 @@ msgstr ""
 msgid "The opposite of \"lxc pause\" is \"lxc start\"."
 msgstr ""
 
-#: lxc/network.go:262 lxc/network.go:311 lxc/storage.go:376 lxc/storage.go:476
+#: lxc/network.go:290 lxc/network.go:343 lxc/storage.go:388 lxc/storage.go:508
 msgid "The specified device doesn't exist"
 msgstr ""
 
-#: lxc/network.go:266 lxc/network.go:315
+#: lxc/network.go:294 lxc/network.go:347
 msgid "The specified device doesn't match the network"
 msgstr ""
 
-#: lxc/publish.go:65
+#: lxc/publish.go:74
 msgid "There is no \"image name\".  Did you want an alias?"
 msgstr ""
 
@@ -1011,49 +1047,49 @@ msgstr ""
 msgid "Time to wait for the container before killing it"
 msgstr ""
 
-#: lxc/image.go:463
+#: lxc/image.go:549
 msgid "Timestamps:"
 msgstr ""
 
-#: lxc/init.go:328
+#: lxc/init.go:360
 msgid "To attach a network to a container, use: lxc network attach"
 msgstr ""
 
-#: lxc/init.go:327
+#: lxc/init.go:359
 msgid "To create a new network, use: lxc network create"
 msgstr ""
 
-#: lxc/main.go:140
+#: lxc/main.go:154
 msgid "To start your first container, try: lxc launch ubuntu:16.04"
 msgstr ""
 
-#: lxc/image.go:551
+#: lxc/image.go:657
 #, c-format
 msgid "Transferring image: %s"
 msgstr ""
 
-#: lxc/action.go:98 lxc/launch.go:165
+#: lxc/action.go:106 lxc/launch.go:77
 #, c-format
 msgid "Try `lxc info --show-log %s` for more info"
 msgstr ""
 
-#: lxc/info.go:102
+#: lxc/info.go:111
 msgid "Type: ephemeral"
 msgstr ""
 
-#: lxc/info.go:104
+#: lxc/info.go:113
 msgid "Type: persistent"
 msgstr ""
 
-#: lxc/image.go:230
+#: lxc/image.go:233
 msgid "UPLOAD DATE"
 msgstr ""
 
-#: lxc/remote.go:396
+#: lxc/remote.go:407
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:462 lxc/profile.go:500 lxc/storage.go:611 lxc/storage.go:698
+#: lxc/network.go:508 lxc/profile.go:556 lxc/storage.go:657 lxc/storage.go:750
 msgid "USED BY"
 msgstr ""
 
@@ -1061,11 +1097,16 @@ msgstr ""
 msgid "Unable to find help2man."
 msgstr ""
 
-#: lxc/remote.go:110
+#: lxc/remote.go:111
 msgid "Unable to read remote TLS certificate"
 msgstr ""
 
-#: lxc/image.go:468
+#: lxc/file.go:108
+#, c-format
+msgid "Unknown file type '%s'"
+msgstr ""
+
+#: lxc/image.go:554
 #, c-format
 msgid "Uploaded: %s"
 msgstr ""
@@ -1082,7 +1123,7 @@ msgstr ""
 msgid "Usage: lxc <command> [options]"
 msgstr ""
 
-#: lxc/config.go:58
+#: lxc/config.go:60
 msgid ""
 "Usage: lxc config <subcommand> [options]\n"
 "\n"
@@ -1168,7 +1209,7 @@ msgid ""
 "Copy containers within or in between LXD instances."
 msgstr ""
 
-#: lxc/delete.go:26
+#: lxc/delete.go:27
 msgid ""
 "Usage: lxc delete [<remote>:]<container>[/<snapshot>] "
 "[[<remote>:]<container>[/<snapshot>]...]\n"
@@ -1176,7 +1217,7 @@ msgid ""
 "Delete containers and snapshots."
 msgstr ""
 
-#: lxc/exec.go:52
+#: lxc/exec.go:53
 msgid ""
 "Usage: lxc exec [<remote>:]<container> [-t] [-T] [-n] [--mode=auto|"
 "interactive|non-interactive] [--env KEY=VALUE...] [--] <command line>\n"
@@ -1187,7 +1228,7 @@ msgid ""
 "AND stdout are terminals (stderr is ignored)."
 msgstr ""
 
-#: lxc/file.go:36
+#: lxc/file.go:38
 msgid ""
 "Usage: lxc file <subcommand> [options]\n"
 "\n"
@@ -1231,7 +1272,7 @@ msgid ""
 "Help page for the LXD client."
 msgstr ""
 
-#: lxc/image.go:69
+#: lxc/image.go:72
 msgid ""
 "Usage: lxc image <subcommand> [options]\n"
 "\n"
@@ -1336,7 +1377,7 @@ msgid ""
 "image alias name."
 msgstr ""
 
-#: lxc/info.go:25
+#: lxc/info.go:26
 msgid ""
 "Usage: lxc info [<remote>:][<container>] [--show-log]\n"
 "\n"
@@ -1349,7 +1390,7 @@ msgid ""
 "    For LXD server information."
 msgstr ""
 
-#: lxc/init.go:75
+#: lxc/init.go:76
 msgid ""
 "Usage: lxc init [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--"
 "profile|-p <profile>...] [--config|-c <key=value>...] [--network|-n "
@@ -1364,7 +1405,7 @@ msgid ""
 "    lxc init ubuntu:16.04 u1"
 msgstr ""
 
-#: lxc/launch.go:23
+#: lxc/launch.go:20
 msgid ""
 "Usage: lxc launch [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--"
 "profile|-p <profile>...] [--config|-c <key=value>...] [--network|-n "
@@ -1493,7 +1534,7 @@ msgid ""
 "    Only show log message."
 msgstr ""
 
-#: lxc/move.go:19
+#: lxc/move.go:22
 msgid ""
 "Usage: lxc move [<remote>:]<container>[/<snapshot>] [<remote>:][<container>[/"
 "<snapshot>]] [--container-only]\n"
@@ -1512,7 +1553,7 @@ msgid ""
 "    Rename a snapshot."
 msgstr ""
 
-#: lxc/network.go:49
+#: lxc/network.go:50
 msgid ""
 "Usage: lxc network <subcommand> [options]\n"
 "\n"
@@ -1565,7 +1606,7 @@ msgid ""
 "    Update a network using the content of network.yaml"
 msgstr ""
 
-#: lxc/profile.go:49
+#: lxc/profile.go:51
 msgid ""
 "Usage: lxc profile <subcommand> [options]\n"
 "\n"
@@ -1647,7 +1688,7 @@ msgid ""
 "    Remove all profile from \"foo\""
 msgstr ""
 
-#: lxc/publish.go:27
+#: lxc/publish.go:28
 msgid ""
 "Usage: lxc publish [<remote>:]<container>[/<snapshot>] [<remote>:] [--"
 "alias=ALIAS...] [prop-key=prop-value...]\n"
@@ -1655,7 +1696,7 @@ msgid ""
 "Publish containers as images."
 msgstr ""
 
-#: lxc/remote.go:38
+#: lxc/remote.go:39
 msgid ""
 "Usage: lxc remote <subcommand> [options]\n"
 "\n"
@@ -1684,7 +1725,7 @@ msgid ""
 "    Print the default remote."
 msgstr ""
 
-#: lxc/restore.go:21
+#: lxc/restore.go:22
 msgid ""
 "Usage: lxc restore [<remote>:]<container> <snapshot> [--stateful]\n"
 "\n"
@@ -1700,7 +1741,7 @@ msgid ""
 "    Restore the snapshot."
 msgstr ""
 
-#: lxc/snapshot.go:21
+#: lxc/snapshot.go:22
 msgid ""
 "Usage: lxc snapshot [<remote>:]<container> <snapshot name> [--stateful]\n"
 "\n"
@@ -1714,7 +1755,7 @@ msgid ""
 "    Create a snapshot of \"u1\" called \"snap0\"."
 msgstr ""
 
-#: lxc/storage.go:61
+#: lxc/storage.go:62
 msgid ""
 "Usage: lxc storage <subcommand> [options]\n"
 "\n"
@@ -1814,157 +1855,128 @@ msgid ""
 "Print the version number of this client tool."
 msgstr ""
 
-#: lxc/delete.go:45
+#: lxc/delete.go:46
 msgid "User aborted delete operation."
 msgstr ""
 
-#: lxc/restore.go:37
+#: lxc/restore.go:38
 msgid ""
 "Whether or not to restore the container's running state from snapshot (if "
 "available)"
 msgstr ""
 
-#: lxc/snapshot.go:35
+#: lxc/snapshot.go:36
 msgid "Whether or not to snapshot the container's running state"
 msgstr ""
 
-#: lxc/network.go:446 lxc/remote.go:371 lxc/remote.go:376
+#: lxc/network.go:492 lxc/remote.go:382 lxc/remote.go:387
 msgid "YES"
 msgstr ""
 
-#: lxc/exec.go:125
+#: lxc/exec.go:126
 msgid "You can't pass -t and -T at the same time"
 msgstr ""
 
-#: lxc/exec.go:129
+#: lxc/exec.go:130
 msgid "You can't pass -t or -T at the same time as --mode"
 msgstr ""
 
-#: lxc/main.go:56
-msgid "`lxc config profile` is deprecated, please use `lxc profile`"
-msgstr ""
-
-#: lxc/launch.go:134
-msgid "bad number of things scanned from image, container or snapshot"
-msgstr ""
-
-#: lxc/action.go:94
-msgid "bad result type from action"
+#: lxc/copy.go:57
+msgid "You must specify a source container name"
 msgstr ""
 
-#: lxc/copy.go:118
-msgid "can't copy to the same container name"
-msgstr ""
-
-#: lxc/file.go:314
-msgid "can't pull a directory without --recursive"
+#: lxc/main.go:58
+msgid "`lxc config profile` is deprecated, please use `lxc profile`"
 msgstr ""
 
-#: lxc/remote.go:359
+#: lxc/remote.go:370
 msgid "can't remove the default remote"
 msgstr ""
 
-#: lxc/file.go:125
+#: lxc/file.go:269
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr ""
 
-#: lxc/remote.go:385
+#: lxc/remote.go:396
 msgid "default"
 msgstr ""
 
-#: lxc/copy.go:134 lxc/copy.go:139 lxc/copy.go:258 lxc/copy.go:263
-#: lxc/init.go:234 lxc/init.go:239 lxc/launch.go:115 lxc/launch.go:121
+#: lxc/init.go:308
 msgid "didn't get any affected image, container or snapshot from server"
 msgstr ""
 
-#: lxc/image.go:454
+#: lxc/image.go:540
 msgid "disabled"
 msgstr ""
 
-#: lxc/image.go:456
+#: lxc/image.go:542
 msgid "enabled"
 msgstr ""
 
-#: lxc/action.go:126 lxc/main.go:26 lxc/main.go:159
+#: lxc/action.go:134 lxc/main.go:28 lxc/main.go:173
 #, c-format
 msgid "error: %v"
 msgstr ""
 
-#: lxc/help.go:37 lxc/main.go:106
+#: lxc/help.go:37 lxc/main.go:114
 #, c-format
 msgid "error: unknown command: %s"
 msgstr ""
 
-#: lxc/launch.go:139
-msgid "got bad version"
-msgstr ""
-
-#: lxc/image.go:202 lxc/image.go:449
+#: lxc/image.go:205 lxc/image.go:535
 msgid "no"
 msgstr ""
 
-#: lxc/copy.go:167
-msgid "not all the profiles from the source exist on the target"
-msgstr ""
-
-#: lxc/remote.go:233
+#: lxc/remote.go:229
 msgid "ok (y/n)?"
 msgstr ""
 
-#: lxc/main.go:331 lxc/main.go:335
+#: lxc/main.go:345 lxc/main.go:349
 #, c-format
 msgid "processing aliases failed %s\n"
 msgstr ""
 
-#: lxc/file.go:381
+#: lxc/file.go:541
 msgid "recursive edit doesn't make sense :("
 msgstr ""
 
-#: lxc/remote.go:421
+#: lxc/remote.go:432
 #, c-format
 msgid "remote %s already exists"
 msgstr ""
 
-#: lxc/remote.go:351 lxc/remote.go:413 lxc/remote.go:448 lxc/remote.go:464
+#: lxc/remote.go:362 lxc/remote.go:424 lxc/remote.go:459 lxc/remote.go:475
 #, c-format
 msgid "remote %s doesn't exist"
 msgstr ""
 
-#: lxc/remote.go:334
+#: lxc/remote.go:345
 #, c-format
 msgid "remote %s exists as <%s>"
 msgstr ""
 
-#: lxc/remote.go:355 lxc/remote.go:417 lxc/remote.go:452
+#: lxc/remote.go:366 lxc/remote.go:428 lxc/remote.go:463
 #, c-format
 msgid "remote %s is static and cannot be modified"
 msgstr ""
 
-#: lxc/info.go:221
+#: lxc/info.go:230
 msgid "stateful"
 msgstr ""
 
-#: lxc/info.go:223
+#: lxc/info.go:232
 msgid "stateless"
 msgstr ""
 
-#: lxc/info.go:217
+#: lxc/info.go:226
 #, c-format
 msgid "taken at %s"
 msgstr ""
 
-#: lxc/exec.go:214
-msgid "unreachable return reached"
-msgstr ""
-
-#: lxc/main.go:262
+#: lxc/main.go:276
 msgid "wrong number of subcommand arguments"
 msgstr ""
 
-#: lxc/delete.go:44 lxc/image.go:200 lxc/image.go:451
+#: lxc/delete.go:45 lxc/image.go:203 lxc/image.go:537
 msgid "yes"
 msgstr ""
-
-#: lxc/copy.go:47
-msgid "you must specify a source container name"
-msgstr ""
diff --git a/po/ru.po b/po/ru.po
index 4308b9367..e6ea6bdf5 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-06-13 20:10+0200\n"
+"POT-Creation-Date: 2017-06-17 03:18+0000\n"
 "PO-Revision-Date: 2017-02-14 09:54+0000\n"
 "Last-Translator: Vyacheslav Razykov <v.razykov at gmail.com>\n"
 "Language-Team: Russian <https://hosted.weblate.org/projects/linux-containers/"
@@ -20,7 +20,7 @@ msgstr ""
 "%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n"
 "X-Generator: Weblate 2.12-dev\n"
 
-#: lxc/storage.go:30
+#: lxc/storage.go:31
 #, fuzzy
 msgid ""
 "### This is a yaml representation of a storage pool.\n"
@@ -54,7 +54,7 @@ msgstr ""
 "###\n"
 "### Обратите внимание, что только конфигурация может быть изменена."
 
-#: lxc/storage.go:47
+#: lxc/storage.go:48
 msgid ""
 "### This is a yaml representation of a storage volume.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -68,7 +68,7 @@ msgid ""
 "###   size: \"61203283968\""
 msgstr ""
 
-#: lxc/config.go:37
+#: lxc/config.go:39
 msgid ""
 "### This is a yaml representation of the configuration.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -106,7 +106,7 @@ msgstr ""
 "###\n"
 "### Обратите внимание, что имя отображается, но не может быть изменено"
 
-#: lxc/image.go:59
+#: lxc/image.go:62
 msgid ""
 "### This is a yaml representation of the image properties.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -116,7 +116,7 @@ msgid ""
 "###  description: My custom image"
 msgstr ""
 
-#: lxc/network.go:29
+#: lxc/network.go:30
 msgid ""
 "### This is a yaml representation of the network.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -152,7 +152,7 @@ msgstr ""
 "###\n"
 "### Обратите внимание, что только конфигурация может быть изменена."
 
-#: lxc/profile.go:28
+#: lxc/profile.go:30
 msgid ""
 "### This is a yaml representation of the profile.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -190,108 +190,132 @@ msgstr ""
 "###\n"
 "### Обратите внимание, что имя отображается, но не может быть изменено"
 
-#: lxc/image.go:179
+#: lxc/image.go:182
 #, c-format
 msgid "%s (%d more)"
 msgstr ""
 
-#: lxc/snapshot.go:58
+#: lxc/file.go:183
+#, c-format
+msgid "%s is not a directory"
+msgstr ""
+
+#: lxc/file.go:125
+#, c-format
+msgid "'%s' isn't a regular file or directory."
+msgstr ""
+
+#: lxc/snapshot.go:53
 msgid "'/' not allowed in snapshot name"
 msgstr "Нельзя использовать '/' в имени снимка"
 
-#: lxc/profile.go:293
+#: lxc/profile.go:319
 msgid "(none)"
 msgstr "(пусто)"
 
-#: lxc/image.go:223 lxc/image.go:814
+#: lxc/image.go:226 lxc/image.go:1052
 msgid "ALIAS"
 msgstr "ПСЕВДОНИМ"
 
-#: lxc/image.go:224
+#: lxc/image.go:227
 #, fuzzy
 msgid "ALIASES"
 msgstr "ПСЕВДОНИМ"
 
-#: lxc/image.go:228
+#: lxc/image.go:231
 msgid "ARCH"
 msgstr "ARCH"
 
-#: lxc/list.go:456
+#: lxc/list.go:461
 msgid "ARCHITECTURE"
 msgstr "АРХИТЕКТУРА"
 
-#: lxc/remote.go:66
+#: lxc/remote.go:67
 msgid "Accept certificate"
 msgstr "Принять сертификат"
 
-#: lxc/remote.go:282
+#: lxc/remote.go:281
 #, c-format
 msgid "Admin password for %s: "
 msgstr "Пароль администратора для %s: "
 
-#: lxc/image.go:483
+#: lxc/image.go:569
 msgid "Aliases:"
 msgstr "Псевдонимы:"
 
-#: lxc/image.go:461 lxc/info.go:95
+#: lxc/image.go:547 lxc/info.go:104
 #, c-format
 msgid "Architecture: %s"
 msgstr "Архитектура: %s"
 
-#: lxc/image.go:491
+#: lxc/image.go:577
 #, c-format
 msgid "Auto update: %s"
 msgstr "Авто-обновление: %s"
 
-#: lxc/info.go:188
+#: lxc/image.go:651
+#, c-format
+msgid "Bad property: %s"
+msgstr ""
+
+#: lxc/info.go:197
 msgid "Bytes received"
 msgstr ""
 
-#: lxc/info.go:189
+#: lxc/info.go:198
 msgid "Bytes sent"
 msgstr ""
 
-#: lxc/config.go:310
+#: lxc/config.go:349
 msgid "COMMON NAME"
 msgstr "ОБЩЕЕ ИМЯ"
 
-#: lxc/info.go:152
+#: lxc/info.go:161
 msgid "CPU usage (in seconds)"
 msgstr "Использование ЦП (в секундах)"
 
-#: lxc/info.go:156
+#: lxc/info.go:165
 #, fuzzy
 msgid "CPU usage:"
 msgstr " Использование ЦП:"
 
-#: lxc/list.go:457
+#: lxc/list.go:462
 msgid "CREATED AT"
 msgstr "СОЗДАН"
 
-#: lxc/config.go:150 lxc/network.go:496
+#: lxc/file.go:470
+msgid "Can't pull a directory without --recursive"
+msgstr ""
+
+#: lxc/config.go:156 lxc/network.go:542
 #, c-format
 msgid "Can't read from stdin: %s"
 msgstr "Невозможно прочитать из стандартного ввода: %s"
 
-#: lxc/config.go:163 lxc/config.go:196 lxc/config.go:218
+#: lxc/config.go:169
+#, c-format
+msgid "Can't unset key '%s', it's not currently set"
+msgstr ""
+
+#: lxc/config.go:211 lxc/config.go:237
 #, c-format
 msgid "Can't unset key '%s', it's not currently set."
 msgstr ""
 
-#: lxc/network.go:422 lxc/profile.go:472 lxc/storage.go:579
+#: lxc/network.go:468 lxc/profile.go:528 lxc/storage.go:625
 msgid "Cannot provide container name to list"
 msgstr "Невозможно добавить имя контейнера в список"
 
-#: lxc/remote.go:232
+#: lxc/remote.go:228
 #, c-format
 msgid "Certificate fingerprint: %s"
 msgstr ""
 
-#: lxc/remote.go:305
+#: lxc/remote.go:316
 msgid "Client certificate stored at server: "
 msgstr "Сертификат клиента хранится на сервере: "
 
-#: lxc/image.go:167 lxc/image.go:168 lxc/list.go:128 lxc/list.go:129
+#: lxc/image.go:170 lxc/image.go:171 lxc/list.go:128 lxc/list.go:129
 msgid "Columns"
 msgstr "Столбцы"
 
@@ -299,35 +323,35 @@ msgstr "Столбцы"
 msgid "Commands:"
 msgstr ""
 
-#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:135 lxc/init.go:136
+#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:136 lxc/init.go:137
 msgid "Config key/value to apply to the new container"
 msgstr ""
 
-#: lxc/config.go:571 lxc/config.go:636 lxc/image.go:868 lxc/network.go:378
-#: lxc/profile.go:257 lxc/storage.go:535 lxc/storage.go:854
+#: lxc/config.go:647 lxc/config.go:712 lxc/image.go:1107 lxc/network.go:418
+#: lxc/profile.go:267 lxc/storage.go:576 lxc/storage.go:935
 #, c-format
 msgid "Config parsing error: %s"
 msgstr ""
 
-#: lxc/main.go:33
+#: lxc/main.go:35
 msgid "Connection refused; is LXD running?"
 msgstr "В соединении отказано; LXD запущен?"
 
-#: lxc/publish.go:62
+#: lxc/publish.go:71
 msgid "Container name is mandatory"
 msgstr "Имя контейнера является обязательным"
 
-#: lxc/copy.go:143 lxc/copy.go:267 lxc/init.go:244
+#: lxc/copy.go:210 lxc/init.go:313
 #, c-format
 msgid "Container name is: %s"
 msgstr "Имя контейнера: %s"
 
-#: lxc/publish.go:160 lxc/publish.go:175
+#: lxc/publish.go:250
 #, c-format
 msgid "Container published with fingerprint: %s"
 msgstr ""
 
-#: lxc/image.go:170
+#: lxc/image.go:173
 msgid "Copy aliases from source"
 msgstr "Копировать псевдонимы из источника"
 
@@ -335,86 +359,91 @@ msgstr "Копировать псевдонимы из источника"
 msgid "Copy the container without its snapshots"
 msgstr ""
 
-#: lxc/image.go:360
+#: lxc/image.go:422
 #, c-format
 msgid "Copying the image: %s"
 msgstr "Копирование образа: %s"
 
-#: lxc/remote.go:247
+#: lxc/remote.go:243
 msgid "Could not create server cert dir"
 msgstr "Не удалось создать каталог сертификата сервера"
 
-#: lxc/file.go:67 lxc/file.go:68
+#: lxc/file.go:69 lxc/file.go:70
 msgid "Create any directories necessary"
 msgstr ""
 
-#: lxc/image.go:466 lxc/info.go:97
+#: lxc/image.go:552 lxc/info.go:106
 #, c-format
 msgid "Created: %s"
 msgstr ""
 
-#: lxc/init.go:182 lxc/launch.go:142
+#: lxc/init.go:194
 #, c-format
 msgid "Creating %s"
 msgstr ""
 
-#: lxc/init.go:180
+#: lxc/init.go:192
 msgid "Creating the container"
 msgstr ""
 
-#: lxc/image.go:227 lxc/image.go:816 lxc/list.go:458 lxc/network.go:461
-#: lxc/storage.go:608 lxc/storage.go:697
+#: lxc/image.go:230 lxc/image.go:1054 lxc/list.go:463 lxc/network.go:507
+#: lxc/storage.go:654 lxc/storage.go:749
 msgid "DESCRIPTION"
 msgstr ""
 
-#: lxc/storage.go:609
+#: lxc/storage.go:655
 msgid "DRIVER"
 msgstr ""
 
-#: lxc/publish.go:38
+#: lxc/publish.go:39
 msgid "Define a compression algorithm: for image or none"
 msgstr ""
 
-#: lxc/config.go:688
+#: lxc/config.go:803
 #, c-format
 msgid "Device %s added to %s"
 msgstr ""
 
-#: lxc/config.go:875
+#: lxc/config.go:1037
 #, c-format
 msgid "Device %s removed from %s"
 msgstr ""
 
-#: lxc/exec.go:64
-msgid "Disable pseudo-terminal allocation"
+#: lxc/utils.go:248 lxc/utils.go:272
+#, c-format
+msgid "Device already exists: %s"
 msgstr ""
 
 #: lxc/exec.go:65
+msgid "Disable pseudo-terminal allocation"
+msgstr ""
+
+#: lxc/exec.go:66
 msgid "Disable stdin (reads from /dev/null)"
 msgstr ""
 
-#: lxc/info.go:145
+#: lxc/info.go:154
 #, fuzzy
 msgid "Disk usage:"
 msgstr " Использование диска:"
 
-#: lxc/list.go:609
+#: lxc/list.go:614
 msgid "EPHEMERAL"
 msgstr ""
 
-#: lxc/config.go:312
+#: lxc/config.go:351
 msgid "EXPIRY DATE"
 msgstr ""
 
-#: lxc/main.go:45
+#: lxc/main.go:47
 msgid "Enable debug mode"
 msgstr ""
 
-#: lxc/main.go:44
+#: lxc/main.go:46
 msgid "Enable verbose mode"
 msgstr ""
 
-#: lxc/exec.go:61
+#: lxc/exec.go:62
 msgid "Environment variable to set (e.g. HOME=/home/foo)"
 msgstr ""
 
@@ -422,7 +451,7 @@ msgstr ""
 msgid "Environment:"
 msgstr ""
 
-#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:139 lxc/init.go:140
+#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:140 lxc/init.go:141
 msgid "Ephemeral container"
 msgstr ""
 
@@ -430,16 +459,21 @@ msgstr ""
 msgid "Event type to listen for"
 msgstr ""
 
-#: lxc/image.go:470
+#: lxc/image.go:556
 #, c-format
 msgid "Expires: %s"
 msgstr ""
 
-#: lxc/image.go:472
+#: lxc/image.go:558
 msgid "Expires: never"
 msgstr ""
 
-#: lxc/config.go:309 lxc/image.go:225 lxc/image.go:815
+#: lxc/image.go:848
+#, fuzzy, c-format
+msgid "Exporting the image: %s"
+msgstr "Копирование образа: %s"
+
+#: lxc/config.go:348 lxc/image.go:228 lxc/image.go:1053
 msgid "FINGERPRINT"
 msgstr ""
 
@@ -453,16 +487,25 @@ msgstr ""
 msgid "Failed to generate 'lxc.1': %v"
 msgstr ""
 
+#: lxc/copy.go:205
+msgid "Failed to get the new container name"
+msgstr ""
+
+#: lxc/file.go:120
+#, c-format
+msgid "Failed to walk path for %s: %s"
+msgstr ""
+
 #: lxc/list.go:131
 msgid "Fast mode (same as --columns=nsacPt)"
 msgstr ""
 
-#: lxc/image.go:459
+#: lxc/image.go:545
 #, c-format
 msgid "Fingerprint: %s"
 msgstr ""
 
-#: lxc/exec.go:63
+#: lxc/exec.go:64
 msgid "Force pseudo-terminal allocation"
 msgstr ""
 
@@ -470,39 +513,39 @@ msgstr ""
 msgid "Force the container to shutdown"
 msgstr ""
 
-#: lxc/delete.go:33 lxc/delete.go:34
+#: lxc/delete.go:34 lxc/delete.go:35
 msgid "Force the removal of stopped containers"
 msgstr ""
 
-#: lxc/main.go:46
+#: lxc/main.go:48
 msgid "Force using the local unix socket"
 msgstr ""
 
-#: lxc/image.go:173 lxc/list.go:130
+#: lxc/image.go:176 lxc/list.go:130
 msgid "Format (csv|json|table|yaml)"
 msgstr ""
 
-#: lxc/remote.go:80
+#: lxc/remote.go:81
 msgid "Generating a client certificate. This may take a minute..."
 msgstr ""
 
-#: lxc/list.go:454
+#: lxc/list.go:459
 msgid "IPV4"
 msgstr ""
 
-#: lxc/list.go:455
+#: lxc/list.go:460
 msgid "IPV6"
 msgstr ""
 
-#: lxc/config.go:311
+#: lxc/config.go:350
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:139
+#: lxc/main.go:153
 msgid "If this is your first time using LXD, you should also run: lxd init"
 msgstr ""
 
-#: lxc/main.go:47
+#: lxc/main.go:49
 msgid "Ignore aliases when determining what command to run"
 msgstr ""
 
@@ -510,247 +553,231 @@ msgstr ""
 msgid "Ignore the container state (only for start)"
 msgstr ""
 
-#: lxc/image.go:422
+#: lxc/image.go:508
 msgid "Image already up to date."
 msgstr ""
 
-#: lxc/image.go:363
+#: lxc/image.go:436
 msgid "Image copied successfully!"
 msgstr ""
 
-#: lxc/image.go:546 lxc/image.go:558
+#: lxc/image.go:898
+msgid "Image exported successfully!"
+msgstr ""
+
+#: lxc/image.go:709
 #, c-format
 msgid "Image imported with fingerprint: %s"
 msgstr ""
 
-#: lxc/image.go:420
+#: lxc/image.go:506
 msgid "Image refreshed successfully!"
 msgstr ""
 
-#: lxc/image.go:543
-#, c-format
-msgid "Importing the image: %s"
-msgstr ""
-
-#: lxc/remote.go:150
+#: lxc/remote.go:151
 #, c-format
 msgid "Invalid URL scheme \"%s\" in \"%s\""
 msgstr ""
 
-#: lxc/config.go:290
+#: lxc/config.go:329
 msgid "Invalid certificate"
 msgstr ""
 
-#: lxc/init.go:30 lxc/init.go:35
+#: lxc/init.go:31 lxc/init.go:36
 msgid "Invalid configuration key"
 msgstr ""
 
-#: lxc/file.go:357
+#: lxc/file.go:513
 #, c-format
 msgid "Invalid path %s"
 msgstr ""
 
-#: lxc/file.go:291
+#: lxc/file.go:443
 #, c-format
 msgid "Invalid source %s"
 msgstr ""
 
-#: lxc/file.go:80
+#: lxc/file.go:221
 #, c-format
 msgid "Invalid target %s"
 msgstr ""
 
-#: lxc/info.go:126
+#: lxc/info.go:135
 msgid "Ips:"
 msgstr ""
 
-#: lxc/image.go:171
+#: lxc/image.go:174
 msgid "Keep the image up to date after initial copy"
 msgstr ""
 
-#: lxc/list.go:459
+#: lxc/list.go:464
 msgid "LAST USED AT"
 msgstr ""
 
-#: lxc/main.go:31
+#: lxc/main.go:33
 msgid "LXD socket not found; is LXD installed and running?"
 msgstr ""
 
-#: lxc/image.go:475
+#: lxc/image.go:561
 #, c-format
 msgid "Last used: %s"
 msgstr ""
 
-#: lxc/image.go:477
+#: lxc/image.go:563
 msgid "Last used: never"
 msgstr ""
 
-#: lxc/info.go:241
+#: lxc/info.go:250
 msgid "Log:"
 msgstr ""
 
-#: lxc/network.go:460
+#: lxc/network.go:506
 msgid "MANAGED"
 msgstr ""
 
-#: lxc/image.go:169
+#: lxc/image.go:172
 msgid "Make image public"
 msgstr ""
 
-#: lxc/publish.go:34
+#: lxc/publish.go:35
 msgid "Make the image public"
 msgstr ""
 
-#: lxc/info.go:163
+#: lxc/info.go:172
 msgid "Memory (current)"
 msgstr ""
 
-#: lxc/info.go:167
+#: lxc/info.go:176
 msgid "Memory (peak)"
 msgstr ""
 
-#: lxc/info.go:179
+#: lxc/info.go:188
 #, fuzzy
 msgid "Memory usage:"
 msgstr " Использование памяти:"
 
-#: lxc/copy.go:276
-#, c-format
-msgid "Migration failed on source host: %s"
-msgstr ""
-
-#: lxc/copy.go:280
-#, c-format
-msgid "Migration failed on target host: %s"
-msgstr ""
-
-#: lxc/utils.go:201
+#: lxc/utils.go:199
 msgid "Missing summary."
 msgstr ""
 
-#: lxc/network.go:248 lxc/network.go:297 lxc/storage.go:362 lxc/storage.go:462
+#: lxc/network.go:276 lxc/network.go:329 lxc/storage.go:374 lxc/storage.go:494
 msgid "More than one device matches, specify the device name."
 msgstr ""
 
-#: lxc/file.go:279
+#: lxc/file.go:431
 msgid "More than one file to download, but target is not a directory"
 msgstr ""
 
-#: lxc/move.go:35
+#: lxc/move.go:38
 msgid "Move the container without its snapshots"
 msgstr ""
 
-#: lxc/action.go:68
+#: lxc/action.go:72
 msgid "Must supply container name for: "
 msgstr ""
 
-#: lxc/list.go:460 lxc/network.go:458 lxc/profile.go:499 lxc/remote.go:395
-#: lxc/storage.go:607 lxc/storage.go:696
+#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:406
+#: lxc/storage.go:653 lxc/storage.go:748
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:444 lxc/remote.go:369 lxc/remote.go:374
+#: lxc/network.go:490 lxc/remote.go:380 lxc/remote.go:385
 msgid "NO"
 msgstr ""
 
-#: lxc/info.go:91
+#: lxc/info.go:99
 #, c-format
 msgid "Name: %s"
 msgstr ""
 
-#: lxc/network.go:222
+#: lxc/network.go:250
 #, c-format
 msgid "Network %s created"
 msgstr ""
 
-#: lxc/network.go:325
+#: lxc/network.go:366
 #, c-format
 msgid "Network %s deleted"
 msgstr ""
 
-#: lxc/init.go:141 lxc/init.go:142
+#: lxc/init.go:142 lxc/init.go:143
 msgid "Network name"
 msgstr ""
 
-#: lxc/info.go:196
+#: lxc/info.go:205
 #, fuzzy
 msgid "Network usage:"
 msgstr " Использование сети:"
 
-#: lxc/image.go:172 lxc/publish.go:35
+#: lxc/image.go:175 lxc/publish.go:36
 msgid "New alias to define at target"
 msgstr ""
 
-#: lxc/config.go:321
+#: lxc/config.go:360
 msgid "No certificate provided to add"
 msgstr ""
 
-#: lxc/network.go:257 lxc/network.go:306
+#: lxc/network.go:285 lxc/network.go:338
 msgid "No device found for this network"
 msgstr ""
 
-#: lxc/storage.go:371 lxc/storage.go:471
+#: lxc/storage.go:383 lxc/storage.go:503
 msgid "No device found for this storage volume."
 msgstr ""
 
-#: lxc/config.go:344
+#: lxc/config.go:392
 msgid "No fingerprint specified."
 msgstr ""
 
-#: lxc/storage.go:323 lxc/storage.go:407
+#: lxc/storage.go:327 lxc/storage.go:420
 msgid "Only \"custom\" volumes can be attached to containers."
 msgstr ""
 
-#: lxc/remote.go:135
+#: lxc/remote.go:136
 msgid "Only https URLs are supported for simplestreams"
 msgstr ""
 
-#: lxc/image.go:549
+#: lxc/image.go:632
 msgid "Only https:// is supported for remote image import."
 msgstr ""
 
-#: lxc/network.go:354 lxc/network.go:482
+#: lxc/network.go:394 lxc/network.go:528
 msgid "Only managed networks can be modified."
 msgstr ""
 
-#: lxc/help.go:71 lxc/main.go:112 lxc/main.go:163
+#: lxc/help.go:71 lxc/main.go:120 lxc/main.go:177
 msgid "Options:"
 msgstr ""
 
-#: lxc/image.go:664
-#, c-format
-msgid "Output is in %s"
-msgstr ""
-
-#: lxc/exec.go:62
+#: lxc/exec.go:63
 msgid "Override the terminal mode (auto, interactive or non-interactive)"
 msgstr ""
 
-#: lxc/list.go:611
+#: lxc/list.go:616
 msgid "PERSISTENT"
 msgstr ""
 
-#: lxc/list.go:461
+#: lxc/list.go:466
 msgid "PID"
 msgstr ""
 
-#: lxc/list.go:462
+#: lxc/list.go:467
 msgid "PROFILES"
 msgstr ""
 
-#: lxc/remote.go:397
+#: lxc/remote.go:408
 msgid "PROTOCOL"
 msgstr ""
 
-#: lxc/image.go:226 lxc/remote.go:398
+#: lxc/image.go:229 lxc/remote.go:409
 msgid "PUBLIC"
 msgstr ""
 
-#: lxc/info.go:190
+#: lxc/info.go:199
 msgid "Packets received"
 msgstr ""
 
-#: lxc/info.go:191
+#: lxc/info.go:200
 msgid "Packets sent"
 msgstr ""
 
@@ -762,24 +789,24 @@ msgstr ""
 msgid "Path to an alternate server directory"
 msgstr ""
 
-#: lxc/main.go:202
+#: lxc/main.go:216
 msgid "Pause containers."
 msgstr ""
 
-#: lxc/main.go:35
+#: lxc/main.go:37
 msgid "Permission denied, are you in the lxd group?"
 msgstr ""
 
-#: lxc/info.go:108
+#: lxc/info.go:117
 #, c-format
 msgid "Pid: %d"
 msgstr ""
 
-#: lxc/network.go:379 lxc/profile.go:258 lxc/storage.go:536 lxc/storage.go:855
+#: lxc/network.go:419 lxc/profile.go:268 lxc/storage.go:577 lxc/storage.go:936
 msgid "Press enter to open the editor again"
 msgstr ""
 
-#: lxc/config.go:572 lxc/config.go:637 lxc/image.go:869
+#: lxc/config.go:648 lxc/config.go:713 lxc/image.go:1108
 msgid "Press enter to start the editor again"
 msgstr ""
 
@@ -795,143 +822,143 @@ msgstr ""
 msgid "Print verbose information"
 msgstr ""
 
-#: lxc/info.go:132
+#: lxc/info.go:141
 #, c-format
 msgid "Processes: %d"
 msgstr ""
 
-#: lxc/profile.go:314
+#: lxc/profile.go:344
 #, c-format
 msgid "Profile %s added to %s"
 msgstr ""
 
-#: lxc/profile.go:209
+#: lxc/profile.go:218
 #, c-format
 msgid "Profile %s created"
 msgstr ""
 
-#: lxc/profile.go:279
+#: lxc/profile.go:292
 #, c-format
 msgid "Profile %s deleted"
 msgstr ""
 
-#: lxc/profile.go:345
+#: lxc/profile.go:379
 #, c-format
 msgid "Profile %s removed from %s"
 msgstr ""
 
-#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:137 lxc/init.go:138
+#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:138 lxc/init.go:139
 msgid "Profile to apply to the new container"
 msgstr ""
 
-#: lxc/profile.go:295
+#: lxc/profile.go:321
 #, c-format
 msgid "Profiles %s applied to %s"
 msgstr ""
 
-#: lxc/info.go:106
+#: lxc/info.go:115
 #, c-format
 msgid "Profiles: %s"
 msgstr ""
 
-#: lxc/image.go:479
+#: lxc/image.go:565
 msgid "Properties:"
 msgstr ""
 
-#: lxc/remote.go:69
+#: lxc/remote.go:70
 msgid "Public image server"
 msgstr ""
 
-#: lxc/image.go:462
+#: lxc/image.go:548
 #, c-format
 msgid "Public: %s"
 msgstr ""
 
-#: lxc/file.go:65 lxc/file.go:66
+#: lxc/file.go:67 lxc/file.go:68
 msgid "Recursively push or pull files"
 msgstr ""
 
-#: lxc/image.go:413
+#: lxc/image.go:489
 #, fuzzy, c-format
 msgid "Refreshing the image: %s"
 msgstr "Копирование образа: %s"
 
-#: lxc/remote.go:67
+#: lxc/remote.go:68
 msgid "Remote admin password"
 msgstr ""
 
-#: lxc/info.go:93
+#: lxc/info.go:101
 #, c-format
 msgid "Remote: %s"
 msgstr ""
 
-#: lxc/delete.go:41
+#: lxc/delete.go:42
 #, c-format
 msgid "Remove %s (yes/no): "
 msgstr ""
 
-#: lxc/delete.go:35 lxc/delete.go:36
+#: lxc/delete.go:36 lxc/delete.go:37
 msgid "Require user confirmation"
 msgstr ""
 
-#: lxc/info.go:129
+#: lxc/info.go:138
 msgid "Resources:"
 msgstr ""
 
-#: lxc/main.go:210
+#: lxc/main.go:224
 msgid "Restart containers."
 msgstr ""
 
-#: lxc/init.go:253
+#: lxc/init.go:286
 #, c-format
 msgid "Retrieving image: %s"
 msgstr ""
 
-#: lxc/image.go:229
+#: lxc/image.go:232
 msgid "SIZE"
 msgstr ""
 
-#: lxc/list.go:463
+#: lxc/list.go:468
 msgid "SNAPSHOTS"
 msgstr ""
 
-#: lxc/storage.go:610
+#: lxc/storage.go:656
 msgid "SOURCE"
 msgstr ""
 
-#: lxc/list.go:464
+#: lxc/list.go:469
 msgid "STATE"
 msgstr ""
 
-#: lxc/remote.go:399
+#: lxc/remote.go:410
 msgid "STATIC"
 msgstr ""
 
-#: lxc/list.go:466
+#: lxc/list.go:471
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/remote.go:240
+#: lxc/remote.go:236
 msgid "Server certificate NACKed by user"
 msgstr ""
 
-#: lxc/remote.go:302
+#: lxc/remote.go:313
 msgid "Server doesn't trust us after adding our cert"
 msgstr ""
 
-#: lxc/remote.go:68
+#: lxc/remote.go:69
 msgid "Server protocol (lxd or simplestreams)"
 msgstr ""
 
-#: lxc/file.go:63
+#: lxc/file.go:65
 msgid "Set the file's gid on push"
 msgstr ""
 
-#: lxc/file.go:64
+#: lxc/file.go:66
 msgid "Set the file's perms on push"
 msgstr ""
 
-#: lxc/file.go:62
+#: lxc/file.go:64
 msgid "Set the file's uid on push"
 msgstr ""
 
@@ -943,78 +970,83 @@ msgstr ""
 msgid "Show client version"
 msgstr ""
 
-#: lxc/info.go:38
+#: lxc/info.go:39
 msgid "Show the container's last 100 log lines?"
 msgstr ""
 
-#: lxc/config.go:33
+#: lxc/config.go:35
 msgid "Show the expanded configuration"
 msgstr ""
 
-#: lxc/image.go:460
+#: lxc/image.go:546
 #, c-format
 msgid "Size: %.2fMB"
 msgstr ""
 
-#: lxc/info.go:210
+#: lxc/info.go:219
 msgid "Snapshots:"
 msgstr ""
 
-#: lxc/action.go:134
+#: lxc/action.go:142
 #, fuzzy, c-format
 msgid "Some containers failed to %s"
 msgstr "Невозможно добавить имя контейнера в список"
 
-#: lxc/image.go:493
+#: lxc/image.go:579
 msgid "Source:"
 msgstr ""
 
-#: lxc/main.go:220
+#: lxc/main.go:234
 msgid "Start containers."
 msgstr ""
 
-#: lxc/launch.go:152
+#: lxc/launch.go:59
 #, c-format
 msgid "Starting %s"
 msgstr ""
 
-#: lxc/info.go:100
+#: lxc/info.go:109
 #, c-format
 msgid "Status: %s"
 msgstr ""
 
-#: lxc/main.go:226
+#: lxc/main.go:240
 msgid "Stop containers."
 msgstr ""
 
-#: lxc/publish.go:36 lxc/publish.go:37
+#: lxc/publish.go:37 lxc/publish.go:38
 msgid "Stop the container if currently running"
 msgstr ""
 
-#: lxc/delete.go:105 lxc/publish.go:114
+#: lxc/publish.go:136
 msgid "Stopping container failed!"
 msgstr ""
 
-#: lxc/storage.go:436
+#: lxc/delete.go:121
+#, fuzzy, c-format
+msgid "Stopping the container failed: %s"
+msgstr "Невозможно добавить имя контейнера в список"
+
+#: lxc/storage.go:468
 #, c-format
 msgid "Storage pool %s created"
 msgstr ""
 
-#: lxc/storage.go:486
+#: lxc/storage.go:527
 #, c-format
 msgid "Storage pool %s deleted"
 msgstr ""
 
-#: lxc/init.go:143 lxc/init.go:144
+#: lxc/init.go:144 lxc/init.go:145
 msgid "Storage pool name"
 msgstr ""
 
-#: lxc/storage.go:720
+#: lxc/storage.go:782
 #, c-format
 msgid "Storage volume %s created"
 msgstr ""
 
-#: lxc/storage.go:730
+#: lxc/storage.go:797
 #, c-format
 msgid "Storage volume %s deleted"
 msgstr ""
@@ -1023,38 +1055,42 @@ msgstr ""
 msgid "Store the container state (only for stop)"
 msgstr ""
 
-#: lxc/info.go:171
+#: lxc/info.go:180
 msgid "Swap (current)"
 msgstr ""
 
-#: lxc/info.go:175
+#: lxc/info.go:184
 msgid "Swap (peak)"
 msgstr ""
 
-#: lxc/list.go:465 lxc/network.go:459 lxc/storage.go:695
+#: lxc/list.go:470 lxc/network.go:505 lxc/storage.go:747
 msgid "TYPE"
 msgstr ""
 
-#: lxc/delete.go:91
+#: lxc/delete.go:105
 msgid "The container is currently running, stop it first or pass --force."
 msgstr ""
 
-#: lxc/publish.go:92
+#: lxc/publish.go:101
 msgid ""
 "The container is currently running. Use --force to have it stopped and "
 "restarted."
 msgstr ""
 
-#: lxc/init.go:326
+#: lxc/init.go:358
 msgid "The container you are starting doesn't have any network attached to it."
 msgstr ""
 
-#: lxc/config.go:716 lxc/config.go:728 lxc/config.go:761 lxc/config.go:779
-#: lxc/config.go:817 lxc/config.go:835
+#: lxc/config.go:770 lxc/config.go:787
+msgid "The device already exists"
+msgstr ""
+
+#: lxc/config.go:833 lxc/config.go:845 lxc/config.go:881 lxc/config.go:899
+#: lxc/config.go:945 lxc/config.go:962 lxc/config.go:1006 lxc/config.go:1022
 msgid "The device doesn't exist"
 msgstr ""
 
-#: lxc/init.go:310
+#: lxc/init.go:342
 #, c-format
 msgid "The local image '%s' couldn't be found, trying '%s:' instead."
 msgstr ""
@@ -1063,15 +1099,15 @@ msgstr ""
 msgid "The opposite of \"lxc pause\" is \"lxc start\"."
 msgstr ""
 
-#: lxc/network.go:262 lxc/network.go:311 lxc/storage.go:376 lxc/storage.go:476
+#: lxc/network.go:290 lxc/network.go:343 lxc/storage.go:388 lxc/storage.go:508
 msgid "The specified device doesn't exist"
 msgstr ""
 
-#: lxc/network.go:266 lxc/network.go:315
+#: lxc/network.go:294 lxc/network.go:347
 msgid "The specified device doesn't match the network"
 msgstr ""
 
-#: lxc/publish.go:65
+#: lxc/publish.go:74
 msgid "There is no \"image name\".  Did you want an alias?"
 msgstr ""
 
@@ -1087,49 +1123,49 @@ msgstr ""
 msgid "Time to wait for the container before killing it"
 msgstr ""
 
-#: lxc/image.go:463
+#: lxc/image.go:549
 msgid "Timestamps:"
 msgstr ""
 
-#: lxc/init.go:328
+#: lxc/init.go:360
 msgid "To attach a network to a container, use: lxc network attach"
 msgstr ""
 
-#: lxc/init.go:327
+#: lxc/init.go:359
 msgid "To create a new network, use: lxc network create"
 msgstr ""
 
-#: lxc/main.go:140
+#: lxc/main.go:154
 msgid "To start your first container, try: lxc launch ubuntu:16.04"
 msgstr ""
 
-#: lxc/image.go:551
+#: lxc/image.go:657
 #, c-format
 msgid "Transferring image: %s"
 msgstr ""
 
-#: lxc/action.go:98 lxc/launch.go:165
+#: lxc/action.go:106 lxc/launch.go:77
 #, c-format
 msgid "Try `lxc info --show-log %s` for more info"
 msgstr ""
 
-#: lxc/info.go:102
+#: lxc/info.go:111
 msgid "Type: ephemeral"
 msgstr ""
 
-#: lxc/info.go:104
+#: lxc/info.go:113
 msgid "Type: persistent"
 msgstr ""
 
-#: lxc/image.go:230
+#: lxc/image.go:233
 msgid "UPLOAD DATE"
 msgstr ""
 
-#: lxc/remote.go:396
+#: lxc/remote.go:407
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:462 lxc/profile.go:500 lxc/storage.go:611 lxc/storage.go:698
+#: lxc/network.go:508 lxc/profile.go:556 lxc/storage.go:657 lxc/storage.go:750
 msgid "USED BY"
 msgstr ""
 
@@ -1137,11 +1173,16 @@ msgstr ""
 msgid "Unable to find help2man."
 msgstr ""
 
-#: lxc/remote.go:110
+#: lxc/remote.go:111
 msgid "Unable to read remote TLS certificate"
 msgstr ""
 
-#: lxc/image.go:468
+#: lxc/file.go:108
+#, c-format
+msgid "Unknown file type '%s'"
+msgstr ""
+
+#: lxc/image.go:554
 #, c-format
 msgid "Uploaded: %s"
 msgstr ""
@@ -1161,7 +1202,7 @@ msgstr ""
 msgid "Usage: lxc <command> [options]"
 msgstr ""
 
-#: lxc/config.go:58
+#: lxc/config.go:60
 msgid ""
 "Usage: lxc config <subcommand> [options]\n"
 "\n"
@@ -1252,7 +1293,7 @@ msgstr ""
 "lxc copy [<remote>:]<source>[/<snapshot>] [[<remote>:]<destination>] [--"
 "ephemeral|e] [--profile|-p <profile>...] [--config|-c <key=value>...]"
 
-#: lxc/delete.go:26
+#: lxc/delete.go:27
 msgid ""
 "Usage: lxc delete [<remote>:]<container>[/<snapshot>] "
 "[[<remote>:]<container>[/<snapshot>]...]\n"
@@ -1260,7 +1301,7 @@ msgid ""
 "Delete containers and snapshots."
 msgstr ""
 
-#: lxc/exec.go:52
+#: lxc/exec.go:53
 msgid ""
 "Usage: lxc exec [<remote>:]<container> [-t] [-T] [-n] [--mode=auto|"
 "interactive|non-interactive] [--env KEY=VALUE...] [--] <command line>\n"
@@ -1271,7 +1312,7 @@ msgid ""
 "AND stdout are terminals (stderr is ignored)."
 msgstr ""
 
-#: lxc/file.go:36
+#: lxc/file.go:38
 msgid ""
 "Usage: lxc file <subcommand> [options]\n"
 "\n"
@@ -1315,7 +1356,7 @@ msgid ""
 "Help page for the LXD client."
 msgstr ""
 
-#: lxc/image.go:69
+#: lxc/image.go:72
 msgid ""
 "Usage: lxc image <subcommand> [options]\n"
 "\n"
@@ -1420,7 +1461,7 @@ msgid ""
 "image alias name."
 msgstr ""
 
-#: lxc/info.go:25
+#: lxc/info.go:26
 msgid ""
 "Usage: lxc info [<remote>:][<container>] [--show-log]\n"
 "\n"
@@ -1433,7 +1474,7 @@ msgid ""
 "    For LXD server information."
 msgstr ""
 
-#: lxc/init.go:75
+#: lxc/init.go:76
 msgid ""
 "Usage: lxc init [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--"
 "profile|-p <profile>...] [--config|-c <key=value>...] [--network|-n "
@@ -1448,7 +1489,7 @@ msgid ""
 "    lxc init ubuntu:16.04 u1"
 msgstr ""
 
-#: lxc/launch.go:23
+#: lxc/launch.go:20
 msgid ""
 "Usage: lxc launch [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--"
 "profile|-p <profile>...] [--config|-c <key=value>...] [--network|-n "
@@ -1577,7 +1618,7 @@ msgid ""
 "    Only show log message."
 msgstr ""
 
-#: lxc/move.go:19
+#: lxc/move.go:22
 msgid ""
 "Usage: lxc move [<remote>:]<container>[/<snapshot>] [<remote>:][<container>[/"
 "<snapshot>]] [--container-only]\n"
@@ -1596,7 +1637,7 @@ msgid ""
 "    Rename a snapshot."
 msgstr ""
 
-#: lxc/network.go:49
+#: lxc/network.go:50
 msgid ""
 "Usage: lxc network <subcommand> [options]\n"
 "\n"
@@ -1649,7 +1690,7 @@ msgid ""
 "    Update a network using the content of network.yaml"
 msgstr ""
 
-#: lxc/profile.go:49
+#: lxc/profile.go:51
 msgid ""
 "Usage: lxc profile <subcommand> [options]\n"
 "\n"
@@ -1731,7 +1772,7 @@ msgid ""
 "    Remove all profile from \"foo\""
 msgstr ""
 
-#: lxc/publish.go:27
+#: lxc/publish.go:28
 msgid ""
 "Usage: lxc publish [<remote>:]<container>[/<snapshot>] [<remote>:] [--"
 "alias=ALIAS...] [prop-key=prop-value...]\n"
@@ -1739,7 +1780,7 @@ msgid ""
 "Publish containers as images."
 msgstr ""
 
-#: lxc/remote.go:38
+#: lxc/remote.go:39
 msgid ""
 "Usage: lxc remote <subcommand> [options]\n"
 "\n"
@@ -1768,7 +1809,7 @@ msgid ""
 "    Print the default remote."
 msgstr ""
 
-#: lxc/restore.go:21
+#: lxc/restore.go:22
 msgid ""
 "Usage: lxc restore [<remote>:]<container> <snapshot> [--stateful]\n"
 "\n"
@@ -1784,7 +1825,7 @@ msgid ""
 "    Restore the snapshot."
 msgstr ""
 
-#: lxc/snapshot.go:21
+#: lxc/snapshot.go:22
 msgid ""
 "Usage: lxc snapshot [<remote>:]<container> <snapshot name> [--stateful]\n"
 "\n"
@@ -1798,7 +1839,7 @@ msgid ""
 "    Create a snapshot of \"u1\" called \"snap0\"."
 msgstr ""
 
-#: lxc/storage.go:61
+#: lxc/storage.go:62
 msgid ""
 "Usage: lxc storage <subcommand> [options]\n"
 "\n"
@@ -1898,161 +1939,132 @@ msgid ""
 "Print the version number of this client tool."
 msgstr ""
 
-#: lxc/delete.go:45
+#: lxc/delete.go:46
 msgid "User aborted delete operation."
 msgstr ""
 
-#: lxc/restore.go:37
+#: lxc/restore.go:38
 msgid ""
 "Whether or not to restore the container's running state from snapshot (if "
 "available)"
 msgstr ""
 
-#: lxc/snapshot.go:35
+#: lxc/snapshot.go:36
 msgid "Whether or not to snapshot the container's running state"
 msgstr ""
 
-#: lxc/network.go:446 lxc/remote.go:371 lxc/remote.go:376
+#: lxc/network.go:492 lxc/remote.go:382 lxc/remote.go:387
 msgid "YES"
 msgstr ""
 
-#: lxc/exec.go:125
+#: lxc/exec.go:126
 msgid "You can't pass -t and -T at the same time"
 msgstr ""
 
-#: lxc/exec.go:129
+#: lxc/exec.go:130
 msgid "You can't pass -t or -T at the same time as --mode"
 msgstr ""
 
-#: lxc/main.go:56
-msgid "`lxc config profile` is deprecated, please use `lxc profile`"
-msgstr ""
-
-#: lxc/launch.go:134
-msgid "bad number of things scanned from image, container or snapshot"
-msgstr ""
-
-#: lxc/action.go:94
-msgid "bad result type from action"
+#: lxc/copy.go:57
+msgid "You must specify a source container name"
 msgstr ""
 
-#: lxc/copy.go:118
-msgid "can't copy to the same container name"
-msgstr ""
-
-#: lxc/file.go:314
-msgid "can't pull a directory without --recursive"
+#: lxc/main.go:58
+msgid "`lxc config profile` is deprecated, please use `lxc profile`"
 msgstr ""
 
-#: lxc/remote.go:359
+#: lxc/remote.go:370
 msgid "can't remove the default remote"
 msgstr ""
 
-#: lxc/file.go:125
+#: lxc/file.go:269
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr ""
 
-#: lxc/remote.go:385
+#: lxc/remote.go:396
 msgid "default"
 msgstr ""
 
-#: lxc/copy.go:134 lxc/copy.go:139 lxc/copy.go:258 lxc/copy.go:263
-#: lxc/init.go:234 lxc/init.go:239 lxc/launch.go:115 lxc/launch.go:121
+#: lxc/init.go:308
 msgid "didn't get any affected image, container or snapshot from server"
 msgstr ""
 
-#: lxc/image.go:454
+#: lxc/image.go:540
 msgid "disabled"
 msgstr ""
 
-#: lxc/image.go:456
+#: lxc/image.go:542
 msgid "enabled"
 msgstr ""
 
-#: lxc/action.go:126 lxc/main.go:26 lxc/main.go:159
+#: lxc/action.go:134 lxc/main.go:28 lxc/main.go:173
 #, c-format
 msgid "error: %v"
 msgstr ""
 
-#: lxc/help.go:37 lxc/main.go:106
+#: lxc/help.go:37 lxc/main.go:114
 #, c-format
 msgid "error: unknown command: %s"
 msgstr ""
 
-#: lxc/launch.go:139
-msgid "got bad version"
-msgstr ""
-
-#: lxc/image.go:202 lxc/image.go:449
+#: lxc/image.go:205 lxc/image.go:535
 msgid "no"
 msgstr ""
 
-#: lxc/copy.go:167
-msgid "not all the profiles from the source exist on the target"
-msgstr ""
-
-#: lxc/remote.go:233
+#: lxc/remote.go:229
 msgid "ok (y/n)?"
 msgstr ""
 
-#: lxc/main.go:331 lxc/main.go:335
+#: lxc/main.go:345 lxc/main.go:349
 #, c-format
 msgid "processing aliases failed %s\n"
 msgstr ""
 
-#: lxc/file.go:381
+#: lxc/file.go:541
 msgid "recursive edit doesn't make sense :("
 msgstr ""
 
-#: lxc/remote.go:421
+#: lxc/remote.go:432
 #, c-format
 msgid "remote %s already exists"
 msgstr ""
 
-#: lxc/remote.go:351 lxc/remote.go:413 lxc/remote.go:448 lxc/remote.go:464
+#: lxc/remote.go:362 lxc/remote.go:424 lxc/remote.go:459 lxc/remote.go:475
 #, c-format
 msgid "remote %s doesn't exist"
 msgstr ""
 
-#: lxc/remote.go:334
+#: lxc/remote.go:345
 #, c-format
 msgid "remote %s exists as <%s>"
 msgstr ""
 
-#: lxc/remote.go:355 lxc/remote.go:417 lxc/remote.go:452
+#: lxc/remote.go:366 lxc/remote.go:428 lxc/remote.go:463
 #, c-format
 msgid "remote %s is static and cannot be modified"
 msgstr ""
 
-#: lxc/info.go:221
+#: lxc/info.go:230
 msgid "stateful"
 msgstr ""
 
-#: lxc/info.go:223
+#: lxc/info.go:232
 msgid "stateless"
 msgstr ""
 
-#: lxc/info.go:217
+#: lxc/info.go:226
 #, c-format
 msgid "taken at %s"
 msgstr ""
 
-#: lxc/exec.go:214
-msgid "unreachable return reached"
-msgstr ""
-
-#: lxc/main.go:262
+#: lxc/main.go:276
 msgid "wrong number of subcommand arguments"
 msgstr ""
 
-#: lxc/delete.go:44 lxc/image.go:200 lxc/image.go:451
+#: lxc/delete.go:45 lxc/image.go:203 lxc/image.go:537
 msgid "yes"
 msgstr ""
 
-#: lxc/copy.go:47
-msgid "you must specify a source container name"
-msgstr ""
-
 #~ msgid "Could not sanitize path %s"
 #~ msgstr "Не удалось очистить путь %s"
 
diff --git a/po/sr.po b/po/sr.po
index 5a46ea635..3b5a33e71 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-06-13 20:10+0200\n"
+"POT-Creation-Date: 2017-06-17 03:18+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -16,7 +16,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: lxc/storage.go:30
+#: lxc/storage.go:31
 msgid ""
 "### This is a yaml representation of a storage pool.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -33,7 +33,7 @@ msgid ""
 "###   zfs.pool_name: default"
 msgstr ""
 
-#: lxc/storage.go:47
+#: lxc/storage.go:48
 msgid ""
 "### This is a yaml representation of a storage volume.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -47,7 +47,7 @@ msgid ""
 "###   size: \"61203283968\""
 msgstr ""
 
-#: lxc/config.go:37
+#: lxc/config.go:39
 msgid ""
 "### This is a yaml representation of the configuration.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -68,7 +68,7 @@ msgid ""
 "### Note that the name is shown but cannot be changed"
 msgstr ""
 
-#: lxc/image.go:59
+#: lxc/image.go:62
 msgid ""
 "### This is a yaml representation of the image properties.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -78,7 +78,7 @@ msgid ""
 "###  description: My custom image"
 msgstr ""
 
-#: lxc/network.go:29
+#: lxc/network.go:30
 msgid ""
 "### This is a yaml representation of the network.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -98,7 +98,7 @@ msgid ""
 "### Note that only the configuration can be changed."
 msgstr ""
 
-#: lxc/profile.go:28
+#: lxc/profile.go:30
 msgid ""
 "### This is a yaml representation of the profile.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -119,106 +119,130 @@ msgid ""
 "### Note that the name is shown but cannot be changed"
 msgstr ""
 
-#: lxc/image.go:179
+#: lxc/image.go:182
 #, c-format
 msgid "%s (%d more)"
 msgstr ""
 
-#: lxc/snapshot.go:58
+#: lxc/file.go:183
+#, c-format
+msgid "%s is not a directory"
+msgstr ""
+
+#: lxc/file.go:125
+#, c-format
+msgid "'%s' isn't a regular file or directory."
+msgstr ""
+
+#: lxc/snapshot.go:53
 msgid "'/' not allowed in snapshot name"
 msgstr ""
 
-#: lxc/profile.go:293
+#: lxc/profile.go:319
 msgid "(none)"
 msgstr ""
 
-#: lxc/image.go:223 lxc/image.go:814
+#: lxc/image.go:226 lxc/image.go:1052
 msgid "ALIAS"
 msgstr ""
 
-#: lxc/image.go:224
+#: lxc/image.go:227
 msgid "ALIASES"
 msgstr ""
 
-#: lxc/image.go:228
+#: lxc/image.go:231
 msgid "ARCH"
 msgstr ""
 
-#: lxc/list.go:456
+#: lxc/list.go:461
 msgid "ARCHITECTURE"
 msgstr ""
 
-#: lxc/remote.go:66
+#: lxc/remote.go:67
 msgid "Accept certificate"
 msgstr ""
 
-#: lxc/remote.go:282
+#: lxc/remote.go:281
 #, c-format
 msgid "Admin password for %s: "
 msgstr ""
 
-#: lxc/image.go:483
+#: lxc/image.go:569
 msgid "Aliases:"
 msgstr ""
 
-#: lxc/image.go:461 lxc/info.go:95
+#: lxc/image.go:547 lxc/info.go:104
 #, c-format
 msgid "Architecture: %s"
 msgstr ""
 
-#: lxc/image.go:491
+#: lxc/image.go:577
 #, c-format
 msgid "Auto update: %s"
 msgstr ""
 
-#: lxc/info.go:188
+#: lxc/image.go:651
+#, c-format
+msgid "Bad property: %s"
+msgstr ""
+
+#: lxc/info.go:197
 msgid "Bytes received"
 msgstr ""
 
-#: lxc/info.go:189
+#: lxc/info.go:198
 msgid "Bytes sent"
 msgstr ""
 
-#: lxc/config.go:310
+#: lxc/config.go:349
 msgid "COMMON NAME"
 msgstr ""
 
-#: lxc/info.go:152
+#: lxc/info.go:161
 msgid "CPU usage (in seconds)"
 msgstr ""
 
-#: lxc/info.go:156
+#: lxc/info.go:165
 msgid "CPU usage:"
 msgstr ""
 
-#: lxc/list.go:457
+#: lxc/list.go:462
 msgid "CREATED AT"
 msgstr ""
 
-#: lxc/config.go:150 lxc/network.go:496
+#: lxc/file.go:470
+msgid "Can't pull a directory without --recursive"
+msgstr ""
+
+#: lxc/config.go:156 lxc/network.go:542
 #, c-format
 msgid "Can't read from stdin: %s"
 msgstr ""
 
-#: lxc/config.go:163 lxc/config.go:196 lxc/config.go:218
+#: lxc/config.go:169
+#, c-format
+msgid "Can't unset key '%s', it's not currently set"
+msgstr ""
+
+#: lxc/config.go:211 lxc/config.go:237
 #, c-format
 msgid "Can't unset key '%s', it's not currently set."
 msgstr ""
 
-#: lxc/network.go:422 lxc/profile.go:472 lxc/storage.go:579
+#: lxc/network.go:468 lxc/profile.go:528 lxc/storage.go:625
 msgid "Cannot provide container name to list"
 msgstr ""
 
-#: lxc/remote.go:232
+#: lxc/remote.go:228
 #, c-format
 msgid "Certificate fingerprint: %s"
 msgstr ""
 
-#: lxc/remote.go:305
+#: lxc/remote.go:316
 msgid "Client certificate stored at server: "
 msgstr ""
 
-#: lxc/image.go:167 lxc/image.go:168 lxc/list.go:128 lxc/list.go:129
+#: lxc/image.go:170 lxc/image.go:171 lxc/list.go:128 lxc/list.go:129
 msgid "Columns"
 msgstr ""
 
@@ -226,35 +250,35 @@ msgstr ""
 msgid "Commands:"
 msgstr ""
 
-#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:135 lxc/init.go:136
+#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:136 lxc/init.go:137
 msgid "Config key/value to apply to the new container"
 msgstr ""
 
-#: lxc/config.go:571 lxc/config.go:636 lxc/image.go:868 lxc/network.go:378
-#: lxc/profile.go:257 lxc/storage.go:535 lxc/storage.go:854
+#: lxc/config.go:647 lxc/config.go:712 lxc/image.go:1107 lxc/network.go:418
+#: lxc/profile.go:267 lxc/storage.go:576 lxc/storage.go:935
 #, c-format
 msgid "Config parsing error: %s"
 msgstr ""
 
-#: lxc/main.go:33
+#: lxc/main.go:35
 msgid "Connection refused; is LXD running?"
 msgstr ""
 
-#: lxc/publish.go:62
+#: lxc/publish.go:71
 msgid "Container name is mandatory"
 msgstr ""
 
-#: lxc/copy.go:143 lxc/copy.go:267 lxc/init.go:244
+#: lxc/copy.go:210 lxc/init.go:313
 #, c-format
 msgid "Container name is: %s"
 msgstr ""
 
-#: lxc/publish.go:160 lxc/publish.go:175
+#: lxc/publish.go:250
 #, c-format
 msgid "Container published with fingerprint: %s"
 msgstr ""
 
-#: lxc/image.go:170
+#: lxc/image.go:173
 msgid "Copy aliases from source"
 msgstr ""
 
@@ -262,85 +286,90 @@ msgstr ""
 msgid "Copy the container without its snapshots"
 msgstr ""
 
-#: lxc/image.go:360
+#: lxc/image.go:422
 #, c-format
 msgid "Copying the image: %s"
 msgstr ""
 
-#: lxc/remote.go:247
+#: lxc/remote.go:243
 msgid "Could not create server cert dir"
 msgstr ""
 
-#: lxc/file.go:67 lxc/file.go:68
+#: lxc/file.go:69 lxc/file.go:70
 msgid "Create any directories necessary"
 msgstr ""
 
-#: lxc/image.go:466 lxc/info.go:97
+#: lxc/image.go:552 lxc/info.go:106
 #, c-format
 msgid "Created: %s"
 msgstr ""
 
-#: lxc/init.go:182 lxc/launch.go:142
+#: lxc/init.go:194
 #, c-format
 msgid "Creating %s"
 msgstr ""
 
-#: lxc/init.go:180
+#: lxc/init.go:192
 msgid "Creating the container"
 msgstr ""
 
-#: lxc/image.go:227 lxc/image.go:816 lxc/list.go:458 lxc/network.go:461
-#: lxc/storage.go:608 lxc/storage.go:697
+#: lxc/image.go:230 lxc/image.go:1054 lxc/list.go:463 lxc/network.go:507
+#: lxc/storage.go:654 lxc/storage.go:749
 msgid "DESCRIPTION"
 msgstr ""
 
-#: lxc/storage.go:609
+#: lxc/storage.go:655
 msgid "DRIVER"
 msgstr ""
 
-#: lxc/publish.go:38
+#: lxc/publish.go:39
 msgid "Define a compression algorithm: for image or none"
 msgstr ""
 
-#: lxc/config.go:688
+#: lxc/config.go:803
 #, c-format
 msgid "Device %s added to %s"
 msgstr ""
 
-#: lxc/config.go:875
+#: lxc/config.go:1037
 #, c-format
 msgid "Device %s removed from %s"
 msgstr ""
 
-#: lxc/exec.go:64
-msgid "Disable pseudo-terminal allocation"
+#: lxc/utils.go:248 lxc/utils.go:272
+#, c-format
+msgid "Device already exists: %s"
 msgstr ""
 
 #: lxc/exec.go:65
+msgid "Disable pseudo-terminal allocation"
+msgstr ""
+
+#: lxc/exec.go:66
 msgid "Disable stdin (reads from /dev/null)"
 msgstr ""
 
-#: lxc/info.go:145
+#: lxc/info.go:154
 msgid "Disk usage:"
 msgstr ""
 
-#: lxc/list.go:609
+#: lxc/list.go:614
 msgid "EPHEMERAL"
 msgstr ""
 
-#: lxc/config.go:312
+#: lxc/config.go:351
 msgid "EXPIRY DATE"
 msgstr ""
 
-#: lxc/main.go:45
+#: lxc/main.go:47
 msgid "Enable debug mode"
 msgstr ""
 
-#: lxc/main.go:44
+#: lxc/main.go:46
 msgid "Enable verbose mode"
 msgstr ""
 
-#: lxc/exec.go:61
+#: lxc/exec.go:62
 msgid "Environment variable to set (e.g. HOME=/home/foo)"
 msgstr ""
 
@@ -348,7 +377,7 @@ msgstr ""
 msgid "Environment:"
 msgstr ""
 
-#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:139 lxc/init.go:140
+#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:140 lxc/init.go:141
 msgid "Ephemeral container"
 msgstr ""
 
@@ -356,16 +385,21 @@ msgstr ""
 msgid "Event type to listen for"
 msgstr ""
 
-#: lxc/image.go:470
+#: lxc/image.go:556
 #, c-format
 msgid "Expires: %s"
 msgstr ""
 
-#: lxc/image.go:472
+#: lxc/image.go:558
 msgid "Expires: never"
 msgstr ""
 
-#: lxc/config.go:309 lxc/image.go:225 lxc/image.go:815
+#: lxc/image.go:848
+#, c-format
+msgid "Exporting the image: %s"
+msgstr ""
+
+#: lxc/config.go:348 lxc/image.go:228 lxc/image.go:1053
 msgid "FINGERPRINT"
 msgstr ""
 
@@ -379,16 +413,25 @@ msgstr ""
 msgid "Failed to generate 'lxc.1': %v"
 msgstr ""
 
+#: lxc/copy.go:205
+msgid "Failed to get the new container name"
+msgstr ""
+
+#: lxc/file.go:120
+#, c-format
+msgid "Failed to walk path for %s: %s"
+msgstr ""
+
 #: lxc/list.go:131
 msgid "Fast mode (same as --columns=nsacPt)"
 msgstr ""
 
-#: lxc/image.go:459
+#: lxc/image.go:545
 #, c-format
 msgid "Fingerprint: %s"
 msgstr ""
 
-#: lxc/exec.go:63
+#: lxc/exec.go:64
 msgid "Force pseudo-terminal allocation"
 msgstr ""
 
@@ -396,39 +439,39 @@ msgstr ""
 msgid "Force the container to shutdown"
 msgstr ""
 
-#: lxc/delete.go:33 lxc/delete.go:34
+#: lxc/delete.go:34 lxc/delete.go:35
 msgid "Force the removal of stopped containers"
 msgstr ""
 
-#: lxc/main.go:46
+#: lxc/main.go:48
 msgid "Force using the local unix socket"
 msgstr ""
 
-#: lxc/image.go:173 lxc/list.go:130
+#: lxc/image.go:176 lxc/list.go:130
 msgid "Format (csv|json|table|yaml)"
 msgstr ""
 
-#: lxc/remote.go:80
+#: lxc/remote.go:81
 msgid "Generating a client certificate. This may take a minute..."
 msgstr ""
 
-#: lxc/list.go:454
+#: lxc/list.go:459
 msgid "IPV4"
 msgstr ""
 
-#: lxc/list.go:455
+#: lxc/list.go:460
 msgid "IPV6"
 msgstr ""
 
-#: lxc/config.go:311
+#: lxc/config.go:350
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:139
+#: lxc/main.go:153
 msgid "If this is your first time using LXD, you should also run: lxd init"
 msgstr ""
 
-#: lxc/main.go:47
+#: lxc/main.go:49
 msgid "Ignore aliases when determining what command to run"
 msgstr ""
 
@@ -436,245 +479,229 @@ msgstr ""
 msgid "Ignore the container state (only for start)"
 msgstr ""
 
-#: lxc/image.go:422
+#: lxc/image.go:508
 msgid "Image already up to date."
 msgstr ""
 
-#: lxc/image.go:363
+#: lxc/image.go:436
 msgid "Image copied successfully!"
 msgstr ""
 
-#: lxc/image.go:546 lxc/image.go:558
+#: lxc/image.go:898
+msgid "Image exported successfully!"
+msgstr ""
+
+#: lxc/image.go:709
 #, c-format
 msgid "Image imported with fingerprint: %s"
 msgstr ""
 
-#: lxc/image.go:420
+#: lxc/image.go:506
 msgid "Image refreshed successfully!"
 msgstr ""
 
-#: lxc/image.go:543
-#, c-format
-msgid "Importing the image: %s"
-msgstr ""
-
-#: lxc/remote.go:150
+#: lxc/remote.go:151
 #, c-format
 msgid "Invalid URL scheme \"%s\" in \"%s\""
 msgstr ""
 
-#: lxc/config.go:290
+#: lxc/config.go:329
 msgid "Invalid certificate"
 msgstr ""
 
-#: lxc/init.go:30 lxc/init.go:35
+#: lxc/init.go:31 lxc/init.go:36
 msgid "Invalid configuration key"
 msgstr ""
 
-#: lxc/file.go:357
+#: lxc/file.go:513
 #, c-format
 msgid "Invalid path %s"
 msgstr ""
 
-#: lxc/file.go:291
+#: lxc/file.go:443
 #, c-format
 msgid "Invalid source %s"
 msgstr ""
 
-#: lxc/file.go:80
+#: lxc/file.go:221
 #, c-format
 msgid "Invalid target %s"
 msgstr ""
 
-#: lxc/info.go:126
+#: lxc/info.go:135
 msgid "Ips:"
 msgstr ""
 
-#: lxc/image.go:171
+#: lxc/image.go:174
 msgid "Keep the image up to date after initial copy"
 msgstr ""
 
-#: lxc/list.go:459
+#: lxc/list.go:464
 msgid "LAST USED AT"
 msgstr ""
 
-#: lxc/main.go:31
+#: lxc/main.go:33
 msgid "LXD socket not found; is LXD installed and running?"
 msgstr ""
 
-#: lxc/image.go:475
+#: lxc/image.go:561
 #, c-format
 msgid "Last used: %s"
 msgstr ""
 
-#: lxc/image.go:477
+#: lxc/image.go:563
 msgid "Last used: never"
 msgstr ""
 
-#: lxc/info.go:241
+#: lxc/info.go:250
 msgid "Log:"
 msgstr ""
 
-#: lxc/network.go:460
+#: lxc/network.go:506
 msgid "MANAGED"
 msgstr ""
 
-#: lxc/image.go:169
+#: lxc/image.go:172
 msgid "Make image public"
 msgstr ""
 
-#: lxc/publish.go:34
+#: lxc/publish.go:35
 msgid "Make the image public"
 msgstr ""
 
-#: lxc/info.go:163
+#: lxc/info.go:172
 msgid "Memory (current)"
 msgstr ""
 
-#: lxc/info.go:167
+#: lxc/info.go:176
 msgid "Memory (peak)"
 msgstr ""
 
-#: lxc/info.go:179
+#: lxc/info.go:188
 msgid "Memory usage:"
 msgstr ""
 
-#: lxc/copy.go:276
-#, c-format
-msgid "Migration failed on source host: %s"
-msgstr ""
-
-#: lxc/copy.go:280
-#, c-format
-msgid "Migration failed on target host: %s"
-msgstr ""
-
-#: lxc/utils.go:201
+#: lxc/utils.go:199
 msgid "Missing summary."
 msgstr ""
 
-#: lxc/network.go:248 lxc/network.go:297 lxc/storage.go:362 lxc/storage.go:462
+#: lxc/network.go:276 lxc/network.go:329 lxc/storage.go:374 lxc/storage.go:494
 msgid "More than one device matches, specify the device name."
 msgstr ""
 
-#: lxc/file.go:279
+#: lxc/file.go:431
 msgid "More than one file to download, but target is not a directory"
 msgstr ""
 
-#: lxc/move.go:35
+#: lxc/move.go:38
 msgid "Move the container without its snapshots"
 msgstr ""
 
-#: lxc/action.go:68
+#: lxc/action.go:72
 msgid "Must supply container name for: "
 msgstr ""
 
-#: lxc/list.go:460 lxc/network.go:458 lxc/profile.go:499 lxc/remote.go:395
-#: lxc/storage.go:607 lxc/storage.go:696
+#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:406
+#: lxc/storage.go:653 lxc/storage.go:748
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:444 lxc/remote.go:369 lxc/remote.go:374
+#: lxc/network.go:490 lxc/remote.go:380 lxc/remote.go:385
 msgid "NO"
 msgstr ""
 
-#: lxc/info.go:91
+#: lxc/info.go:99
 #, c-format
 msgid "Name: %s"
 msgstr ""
 
-#: lxc/network.go:222
+#: lxc/network.go:250
 #, c-format
 msgid "Network %s created"
 msgstr ""
 
-#: lxc/network.go:325
+#: lxc/network.go:366
 #, c-format
 msgid "Network %s deleted"
 msgstr ""
 
-#: lxc/init.go:141 lxc/init.go:142
+#: lxc/init.go:142 lxc/init.go:143
 msgid "Network name"
 msgstr ""
 
-#: lxc/info.go:196
+#: lxc/info.go:205
 msgid "Network usage:"
 msgstr ""
 
-#: lxc/image.go:172 lxc/publish.go:35
+#: lxc/image.go:175 lxc/publish.go:36
 msgid "New alias to define at target"
 msgstr ""
 
-#: lxc/config.go:321
+#: lxc/config.go:360
 msgid "No certificate provided to add"
 msgstr ""
 
-#: lxc/network.go:257 lxc/network.go:306
+#: lxc/network.go:285 lxc/network.go:338
 msgid "No device found for this network"
 msgstr ""
 
-#: lxc/storage.go:371 lxc/storage.go:471
+#: lxc/storage.go:383 lxc/storage.go:503
 msgid "No device found for this storage volume."
 msgstr ""
 
-#: lxc/config.go:344
+#: lxc/config.go:392
 msgid "No fingerprint specified."
 msgstr ""
 
-#: lxc/storage.go:323 lxc/storage.go:407
+#: lxc/storage.go:327 lxc/storage.go:420
 msgid "Only \"custom\" volumes can be attached to containers."
 msgstr ""
 
-#: lxc/remote.go:135
+#: lxc/remote.go:136
 msgid "Only https URLs are supported for simplestreams"
 msgstr ""
 
-#: lxc/image.go:549
+#: lxc/image.go:632
 msgid "Only https:// is supported for remote image import."
 msgstr ""
 
-#: lxc/network.go:354 lxc/network.go:482
+#: lxc/network.go:394 lxc/network.go:528
 msgid "Only managed networks can be modified."
 msgstr ""
 
-#: lxc/help.go:71 lxc/main.go:112 lxc/main.go:163
+#: lxc/help.go:71 lxc/main.go:120 lxc/main.go:177
 msgid "Options:"
 msgstr ""
 
-#: lxc/image.go:664
-#, c-format
-msgid "Output is in %s"
-msgstr ""
-
-#: lxc/exec.go:62
+#: lxc/exec.go:63
 msgid "Override the terminal mode (auto, interactive or non-interactive)"
 msgstr ""
 
-#: lxc/list.go:611
+#: lxc/list.go:616
 msgid "PERSISTENT"
 msgstr ""
 
-#: lxc/list.go:461
+#: lxc/list.go:466
 msgid "PID"
 msgstr ""
 
-#: lxc/list.go:462
+#: lxc/list.go:467
 msgid "PROFILES"
 msgstr ""
 
-#: lxc/remote.go:397
+#: lxc/remote.go:408
 msgid "PROTOCOL"
 msgstr ""
 
-#: lxc/image.go:226 lxc/remote.go:398
+#: lxc/image.go:229 lxc/remote.go:409
 msgid "PUBLIC"
 msgstr ""
 
-#: lxc/info.go:190
+#: lxc/info.go:199
 msgid "Packets received"
 msgstr ""
 
-#: lxc/info.go:191
+#: lxc/info.go:200
 msgid "Packets sent"
 msgstr ""
 
@@ -686,24 +713,24 @@ msgstr ""
 msgid "Path to an alternate server directory"
 msgstr ""
 
-#: lxc/main.go:202
+#: lxc/main.go:216
 msgid "Pause containers."
 msgstr ""
 
-#: lxc/main.go:35
+#: lxc/main.go:37
 msgid "Permission denied, are you in the lxd group?"
 msgstr ""
 
-#: lxc/info.go:108
+#: lxc/info.go:117
 #, c-format
 msgid "Pid: %d"
 msgstr ""
 
-#: lxc/network.go:379 lxc/profile.go:258 lxc/storage.go:536 lxc/storage.go:855
+#: lxc/network.go:419 lxc/profile.go:268 lxc/storage.go:577 lxc/storage.go:936
 msgid "Press enter to open the editor again"
 msgstr ""
 
-#: lxc/config.go:572 lxc/config.go:637 lxc/image.go:869
+#: lxc/config.go:648 lxc/config.go:713 lxc/image.go:1108
 msgid "Press enter to start the editor again"
 msgstr ""
 
@@ -719,143 +746,143 @@ msgstr ""
 msgid "Print verbose information"
 msgstr ""
 
-#: lxc/info.go:132
+#: lxc/info.go:141
 #, c-format
 msgid "Processes: %d"
 msgstr ""
 
-#: lxc/profile.go:314
+#: lxc/profile.go:344
 #, c-format
 msgid "Profile %s added to %s"
 msgstr ""
 
-#: lxc/profile.go:209
+#: lxc/profile.go:218
 #, c-format
 msgid "Profile %s created"
 msgstr ""
 
-#: lxc/profile.go:279
+#: lxc/profile.go:292
 #, c-format
 msgid "Profile %s deleted"
 msgstr ""
 
-#: lxc/profile.go:345
+#: lxc/profile.go:379
 #, c-format
 msgid "Profile %s removed from %s"
 msgstr ""
 
-#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:137 lxc/init.go:138
+#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:138 lxc/init.go:139
 msgid "Profile to apply to the new container"
 msgstr ""
 
-#: lxc/profile.go:295
+#: lxc/profile.go:321
 #, c-format
 msgid "Profiles %s applied to %s"
 msgstr ""
 
-#: lxc/info.go:106
+#: lxc/info.go:115
 #, c-format
 msgid "Profiles: %s"
 msgstr ""
 
-#: lxc/image.go:479
+#: lxc/image.go:565
 msgid "Properties:"
 msgstr ""
 
-#: lxc/remote.go:69
+#: lxc/remote.go:70
 msgid "Public image server"
 msgstr ""
 
-#: lxc/image.go:462
+#: lxc/image.go:548
 #, c-format
 msgid "Public: %s"
 msgstr ""
 
-#: lxc/file.go:65 lxc/file.go:66
+#: lxc/file.go:67 lxc/file.go:68
 msgid "Recursively push or pull files"
 msgstr ""
 
-#: lxc/image.go:413
+#: lxc/image.go:489
 #, c-format
 msgid "Refreshing the image: %s"
 msgstr ""
 
-#: lxc/remote.go:67
+#: lxc/remote.go:68
 msgid "Remote admin password"
 msgstr ""
 
-#: lxc/info.go:93
+#: lxc/info.go:101
 #, c-format
 msgid "Remote: %s"
 msgstr ""
 
-#: lxc/delete.go:41
+#: lxc/delete.go:42
 #, c-format
 msgid "Remove %s (yes/no): "
 msgstr ""
 
-#: lxc/delete.go:35 lxc/delete.go:36
+#: lxc/delete.go:36 lxc/delete.go:37
 msgid "Require user confirmation"
 msgstr ""
 
-#: lxc/info.go:129
+#: lxc/info.go:138
 msgid "Resources:"
 msgstr ""
 
-#: lxc/main.go:210
+#: lxc/main.go:224
 msgid "Restart containers."
 msgstr ""
 
-#: lxc/init.go:253
+#: lxc/init.go:286
 #, c-format
 msgid "Retrieving image: %s"
 msgstr ""
 
-#: lxc/image.go:229
+#: lxc/image.go:232
 msgid "SIZE"
 msgstr ""
 
-#: lxc/list.go:463
+#: lxc/list.go:468
 msgid "SNAPSHOTS"
 msgstr ""
 
-#: lxc/storage.go:610
+#: lxc/storage.go:656
 msgid "SOURCE"
 msgstr ""
 
-#: lxc/list.go:464
+#: lxc/list.go:469
 msgid "STATE"
 msgstr ""
 
-#: lxc/remote.go:399
+#: lxc/remote.go:410
 msgid "STATIC"
 msgstr ""
 
-#: lxc/list.go:466
+#: lxc/list.go:471
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/remote.go:240
+#: lxc/remote.go:236
 msgid "Server certificate NACKed by user"
 msgstr ""
 
-#: lxc/remote.go:302
+#: lxc/remote.go:313
 msgid "Server doesn't trust us after adding our cert"
 msgstr ""
 
-#: lxc/remote.go:68
+#: lxc/remote.go:69
 msgid "Server protocol (lxd or simplestreams)"
 msgstr ""
 
-#: lxc/file.go:63
+#: lxc/file.go:65
 msgid "Set the file's gid on push"
 msgstr ""
 
-#: lxc/file.go:64
+#: lxc/file.go:66
 msgid "Set the file's perms on push"
 msgstr ""
 
-#: lxc/file.go:62
+#: lxc/file.go:64
 msgid "Set the file's uid on push"
 msgstr ""
 
@@ -867,78 +894,83 @@ msgstr ""
 msgid "Show client version"
 msgstr ""
 
-#: lxc/info.go:38
+#: lxc/info.go:39
 msgid "Show the container's last 100 log lines?"
 msgstr ""
 
-#: lxc/config.go:33
+#: lxc/config.go:35
 msgid "Show the expanded configuration"
 msgstr ""
 
-#: lxc/image.go:460
+#: lxc/image.go:546
 #, c-format
 msgid "Size: %.2fMB"
 msgstr ""
 
-#: lxc/info.go:210
+#: lxc/info.go:219
 msgid "Snapshots:"
 msgstr ""
 
-#: lxc/action.go:134
+#: lxc/action.go:142
 #, c-format
 msgid "Some containers failed to %s"
 msgstr ""
 
-#: lxc/image.go:493
+#: lxc/image.go:579
 msgid "Source:"
 msgstr ""
 
-#: lxc/main.go:220
+#: lxc/main.go:234
 msgid "Start containers."
 msgstr ""
 
-#: lxc/launch.go:152
+#: lxc/launch.go:59
 #, c-format
 msgid "Starting %s"
 msgstr ""
 
-#: lxc/info.go:100
+#: lxc/info.go:109
 #, c-format
 msgid "Status: %s"
 msgstr ""
 
-#: lxc/main.go:226
+#: lxc/main.go:240
 msgid "Stop containers."
 msgstr ""
 
-#: lxc/publish.go:36 lxc/publish.go:37
+#: lxc/publish.go:37 lxc/publish.go:38
 msgid "Stop the container if currently running"
 msgstr ""
 
-#: lxc/delete.go:105 lxc/publish.go:114
+#: lxc/publish.go:136
 msgid "Stopping container failed!"
 msgstr ""
 
-#: lxc/storage.go:436
+#: lxc/delete.go:121
+#, c-format
+msgid "Stopping the container failed: %s"
+msgstr ""
+
+#: lxc/storage.go:468
 #, c-format
 msgid "Storage pool %s created"
 msgstr ""
 
-#: lxc/storage.go:486
+#: lxc/storage.go:527
 #, c-format
 msgid "Storage pool %s deleted"
 msgstr ""
 
-#: lxc/init.go:143 lxc/init.go:144
+#: lxc/init.go:144 lxc/init.go:145
 msgid "Storage pool name"
 msgstr ""
 
-#: lxc/storage.go:720
+#: lxc/storage.go:782
 #, c-format
 msgid "Storage volume %s created"
 msgstr ""
 
-#: lxc/storage.go:730
+#: lxc/storage.go:797
 #, c-format
 msgid "Storage volume %s deleted"
 msgstr ""
@@ -947,38 +979,42 @@ msgstr ""
 msgid "Store the container state (only for stop)"
 msgstr ""
 
-#: lxc/info.go:171
+#: lxc/info.go:180
 msgid "Swap (current)"
 msgstr ""
 
-#: lxc/info.go:175
+#: lxc/info.go:184
 msgid "Swap (peak)"
 msgstr ""
 
-#: lxc/list.go:465 lxc/network.go:459 lxc/storage.go:695
+#: lxc/list.go:470 lxc/network.go:505 lxc/storage.go:747
 msgid "TYPE"
 msgstr ""
 
-#: lxc/delete.go:91
+#: lxc/delete.go:105
 msgid "The container is currently running, stop it first or pass --force."
 msgstr ""
 
-#: lxc/publish.go:92
+#: lxc/publish.go:101
 msgid ""
 "The container is currently running. Use --force to have it stopped and "
 "restarted."
 msgstr ""
 
-#: lxc/init.go:326
+#: lxc/init.go:358
 msgid "The container you are starting doesn't have any network attached to it."
 msgstr ""
 
-#: lxc/config.go:716 lxc/config.go:728 lxc/config.go:761 lxc/config.go:779
-#: lxc/config.go:817 lxc/config.go:835
+#: lxc/config.go:770 lxc/config.go:787
+msgid "The device already exists"
+msgstr ""
+
+#: lxc/config.go:833 lxc/config.go:845 lxc/config.go:881 lxc/config.go:899
+#: lxc/config.go:945 lxc/config.go:962 lxc/config.go:1006 lxc/config.go:1022
 msgid "The device doesn't exist"
 msgstr ""
 
-#: lxc/init.go:310
+#: lxc/init.go:342
 #, c-format
 msgid "The local image '%s' couldn't be found, trying '%s:' instead."
 msgstr ""
@@ -987,15 +1023,15 @@ msgstr ""
 msgid "The opposite of \"lxc pause\" is \"lxc start\"."
 msgstr ""
 
-#: lxc/network.go:262 lxc/network.go:311 lxc/storage.go:376 lxc/storage.go:476
+#: lxc/network.go:290 lxc/network.go:343 lxc/storage.go:388 lxc/storage.go:508
 msgid "The specified device doesn't exist"
 msgstr ""
 
-#: lxc/network.go:266 lxc/network.go:315
+#: lxc/network.go:294 lxc/network.go:347
 msgid "The specified device doesn't match the network"
 msgstr ""
 
-#: lxc/publish.go:65
+#: lxc/publish.go:74
 msgid "There is no \"image name\".  Did you want an alias?"
 msgstr ""
 
@@ -1011,49 +1047,49 @@ msgstr ""
 msgid "Time to wait for the container before killing it"
 msgstr ""
 
-#: lxc/image.go:463
+#: lxc/image.go:549
 msgid "Timestamps:"
 msgstr ""
 
-#: lxc/init.go:328
+#: lxc/init.go:360
 msgid "To attach a network to a container, use: lxc network attach"
 msgstr ""
 
-#: lxc/init.go:327
+#: lxc/init.go:359
 msgid "To create a new network, use: lxc network create"
 msgstr ""
 
-#: lxc/main.go:140
+#: lxc/main.go:154
 msgid "To start your first container, try: lxc launch ubuntu:16.04"
 msgstr ""
 
-#: lxc/image.go:551
+#: lxc/image.go:657
 #, c-format
 msgid "Transferring image: %s"
 msgstr ""
 
-#: lxc/action.go:98 lxc/launch.go:165
+#: lxc/action.go:106 lxc/launch.go:77
 #, c-format
 msgid "Try `lxc info --show-log %s` for more info"
 msgstr ""
 
-#: lxc/info.go:102
+#: lxc/info.go:111
 msgid "Type: ephemeral"
 msgstr ""
 
-#: lxc/info.go:104
+#: lxc/info.go:113
 msgid "Type: persistent"
 msgstr ""
 
-#: lxc/image.go:230
+#: lxc/image.go:233
 msgid "UPLOAD DATE"
 msgstr ""
 
-#: lxc/remote.go:396
+#: lxc/remote.go:407
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:462 lxc/profile.go:500 lxc/storage.go:611 lxc/storage.go:698
+#: lxc/network.go:508 lxc/profile.go:556 lxc/storage.go:657 lxc/storage.go:750
 msgid "USED BY"
 msgstr ""
 
@@ -1061,11 +1097,16 @@ msgstr ""
 msgid "Unable to find help2man."
 msgstr ""
 
-#: lxc/remote.go:110
+#: lxc/remote.go:111
 msgid "Unable to read remote TLS certificate"
 msgstr ""
 
-#: lxc/image.go:468
+#: lxc/file.go:108
+#, c-format
+msgid "Unknown file type '%s'"
+msgstr ""
+
+#: lxc/image.go:554
 #, c-format
 msgid "Uploaded: %s"
 msgstr ""
@@ -1082,7 +1123,7 @@ msgstr ""
 msgid "Usage: lxc <command> [options]"
 msgstr ""
 
-#: lxc/config.go:58
+#: lxc/config.go:60
 msgid ""
 "Usage: lxc config <subcommand> [options]\n"
 "\n"
@@ -1168,7 +1209,7 @@ msgid ""
 "Copy containers within or in between LXD instances."
 msgstr ""
 
-#: lxc/delete.go:26
+#: lxc/delete.go:27
 msgid ""
 "Usage: lxc delete [<remote>:]<container>[/<snapshot>] "
 "[[<remote>:]<container>[/<snapshot>]...]\n"
@@ -1176,7 +1217,7 @@ msgid ""
 "Delete containers and snapshots."
 msgstr ""
 
-#: lxc/exec.go:52
+#: lxc/exec.go:53
 msgid ""
 "Usage: lxc exec [<remote>:]<container> [-t] [-T] [-n] [--mode=auto|"
 "interactive|non-interactive] [--env KEY=VALUE...] [--] <command line>\n"
@@ -1187,7 +1228,7 @@ msgid ""
 "AND stdout are terminals (stderr is ignored)."
 msgstr ""
 
-#: lxc/file.go:36
+#: lxc/file.go:38
 msgid ""
 "Usage: lxc file <subcommand> [options]\n"
 "\n"
@@ -1231,7 +1272,7 @@ msgid ""
 "Help page for the LXD client."
 msgstr ""
 
-#: lxc/image.go:69
+#: lxc/image.go:72
 msgid ""
 "Usage: lxc image <subcommand> [options]\n"
 "\n"
@@ -1336,7 +1377,7 @@ msgid ""
 "image alias name."
 msgstr ""
 
-#: lxc/info.go:25
+#: lxc/info.go:26
 msgid ""
 "Usage: lxc info [<remote>:][<container>] [--show-log]\n"
 "\n"
@@ -1349,7 +1390,7 @@ msgid ""
 "    For LXD server information."
 msgstr ""
 
-#: lxc/init.go:75
+#: lxc/init.go:76
 msgid ""
 "Usage: lxc init [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--"
 "profile|-p <profile>...] [--config|-c <key=value>...] [--network|-n "
@@ -1364,7 +1405,7 @@ msgid ""
 "    lxc init ubuntu:16.04 u1"
 msgstr ""
 
-#: lxc/launch.go:23
+#: lxc/launch.go:20
 msgid ""
 "Usage: lxc launch [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--"
 "profile|-p <profile>...] [--config|-c <key=value>...] [--network|-n "
@@ -1493,7 +1534,7 @@ msgid ""
 "    Only show log message."
 msgstr ""
 
-#: lxc/move.go:19
+#: lxc/move.go:22
 msgid ""
 "Usage: lxc move [<remote>:]<container>[/<snapshot>] [<remote>:][<container>[/"
 "<snapshot>]] [--container-only]\n"
@@ -1512,7 +1553,7 @@ msgid ""
 "    Rename a snapshot."
 msgstr ""
 
-#: lxc/network.go:49
+#: lxc/network.go:50
 msgid ""
 "Usage: lxc network <subcommand> [options]\n"
 "\n"
@@ -1565,7 +1606,7 @@ msgid ""
 "    Update a network using the content of network.yaml"
 msgstr ""
 
-#: lxc/profile.go:49
+#: lxc/profile.go:51
 msgid ""
 "Usage: lxc profile <subcommand> [options]\n"
 "\n"
@@ -1647,7 +1688,7 @@ msgid ""
 "    Remove all profile from \"foo\""
 msgstr ""
 
-#: lxc/publish.go:27
+#: lxc/publish.go:28
 msgid ""
 "Usage: lxc publish [<remote>:]<container>[/<snapshot>] [<remote>:] [--"
 "alias=ALIAS...] [prop-key=prop-value...]\n"
@@ -1655,7 +1696,7 @@ msgid ""
 "Publish containers as images."
 msgstr ""
 
-#: lxc/remote.go:38
+#: lxc/remote.go:39
 msgid ""
 "Usage: lxc remote <subcommand> [options]\n"
 "\n"
@@ -1684,7 +1725,7 @@ msgid ""
 "    Print the default remote."
 msgstr ""
 
-#: lxc/restore.go:21
+#: lxc/restore.go:22
 msgid ""
 "Usage: lxc restore [<remote>:]<container> <snapshot> [--stateful]\n"
 "\n"
@@ -1700,7 +1741,7 @@ msgid ""
 "    Restore the snapshot."
 msgstr ""
 
-#: lxc/snapshot.go:21
+#: lxc/snapshot.go:22
 msgid ""
 "Usage: lxc snapshot [<remote>:]<container> <snapshot name> [--stateful]\n"
 "\n"
@@ -1714,7 +1755,7 @@ msgid ""
 "    Create a snapshot of \"u1\" called \"snap0\"."
 msgstr ""
 
-#: lxc/storage.go:61
+#: lxc/storage.go:62
 msgid ""
 "Usage: lxc storage <subcommand> [options]\n"
 "\n"
@@ -1814,157 +1855,128 @@ msgid ""
 "Print the version number of this client tool."
 msgstr ""
 
-#: lxc/delete.go:45
+#: lxc/delete.go:46
 msgid "User aborted delete operation."
 msgstr ""
 
-#: lxc/restore.go:37
+#: lxc/restore.go:38
 msgid ""
 "Whether or not to restore the container's running state from snapshot (if "
 "available)"
 msgstr ""
 
-#: lxc/snapshot.go:35
+#: lxc/snapshot.go:36
 msgid "Whether or not to snapshot the container's running state"
 msgstr ""
 
-#: lxc/network.go:446 lxc/remote.go:371 lxc/remote.go:376
+#: lxc/network.go:492 lxc/remote.go:382 lxc/remote.go:387
 msgid "YES"
 msgstr ""
 
-#: lxc/exec.go:125
+#: lxc/exec.go:126
 msgid "You can't pass -t and -T at the same time"
 msgstr ""
 
-#: lxc/exec.go:129
+#: lxc/exec.go:130
 msgid "You can't pass -t or -T at the same time as --mode"
 msgstr ""
 
-#: lxc/main.go:56
-msgid "`lxc config profile` is deprecated, please use `lxc profile`"
-msgstr ""
-
-#: lxc/launch.go:134
-msgid "bad number of things scanned from image, container or snapshot"
-msgstr ""
-
-#: lxc/action.go:94
-msgid "bad result type from action"
+#: lxc/copy.go:57
+msgid "You must specify a source container name"
 msgstr ""
 
-#: lxc/copy.go:118
-msgid "can't copy to the same container name"
-msgstr ""
-
-#: lxc/file.go:314
-msgid "can't pull a directory without --recursive"
+#: lxc/main.go:58
+msgid "`lxc config profile` is deprecated, please use `lxc profile`"
 msgstr ""
 
-#: lxc/remote.go:359
+#: lxc/remote.go:370
 msgid "can't remove the default remote"
 msgstr ""
 
-#: lxc/file.go:125
+#: lxc/file.go:269
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr ""
 
-#: lxc/remote.go:385
+#: lxc/remote.go:396
 msgid "default"
 msgstr ""
 
-#: lxc/copy.go:134 lxc/copy.go:139 lxc/copy.go:258 lxc/copy.go:263
-#: lxc/init.go:234 lxc/init.go:239 lxc/launch.go:115 lxc/launch.go:121
+#: lxc/init.go:308
 msgid "didn't get any affected image, container or snapshot from server"
 msgstr ""
 
-#: lxc/image.go:454
+#: lxc/image.go:540
 msgid "disabled"
 msgstr ""
 
-#: lxc/image.go:456
+#: lxc/image.go:542
 msgid "enabled"
 msgstr ""
 
-#: lxc/action.go:126 lxc/main.go:26 lxc/main.go:159
+#: lxc/action.go:134 lxc/main.go:28 lxc/main.go:173
 #, c-format
 msgid "error: %v"
 msgstr ""
 
-#: lxc/help.go:37 lxc/main.go:106
+#: lxc/help.go:37 lxc/main.go:114
 #, c-format
 msgid "error: unknown command: %s"
 msgstr ""
 
-#: lxc/launch.go:139
-msgid "got bad version"
-msgstr ""
-
-#: lxc/image.go:202 lxc/image.go:449
+#: lxc/image.go:205 lxc/image.go:535
 msgid "no"
 msgstr ""
 
-#: lxc/copy.go:167
-msgid "not all the profiles from the source exist on the target"
-msgstr ""
-
-#: lxc/remote.go:233
+#: lxc/remote.go:229
 msgid "ok (y/n)?"
 msgstr ""
 
-#: lxc/main.go:331 lxc/main.go:335
+#: lxc/main.go:345 lxc/main.go:349
 #, c-format
 msgid "processing aliases failed %s\n"
 msgstr ""
 
-#: lxc/file.go:381
+#: lxc/file.go:541
 msgid "recursive edit doesn't make sense :("
 msgstr ""
 
-#: lxc/remote.go:421
+#: lxc/remote.go:432
 #, c-format
 msgid "remote %s already exists"
 msgstr ""
 
-#: lxc/remote.go:351 lxc/remote.go:413 lxc/remote.go:448 lxc/remote.go:464
+#: lxc/remote.go:362 lxc/remote.go:424 lxc/remote.go:459 lxc/remote.go:475
 #, c-format
 msgid "remote %s doesn't exist"
 msgstr ""
 
-#: lxc/remote.go:334
+#: lxc/remote.go:345
 #, c-format
 msgid "remote %s exists as <%s>"
 msgstr ""
 
-#: lxc/remote.go:355 lxc/remote.go:417 lxc/remote.go:452
+#: lxc/remote.go:366 lxc/remote.go:428 lxc/remote.go:463
 #, c-format
 msgid "remote %s is static and cannot be modified"
 msgstr ""
 
-#: lxc/info.go:221
+#: lxc/info.go:230
 msgid "stateful"
 msgstr ""
 
-#: lxc/info.go:223
+#: lxc/info.go:232
 msgid "stateless"
 msgstr ""
 
-#: lxc/info.go:217
+#: lxc/info.go:226
 #, c-format
 msgid "taken at %s"
 msgstr ""
 
-#: lxc/exec.go:214
-msgid "unreachable return reached"
-msgstr ""
-
-#: lxc/main.go:262
+#: lxc/main.go:276
 msgid "wrong number of subcommand arguments"
 msgstr ""
 
-#: lxc/delete.go:44 lxc/image.go:200 lxc/image.go:451
+#: lxc/delete.go:45 lxc/image.go:203 lxc/image.go:537
 msgid "yes"
 msgstr ""
-
-#: lxc/copy.go:47
-msgid "you must specify a source container name"
-msgstr ""
diff --git a/po/sv.po b/po/sv.po
index 3f0bbc75e..d4a02c351 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-06-13 20:10+0200\n"
+"POT-Creation-Date: 2017-06-17 03:18+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -16,7 +16,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: lxc/storage.go:30
+#: lxc/storage.go:31
 msgid ""
 "### This is a yaml representation of a storage pool.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -33,7 +33,7 @@ msgid ""
 "###   zfs.pool_name: default"
 msgstr ""
 
-#: lxc/storage.go:47
+#: lxc/storage.go:48
 msgid ""
 "### This is a yaml representation of a storage volume.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -47,7 +47,7 @@ msgid ""
 "###   size: \"61203283968\""
 msgstr ""
 
-#: lxc/config.go:37
+#: lxc/config.go:39
 msgid ""
 "### This is a yaml representation of the configuration.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -68,7 +68,7 @@ msgid ""
 "### Note that the name is shown but cannot be changed"
 msgstr ""
 
-#: lxc/image.go:59
+#: lxc/image.go:62
 msgid ""
 "### This is a yaml representation of the image properties.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -78,7 +78,7 @@ msgid ""
 "###  description: My custom image"
 msgstr ""
 
-#: lxc/network.go:29
+#: lxc/network.go:30
 msgid ""
 "### This is a yaml representation of the network.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -98,7 +98,7 @@ msgid ""
 "### Note that only the configuration can be changed."
 msgstr ""
 
-#: lxc/profile.go:28
+#: lxc/profile.go:30
 msgid ""
 "### This is a yaml representation of the profile.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -119,106 +119,130 @@ msgid ""
 "### Note that the name is shown but cannot be changed"
 msgstr ""
 
-#: lxc/image.go:179
+#: lxc/image.go:182
 #, c-format
 msgid "%s (%d more)"
 msgstr ""
 
-#: lxc/snapshot.go:58
+#: lxc/file.go:183
+#, c-format
+msgid "%s is not a directory"
+msgstr ""
+
+#: lxc/file.go:125
+#, c-format
+msgid "'%s' isn't a regular file or directory."
+msgstr ""
+
+#: lxc/snapshot.go:53
 msgid "'/' not allowed in snapshot name"
 msgstr ""
 
-#: lxc/profile.go:293
+#: lxc/profile.go:319
 msgid "(none)"
 msgstr ""
 
-#: lxc/image.go:223 lxc/image.go:814
+#: lxc/image.go:226 lxc/image.go:1052
 msgid "ALIAS"
 msgstr ""
 
-#: lxc/image.go:224
+#: lxc/image.go:227
 msgid "ALIASES"
 msgstr ""
 
-#: lxc/image.go:228
+#: lxc/image.go:231
 msgid "ARCH"
 msgstr ""
 
-#: lxc/list.go:456
+#: lxc/list.go:461
 msgid "ARCHITECTURE"
 msgstr ""
 
-#: lxc/remote.go:66
+#: lxc/remote.go:67
 msgid "Accept certificate"
 msgstr ""
 
-#: lxc/remote.go:282
+#: lxc/remote.go:281
 #, c-format
 msgid "Admin password for %s: "
 msgstr ""
 
-#: lxc/image.go:483
+#: lxc/image.go:569
 msgid "Aliases:"
 msgstr ""
 
-#: lxc/image.go:461 lxc/info.go:95
+#: lxc/image.go:547 lxc/info.go:104
 #, c-format
 msgid "Architecture: %s"
 msgstr ""
 
-#: lxc/image.go:491
+#: lxc/image.go:577
 #, c-format
 msgid "Auto update: %s"
 msgstr ""
 
-#: lxc/info.go:188
+#: lxc/image.go:651
+#, c-format
+msgid "Bad property: %s"
+msgstr ""
+
+#: lxc/info.go:197
 msgid "Bytes received"
 msgstr ""
 
-#: lxc/info.go:189
+#: lxc/info.go:198
 msgid "Bytes sent"
 msgstr ""
 
-#: lxc/config.go:310
+#: lxc/config.go:349
 msgid "COMMON NAME"
 msgstr ""
 
-#: lxc/info.go:152
+#: lxc/info.go:161
 msgid "CPU usage (in seconds)"
 msgstr ""
 
-#: lxc/info.go:156
+#: lxc/info.go:165
 msgid "CPU usage:"
 msgstr ""
 
-#: lxc/list.go:457
+#: lxc/list.go:462
 msgid "CREATED AT"
 msgstr ""
 
-#: lxc/config.go:150 lxc/network.go:496
+#: lxc/file.go:470
+msgid "Can't pull a directory without --recursive"
+msgstr ""
+
+#: lxc/config.go:156 lxc/network.go:542
 #, c-format
 msgid "Can't read from stdin: %s"
 msgstr ""
 
-#: lxc/config.go:163 lxc/config.go:196 lxc/config.go:218
+#: lxc/config.go:169
+#, c-format
+msgid "Can't unset key '%s', it's not currently set"
+msgstr ""
+
+#: lxc/config.go:211 lxc/config.go:237
 #, c-format
 msgid "Can't unset key '%s', it's not currently set."
 msgstr ""
 
-#: lxc/network.go:422 lxc/profile.go:472 lxc/storage.go:579
+#: lxc/network.go:468 lxc/profile.go:528 lxc/storage.go:625
 msgid "Cannot provide container name to list"
 msgstr ""
 
-#: lxc/remote.go:232
+#: lxc/remote.go:228
 #, c-format
 msgid "Certificate fingerprint: %s"
 msgstr ""
 
-#: lxc/remote.go:305
+#: lxc/remote.go:316
 msgid "Client certificate stored at server: "
 msgstr ""
 
-#: lxc/image.go:167 lxc/image.go:168 lxc/list.go:128 lxc/list.go:129
+#: lxc/image.go:170 lxc/image.go:171 lxc/list.go:128 lxc/list.go:129
 msgid "Columns"
 msgstr ""
 
@@ -226,35 +250,35 @@ msgstr ""
 msgid "Commands:"
 msgstr ""
 
-#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:135 lxc/init.go:136
+#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:136 lxc/init.go:137
 msgid "Config key/value to apply to the new container"
 msgstr ""
 
-#: lxc/config.go:571 lxc/config.go:636 lxc/image.go:868 lxc/network.go:378
-#: lxc/profile.go:257 lxc/storage.go:535 lxc/storage.go:854
+#: lxc/config.go:647 lxc/config.go:712 lxc/image.go:1107 lxc/network.go:418
+#: lxc/profile.go:267 lxc/storage.go:576 lxc/storage.go:935
 #, c-format
 msgid "Config parsing error: %s"
 msgstr ""
 
-#: lxc/main.go:33
+#: lxc/main.go:35
 msgid "Connection refused; is LXD running?"
 msgstr ""
 
-#: lxc/publish.go:62
+#: lxc/publish.go:71
 msgid "Container name is mandatory"
 msgstr ""
 
-#: lxc/copy.go:143 lxc/copy.go:267 lxc/init.go:244
+#: lxc/copy.go:210 lxc/init.go:313
 #, c-format
 msgid "Container name is: %s"
 msgstr ""
 
-#: lxc/publish.go:160 lxc/publish.go:175
+#: lxc/publish.go:250
 #, c-format
 msgid "Container published with fingerprint: %s"
 msgstr ""
 
-#: lxc/image.go:170
+#: lxc/image.go:173
 msgid "Copy aliases from source"
 msgstr ""
 
@@ -262,85 +286,90 @@ msgstr ""
 msgid "Copy the container without its snapshots"
 msgstr ""
 
-#: lxc/image.go:360
+#: lxc/image.go:422
 #, c-format
 msgid "Copying the image: %s"
 msgstr ""
 
-#: lxc/remote.go:247
+#: lxc/remote.go:243
 msgid "Could not create server cert dir"
 msgstr ""
 
-#: lxc/file.go:67 lxc/file.go:68
+#: lxc/file.go:69 lxc/file.go:70
 msgid "Create any directories necessary"
 msgstr ""
 
-#: lxc/image.go:466 lxc/info.go:97
+#: lxc/image.go:552 lxc/info.go:106
 #, c-format
 msgid "Created: %s"
 msgstr ""
 
-#: lxc/init.go:182 lxc/launch.go:142
+#: lxc/init.go:194
 #, c-format
 msgid "Creating %s"
 msgstr ""
 
-#: lxc/init.go:180
+#: lxc/init.go:192
 msgid "Creating the container"
 msgstr ""
 
-#: lxc/image.go:227 lxc/image.go:816 lxc/list.go:458 lxc/network.go:461
-#: lxc/storage.go:608 lxc/storage.go:697
+#: lxc/image.go:230 lxc/image.go:1054 lxc/list.go:463 lxc/network.go:507
+#: lxc/storage.go:654 lxc/storage.go:749
 msgid "DESCRIPTION"
 msgstr ""
 
-#: lxc/storage.go:609
+#: lxc/storage.go:655
 msgid "DRIVER"
 msgstr ""
 
-#: lxc/publish.go:38
+#: lxc/publish.go:39
 msgid "Define a compression algorithm: for image or none"
 msgstr ""
 
-#: lxc/config.go:688
+#: lxc/config.go:803
 #, c-format
 msgid "Device %s added to %s"
 msgstr ""
 
-#: lxc/config.go:875
+#: lxc/config.go:1037
 #, c-format
 msgid "Device %s removed from %s"
 msgstr ""
 
-#: lxc/exec.go:64
-msgid "Disable pseudo-terminal allocation"
+#: lxc/utils.go:248 lxc/utils.go:272
+#, c-format
+msgid "Device already exists: %s"
 msgstr ""
 
 #: lxc/exec.go:65
+msgid "Disable pseudo-terminal allocation"
+msgstr ""
+
+#: lxc/exec.go:66
 msgid "Disable stdin (reads from /dev/null)"
 msgstr ""
 
-#: lxc/info.go:145
+#: lxc/info.go:154
 msgid "Disk usage:"
 msgstr ""
 
-#: lxc/list.go:609
+#: lxc/list.go:614
 msgid "EPHEMERAL"
 msgstr ""
 
-#: lxc/config.go:312
+#: lxc/config.go:351
 msgid "EXPIRY DATE"
 msgstr ""
 
-#: lxc/main.go:45
+#: lxc/main.go:47
 msgid "Enable debug mode"
 msgstr ""
 
-#: lxc/main.go:44
+#: lxc/main.go:46
 msgid "Enable verbose mode"
 msgstr ""
 
-#: lxc/exec.go:61
+#: lxc/exec.go:62
 msgid "Environment variable to set (e.g. HOME=/home/foo)"
 msgstr ""
 
@@ -348,7 +377,7 @@ msgstr ""
 msgid "Environment:"
 msgstr ""
 
-#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:139 lxc/init.go:140
+#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:140 lxc/init.go:141
 msgid "Ephemeral container"
 msgstr ""
 
@@ -356,16 +385,21 @@ msgstr ""
 msgid "Event type to listen for"
 msgstr ""
 
-#: lxc/image.go:470
+#: lxc/image.go:556
 #, c-format
 msgid "Expires: %s"
 msgstr ""
 
-#: lxc/image.go:472
+#: lxc/image.go:558
 msgid "Expires: never"
 msgstr ""
 
-#: lxc/config.go:309 lxc/image.go:225 lxc/image.go:815
+#: lxc/image.go:848
+#, c-format
+msgid "Exporting the image: %s"
+msgstr ""
+
+#: lxc/config.go:348 lxc/image.go:228 lxc/image.go:1053
 msgid "FINGERPRINT"
 msgstr ""
 
@@ -379,16 +413,25 @@ msgstr ""
 msgid "Failed to generate 'lxc.1': %v"
 msgstr ""
 
+#: lxc/copy.go:205
+msgid "Failed to get the new container name"
+msgstr ""
+
+#: lxc/file.go:120
+#, c-format
+msgid "Failed to walk path for %s: %s"
+msgstr ""
+
 #: lxc/list.go:131
 msgid "Fast mode (same as --columns=nsacPt)"
 msgstr ""
 
-#: lxc/image.go:459
+#: lxc/image.go:545
 #, c-format
 msgid "Fingerprint: %s"
 msgstr ""
 
-#: lxc/exec.go:63
+#: lxc/exec.go:64
 msgid "Force pseudo-terminal allocation"
 msgstr ""
 
@@ -396,39 +439,39 @@ msgstr ""
 msgid "Force the container to shutdown"
 msgstr ""
 
-#: lxc/delete.go:33 lxc/delete.go:34
+#: lxc/delete.go:34 lxc/delete.go:35
 msgid "Force the removal of stopped containers"
 msgstr ""
 
-#: lxc/main.go:46
+#: lxc/main.go:48
 msgid "Force using the local unix socket"
 msgstr ""
 
-#: lxc/image.go:173 lxc/list.go:130
+#: lxc/image.go:176 lxc/list.go:130
 msgid "Format (csv|json|table|yaml)"
 msgstr ""
 
-#: lxc/remote.go:80
+#: lxc/remote.go:81
 msgid "Generating a client certificate. This may take a minute..."
 msgstr ""
 
-#: lxc/list.go:454
+#: lxc/list.go:459
 msgid "IPV4"
 msgstr ""
 
-#: lxc/list.go:455
+#: lxc/list.go:460
 msgid "IPV6"
 msgstr ""
 
-#: lxc/config.go:311
+#: lxc/config.go:350
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:139
+#: lxc/main.go:153
 msgid "If this is your first time using LXD, you should also run: lxd init"
 msgstr ""
 
-#: lxc/main.go:47
+#: lxc/main.go:49
 msgid "Ignore aliases when determining what command to run"
 msgstr ""
 
@@ -436,245 +479,229 @@ msgstr ""
 msgid "Ignore the container state (only for start)"
 msgstr ""
 
-#: lxc/image.go:422
+#: lxc/image.go:508
 msgid "Image already up to date."
 msgstr ""
 
-#: lxc/image.go:363
+#: lxc/image.go:436
 msgid "Image copied successfully!"
 msgstr ""
 
-#: lxc/image.go:546 lxc/image.go:558
+#: lxc/image.go:898
+msgid "Image exported successfully!"
+msgstr ""
+
+#: lxc/image.go:709
 #, c-format
 msgid "Image imported with fingerprint: %s"
 msgstr ""
 
-#: lxc/image.go:420
+#: lxc/image.go:506
 msgid "Image refreshed successfully!"
 msgstr ""
 
-#: lxc/image.go:543
-#, c-format
-msgid "Importing the image: %s"
-msgstr ""
-
-#: lxc/remote.go:150
+#: lxc/remote.go:151
 #, c-format
 msgid "Invalid URL scheme \"%s\" in \"%s\""
 msgstr ""
 
-#: lxc/config.go:290
+#: lxc/config.go:329
 msgid "Invalid certificate"
 msgstr ""
 
-#: lxc/init.go:30 lxc/init.go:35
+#: lxc/init.go:31 lxc/init.go:36
 msgid "Invalid configuration key"
 msgstr ""
 
-#: lxc/file.go:357
+#: lxc/file.go:513
 #, c-format
 msgid "Invalid path %s"
 msgstr ""
 
-#: lxc/file.go:291
+#: lxc/file.go:443
 #, c-format
 msgid "Invalid source %s"
 msgstr ""
 
-#: lxc/file.go:80
+#: lxc/file.go:221
 #, c-format
 msgid "Invalid target %s"
 msgstr ""
 
-#: lxc/info.go:126
+#: lxc/info.go:135
 msgid "Ips:"
 msgstr ""
 
-#: lxc/image.go:171
+#: lxc/image.go:174
 msgid "Keep the image up to date after initial copy"
 msgstr ""
 
-#: lxc/list.go:459
+#: lxc/list.go:464
 msgid "LAST USED AT"
 msgstr ""
 
-#: lxc/main.go:31
+#: lxc/main.go:33
 msgid "LXD socket not found; is LXD installed and running?"
 msgstr ""
 
-#: lxc/image.go:475
+#: lxc/image.go:561
 #, c-format
 msgid "Last used: %s"
 msgstr ""
 
-#: lxc/image.go:477
+#: lxc/image.go:563
 msgid "Last used: never"
 msgstr ""
 
-#: lxc/info.go:241
+#: lxc/info.go:250
 msgid "Log:"
 msgstr ""
 
-#: lxc/network.go:460
+#: lxc/network.go:506
 msgid "MANAGED"
 msgstr ""
 
-#: lxc/image.go:169
+#: lxc/image.go:172
 msgid "Make image public"
 msgstr ""
 
-#: lxc/publish.go:34
+#: lxc/publish.go:35
 msgid "Make the image public"
 msgstr ""
 
-#: lxc/info.go:163
+#: lxc/info.go:172
 msgid "Memory (current)"
 msgstr ""
 
-#: lxc/info.go:167
+#: lxc/info.go:176
 msgid "Memory (peak)"
 msgstr ""
 
-#: lxc/info.go:179
+#: lxc/info.go:188
 msgid "Memory usage:"
 msgstr ""
 
-#: lxc/copy.go:276
-#, c-format
-msgid "Migration failed on source host: %s"
-msgstr ""
-
-#: lxc/copy.go:280
-#, c-format
-msgid "Migration failed on target host: %s"
-msgstr ""
-
-#: lxc/utils.go:201
+#: lxc/utils.go:199
 msgid "Missing summary."
 msgstr ""
 
-#: lxc/network.go:248 lxc/network.go:297 lxc/storage.go:362 lxc/storage.go:462
+#: lxc/network.go:276 lxc/network.go:329 lxc/storage.go:374 lxc/storage.go:494
 msgid "More than one device matches, specify the device name."
 msgstr ""
 
-#: lxc/file.go:279
+#: lxc/file.go:431
 msgid "More than one file to download, but target is not a directory"
 msgstr ""
 
-#: lxc/move.go:35
+#: lxc/move.go:38
 msgid "Move the container without its snapshots"
 msgstr ""
 
-#: lxc/action.go:68
+#: lxc/action.go:72
 msgid "Must supply container name for: "
 msgstr ""
 
-#: lxc/list.go:460 lxc/network.go:458 lxc/profile.go:499 lxc/remote.go:395
-#: lxc/storage.go:607 lxc/storage.go:696
+#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:406
+#: lxc/storage.go:653 lxc/storage.go:748
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:444 lxc/remote.go:369 lxc/remote.go:374
+#: lxc/network.go:490 lxc/remote.go:380 lxc/remote.go:385
 msgid "NO"
 msgstr ""
 
-#: lxc/info.go:91
+#: lxc/info.go:99
 #, c-format
 msgid "Name: %s"
 msgstr ""
 
-#: lxc/network.go:222
+#: lxc/network.go:250
 #, c-format
 msgid "Network %s created"
 msgstr ""
 
-#: lxc/network.go:325
+#: lxc/network.go:366
 #, c-format
 msgid "Network %s deleted"
 msgstr ""
 
-#: lxc/init.go:141 lxc/init.go:142
+#: lxc/init.go:142 lxc/init.go:143
 msgid "Network name"
 msgstr ""
 
-#: lxc/info.go:196
+#: lxc/info.go:205
 msgid "Network usage:"
 msgstr ""
 
-#: lxc/image.go:172 lxc/publish.go:35
+#: lxc/image.go:175 lxc/publish.go:36
 msgid "New alias to define at target"
 msgstr ""
 
-#: lxc/config.go:321
+#: lxc/config.go:360
 msgid "No certificate provided to add"
 msgstr ""
 
-#: lxc/network.go:257 lxc/network.go:306
+#: lxc/network.go:285 lxc/network.go:338
 msgid "No device found for this network"
 msgstr ""
 
-#: lxc/storage.go:371 lxc/storage.go:471
+#: lxc/storage.go:383 lxc/storage.go:503
 msgid "No device found for this storage volume."
 msgstr ""
 
-#: lxc/config.go:344
+#: lxc/config.go:392
 msgid "No fingerprint specified."
 msgstr ""
 
-#: lxc/storage.go:323 lxc/storage.go:407
+#: lxc/storage.go:327 lxc/storage.go:420
 msgid "Only \"custom\" volumes can be attached to containers."
 msgstr ""
 
-#: lxc/remote.go:135
+#: lxc/remote.go:136
 msgid "Only https URLs are supported for simplestreams"
 msgstr ""
 
-#: lxc/image.go:549
+#: lxc/image.go:632
 msgid "Only https:// is supported for remote image import."
 msgstr ""
 
-#: lxc/network.go:354 lxc/network.go:482
+#: lxc/network.go:394 lxc/network.go:528
 msgid "Only managed networks can be modified."
 msgstr ""
 
-#: lxc/help.go:71 lxc/main.go:112 lxc/main.go:163
+#: lxc/help.go:71 lxc/main.go:120 lxc/main.go:177
 msgid "Options:"
 msgstr ""
 
-#: lxc/image.go:664
-#, c-format
-msgid "Output is in %s"
-msgstr ""
-
-#: lxc/exec.go:62
+#: lxc/exec.go:63
 msgid "Override the terminal mode (auto, interactive or non-interactive)"
 msgstr ""
 
-#: lxc/list.go:611
+#: lxc/list.go:616
 msgid "PERSISTENT"
 msgstr ""
 
-#: lxc/list.go:461
+#: lxc/list.go:466
 msgid "PID"
 msgstr ""
 
-#: lxc/list.go:462
+#: lxc/list.go:467
 msgid "PROFILES"
 msgstr ""
 
-#: lxc/remote.go:397
+#: lxc/remote.go:408
 msgid "PROTOCOL"
 msgstr ""
 
-#: lxc/image.go:226 lxc/remote.go:398
+#: lxc/image.go:229 lxc/remote.go:409
 msgid "PUBLIC"
 msgstr ""
 
-#: lxc/info.go:190
+#: lxc/info.go:199
 msgid "Packets received"
 msgstr ""
 
-#: lxc/info.go:191
+#: lxc/info.go:200
 msgid "Packets sent"
 msgstr ""
 
@@ -686,24 +713,24 @@ msgstr ""
 msgid "Path to an alternate server directory"
 msgstr ""
 
-#: lxc/main.go:202
+#: lxc/main.go:216
 msgid "Pause containers."
 msgstr ""
 
-#: lxc/main.go:35
+#: lxc/main.go:37
 msgid "Permission denied, are you in the lxd group?"
 msgstr ""
 
-#: lxc/info.go:108
+#: lxc/info.go:117
 #, c-format
 msgid "Pid: %d"
 msgstr ""
 
-#: lxc/network.go:379 lxc/profile.go:258 lxc/storage.go:536 lxc/storage.go:855
+#: lxc/network.go:419 lxc/profile.go:268 lxc/storage.go:577 lxc/storage.go:936
 msgid "Press enter to open the editor again"
 msgstr ""
 
-#: lxc/config.go:572 lxc/config.go:637 lxc/image.go:869
+#: lxc/config.go:648 lxc/config.go:713 lxc/image.go:1108
 msgid "Press enter to start the editor again"
 msgstr ""
 
@@ -719,143 +746,143 @@ msgstr ""
 msgid "Print verbose information"
 msgstr ""
 
-#: lxc/info.go:132
+#: lxc/info.go:141
 #, c-format
 msgid "Processes: %d"
 msgstr ""
 
-#: lxc/profile.go:314
+#: lxc/profile.go:344
 #, c-format
 msgid "Profile %s added to %s"
 msgstr ""
 
-#: lxc/profile.go:209
+#: lxc/profile.go:218
 #, c-format
 msgid "Profile %s created"
 msgstr ""
 
-#: lxc/profile.go:279
+#: lxc/profile.go:292
 #, c-format
 msgid "Profile %s deleted"
 msgstr ""
 
-#: lxc/profile.go:345
+#: lxc/profile.go:379
 #, c-format
 msgid "Profile %s removed from %s"
 msgstr ""
 
-#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:137 lxc/init.go:138
+#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:138 lxc/init.go:139
 msgid "Profile to apply to the new container"
 msgstr ""
 
-#: lxc/profile.go:295
+#: lxc/profile.go:321
 #, c-format
 msgid "Profiles %s applied to %s"
 msgstr ""
 
-#: lxc/info.go:106
+#: lxc/info.go:115
 #, c-format
 msgid "Profiles: %s"
 msgstr ""
 
-#: lxc/image.go:479
+#: lxc/image.go:565
 msgid "Properties:"
 msgstr ""
 
-#: lxc/remote.go:69
+#: lxc/remote.go:70
 msgid "Public image server"
 msgstr ""
 
-#: lxc/image.go:462
+#: lxc/image.go:548
 #, c-format
 msgid "Public: %s"
 msgstr ""
 
-#: lxc/file.go:65 lxc/file.go:66
+#: lxc/file.go:67 lxc/file.go:68
 msgid "Recursively push or pull files"
 msgstr ""
 
-#: lxc/image.go:413
+#: lxc/image.go:489
 #, c-format
 msgid "Refreshing the image: %s"
 msgstr ""
 
-#: lxc/remote.go:67
+#: lxc/remote.go:68
 msgid "Remote admin password"
 msgstr ""
 
-#: lxc/info.go:93
+#: lxc/info.go:101
 #, c-format
 msgid "Remote: %s"
 msgstr ""
 
-#: lxc/delete.go:41
+#: lxc/delete.go:42
 #, c-format
 msgid "Remove %s (yes/no): "
 msgstr ""
 
-#: lxc/delete.go:35 lxc/delete.go:36
+#: lxc/delete.go:36 lxc/delete.go:37
 msgid "Require user confirmation"
 msgstr ""
 
-#: lxc/info.go:129
+#: lxc/info.go:138
 msgid "Resources:"
 msgstr ""
 
-#: lxc/main.go:210
+#: lxc/main.go:224
 msgid "Restart containers."
 msgstr ""
 
-#: lxc/init.go:253
+#: lxc/init.go:286
 #, c-format
 msgid "Retrieving image: %s"
 msgstr ""
 
-#: lxc/image.go:229
+#: lxc/image.go:232
 msgid "SIZE"
 msgstr ""
 
-#: lxc/list.go:463
+#: lxc/list.go:468
 msgid "SNAPSHOTS"
 msgstr ""
 
-#: lxc/storage.go:610
+#: lxc/storage.go:656
 msgid "SOURCE"
 msgstr ""
 
-#: lxc/list.go:464
+#: lxc/list.go:469
 msgid "STATE"
 msgstr ""
 
-#: lxc/remote.go:399
+#: lxc/remote.go:410
 msgid "STATIC"
 msgstr ""
 
-#: lxc/list.go:466
+#: lxc/list.go:471
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/remote.go:240
+#: lxc/remote.go:236
 msgid "Server certificate NACKed by user"
 msgstr ""
 
-#: lxc/remote.go:302
+#: lxc/remote.go:313
 msgid "Server doesn't trust us after adding our cert"
 msgstr ""
 
-#: lxc/remote.go:68
+#: lxc/remote.go:69
 msgid "Server protocol (lxd or simplestreams)"
 msgstr ""
 
-#: lxc/file.go:63
+#: lxc/file.go:65
 msgid "Set the file's gid on push"
 msgstr ""
 
-#: lxc/file.go:64
+#: lxc/file.go:66
 msgid "Set the file's perms on push"
 msgstr ""
 
-#: lxc/file.go:62
+#: lxc/file.go:64
 msgid "Set the file's uid on push"
 msgstr ""
 
@@ -867,78 +894,83 @@ msgstr ""
 msgid "Show client version"
 msgstr ""
 
-#: lxc/info.go:38
+#: lxc/info.go:39
 msgid "Show the container's last 100 log lines?"
 msgstr ""
 
-#: lxc/config.go:33
+#: lxc/config.go:35
 msgid "Show the expanded configuration"
 msgstr ""
 
-#: lxc/image.go:460
+#: lxc/image.go:546
 #, c-format
 msgid "Size: %.2fMB"
 msgstr ""
 
-#: lxc/info.go:210
+#: lxc/info.go:219
 msgid "Snapshots:"
 msgstr ""
 
-#: lxc/action.go:134
+#: lxc/action.go:142
 #, c-format
 msgid "Some containers failed to %s"
 msgstr ""
 
-#: lxc/image.go:493
+#: lxc/image.go:579
 msgid "Source:"
 msgstr ""
 
-#: lxc/main.go:220
+#: lxc/main.go:234
 msgid "Start containers."
 msgstr ""
 
-#: lxc/launch.go:152
+#: lxc/launch.go:59
 #, c-format
 msgid "Starting %s"
 msgstr ""
 
-#: lxc/info.go:100
+#: lxc/info.go:109
 #, c-format
 msgid "Status: %s"
 msgstr ""
 
-#: lxc/main.go:226
+#: lxc/main.go:240
 msgid "Stop containers."
 msgstr ""
 
-#: lxc/publish.go:36 lxc/publish.go:37
+#: lxc/publish.go:37 lxc/publish.go:38
 msgid "Stop the container if currently running"
 msgstr ""
 
-#: lxc/delete.go:105 lxc/publish.go:114
+#: lxc/publish.go:136
 msgid "Stopping container failed!"
 msgstr ""
 
-#: lxc/storage.go:436
+#: lxc/delete.go:121
+#, c-format
+msgid "Stopping the container failed: %s"
+msgstr ""
+
+#: lxc/storage.go:468
 #, c-format
 msgid "Storage pool %s created"
 msgstr ""
 
-#: lxc/storage.go:486
+#: lxc/storage.go:527
 #, c-format
 msgid "Storage pool %s deleted"
 msgstr ""
 
-#: lxc/init.go:143 lxc/init.go:144
+#: lxc/init.go:144 lxc/init.go:145
 msgid "Storage pool name"
 msgstr ""
 
-#: lxc/storage.go:720
+#: lxc/storage.go:782
 #, c-format
 msgid "Storage volume %s created"
 msgstr ""
 
-#: lxc/storage.go:730
+#: lxc/storage.go:797
 #, c-format
 msgid "Storage volume %s deleted"
 msgstr ""
@@ -947,38 +979,42 @@ msgstr ""
 msgid "Store the container state (only for stop)"
 msgstr ""
 
-#: lxc/info.go:171
+#: lxc/info.go:180
 msgid "Swap (current)"
 msgstr ""
 
-#: lxc/info.go:175
+#: lxc/info.go:184
 msgid "Swap (peak)"
 msgstr ""
 
-#: lxc/list.go:465 lxc/network.go:459 lxc/storage.go:695
+#: lxc/list.go:470 lxc/network.go:505 lxc/storage.go:747
 msgid "TYPE"
 msgstr ""
 
-#: lxc/delete.go:91
+#: lxc/delete.go:105
 msgid "The container is currently running, stop it first or pass --force."
 msgstr ""
 
-#: lxc/publish.go:92
+#: lxc/publish.go:101
 msgid ""
 "The container is currently running. Use --force to have it stopped and "
 "restarted."
 msgstr ""
 
-#: lxc/init.go:326
+#: lxc/init.go:358
 msgid "The container you are starting doesn't have any network attached to it."
 msgstr ""
 
-#: lxc/config.go:716 lxc/config.go:728 lxc/config.go:761 lxc/config.go:779
-#: lxc/config.go:817 lxc/config.go:835
+#: lxc/config.go:770 lxc/config.go:787
+msgid "The device already exists"
+msgstr ""
+
+#: lxc/config.go:833 lxc/config.go:845 lxc/config.go:881 lxc/config.go:899
+#: lxc/config.go:945 lxc/config.go:962 lxc/config.go:1006 lxc/config.go:1022
 msgid "The device doesn't exist"
 msgstr ""
 
-#: lxc/init.go:310
+#: lxc/init.go:342
 #, c-format
 msgid "The local image '%s' couldn't be found, trying '%s:' instead."
 msgstr ""
@@ -987,15 +1023,15 @@ msgstr ""
 msgid "The opposite of \"lxc pause\" is \"lxc start\"."
 msgstr ""
 
-#: lxc/network.go:262 lxc/network.go:311 lxc/storage.go:376 lxc/storage.go:476
+#: lxc/network.go:290 lxc/network.go:343 lxc/storage.go:388 lxc/storage.go:508
 msgid "The specified device doesn't exist"
 msgstr ""
 
-#: lxc/network.go:266 lxc/network.go:315
+#: lxc/network.go:294 lxc/network.go:347
 msgid "The specified device doesn't match the network"
 msgstr ""
 
-#: lxc/publish.go:65
+#: lxc/publish.go:74
 msgid "There is no \"image name\".  Did you want an alias?"
 msgstr ""
 
@@ -1011,49 +1047,49 @@ msgstr ""
 msgid "Time to wait for the container before killing it"
 msgstr ""
 
-#: lxc/image.go:463
+#: lxc/image.go:549
 msgid "Timestamps:"
 msgstr ""
 
-#: lxc/init.go:328
+#: lxc/init.go:360
 msgid "To attach a network to a container, use: lxc network attach"
 msgstr ""
 
-#: lxc/init.go:327
+#: lxc/init.go:359
 msgid "To create a new network, use: lxc network create"
 msgstr ""
 
-#: lxc/main.go:140
+#: lxc/main.go:154
 msgid "To start your first container, try: lxc launch ubuntu:16.04"
 msgstr ""
 
-#: lxc/image.go:551
+#: lxc/image.go:657
 #, c-format
 msgid "Transferring image: %s"
 msgstr ""
 
-#: lxc/action.go:98 lxc/launch.go:165
+#: lxc/action.go:106 lxc/launch.go:77
 #, c-format
 msgid "Try `lxc info --show-log %s` for more info"
 msgstr ""
 
-#: lxc/info.go:102
+#: lxc/info.go:111
 msgid "Type: ephemeral"
 msgstr ""
 
-#: lxc/info.go:104
+#: lxc/info.go:113
 msgid "Type: persistent"
 msgstr ""
 
-#: lxc/image.go:230
+#: lxc/image.go:233
 msgid "UPLOAD DATE"
 msgstr ""
 
-#: lxc/remote.go:396
+#: lxc/remote.go:407
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:462 lxc/profile.go:500 lxc/storage.go:611 lxc/storage.go:698
+#: lxc/network.go:508 lxc/profile.go:556 lxc/storage.go:657 lxc/storage.go:750
 msgid "USED BY"
 msgstr ""
 
@@ -1061,11 +1097,16 @@ msgstr ""
 msgid "Unable to find help2man."
 msgstr ""
 
-#: lxc/remote.go:110
+#: lxc/remote.go:111
 msgid "Unable to read remote TLS certificate"
 msgstr ""
 
-#: lxc/image.go:468
+#: lxc/file.go:108
+#, c-format
+msgid "Unknown file type '%s'"
+msgstr ""
+
+#: lxc/image.go:554
 #, c-format
 msgid "Uploaded: %s"
 msgstr ""
@@ -1082,7 +1123,7 @@ msgstr ""
 msgid "Usage: lxc <command> [options]"
 msgstr ""
 
-#: lxc/config.go:58
+#: lxc/config.go:60
 msgid ""
 "Usage: lxc config <subcommand> [options]\n"
 "\n"
@@ -1168,7 +1209,7 @@ msgid ""
 "Copy containers within or in between LXD instances."
 msgstr ""
 
-#: lxc/delete.go:26
+#: lxc/delete.go:27
 msgid ""
 "Usage: lxc delete [<remote>:]<container>[/<snapshot>] "
 "[[<remote>:]<container>[/<snapshot>]...]\n"
@@ -1176,7 +1217,7 @@ msgid ""
 "Delete containers and snapshots."
 msgstr ""
 
-#: lxc/exec.go:52
+#: lxc/exec.go:53
 msgid ""
 "Usage: lxc exec [<remote>:]<container> [-t] [-T] [-n] [--mode=auto|"
 "interactive|non-interactive] [--env KEY=VALUE...] [--] <command line>\n"
@@ -1187,7 +1228,7 @@ msgid ""
 "AND stdout are terminals (stderr is ignored)."
 msgstr ""
 
-#: lxc/file.go:36
+#: lxc/file.go:38
 msgid ""
 "Usage: lxc file <subcommand> [options]\n"
 "\n"
@@ -1231,7 +1272,7 @@ msgid ""
 "Help page for the LXD client."
 msgstr ""
 
-#: lxc/image.go:69
+#: lxc/image.go:72
 msgid ""
 "Usage: lxc image <subcommand> [options]\n"
 "\n"
@@ -1336,7 +1377,7 @@ msgid ""
 "image alias name."
 msgstr ""
 
-#: lxc/info.go:25
+#: lxc/info.go:26
 msgid ""
 "Usage: lxc info [<remote>:][<container>] [--show-log]\n"
 "\n"
@@ -1349,7 +1390,7 @@ msgid ""
 "    For LXD server information."
 msgstr ""
 
-#: lxc/init.go:75
+#: lxc/init.go:76
 msgid ""
 "Usage: lxc init [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--"
 "profile|-p <profile>...] [--config|-c <key=value>...] [--network|-n "
@@ -1364,7 +1405,7 @@ msgid ""
 "    lxc init ubuntu:16.04 u1"
 msgstr ""
 
-#: lxc/launch.go:23
+#: lxc/launch.go:20
 msgid ""
 "Usage: lxc launch [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--"
 "profile|-p <profile>...] [--config|-c <key=value>...] [--network|-n "
@@ -1493,7 +1534,7 @@ msgid ""
 "    Only show log message."
 msgstr ""
 
-#: lxc/move.go:19
+#: lxc/move.go:22
 msgid ""
 "Usage: lxc move [<remote>:]<container>[/<snapshot>] [<remote>:][<container>[/"
 "<snapshot>]] [--container-only]\n"
@@ -1512,7 +1553,7 @@ msgid ""
 "    Rename a snapshot."
 msgstr ""
 
-#: lxc/network.go:49
+#: lxc/network.go:50
 msgid ""
 "Usage: lxc network <subcommand> [options]\n"
 "\n"
@@ -1565,7 +1606,7 @@ msgid ""
 "    Update a network using the content of network.yaml"
 msgstr ""
 
-#: lxc/profile.go:49
+#: lxc/profile.go:51
 msgid ""
 "Usage: lxc profile <subcommand> [options]\n"
 "\n"
@@ -1647,7 +1688,7 @@ msgid ""
 "    Remove all profile from \"foo\""
 msgstr ""
 
-#: lxc/publish.go:27
+#: lxc/publish.go:28
 msgid ""
 "Usage: lxc publish [<remote>:]<container>[/<snapshot>] [<remote>:] [--"
 "alias=ALIAS...] [prop-key=prop-value...]\n"
@@ -1655,7 +1696,7 @@ msgid ""
 "Publish containers as images."
 msgstr ""
 
-#: lxc/remote.go:38
+#: lxc/remote.go:39
 msgid ""
 "Usage: lxc remote <subcommand> [options]\n"
 "\n"
@@ -1684,7 +1725,7 @@ msgid ""
 "    Print the default remote."
 msgstr ""
 
-#: lxc/restore.go:21
+#: lxc/restore.go:22
 msgid ""
 "Usage: lxc restore [<remote>:]<container> <snapshot> [--stateful]\n"
 "\n"
@@ -1700,7 +1741,7 @@ msgid ""
 "    Restore the snapshot."
 msgstr ""
 
-#: lxc/snapshot.go:21
+#: lxc/snapshot.go:22
 msgid ""
 "Usage: lxc snapshot [<remote>:]<container> <snapshot name> [--stateful]\n"
 "\n"
@@ -1714,7 +1755,7 @@ msgid ""
 "    Create a snapshot of \"u1\" called \"snap0\"."
 msgstr ""
 
-#: lxc/storage.go:61
+#: lxc/storage.go:62
 msgid ""
 "Usage: lxc storage <subcommand> [options]\n"
 "\n"
@@ -1814,157 +1855,128 @@ msgid ""
 "Print the version number of this client tool."
 msgstr ""
 
-#: lxc/delete.go:45
+#: lxc/delete.go:46
 msgid "User aborted delete operation."
 msgstr ""
 
-#: lxc/restore.go:37
+#: lxc/restore.go:38
 msgid ""
 "Whether or not to restore the container's running state from snapshot (if "
 "available)"
 msgstr ""
 
-#: lxc/snapshot.go:35
+#: lxc/snapshot.go:36
 msgid "Whether or not to snapshot the container's running state"
 msgstr ""
 
-#: lxc/network.go:446 lxc/remote.go:371 lxc/remote.go:376
+#: lxc/network.go:492 lxc/remote.go:382 lxc/remote.go:387
 msgid "YES"
 msgstr ""
 
-#: lxc/exec.go:125
+#: lxc/exec.go:126
 msgid "You can't pass -t and -T at the same time"
 msgstr ""
 
-#: lxc/exec.go:129
+#: lxc/exec.go:130
 msgid "You can't pass -t or -T at the same time as --mode"
 msgstr ""
 
-#: lxc/main.go:56
-msgid "`lxc config profile` is deprecated, please use `lxc profile`"
-msgstr ""
-
-#: lxc/launch.go:134
-msgid "bad number of things scanned from image, container or snapshot"
-msgstr ""
-
-#: lxc/action.go:94
-msgid "bad result type from action"
+#: lxc/copy.go:57
+msgid "You must specify a source container name"
 msgstr ""
 
-#: lxc/copy.go:118
-msgid "can't copy to the same container name"
-msgstr ""
-
-#: lxc/file.go:314
-msgid "can't pull a directory without --recursive"
+#: lxc/main.go:58
+msgid "`lxc config profile` is deprecated, please use `lxc profile`"
 msgstr ""
 
-#: lxc/remote.go:359
+#: lxc/remote.go:370
 msgid "can't remove the default remote"
 msgstr ""
 
-#: lxc/file.go:125
+#: lxc/file.go:269
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr ""
 
-#: lxc/remote.go:385
+#: lxc/remote.go:396
 msgid "default"
 msgstr ""
 
-#: lxc/copy.go:134 lxc/copy.go:139 lxc/copy.go:258 lxc/copy.go:263
-#: lxc/init.go:234 lxc/init.go:239 lxc/launch.go:115 lxc/launch.go:121
+#: lxc/init.go:308
 msgid "didn't get any affected image, container or snapshot from server"
 msgstr ""
 
-#: lxc/image.go:454
+#: lxc/image.go:540
 msgid "disabled"
 msgstr ""
 
-#: lxc/image.go:456
+#: lxc/image.go:542
 msgid "enabled"
 msgstr ""
 
-#: lxc/action.go:126 lxc/main.go:26 lxc/main.go:159
+#: lxc/action.go:134 lxc/main.go:28 lxc/main.go:173
 #, c-format
 msgid "error: %v"
 msgstr ""
 
-#: lxc/help.go:37 lxc/main.go:106
+#: lxc/help.go:37 lxc/main.go:114
 #, c-format
 msgid "error: unknown command: %s"
 msgstr ""
 
-#: lxc/launch.go:139
-msgid "got bad version"
-msgstr ""
-
-#: lxc/image.go:202 lxc/image.go:449
+#: lxc/image.go:205 lxc/image.go:535
 msgid "no"
 msgstr ""
 
-#: lxc/copy.go:167
-msgid "not all the profiles from the source exist on the target"
-msgstr ""
-
-#: lxc/remote.go:233
+#: lxc/remote.go:229
 msgid "ok (y/n)?"
 msgstr ""
 
-#: lxc/main.go:331 lxc/main.go:335
+#: lxc/main.go:345 lxc/main.go:349
 #, c-format
 msgid "processing aliases failed %s\n"
 msgstr ""
 
-#: lxc/file.go:381
+#: lxc/file.go:541
 msgid "recursive edit doesn't make sense :("
 msgstr ""
 
-#: lxc/remote.go:421
+#: lxc/remote.go:432
 #, c-format
 msgid "remote %s already exists"
 msgstr ""
 
-#: lxc/remote.go:351 lxc/remote.go:413 lxc/remote.go:448 lxc/remote.go:464
+#: lxc/remote.go:362 lxc/remote.go:424 lxc/remote.go:459 lxc/remote.go:475
 #, c-format
 msgid "remote %s doesn't exist"
 msgstr ""
 
-#: lxc/remote.go:334
+#: lxc/remote.go:345
 #, c-format
 msgid "remote %s exists as <%s>"
 msgstr ""
 
-#: lxc/remote.go:355 lxc/remote.go:417 lxc/remote.go:452
+#: lxc/remote.go:366 lxc/remote.go:428 lxc/remote.go:463
 #, c-format
 msgid "remote %s is static and cannot be modified"
 msgstr ""
 
-#: lxc/info.go:221
+#: lxc/info.go:230
 msgid "stateful"
 msgstr ""
 
-#: lxc/info.go:223
+#: lxc/info.go:232
 msgid "stateless"
 msgstr ""
 
-#: lxc/info.go:217
+#: lxc/info.go:226
 #, c-format
 msgid "taken at %s"
 msgstr ""
 
-#: lxc/exec.go:214
-msgid "unreachable return reached"
-msgstr ""
-
-#: lxc/main.go:262
+#: lxc/main.go:276
 msgid "wrong number of subcommand arguments"
 msgstr ""
 
-#: lxc/delete.go:44 lxc/image.go:200 lxc/image.go:451
+#: lxc/delete.go:45 lxc/image.go:203 lxc/image.go:537
 msgid "yes"
 msgstr ""
-
-#: lxc/copy.go:47
-msgid "you must specify a source container name"
-msgstr ""
diff --git a/po/tr.po b/po/tr.po
index 86608a72f..410358b42 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-06-13 20:10+0200\n"
+"POT-Creation-Date: 2017-06-17 03:18+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -16,7 +16,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: lxc/storage.go:30
+#: lxc/storage.go:31
 msgid ""
 "### This is a yaml representation of a storage pool.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -33,7 +33,7 @@ msgid ""
 "###   zfs.pool_name: default"
 msgstr ""
 
-#: lxc/storage.go:47
+#: lxc/storage.go:48
 msgid ""
 "### This is a yaml representation of a storage volume.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -47,7 +47,7 @@ msgid ""
 "###   size: \"61203283968\""
 msgstr ""
 
-#: lxc/config.go:37
+#: lxc/config.go:39
 msgid ""
 "### This is a yaml representation of the configuration.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -68,7 +68,7 @@ msgid ""
 "### Note that the name is shown but cannot be changed"
 msgstr ""
 
-#: lxc/image.go:59
+#: lxc/image.go:62
 msgid ""
 "### This is a yaml representation of the image properties.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -78,7 +78,7 @@ msgid ""
 "###  description: My custom image"
 msgstr ""
 
-#: lxc/network.go:29
+#: lxc/network.go:30
 msgid ""
 "### This is a yaml representation of the network.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -98,7 +98,7 @@ msgid ""
 "### Note that only the configuration can be changed."
 msgstr ""
 
-#: lxc/profile.go:28
+#: lxc/profile.go:30
 msgid ""
 "### This is a yaml representation of the profile.\n"
 "### Any line starting with a '# will be ignored.\n"
@@ -119,106 +119,130 @@ msgid ""
 "### Note that the name is shown but cannot be changed"
 msgstr ""
 
-#: lxc/image.go:179
+#: lxc/image.go:182
 #, c-format
 msgid "%s (%d more)"
 msgstr ""
 
-#: lxc/snapshot.go:58
+#: lxc/file.go:183
+#, c-format
+msgid "%s is not a directory"
+msgstr ""
+
+#: lxc/file.go:125
+#, c-format
+msgid "'%s' isn't a regular file or directory."
+msgstr ""
+
+#: lxc/snapshot.go:53
 msgid "'/' not allowed in snapshot name"
 msgstr ""
 
-#: lxc/profile.go:293
+#: lxc/profile.go:319
 msgid "(none)"
 msgstr ""
 
-#: lxc/image.go:223 lxc/image.go:814
+#: lxc/image.go:226 lxc/image.go:1052
 msgid "ALIAS"
 msgstr ""
 
-#: lxc/image.go:224
+#: lxc/image.go:227
 msgid "ALIASES"
 msgstr ""
 
-#: lxc/image.go:228
+#: lxc/image.go:231
 msgid "ARCH"
 msgstr ""
 
-#: lxc/list.go:456
+#: lxc/list.go:461
 msgid "ARCHITECTURE"
 msgstr ""
 
-#: lxc/remote.go:66
+#: lxc/remote.go:67
 msgid "Accept certificate"
 msgstr ""
 
-#: lxc/remote.go:282
+#: lxc/remote.go:281
 #, c-format
 msgid "Admin password for %s: "
 msgstr ""
 
-#: lxc/image.go:483
+#: lxc/image.go:569
 msgid "Aliases:"
 msgstr ""
 
-#: lxc/image.go:461 lxc/info.go:95
+#: lxc/image.go:547 lxc/info.go:104
 #, c-format
 msgid "Architecture: %s"
 msgstr ""
 
-#: lxc/image.go:491
+#: lxc/image.go:577
 #, c-format
 msgid "Auto update: %s"
 msgstr ""
 
-#: lxc/info.go:188
+#: lxc/image.go:651
+#, c-format
+msgid "Bad property: %s"
+msgstr ""
+
+#: lxc/info.go:197
 msgid "Bytes received"
 msgstr ""
 
-#: lxc/info.go:189
+#: lxc/info.go:198
 msgid "Bytes sent"
 msgstr ""
 
-#: lxc/config.go:310
+#: lxc/config.go:349
 msgid "COMMON NAME"
 msgstr ""
 
-#: lxc/info.go:152
+#: lxc/info.go:161
 msgid "CPU usage (in seconds)"
 msgstr ""
 
-#: lxc/info.go:156
+#: lxc/info.go:165
 msgid "CPU usage:"
 msgstr ""
 
-#: lxc/list.go:457
+#: lxc/list.go:462
 msgid "CREATED AT"
 msgstr ""
 
-#: lxc/config.go:150 lxc/network.go:496
+#: lxc/file.go:470
+msgid "Can't pull a directory without --recursive"
+msgstr ""
+
+#: lxc/config.go:156 lxc/network.go:542
 #, c-format
 msgid "Can't read from stdin: %s"
 msgstr ""
 
-#: lxc/config.go:163 lxc/config.go:196 lxc/config.go:218
+#: lxc/config.go:169
+#, c-format
+msgid "Can't unset key '%s', it's not currently set"
+msgstr ""
+
+#: lxc/config.go:211 lxc/config.go:237
 #, c-format
 msgid "Can't unset key '%s', it's not currently set."
 msgstr ""
 
-#: lxc/network.go:422 lxc/profile.go:472 lxc/storage.go:579
+#: lxc/network.go:468 lxc/profile.go:528 lxc/storage.go:625
 msgid "Cannot provide container name to list"
 msgstr ""
 
-#: lxc/remote.go:232
+#: lxc/remote.go:228
 #, c-format
 msgid "Certificate fingerprint: %s"
 msgstr ""
 
-#: lxc/remote.go:305
+#: lxc/remote.go:316
 msgid "Client certificate stored at server: "
 msgstr ""
 
-#: lxc/image.go:167 lxc/image.go:168 lxc/list.go:128 lxc/list.go:129
+#: lxc/image.go:170 lxc/image.go:171 lxc/list.go:128 lxc/list.go:129
 msgid "Columns"
 msgstr ""
 
@@ -226,35 +250,35 @@ msgstr ""
 msgid "Commands:"
 msgstr ""
 
-#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:135 lxc/init.go:136
+#: lxc/copy.go:33 lxc/copy.go:34 lxc/init.go:136 lxc/init.go:137
 msgid "Config key/value to apply to the new container"
 msgstr ""
 
-#: lxc/config.go:571 lxc/config.go:636 lxc/image.go:868 lxc/network.go:378
-#: lxc/profile.go:257 lxc/storage.go:535 lxc/storage.go:854
+#: lxc/config.go:647 lxc/config.go:712 lxc/image.go:1107 lxc/network.go:418
+#: lxc/profile.go:267 lxc/storage.go:576 lxc/storage.go:935
 #, c-format
 msgid "Config parsing error: %s"
 msgstr ""
 
-#: lxc/main.go:33
+#: lxc/main.go:35
 msgid "Connection refused; is LXD running?"
 msgstr ""
 
-#: lxc/publish.go:62
+#: lxc/publish.go:71
 msgid "Container name is mandatory"
 msgstr ""
 
-#: lxc/copy.go:143 lxc/copy.go:267 lxc/init.go:244
+#: lxc/copy.go:210 lxc/init.go:313
 #, c-format
 msgid "Container name is: %s"
 msgstr ""
 
-#: lxc/publish.go:160 lxc/publish.go:175
+#: lxc/publish.go:250
 #, c-format
 msgid "Container published with fingerprint: %s"
 msgstr ""
 
-#: lxc/image.go:170
+#: lxc/image.go:173
 msgid "Copy aliases from source"
 msgstr ""
 
@@ -262,85 +286,90 @@ msgstr ""
 msgid "Copy the container without its snapshots"
 msgstr ""
 
-#: lxc/image.go:360
+#: lxc/image.go:422
 #, c-format
 msgid "Copying the image: %s"
 msgstr ""
 
-#: lxc/remote.go:247
+#: lxc/remote.go:243
 msgid "Could not create server cert dir"
 msgstr ""
 
-#: lxc/file.go:67 lxc/file.go:68
+#: lxc/file.go:69 lxc/file.go:70
 msgid "Create any directories necessary"
 msgstr ""
 
-#: lxc/image.go:466 lxc/info.go:97
+#: lxc/image.go:552 lxc/info.go:106
 #, c-format
 msgid "Created: %s"
 msgstr ""
 
-#: lxc/init.go:182 lxc/launch.go:142
+#: lxc/init.go:194
 #, c-format
 msgid "Creating %s"
 msgstr ""
 
-#: lxc/init.go:180
+#: lxc/init.go:192
 msgid "Creating the container"
 msgstr ""
 
-#: lxc/image.go:227 lxc/image.go:816 lxc/list.go:458 lxc/network.go:461
-#: lxc/storage.go:608 lxc/storage.go:697
+#: lxc/image.go:230 lxc/image.go:1054 lxc/list.go:463 lxc/network.go:507
+#: lxc/storage.go:654 lxc/storage.go:749
 msgid "DESCRIPTION"
 msgstr ""
 
-#: lxc/storage.go:609
+#: lxc/storage.go:655
 msgid "DRIVER"
 msgstr ""
 
-#: lxc/publish.go:38
+#: lxc/publish.go:39
 msgid "Define a compression algorithm: for image or none"
 msgstr ""
 
-#: lxc/config.go:688
+#: lxc/config.go:803
 #, c-format
 msgid "Device %s added to %s"
 msgstr ""
 
-#: lxc/config.go:875
+#: lxc/config.go:1037
 #, c-format
 msgid "Device %s removed from %s"
 msgstr ""
 
-#: lxc/exec.go:64
-msgid "Disable pseudo-terminal allocation"
+#: lxc/utils.go:248 lxc/utils.go:272
+#, c-format
+msgid "Device already exists: %s"
 msgstr ""
 
 #: lxc/exec.go:65
+msgid "Disable pseudo-terminal allocation"
+msgstr ""
+
+#: lxc/exec.go:66
 msgid "Disable stdin (reads from /dev/null)"
 msgstr ""
 
-#: lxc/info.go:145
+#: lxc/info.go:154
 msgid "Disk usage:"
 msgstr ""
 
-#: lxc/list.go:609
+#: lxc/list.go:614
 msgid "EPHEMERAL"
 msgstr ""
 
-#: lxc/config.go:312
+#: lxc/config.go:351
 msgid "EXPIRY DATE"
 msgstr ""
 
-#: lxc/main.go:45
+#: lxc/main.go:47
 msgid "Enable debug mode"
 msgstr ""
 
-#: lxc/main.go:44
+#: lxc/main.go:46
 msgid "Enable verbose mode"
 msgstr ""
 
-#: lxc/exec.go:61
+#: lxc/exec.go:62
 msgid "Environment variable to set (e.g. HOME=/home/foo)"
 msgstr ""
 
@@ -348,7 +377,7 @@ msgstr ""
 msgid "Environment:"
 msgstr ""
 
-#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:139 lxc/init.go:140
+#: lxc/copy.go:37 lxc/copy.go:38 lxc/init.go:140 lxc/init.go:141
 msgid "Ephemeral container"
 msgstr ""
 
@@ -356,16 +385,21 @@ msgstr ""
 msgid "Event type to listen for"
 msgstr ""
 
-#: lxc/image.go:470
+#: lxc/image.go:556
 #, c-format
 msgid "Expires: %s"
 msgstr ""
 
-#: lxc/image.go:472
+#: lxc/image.go:558
 msgid "Expires: never"
 msgstr ""
 
-#: lxc/config.go:309 lxc/image.go:225 lxc/image.go:815
+#: lxc/image.go:848
+#, c-format
+msgid "Exporting the image: %s"
+msgstr ""
+
+#: lxc/config.go:348 lxc/image.go:228 lxc/image.go:1053
 msgid "FINGERPRINT"
 msgstr ""
 
@@ -379,16 +413,25 @@ msgstr ""
 msgid "Failed to generate 'lxc.1': %v"
 msgstr ""
 
+#: lxc/copy.go:205
+msgid "Failed to get the new container name"
+msgstr ""
+
+#: lxc/file.go:120
+#, c-format
+msgid "Failed to walk path for %s: %s"
+msgstr ""
+
 #: lxc/list.go:131
 msgid "Fast mode (same as --columns=nsacPt)"
 msgstr ""
 
-#: lxc/image.go:459
+#: lxc/image.go:545
 #, c-format
 msgid "Fingerprint: %s"
 msgstr ""
 
-#: lxc/exec.go:63
+#: lxc/exec.go:64
 msgid "Force pseudo-terminal allocation"
 msgstr ""
 
@@ -396,39 +439,39 @@ msgstr ""
 msgid "Force the container to shutdown"
 msgstr ""
 
-#: lxc/delete.go:33 lxc/delete.go:34
+#: lxc/delete.go:34 lxc/delete.go:35
 msgid "Force the removal of stopped containers"
 msgstr ""
 
-#: lxc/main.go:46
+#: lxc/main.go:48
 msgid "Force using the local unix socket"
 msgstr ""
 
-#: lxc/image.go:173 lxc/list.go:130
+#: lxc/image.go:176 lxc/list.go:130
 msgid "Format (csv|json|table|yaml)"
 msgstr ""
 
-#: lxc/remote.go:80
+#: lxc/remote.go:81
 msgid "Generating a client certificate. This may take a minute..."
 msgstr ""
 
-#: lxc/list.go:454
+#: lxc/list.go:459
 msgid "IPV4"
 msgstr ""
 
-#: lxc/list.go:455
+#: lxc/list.go:460
 msgid "IPV6"
 msgstr ""
 
-#: lxc/config.go:311
+#: lxc/config.go:350
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:139
+#: lxc/main.go:153
 msgid "If this is your first time using LXD, you should also run: lxd init"
 msgstr ""
 
-#: lxc/main.go:47
+#: lxc/main.go:49
 msgid "Ignore aliases when determining what command to run"
 msgstr ""
 
@@ -436,245 +479,229 @@ msgstr ""
 msgid "Ignore the container state (only for start)"
 msgstr ""
 
-#: lxc/image.go:422
+#: lxc/image.go:508
 msgid "Image already up to date."
 msgstr ""
 
-#: lxc/image.go:363
+#: lxc/image.go:436
 msgid "Image copied successfully!"
 msgstr ""
 
-#: lxc/image.go:546 lxc/image.go:558
+#: lxc/image.go:898
+msgid "Image exported successfully!"
+msgstr ""
+
+#: lxc/image.go:709
 #, c-format
 msgid "Image imported with fingerprint: %s"
 msgstr ""
 
-#: lxc/image.go:420
+#: lxc/image.go:506
 msgid "Image refreshed successfully!"
 msgstr ""
 
-#: lxc/image.go:543
-#, c-format
-msgid "Importing the image: %s"
-msgstr ""
-
-#: lxc/remote.go:150
+#: lxc/remote.go:151
 #, c-format
 msgid "Invalid URL scheme \"%s\" in \"%s\""
 msgstr ""
 
-#: lxc/config.go:290
+#: lxc/config.go:329
 msgid "Invalid certificate"
 msgstr ""
 
-#: lxc/init.go:30 lxc/init.go:35
+#: lxc/init.go:31 lxc/init.go:36
 msgid "Invalid configuration key"
 msgstr ""
 
-#: lxc/file.go:357
+#: lxc/file.go:513
 #, c-format
 msgid "Invalid path %s"
 msgstr ""
 
-#: lxc/file.go:291
+#: lxc/file.go:443
 #, c-format
 msgid "Invalid source %s"
 msgstr ""
 
-#: lxc/file.go:80
+#: lxc/file.go:221
 #, c-format
 msgid "Invalid target %s"
 msgstr ""
 
-#: lxc/info.go:126
+#: lxc/info.go:135
 msgid "Ips:"
 msgstr ""
 
-#: lxc/image.go:171
+#: lxc/image.go:174
 msgid "Keep the image up to date after initial copy"
 msgstr ""
 
-#: lxc/list.go:459
+#: lxc/list.go:464
 msgid "LAST USED AT"
 msgstr ""
 
-#: lxc/main.go:31
+#: lxc/main.go:33
 msgid "LXD socket not found; is LXD installed and running?"
 msgstr ""
 
-#: lxc/image.go:475
+#: lxc/image.go:561
 #, c-format
 msgid "Last used: %s"
 msgstr ""
 
-#: lxc/image.go:477
+#: lxc/image.go:563
 msgid "Last used: never"
 msgstr ""
 
-#: lxc/info.go:241
+#: lxc/info.go:250
 msgid "Log:"
 msgstr ""
 
-#: lxc/network.go:460
+#: lxc/network.go:506
 msgid "MANAGED"
 msgstr ""
 
-#: lxc/image.go:169
+#: lxc/image.go:172
 msgid "Make image public"
 msgstr ""
 
-#: lxc/publish.go:34
+#: lxc/publish.go:35
 msgid "Make the image public"
 msgstr ""
 
-#: lxc/info.go:163
+#: lxc/info.go:172
 msgid "Memory (current)"
 msgstr ""
 
-#: lxc/info.go:167
+#: lxc/info.go:176
 msgid "Memory (peak)"
 msgstr ""
 
-#: lxc/info.go:179
+#: lxc/info.go:188
 msgid "Memory usage:"
 msgstr ""
 
-#: lxc/copy.go:276
-#, c-format
-msgid "Migration failed on source host: %s"
-msgstr ""
-
-#: lxc/copy.go:280
-#, c-format
-msgid "Migration failed on target host: %s"
-msgstr ""
-
-#: lxc/utils.go:201
+#: lxc/utils.go:199
 msgid "Missing summary."
 msgstr ""
 
-#: lxc/network.go:248 lxc/network.go:297 lxc/storage.go:362 lxc/storage.go:462
+#: lxc/network.go:276 lxc/network.go:329 lxc/storage.go:374 lxc/storage.go:494
 msgid "More than one device matches, specify the device name."
 msgstr ""
 
-#: lxc/file.go:279
+#: lxc/file.go:431
 msgid "More than one file to download, but target is not a directory"
 msgstr ""
 
-#: lxc/move.go:35
+#: lxc/move.go:38
 msgid "Move the container without its snapshots"
 msgstr ""
 
-#: lxc/action.go:68
+#: lxc/action.go:72
 msgid "Must supply container name for: "
 msgstr ""
 
-#: lxc/list.go:460 lxc/network.go:458 lxc/profile.go:499 lxc/remote.go:395
-#: lxc/storage.go:607 lxc/storage.go:696
+#: lxc/list.go:465 lxc/network.go:504 lxc/profile.go:555 lxc/remote.go:406
+#: lxc/storage.go:653 lxc/storage.go:748
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:444 lxc/remote.go:369 lxc/remote.go:374
+#: lxc/network.go:490 lxc/remote.go:380 lxc/remote.go:385
 msgid "NO"
 msgstr ""
 
-#: lxc/info.go:91
+#: lxc/info.go:99
 #, c-format
 msgid "Name: %s"
 msgstr ""
 
-#: lxc/network.go:222
+#: lxc/network.go:250
 #, c-format
 msgid "Network %s created"
 msgstr ""
 
-#: lxc/network.go:325
+#: lxc/network.go:366
 #, c-format
 msgid "Network %s deleted"
 msgstr ""
 
-#: lxc/init.go:141 lxc/init.go:142
+#: lxc/init.go:142 lxc/init.go:143
 msgid "Network name"
 msgstr ""
 
-#: lxc/info.go:196
+#: lxc/info.go:205
 msgid "Network usage:"
 msgstr ""
 
-#: lxc/image.go:172 lxc/publish.go:35
+#: lxc/image.go:175 lxc/publish.go:36
 msgid "New alias to define at target"
 msgstr ""
 
-#: lxc/config.go:321
+#: lxc/config.go:360
 msgid "No certificate provided to add"
 msgstr ""
 
-#: lxc/network.go:257 lxc/network.go:306
+#: lxc/network.go:285 lxc/network.go:338
 msgid "No device found for this network"
 msgstr ""
 
-#: lxc/storage.go:371 lxc/storage.go:471
+#: lxc/storage.go:383 lxc/storage.go:503
 msgid "No device found for this storage volume."
 msgstr ""
 
-#: lxc/config.go:344
+#: lxc/config.go:392
 msgid "No fingerprint specified."
 msgstr ""
 
-#: lxc/storage.go:323 lxc/storage.go:407
+#: lxc/storage.go:327 lxc/storage.go:420
 msgid "Only \"custom\" volumes can be attached to containers."
 msgstr ""
 
-#: lxc/remote.go:135
+#: lxc/remote.go:136
 msgid "Only https URLs are supported for simplestreams"
 msgstr ""
 
-#: lxc/image.go:549
+#: lxc/image.go:632
 msgid "Only https:// is supported for remote image import."
 msgstr ""
 
-#: lxc/network.go:354 lxc/network.go:482
+#: lxc/network.go:394 lxc/network.go:528
 msgid "Only managed networks can be modified."
 msgstr ""
 
-#: lxc/help.go:71 lxc/main.go:112 lxc/main.go:163
+#: lxc/help.go:71 lxc/main.go:120 lxc/main.go:177
 msgid "Options:"
 msgstr ""
 
-#: lxc/image.go:664
-#, c-format
-msgid "Output is in %s"
-msgstr ""
-
-#: lxc/exec.go:62
+#: lxc/exec.go:63
 msgid "Override the terminal mode (auto, interactive or non-interactive)"
 msgstr ""
 
-#: lxc/list.go:611
+#: lxc/list.go:616
 msgid "PERSISTENT"
 msgstr ""
 
-#: lxc/list.go:461
+#: lxc/list.go:466
 msgid "PID"
 msgstr ""
 
-#: lxc/list.go:462
+#: lxc/list.go:467
 msgid "PROFILES"
 msgstr ""
 
-#: lxc/remote.go:397
+#: lxc/remote.go:408
 msgid "PROTOCOL"
 msgstr ""
 
-#: lxc/image.go:226 lxc/remote.go:398
+#: lxc/image.go:229 lxc/remote.go:409
 msgid "PUBLIC"
 msgstr ""
 
-#: lxc/info.go:190
+#: lxc/info.go:199
 msgid "Packets received"
 msgstr ""
 
-#: lxc/info.go:191
+#: lxc/info.go:200
 msgid "Packets sent"
 msgstr ""
 
@@ -686,24 +713,24 @@ msgstr ""
 msgid "Path to an alternate server directory"
 msgstr ""
 
-#: lxc/main.go:202
+#: lxc/main.go:216
 msgid "Pause containers."
 msgstr ""
 
-#: lxc/main.go:35
+#: lxc/main.go:37
 msgid "Permission denied, are you in the lxd group?"
 msgstr ""
 
-#: lxc/info.go:108
+#: lxc/info.go:117
 #, c-format
 msgid "Pid: %d"
 msgstr ""
 
-#: lxc/network.go:379 lxc/profile.go:258 lxc/storage.go:536 lxc/storage.go:855
+#: lxc/network.go:419 lxc/profile.go:268 lxc/storage.go:577 lxc/storage.go:936
 msgid "Press enter to open the editor again"
 msgstr ""
 
-#: lxc/config.go:572 lxc/config.go:637 lxc/image.go:869
+#: lxc/config.go:648 lxc/config.go:713 lxc/image.go:1108
 msgid "Press enter to start the editor again"
 msgstr ""
 
@@ -719,143 +746,143 @@ msgstr ""
 msgid "Print verbose information"
 msgstr ""
 
-#: lxc/info.go:132
+#: lxc/info.go:141
 #, c-format
 msgid "Processes: %d"
 msgstr ""
 
-#: lxc/profile.go:314
+#: lxc/profile.go:344
 #, c-format
 msgid "Profile %s added to %s"
 msgstr ""
 
-#: lxc/profile.go:209
+#: lxc/profile.go:218
 #, c-format
 msgid "Profile %s created"
 msgstr ""
 
-#: lxc/profile.go:279
+#: lxc/profile.go:292
 #, c-format
 msgid "Profile %s deleted"
 msgstr ""
 
-#: lxc/profile.go:345
+#: lxc/profile.go:379
 #, c-format
 msgid "Profile %s removed from %s"
 msgstr ""
 
-#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:137 lxc/init.go:138
+#: lxc/copy.go:35 lxc/copy.go:36 lxc/init.go:138 lxc/init.go:139
 msgid "Profile to apply to the new container"
 msgstr ""
 
-#: lxc/profile.go:295
+#: lxc/profile.go:321
 #, c-format
 msgid "Profiles %s applied to %s"
 msgstr ""
 
-#: lxc/info.go:106
+#: lxc/info.go:115
 #, c-format
 msgid "Profiles: %s"
 msgstr ""
 
-#: lxc/image.go:479
+#: lxc/image.go:565
 msgid "Properties:"
 msgstr ""
 
-#: lxc/remote.go:69
+#: lxc/remote.go:70
 msgid "Public image server"
 msgstr ""
 
-#: lxc/image.go:462
+#: lxc/image.go:548
 #, c-format
 msgid "Public: %s"
 msgstr ""
 
-#: lxc/file.go:65 lxc/file.go:66
+#: lxc/file.go:67 lxc/file.go:68
 msgid "Recursively push or pull files"
 msgstr ""
 
-#: lxc/image.go:413
+#: lxc/image.go:489
 #, c-format
 msgid "Refreshing the image: %s"
 msgstr ""
 
-#: lxc/remote.go:67
+#: lxc/remote.go:68
 msgid "Remote admin password"
 msgstr ""
 
-#: lxc/info.go:93
+#: lxc/info.go:101
 #, c-format
 msgid "Remote: %s"
 msgstr ""
 
-#: lxc/delete.go:41
+#: lxc/delete.go:42
 #, c-format
 msgid "Remove %s (yes/no): "
 msgstr ""
 
-#: lxc/delete.go:35 lxc/delete.go:36
+#: lxc/delete.go:36 lxc/delete.go:37
 msgid "Require user confirmation"
 msgstr ""
 
-#: lxc/info.go:129
+#: lxc/info.go:138
 msgid "Resources:"
 msgstr ""
 
-#: lxc/main.go:210
+#: lxc/main.go:224
 msgid "Restart containers."
 msgstr ""
 
-#: lxc/init.go:253
+#: lxc/init.go:286
 #, c-format
 msgid "Retrieving image: %s"
 msgstr ""
 
-#: lxc/image.go:229
+#: lxc/image.go:232
 msgid "SIZE"
 msgstr ""
 
-#: lxc/list.go:463
+#: lxc/list.go:468
 msgid "SNAPSHOTS"
 msgstr ""
 
-#: lxc/storage.go:610
+#: lxc/storage.go:656
 msgid "SOURCE"
 msgstr ""
 
-#: lxc/list.go:464
+#: lxc/list.go:469
 msgid "STATE"
 msgstr ""
 
-#: lxc/remote.go:399
+#: lxc/remote.go:410
 msgid "STATIC"
 msgstr ""
 
-#: lxc/list.go:466
+#: lxc/list.go:471
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/remote.go:240
+#: lxc/remote.go:236
 msgid "Server certificate NACKed by user"
 msgstr ""
 
-#: lxc/remote.go:302
+#: lxc/remote.go:313
 msgid "Server doesn't trust us after adding our cert"
 msgstr ""
 
-#: lxc/remote.go:68
+#: lxc/remote.go:69
 msgid "Server protocol (lxd or simplestreams)"
 msgstr ""
 
-#: lxc/file.go:63
+#: lxc/file.go:65
 msgid "Set the file's gid on push"
 msgstr ""
 
-#: lxc/file.go:64
+#: lxc/file.go:66
 msgid "Set the file's perms on push"
 msgstr ""
 
-#: lxc/file.go:62
+#: lxc/file.go:64
 msgid "Set the file's uid on push"
 msgstr ""
 
@@ -867,78 +894,83 @@ msgstr ""
 msgid "Show client version"
 msgstr ""
 
-#: lxc/info.go:38
+#: lxc/info.go:39
 msgid "Show the container's last 100 log lines?"
 msgstr ""
 
-#: lxc/config.go:33
+#: lxc/config.go:35
 msgid "Show the expanded configuration"
 msgstr ""
 
-#: lxc/image.go:460
+#: lxc/image.go:546
 #, c-format
 msgid "Size: %.2fMB"
 msgstr ""
 
-#: lxc/info.go:210
+#: lxc/info.go:219
 msgid "Snapshots:"
 msgstr ""
 
-#: lxc/action.go:134
+#: lxc/action.go:142
 #, c-format
 msgid "Some containers failed to %s"
 msgstr ""
 
-#: lxc/image.go:493
+#: lxc/image.go:579
 msgid "Source:"
 msgstr ""
 
-#: lxc/main.go:220
+#: lxc/main.go:234
 msgid "Start containers."
 msgstr ""
 
-#: lxc/launch.go:152
+#: lxc/launch.go:59
 #, c-format
 msgid "Starting %s"
 msgstr ""
 
-#: lxc/info.go:100
+#: lxc/info.go:109
 #, c-format
 msgid "Status: %s"
 msgstr ""
 
-#: lxc/main.go:226
+#: lxc/main.go:240
 msgid "Stop containers."
 msgstr ""
 
-#: lxc/publish.go:36 lxc/publish.go:37
+#: lxc/publish.go:37 lxc/publish.go:38
 msgid "Stop the container if currently running"
 msgstr ""
 
-#: lxc/delete.go:105 lxc/publish.go:114
+#: lxc/publish.go:136
 msgid "Stopping container failed!"
 msgstr ""
 
-#: lxc/storage.go:436
+#: lxc/delete.go:121
+#, c-format
+msgid "Stopping the container failed: %s"
+msgstr ""
+
+#: lxc/storage.go:468
 #, c-format
 msgid "Storage pool %s created"
 msgstr ""
 
-#: lxc/storage.go:486
+#: lxc/storage.go:527
 #, c-format
 msgid "Storage pool %s deleted"
 msgstr ""
 
-#: lxc/init.go:143 lxc/init.go:144
+#: lxc/init.go:144 lxc/init.go:145
 msgid "Storage pool name"
 msgstr ""
 
-#: lxc/storage.go:720
+#: lxc/storage.go:782
 #, c-format
 msgid "Storage volume %s created"
 msgstr ""
 
-#: lxc/storage.go:730
+#: lxc/storage.go:797
 #, c-format
 msgid "Storage volume %s deleted"
 msgstr ""
@@ -947,38 +979,42 @@ msgstr ""
 msgid "Store the container state (only for stop)"
 msgstr ""
 
-#: lxc/info.go:171
+#: lxc/info.go:180
 msgid "Swap (current)"
 msgstr ""
 
-#: lxc/info.go:175
+#: lxc/info.go:184
 msgid "Swap (peak)"
 msgstr ""
 
-#: lxc/list.go:465 lxc/network.go:459 lxc/storage.go:695
+#: lxc/list.go:470 lxc/network.go:505 lxc/storage.go:747
 msgid "TYPE"
 msgstr ""
 
-#: lxc/delete.go:91
+#: lxc/delete.go:105
 msgid "The container is currently running, stop it first or pass --force."
 msgstr ""
 
-#: lxc/publish.go:92
+#: lxc/publish.go:101
 msgid ""
 "The container is currently running. Use --force to have it stopped and "
 "restarted."
 msgstr ""
 
-#: lxc/init.go:326
+#: lxc/init.go:358
 msgid "The container you are starting doesn't have any network attached to it."
 msgstr ""
 
-#: lxc/config.go:716 lxc/config.go:728 lxc/config.go:761 lxc/config.go:779
-#: lxc/config.go:817 lxc/config.go:835
+#: lxc/config.go:770 lxc/config.go:787
+msgid "The device already exists"
+msgstr ""
+
+#: lxc/config.go:833 lxc/config.go:845 lxc/config.go:881 lxc/config.go:899
+#: lxc/config.go:945 lxc/config.go:962 lxc/config.go:1006 lxc/config.go:1022
 msgid "The device doesn't exist"
 msgstr ""
 
-#: lxc/init.go:310
+#: lxc/init.go:342
 #, c-format
 msgid "The local image '%s' couldn't be found, trying '%s:' instead."
 msgstr ""
@@ -987,15 +1023,15 @@ msgstr ""
 msgid "The opposite of \"lxc pause\" is \"lxc start\"."
 msgstr ""
 
-#: lxc/network.go:262 lxc/network.go:311 lxc/storage.go:376 lxc/storage.go:476
+#: lxc/network.go:290 lxc/network.go:343 lxc/storage.go:388 lxc/storage.go:508
 msgid "The specified device doesn't exist"
 msgstr ""
 
-#: lxc/network.go:266 lxc/network.go:315
+#: lxc/network.go:294 lxc/network.go:347
 msgid "The specified device doesn't match the network"
 msgstr ""
 
-#: lxc/publish.go:65
+#: lxc/publish.go:74
 msgid "There is no \"image name\".  Did you want an alias?"
 msgstr ""
 
@@ -1011,49 +1047,49 @@ msgstr ""
 msgid "Time to wait for the container before killing it"
 msgstr ""
 
-#: lxc/image.go:463
+#: lxc/image.go:549
 msgid "Timestamps:"
 msgstr ""
 
-#: lxc/init.go:328
+#: lxc/init.go:360
 msgid "To attach a network to a container, use: lxc network attach"
 msgstr ""
 
-#: lxc/init.go:327
+#: lxc/init.go:359
 msgid "To create a new network, use: lxc network create"
 msgstr ""
 
-#: lxc/main.go:140
+#: lxc/main.go:154
 msgid "To start your first container, try: lxc launch ubuntu:16.04"
 msgstr ""
 
-#: lxc/image.go:551
+#: lxc/image.go:657
 #, c-format
 msgid "Transferring image: %s"
 msgstr ""
 
-#: lxc/action.go:98 lxc/launch.go:165
+#: lxc/action.go:106 lxc/launch.go:77
 #, c-format
 msgid "Try `lxc info --show-log %s` for more info"
 msgstr ""
 
-#: lxc/info.go:102
+#: lxc/info.go:111
 msgid "Type: ephemeral"
 msgstr ""
 
-#: lxc/info.go:104
+#: lxc/info.go:113
 msgid "Type: persistent"
 msgstr ""
 
-#: lxc/image.go:230
+#: lxc/image.go:233
 msgid "UPLOAD DATE"
 msgstr ""
 
-#: lxc/remote.go:396
+#: lxc/remote.go:407
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:462 lxc/profile.go:500 lxc/storage.go:611 lxc/storage.go:698
+#: lxc/network.go:508 lxc/profile.go:556 lxc/storage.go:657 lxc/storage.go:750
 msgid "USED BY"
 msgstr ""
 
@@ -1061,11 +1097,16 @@ msgstr ""
 msgid "Unable to find help2man."
 msgstr ""
 
-#: lxc/remote.go:110
+#: lxc/remote.go:111
 msgid "Unable to read remote TLS certificate"
 msgstr ""
 
-#: lxc/image.go:468
+#: lxc/file.go:108
+#, c-format
+msgid "Unknown file type '%s'"
+msgstr ""
+
+#: lxc/image.go:554
 #, c-format
 msgid "Uploaded: %s"
 msgstr ""
@@ -1082,7 +1123,7 @@ msgstr ""
 msgid "Usage: lxc <command> [options]"
 msgstr ""
 
-#: lxc/config.go:58
+#: lxc/config.go:60
 msgid ""
 "Usage: lxc config <subcommand> [options]\n"
 "\n"
@@ -1168,7 +1209,7 @@ msgid ""
 "Copy containers within or in between LXD instances."
 msgstr ""
 
-#: lxc/delete.go:26
+#: lxc/delete.go:27
 msgid ""
 "Usage: lxc delete [<remote>:]<container>[/<snapshot>] "
 "[[<remote>:]<container>[/<snapshot>]...]\n"
@@ -1176,7 +1217,7 @@ msgid ""
 "Delete containers and snapshots."
 msgstr ""
 
-#: lxc/exec.go:52
+#: lxc/exec.go:53
 msgid ""
 "Usage: lxc exec [<remote>:]<container> [-t] [-T] [-n] [--mode=auto|"
 "interactive|non-interactive] [--env KEY=VALUE...] [--] <command line>\n"
@@ -1187,7 +1228,7 @@ msgid ""
 "AND stdout are terminals (stderr is ignored)."
 msgstr ""
 
-#: lxc/file.go:36
+#: lxc/file.go:38
 msgid ""
 "Usage: lxc file <subcommand> [options]\n"
 "\n"
@@ -1231,7 +1272,7 @@ msgid ""
 "Help page for the LXD client."
 msgstr ""
 
-#: lxc/image.go:69
+#: lxc/image.go:72
 msgid ""
 "Usage: lxc image <subcommand> [options]\n"
 "\n"
@@ -1336,7 +1377,7 @@ msgid ""
 "image alias name."
 msgstr ""
 
-#: lxc/info.go:25
+#: lxc/info.go:26
 msgid ""
 "Usage: lxc info [<remote>:][<container>] [--show-log]\n"
 "\n"
@@ -1349,7 +1390,7 @@ msgid ""
 "    For LXD server information."
 msgstr ""
 
-#: lxc/init.go:75
+#: lxc/init.go:76
 msgid ""
 "Usage: lxc init [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--"
 "profile|-p <profile>...] [--config|-c <key=value>...] [--network|-n "
@@ -1364,7 +1405,7 @@ msgid ""
 "    lxc init ubuntu:16.04 u1"
 msgstr ""
 
-#: lxc/launch.go:23
+#: lxc/launch.go:20
 msgid ""
 "Usage: lxc launch [<remote>:]<image> [<remote>:][<name>] [--ephemeral|-e] [--"
 "profile|-p <profile>...] [--config|-c <key=value>...] [--network|-n "
@@ -1493,7 +1534,7 @@ msgid ""
 "    Only show log message."
 msgstr ""
 
-#: lxc/move.go:19
+#: lxc/move.go:22
 msgid ""
 "Usage: lxc move [<remote>:]<container>[/<snapshot>] [<remote>:][<container>[/"
 "<snapshot>]] [--container-only]\n"
@@ -1512,7 +1553,7 @@ msgid ""
 "    Rename a snapshot."
 msgstr ""
 
-#: lxc/network.go:49
+#: lxc/network.go:50
 msgid ""
 "Usage: lxc network <subcommand> [options]\n"
 "\n"
@@ -1565,7 +1606,7 @@ msgid ""
 "    Update a network using the content of network.yaml"
 msgstr ""
 
-#: lxc/profile.go:49
+#: lxc/profile.go:51
 msgid ""
 "Usage: lxc profile <subcommand> [options]\n"
 "\n"
@@ -1647,7 +1688,7 @@ msgid ""
 "    Remove all profile from \"foo\""
 msgstr ""
 
-#: lxc/publish.go:27
+#: lxc/publish.go:28
 msgid ""
 "Usage: lxc publish [<remote>:]<container>[/<snapshot>] [<remote>:] [--"
 "alias=ALIAS...] [prop-key=prop-value...]\n"
@@ -1655,7 +1696,7 @@ msgid ""
 "Publish containers as images."
 msgstr ""
 
-#: lxc/remote.go:38
+#: lxc/remote.go:39
 msgid ""
 "Usage: lxc remote <subcommand> [options]\n"
 "\n"
@@ -1684,7 +1725,7 @@ msgid ""
 "    Print the default remote."
 msgstr ""
 
-#: lxc/restore.go:21
+#: lxc/restore.go:22
 msgid ""
 "Usage: lxc restore [<remote>:]<container> <snapshot> [--stateful]\n"
 "\n"
@@ -1700,7 +1741,7 @@ msgid ""
 "    Restore the snapshot."
 msgstr ""
 
-#: lxc/snapshot.go:21
+#: lxc/snapshot.go:22
 msgid ""
 "Usage: lxc snapshot [<remote>:]<container> <snapshot name> [--stateful]\n"
 "\n"
@@ -1714,7 +1755,7 @@ msgid ""
 "    Create a snapshot of \"u1\" called \"snap0\"."
 msgstr ""
 
-#: lxc/storage.go:61
+#: lxc/storage.go:62
 msgid ""
 "Usage: lxc storage <subcommand> [options]\n"
 "\n"
@@ -1814,157 +1855,128 @@ msgid ""
 "Print the version number of this client tool."
 msgstr ""
 
-#: lxc/delete.go:45
+#: lxc/delete.go:46
 msgid "User aborted delete operation."
 msgstr ""
 
-#: lxc/restore.go:37
+#: lxc/restore.go:38
 msgid ""
 "Whether or not to restore the container's running state from snapshot (if "
 "available)"
 msgstr ""
 
-#: lxc/snapshot.go:35
+#: lxc/snapshot.go:36
 msgid "Whether or not to snapshot the container's running state"
 msgstr ""
 
-#: lxc/network.go:446 lxc/remote.go:371 lxc/remote.go:376
+#: lxc/network.go:492 lxc/remote.go:382 lxc/remote.go:387
 msgid "YES"
 msgstr ""
 
-#: lxc/exec.go:125
+#: lxc/exec.go:126
 msgid "You can't pass -t and -T at the same time"
 msgstr ""
 
-#: lxc/exec.go:129
+#: lxc/exec.go:130
 msgid "You can't pass -t or -T at the same time as --mode"
 msgstr ""
 
-#: lxc/main.go:56
-msgid "`lxc config profile` is deprecated, please use `lxc profile`"
-msgstr ""
-
-#: lxc/launch.go:134
-msgid "bad number of things scanned from image, container or snapshot"
-msgstr ""
-
-#: lxc/action.go:94
-msgid "bad result type from action"
+#: lxc/copy.go:57
+msgid "You must specify a source container name"
 msgstr ""
 
-#: lxc/copy.go:118
-msgid "can't copy to the same container name"
-msgstr ""
-
-#: lxc/file.go:314
-msgid "can't pull a directory without --recursive"
+#: lxc/main.go:58
+msgid "`lxc config profile` is deprecated, please use `lxc profile`"
 msgstr ""
 
-#: lxc/remote.go:359
+#: lxc/remote.go:370
 msgid "can't remove the default remote"
 msgstr ""
 
-#: lxc/file.go:125
+#: lxc/file.go:269
 msgid "can't supply uid/gid/mode in recursive mode"
 msgstr ""
 
-#: lxc/remote.go:385
+#: lxc/remote.go:396
 msgid "default"
 msgstr ""
 
-#: lxc/copy.go:134 lxc/copy.go:139 lxc/copy.go:258 lxc/copy.go:263
-#: lxc/init.go:234 lxc/init.go:239 lxc/launch.go:115 lxc/launch.go:121
+#: lxc/init.go:308
 msgid "didn't get any affected image, container or snapshot from server"
 msgstr ""
 
-#: lxc/image.go:454
+#: lxc/image.go:540
 msgid "disabled"
 msgstr ""
 
-#: lxc/image.go:456
+#: lxc/image.go:542
 msgid "enabled"
 msgstr ""
 
-#: lxc/action.go:126 lxc/main.go:26 lxc/main.go:159
+#: lxc/action.go:134 lxc/main.go:28 lxc/main.go:173
 #, c-format
 msgid "error: %v"
 msgstr ""
 
-#: lxc/help.go:37 lxc/main.go:106
+#: lxc/help.go:37 lxc/main.go:114
 #, c-format
 msgid "error: unknown command: %s"
 msgstr ""
 
-#: lxc/launch.go:139
-msgid "got bad version"
-msgstr ""
-
-#: lxc/image.go:202 lxc/image.go:449
+#: lxc/image.go:205 lxc/image.go:535
 msgid "no"
 msgstr ""
 
-#: lxc/copy.go:167
-msgid "not all the profiles from the source exist on the target"
-msgstr ""
-
-#: lxc/remote.go:233
+#: lxc/remote.go:229
 msgid "ok (y/n)?"
 msgstr ""
 
-#: lxc/main.go:331 lxc/main.go:335
+#: lxc/main.go:345 lxc/main.go:349
 #, c-format
 msgid "processing aliases failed %s\n"
 msgstr ""
 
-#: lxc/file.go:381
+#: lxc/file.go:541
 msgid "recursive edit doesn't make sense :("
 msgstr ""
 
-#: lxc/remote.go:421
+#: lxc/remote.go:432
 #, c-format
 msgid "remote %s already exists"
 msgstr ""
 
-#: lxc/remote.go:351 lxc/remote.go:413 lxc/remote.go:448 lxc/remote.go:464
+#: lxc/remote.go:362 lxc/remote.go:424 lxc/remote.go:459 lxc/remote.go:475
 #, c-format
 msgid "remote %s doesn't exist"
 msgstr ""
 
-#: lxc/remote.go:334
+#: lxc/remote.go:345
 #, c-format
 msgid "remote %s exists as <%s>"
 msgstr ""
 
-#: lxc/remote.go:355 lxc/remote.go:417 lxc/remote.go:452
+#: lxc/remote.go:366 lxc/remote.go:428 lxc/remote.go:463
 #, c-format
 msgid "remote %s is static and cannot be modified"
 msgstr ""
 
-#: lxc/info.go:221
+#: lxc/info.go:230
 msgid "stateful"
 msgstr ""
 
-#: lxc/info.go:223
+#: lxc/info.go:232
 msgid "stateless"
 msgstr ""
 
-#: lxc/info.go:217
+#: lxc/info.go:226
 #, c-format
 msgid "taken at %s"
 msgstr ""
 
-#: lxc/exec.go:214
-msgid "unreachable return reached"
-msgstr ""
-
-#: lxc/main.go:262
+#: lxc/main.go:276
 msgid "wrong number of subcommand arguments"
 msgstr ""
 
-#: lxc/delete.go:44 lxc/image.go:200 lxc/image.go:451
+#: lxc/delete.go:45 lxc/image.go:203 lxc/image.go:537
 msgid "yes"
 msgstr ""
-
-#: lxc/copy.go:47
-msgid "you must specify a source container name"
-msgstr ""

From 859ef42d7adbd98623cb1535e00dee3c69151009 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Fri, 16 Jun 2017 23:50:31 -0400
Subject: [PATCH 26/28] Revert "config: Implement temporary Legacy function"
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

This reverts commit 713cb1b0ce913040ce7cea1de6cc82d595b6e826.

This was only needed during the port and can be now reverted.
Keeping around so that the individual commits can still be built which
would make bisection easier.

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxc/config/legacy.go | 31 -------------------------------
 1 file changed, 31 deletions(-)
 delete mode 100644 lxc/config/legacy.go

diff --git a/lxc/config/legacy.go b/lxc/config/legacy.go
deleted file mode 100644
index d286f1f03..000000000
--- a/lxc/config/legacy.go
+++ /dev/null
@@ -1,31 +0,0 @@
-package config
-
-import (
-	"github.com/lxc/lxd"
-)
-
-// Legacy returns a legacy *lxd.Config
-func (c *Config) Legacy() *lxd.Config {
-	conf := &lxd.Config{
-		DefaultRemote: c.DefaultRemote,
-		Aliases:       c.Aliases,
-		ConfigDir:     c.ConfigDir,
-	}
-
-	remotes := map[string]lxd.RemoteConfig{}
-
-	for k, v := range c.Remotes {
-		remote := lxd.RemoteConfig{
-			Addr:     v.Addr,
-			Public:   v.Public,
-			Protocol: v.Protocol,
-			Static:   v.Static,
-		}
-
-		remotes[k] = remote
-	}
-
-	conf.Remotes = remotes
-
-	return conf
-}

From 6ae38754b5b11a4db307ba47288ff75d8d330da0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Fri, 16 Jun 2017 23:56:24 -0400
Subject: [PATCH 27/28] Add deprecation warning for old client library
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 client.go | 4 ++++
 1 file changed, 4 insertions(+)

diff --git a/client.go b/client.go
index 77a3890bb..8353335a0 100644
--- a/client.go
+++ b/client.go
@@ -1,5 +1,9 @@
 package lxd
 
+// DEPRECATED: This package is now deprecated in favor of github.com/lxc/lxd/client
+//
+// This package will be entirely removed from the code tree with LXD 2.16
+
 import (
 	"bytes"
 	"crypto/x509"

From 48782b7ae2d1af0d3594a89fa0368b6a03d619e2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Fri, 16 Jun 2017 23:58:19 -0400
Subject: [PATCH 28/28] client: Drop experimental tag from new client
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 client/doc.go | 9 ---------
 1 file changed, 9 deletions(-)

diff --git a/client/doc.go b/client/doc.go
index f54f5b9db..f2de23949 100644
--- a/client/doc.go
+++ b/client/doc.go
@@ -1,14 +1,5 @@
 // Package lxd implements a client for the LXD API
 //
-// Warning
-//
-// This API isn't considered STABLE yet!
-//
-// This client library is planned to become the new supported Go library
-// for LXD which will come with guaranteed API stability. New functions and
-// struct arguments may be added over time but no existing signature or
-// type will be changed and structs will only gain new members.
-//
 // Overview
 //
 // This package lets you connect to LXD daemons or SimpleStream image


More information about the lxc-devel mailing list