[lxc-devel] [lxd/master] Network: Adds initial project support to networks

tomponline on Github lxc-bot at linuxcontainers.org
Thu Aug 27 13:14:28 UTC 2020


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 622 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20200827/779068d7/attachment-0001.bin>
-------------- next part --------------
From 7c2a9c5867671e59377eaa09a518f63bd0498f75 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:23:12 +0100
Subject: [PATCH 01/63] lxd/instance/instance/interface: Moves Project()
 function into ConfigReader interface

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/instance/instance_interface.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lxd/instance/instance_interface.go b/lxd/instance/instance_interface.go
index e03db25bfb..f0c117f6e7 100644
--- a/lxd/instance/instance_interface.go
+++ b/lxd/instance/instance_interface.go
@@ -33,6 +33,7 @@ const (
 
 // ConfigReader is used to read instance config.
 type ConfigReader interface {
+	Project() string
 	Type() instancetype.Type
 	ExpandedConfig() map[string]string
 	ExpandedDevices() deviceConfig.Devices
@@ -99,7 +100,6 @@ type Instance interface {
 	// Properties.
 	ID() int
 	Location() string
-	Project() string
 	Name() string
 	Description() string
 	Architecture() int

From 716ef9bbe88dcbca794f6b71d0ee00a95ca21d9f Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:29:28 +0100
Subject: [PATCH 02/63] lxd/instance/drivers/driver/common: Adds Project
 function

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/instance/drivers/driver_common.go | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/lxd/instance/drivers/driver_common.go b/lxd/instance/drivers/driver_common.go
index cceb455fc9..27d0fd1c81 100644
--- a/lxd/instance/drivers/driver_common.go
+++ b/lxd/instance/drivers/driver_common.go
@@ -20,6 +20,11 @@ type common struct {
 	state           *state.State
 }
 
+// Project returns instance's project.
+func (c *common) Project() string {
+	return c.project
+}
+
 // Type returns the instance's type.
 func (c *common) Type() instancetype.Type {
 	return c.dbType

From 75cffc9456e907f43829f78b5b292bf8f52642b9 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:24:48 +0100
Subject: [PATCH 03/63] lxd/instance/drivers/driver/lxc: Updates lxc to use
 common fields

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/instance/drivers/driver_lxc.go | 40 ++++++++++++++----------------
 1 file changed, 19 insertions(+), 21 deletions(-)

diff --git a/lxd/instance/drivers/driver_lxc.go b/lxd/instance/drivers/driver_lxc.go
index bc4669a06b..768b536b8b 100644
--- a/lxd/instance/drivers/driver_lxc.go
+++ b/lxd/instance/drivers/driver_lxc.go
@@ -143,22 +143,24 @@ func lxcStatusCode(state liblxc.State) api.StatusCode {
 func lxcCreate(s *state.State, args db.InstanceArgs) (instance.Instance, error) {
 	// Create the container struct
 	c := &lxc{
-		state:        s,
+		common: common{
+			dbType:       args.Type,
+			localConfig:  args.Config,
+			localDevices: args.Devices,
+			project:      args.Project,
+			state:        s,
+			profiles:     args.Profiles,
+		},
 		id:           args.ID,
-		project:      args.Project,
 		name:         args.Name,
 		node:         args.Node,
 		description:  args.Description,
 		ephemeral:    args.Ephemeral,
 		architecture: args.Architecture,
-		dbType:       args.Type,
 		snapshot:     args.Snapshot,
 		stateful:     args.Stateful,
 		creationDate: args.CreationDate,
 		lastUsedDate: args.LastUsedDate,
-		profiles:     args.Profiles,
-		localConfig:  args.Config,
-		localDevices: args.Devices,
 		expiryDate:   args.ExpiryDate,
 	}
 
@@ -399,20 +401,22 @@ func lxcUnload(c *lxc) {
 // Create a container struct without initializing it.
 func lxcInstantiate(s *state.State, args db.InstanceArgs, expandedDevices deviceConfig.Devices) instance.Instance {
 	c := &lxc{
-		state:        s,
+		common: common{
+			dbType:       args.Type,
+			localConfig:  args.Config,
+			localDevices: args.Devices,
+			project:      args.Project,
+			state:        s,
+			profiles:     args.Profiles,
+		},
 		id:           args.ID,
-		project:      args.Project,
 		name:         args.Name,
 		description:  args.Description,
 		ephemeral:    args.Ephemeral,
 		architecture: args.Architecture,
-		dbType:       args.Type,
 		snapshot:     args.Snapshot,
 		creationDate: args.CreationDate,
 		lastUsedDate: args.LastUsedDate,
-		profiles:     args.Profiles,
-		localConfig:  args.Config,
-		localDevices: args.Devices,
 		stateful:     args.Stateful,
 		node:         args.Node,
 		expiryDate:   args.ExpiryDate,
@@ -441,32 +445,26 @@ func lxcInstantiate(s *state.State, args db.InstanceArgs, expandedDevices device
 
 // The LXC container driver.
 type lxc struct {
+	common
+
 	// Properties
 	architecture int
-	dbType       instancetype.Type
 	snapshot     bool
 	creationDate time.Time
 	lastUsedDate time.Time
 	ephemeral    bool
 	id           int
-	project      string
 	name         string
 	description  string
 	stateful     bool
 
 	// Config
-	expandedConfig  map[string]string
-	expandedDevices deviceConfig.Devices
-	fromHook        bool
-	localConfig     map[string]string
-	localDevices    deviceConfig.Devices
-	profiles        []string
+	fromHook bool
 
 	// Cache
 	c       *liblxc.Container
 	cConfig bool
 
-	state    *state.State
 	idmapset *idmap.IdmapSet
 
 	// Storage

From c6fdfccc7e039d9a44f53329ccc4e3fbdebdba10 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:27:11 +0100
Subject: [PATCH 04/63] lxd/instance/drivers/driver/lxc: Removes driver
 specific Project function

Not needed as in common.

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/instance/drivers/driver_lxc.go | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/lxd/instance/drivers/driver_lxc.go b/lxd/instance/drivers/driver_lxc.go
index 768b536b8b..196e70cdbc 100644
--- a/lxd/instance/drivers/driver_lxc.go
+++ b/lxd/instance/drivers/driver_lxc.go
@@ -6727,11 +6727,6 @@ func (c *lxc) Location() string {
 	return c.node
 }
 
-// Project returns instance project.
-func (c *lxc) Project() string {
-	return c.project
-}
-
 // Name returns instance name.
 func (c *lxc) Name() string {
 	return c.name

From 36e40026915a953314ee766f1ed5b8f56d05e0a2 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:28:46 +0100
Subject: [PATCH 05/63] lxd/instance/drivers/driver/qemu: Removes driver
 specific Project function

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/instance/drivers/driver_qemu.go | 5 -----
 1 file changed, 5 deletions(-)

diff --git a/lxd/instance/drivers/driver_qemu.go b/lxd/instance/drivers/driver_qemu.go
index 90cb7045f5..1d14ca7555 100644
--- a/lxd/instance/drivers/driver_qemu.go
+++ b/lxd/instance/drivers/driver_qemu.go
@@ -4282,11 +4282,6 @@ func (vm *qemu) Location() string {
 	return vm.node
 }
 
-// Project returns instance's project.
-func (vm *qemu) Project() string {
-	return vm.project
-}
-
 // Name returns the instance's name.
 func (vm *qemu) Name() string {
 	return vm.name

From 578cfc68b50e223c01febd10465d4b657e8c76a3 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Thu, 27 Aug 2020 13:35:22 +0100
Subject: [PATCH 06/63] lxd/network/network/utils: Improves UpdateDNSMasqStatic
 error message

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/network/network_utils.go | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/lxd/network/network_utils.go b/lxd/network/network_utils.go
index b4757742d3..36ea1420b8 100644
--- a/lxd/network/network_utils.go
+++ b/lxd/network/network_utils.go
@@ -324,8 +324,9 @@ func UpdateDNSMasqStatic(s *state.State, networkName string) error {
 
 		n, err := LoadByName(s, network)
 		if err != nil {
-			return err
+			return errors.Wrapf(err, "Failed to load network %q in project %q for dnsmasq update", project.Default, network)
 		}
+
 		config := n.Config()
 
 		// Wipe everything clean.

From 4fd8c97c4c4a7930029fdf81d50974a86bf6b9d5 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Thu, 27 Aug 2020 12:26:47 +0100
Subject: [PATCH 07/63] lxd/db/cluster/update: Adds features.networks to
 default project

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/db/cluster/update.go | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/lxd/db/cluster/update.go b/lxd/db/cluster/update.go
index cf7bf3f008..e87bcda50a 100644
--- a/lxd/db/cluster/update.go
+++ b/lxd/db/cluster/update.go
@@ -72,6 +72,13 @@ var updates = map[int]schema.Update{
 	33: updateFromV32,
 	34: updateFromV33,
 	35: updateFromV34,
+	36: updateFromV35,
+}
+
+// Attempt to add missing project features.networks feature to default project.
+func updateFromV35(tx *sql.Tx) error {
+	tx.Exec("INSERT INTO projects_config (project_id, key, value) VALUES (1, 'features.networks', 'true');")
+	return nil
 }
 
 // Remove multiple entries of the same volume when using remote storage.

From 3e24e11d2b2106f3aaa3289bbab7c43cf13dcd56 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Wed, 19 Aug 2020 15:12:32 +0100
Subject: [PATCH 08/63] lxd/project: Adds NetworkProject function

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/project/project.go | 29 +++++++++++++++++++++++++++++
 1 file changed, 29 insertions(+)

diff --git a/lxd/project/project.go b/lxd/project/project.go
index 3d923d0d95..7a00bd8516 100644
--- a/lxd/project/project.go
+++ b/lxd/project/project.go
@@ -98,3 +98,32 @@ func StorageVolumeProject(c *db.Cluster, projectName string, volumeType int) (st
 
 	return Default, nil
 }
+
+// NetworkProject returns the project name to use for the network based on the requested project.
+// If the project specified has the "features.networks" flag enabled then the project name is returned,
+// otherwise the default project name is returned.
+func NetworkProject(c *db.Cluster, projectName string) (string, error) {
+	var project *api.Project
+	var err error
+
+	err = c.Transaction(func(tx *db.ClusterTx) error {
+		project, err = tx.GetProject(projectName)
+		if err != nil {
+			return err
+		}
+
+		return nil
+	})
+
+	if err != nil {
+		return "", errors.Wrapf(err, "Failed to load project %q", projectName)
+	}
+
+	// Networks only use the project specified if the project has the features.networks feature enabled,
+	// otherwise the legacy behaviour of using the default project for networks is used.
+	if shared.IsTrue(project.Config["features.networks"]) {
+		return projectName, nil
+	}
+
+	return Default, nil
+}

From bb60dc9140f53270fe00076d102e19ae3a5e206d Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:17:02 +0100
Subject: [PATCH 09/63] lxd/db/networks: Updates networkState and usage to
 support projects

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/db/networks.go | 30 +++++++++++++++---------------
 1 file changed, 15 insertions(+), 15 deletions(-)

diff --git a/lxd/db/networks.go b/lxd/db/networks.go
index c41c06fc3b..e23a7a56af 100644
--- a/lxd/db/networks.go
+++ b/lxd/db/networks.go
@@ -301,18 +301,18 @@ func (c *ClusterTx) CreatePendingNetwork(node string, projectName string, name s
 }
 
 // NetworkCreated sets the state of the given network to "Created".
-func (c *ClusterTx) NetworkCreated(name string) error {
-	return c.networkState(name, networkCreated)
+func (c *ClusterTx) NetworkCreated(project string, name string) error {
+	return c.networkState(project, name, networkCreated)
 }
 
 // NetworkErrored sets the state of the given network to "Errored".
-func (c *ClusterTx) NetworkErrored(name string) error {
-	return c.networkState(name, networkErrored)
+func (c *ClusterTx) NetworkErrored(project string, name string) error {
+	return c.networkState(project, name, networkErrored)
 }
 
-func (c *ClusterTx) networkState(name string, state int) error {
-	stmt := "UPDATE networks SET state=? WHERE name=?"
-	result, err := c.tx.Exec(stmt, state, name)
+func (c *ClusterTx) networkState(project string, name string, state int) error {
+	stmt := "UPDATE networks SET state=? WHERE project_id = (SELECT id FROM projects WHERE name = ?) AND name=?"
+	result, err := c.tx.Exec(stmt, state, project, name)
 	if err != nil {
 		return err
 	}
@@ -363,22 +363,22 @@ func (c *ClusterTx) networkNodes(networkID int64) ([]string, error) {
 }
 
 // GetNetworks returns the names of existing networks.
-func (c *Cluster) GetNetworks() ([]string, error) {
-	return c.networks("")
+func (c *Cluster) GetNetworks(project string) ([]string, error) {
+	return c.networks(project, "")
 }
 
 // GetNonPendingNetworks returns the names of all networks that are not pending.
-func (c *Cluster) GetNonPendingNetworks() ([]string, error) {
-	return c.networks("NOT state=?", networkPending)
+func (c *Cluster) GetNonPendingNetworks(project string) ([]string, error) {
+	return c.networks(project, "NOT state=?", networkPending)
 }
 
 // Get all networks matching the given WHERE filter (if given).
-func (c *Cluster) networks(where string, args ...interface{}) ([]string, error) {
-	q := "SELECT name FROM networks"
-	inargs := []interface{}{}
+func (c *Cluster) networks(project string, where string, args ...interface{}) ([]string, error) {
+	q := "SELECT name FROM networks WHERE project_id = (SELECT id FROM projects WHERE name = ?)"
+	inargs := []interface{}{project}
 
 	if where != "" {
-		q += fmt.Sprintf(" WHERE %s", where)
+		q += fmt.Sprintf(" AND %s", where)
 		for _, arg := range args {
 			inargs = append(inargs, arg)
 		}

From fedaf7d75ec3ff4b92e7370f3a4ebf289606de02 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:17:25 +0100
Subject: [PATCH 10/63] lxd/db/networks: Updates getNetwork and usage to
 support projects

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/db/networks.go | 24 ++++++++++++------------
 1 file changed, 12 insertions(+), 12 deletions(-)

diff --git a/lxd/db/networks.go b/lxd/db/networks.go
index e23a7a56af..d5e63919bf 100644
--- a/lxd/db/networks.go
+++ b/lxd/db/networks.go
@@ -420,20 +420,20 @@ const (
 // GetNetworkInAnyState returns the network with the given name.
 //
 // The network can be in any state.
-func (c *Cluster) GetNetworkInAnyState(name string) (int64, *api.Network, error) {
-	return c.getNetwork(name, false)
+func (c *Cluster) GetNetworkInAnyState(project string, name string) (int64, *api.Network, error) {
+	return c.getNetwork(project, name, false)
 }
 
 // Get the network with the given name. If onlyCreated is true, only return
 // networks in the created state.
-func (c *Cluster) getNetwork(name string, onlyCreated bool) (int64, *api.Network, error) {
+func (c *Cluster) getNetwork(project string, name string, onlyCreated bool) (int64, *api.Network, error) {
 	description := sql.NullString{}
 	id := int64(-1)
 	state := 0
 	var netType NetworkType
 
-	q := "SELECT id, description, state, type FROM networks WHERE name=?"
-	arg1 := []interface{}{name}
+	q := "SELECT id, description, state, type FROM networks WHERE project_id = (SELECT id FROM projects WHERE name = ?) AND name=?"
+	arg1 := []interface{}{project, name}
 	arg2 := []interface{}{&id, &description, &state, &netType}
 	if onlyCreated {
 		q += " AND state=?"
@@ -648,8 +648,8 @@ func (c *Cluster) CreateNetwork(projectName string, name string, description str
 }
 
 // UpdateNetwork updates the network with the given name.
-func (c *Cluster) UpdateNetwork(name, description string, config map[string]string) error {
-	id, netInfo, err := c.GetNetworkInAnyState(name)
+func (c *Cluster) UpdateNetwork(project string, name, description string, config map[string]string) error {
+	id, netInfo, err := c.GetNetworkInAnyState(project, name)
 	if err != nil {
 		return err
 	}
@@ -662,7 +662,7 @@ func (c *Cluster) UpdateNetwork(name, description string, config map[string]stri
 
 		// Update network status if change applied successfully.
 		if netInfo.Status == api.NetworkStatusErrored {
-			err = tx.NetworkCreated(name)
+			err = tx.NetworkCreated(project, name)
 			if err != nil {
 				return err
 			}
@@ -722,8 +722,8 @@ func clearNetworkConfig(tx *sql.Tx, networkID, nodeID int64) error {
 }
 
 // DeleteNetwork deletes the network with the given name.
-func (c *Cluster) DeleteNetwork(name string) error {
-	id, _, err := c.GetNetworkInAnyState(name)
+func (c *Cluster) DeleteNetwork(project string, name string) error {
+	id, _, err := c.GetNetworkInAnyState(project, name)
 	if err != nil {
 		return err
 	}
@@ -737,8 +737,8 @@ func (c *Cluster) DeleteNetwork(name string) error {
 }
 
 // RenameNetwork renames a network.
-func (c *Cluster) RenameNetwork(oldName string, newName string) error {
-	id, _, err := c.GetNetworkInAnyState(oldName)
+func (c *Cluster) RenameNetwork(project string, oldName string, newName string) error {
+	id, _, err := c.GetNetworkInAnyState(project, oldName)
 	if err != nil {
 		return err
 	}

From f257449474a7f54c344f7e827f32b50683aa02b9 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:52:15 +0100
Subject: [PATCH 11/63] lxd/network/network/utils: Updates IsInUseByInstance to
 translate instance's project to a network project

Then matches the instance's network project against the requested network's project.

If they don't match then we consider this instance not in use by the requested network because its devices must be referencing a network in a different project.

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/network/network_utils.go | 16 ++++++++++++++--
 1 file changed, 14 insertions(+), 2 deletions(-)

diff --git a/lxd/network/network_utils.go b/lxd/network/network_utils.go
index 36ea1420b8..b7de5be920 100644
--- a/lxd/network/network_utils.go
+++ b/lxd/network/network_utils.go
@@ -70,8 +70,20 @@ func networkValidPort(value string) error {
 
 // IsInUseByInstance indicates if network is referenced by an instance's NIC devices.
 // Checks if the device's parent or network properties match the network name.
-func IsInUseByInstance(s *state.State, c instance.Instance, networkName string) (bool, error) {
-	return isInUseByDevices(s, c.ExpandedDevices(), networkName)
+func IsInUseByInstance(s *state.State, inst instance.Instance, networkProjectName string, networkName string) (bool, error) {
+	// Get the translated network project name from the instance's project.
+	instNetworkProjectName, err := project.NetworkProject(s.Cluster, inst.Project())
+	if err != nil {
+		return false, err
+	}
+
+	// Skip instances who's translated network project doesn't match the requested network's project.
+	// Because its devices can't be using this network.
+	if networkProjectName != instNetworkProjectName {
+		return false, nil
+	}
+
+	return isInUseByDevices(s, networkProjectName, networkName, inst.ExpandedDevices())
 }
 
 // IsInUseByProfile indicates if network is referenced by a profile's NIC devices.

From 35d93d326011ca825296db5ff3a8da68d7b0e1f6 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:54:59 +0100
Subject: [PATCH 12/63] lxd/network/network/utils: Updates isInUseByDevices to
 support projects

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/network/network_utils.go | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lxd/network/network_utils.go b/lxd/network/network_utils.go
index b7de5be920..858a9dd2d7 100644
--- a/lxd/network/network_utils.go
+++ b/lxd/network/network_utils.go
@@ -92,13 +92,13 @@ func IsInUseByProfile(s *state.State, profile api.Profile, networkName string) (
 	return isInUseByDevices(s, deviceConfig.NewDevices(profile.Devices), networkName)
 }
 
-func isInUseByDevices(s *state.State, devices deviceConfig.Devices, networkName string) (bool, error) {
+func isInUseByDevices(s *state.State, networkProjectName string, networkName string, devices deviceConfig.Devices) (bool, error) {
 	for _, d := range devices {
 		if d["type"] != "nic" {
 			continue
 		}
 
-		nicType, err := nictype.NICType(s, d)
+		nicType, err := nictype.NICType(s, networkProjectName, d)
 		if err != nil {
 			return false, err
 		}

From 62573c4595e265098fea6a2a9bf3a2186950c1e7 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:55:35 +0100
Subject: [PATCH 13/63] lxd/network/network/utils: Updates IsInUseByProfile to
 accept a db.Profile rather than api.Profile

This allows Profile's project to be used to be translated to a network project for comparison against the specified network's project.

If they don't match then the profile's devices are considered not in use by this network as the devices must be referencing a network in a different project.

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/network/network_utils.go | 17 +++++++++++++++--
 1 file changed, 15 insertions(+), 2 deletions(-)

diff --git a/lxd/network/network_utils.go b/lxd/network/network_utils.go
index 858a9dd2d7..29ef10a76a 100644
--- a/lxd/network/network_utils.go
+++ b/lxd/network/network_utils.go
@@ -17,6 +17,7 @@ import (
 
 	"github.com/pkg/errors"
 
+	"github.com/lxc/lxd/lxd/db"
 	deviceConfig "github.com/lxc/lxd/lxd/device/config"
 	"github.com/lxc/lxd/lxd/device/nictype"
 	"github.com/lxc/lxd/lxd/dnsmasq"
@@ -88,8 +89,20 @@ func IsInUseByInstance(s *state.State, inst instance.Instance, networkProjectNam
 
 // IsInUseByProfile indicates if network is referenced by a profile's NIC devices.
 // Checks if the device's parent or network properties match the network name.
-func IsInUseByProfile(s *state.State, profile api.Profile, networkName string) (bool, error) {
-	return isInUseByDevices(s, deviceConfig.NewDevices(profile.Devices), networkName)
+func IsInUseByProfile(s *state.State, profile db.Profile, networkProjectName string, networkName string) (bool, error) {
+	// Get the translated network project name from the profiles's project.
+	profileNetworkProjectName, err := project.NetworkProject(s.Cluster, profile.Project)
+	if err != nil {
+		return false, err
+	}
+
+	// Skip profiles who's translated network project doesn't match the requested network's project.
+	// Because its devices can't be using this network.
+	if networkProjectName != profileNetworkProjectName {
+		return false, nil
+	}
+
+	return isInUseByDevices(s, networkProjectName, networkName, deviceConfig.NewDevices(profile.Devices))
 }
 
 func isInUseByDevices(s *state.State, networkProjectName string, networkName string, devices deviceConfig.Devices) (bool, error) {

From b701b002f7b186a54dda019daaa9fb0870b1eeb1 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:57:24 +0100
Subject: [PATCH 14/63] lxd/network/network/utils: Updates UpdateDNSMasqStatic
 to use default project

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/network/network_utils.go | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/lxd/network/network_utils.go b/lxd/network/network_utils.go
index 29ef10a76a..fe20a408fc 100644
--- a/lxd/network/network_utils.go
+++ b/lxd/network/network_utils.go
@@ -268,7 +268,9 @@ func UpdateDNSMasqStatic(s *state.State, networkName string) error {
 	var networks []string
 	if networkName == "" {
 		var err error
-		networks, err = s.Cluster.GetNetworks()
+
+		// Pass project.Default here, as currently dnsmasq (bridged) networks do not support projects.
+		networks, err = s.Cluster.GetNetworks(project.Default)
 		if err != nil {
 			return err
 		}
@@ -292,7 +294,7 @@ func UpdateDNSMasqStatic(s *state.State, networkName string) error {
 				continue
 			}
 
-			nicType, err := nictype.NICType(s, d)
+			nicType, err := nictype.NICType(s, inst.Project(), d)
 			if err != nil || nicType != "bridged" {
 				continue
 			}
@@ -347,7 +349,8 @@ func UpdateDNSMasqStatic(s *state.State, networkName string) error {
 			continue
 		}
 
-		n, err := LoadByName(s, network)
+		// Pass project.Default here, as currently dnsmasq (bridged) networks do not support projects.
+		n, err := LoadByName(s, project.Default, network)
 		if err != nil {
 			return errors.Wrapf(err, "Failed to load network %q in project %q for dnsmasq update", project.Default, network)
 		}

From dd73602bd6ad2cdc3b6290b0d1804240d9dede95 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:57:42 +0100
Subject: [PATCH 15/63] lxd/network/network/utils: Updates GetLeaseAddresses to
 use default project

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/network/network_utils.go | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/lxd/network/network_utils.go b/lxd/network/network_utils.go
index fe20a408fc..5ac251f211 100644
--- a/lxd/network/network_utils.go
+++ b/lxd/network/network_utils.go
@@ -730,7 +730,8 @@ func GetLeaseAddresses(s *state.State, networkName string, hwaddr string) ([]api
 		return addresses, nil
 	}
 
-	dbInfo, err := LoadByName(s, networkName)
+	// Pass project.Default here, as currently dnsmasq (bridged) networks do not support projects.
+	dbInfo, err := LoadByName(s, project.Default, networkName)
 	if err != nil {
 		return nil, err
 	}

From db35fdec5efd59a1fdeb278abbef3059719a76f3 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:58:22 +0100
Subject: [PATCH 16/63] lxd/network/driver/common: Updates IsInUseByInstance
 and IsInUseByProfile to support projects

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/network/driver_common.go | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lxd/network/driver_common.go b/lxd/network/driver_common.go
index 41197225f6..3169b0ea3c 100644
--- a/lxd/network/driver_common.go
+++ b/lxd/network/driver_common.go
@@ -133,7 +133,7 @@ func (n *common) IsUsed() (bool, error) {
 	}
 
 	for _, inst := range insts {
-		inUse, err := IsInUseByInstance(n.state, inst, n.name)
+		inUse, err := IsInUseByInstance(n.state, inst, n.project, n.name)
 		if err != nil {
 			return false, err
 		}
@@ -158,7 +158,7 @@ func (n *common) IsUsed() (bool, error) {
 	}
 
 	for _, profile := range profiles {
-		inUse, err := IsInUseByProfile(n.state, *db.ProfileToAPI(&profile), n.name)
+		inUse, err := IsInUseByProfile(n.state, profile, n.project, n.name)
 		if err != nil {
 			return false, err
 		}

From 8e3eba95c335c3efdbda53248477445e04971bd9 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Wed, 19 Aug 2020 14:45:57 +0100
Subject: [PATCH 17/63] lxd/network/driver/bridge: Adds existing interface
 check as Create function

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/network/driver_bridge.go | 11 +++++++++++
 1 file changed, 11 insertions(+)

diff --git a/lxd/network/driver_bridge.go b/lxd/network/driver_bridge.go
index 8ef1e612e4..14f7350f29 100644
--- a/lxd/network/driver_bridge.go
+++ b/lxd/network/driver_bridge.go
@@ -378,6 +378,17 @@ func (n *bridge) Validate(config map[string]string) error {
 	return nil
 }
 
+// Create checks whether the bridge interface name is used already.
+func (n *bridge) Create(clientType cluster.ClientType) error {
+	n.logger.Debug("Create", log.Ctx{"clientType": clientType, "config": n.config})
+
+	if shared.PathExists(fmt.Sprintf("/sys/class/net/%s", n.name)) {
+		return fmt.Errorf("Network interface %q already exists", n.name)
+	}
+
+	return nil
+}
+
 // isRunning returns whether the network is up.
 func (n *bridge) isRunning() bool {
 	return shared.PathExists(fmt.Sprintf("/sys/class/net/%s", n.name))

From 06fb7c229801cdd2ae186da0f9094e85e97003e0 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Wed, 19 Aug 2020 14:46:35 +0100
Subject: [PATCH 18/63] lxd/network/driver/bridge: Push down interface name
 conflict check to Rename

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/network/driver_bridge.go | 12 +++---------
 1 file changed, 3 insertions(+), 9 deletions(-)

diff --git a/lxd/network/driver_bridge.go b/lxd/network/driver_bridge.go
index 14f7350f29..addbc65447 100644
--- a/lxd/network/driver_bridge.go
+++ b/lxd/network/driver_bridge.go
@@ -419,14 +419,8 @@ func (n *bridge) Delete(clientType cluster.ClientType) error {
 func (n *bridge) Rename(newName string) error {
 	n.logger.Debug("Rename", log.Ctx{"newName": newName})
 
-	// Sanity checks.
-	inUse, err := n.IsUsed()
-	if err != nil {
-		return err
-	}
-
-	if inUse {
-		return fmt.Errorf("The network is currently in use")
+	if shared.PathExists(fmt.Sprintf("/sys/class/net/%s", newName)) {
+		return fmt.Errorf("Network interface %q already exists", newName)
 	}
 
 	// Bring the network down.
@@ -447,7 +441,7 @@ func (n *bridge) Rename(newName string) error {
 	}
 
 	// Rename common steps.
-	err = n.common.rename(newName)
+	err := n.common.rename(newName)
 	if err != nil {
 		return err
 	}

From 959b46421870fe99ce5728d28f9e38486aef97b5 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Wed, 19 Aug 2020 14:47:00 +0100
Subject: [PATCH 19/63] lxd/network/driver: Removes duplicated "in use" check
 that is now done at top level

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/network/driver_macvlan.go | 12 +-----------
 lxd/network/driver_ovn.go     | 12 +-----------
 lxd/network/driver_sriov.go   | 12 +-----------
 3 files changed, 3 insertions(+), 33 deletions(-)

diff --git a/lxd/network/driver_macvlan.go b/lxd/network/driver_macvlan.go
index 5798f06c65..7593eb82db 100644
--- a/lxd/network/driver_macvlan.go
+++ b/lxd/network/driver_macvlan.go
@@ -43,18 +43,8 @@ func (n *macvlan) Delete(clientType cluster.ClientType) error {
 func (n *macvlan) Rename(newName string) error {
 	n.logger.Debug("Rename", log.Ctx{"newName": newName})
 
-	// Sanity checks.
-	inUse, err := n.IsUsed()
-	if err != nil {
-		return err
-	}
-
-	if inUse {
-		return fmt.Errorf("The network is currently in use")
-	}
-
 	// Rename common steps.
-	err = n.common.rename(newName)
+	err := n.common.rename(newName)
 	if err != nil {
 		return err
 	}
diff --git a/lxd/network/driver_ovn.go b/lxd/network/driver_ovn.go
index 4066ee366c..59e1575d54 100644
--- a/lxd/network/driver_ovn.go
+++ b/lxd/network/driver_ovn.go
@@ -1123,18 +1123,8 @@ func (n *ovn) Delete(clientType cluster.ClientType) error {
 func (n *ovn) Rename(newName string) error {
 	n.logger.Debug("Rename", log.Ctx{"newName": newName})
 
-	// Sanity checks.
-	inUse, err := n.IsUsed()
-	if err != nil {
-		return err
-	}
-
-	if inUse {
-		return fmt.Errorf("The network is currently in use")
-	}
-
 	// Rename common steps.
-	err = n.common.rename(newName)
+	err := n.common.rename(newName)
 	if err != nil {
 		return err
 	}
diff --git a/lxd/network/driver_sriov.go b/lxd/network/driver_sriov.go
index 034ede797a..6bcbec7557 100644
--- a/lxd/network/driver_sriov.go
+++ b/lxd/network/driver_sriov.go
@@ -43,18 +43,8 @@ func (n *sriov) Delete(clientType cluster.ClientType) error {
 func (n *sriov) Rename(newName string) error {
 	n.logger.Debug("Rename", log.Ctx{"newName": newName})
 
-	// Sanity checks.
-	inUse, err := n.IsUsed()
-	if err != nil {
-		return err
-	}
-
-	if inUse {
-		return fmt.Errorf("The network is currently in use")
-	}
-
 	// Rename common steps.
-	err = n.common.rename(newName)
+	err := n.common.rename(newName)
 	if err != nil {
 		return err
 	}

From 8f99073c415ccd23391b1665561fc8f8ebf7dba1 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 09:59:08 +0100
Subject: [PATCH 20/63] lxd/profiles/utils: Renames project arg to projectName
 in doProfileUpdate

And updates usage of ValidDevices() by passing projectName to it.

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/profiles_utils.go | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/lxd/profiles_utils.go b/lxd/profiles_utils.go
index 672d584d10..c82a7d3dda 100644
--- a/lxd/profiles_utils.go
+++ b/lxd/profiles_utils.go
@@ -13,10 +13,10 @@ import (
 	"github.com/pkg/errors"
 )
 
-func doProfileUpdate(d *Daemon, project, name string, id int64, profile *api.Profile, req api.ProfilePut) error {
+func doProfileUpdate(d *Daemon, projectName string, name string, id int64, profile *api.Profile, req api.ProfilePut) error {
 	// Check project limits.
 	err := d.cluster.Transaction(func(tx *db.ClusterTx) error {
-		return projecthelpers.AllowProfileUpdate(tx, project, name, req)
+		return projecthelpers.AllowProfileUpdate(tx, projectName, name, req)
 	})
 	if err != nil {
 		return err
@@ -29,12 +29,12 @@ func doProfileUpdate(d *Daemon, project, name string, id int64, profile *api.Pro
 	}
 
 	// At this point we don't know the instance type, so just use instancetype.Any type for validation.
-	err = instance.ValidDevices(d.State(), d.cluster, instancetype.Any, deviceConfig.NewDevices(req.Devices), false)
+	err = instance.ValidDevices(d.State(), d.cluster, projectName, instancetype.Any, deviceConfig.NewDevices(req.Devices), false)
 	if err != nil {
 		return err
 	}
 
-	containers, err := getProfileContainersInfo(d.cluster, project, name)
+	containers, err := getProfileContainersInfo(d.cluster, projectName, name)
 	if err != nil {
 		return errors.Wrapf(err, "failed to query instances associated with profile '%s'", name)
 	}
@@ -77,8 +77,8 @@ func doProfileUpdate(d *Daemon, project, name string, id int64, profile *api.Pro
 
 	// Update the database
 	err = d.cluster.Transaction(func(tx *db.ClusterTx) error {
-		return tx.UpdateProfile(project, name, db.Profile{
-			Project:     project,
+		return tx.UpdateProfile(projectName, name, db.Profile{
+			Project:     projectName,
 			Name:        name,
 			Description: req.Description,
 			Config:      req.Config,

From 89c28b0055fabc34e5df68ba1c34ea6ac5bc3108 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:00:10 +0100
Subject: [PATCH 21/63] lxd/profiles: Updates usage of ValidDevices in
 profilesPost

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/profiles.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lxd/profiles.go b/lxd/profiles.go
index 7783ecb5d2..2cba1eefa7 100644
--- a/lxd/profiles.go
+++ b/lxd/profiles.go
@@ -111,7 +111,7 @@ func profilesPost(d *Daemon, r *http.Request) response.Response {
 	}
 
 	// At this point we don't know the instance type, so just use instancetype.Any type for validation.
-	err = instance.ValidDevices(d.State(), d.cluster, instancetype.Any, deviceConfig.NewDevices(req.Devices), false)
+	err = instance.ValidDevices(d.State(), d.cluster, projectName, instancetype.Any, deviceConfig.NewDevices(req.Devices), false)
 	if err != nil {
 		return response.BadRequest(err)
 	}

From d84928d860c6f5a5dbad50a2970624b99ba5e1ef Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:00:58 +0100
Subject: [PATCH 22/63] lxd/patches: Updates to support network projects

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/patches.go | 15 ++++++++++-----
 1 file changed, 10 insertions(+), 5 deletions(-)

diff --git a/lxd/patches.go b/lxd/patches.go
index 65d61031a1..a5d849721f 100644
--- a/lxd/patches.go
+++ b/lxd/patches.go
@@ -298,7 +298,8 @@ func patchInvalidProfileNames(name string, d *Daemon) error {
 
 func patchNetworkPermissions(name string, d *Daemon) error {
 	// Get the list of networks
-	networks, err := d.cluster.GetNetworks()
+	// Pass project.Default, as networks didn't support projects here.
+	networks, err := d.cluster.GetNetworks(project.Default)
 	if err != nil {
 		return err
 	}
@@ -2660,7 +2661,8 @@ func patchStorageZFSVolumeSize(name string, d *Daemon) error {
 
 func patchNetworkDnsmasqHosts(name string, d *Daemon) error {
 	// Get the list of networks
-	networks, err := d.cluster.GetNetworks()
+	// Pass project.Default, as dnsmasq (bridge) networks don't support projects.
+	networks, err := d.cluster.GetNetworks(project.Default)
 	if err != nil {
 		return err
 	}
@@ -3447,21 +3449,24 @@ func patchClusteringDropDatabaseRole(name string, d *Daemon) error {
 
 // patchNetworkCearBridgeVolatileHwaddr removes the unsupported `volatile.bridge.hwaddr` config key from networks.
 func patchNetworkCearBridgeVolatileHwaddr(name string, d *Daemon) error {
+	// Use project.Default, as bridge networks don't support projects.
+	projectName := project.Default
+
 	// Get the list of networks.
-	networks, err := d.cluster.GetNetworks()
+	networks, err := d.cluster.GetNetworks(projectName)
 	if err != nil {
 		return errors.Wrapf(err, "Failed loading networks for network_clear_bridge_volatile_hwaddr patch")
 	}
 
 	for _, networkName := range networks {
-		_, net, err := d.cluster.GetNetworkInAnyState(networkName)
+		_, net, err := d.cluster.GetNetworkInAnyState(projectName, networkName)
 		if err != nil {
 			return errors.Wrapf(err, "Failed loading network %q for network_clear_bridge_volatile_hwaddr patch", networkName)
 		}
 
 		if net.Config["volatile.bridge.hwaddr"] != "" {
 			delete(net.Config, "volatile.bridge.hwaddr")
-			err = d.cluster.UpdateNetwork(net.Name, net.Description, net.Config)
+			err = d.cluster.UpdateNetwork(projectName, net.Name, net.Description, net.Config)
 			if err != nil {
 				return errors.Wrapf(err, "Failed updating network %q for network_clear_bridge_volatile_hwaddr patch", networkName)
 			}

From 947028383ec40416b6871c58346362b4197a500b Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:01:23 +0100
Subject: [PATCH 23/63] lxd/networks/utils: Removes networkGetInterfaces
 function

Now we have virtual networks we need to differentiate between interface names and network names.

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/networks_utils.go | 26 --------------------------
 1 file changed, 26 deletions(-)

diff --git a/lxd/networks_utils.go b/lxd/networks_utils.go
index ecda29c599..b568b66521 100644
--- a/lxd/networks_utils.go
+++ b/lxd/networks_utils.go
@@ -41,32 +41,6 @@ func networkAutoAttach(cluster *db.Cluster, devName string) error {
 	return network.AttachInterface(dbInfo.Name, devName)
 }
 
-func networkGetInterfaces(cluster *db.Cluster) ([]string, error) {
-	networks, err := cluster.GetNetworks()
-	if err != nil {
-		return nil, err
-	}
-
-	ifaces, err := net.Interfaces()
-	if err != nil {
-		return nil, err
-	}
-
-	for _, iface := range ifaces {
-		// Ignore veth pairs (for performance reasons)
-		if strings.HasPrefix(iface.Name, "veth") {
-			continue
-		}
-
-		// Append to the list
-		if !shared.StringInSlice(iface.Name, networks) {
-			networks = append(networks, iface.Name)
-		}
-	}
-
-	return networks, nil
-}
-
 // networkUpdateForkdnsServersTask runs every 30s and refreshes the forkdns servers list.
 func networkUpdateForkdnsServersTask(s *state.State, heartbeatData *cluster.APIHeartbeat) error {
 	// Get a list of managed networks

From 6d565870c703dc244a4134e048d4e70b47e612f1 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:02:19 +0100
Subject: [PATCH 24/63] lxd/networks/utils: Updates
 networkUpdateForkdnsServersTask to support projects

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/networks_utils.go | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/lxd/networks_utils.go b/lxd/networks_utils.go
index b568b66521..dc8e834353 100644
--- a/lxd/networks_utils.go
+++ b/lxd/networks_utils.go
@@ -11,6 +11,7 @@ import (
 	"github.com/lxc/lxd/lxd/cluster"
 	"github.com/lxc/lxd/lxd/db"
 	"github.com/lxc/lxd/lxd/network"
+	"github.com/lxc/lxd/lxd/project"
 	"github.com/lxc/lxd/lxd/state"
 	"github.com/lxc/lxd/shared"
 	"github.com/lxc/lxd/shared/api"
@@ -43,16 +44,19 @@ func networkAutoAttach(cluster *db.Cluster, devName string) error {
 
 // networkUpdateForkdnsServersTask runs every 30s and refreshes the forkdns servers list.
 func networkUpdateForkdnsServersTask(s *state.State, heartbeatData *cluster.APIHeartbeat) error {
+	// Use project.Default here as forkdns (fan bridge) networks don't support projects.
+	projectName := project.Default
+
 	// Get a list of managed networks
-	networks, err := s.Cluster.GetNonPendingNetworks()
+	networks, err := s.Cluster.GetNonPendingNetworks(projectName)
 	if err != nil {
 		return err
 	}
 
 	for _, name := range networks {
-		n, err := network.LoadByName(s, name)
+		n, err := network.LoadByName(s, projectName, name)
 		if err != nil {
-			logger.Errorf("Failed to load network %q for heartbeat", name)
+			logger.Errorf("Failed to load network %q from project %q for heartbeat", name, projectName)
 			continue
 		}
 

From 6a40a30c15f9d0aa314e0bcc6c3078ee7c826129 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Wed, 19 Aug 2020 14:43:24 +0100
Subject: [PATCH 25/63] lxd/networks: Updates networkPost validation

 - Moves "in use" check up from drivers, to reduce duplicate in per-driver Rename() functions.
 - Relaxes new name checks to only check for existing managed networks of the same name, removes checks for conflicting interface names (this only needs to be applied to bridge type networks and will be pushed down into bridge driver).
 - General clean up of comments and error messages.

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/networks.go | 32 +++++++++++++++++++++++---------
 1 file changed, 23 insertions(+), 9 deletions(-)

diff --git a/lxd/networks.go b/lxd/networks.go
index df4f027f33..490d772d19 100644
--- a/lxd/networks.go
+++ b/lxd/networks.go
@@ -573,28 +573,32 @@ func networkPost(d *Daemon, r *http.Request) response.Response {
 		return response.SmartError(err)
 	}
 	if clustered {
-		return response.BadRequest(fmt.Errorf("Renaming a network not supported in LXD clusters"))
+		return response.BadRequest(fmt.Errorf("Renaming clustered network not supported"))
 	}
 
 	name := mux.Vars(r)["name"]
 	req := api.NetworkPost{}
 	state := d.State()
 
-	// Parse the request
+	// Parse the request.
 	err = json.NewDecoder(r.Body).Decode(&req)
 	if err != nil {
 		return response.BadRequest(err)
 	}
 
-	// Get the existing network
+	// Get the existing network.
 	n, err := network.LoadByName(state, name)
 	if err != nil {
-		return response.NotFound(err)
+		if err == db.ErrNoSuchObject {
+			return response.NotFound(fmt.Errorf("Network not found"))
+		}
+
+		return response.InternalError(errors.Wrapf(err, "Failed loading network"))
 	}
 
-	// Sanity checks
+	// Sanity check new name.
 	if req.Name == "" {
-		return response.BadRequest(fmt.Errorf("No name provided"))
+		return response.BadRequest(fmt.Errorf("New network name not provided"))
 	}
 
 	err = network.ValidateName(req.Name, n.Type())
@@ -602,8 +606,18 @@ func networkPost(d *Daemon, r *http.Request) response.Response {
 		return response.BadRequest(err)
 	}
 
-	// Check that the name isn't already in use
-	networks, err := networkGetInterfaces(d.cluster)
+	// Check network isn't in use.
+	inUse, err := n.IsUsed()
+	if err != nil {
+		return response.InternalError(errors.Wrapf(err, "Failed checking network in use"))
+	}
+
+	if inUse {
+		return response.BadRequest(fmt.Errorf("Network is currently in use"))
+	}
+
+	// Check that the name isn't already in used by an existing managed network.
+	networks, err := d.cluster.GetNetworks()
 	if err != nil {
 		return response.InternalError(err)
 	}
@@ -612,7 +626,7 @@ func networkPost(d *Daemon, r *http.Request) response.Response {
 		return response.Conflict(fmt.Errorf("Network %q already exists", req.Name))
 	}
 
-	// Rename it
+	// Rename it.
 	err = n.Rename(req.Name)
 	if err != nil {
 		return response.SmartError(err)

From 13ad3d68f69e6ca848b1cf493120c2499fb12e3c Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:04:07 +0100
Subject: [PATCH 26/63] lxd/networks: Updates networksGet to support projects

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/networks.go | 34 ++++++++++++++++++++++++++++++----
 1 file changed, 30 insertions(+), 4 deletions(-)

diff --git a/lxd/networks.go b/lxd/networks.go
index 490d772d19..166445fbad 100644
--- a/lxd/networks.go
+++ b/lxd/networks.go
@@ -66,20 +66,46 @@ var networkStateCmd = APIEndpoint{
 
 // API endpoints
 func networksGet(d *Daemon, r *http.Request) response.Response {
+	projectName, err := project.NetworkProject(d.State().Cluster, projectParam(r))
+	if err != nil {
+		return response.SmartError(err)
+	}
+
 	recursion := util.IsRecursionRequest(r)
 
-	ifs, err := networkGetInterfaces(d.cluster)
+	// Get list of managed networks (that may or may not have network interfaces on the host).
+	networks, err := d.cluster.GetNetworks(projectName)
 	if err != nil {
 		return response.InternalError(err)
 	}
 
+	// Get list of actual network interfaces on the host as well if the network's project is Default.
+	if projectName == project.Default {
+		ifaces, err := net.Interfaces()
+		if err != nil {
+			return response.InternalError(err)
+		}
+
+		for _, iface := range ifaces {
+			// Ignore veth pairs (for performance reasons).
+			if strings.HasPrefix(iface.Name, "veth") {
+				continue
+			}
+
+			// Append to the list of networks if a managed network of same name doesn't exist.
+			if !shared.StringInSlice(iface.Name, networks) {
+				networks = append(networks, iface.Name)
+			}
+		}
+	}
+
 	resultString := []string{}
 	resultMap := []api.Network{}
-	for _, iface := range ifs {
+	for _, network := range networks {
 		if !recursion {
-			resultString = append(resultString, fmt.Sprintf("/%s/networks/%s", version.APIVersion, iface))
+			resultString = append(resultString, fmt.Sprintf("/%s/networks/%s", version.APIVersion, network))
 		} else {
-			net, err := doNetworkGet(d, iface)
+			net, err := doNetworkGet(d, projectName, network)
 			if err != nil {
 				continue
 			}

From 842abbce0ccc7b4f36d75f2500e0f8deec7de7bc Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Wed, 19 Aug 2020 15:13:21 +0100
Subject: [PATCH 27/63] lxd/networks: Updates networksPost to support projects

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/networks.go | 21 +++++++++++++--------
 1 file changed, 13 insertions(+), 8 deletions(-)

diff --git a/lxd/networks.go b/lxd/networks.go
index 166445fbad..1cecab7bde 100644
--- a/lxd/networks.go
+++ b/lxd/networks.go
@@ -121,13 +121,18 @@ func networksGet(d *Daemon, r *http.Request) response.Response {
 }
 
 func networksPost(d *Daemon, r *http.Request) response.Response {
+	projectName, err := project.NetworkProject(d.State().Cluster, projectParam(r))
+	if err != nil {
+		return response.SmartError(err)
+	}
+
 	networkCreateLock.Lock()
 	defer networkCreateLock.Unlock()
 
 	req := api.NetworksPost{}
 
 	// Parse the request.
-	err := json.NewDecoder(r.Body).Decode(&req)
+	err = json.NewDecoder(r.Body).Decode(&req)
 	if err != nil {
 		return response.BadRequest(err)
 	}
@@ -173,7 +178,7 @@ func networksPost(d *Daemon, r *http.Request) response.Response {
 	if isClusterNotification(r) {
 		// This is an internal request which triggers the actual creation of the network across all nodes
 		// after they have been previously defined.
-		err = doNetworksCreate(d, req, clientType)
+		err = doNetworksCreate(d, projectName, req, clientType)
 		if err != nil {
 			return response.SmartError(err)
 		}
@@ -191,7 +196,7 @@ func networksPost(d *Daemon, r *http.Request) response.Response {
 		}
 
 		err = d.cluster.Transaction(func(tx *db.ClusterTx) error {
-			return tx.CreatePendingNetwork(targetNode, project.Default, req.Name, dbNetType, req.Config)
+			return tx.CreatePendingNetwork(targetNode, projectName, req.Name, dbNetType, req.Config)
 		})
 		if err != nil {
 			if err == db.ErrAlreadyDefined {
@@ -209,7 +214,7 @@ func networksPost(d *Daemon, r *http.Request) response.Response {
 	}
 
 	if count > 1 {
-		err = networksPostCluster(d, req, clientType)
+		err = networksPostCluster(d, projectName, req, clientType)
 		if err != nil {
 			return response.SmartError(err)
 		}
@@ -223,7 +228,7 @@ func networksPost(d *Daemon, r *http.Request) response.Response {
 		return response.SmartError(err)
 	}
 
-	networks, err := networkGetInterfaces(d.cluster)
+	networks, err := d.cluster.GetNetworks(projectName)
 	if err != nil {
 		return response.InternalError(err)
 	}
@@ -236,16 +241,16 @@ func networksPost(d *Daemon, r *http.Request) response.Response {
 	defer revert.Fail()
 
 	// Create the database entry.
-	_, err = d.cluster.CreateNetwork(project.Default, req.Name, req.Description, dbNetType, req.Config)
+	_, err = d.cluster.CreateNetwork(projectName, req.Name, req.Description, dbNetType, req.Config)
 	if err != nil {
 		return response.SmartError(errors.Wrapf(err, "Error inserting %q into database", req.Name))
 	}
 
 	revert.Add(func() {
-		d.cluster.DeleteNetwork(req.Name)
+		d.cluster.DeleteNetwork(projectName, req.Name)
 	})
 
-	err = doNetworksCreate(d, req, clientType)
+	err = doNetworksCreate(d, projectName, req, clientType)
 	if err != nil {
 		return response.SmartError(err)
 	}

From 847c929b7e495fb29d4e60d0c0713a075f4a8eea Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:05:09 +0100
Subject: [PATCH 28/63] lxd/networks: Updates networksPostCluster to support
 projects

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/networks.go | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/lxd/networks.go b/lxd/networks.go
index 1cecab7bde..6d012ff966 100644
--- a/lxd/networks.go
+++ b/lxd/networks.go
@@ -259,7 +259,7 @@ func networksPost(d *Daemon, r *http.Request) response.Response {
 	return resp
 }
 
-func networksPostCluster(d *Daemon, req api.NetworksPost, clientType cluster.ClientType) error {
+func networksPostCluster(d *Daemon, projectName string, req api.NetworksPost, clientType cluster.ClientType) error {
 	// Check that no node-specific config key has been defined.
 	for key := range req.Config {
 		if shared.StringInSlice(key, db.NodeSpecificNetworkConfig) {
@@ -269,7 +269,7 @@ func networksPostCluster(d *Daemon, req api.NetworksPost, clientType cluster.Cli
 
 	// Check that the requested network type matches the type created when adding the local node config.
 	// If network doesn't exist yet, ignore not found error, as this will be checked by NetworkNodeConfigs().
-	_, netInfo, err := d.cluster.GetNetworkInAnyState(req.Name)
+	_, netInfo, err := d.cluster.GetNetworkInAnyState(projectName, req.Name)
 	if err != nil && err != db.ErrNoSuchObject {
 		return err
 	}
@@ -335,20 +335,20 @@ func networksPostCluster(d *Daemon, req api.NetworksPost, clientType cluster.Cli
 
 	revert.Add(func() {
 		d.cluster.Transaction(func(tx *db.ClusterTx) error {
-			return tx.NetworkErrored(req.Name)
+			return tx.NetworkErrored(projectName, req.Name)
 		})
 	})
 
 	// We need to mark the network as created now, because the network.LoadByName call invoked by
 	// doNetworksCreate would fail with not-found otherwise.
 	err = d.cluster.Transaction(func(tx *db.ClusterTx) error {
-		return tx.NetworkCreated(req.Name)
+		return tx.NetworkCreated(projectName, req.Name)
 	})
 	if err != nil {
 		return err
 	}
 
-	err = doNetworksCreate(d, nodeReq, clientType)
+	err = doNetworksCreate(d, projectName, nodeReq, clientType)
 	if err != nil {
 		return err
 	}

From 77c9057d99e4f8468e09ab84c2b7486675247e55 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:05:32 +0100
Subject: [PATCH 29/63] lxd/networks: Updates doNetworksCreate to support
 projects

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/networks.go | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lxd/networks.go b/lxd/networks.go
index 6d012ff966..27340a60dc 100644
--- a/lxd/networks.go
+++ b/lxd/networks.go
@@ -376,9 +376,9 @@ func networksPostCluster(d *Daemon, projectName string, req api.NetworksPost, cl
 
 // Create the network on the system. The clusterNotification flag is used to indicate whether creation request
 // is coming from a cluster notification (and if so we should not delete the database record on error).
-func doNetworksCreate(d *Daemon, req api.NetworksPost, clientType cluster.ClientType) error {
+func doNetworksCreate(d *Daemon, projectName string, req api.NetworksPost, clientType cluster.ClientType) error {
 	// Start the network.
-	n, err := network.LoadByName(d.State(), req.Name)
+	n, err := network.LoadByName(d.State(), projectName, req.Name)
 	if err != nil {
 		return err
 	}

From 996c9ee0b4c62fb81dcd0dddc05f6ad028e258f4 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:06:32 +0100
Subject: [PATCH 30/63] lxd/networks: Updates networkGet to support projects

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/networks.go | 7 ++++++-
 1 file changed, 6 insertions(+), 1 deletion(-)

diff --git a/lxd/networks.go b/lxd/networks.go
index 27340a60dc..2ae85fba08 100644
--- a/lxd/networks.go
+++ b/lxd/networks.go
@@ -411,9 +411,14 @@ func networkGet(d *Daemon, r *http.Request) response.Response {
 		return resp
 	}
 
+	projectName, err := project.NetworkProject(d.State().Cluster, projectParam(r))
+	if err != nil {
+		return response.SmartError(err)
+	}
+
 	name := mux.Vars(r)["name"]
 
-	n, err := doNetworkGet(d, name)
+	n, err := doNetworkGet(d, projectName, name)
 	if err != nil {
 		return response.SmartError(err)
 	}

From 49513ff54183200be03d5b1be30e2512c5e42f1c Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:07:00 +0100
Subject: [PATCH 31/63] lxd/networks: Updates doNetworkGet to support projects

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/networks.go | 20 ++++++++++----------
 1 file changed, 10 insertions(+), 10 deletions(-)

diff --git a/lxd/networks.go b/lxd/networks.go
index 2ae85fba08..4b35ba1236 100644
--- a/lxd/networks.go
+++ b/lxd/networks.go
@@ -442,28 +442,28 @@ func networkGet(d *Daemon, r *http.Request) response.Response {
 	return response.SyncResponseETag(true, &n, etag)
 }
 
-func doNetworkGet(d *Daemon, name string) (api.Network, error) {
-	// Ignore veth pairs (for performance reasons)
+func doNetworkGet(d *Daemon, projectName string, name string) (api.Network, error) {
+	// Ignore veth pairs (for performance reasons).
 	if strings.HasPrefix(name, "veth") {
 		return api.Network{}, os.ErrNotExist
 	}
 
-	// Get some information
+	// Get some information.
 	osInfo, _ := net.InterfaceByName(name)
-	_, dbInfo, _ := d.cluster.GetNetworkInAnyState(name)
+	_, dbInfo, _ := d.cluster.GetNetworkInAnyState(projectName, name)
 
-	// Sanity check
+	// Sanity check.
 	if osInfo == nil && dbInfo == nil {
 		return api.Network{}, os.ErrNotExist
 	}
 
-	// Prepare the response
+	// Prepare the response.
 	n := api.Network{}
 	n.Name = name
 	n.UsedBy = []string{}
 	n.Config = map[string]string{}
 
-	// Set the device type as needed
+	// Set the device type as needed.
 	if osInfo != nil && shared.IsLoopback(osInfo) {
 		n.Type = "loopback"
 	} else if dbInfo != nil {
@@ -488,7 +488,7 @@ func doNetworkGet(d *Daemon, name string) (api.Network, error) {
 		}
 	}
 
-	// Look for containers using the interface
+	// Look for instances using the interface.
 	if n.Type != "loopback" {
 		// Look at instances.
 		insts, err := instance.LoadFromAllProjects(d.State())
@@ -497,7 +497,7 @@ func doNetworkGet(d *Daemon, name string) (api.Network, error) {
 		}
 
 		for _, inst := range insts {
-			inUse, err := network.IsInUseByInstance(d.State(), inst, n.Name)
+			inUse, err := network.IsInUseByInstance(d.State(), inst, projectName, n.Name)
 			if err != nil {
 				return api.Network{}, err
 			}
@@ -526,7 +526,7 @@ func doNetworkGet(d *Daemon, name string) (api.Network, error) {
 		}
 
 		for _, profile := range profiles {
-			inUse, err := network.IsInUseByProfile(d.State(), *db.ProfileToAPI(&profile), n.Name)
+			inUse, err := network.IsInUseByProfile(d.State(), profile, projectName, n.Name)
 			if err != nil {
 				return api.Network{}, err
 			}

From ddaf6cec5f99e1f6006a05204db287e5a7563f29 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:07:22 +0100
Subject: [PATCH 32/63] lxd/networks: Updates networkDelete to support projects

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/networks.go | 11 ++++++++---
 1 file changed, 8 insertions(+), 3 deletions(-)

diff --git a/lxd/networks.go b/lxd/networks.go
index 4b35ba1236..ff34fe8908 100644
--- a/lxd/networks.go
+++ b/lxd/networks.go
@@ -550,16 +550,21 @@ func doNetworkGet(d *Daemon, projectName string, name string) (api.Network, erro
 }
 
 func networkDelete(d *Daemon, r *http.Request) response.Response {
+	projectName, err := project.NetworkProject(d.State().Cluster, projectParam(r))
+	if err != nil {
+		return response.SmartError(err)
+	}
+
 	name := mux.Vars(r)["name"]
 	state := d.State()
 
 	// Check if the network is pending, if so we just need to delete it from the database.
-	_, dbNetwork, err := d.cluster.GetNetworkInAnyState(name)
+	_, dbNetwork, err := d.cluster.GetNetworkInAnyState(projectName, name)
 	if err != nil {
 		return response.SmartError(err)
 	}
 	if dbNetwork.Status == api.NetworkStatusPending {
-		err := d.cluster.DeleteNetwork(name)
+		err := d.cluster.DeleteNetwork(projectName, name)
 		if err != nil {
 			return response.SmartError(err)
 		}
@@ -567,7 +572,7 @@ func networkDelete(d *Daemon, r *http.Request) response.Response {
 	}
 
 	// Get the existing network.
-	n, err := network.LoadByName(state, name)
+	n, err := network.LoadByName(state, projectName, name)
 	if err != nil {
 		return response.NotFound(err)
 	}

From 3b6c0551d48b42ad547075b2a034087eee813f46 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:07:41 +0100
Subject: [PATCH 33/63] lxd/networks: Updates networkPost to support projects

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/networks.go | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/lxd/networks.go b/lxd/networks.go
index ff34fe8908..a878759e07 100644
--- a/lxd/networks.go
+++ b/lxd/networks.go
@@ -627,8 +627,13 @@ func networkPost(d *Daemon, r *http.Request) response.Response {
 		return response.BadRequest(err)
 	}
 
+	projectName, err := project.NetworkProject(d.State().Cluster, projectParam(r))
+	if err != nil {
+		return response.SmartError(err)
+	}
+
 	// Get the existing network.
-	n, err := network.LoadByName(state, name)
+	n, err := network.LoadByName(state, projectName, name)
 	if err != nil {
 		if err == db.ErrNoSuchObject {
 			return response.NotFound(fmt.Errorf("Network not found"))
@@ -658,7 +663,7 @@ func networkPost(d *Daemon, r *http.Request) response.Response {
 	}
 
 	// Check that the name isn't already in used by an existing managed network.
-	networks, err := d.cluster.GetNetworks()
+	networks, err := d.cluster.GetNetworks(projectName)
 	if err != nil {
 		return response.InternalError(err)
 	}

From 7f300ac66ba1b8abeb36135e13d32e9dc4b6a6cc Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:07:57 +0100
Subject: [PATCH 34/63] lxc/networks: Updates networkPut to support projects

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/networks.go | 9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/lxd/networks.go b/lxd/networks.go
index a878759e07..ddfc19da1b 100644
--- a/lxd/networks.go
+++ b/lxd/networks.go
@@ -688,10 +688,15 @@ func networkPut(d *Daemon, r *http.Request) response.Response {
 		return resp
 	}
 
+	projectName, err := project.NetworkProject(d.State().Cluster, projectParam(r))
+	if err != nil {
+		return response.SmartError(err)
+	}
+
 	name := mux.Vars(r)["name"]
 
 	// Get the existing network.
-	_, dbInfo, err := d.cluster.GetNetworkInAnyState(name)
+	_, dbInfo, err := d.cluster.GetNetworkInAnyState(projectName, name)
 	if err != nil {
 		return response.SmartError(err)
 	}
@@ -746,7 +751,7 @@ func networkPut(d *Daemon, r *http.Request) response.Response {
 
 	clientType := cluster.UserAgentClientType(r.Header.Get("User-Agent"))
 
-	return doNetworkUpdate(d, name, req, targetNode, clientType, r.Method, clustered)
+	return doNetworkUpdate(d, projectName, name, req, targetNode, clientType, r.Method, clustered)
 }
 
 func networkPatch(d *Daemon, r *http.Request) response.Response {

From 3d943616216e2850dd1654caaa60d1dd227ff529 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:08:10 +0100
Subject: [PATCH 35/63] lxd/networks: Updates doNetworkUpdate to support
 projects

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/networks.go | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lxd/networks.go b/lxd/networks.go
index ddfc19da1b..37fde3719e 100644
--- a/lxd/networks.go
+++ b/lxd/networks.go
@@ -760,9 +760,9 @@ func networkPatch(d *Daemon, r *http.Request) response.Response {
 
 // doNetworkUpdate loads the current local network config, merges with the requested network config, validates
 // and applies the changes. Will also notify other cluster nodes of non-node specific config if needed.
-func doNetworkUpdate(d *Daemon, name string, req api.NetworkPut, targetNode string, clientType cluster.ClientType, httpMethod string, clustered bool) response.Response {
+func doNetworkUpdate(d *Daemon, projectName string, name string, req api.NetworkPut, targetNode string, clientType cluster.ClientType, httpMethod string, clustered bool) response.Response {
 	// Load the local node-specific network.
-	n, err := network.LoadByName(d.State(), name)
+	n, err := network.LoadByName(d.State(), projectName, name)
 	if err != nil {
 		return response.NotFound(err)
 	}

From 5416f6bc5a3af7ca520ed0b352fd1249a7537dc2 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:13:25 +0100
Subject: [PATCH 36/63] lxd/networks: Updates networkLeasesGet to support
 network projects

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/networks.go | 24 ++++++++++++++++--------
 1 file changed, 16 insertions(+), 8 deletions(-)

diff --git a/lxd/networks.go b/lxd/networks.go
index 37fde3719e..d2aeac1bb3 100644
--- a/lxd/networks.go
+++ b/lxd/networks.go
@@ -809,16 +809,24 @@ func doNetworkUpdate(d *Daemon, projectName string, name string, req api.Network
 }
 
 func networkLeasesGet(d *Daemon, r *http.Request) response.Response {
+	// The project we are filtering the instance leases by.
+	instProjectName := projectParam(r)
+
+	// The project we should use the load the network.
+	networkProjectName, err := project.NetworkProject(d.State().Cluster, instProjectName)
+	if err != nil {
+		return response.SmartError(err)
+	}
+
 	name := mux.Vars(r)["name"]
-	project := projectParam(r)
 
-	// Try to get the network
-	n, err := doNetworkGet(d, name)
+	// Try to get the network.
+	n, err := doNetworkGet(d, networkProjectName, name)
 	if err != nil {
 		return response.SmartError(err)
 	}
 
-	// Validate that we do have leases for it
+	// Validate that we do have leases for it.
 	if !n.Managed || n.Type != "bridge" {
 		return response.NotFound(errors.New("Leases not found"))
 	}
@@ -826,10 +834,10 @@ func networkLeasesGet(d *Daemon, r *http.Request) response.Response {
 	leases := []api.NetworkLease{}
 	projectMacs := []string{}
 
-	// Get all static leases
+	// Get all static leases.
 	if !isClusterNotification(r) {
-		// Get all the instances
-		instances, err := instance.LoadByProject(d.State(), project)
+		// Get all the instances.
+		instances, err := instance.LoadByProject(d.State(), instProjectName)
 		if err != nil {
 			return response.SmartError(err)
 		}
@@ -842,7 +850,7 @@ func networkLeasesGet(d *Daemon, r *http.Request) response.Response {
 					continue
 				}
 
-				nicType, err := nictype.NICType(d.State(), dev)
+				nicType, err := nictype.NICType(d.State(), inst.Project(), dev)
 				if err != nil || nicType != "bridged" {
 					continue
 				}

From 79c6513242eac69115c308eaf5a28eeb252034f2 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:13:44 +0100
Subject: [PATCH 37/63] lxd/networks: Updates networkStartup and
 networkShutdown to load networks from all projects

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/networks.go | 86 +++++++++++++++++++++++++++++++++----------------
 1 file changed, 58 insertions(+), 28 deletions(-)

diff --git a/lxd/networks.go b/lxd/networks.go
index d2aeac1bb3..aec5027afb 100644
--- a/lxd/networks.go
+++ b/lxd/networks.go
@@ -991,31 +991,46 @@ func networkLeasesGet(d *Daemon, r *http.Request) response.Response {
 }
 
 func networkStartup(s *state.State) error {
-	// Get a list of managed networks.
-	networks, err := s.Cluster.GetNonPendingNetworks()
+	var err error
+
+	// Get a list of projects.
+	var projectNames []string
+
+	err = s.Cluster.Transaction(func(tx *db.ClusterTx) error {
+		projectNames, err = tx.GetProjectNames()
+		return err
+	})
 	if err != nil {
-		return errors.Wrapf(err, "Failed to load networks")
+		return errors.Wrapf(err, "Failed to load projects")
 	}
 
-	// Bring them all up.
-	for _, name := range networks {
-		n, err := network.LoadByName(s, name)
+	for _, projectName := range projectNames {
+		// Get a list of managed networks.
+		networks, err := s.Cluster.GetNonPendingNetworks(projectName)
 		if err != nil {
-			return errors.Wrapf(err, "Failed to load network %q", name)
+			return errors.Wrapf(err, "Failed to load networks for project %q", projectName)
 		}
 
-		err = n.Validate(n.Config())
-		if err != nil {
-			// Don't cause LXD to fail to start entirely on network start up failure.
-			logger.Error("Failed to validate network", log.Ctx{"err": err, "name": name})
-			continue
-		}
+		// Bring them all up.
+		for _, name := range networks {
+			n, err := network.LoadByName(s, projectName, name)
+			if err != nil {
+				return errors.Wrapf(err, "Failed to load network %q in project %q", name, projectName)
+			}
 
-		err = n.Start()
-		if err != nil {
-			// Don't cause LXD to fail to start entirely on network start up failure.
-			logger.Error("Failed to bring up network", log.Ctx{"err": err, "name": name})
-			continue
+			err = n.Validate(n.Config())
+			if err != nil {
+				// Don't cause LXD to fail to start entirely on network start up failure.
+				logger.Error("Failed to validate network", log.Ctx{"err": err, "project": projectName, "name": name})
+				continue
+			}
+
+			err = n.Start()
+			if err != nil {
+				// Don't cause LXD to fail to start entirely on network start up failure.
+				logger.Error("Failed to bring up network", log.Ctx{"err": err, "project": projectName, "name": name})
+				continue
+			}
 		}
 	}
 
@@ -1023,22 +1038,37 @@ func networkStartup(s *state.State) error {
 }
 
 func networkShutdown(s *state.State) error {
-	// Get a list of managed networks
-	networks, err := s.Cluster.GetNetworks()
-	if err != nil {
+	var err error
+
+	// Get a list of projects.
+	var projectNames []string
+
+	err = s.Cluster.Transaction(func(tx *db.ClusterTx) error {
+		projectNames, err = tx.GetProjectNames()
 		return err
+	})
+	if err != nil {
+		return errors.Wrapf(err, "Failed to load projects")
 	}
 
-	// Bring them all up
-	for _, name := range networks {
-		n, err := network.LoadByName(s, name)
+	for _, projectName := range projectNames {
+		// Get a list of managed networks.
+		networks, err := s.Cluster.GetNetworks(projectName)
 		if err != nil {
-			return err
+			return errors.Wrapf(err, "Failed to load networks for project %q", projectName)
 		}
 
-		err = n.Stop()
-		if err != nil {
-			logger.Error("Failed to bring down network", log.Ctx{"err": err, "name": name})
+		// Bring them all down.
+		for _, name := range networks {
+			n, err := network.LoadByName(s, projectName, name)
+			if err != nil {
+				return errors.Wrapf(err, "Failed to load network %q in project %q", name, projectName)
+			}
+
+			err = n.Stop()
+			if err != nil {
+				logger.Error("Failed to bring down network", log.Ctx{"err": err, "project": projectName, "name": name})
+			}
 		}
 	}
 

From eefdeadc49a3f611500756eccc08617bca886868 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:16:12 +0100
Subject: [PATCH 38/63] lxd/network/network/load: Updates load functions to
 support projects

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/network/network_load.go | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/lxd/network/network_load.go b/lxd/network/network_load.go
index 1757da08a2..dcd4419c3c 100644
--- a/lxd/network/network_load.go
+++ b/lxd/network/network_load.go
@@ -3,6 +3,7 @@ package network
 import (
 	"github.com/pkg/errors"
 
+	"github.com/lxc/lxd/lxd/project"
 	"github.com/lxc/lxd/lxd/state"
 	"github.com/lxc/lxd/shared/api"
 )
@@ -15,8 +16,8 @@ var drivers = map[string]func() Network{
 }
 
 // LoadByName loads the network info from the database by name.
-func LoadByName(s *state.State, name string) (Network, error) {
-	id, netInfo, err := s.Cluster.GetNetworkInAnyState(name)
+func LoadByName(s *state.State, project string, name string) (Network, error) {
+	id, netInfo, err := s.Cluster.GetNetworkInAnyState(project, name)
 	if err != nil {
 		return nil, err
 	}
@@ -27,7 +28,7 @@ func LoadByName(s *state.State, name string) (Network, error) {
 	}
 
 	n := driverFunc()
-	n.init(s, id, name, netInfo.Type, netInfo.Description, netInfo.Config, netInfo.Status)
+	n.init(s, id, project, name, netInfo.Type, netInfo.Description, netInfo.Config, netInfo.Status)
 
 	return n, nil
 }
@@ -40,7 +41,7 @@ func ValidateName(name string, netType string) error {
 	}
 
 	n := driverFunc()
-	n.init(nil, 0, name, netType, "", nil, "Unknown")
+	n.init(nil, 0, project.Default, name, netType, "", nil, "Unknown")
 
 	err := n.ValidateName(name)
 	if err != nil {
@@ -58,7 +59,7 @@ func Validate(name string, netType string, config map[string]string) error {
 	}
 
 	n := driverFunc()
-	n.init(nil, 0, name, netType, "", config, "Unknown")
+	n.init(nil, 0, project.Default, name, netType, "", config, "Unknown")
 
 	err := n.ValidateName(name)
 	if err != nil {
@@ -76,7 +77,7 @@ func FillConfig(req *api.NetworksPost) error {
 	}
 
 	n := driverFunc()
-	n.init(nil, 0, req.Name, req.Type, req.Description, req.Config, "Unknown")
+	n.init(nil, 0, project.Default, req.Name, req.Type, req.Description, req.Config, "Unknown")
 
 	err := n.fillConfig(req.Config)
 	if err != nil {

From 97b683fc1bfb3ea12b06850e0bd3a3efc2dd0ddd Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:19:47 +0100
Subject: [PATCH 39/63] lxd/network/network/interface: Adds project name to
 init function

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/network/network_interface.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lxd/network/network_interface.go b/lxd/network/network_interface.go
index 69e787a14a..ddcaf2a5c3 100644
--- a/lxd/network/network_interface.go
+++ b/lxd/network/network_interface.go
@@ -12,7 +12,7 @@ import (
 // Network represents a LXD network.
 type Network interface {
 	// Load.
-	init(state *state.State, id int64, name string, netType string, description string, config map[string]string, status string)
+	init(state *state.State, id int64, projectName string, name string, netType string, description string, config map[string]string, status string)
 	fillConfig(config map[string]string) error
 
 	// Config.

From 59047646b78d8020fa40156b0062972c61941e77 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:21:29 +0100
Subject: [PATCH 40/63] lxd/network/driver/common: Adds project support

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/network/driver_common.go | 16 +++++++++-------
 1 file changed, 9 insertions(+), 7 deletions(-)

diff --git a/lxd/network/driver_common.go b/lxd/network/driver_common.go
index 3169b0ea3c..d912eaeac2 100644
--- a/lxd/network/driver_common.go
+++ b/lxd/network/driver_common.go
@@ -26,6 +26,7 @@ type common struct {
 	logger      logger.Logger
 	state       *state.State
 	id          int64
+	project     string
 	name        string
 	netType     string
 	description string
@@ -34,9 +35,10 @@ type common struct {
 }
 
 // init initialise internal variables.
-func (n *common) init(state *state.State, id int64, name string, netType string, description string, config map[string]string, status string) {
-	n.logger = logging.AddContext(logger.Log, log.Ctx{"driver": netType, "network": name})
+func (n *common) init(state *state.State, id int64, projectName string, name string, netType string, description string, config map[string]string, status string) {
+	n.logger = logging.AddContext(logger.Log, log.Ctx{"project": projectName, "driver": netType, "network": name})
 	n.id = id
+	n.project = projectName
 	n.name = name
 	n.netType = netType
 	n.config = config
@@ -225,7 +227,7 @@ func (n *common) DHCPv6Ranges() []shared.IPRange {
 func (n *common) update(applyNetwork api.NetworkPut, targetNode string, clientType cluster.ClientType) error {
 	// Update internal config before database has been updated (so that if update is a notification we apply
 	// the config being supplied and not that in the database).
-	n.init(n.state, n.id, n.name, n.netType, applyNetwork.Description, applyNetwork.Config, n.status)
+	n.init(n.state, n.id, n.project, n.name, n.netType, applyNetwork.Description, applyNetwork.Config, n.status)
 
 	// If this update isn't coming via a cluster notification itself, then notify all nodes of change and then
 	// update the database.
@@ -257,7 +259,7 @@ func (n *common) update(applyNetwork api.NetworkPut, targetNode string, clientTy
 		}
 
 		// Update the database.
-		err := n.state.Cluster.UpdateNetwork(n.name, applyNetwork.Description, applyNetwork.Config)
+		err := n.state.Cluster.UpdateNetwork(n.project, n.name, applyNetwork.Description, applyNetwork.Config)
 		if err != nil {
 			return err
 		}
@@ -330,13 +332,13 @@ func (n *common) rename(newName string) error {
 	}
 
 	// Rename the database entry.
-	err := n.state.Cluster.RenameNetwork(n.name, newName)
+	err := n.state.Cluster.RenameNetwork(n.project, n.name, newName)
 	if err != nil {
 		return err
 	}
 
 	// Reinitialise internal name variable and logger context with new name.
-	n.init(n.state, n.id, newName, n.netType, n.description, n.config, n.status)
+	n.init(n.state, n.id, n.project, newName, n.netType, n.description, n.config, n.status)
 
 	return nil
 }
@@ -358,7 +360,7 @@ func (n *common) delete(clientType cluster.ClientType) error {
 		}
 
 		// Remove the network from the database.
-		err = n.state.Cluster.DeleteNetwork(n.name)
+		err = n.state.Cluster.DeleteNetwork(n.project, n.name)
 		if err != nil {
 			return err
 		}

From b0d6a124af5899808fe1f99a95e678f423747dd7 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:22:42 +0100
Subject: [PATCH 41/63] lxd/network/driver/ovn: Load parent network from
 default project

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/network/driver_ovn.go | 9 ++++++---
 1 file changed, 6 insertions(+), 3 deletions(-)

diff --git a/lxd/network/driver_ovn.go b/lxd/network/driver_ovn.go
index 59e1575d54..7d5c19f47c 100644
--- a/lxd/network/driver_ovn.go
+++ b/lxd/network/driver_ovn.go
@@ -263,7 +263,8 @@ func (n *ovn) getIntSwitchInstancePortPrefix() string {
 // setupParentPort initialises the parent uplink connection. Returns the derived ovnParentVars settings used
 // during the initial creation of the logical network.
 func (n *ovn) setupParentPort(routerMAC net.HardwareAddr) (*ovnParentVars, error) {
-	parentNet, err := LoadByName(n.state, n.config["parent"])
+	// Parent network must be in default project.
+	parentNet, err := LoadByName(n.state, project.Default, n.config["parent"])
 	if err != nil {
 		return nil, errors.Wrapf(err, "Failed loading parent network")
 	}
@@ -486,7 +487,8 @@ func (n *ovn) parentAllocateIP(ipRanges []*shared.IPRange, allAllocated []net.IP
 
 // startParentPort performs any network start up logic needed to connect the parent uplink connection to OVN.
 func (n *ovn) startParentPort() error {
-	parentNet, err := LoadByName(n.state, n.config["parent"])
+	// Parent network must be in default project.
+	parentNet, err := LoadByName(n.state, project.Default, n.config["parent"])
 	if err != nil {
 		return errors.Wrapf(err, "Failed loading parent network")
 	}
@@ -614,7 +616,8 @@ func (n *ovn) startParentPortBridge(parentNet Network) error {
 
 // deleteParentPort deletes the parent uplink connection.
 func (n *ovn) deleteParentPort() error {
-	parentNet, err := LoadByName(n.state, n.config["parent"])
+	// Parent network must be in default project.
+	parentNet, err := LoadByName(n.state, project.Default, n.config["parent"])
 	if err != nil {
 		return errors.Wrapf(err, "Failed loading parent network")
 	}

From b26469b0274082ae32758a072cee8a1a7e2dba7b Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:46:43 +0100
Subject: [PATCH 42/63] lxd/device/nictype: Adds conversion of device project
 to network project for NICType validation

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/device/nictype/nictype.go | 13 ++++++++++---
 1 file changed, 10 insertions(+), 3 deletions(-)

diff --git a/lxd/device/nictype/nictype.go b/lxd/device/nictype/nictype.go
index a72e8f1ccd..7d83fc042c 100644
--- a/lxd/device/nictype/nictype.go
+++ b/lxd/device/nictype/nictype.go
@@ -8,6 +8,7 @@ import (
 	"github.com/pkg/errors"
 
 	deviceConfig "github.com/lxc/lxd/lxd/device/config"
+	"github.com/lxc/lxd/lxd/project"
 	"github.com/lxc/lxd/lxd/state"
 )
 
@@ -15,13 +16,19 @@ import (
 // If the device "type" is "nic" and the "network" property is specified in the device config, then NIC type is
 // resolved from the network's type. Otherwise the device's "nictype" property is returned (which may be empty if
 // used with non-NIC device configs).
-func NICType(s *state.State, d deviceConfig.Device) (string, error) {
+func NICType(s *state.State, deviceProjectName string, d deviceConfig.Device) (string, error) {
 	// NIC devices support resolving their "nictype" from their "network" property.
 	if d["type"] == "nic" {
 		if d["network"] != "" {
-			_, netInfo, err := s.Cluster.GetNetworkInAnyState(d["network"])
+			// Translate device's project name into a network project name.
+			networkProjectName, err := project.NetworkProject(s.Cluster, deviceProjectName)
 			if err != nil {
-				return "", errors.Wrapf(err, "Failed to load network %q", d["network"])
+				return "", errors.Wrapf(err, "Failed to translate device project %q into network project", deviceProjectName)
+			}
+
+			_, netInfo, err := s.Cluster.GetNetworkInAnyState(networkProjectName, d["network"])
+			if err != nil {
+				return "", errors.Wrapf(err, "Failed to load network %q for project %q", d["network"], networkProjectName)
 			}
 
 			var nicType string

From a842ebf5e5c9977e2d314ba846368daae62ae29f Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:23:41 +0100
Subject: [PATCH 43/63] lxd/instance/instance/utils: Project name is needed to
 validate instance devices

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/instance/instance_utils.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lxd/instance/instance_utils.go b/lxd/instance/instance_utils.go
index 5dd419c8b6..7af24f7ee8 100644
--- a/lxd/instance/instance_utils.go
+++ b/lxd/instance/instance_utils.go
@@ -31,7 +31,7 @@ import (
 )
 
 // ValidDevices is linked from instance/drivers.validDevices to validate device config.
-var ValidDevices func(state *state.State, cluster *db.Cluster, instanceType instancetype.Type, devices deviceConfig.Devices, expanded bool) error
+var ValidDevices func(state *state.State, cluster *db.Cluster, projectName string, instanceType instancetype.Type, devices deviceConfig.Devices, expanded bool) error
 
 // Load is linked from instance/drivers.load to allow different instance types to be loaded.
 var Load func(s *state.State, args db.InstanceArgs, profiles []api.Profile) (Instance, error)

From 3bba77bc2ce5db08b26ced784d6a3ca50cfda5d9 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:24:15 +0100
Subject: [PATCH 44/63] lxd/instance: instance.ValidDevices project argument
 usage

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/instance.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lxd/instance.go b/lxd/instance.go
index 9b63bb49a0..e865de0068 100644
--- a/lxd/instance.go
+++ b/lxd/instance.go
@@ -476,7 +476,7 @@ func instanceCreateInternal(s *state.State, args db.InstanceArgs) (instance.Inst
 	}
 
 	// Validate container devices with the supplied container name and devices.
-	err = instance.ValidDevices(s, s.Cluster, args.Type, args.Devices, false)
+	err = instance.ValidDevices(s, s.Cluster, args.Project, args.Type, args.Devices, false)
 	if err != nil {
 		return nil, errors.Wrap(err, "Invalid devices")
 	}

From 4ee1a7e4115a393622692af714e1f47eb0ab3971 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:25:07 +0100
Subject: [PATCH 45/63] lxd/instance/drivers/driver/lxc: instance.ValidDevices
 project usage

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/instance/drivers/driver_lxc.go | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/lxd/instance/drivers/driver_lxc.go b/lxd/instance/drivers/driver_lxc.go
index 196e70cdbc..1c0ffe2e9a 100644
--- a/lxd/instance/drivers/driver_lxc.go
+++ b/lxd/instance/drivers/driver_lxc.go
@@ -201,7 +201,7 @@ func lxcCreate(s *state.State, args db.InstanceArgs) (instance.Instance, error)
 		return nil, err
 	}
 
-	err = instance.ValidDevices(s, s.Cluster, c.Type(), c.expandedDevices, true)
+	err = instance.ValidDevices(s, s.Cluster, c.Project(), c.Type(), c.expandedDevices, true)
 	if err != nil {
 		c.Delete()
 		logger.Error("Failed creating container", ctxMap)
@@ -3841,7 +3841,7 @@ func (c *lxc) Update(args db.InstanceArgs, userRequested bool) error {
 		}
 
 		// Validate the new devices without using expanded devices validation (expensive checks disabled).
-		err = instance.ValidDevices(c.state, c.state.Cluster, c.Type(), args.Devices, false)
+		err = instance.ValidDevices(c.state, c.state.Cluster, c.Project(), c.Type(), args.Devices, false)
 		if err != nil {
 			return errors.Wrap(err, "Invalid devices")
 		}
@@ -4022,7 +4022,7 @@ func (c *lxc) Update(args db.InstanceArgs, userRequested bool) error {
 		}
 
 		// Do full expanded validation of the devices diff.
-		err = instance.ValidDevices(c.state, c.state.Cluster, c.Type(), c.expandedDevices, true)
+		err = instance.ValidDevices(c.state, c.state.Cluster, c.Project(), c.Type(), c.expandedDevices, true)
 		if err != nil {
 			return errors.Wrap(err, "Invalid expanded devices")
 		}

From 9a6752cc97cd09b1a348b92d43ec32f7b835bf40 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:25:23 +0100
Subject: [PATCH 46/63] lxd/instance/drivers/driver/lxc: Error quoting

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/instance/drivers/driver_lxc.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lxd/instance/drivers/driver_lxc.go b/lxd/instance/drivers/driver_lxc.go
index 1c0ffe2e9a..69680551c5 100644
--- a/lxd/instance/drivers/driver_lxc.go
+++ b/lxd/instance/drivers/driver_lxc.go
@@ -348,7 +348,7 @@ func lxcCreate(s *state.State, args db.InstanceArgs) (instance.Instance, error)
 			err = c.deviceAdd(k, m)
 			if err != nil && err != device.ErrUnsupportedDevType {
 				c.Delete()
-				return nil, errors.Wrapf(err, "Failed to add device '%s'", k)
+				return nil, errors.Wrapf(err, "Failed to add device %q", k)
 			}
 		}
 

From 587e9b07a07a3322802005efc8b8409256ce70b8 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:26:05 +0100
Subject: [PATCH 47/63] lxc/instance/drivers/driver/lxc: nictype.NICType
 project usage

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/instance/drivers/driver_lxc.go | 10 +++++-----
 1 file changed, 5 insertions(+), 5 deletions(-)

diff --git a/lxd/instance/drivers/driver_lxc.go b/lxd/instance/drivers/driver_lxc.go
index 69680551c5..82c1ab5f1b 100644
--- a/lxd/instance/drivers/driver_lxc.go
+++ b/lxd/instance/drivers/driver_lxc.go
@@ -1780,12 +1780,12 @@ func (c *lxc) deviceResetVolatile(devName string, oldConfig, newConfig deviceCon
 	volatileClear := make(map[string]string)
 	devicePrefix := fmt.Sprintf("volatile.%s.", devName)
 
-	newNICType, err := nictype.NICType(c.state, newConfig)
+	newNICType, err := nictype.NICType(c.state, c.Project(), newConfig)
 	if err != nil {
 		return err
 	}
 
-	oldNICType, err := nictype.NICType(c.state, oldConfig)
+	oldNICType, err := nictype.NICType(c.state, c.Project(), oldConfig)
 	if err != nil {
 		return err
 	}
@@ -3991,12 +3991,12 @@ func (c *lxc) Update(args db.InstanceArgs, userRequested bool) error {
 		// devices are otherwise identical except for the fields returned here, then the
 		// device is considered to be being "updated" rather than "added & removed".
 
-		oldNICType, err := nictype.NICType(c.state, newDevice)
+		oldNICType, err := nictype.NICType(c.state, c.Project(), newDevice)
 		if err != nil {
 			return []string{} // Cannot hot-update due to config error.
 		}
 
-		newNICType, err := nictype.NICType(c.state, oldDevice)
+		newNICType, err := nictype.NICType(c.state, c.Project(), oldDevice)
 		if err != nil {
 			return []string{} // Cannot hot-update due to config error.
 		}
@@ -6402,7 +6402,7 @@ func (c *lxc) FillNetworkDevice(name string, m deviceConfig.Device) (deviceConfi
 		return nil
 	}
 
-	nicType, err := nictype.NICType(c.state, m)
+	nicType, err := nictype.NICType(c.state, c.Project(), m)
 	if err != nil {
 		return nil, err
 	}

From 3748c4247f2e1d53eba2ca85ada94dfc67c259be Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:28:16 +0100
Subject: [PATCH 48/63] lxd/instance/drivers/driver/qemu: instance.ValidDevices
 project usage

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/instance/drivers/driver_qemu.go | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/lxd/instance/drivers/driver_qemu.go b/lxd/instance/drivers/driver_qemu.go
index 1d14ca7555..8715253a43 100644
--- a/lxd/instance/drivers/driver_qemu.go
+++ b/lxd/instance/drivers/driver_qemu.go
@@ -219,7 +219,7 @@ func qemuCreate(s *state.State, args db.InstanceArgs) (instance.Instance, error)
 		return nil, err
 	}
 
-	err = instance.ValidDevices(s, s.Cluster, vm.Type(), vm.expandedDevices, true)
+	err = instance.ValidDevices(s, s.Cluster, vm.Project(), vm.Type(), vm.expandedDevices, true)
 	if err != nil {
 		logger.Error("Failed creating instance", ctxMap)
 		return nil, errors.Wrap(err, "Invalid devices")
@@ -2773,7 +2773,7 @@ func (vm *qemu) Update(args db.InstanceArgs, userRequested bool) error {
 		}
 
 		// Validate the new devices without using expanded devices validation (expensive checks disabled).
-		err = instance.ValidDevices(vm.state, vm.state.Cluster, vm.Type(), args.Devices, false)
+		err = instance.ValidDevices(vm.state, vm.state.Cluster, vm.Project(), vm.Type(), args.Devices, false)
 		if err != nil {
 			return errors.Wrap(err, "Invalid devices")
 		}
@@ -2946,7 +2946,7 @@ func (vm *qemu) Update(args db.InstanceArgs, userRequested bool) error {
 		}
 
 		// Do full expanded validation of the devices diff.
-		err = instance.ValidDevices(vm.state, vm.state.Cluster, vm.Type(), vm.expandedDevices, true)
+		err = instance.ValidDevices(vm.state, vm.state.Cluster, vm.Project(), vm.Type(), vm.expandedDevices, true)
 		if err != nil {
 			return errors.Wrap(err, "Invalid expanded devices")
 		}

From 6c3a7227b34b27057ce999d7c700f24ca60f545a Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:28:33 +0100
Subject: [PATCH 49/63] lxd/instance/drivers/driver/qemu: nictype.NICType
 project usage

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/instance/drivers/driver_qemu.go | 12 ++++++------
 1 file changed, 6 insertions(+), 6 deletions(-)

diff --git a/lxd/instance/drivers/driver_qemu.go b/lxd/instance/drivers/driver_qemu.go
index 8715253a43..7f0377a8b7 100644
--- a/lxd/instance/drivers/driver_qemu.go
+++ b/lxd/instance/drivers/driver_qemu.go
@@ -2915,12 +2915,12 @@ func (vm *qemu) Update(args db.InstanceArgs, userRequested bool) error {
 		// between oldDevice and newDevice. The result of this is that as long as the
 		// devices are otherwise identical except for the fields returned here, then the
 		// device is considered to be being "updated" rather than "added & removed".
-		oldNICType, err := nictype.NICType(vm.state, newDevice)
+		oldNICType, err := nictype.NICType(vm.state, vm.Project(), newDevice)
 		if err != nil {
 			return []string{} // Cannot hot-update due to config error.
 		}
 
-		newNICType, err := nictype.NICType(vm.state, oldDevice)
+		newNICType, err := nictype.NICType(vm.state, vm.Project(), oldDevice)
 		if err != nil {
 			return []string{} // Cannot hot-update due to config error.
 		}
@@ -3105,12 +3105,12 @@ func (vm *qemu) deviceResetVolatile(devName string, oldConfig, newConfig deviceC
 	volatileClear := make(map[string]string)
 	devicePrefix := fmt.Sprintf("volatile.%s.", devName)
 
-	newNICType, err := nictype.NICType(vm.state, newConfig)
+	newNICType, err := nictype.NICType(vm.state, vm.Project(), newConfig)
 	if err != nil {
 		return err
 	}
 
-	oldNICType, err := nictype.NICType(vm.state, oldConfig)
+	oldNICType, err := nictype.NICType(vm.state, vm.Project(), oldConfig)
 	if err != nil {
 		return err
 	}
@@ -4075,7 +4075,7 @@ func (vm *qemu) RenderState() (*api.InstanceState, error) {
 			status.Processes = -1
 			networks := map[string]api.InstanceStateNetwork{}
 			for k, m := range vm.ExpandedDevices() {
-				nicType, err := nictype.NICType(vm.state, m)
+				nicType, err := nictype.NICType(vm.state, vm.Project(), m)
 				if err != nil {
 					return nil, err
 				}
@@ -4468,7 +4468,7 @@ func (vm *qemu) FillNetworkDevice(name string, m deviceConfig.Device) (deviceCon
 		return nil
 	}
 
-	nicType, err := nictype.NICType(vm.state, m)
+	nicType, err := nictype.NICType(vm.state, vm.Project(), m)
 	if err != nil {
 		return nil, err
 	}

From 489fbdf29fbfb0b30bd39c2b945d856ae1dc1c7f Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:30:00 +0100
Subject: [PATCH 50/63] lxd/instance/drivers/load: Adds project support to
 validDevices

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/instance/drivers/load.go | 5 +++--
 1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/lxd/instance/drivers/load.go b/lxd/instance/drivers/load.go
index b534365fd0..f478c75ed4 100644
--- a/lxd/instance/drivers/load.go
+++ b/lxd/instance/drivers/load.go
@@ -47,7 +47,7 @@ func load(s *state.State, args db.InstanceArgs, profiles []api.Profile) (instanc
 }
 
 // validDevices validate instance device configs.
-func validDevices(state *state.State, cluster *db.Cluster, instanceType instancetype.Type, devices deviceConfig.Devices, expanded bool) error {
+func validDevices(state *state.State, cluster *db.Cluster, projectName string, instanceType instancetype.Type, devices deviceConfig.Devices, expanded bool) error {
 	// Empty device list
 	if devices == nil {
 		return nil
@@ -56,6 +56,7 @@ func validDevices(state *state.State, cluster *db.Cluster, instanceType instance
 	instConf := &common{
 		dbType:       instanceType,
 		localDevices: devices.Clone(),
+		project:      projectName,
 	}
 
 	// In non-expanded validation expensive checks should be avoided.
@@ -70,7 +71,7 @@ func validDevices(state *state.State, cluster *db.Cluster, instanceType instance
 	for name, config := range instConf.localDevices {
 		err := device.Validate(instConf, state, name, config)
 		if err != nil {
-			return errors.Wrapf(err, "Device validation failed %q", name)
+			return errors.Wrapf(err, "Device validation failed for %q", name)
 		}
 
 	}

From b8eb72856a7fdc240a0b3bb2b3b654d3fced8d4f Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:43:02 +0100
Subject: [PATCH 51/63] lxd/device/device/load: Adds project support to load
 function

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/device/device_load.go | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/lxd/device/device_load.go b/lxd/device/device_load.go
index feee9a0bfb..c89161224c 100644
--- a/lxd/device/device_load.go
+++ b/lxd/device/device_load.go
@@ -10,13 +10,15 @@ import (
 )
 
 // load instantiates a device and initialises its internal state. It does not validate the config supplied.
-func load(inst instance.Instance, state *state.State, name string, conf deviceConfig.Device, volatileGet VolatileGetter, volatileSet VolatileSetter) (device, error) {
+func load(inst instance.Instance, state *state.State, projectName string, name string, conf deviceConfig.Device, volatileGet VolatileGetter, volatileSet VolatileSetter) (device, error) {
+	// Warning: When validating a profile, inst is expected to be provided as nil.
+
 	if conf["type"] == "" {
 		return nil, fmt.Errorf("Missing device type for device %q", name)
 	}
 
 	// NIC type is required to lookup network devices.
-	nicType, err := nictype.NICType(state, conf)
+	nicType, err := nictype.NICType(state, projectName, conf)
 	if err != nil {
 		return nil, err
 	}
@@ -82,7 +84,7 @@ func load(inst instance.Instance, state *state.State, name string, conf deviceCo
 // is still returned with the validation error. If an unknown device is requested or the device is
 // not compatible with the instance type then an ErrUnsupportedDevType error is returned.
 func New(inst instance.Instance, state *state.State, name string, conf deviceConfig.Device, volatileGet VolatileGetter, volatileSet VolatileSetter) (Device, error) {
-	dev, err := load(inst, state, name, conf, volatileGet, volatileSet)
+	dev, err := load(inst, state, inst.Project(), name, conf, volatileGet, volatileSet)
 	if err != nil {
 		return nil, err
 	}
@@ -98,7 +100,7 @@ func New(inst instance.Instance, state *state.State, name string, conf deviceCon
 // Validate checks a device's config is valid. This only requires an instance.ConfigReader rather than an full
 // blown instance to allow profile devices to be validated too.
 func Validate(instConfig instance.ConfigReader, state *state.State, name string, conf deviceConfig.Device) error {
-	dev, err := load(nil, state, name, conf, nil, nil)
+	dev, err := load(nil, state, instConfig.Project(), name, conf, nil, nil)
 	if err != nil {
 		return err
 	}

From e66b9ad2f2b924be497b082a41c9e386cdadc48e Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:43:38 +0100
Subject: [PATCH 52/63] lxd/device/device/utils/network: Use default project
 for veth route functions

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/device/device_utils_network.go | 8 ++++++--
 1 file changed, 6 insertions(+), 2 deletions(-)

diff --git a/lxd/device/device_utils_network.go b/lxd/device/device_utils_network.go
index 9556bfda9c..e36e1b81ba 100644
--- a/lxd/device/device_utils_network.go
+++ b/lxd/device/device_utils_network.go
@@ -17,6 +17,7 @@ import (
 	"github.com/lxc/lxd/lxd/instance"
 	"github.com/lxc/lxd/lxd/instance/instancetype"
 	"github.com/lxc/lxd/lxd/network"
+	"github.com/lxc/lxd/lxd/project"
 	"github.com/lxc/lxd/lxd/revert"
 	"github.com/lxc/lxd/lxd/state"
 	"github.com/lxc/lxd/lxd/util"
@@ -377,7 +378,8 @@ func networkSetVethRoutes(s *state.State, m deviceConfig.Device) error {
 	// Decide whether the route should point to the veth parent or the bridge parent.
 	routeDev := m["host_name"]
 
-	nicType, err := nictype.NICType(s, m)
+	// Use project.Default here, as only networks in the default project can add routes on the host.
+	nicType, err := nictype.NICType(s, project.Default, m)
 	if err != nil {
 		return err
 	}
@@ -420,7 +422,9 @@ func networkSetVethRoutes(s *state.State, m deviceConfig.Device) error {
 func networkRemoveVethRoutes(s *state.State, m deviceConfig.Device) {
 	// Decide whether the route should point to the veth parent or the bridge parent
 	routeDev := m["host_name"]
-	nicType, err := nictype.NICType(s, m)
+
+	// Use project.Default here, as only networks in the default project can add routes on the host.
+	nicType, err := nictype.NICType(s, project.Default, m)
 	if err != nil {
 		logger.Errorf("Failed to get NIC type for %q", m["name"])
 		return

From 439836124ded5a40eb18bfce71420a30dd214d4b Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:44:37 +0100
Subject: [PATCH 53/63] lxd/device/nic/bridged: Use default project for bridge
 networks

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/device/nic_bridged.go | 10 +++++++---
 1 file changed, 7 insertions(+), 3 deletions(-)

diff --git a/lxd/device/nic_bridged.go b/lxd/device/nic_bridged.go
index b30ba66d91..0ff48fac2c 100644
--- a/lxd/device/nic_bridged.go
+++ b/lxd/device/nic_bridged.go
@@ -24,6 +24,7 @@ import (
 	"github.com/lxc/lxd/lxd/instance/instancetype"
 	"github.com/lxc/lxd/lxd/network"
 	"github.com/lxc/lxd/lxd/network/openvswitch"
+	"github.com/lxc/lxd/lxd/project"
 	"github.com/lxc/lxd/lxd/revert"
 	"github.com/lxc/lxd/lxd/util"
 	"github.com/lxc/lxd/shared"
@@ -79,7 +80,8 @@ func (d *nicBridged) validateConfig(instConf instance.ConfigReader) error {
 		}
 
 		// If network property is specified, lookup network settings and apply them to the device's config.
-		n, err := network.LoadByName(d.state, d.config["network"])
+		// project.Default is used here as bridge networks don't suppprt projects.
+		n, err := network.LoadByName(d.state, project.Default, d.config["network"])
 		if err != nil {
 			return errors.Wrapf(err, "Error loading network config for %q", d.config["network"])
 		}
@@ -489,7 +491,8 @@ func (d *nicBridged) rebuildDnsmasqEntry() error {
 	dnsmasq.ConfigMutex.Lock()
 	defer dnsmasq.ConfigMutex.Unlock()
 
-	_, dbInfo, err := d.state.Cluster.GetNetworkInAnyState(d.config["parent"])
+	// Use project.Default here as bridge networks don't support projects.
+	_, dbInfo, err := d.state.Cluster.GetNetworkInAnyState(project.Default, d.config["parent"])
 	if err != nil {
 		return err
 	}
@@ -646,7 +649,8 @@ func (d *nicBridged) setFilters() (err error) {
 	IPv6 := net.ParseIP(d.config["ipv6.address"])
 
 	// Check if the parent is managed and load config. If parent is unmanaged continue anyway.
-	n, err := network.LoadByName(d.state, d.config["parent"])
+	// project.Default is used here as bridge networks don't suppprt projects.
+	n, err := network.LoadByName(d.state, project.Default, d.config["parent"])
 	if err != nil && err != db.ErrNoSuchObject {
 		return err
 	}

From 3921195ca3e2c22136a1599211d6f3b8667d21ee Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:45:06 +0100
Subject: [PATCH 54/63] lxd/device/nic/macvlan: Use default project for macvlan
 networks

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/device/nic_macvlan.go | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/lxd/device/nic_macvlan.go b/lxd/device/nic_macvlan.go
index 788584f2cd..7dbfee53cb 100644
--- a/lxd/device/nic_macvlan.go
+++ b/lxd/device/nic_macvlan.go
@@ -9,6 +9,7 @@ import (
 	"github.com/lxc/lxd/lxd/instance"
 	"github.com/lxc/lxd/lxd/instance/instancetype"
 	"github.com/lxc/lxd/lxd/network"
+	"github.com/lxc/lxd/lxd/project"
 	"github.com/lxc/lxd/lxd/revert"
 	"github.com/lxc/lxd/shared"
 	"github.com/lxc/lxd/shared/api"
@@ -49,7 +50,8 @@ func (d *nicMACVLAN) validateConfig(instConf instance.ConfigReader) error {
 		}
 
 		// If network property is specified, lookup network settings and apply them to the device's config.
-		n, err := network.LoadByName(d.state, d.config["network"])
+		// project.Default is used here as macvlan networks don't suppprt projects.
+		n, err := network.LoadByName(d.state, project.Default, d.config["network"])
 		if err != nil {
 			return errors.Wrapf(err, "Error loading network config for %q", d.config["network"])
 		}

From 845f63e01d1e52d05b88edc7c289b4b3c6708d82 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:45:44 +0100
Subject: [PATCH 55/63] lxd/device/nic/ovn: Load parent network's project from
 instance's project

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/device/nic_ovn.go | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/lxd/device/nic_ovn.go b/lxd/device/nic_ovn.go
index 4b6db95bcd..31401bf6e1 100644
--- a/lxd/device/nic_ovn.go
+++ b/lxd/device/nic_ovn.go
@@ -14,6 +14,7 @@ import (
 	"github.com/lxc/lxd/lxd/instance/instancetype"
 	"github.com/lxc/lxd/lxd/network"
 	"github.com/lxc/lxd/lxd/network/openvswitch"
+	"github.com/lxc/lxd/lxd/project"
 	"github.com/lxc/lxd/lxd/revert"
 	"github.com/lxc/lxd/lxd/util"
 	"github.com/lxc/lxd/shared"
@@ -57,8 +58,14 @@ func (d *nicOVN) validateConfig(instConf instance.ConfigReader) error {
 		"boot.priority",
 	}
 
+	// The NIC's network may be a non-default project, so lookup project and get network's project name.
+	networkProjectName, err := project.NetworkProject(d.state.Cluster, instConf.Project())
+	if err != nil {
+		return errors.Wrapf(err, "Failed loading network project name")
+	}
+
 	// Lookup network settings and apply them to the device's config.
-	n, err := network.LoadByName(d.state, d.config["network"])
+	n, err := network.LoadByName(d.state, networkProjectName, d.config["network"])
 	if err != nil {
 		return errors.Wrapf(err, "Error loading network config for %q", d.config["network"])
 	}

From 3b099d57b361a6c183e9db97ff50e68551acd125 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:46:09 +0100
Subject: [PATCH 56/63] lxd/device/nic/sriov: Use default project for parent
 network

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/device/nic_sriov.go | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/lxd/device/nic_sriov.go b/lxd/device/nic_sriov.go
index 6bfcf3bd4d..aa843ecd05 100644
--- a/lxd/device/nic_sriov.go
+++ b/lxd/device/nic_sriov.go
@@ -18,6 +18,7 @@ import (
 	"github.com/lxc/lxd/lxd/instance"
 	"github.com/lxc/lxd/lxd/instance/instancetype"
 	"github.com/lxc/lxd/lxd/network"
+	"github.com/lxc/lxd/lxd/project"
 	"github.com/lxc/lxd/lxd/revert"
 	"github.com/lxc/lxd/lxd/util"
 	"github.com/lxc/lxd/shared"
@@ -59,7 +60,8 @@ func (d *nicSRIOV) validateConfig(instConf instance.ConfigReader) error {
 		}
 
 		// If network property is specified, lookup network settings and apply them to the device's config.
-		n, err := network.LoadByName(d.state, d.config["network"])
+		// project.Default is used here as macvlan networks don't suppprt projects.
+		n, err := network.LoadByName(d.state, project.Default, d.config["network"])
 		if err != nil {
 			return errors.Wrapf(err, "Error loading network config for %q", d.config["network"])
 		}

From 2414a88027334a89baadd826d19565fb4310bfff Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Mon, 24 Aug 2020 10:47:46 +0100
Subject: [PATCH 57/63] lxd/device/proxy: NICType project usage

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/device/proxy.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lxd/device/proxy.go b/lxd/device/proxy.go
index 80224ed23d..e2e7d604a3 100644
--- a/lxd/device/proxy.go
+++ b/lxd/device/proxy.go
@@ -356,7 +356,7 @@ func (d *proxy) setupNAT() error {
 			continue
 		}
 
-		nicType, err := nictype.NICType(d.state, devConfig)
+		nicType, err := nictype.NICType(d.state, d.inst.Project(), devConfig)
 		if err != nil {
 			return err
 		}

From 1ad9224735644e9040da81ab5ad6823b06873581 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Tue, 25 Aug 2020 10:02:38 +0100
Subject: [PATCH 58/63] lxd/network/driver/common: Send project when notifying
 nodes of network changes

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/network/driver_common.go | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/lxd/network/driver_common.go b/lxd/network/driver_common.go
index d912eaeac2..770511ec70 100644
--- a/lxd/network/driver_common.go
+++ b/lxd/network/driver_common.go
@@ -251,7 +251,7 @@ func (n *common) update(applyNetwork api.NetworkPut, targetNode string, clientTy
 			}
 
 			err = notifier(func(client lxd.InstanceServer) error {
-				return client.UpdateNetwork(n.name, sendNetwork, "")
+				return client.UseProject(n.project).UpdateNetwork(n.name, sendNetwork, "")
 			})
 			if err != nil {
 				return err
@@ -353,7 +353,7 @@ func (n *common) delete(clientType cluster.ClientType) error {
 			return err
 		}
 		err = notifier(func(client lxd.InstanceServer) error {
-			return client.DeleteNetwork(n.name)
+			return client.UseProject(n.project).DeleteNetwork(n.name)
 		})
 		if err != nil {
 			return err

From 5e831b72ca42ac5d2e959e8a04c00a0a4dd7c40b Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Tue, 25 Aug 2020 10:03:10 +0100
Subject: [PATCH 59/63] lxd/networks: Send project when creating network on
 remote node

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/networks.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/lxd/networks.go b/lxd/networks.go
index aec5027afb..9e9a056dd1 100644
--- a/lxd/networks.go
+++ b/lxd/networks.go
@@ -364,7 +364,7 @@ func networksPostCluster(d *Daemon, projectName string, req api.NetworksPost, cl
 			nodeReq.Config[key] = value
 		}
 
-		return client.CreateNetwork(nodeReq)
+		return client.UseProject(projectName).CreateNetwork(nodeReq)
 	})
 	if err != nil {
 		return err

From d420e40a9435b2a4f29a4203027b9da0cbf0ec1c Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Tue, 25 Aug 2020 10:29:36 +0100
Subject: [PATCH 60/63] lxd/db/migration/test: Add network project support

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/db/migration_test.go | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/lxd/db/migration_test.go b/lxd/db/migration_test.go
index 27ec12db15..fb2c07d16c 100644
--- a/lxd/db/migration_test.go
+++ b/lxd/db/migration_test.go
@@ -10,10 +10,12 @@ import (
 	"time"
 
 	"github.com/canonical/go-dqlite/driver"
-	"github.com/lxc/lxd/lxd/db"
-	"github.com/lxc/lxd/lxd/db/query"
 	"github.com/stretchr/testify/assert"
 	"github.com/stretchr/testify/require"
+
+	"github.com/lxc/lxd/lxd/db"
+	"github.com/lxc/lxd/lxd/db/query"
+	"github.com/lxc/lxd/lxd/project"
 )
 
 func TestLoadPreClusteringData(t *testing.T) {
@@ -85,10 +87,10 @@ func TestImportPreClusteringData(t *testing.T) {
 	require.NoError(t, err)
 
 	// networks
-	networks, err := cluster.GetNetworks()
+	networks, err := cluster.GetNetworks(project.Default)
 	require.NoError(t, err)
 	assert.Equal(t, []string{"lxcbr0"}, networks)
-	id, network, err := cluster.GetNetworkInAnyState("lxcbr0")
+	id, network, err := cluster.GetNetworkInAnyState(project.Default, "lxcbr0")
 	require.NoError(t, err)
 	assert.Equal(t, int64(1), id)
 	assert.Equal(t, "true", network.Config["ipv4.nat"])

From 623f582007729379f4e4b7bd011bd1fa6f3f51a3 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Tue, 25 Aug 2020 10:30:05 +0100
Subject: [PATCH 61/63] lxd/cluster/membership/test: Add network project
 support

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/cluster/membership_test.go | 10 ++++++----
 1 file changed, 6 insertions(+), 4 deletions(-)

diff --git a/lxd/cluster/membership_test.go b/lxd/cluster/membership_test.go
index 8013edba01..1a66266ffe 100644
--- a/lxd/cluster/membership_test.go
+++ b/lxd/cluster/membership_test.go
@@ -9,15 +9,17 @@ import (
 	"time"
 
 	"github.com/canonical/go-dqlite/driver"
+	"github.com/mpvl/subtest"
+	"github.com/stretchr/testify/assert"
+	"github.com/stretchr/testify/require"
+
 	"github.com/lxc/lxd/lxd/cluster"
 	"github.com/lxc/lxd/lxd/db"
+	"github.com/lxc/lxd/lxd/project"
 	"github.com/lxc/lxd/lxd/state"
 	"github.com/lxc/lxd/shared"
 	"github.com/lxc/lxd/shared/osarch"
 	"github.com/lxc/lxd/shared/version"
-	"github.com/mpvl/subtest"
-	"github.com/stretchr/testify/assert"
-	"github.com/stretchr/testify/require"
 )
 
 func TestBootstrap_UnmetPreconditions(t *testing.T) {
@@ -270,7 +272,7 @@ func TestJoin(t *testing.T) {
 
 	err = cluster.Bootstrap(targetState, targetGateway, "buzz")
 	require.NoError(t, err)
-	_, err = targetState.Cluster.GetNetworks()
+	_, err = targetState.Cluster.GetNetworks(project.Default)
 	require.NoError(t, err)
 
 	// Setup a joining node

From f0f306e32755b51165948a3b646c53fe98c105ed Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Tue, 25 Aug 2020 11:06:41 +0100
Subject: [PATCH 62/63] i18n: Update translation templates

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 po/bg.po      | 56 ++++++++++++++++++++++++++++-----------------------
 po/ca.po      | 56 ++++++++++++++++++++++++++++-----------------------
 po/de.po      | 56 ++++++++++++++++++++++++++++-----------------------
 po/el.po      | 56 ++++++++++++++++++++++++++++-----------------------
 po/es.po      | 56 ++++++++++++++++++++++++++++-----------------------
 po/fa.po      | 56 ++++++++++++++++++++++++++++-----------------------
 po/fi.po      | 56 ++++++++++++++++++++++++++++-----------------------
 po/fr.po      | 56 ++++++++++++++++++++++++++++-----------------------
 po/hi.po      | 56 ++++++++++++++++++++++++++++-----------------------
 po/id.po      | 56 ++++++++++++++++++++++++++++-----------------------
 po/it.po      | 56 ++++++++++++++++++++++++++++-----------------------
 po/ja.po      | 56 ++++++++++++++++++++++++++++-----------------------
 po/ko.po      | 56 ++++++++++++++++++++++++++++-----------------------
 po/lxd.pot    | 52 +++++++++++++++++++++++++----------------------
 po/nb_NO.po   | 56 ++++++++++++++++++++++++++++-----------------------
 po/nl.po      | 56 ++++++++++++++++++++++++++++-----------------------
 po/pa.po      | 56 ++++++++++++++++++++++++++++-----------------------
 po/pl.po      | 56 ++++++++++++++++++++++++++++-----------------------
 po/pt_BR.po   | 56 ++++++++++++++++++++++++++++-----------------------
 po/ru.po      | 56 ++++++++++++++++++++++++++++-----------------------
 po/sl.po      | 56 ++++++++++++++++++++++++++++-----------------------
 po/sr.po      | 56 ++++++++++++++++++++++++++++-----------------------
 po/sv.po      | 56 ++++++++++++++++++++++++++++-----------------------
 po/te.po      | 56 ++++++++++++++++++++++++++++-----------------------
 po/tr.po      | 56 ++++++++++++++++++++++++++++-----------------------
 po/ug.po      | 56 ++++++++++++++++++++++++++++-----------------------
 po/uk.po      | 56 ++++++++++++++++++++++++++++-----------------------
 po/zh_Hans.po | 56 ++++++++++++++++++++++++++++-----------------------
 28 files changed, 865 insertions(+), 699 deletions(-)

diff --git a/po/bg.po b/po/bg.po
index 234be60afc..321a022eef 100644
--- a/po/bg.po
+++ b/po/bg.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: 2020-08-24 11:17-0400\n"
+"POT-Creation-Date: 2020-08-25 11:06+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -905,8 +905,8 @@ msgstr ""
 #: lxc/profile.go:577 lxc/profile.go:636 lxc/profile.go:712 lxc/profile.go:762
 #: lxc/profile.go:821 lxc/profile.go:875 lxc/project.go:29 lxc/project.go:86
 #: lxc/project.go:151 lxc/project.go:214 lxc/project.go:334 lxc/project.go:384
-#: lxc/project.go:476 lxc/project.go:531 lxc/project.go:591 lxc/project.go:620
-#: lxc/project.go:673 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
+#: lxc/project.go:482 lxc/project.go:537 lxc/project.go:597 lxc/project.go:626
+#: lxc/project.go:679 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
 #: lxc/remote.go:84 lxc/remote.go:423 lxc/remote.go:459 lxc/remote.go:539
 #: lxc/remote.go:601 lxc/remote.go:651 lxc/remote.go:689 lxc/rename.go:21
 #: lxc/restore.go:24 lxc/snapshot.go:27 lxc/storage.go:33 lxc/storage.go:89
@@ -1361,7 +1361,7 @@ msgstr ""
 msgid "ID: %s"
 msgstr ""
 
-#: lxc/project.go:456
+#: lxc/project.go:461
 msgid "IMAGES"
 msgstr ""
 
@@ -2001,7 +2001,7 @@ msgid "Missing profile name"
 msgstr ""
 
 #: lxc/project.go:111 lxc/project.go:180 lxc/project.go:258 lxc/project.go:358
-#: lxc/project.go:500 lxc/project.go:558 lxc/project.go:644
+#: lxc/project.go:506 lxc/project.go:564 lxc/project.go:650
 msgid "Missing project name"
 msgstr ""
 
@@ -2073,11 +2073,15 @@ msgid "Must supply instance name for: "
 msgstr ""
 
 #: lxc/cluster.go:132 lxc/list.go:435 lxc/network.go:878 lxc/profile.go:620
-#: lxc/project.go:455 lxc/remote.go:517 lxc/storage.go:558
+#: lxc/project.go:460 lxc/remote.go:517 lxc/storage.go:558
 #: lxc/storage_volume.go:1136
 msgid "NAME"
 msgstr ""
 
+#: lxc/project.go:464
+msgid "NETWORKS"
+msgstr ""
+
 #: lxc/info.go:380
 msgid "NIC:"
 msgstr ""
@@ -2087,7 +2091,8 @@ msgid "NICs:"
 msgstr ""
 
 #: lxc/network.go:855 lxc/operation.go:143 lxc/project.go:429
-#: lxc/project.go:434 lxc/project.go:439 lxc/remote.go:480 lxc/remote.go:485
+#: lxc/project.go:434 lxc/project.go:439 lxc/project.go:444 lxc/remote.go:480
+#: lxc/remote.go:485
 msgid "NO"
 msgstr ""
 
@@ -2235,7 +2240,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:438 lxc/project.go:457
+#: lxc/list.go:438 lxc/project.go:462
 msgid "PROFILES"
 msgstr ""
 
@@ -2393,7 +2398,7 @@ msgstr ""
 msgid "Project %s deleted"
 msgstr ""
 
-#: lxc/project.go:515
+#: lxc/project.go:521
 #, c-format
 msgid "Project %s renamed to %s"
 msgstr ""
@@ -2474,7 +2479,7 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/project.go:699 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
+#: lxc/project.go:705 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
 #: lxc/remote.go:709
 #, c-format
 msgid "Remote %s doesn't exist"
@@ -2562,7 +2567,7 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
-#: lxc/project.go:475 lxc/project.go:476
+#: lxc/project.go:481 lxc/project.go:482
 msgid "Rename projects"
 msgstr ""
 
@@ -2667,7 +2672,7 @@ msgstr ""
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/project.go:458
+#: lxc/project.go:463
 msgid "STORAGE VOLUMES"
 msgstr ""
 
@@ -2757,11 +2762,11 @@ msgid ""
 "    lxc profile set [<remote>:]<profile> <key> <value>"
 msgstr ""
 
-#: lxc/project.go:530
+#: lxc/project.go:536
 msgid "Set project configuration keys"
 msgstr ""
 
-#: lxc/project.go:531
+#: lxc/project.go:537
 msgid ""
 "Set project configuration keys\n"
 "\n"
@@ -2868,7 +2873,7 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
-#: lxc/project.go:619 lxc/project.go:620
+#: lxc/project.go:625 lxc/project.go:626
 msgid "Show project options"
 msgstr ""
 
@@ -3039,7 +3044,7 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
-#: lxc/project.go:672 lxc/project.go:673
+#: lxc/project.go:678 lxc/project.go:679
 msgid "Switch the current project"
 msgstr ""
 
@@ -3232,7 +3237,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:459 lxc/storage.go:567
+#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:465 lxc/storage.go:567
 #: lxc/storage_volume.go:1139
 msgid "USED BY"
 msgstr ""
@@ -3277,7 +3282,7 @@ msgstr ""
 msgid "Unset profile configuration keys"
 msgstr ""
 
-#: lxc/project.go:590 lxc/project.go:591
+#: lxc/project.go:596 lxc/project.go:597
 msgid "Unset project configuration keys"
 msgstr ""
 
@@ -3366,7 +3371,8 @@ msgid "Whether or not to snapshot the instance's running state"
 msgstr ""
 
 #: lxc/network.go:857 lxc/operation.go:145 lxc/project.go:431
-#: lxc/project.go:436 lxc/project.go:441 lxc/remote.go:482 lxc/remote.go:487
+#: lxc/project.go:436 lxc/project.go:441 lxc/project.go:446 lxc/remote.go:482
+#: lxc/remote.go:487
 msgid "YES"
 msgstr ""
 
@@ -3490,7 +3496,7 @@ msgstr ""
 msgid "create [<remote>:]<project>"
 msgstr ""
 
-#: lxc/project.go:446
+#: lxc/project.go:451
 msgid "current"
 msgstr ""
 
@@ -4139,7 +4145,7 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
-#: lxc/project.go:473
+#: lxc/project.go:479
 msgid "rename [<remote>:]<project> <new-name>"
 msgstr ""
 
@@ -4175,7 +4181,7 @@ msgstr ""
 msgid "set [<remote>:]<profile> <key><value>..."
 msgstr ""
 
-#: lxc/project.go:529
+#: lxc/project.go:535
 msgid "set [<remote>:]<project> <key>=<value>..."
 msgstr ""
 
@@ -4227,7 +4233,7 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
-#: lxc/project.go:618
+#: lxc/project.go:624
 msgid "show [<remote>:]<project>"
 msgstr ""
 
@@ -4271,7 +4277,7 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
-#: lxc/project.go:671
+#: lxc/project.go:677
 msgid "switch [<remote>:]<project>"
 msgstr ""
 
@@ -4316,7 +4322,7 @@ msgstr ""
 msgid "unset [<remote>:]<profile> <key>"
 msgstr ""
 
-#: lxc/project.go:589
+#: lxc/project.go:595
 msgid "unset [<remote>:]<project> <key>"
 msgstr ""
 
diff --git a/po/ca.po b/po/ca.po
index 044b835ac8..03961e4ed0 100644
--- a/po/ca.po
+++ b/po/ca.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: 2020-08-24 11:17-0400\n"
+"POT-Creation-Date: 2020-08-25 11:06+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -905,8 +905,8 @@ msgstr ""
 #: lxc/profile.go:577 lxc/profile.go:636 lxc/profile.go:712 lxc/profile.go:762
 #: lxc/profile.go:821 lxc/profile.go:875 lxc/project.go:29 lxc/project.go:86
 #: lxc/project.go:151 lxc/project.go:214 lxc/project.go:334 lxc/project.go:384
-#: lxc/project.go:476 lxc/project.go:531 lxc/project.go:591 lxc/project.go:620
-#: lxc/project.go:673 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
+#: lxc/project.go:482 lxc/project.go:537 lxc/project.go:597 lxc/project.go:626
+#: lxc/project.go:679 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
 #: lxc/remote.go:84 lxc/remote.go:423 lxc/remote.go:459 lxc/remote.go:539
 #: lxc/remote.go:601 lxc/remote.go:651 lxc/remote.go:689 lxc/rename.go:21
 #: lxc/restore.go:24 lxc/snapshot.go:27 lxc/storage.go:33 lxc/storage.go:89
@@ -1361,7 +1361,7 @@ msgstr ""
 msgid "ID: %s"
 msgstr ""
 
-#: lxc/project.go:456
+#: lxc/project.go:461
 msgid "IMAGES"
 msgstr ""
 
@@ -2001,7 +2001,7 @@ msgid "Missing profile name"
 msgstr ""
 
 #: lxc/project.go:111 lxc/project.go:180 lxc/project.go:258 lxc/project.go:358
-#: lxc/project.go:500 lxc/project.go:558 lxc/project.go:644
+#: lxc/project.go:506 lxc/project.go:564 lxc/project.go:650
 msgid "Missing project name"
 msgstr ""
 
@@ -2073,11 +2073,15 @@ msgid "Must supply instance name for: "
 msgstr ""
 
 #: lxc/cluster.go:132 lxc/list.go:435 lxc/network.go:878 lxc/profile.go:620
-#: lxc/project.go:455 lxc/remote.go:517 lxc/storage.go:558
+#: lxc/project.go:460 lxc/remote.go:517 lxc/storage.go:558
 #: lxc/storage_volume.go:1136
 msgid "NAME"
 msgstr ""
 
+#: lxc/project.go:464
+msgid "NETWORKS"
+msgstr ""
+
 #: lxc/info.go:380
 msgid "NIC:"
 msgstr ""
@@ -2087,7 +2091,8 @@ msgid "NICs:"
 msgstr ""
 
 #: lxc/network.go:855 lxc/operation.go:143 lxc/project.go:429
-#: lxc/project.go:434 lxc/project.go:439 lxc/remote.go:480 lxc/remote.go:485
+#: lxc/project.go:434 lxc/project.go:439 lxc/project.go:444 lxc/remote.go:480
+#: lxc/remote.go:485
 msgid "NO"
 msgstr ""
 
@@ -2235,7 +2240,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:438 lxc/project.go:457
+#: lxc/list.go:438 lxc/project.go:462
 msgid "PROFILES"
 msgstr ""
 
@@ -2393,7 +2398,7 @@ msgstr ""
 msgid "Project %s deleted"
 msgstr ""
 
-#: lxc/project.go:515
+#: lxc/project.go:521
 #, c-format
 msgid "Project %s renamed to %s"
 msgstr ""
@@ -2474,7 +2479,7 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/project.go:699 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
+#: lxc/project.go:705 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
 #: lxc/remote.go:709
 #, c-format
 msgid "Remote %s doesn't exist"
@@ -2562,7 +2567,7 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
-#: lxc/project.go:475 lxc/project.go:476
+#: lxc/project.go:481 lxc/project.go:482
 msgid "Rename projects"
 msgstr ""
 
@@ -2667,7 +2672,7 @@ msgstr ""
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/project.go:458
+#: lxc/project.go:463
 msgid "STORAGE VOLUMES"
 msgstr ""
 
@@ -2757,11 +2762,11 @@ msgid ""
 "    lxc profile set [<remote>:]<profile> <key> <value>"
 msgstr ""
 
-#: lxc/project.go:530
+#: lxc/project.go:536
 msgid "Set project configuration keys"
 msgstr ""
 
-#: lxc/project.go:531
+#: lxc/project.go:537
 msgid ""
 "Set project configuration keys\n"
 "\n"
@@ -2868,7 +2873,7 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
-#: lxc/project.go:619 lxc/project.go:620
+#: lxc/project.go:625 lxc/project.go:626
 msgid "Show project options"
 msgstr ""
 
@@ -3039,7 +3044,7 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
-#: lxc/project.go:672 lxc/project.go:673
+#: lxc/project.go:678 lxc/project.go:679
 msgid "Switch the current project"
 msgstr ""
 
@@ -3232,7 +3237,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:459 lxc/storage.go:567
+#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:465 lxc/storage.go:567
 #: lxc/storage_volume.go:1139
 msgid "USED BY"
 msgstr ""
@@ -3277,7 +3282,7 @@ msgstr ""
 msgid "Unset profile configuration keys"
 msgstr ""
 
-#: lxc/project.go:590 lxc/project.go:591
+#: lxc/project.go:596 lxc/project.go:597
 msgid "Unset project configuration keys"
 msgstr ""
 
@@ -3366,7 +3371,8 @@ msgid "Whether or not to snapshot the instance's running state"
 msgstr ""
 
 #: lxc/network.go:857 lxc/operation.go:145 lxc/project.go:431
-#: lxc/project.go:436 lxc/project.go:441 lxc/remote.go:482 lxc/remote.go:487
+#: lxc/project.go:436 lxc/project.go:441 lxc/project.go:446 lxc/remote.go:482
+#: lxc/remote.go:487
 msgid "YES"
 msgstr ""
 
@@ -3490,7 +3496,7 @@ msgstr ""
 msgid "create [<remote>:]<project>"
 msgstr ""
 
-#: lxc/project.go:446
+#: lxc/project.go:451
 msgid "current"
 msgstr ""
 
@@ -4139,7 +4145,7 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
-#: lxc/project.go:473
+#: lxc/project.go:479
 msgid "rename [<remote>:]<project> <new-name>"
 msgstr ""
 
@@ -4175,7 +4181,7 @@ msgstr ""
 msgid "set [<remote>:]<profile> <key><value>..."
 msgstr ""
 
-#: lxc/project.go:529
+#: lxc/project.go:535
 msgid "set [<remote>:]<project> <key>=<value>..."
 msgstr ""
 
@@ -4227,7 +4233,7 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
-#: lxc/project.go:618
+#: lxc/project.go:624
 msgid "show [<remote>:]<project>"
 msgstr ""
 
@@ -4271,7 +4277,7 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
-#: lxc/project.go:671
+#: lxc/project.go:677
 msgid "switch [<remote>:]<project>"
 msgstr ""
 
@@ -4316,7 +4322,7 @@ msgstr ""
 msgid "unset [<remote>:]<profile> <key>"
 msgstr ""
 
-#: lxc/project.go:589
+#: lxc/project.go:595
 msgid "unset [<remote>:]<project> <key>"
 msgstr ""
 
diff --git a/po/de.po b/po/de.po
index 4717ab037d..e4484557a2 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: 2020-08-24 11:17-0400\n"
+"POT-Creation-Date: 2020-08-25 11:06+0100\n"
 "PO-Revision-Date: 2020-04-27 19:48+0000\n"
 "Last-Translator: Predatorix Phoenix <predatorix at web.de>\n"
 "Language-Team: German <https://hosted.weblate.org/projects/linux-containers/"
@@ -1087,8 +1087,8 @@ msgstr "Kein Zertifikat für diese Verbindung"
 #: lxc/profile.go:577 lxc/profile.go:636 lxc/profile.go:712 lxc/profile.go:762
 #: lxc/profile.go:821 lxc/profile.go:875 lxc/project.go:29 lxc/project.go:86
 #: lxc/project.go:151 lxc/project.go:214 lxc/project.go:334 lxc/project.go:384
-#: lxc/project.go:476 lxc/project.go:531 lxc/project.go:591 lxc/project.go:620
-#: lxc/project.go:673 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
+#: lxc/project.go:482 lxc/project.go:537 lxc/project.go:597 lxc/project.go:626
+#: lxc/project.go:679 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
 #: lxc/remote.go:84 lxc/remote.go:423 lxc/remote.go:459 lxc/remote.go:539
 #: lxc/remote.go:601 lxc/remote.go:651 lxc/remote.go:689 lxc/rename.go:21
 #: lxc/restore.go:24 lxc/snapshot.go:27 lxc/storage.go:33 lxc/storage.go:89
@@ -1576,7 +1576,7 @@ msgstr ""
 msgid "ID: %s"
 msgstr ""
 
-#: lxc/project.go:456
+#: lxc/project.go:461
 msgid "IMAGES"
 msgstr ""
 
@@ -2266,7 +2266,7 @@ msgid "Missing profile name"
 msgstr ""
 
 #: lxc/project.go:111 lxc/project.go:180 lxc/project.go:258 lxc/project.go:358
-#: lxc/project.go:500 lxc/project.go:558 lxc/project.go:644
+#: lxc/project.go:506 lxc/project.go:564 lxc/project.go:650
 #, fuzzy
 msgid "Missing project name"
 msgstr "Profilname kann nicht geändert werden"
@@ -2345,11 +2345,15 @@ msgid "Must supply instance name for: "
 msgstr "der Name des Ursprung Containers muss angegeben werden"
 
 #: lxc/cluster.go:132 lxc/list.go:435 lxc/network.go:878 lxc/profile.go:620
-#: lxc/project.go:455 lxc/remote.go:517 lxc/storage.go:558
+#: lxc/project.go:460 lxc/remote.go:517 lxc/storage.go:558
 #: lxc/storage_volume.go:1136
 msgid "NAME"
 msgstr ""
 
+#: lxc/project.go:464
+msgid "NETWORKS"
+msgstr ""
+
 #: lxc/info.go:380
 msgid "NIC:"
 msgstr ""
@@ -2359,7 +2363,8 @@ msgid "NICs:"
 msgstr ""
 
 #: lxc/network.go:855 lxc/operation.go:143 lxc/project.go:429
-#: lxc/project.go:434 lxc/project.go:439 lxc/remote.go:480 lxc/remote.go:485
+#: lxc/project.go:434 lxc/project.go:439 lxc/project.go:444 lxc/remote.go:480
+#: lxc/remote.go:485
 msgid "NO"
 msgstr ""
 
@@ -2512,7 +2517,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:438 lxc/project.go:457
+#: lxc/list.go:438 lxc/project.go:462
 msgid "PROFILES"
 msgstr ""
 
@@ -2675,7 +2680,7 @@ msgstr "Profil %s erstellt\n"
 msgid "Project %s deleted"
 msgstr "Profil %s gelöscht\n"
 
-#: lxc/project.go:515
+#: lxc/project.go:521
 #, fuzzy, c-format
 msgid "Project %s renamed to %s"
 msgstr "Profil %s wurde auf %s angewandt\n"
@@ -2760,7 +2765,7 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr "entfernte Instanz %s existiert bereits"
 
-#: lxc/project.go:699 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
+#: lxc/project.go:705 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
 #: lxc/remote.go:709
 #, fuzzy, c-format
 msgid "Remote %s doesn't exist"
@@ -2854,7 +2859,7 @@ msgstr ""
 msgid "Rename profiles"
 msgstr "Fehlerhafte Profil URL %s"
 
-#: lxc/project.go:475 lxc/project.go:476
+#: lxc/project.go:481 lxc/project.go:482
 #, fuzzy
 msgid "Rename projects"
 msgstr "Fehlerhafte Profil URL %s"
@@ -2966,7 +2971,7 @@ msgstr ""
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/project.go:458
+#: lxc/project.go:463
 msgid "STORAGE VOLUMES"
 msgstr ""
 
@@ -3060,12 +3065,12 @@ msgid ""
 "    lxc profile set [<remote>:]<profile> <key> <value>"
 msgstr ""
 
-#: lxc/project.go:530
+#: lxc/project.go:536
 #, fuzzy
 msgid "Set project configuration keys"
 msgstr "Profil %s erstellt\n"
 
-#: lxc/project.go:531
+#: lxc/project.go:537
 msgid ""
 "Set project configuration keys\n"
 "\n"
@@ -3179,7 +3184,7 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
-#: lxc/project.go:619 lxc/project.go:620
+#: lxc/project.go:625 lxc/project.go:626
 msgid "Show project options"
 msgstr ""
 
@@ -3360,7 +3365,7 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
-#: lxc/project.go:672 lxc/project.go:673
+#: lxc/project.go:678 lxc/project.go:679
 msgid "Switch the current project"
 msgstr ""
 
@@ -3560,7 +3565,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:459 lxc/storage.go:567
+#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:465 lxc/storage.go:567
 #: lxc/storage_volume.go:1139
 msgid "USED BY"
 msgstr ""
@@ -3608,7 +3613,7 @@ msgstr ""
 msgid "Unset profile configuration keys"
 msgstr ""
 
-#: lxc/project.go:590 lxc/project.go:591
+#: lxc/project.go:596 lxc/project.go:597
 #, fuzzy
 msgid "Unset project configuration keys"
 msgstr "Profil %s erstellt\n"
@@ -3708,7 +3713,8 @@ msgid "Whether or not to snapshot the instance's running state"
 msgstr "Zustand des laufenden Containers sichern oder nicht"
 
 #: lxc/network.go:857 lxc/operation.go:145 lxc/project.go:431
-#: lxc/project.go:436 lxc/project.go:441 lxc/remote.go:482 lxc/remote.go:487
+#: lxc/project.go:436 lxc/project.go:441 lxc/project.go:446 lxc/remote.go:482
+#: lxc/remote.go:487
 msgid "YES"
 msgstr ""
 
@@ -3857,7 +3863,7 @@ msgstr ""
 msgid "create [<remote>:]<project>"
 msgstr ""
 
-#: lxc/project.go:446
+#: lxc/project.go:451
 msgid "current"
 msgstr ""
 
@@ -4667,7 +4673,7 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
-#: lxc/project.go:473
+#: lxc/project.go:479
 msgid "rename [<remote>:]<project> <new-name>"
 msgstr ""
 
@@ -4733,7 +4739,7 @@ msgstr ""
 "\n"
 "lxd %s <Name>\n"
 
-#: lxc/project.go:529
+#: lxc/project.go:535
 #, fuzzy
 msgid "set [<remote>:]<project> <key>=<value>..."
 msgstr ""
@@ -4813,7 +4819,7 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
-#: lxc/project.go:618
+#: lxc/project.go:624
 msgid "show [<remote>:]<project>"
 msgstr ""
 
@@ -4880,7 +4886,7 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
-#: lxc/project.go:671
+#: lxc/project.go:677
 #, fuzzy
 msgid "switch [<remote>:]<project>"
 msgstr ""
@@ -4933,7 +4939,7 @@ msgstr ""
 msgid "unset [<remote>:]<profile> <key>"
 msgstr ""
 
-#: lxc/project.go:589
+#: lxc/project.go:595
 #, fuzzy
 msgid "unset [<remote>:]<project> <key>"
 msgstr ""
diff --git a/po/el.po b/po/el.po
index 3292ff09a4..7e06603e8b 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: 2020-08-24 11:17-0400\n"
+"POT-Creation-Date: 2020-08-25 11:06+0100\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/"
@@ -909,8 +909,8 @@ msgstr ""
 #: lxc/profile.go:577 lxc/profile.go:636 lxc/profile.go:712 lxc/profile.go:762
 #: lxc/profile.go:821 lxc/profile.go:875 lxc/project.go:29 lxc/project.go:86
 #: lxc/project.go:151 lxc/project.go:214 lxc/project.go:334 lxc/project.go:384
-#: lxc/project.go:476 lxc/project.go:531 lxc/project.go:591 lxc/project.go:620
-#: lxc/project.go:673 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
+#: lxc/project.go:482 lxc/project.go:537 lxc/project.go:597 lxc/project.go:626
+#: lxc/project.go:679 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
 #: lxc/remote.go:84 lxc/remote.go:423 lxc/remote.go:459 lxc/remote.go:539
 #: lxc/remote.go:601 lxc/remote.go:651 lxc/remote.go:689 lxc/rename.go:21
 #: lxc/restore.go:24 lxc/snapshot.go:27 lxc/storage.go:33 lxc/storage.go:89
@@ -1368,7 +1368,7 @@ msgstr ""
 msgid "ID: %s"
 msgstr ""
 
-#: lxc/project.go:456
+#: lxc/project.go:461
 msgid "IMAGES"
 msgstr ""
 
@@ -2010,7 +2010,7 @@ msgid "Missing profile name"
 msgstr ""
 
 #: lxc/project.go:111 lxc/project.go:180 lxc/project.go:258 lxc/project.go:358
-#: lxc/project.go:500 lxc/project.go:558 lxc/project.go:644
+#: lxc/project.go:506 lxc/project.go:564 lxc/project.go:650
 msgid "Missing project name"
 msgstr ""
 
@@ -2082,11 +2082,15 @@ msgid "Must supply instance name for: "
 msgstr ""
 
 #: lxc/cluster.go:132 lxc/list.go:435 lxc/network.go:878 lxc/profile.go:620
-#: lxc/project.go:455 lxc/remote.go:517 lxc/storage.go:558
+#: lxc/project.go:460 lxc/remote.go:517 lxc/storage.go:558
 #: lxc/storage_volume.go:1136
 msgid "NAME"
 msgstr ""
 
+#: lxc/project.go:464
+msgid "NETWORKS"
+msgstr ""
+
 #: lxc/info.go:380
 msgid "NIC:"
 msgstr ""
@@ -2096,7 +2100,8 @@ msgid "NICs:"
 msgstr ""
 
 #: lxc/network.go:855 lxc/operation.go:143 lxc/project.go:429
-#: lxc/project.go:434 lxc/project.go:439 lxc/remote.go:480 lxc/remote.go:485
+#: lxc/project.go:434 lxc/project.go:439 lxc/project.go:444 lxc/remote.go:480
+#: lxc/remote.go:485
 msgid "NO"
 msgstr ""
 
@@ -2246,7 +2251,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:438 lxc/project.go:457
+#: lxc/list.go:438 lxc/project.go:462
 msgid "PROFILES"
 msgstr ""
 
@@ -2404,7 +2409,7 @@ msgstr ""
 msgid "Project %s deleted"
 msgstr ""
 
-#: lxc/project.go:515
+#: lxc/project.go:521
 #, c-format
 msgid "Project %s renamed to %s"
 msgstr ""
@@ -2485,7 +2490,7 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/project.go:699 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
+#: lxc/project.go:705 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
 #: lxc/remote.go:709
 #, c-format
 msgid "Remote %s doesn't exist"
@@ -2573,7 +2578,7 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
-#: lxc/project.go:475 lxc/project.go:476
+#: lxc/project.go:481 lxc/project.go:482
 msgid "Rename projects"
 msgstr ""
 
@@ -2678,7 +2683,7 @@ msgstr ""
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/project.go:458
+#: lxc/project.go:463
 msgid "STORAGE VOLUMES"
 msgstr ""
 
@@ -2768,11 +2773,11 @@ msgid ""
 "    lxc profile set [<remote>:]<profile> <key> <value>"
 msgstr ""
 
-#: lxc/project.go:530
+#: lxc/project.go:536
 msgid "Set project configuration keys"
 msgstr ""
 
-#: lxc/project.go:531
+#: lxc/project.go:537
 msgid ""
 "Set project configuration keys\n"
 "\n"
@@ -2879,7 +2884,7 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
-#: lxc/project.go:619 lxc/project.go:620
+#: lxc/project.go:625 lxc/project.go:626
 msgid "Show project options"
 msgstr ""
 
@@ -3050,7 +3055,7 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
-#: lxc/project.go:672 lxc/project.go:673
+#: lxc/project.go:678 lxc/project.go:679
 msgid "Switch the current project"
 msgstr ""
 
@@ -3243,7 +3248,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:459 lxc/storage.go:567
+#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:465 lxc/storage.go:567
 #: lxc/storage_volume.go:1139
 msgid "USED BY"
 msgstr ""
@@ -3288,7 +3293,7 @@ msgstr ""
 msgid "Unset profile configuration keys"
 msgstr ""
 
-#: lxc/project.go:590 lxc/project.go:591
+#: lxc/project.go:596 lxc/project.go:597
 msgid "Unset project configuration keys"
 msgstr ""
 
@@ -3377,7 +3382,8 @@ msgid "Whether or not to snapshot the instance's running state"
 msgstr ""
 
 #: lxc/network.go:857 lxc/operation.go:145 lxc/project.go:431
-#: lxc/project.go:436 lxc/project.go:441 lxc/remote.go:482 lxc/remote.go:487
+#: lxc/project.go:436 lxc/project.go:441 lxc/project.go:446 lxc/remote.go:482
+#: lxc/remote.go:487
 msgid "YES"
 msgstr ""
 
@@ -3501,7 +3507,7 @@ msgstr ""
 msgid "create [<remote>:]<project>"
 msgstr ""
 
-#: lxc/project.go:446
+#: lxc/project.go:451
 msgid "current"
 msgstr ""
 
@@ -4150,7 +4156,7 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
-#: lxc/project.go:473
+#: lxc/project.go:479
 msgid "rename [<remote>:]<project> <new-name>"
 msgstr ""
 
@@ -4186,7 +4192,7 @@ msgstr ""
 msgid "set [<remote>:]<profile> <key><value>..."
 msgstr ""
 
-#: lxc/project.go:529
+#: lxc/project.go:535
 msgid "set [<remote>:]<project> <key>=<value>..."
 msgstr ""
 
@@ -4238,7 +4244,7 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
-#: lxc/project.go:618
+#: lxc/project.go:624
 msgid "show [<remote>:]<project>"
 msgstr ""
 
@@ -4282,7 +4288,7 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
-#: lxc/project.go:671
+#: lxc/project.go:677
 msgid "switch [<remote>:]<project>"
 msgstr ""
 
@@ -4327,7 +4333,7 @@ msgstr ""
 msgid "unset [<remote>:]<profile> <key>"
 msgstr ""
 
-#: lxc/project.go:589
+#: lxc/project.go:595
 msgid "unset [<remote>:]<project> <key>"
 msgstr ""
 
diff --git a/po/es.po b/po/es.po
index 13913ba256..c993589e03 100644
--- a/po/es.po
+++ b/po/es.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: 2020-08-24 11:17-0400\n"
+"POT-Creation-Date: 2020-08-25 11:06+0100\n"
 "PO-Revision-Date: 2019-09-06 07:09+0000\n"
 "Last-Translator: Stéphane Graber <stgraber at stgraber.org>\n"
 "Language-Team: Spanish <https://hosted.weblate.org/projects/linux-containers/"
@@ -1045,8 +1045,8 @@ msgstr ""
 #: lxc/profile.go:577 lxc/profile.go:636 lxc/profile.go:712 lxc/profile.go:762
 #: lxc/profile.go:821 lxc/profile.go:875 lxc/project.go:29 lxc/project.go:86
 #: lxc/project.go:151 lxc/project.go:214 lxc/project.go:334 lxc/project.go:384
-#: lxc/project.go:476 lxc/project.go:531 lxc/project.go:591 lxc/project.go:620
-#: lxc/project.go:673 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
+#: lxc/project.go:482 lxc/project.go:537 lxc/project.go:597 lxc/project.go:626
+#: lxc/project.go:679 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
 #: lxc/remote.go:84 lxc/remote.go:423 lxc/remote.go:459 lxc/remote.go:539
 #: lxc/remote.go:601 lxc/remote.go:651 lxc/remote.go:689 lxc/rename.go:21
 #: lxc/restore.go:24 lxc/snapshot.go:27 lxc/storage.go:33 lxc/storage.go:89
@@ -1506,7 +1506,7 @@ msgstr ""
 msgid "ID: %s"
 msgstr ""
 
-#: lxc/project.go:456
+#: lxc/project.go:461
 msgid "IMAGES"
 msgstr ""
 
@@ -2152,7 +2152,7 @@ msgid "Missing profile name"
 msgstr ""
 
 #: lxc/project.go:111 lxc/project.go:180 lxc/project.go:258 lxc/project.go:358
-#: lxc/project.go:500 lxc/project.go:558 lxc/project.go:644
+#: lxc/project.go:506 lxc/project.go:564 lxc/project.go:650
 #, fuzzy
 msgid "Missing project name"
 msgstr "Nombre del contenedor es: %s"
@@ -2226,11 +2226,15 @@ msgid "Must supply instance name for: "
 msgstr ""
 
 #: lxc/cluster.go:132 lxc/list.go:435 lxc/network.go:878 lxc/profile.go:620
-#: lxc/project.go:455 lxc/remote.go:517 lxc/storage.go:558
+#: lxc/project.go:460 lxc/remote.go:517 lxc/storage.go:558
 #: lxc/storage_volume.go:1136
 msgid "NAME"
 msgstr ""
 
+#: lxc/project.go:464
+msgid "NETWORKS"
+msgstr ""
+
 #: lxc/info.go:380
 msgid "NIC:"
 msgstr ""
@@ -2240,7 +2244,8 @@ msgid "NICs:"
 msgstr ""
 
 #: lxc/network.go:855 lxc/operation.go:143 lxc/project.go:429
-#: lxc/project.go:434 lxc/project.go:439 lxc/remote.go:480 lxc/remote.go:485
+#: lxc/project.go:434 lxc/project.go:439 lxc/project.go:444 lxc/remote.go:480
+#: lxc/remote.go:485
 msgid "NO"
 msgstr ""
 
@@ -2388,7 +2393,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:438 lxc/project.go:457
+#: lxc/list.go:438 lxc/project.go:462
 msgid "PROFILES"
 msgstr ""
 
@@ -2549,7 +2554,7 @@ msgstr ""
 msgid "Project %s deleted"
 msgstr ""
 
-#: lxc/project.go:515
+#: lxc/project.go:521
 #, c-format
 msgid "Project %s renamed to %s"
 msgstr ""
@@ -2630,7 +2635,7 @@ msgstr "Refrescando la imagen: %s"
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/project.go:699 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
+#: lxc/project.go:705 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
 #: lxc/remote.go:709
 #, c-format
 msgid "Remote %s doesn't exist"
@@ -2719,7 +2724,7 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
-#: lxc/project.go:475 lxc/project.go:476
+#: lxc/project.go:481 lxc/project.go:482
 msgid "Rename projects"
 msgstr ""
 
@@ -2826,7 +2831,7 @@ msgstr ""
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/project.go:458
+#: lxc/project.go:463
 msgid "STORAGE VOLUMES"
 msgstr ""
 
@@ -2916,11 +2921,11 @@ msgid ""
 "    lxc profile set [<remote>:]<profile> <key> <value>"
 msgstr ""
 
-#: lxc/project.go:530
+#: lxc/project.go:536
 msgid "Set project configuration keys"
 msgstr ""
 
-#: lxc/project.go:531
+#: lxc/project.go:537
 msgid ""
 "Set project configuration keys\n"
 "\n"
@@ -3027,7 +3032,7 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
-#: lxc/project.go:619 lxc/project.go:620
+#: lxc/project.go:625 lxc/project.go:626
 msgid "Show project options"
 msgstr ""
 
@@ -3198,7 +3203,7 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
-#: lxc/project.go:672 lxc/project.go:673
+#: lxc/project.go:678 lxc/project.go:679
 msgid "Switch the current project"
 msgstr ""
 
@@ -3391,7 +3396,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:459 lxc/storage.go:567
+#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:465 lxc/storage.go:567
 #: lxc/storage_volume.go:1139
 msgid "USED BY"
 msgstr ""
@@ -3436,7 +3441,7 @@ msgstr ""
 msgid "Unset profile configuration keys"
 msgstr ""
 
-#: lxc/project.go:590 lxc/project.go:591
+#: lxc/project.go:596 lxc/project.go:597
 msgid "Unset project configuration keys"
 msgstr ""
 
@@ -3525,7 +3530,8 @@ msgid "Whether or not to snapshot the instance's running state"
 msgstr ""
 
 #: lxc/network.go:857 lxc/operation.go:145 lxc/project.go:431
-#: lxc/project.go:436 lxc/project.go:441 lxc/remote.go:482 lxc/remote.go:487
+#: lxc/project.go:436 lxc/project.go:441 lxc/project.go:446 lxc/remote.go:482
+#: lxc/remote.go:487
 msgid "YES"
 msgstr ""
 
@@ -3653,7 +3659,7 @@ msgstr ""
 msgid "create [<remote>:]<project>"
 msgstr ""
 
-#: lxc/project.go:446
+#: lxc/project.go:451
 msgid "current"
 msgstr ""
 
@@ -4321,7 +4327,7 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
-#: lxc/project.go:473
+#: lxc/project.go:479
 msgid "rename [<remote>:]<project> <new-name>"
 msgstr ""
 
@@ -4360,7 +4366,7 @@ msgstr ""
 msgid "set [<remote>:]<profile> <key><value>..."
 msgstr ""
 
-#: lxc/project.go:529
+#: lxc/project.go:535
 msgid "set [<remote>:]<project> <key>=<value>..."
 msgstr ""
 
@@ -4416,7 +4422,7 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
-#: lxc/project.go:618
+#: lxc/project.go:624
 msgid "show [<remote>:]<project>"
 msgstr ""
 
@@ -4464,7 +4470,7 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
-#: lxc/project.go:671
+#: lxc/project.go:677
 #, fuzzy
 msgid "switch [<remote>:]<project>"
 msgstr "No se puede proveer el nombre del container a la lista"
@@ -4511,7 +4517,7 @@ msgstr ""
 msgid "unset [<remote>:]<profile> <key>"
 msgstr ""
 
-#: lxc/project.go:589
+#: lxc/project.go:595
 msgid "unset [<remote>:]<project> <key>"
 msgstr ""
 
diff --git a/po/fa.po b/po/fa.po
index 057da7ae9d..579dab775a 100644
--- a/po/fa.po
+++ b/po/fa.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: 2020-08-24 11:17-0400\n"
+"POT-Creation-Date: 2020-08-25 11:06+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -905,8 +905,8 @@ msgstr ""
 #: lxc/profile.go:577 lxc/profile.go:636 lxc/profile.go:712 lxc/profile.go:762
 #: lxc/profile.go:821 lxc/profile.go:875 lxc/project.go:29 lxc/project.go:86
 #: lxc/project.go:151 lxc/project.go:214 lxc/project.go:334 lxc/project.go:384
-#: lxc/project.go:476 lxc/project.go:531 lxc/project.go:591 lxc/project.go:620
-#: lxc/project.go:673 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
+#: lxc/project.go:482 lxc/project.go:537 lxc/project.go:597 lxc/project.go:626
+#: lxc/project.go:679 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
 #: lxc/remote.go:84 lxc/remote.go:423 lxc/remote.go:459 lxc/remote.go:539
 #: lxc/remote.go:601 lxc/remote.go:651 lxc/remote.go:689 lxc/rename.go:21
 #: lxc/restore.go:24 lxc/snapshot.go:27 lxc/storage.go:33 lxc/storage.go:89
@@ -1361,7 +1361,7 @@ msgstr ""
 msgid "ID: %s"
 msgstr ""
 
-#: lxc/project.go:456
+#: lxc/project.go:461
 msgid "IMAGES"
 msgstr ""
 
@@ -2001,7 +2001,7 @@ msgid "Missing profile name"
 msgstr ""
 
 #: lxc/project.go:111 lxc/project.go:180 lxc/project.go:258 lxc/project.go:358
-#: lxc/project.go:500 lxc/project.go:558 lxc/project.go:644
+#: lxc/project.go:506 lxc/project.go:564 lxc/project.go:650
 msgid "Missing project name"
 msgstr ""
 
@@ -2073,11 +2073,15 @@ msgid "Must supply instance name for: "
 msgstr ""
 
 #: lxc/cluster.go:132 lxc/list.go:435 lxc/network.go:878 lxc/profile.go:620
-#: lxc/project.go:455 lxc/remote.go:517 lxc/storage.go:558
+#: lxc/project.go:460 lxc/remote.go:517 lxc/storage.go:558
 #: lxc/storage_volume.go:1136
 msgid "NAME"
 msgstr ""
 
+#: lxc/project.go:464
+msgid "NETWORKS"
+msgstr ""
+
 #: lxc/info.go:380
 msgid "NIC:"
 msgstr ""
@@ -2087,7 +2091,8 @@ msgid "NICs:"
 msgstr ""
 
 #: lxc/network.go:855 lxc/operation.go:143 lxc/project.go:429
-#: lxc/project.go:434 lxc/project.go:439 lxc/remote.go:480 lxc/remote.go:485
+#: lxc/project.go:434 lxc/project.go:439 lxc/project.go:444 lxc/remote.go:480
+#: lxc/remote.go:485
 msgid "NO"
 msgstr ""
 
@@ -2235,7 +2240,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:438 lxc/project.go:457
+#: lxc/list.go:438 lxc/project.go:462
 msgid "PROFILES"
 msgstr ""
 
@@ -2393,7 +2398,7 @@ msgstr ""
 msgid "Project %s deleted"
 msgstr ""
 
-#: lxc/project.go:515
+#: lxc/project.go:521
 #, c-format
 msgid "Project %s renamed to %s"
 msgstr ""
@@ -2474,7 +2479,7 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/project.go:699 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
+#: lxc/project.go:705 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
 #: lxc/remote.go:709
 #, c-format
 msgid "Remote %s doesn't exist"
@@ -2562,7 +2567,7 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
-#: lxc/project.go:475 lxc/project.go:476
+#: lxc/project.go:481 lxc/project.go:482
 msgid "Rename projects"
 msgstr ""
 
@@ -2667,7 +2672,7 @@ msgstr ""
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/project.go:458
+#: lxc/project.go:463
 msgid "STORAGE VOLUMES"
 msgstr ""
 
@@ -2757,11 +2762,11 @@ msgid ""
 "    lxc profile set [<remote>:]<profile> <key> <value>"
 msgstr ""
 
-#: lxc/project.go:530
+#: lxc/project.go:536
 msgid "Set project configuration keys"
 msgstr ""
 
-#: lxc/project.go:531
+#: lxc/project.go:537
 msgid ""
 "Set project configuration keys\n"
 "\n"
@@ -2868,7 +2873,7 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
-#: lxc/project.go:619 lxc/project.go:620
+#: lxc/project.go:625 lxc/project.go:626
 msgid "Show project options"
 msgstr ""
 
@@ -3039,7 +3044,7 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
-#: lxc/project.go:672 lxc/project.go:673
+#: lxc/project.go:678 lxc/project.go:679
 msgid "Switch the current project"
 msgstr ""
 
@@ -3232,7 +3237,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:459 lxc/storage.go:567
+#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:465 lxc/storage.go:567
 #: lxc/storage_volume.go:1139
 msgid "USED BY"
 msgstr ""
@@ -3277,7 +3282,7 @@ msgstr ""
 msgid "Unset profile configuration keys"
 msgstr ""
 
-#: lxc/project.go:590 lxc/project.go:591
+#: lxc/project.go:596 lxc/project.go:597
 msgid "Unset project configuration keys"
 msgstr ""
 
@@ -3366,7 +3371,8 @@ msgid "Whether or not to snapshot the instance's running state"
 msgstr ""
 
 #: lxc/network.go:857 lxc/operation.go:145 lxc/project.go:431
-#: lxc/project.go:436 lxc/project.go:441 lxc/remote.go:482 lxc/remote.go:487
+#: lxc/project.go:436 lxc/project.go:441 lxc/project.go:446 lxc/remote.go:482
+#: lxc/remote.go:487
 msgid "YES"
 msgstr ""
 
@@ -3490,7 +3496,7 @@ msgstr ""
 msgid "create [<remote>:]<project>"
 msgstr ""
 
-#: lxc/project.go:446
+#: lxc/project.go:451
 msgid "current"
 msgstr ""
 
@@ -4139,7 +4145,7 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
-#: lxc/project.go:473
+#: lxc/project.go:479
 msgid "rename [<remote>:]<project> <new-name>"
 msgstr ""
 
@@ -4175,7 +4181,7 @@ msgstr ""
 msgid "set [<remote>:]<profile> <key><value>..."
 msgstr ""
 
-#: lxc/project.go:529
+#: lxc/project.go:535
 msgid "set [<remote>:]<project> <key>=<value>..."
 msgstr ""
 
@@ -4227,7 +4233,7 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
-#: lxc/project.go:618
+#: lxc/project.go:624
 msgid "show [<remote>:]<project>"
 msgstr ""
 
@@ -4271,7 +4277,7 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
-#: lxc/project.go:671
+#: lxc/project.go:677
 msgid "switch [<remote>:]<project>"
 msgstr ""
 
@@ -4316,7 +4322,7 @@ msgstr ""
 msgid "unset [<remote>:]<profile> <key>"
 msgstr ""
 
-#: lxc/project.go:589
+#: lxc/project.go:595
 msgid "unset [<remote>:]<project> <key>"
 msgstr ""
 
diff --git a/po/fi.po b/po/fi.po
index 43742b63b6..12a3178e05 100644
--- a/po/fi.po
+++ b/po/fi.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: 2020-08-24 11:17-0400\n"
+"POT-Creation-Date: 2020-08-25 11:06+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -905,8 +905,8 @@ msgstr ""
 #: lxc/profile.go:577 lxc/profile.go:636 lxc/profile.go:712 lxc/profile.go:762
 #: lxc/profile.go:821 lxc/profile.go:875 lxc/project.go:29 lxc/project.go:86
 #: lxc/project.go:151 lxc/project.go:214 lxc/project.go:334 lxc/project.go:384
-#: lxc/project.go:476 lxc/project.go:531 lxc/project.go:591 lxc/project.go:620
-#: lxc/project.go:673 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
+#: lxc/project.go:482 lxc/project.go:537 lxc/project.go:597 lxc/project.go:626
+#: lxc/project.go:679 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
 #: lxc/remote.go:84 lxc/remote.go:423 lxc/remote.go:459 lxc/remote.go:539
 #: lxc/remote.go:601 lxc/remote.go:651 lxc/remote.go:689 lxc/rename.go:21
 #: lxc/restore.go:24 lxc/snapshot.go:27 lxc/storage.go:33 lxc/storage.go:89
@@ -1361,7 +1361,7 @@ msgstr ""
 msgid "ID: %s"
 msgstr ""
 
-#: lxc/project.go:456
+#: lxc/project.go:461
 msgid "IMAGES"
 msgstr ""
 
@@ -2001,7 +2001,7 @@ msgid "Missing profile name"
 msgstr ""
 
 #: lxc/project.go:111 lxc/project.go:180 lxc/project.go:258 lxc/project.go:358
-#: lxc/project.go:500 lxc/project.go:558 lxc/project.go:644
+#: lxc/project.go:506 lxc/project.go:564 lxc/project.go:650
 msgid "Missing project name"
 msgstr ""
 
@@ -2073,11 +2073,15 @@ msgid "Must supply instance name for: "
 msgstr ""
 
 #: lxc/cluster.go:132 lxc/list.go:435 lxc/network.go:878 lxc/profile.go:620
-#: lxc/project.go:455 lxc/remote.go:517 lxc/storage.go:558
+#: lxc/project.go:460 lxc/remote.go:517 lxc/storage.go:558
 #: lxc/storage_volume.go:1136
 msgid "NAME"
 msgstr ""
 
+#: lxc/project.go:464
+msgid "NETWORKS"
+msgstr ""
+
 #: lxc/info.go:380
 msgid "NIC:"
 msgstr ""
@@ -2087,7 +2091,8 @@ msgid "NICs:"
 msgstr ""
 
 #: lxc/network.go:855 lxc/operation.go:143 lxc/project.go:429
-#: lxc/project.go:434 lxc/project.go:439 lxc/remote.go:480 lxc/remote.go:485
+#: lxc/project.go:434 lxc/project.go:439 lxc/project.go:444 lxc/remote.go:480
+#: lxc/remote.go:485
 msgid "NO"
 msgstr ""
 
@@ -2235,7 +2240,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:438 lxc/project.go:457
+#: lxc/list.go:438 lxc/project.go:462
 msgid "PROFILES"
 msgstr ""
 
@@ -2393,7 +2398,7 @@ msgstr ""
 msgid "Project %s deleted"
 msgstr ""
 
-#: lxc/project.go:515
+#: lxc/project.go:521
 #, c-format
 msgid "Project %s renamed to %s"
 msgstr ""
@@ -2474,7 +2479,7 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/project.go:699 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
+#: lxc/project.go:705 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
 #: lxc/remote.go:709
 #, c-format
 msgid "Remote %s doesn't exist"
@@ -2562,7 +2567,7 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
-#: lxc/project.go:475 lxc/project.go:476
+#: lxc/project.go:481 lxc/project.go:482
 msgid "Rename projects"
 msgstr ""
 
@@ -2667,7 +2672,7 @@ msgstr ""
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/project.go:458
+#: lxc/project.go:463
 msgid "STORAGE VOLUMES"
 msgstr ""
 
@@ -2757,11 +2762,11 @@ msgid ""
 "    lxc profile set [<remote>:]<profile> <key> <value>"
 msgstr ""
 
-#: lxc/project.go:530
+#: lxc/project.go:536
 msgid "Set project configuration keys"
 msgstr ""
 
-#: lxc/project.go:531
+#: lxc/project.go:537
 msgid ""
 "Set project configuration keys\n"
 "\n"
@@ -2868,7 +2873,7 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
-#: lxc/project.go:619 lxc/project.go:620
+#: lxc/project.go:625 lxc/project.go:626
 msgid "Show project options"
 msgstr ""
 
@@ -3039,7 +3044,7 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
-#: lxc/project.go:672 lxc/project.go:673
+#: lxc/project.go:678 lxc/project.go:679
 msgid "Switch the current project"
 msgstr ""
 
@@ -3232,7 +3237,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:459 lxc/storage.go:567
+#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:465 lxc/storage.go:567
 #: lxc/storage_volume.go:1139
 msgid "USED BY"
 msgstr ""
@@ -3277,7 +3282,7 @@ msgstr ""
 msgid "Unset profile configuration keys"
 msgstr ""
 
-#: lxc/project.go:590 lxc/project.go:591
+#: lxc/project.go:596 lxc/project.go:597
 msgid "Unset project configuration keys"
 msgstr ""
 
@@ -3366,7 +3371,8 @@ msgid "Whether or not to snapshot the instance's running state"
 msgstr ""
 
 #: lxc/network.go:857 lxc/operation.go:145 lxc/project.go:431
-#: lxc/project.go:436 lxc/project.go:441 lxc/remote.go:482 lxc/remote.go:487
+#: lxc/project.go:436 lxc/project.go:441 lxc/project.go:446 lxc/remote.go:482
+#: lxc/remote.go:487
 msgid "YES"
 msgstr ""
 
@@ -3490,7 +3496,7 @@ msgstr ""
 msgid "create [<remote>:]<project>"
 msgstr ""
 
-#: lxc/project.go:446
+#: lxc/project.go:451
 msgid "current"
 msgstr ""
 
@@ -4139,7 +4145,7 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
-#: lxc/project.go:473
+#: lxc/project.go:479
 msgid "rename [<remote>:]<project> <new-name>"
 msgstr ""
 
@@ -4175,7 +4181,7 @@ msgstr ""
 msgid "set [<remote>:]<profile> <key><value>..."
 msgstr ""
 
-#: lxc/project.go:529
+#: lxc/project.go:535
 msgid "set [<remote>:]<project> <key>=<value>..."
 msgstr ""
 
@@ -4227,7 +4233,7 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
-#: lxc/project.go:618
+#: lxc/project.go:624
 msgid "show [<remote>:]<project>"
 msgstr ""
 
@@ -4271,7 +4277,7 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
-#: lxc/project.go:671
+#: lxc/project.go:677
 msgid "switch [<remote>:]<project>"
 msgstr ""
 
@@ -4316,7 +4322,7 @@ msgstr ""
 msgid "unset [<remote>:]<profile> <key>"
 msgstr ""
 
-#: lxc/project.go:589
+#: lxc/project.go:595
 msgid "unset [<remote>:]<project> <key>"
 msgstr ""
 
diff --git a/po/fr.po b/po/fr.po
index f6b5cc4521..dc0d96b1da 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: 2020-08-24 11:17-0400\n"
+"POT-Creation-Date: 2020-08-25 11:06+0100\n"
 "PO-Revision-Date: 2019-01-04 18:07+0000\n"
 "Last-Translator: Deleted User <noreply+12102 at weblate.org>\n"
 "Language-Team: French <https://hosted.weblate.org/projects/linux-containers/"
@@ -1097,8 +1097,8 @@ msgstr "Copie de l'image : %s"
 #: lxc/profile.go:577 lxc/profile.go:636 lxc/profile.go:712 lxc/profile.go:762
 #: lxc/profile.go:821 lxc/profile.go:875 lxc/project.go:29 lxc/project.go:86
 #: lxc/project.go:151 lxc/project.go:214 lxc/project.go:334 lxc/project.go:384
-#: lxc/project.go:476 lxc/project.go:531 lxc/project.go:591 lxc/project.go:620
-#: lxc/project.go:673 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
+#: lxc/project.go:482 lxc/project.go:537 lxc/project.go:597 lxc/project.go:626
+#: lxc/project.go:679 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
 #: lxc/remote.go:84 lxc/remote.go:423 lxc/remote.go:459 lxc/remote.go:539
 #: lxc/remote.go:601 lxc/remote.go:651 lxc/remote.go:689 lxc/rename.go:21
 #: lxc/restore.go:24 lxc/snapshot.go:27 lxc/storage.go:33 lxc/storage.go:89
@@ -1591,7 +1591,7 @@ msgstr "Pid : %d"
 msgid "ID: %s"
 msgstr ""
 
-#: lxc/project.go:456
+#: lxc/project.go:461
 msgid "IMAGES"
 msgstr ""
 
@@ -2325,7 +2325,7 @@ msgid "Missing profile name"
 msgstr ""
 
 #: lxc/project.go:111 lxc/project.go:180 lxc/project.go:258 lxc/project.go:358
-#: lxc/project.go:500 lxc/project.go:558 lxc/project.go:644
+#: lxc/project.go:506 lxc/project.go:564 lxc/project.go:650
 #, fuzzy
 msgid "Missing project name"
 msgstr "Nom de l'ensemble de stockage"
@@ -2406,11 +2406,15 @@ msgid "Must supply instance name for: "
 msgstr "Vous devez fournir le nom d'un conteneur pour : "
 
 #: lxc/cluster.go:132 lxc/list.go:435 lxc/network.go:878 lxc/profile.go:620
-#: lxc/project.go:455 lxc/remote.go:517 lxc/storage.go:558
+#: lxc/project.go:460 lxc/remote.go:517 lxc/storage.go:558
 #: lxc/storage_volume.go:1136
 msgid "NAME"
 msgstr "NOM"
 
+#: lxc/project.go:464
+msgid "NETWORKS"
+msgstr ""
+
 #: lxc/info.go:380
 msgid "NIC:"
 msgstr ""
@@ -2420,7 +2424,8 @@ msgid "NICs:"
 msgstr ""
 
 #: lxc/network.go:855 lxc/operation.go:143 lxc/project.go:429
-#: lxc/project.go:434 lxc/project.go:439 lxc/remote.go:480 lxc/remote.go:485
+#: lxc/project.go:434 lxc/project.go:439 lxc/project.go:444 lxc/remote.go:480
+#: lxc/remote.go:485
 msgid "NO"
 msgstr "NON"
 
@@ -2580,7 +2585,7 @@ msgstr "PID"
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:438 lxc/project.go:457
+#: lxc/list.go:438 lxc/project.go:462
 msgid "PROFILES"
 msgstr "PROFILS"
 
@@ -2744,7 +2749,7 @@ msgstr "Profil %s créé"
 msgid "Project %s deleted"
 msgstr "Profil %s supprimé"
 
-#: lxc/project.go:515
+#: lxc/project.go:521
 #, fuzzy, c-format
 msgid "Project %s renamed to %s"
 msgstr "Profil %s ajouté à %s"
@@ -2830,7 +2835,7 @@ msgstr "Récupération de l'image : %s"
 msgid "Remote %s already exists"
 msgstr "le serveur distant %s existe déjà"
 
-#: lxc/project.go:699 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
+#: lxc/project.go:705 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
 #: lxc/remote.go:709
 #, fuzzy, c-format
 msgid "Remote %s doesn't exist"
@@ -2923,7 +2928,7 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
-#: lxc/project.go:475 lxc/project.go:476
+#: lxc/project.go:481 lxc/project.go:482
 #, fuzzy
 msgid "Rename projects"
 msgstr "Créé : %s"
@@ -3037,7 +3042,7 @@ msgstr "ÉTAT"
 msgid "STORAGE POOL"
 msgstr "ENSEMBLE DE STOCKAGE"
 
-#: lxc/project.go:458
+#: lxc/project.go:463
 #, fuzzy
 msgid "STORAGE VOLUMES"
 msgstr "ENSEMBLE DE STOCKAGE"
@@ -3134,12 +3139,12 @@ msgid ""
 "    lxc profile set [<remote>:]<profile> <key> <value>"
 msgstr ""
 
-#: lxc/project.go:530
+#: lxc/project.go:536
 #, fuzzy
 msgid "Set project configuration keys"
 msgstr "Clé de configuration invalide"
 
-#: lxc/project.go:531
+#: lxc/project.go:537
 msgid ""
 "Set project configuration keys\n"
 "\n"
@@ -3256,7 +3261,7 @@ msgstr "Afficher la configuration étendue"
 msgid "Show profile configurations"
 msgstr "Afficher la configuration étendue"
 
-#: lxc/project.go:619 lxc/project.go:620
+#: lxc/project.go:625 lxc/project.go:626
 #, fuzzy
 msgid "Show project options"
 msgstr "Afficher la configuration étendue"
@@ -3439,7 +3444,7 @@ msgstr "Swap (courant)"
 msgid "Swap (peak)"
 msgstr "Swap (pointe)"
 
-#: lxc/project.go:672 lxc/project.go:673
+#: lxc/project.go:678 lxc/project.go:679
 #, fuzzy
 msgid "Switch the current project"
 msgstr "impossible de supprimer le serveur distant par défaut"
@@ -3647,7 +3652,7 @@ msgstr "DATE DE PUBLICATION"
 msgid "URL"
 msgstr "URL"
 
-#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:459 lxc/storage.go:567
+#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:465 lxc/storage.go:567
 #: lxc/storage_volume.go:1139
 msgid "USED BY"
 msgstr "UTILISÉ PAR"
@@ -3697,7 +3702,7 @@ msgstr "Clé de configuration invalide"
 msgid "Unset profile configuration keys"
 msgstr "Clé de configuration invalide"
 
-#: lxc/project.go:590 lxc/project.go:591
+#: lxc/project.go:596 lxc/project.go:597
 #, fuzzy
 msgid "Unset project configuration keys"
 msgstr "Clé de configuration invalide"
@@ -3795,7 +3800,8 @@ msgid "Whether or not to snapshot the instance's running state"
 msgstr "Réaliser ou pas l'instantané de l'état de fonctionnement du conteneur"
 
 #: lxc/network.go:857 lxc/operation.go:145 lxc/project.go:431
-#: lxc/project.go:436 lxc/project.go:441 lxc/remote.go:482 lxc/remote.go:487
+#: lxc/project.go:436 lxc/project.go:441 lxc/project.go:446 lxc/remote.go:482
+#: lxc/remote.go:487
 msgid "YES"
 msgstr "OUI"
 
@@ -3948,7 +3954,7 @@ msgstr ""
 msgid "create [<remote>:]<project>"
 msgstr ""
 
-#: lxc/project.go:446
+#: lxc/project.go:451
 #, fuzzy
 msgid "current"
 msgstr "Swap (courant)"
@@ -4818,7 +4824,7 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
-#: lxc/project.go:473
+#: lxc/project.go:479
 msgid "rename [<remote>:]<project> <new-name>"
 msgstr ""
 
@@ -4890,7 +4896,7 @@ msgstr ""
 "\n"
 "lxc %s [<remote>:]<container> [[<remote>:]<container>...]%s"
 
-#: lxc/project.go:529
+#: lxc/project.go:535
 #, fuzzy
 msgid "set [<remote>:]<project> <key>=<value>..."
 msgstr ""
@@ -4982,7 +4988,7 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
-#: lxc/project.go:618
+#: lxc/project.go:624
 msgid "show [<remote>:]<project>"
 msgstr ""
 
@@ -5059,7 +5065,7 @@ msgstr ""
 msgid "switch <remote>"
 msgstr "impossible de supprimer le serveur distant par défaut"
 
-#: lxc/project.go:671
+#: lxc/project.go:677
 #, fuzzy
 msgid "switch [<remote>:]<project>"
 msgstr "impossible de supprimer le serveur distant par défaut"
@@ -5109,7 +5115,7 @@ msgstr ""
 msgid "unset [<remote>:]<profile> <key>"
 msgstr ""
 
-#: lxc/project.go:589
+#: lxc/project.go:595
 #, fuzzy
 msgid "unset [<remote>:]<project> <key>"
 msgstr ""
diff --git a/po/hi.po b/po/hi.po
index c17f4ad8b1..2b0e5aa284 100644
--- a/po/hi.po
+++ b/po/hi.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: 2020-08-24 11:17-0400\n"
+"POT-Creation-Date: 2020-08-25 11:06+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -905,8 +905,8 @@ msgstr ""
 #: lxc/profile.go:577 lxc/profile.go:636 lxc/profile.go:712 lxc/profile.go:762
 #: lxc/profile.go:821 lxc/profile.go:875 lxc/project.go:29 lxc/project.go:86
 #: lxc/project.go:151 lxc/project.go:214 lxc/project.go:334 lxc/project.go:384
-#: lxc/project.go:476 lxc/project.go:531 lxc/project.go:591 lxc/project.go:620
-#: lxc/project.go:673 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
+#: lxc/project.go:482 lxc/project.go:537 lxc/project.go:597 lxc/project.go:626
+#: lxc/project.go:679 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
 #: lxc/remote.go:84 lxc/remote.go:423 lxc/remote.go:459 lxc/remote.go:539
 #: lxc/remote.go:601 lxc/remote.go:651 lxc/remote.go:689 lxc/rename.go:21
 #: lxc/restore.go:24 lxc/snapshot.go:27 lxc/storage.go:33 lxc/storage.go:89
@@ -1361,7 +1361,7 @@ msgstr ""
 msgid "ID: %s"
 msgstr ""
 
-#: lxc/project.go:456
+#: lxc/project.go:461
 msgid "IMAGES"
 msgstr ""
 
@@ -2001,7 +2001,7 @@ msgid "Missing profile name"
 msgstr ""
 
 #: lxc/project.go:111 lxc/project.go:180 lxc/project.go:258 lxc/project.go:358
-#: lxc/project.go:500 lxc/project.go:558 lxc/project.go:644
+#: lxc/project.go:506 lxc/project.go:564 lxc/project.go:650
 msgid "Missing project name"
 msgstr ""
 
@@ -2073,11 +2073,15 @@ msgid "Must supply instance name for: "
 msgstr ""
 
 #: lxc/cluster.go:132 lxc/list.go:435 lxc/network.go:878 lxc/profile.go:620
-#: lxc/project.go:455 lxc/remote.go:517 lxc/storage.go:558
+#: lxc/project.go:460 lxc/remote.go:517 lxc/storage.go:558
 #: lxc/storage_volume.go:1136
 msgid "NAME"
 msgstr ""
 
+#: lxc/project.go:464
+msgid "NETWORKS"
+msgstr ""
+
 #: lxc/info.go:380
 msgid "NIC:"
 msgstr ""
@@ -2087,7 +2091,8 @@ msgid "NICs:"
 msgstr ""
 
 #: lxc/network.go:855 lxc/operation.go:143 lxc/project.go:429
-#: lxc/project.go:434 lxc/project.go:439 lxc/remote.go:480 lxc/remote.go:485
+#: lxc/project.go:434 lxc/project.go:439 lxc/project.go:444 lxc/remote.go:480
+#: lxc/remote.go:485
 msgid "NO"
 msgstr ""
 
@@ -2235,7 +2240,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:438 lxc/project.go:457
+#: lxc/list.go:438 lxc/project.go:462
 msgid "PROFILES"
 msgstr ""
 
@@ -2393,7 +2398,7 @@ msgstr ""
 msgid "Project %s deleted"
 msgstr ""
 
-#: lxc/project.go:515
+#: lxc/project.go:521
 #, c-format
 msgid "Project %s renamed to %s"
 msgstr ""
@@ -2474,7 +2479,7 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/project.go:699 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
+#: lxc/project.go:705 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
 #: lxc/remote.go:709
 #, c-format
 msgid "Remote %s doesn't exist"
@@ -2562,7 +2567,7 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
-#: lxc/project.go:475 lxc/project.go:476
+#: lxc/project.go:481 lxc/project.go:482
 msgid "Rename projects"
 msgstr ""
 
@@ -2667,7 +2672,7 @@ msgstr ""
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/project.go:458
+#: lxc/project.go:463
 msgid "STORAGE VOLUMES"
 msgstr ""
 
@@ -2757,11 +2762,11 @@ msgid ""
 "    lxc profile set [<remote>:]<profile> <key> <value>"
 msgstr ""
 
-#: lxc/project.go:530
+#: lxc/project.go:536
 msgid "Set project configuration keys"
 msgstr ""
 
-#: lxc/project.go:531
+#: lxc/project.go:537
 msgid ""
 "Set project configuration keys\n"
 "\n"
@@ -2868,7 +2873,7 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
-#: lxc/project.go:619 lxc/project.go:620
+#: lxc/project.go:625 lxc/project.go:626
 msgid "Show project options"
 msgstr ""
 
@@ -3039,7 +3044,7 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
-#: lxc/project.go:672 lxc/project.go:673
+#: lxc/project.go:678 lxc/project.go:679
 msgid "Switch the current project"
 msgstr ""
 
@@ -3232,7 +3237,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:459 lxc/storage.go:567
+#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:465 lxc/storage.go:567
 #: lxc/storage_volume.go:1139
 msgid "USED BY"
 msgstr ""
@@ -3277,7 +3282,7 @@ msgstr ""
 msgid "Unset profile configuration keys"
 msgstr ""
 
-#: lxc/project.go:590 lxc/project.go:591
+#: lxc/project.go:596 lxc/project.go:597
 msgid "Unset project configuration keys"
 msgstr ""
 
@@ -3366,7 +3371,8 @@ msgid "Whether or not to snapshot the instance's running state"
 msgstr ""
 
 #: lxc/network.go:857 lxc/operation.go:145 lxc/project.go:431
-#: lxc/project.go:436 lxc/project.go:441 lxc/remote.go:482 lxc/remote.go:487
+#: lxc/project.go:436 lxc/project.go:441 lxc/project.go:446 lxc/remote.go:482
+#: lxc/remote.go:487
 msgid "YES"
 msgstr ""
 
@@ -3490,7 +3496,7 @@ msgstr ""
 msgid "create [<remote>:]<project>"
 msgstr ""
 
-#: lxc/project.go:446
+#: lxc/project.go:451
 msgid "current"
 msgstr ""
 
@@ -4139,7 +4145,7 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
-#: lxc/project.go:473
+#: lxc/project.go:479
 msgid "rename [<remote>:]<project> <new-name>"
 msgstr ""
 
@@ -4175,7 +4181,7 @@ msgstr ""
 msgid "set [<remote>:]<profile> <key><value>..."
 msgstr ""
 
-#: lxc/project.go:529
+#: lxc/project.go:535
 msgid "set [<remote>:]<project> <key>=<value>..."
 msgstr ""
 
@@ -4227,7 +4233,7 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
-#: lxc/project.go:618
+#: lxc/project.go:624
 msgid "show [<remote>:]<project>"
 msgstr ""
 
@@ -4271,7 +4277,7 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
-#: lxc/project.go:671
+#: lxc/project.go:677
 msgid "switch [<remote>:]<project>"
 msgstr ""
 
@@ -4316,7 +4322,7 @@ msgstr ""
 msgid "unset [<remote>:]<profile> <key>"
 msgstr ""
 
-#: lxc/project.go:589
+#: lxc/project.go:595
 msgid "unset [<remote>:]<project> <key>"
 msgstr ""
 
diff --git a/po/id.po b/po/id.po
index aa9b5da90f..04f52374e0 100644
--- a/po/id.po
+++ b/po/id.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: 2020-08-24 11:17-0400\n"
+"POT-Creation-Date: 2020-08-25 11:06+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -905,8 +905,8 @@ msgstr ""
 #: lxc/profile.go:577 lxc/profile.go:636 lxc/profile.go:712 lxc/profile.go:762
 #: lxc/profile.go:821 lxc/profile.go:875 lxc/project.go:29 lxc/project.go:86
 #: lxc/project.go:151 lxc/project.go:214 lxc/project.go:334 lxc/project.go:384
-#: lxc/project.go:476 lxc/project.go:531 lxc/project.go:591 lxc/project.go:620
-#: lxc/project.go:673 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
+#: lxc/project.go:482 lxc/project.go:537 lxc/project.go:597 lxc/project.go:626
+#: lxc/project.go:679 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
 #: lxc/remote.go:84 lxc/remote.go:423 lxc/remote.go:459 lxc/remote.go:539
 #: lxc/remote.go:601 lxc/remote.go:651 lxc/remote.go:689 lxc/rename.go:21
 #: lxc/restore.go:24 lxc/snapshot.go:27 lxc/storage.go:33 lxc/storage.go:89
@@ -1361,7 +1361,7 @@ msgstr ""
 msgid "ID: %s"
 msgstr ""
 
-#: lxc/project.go:456
+#: lxc/project.go:461
 msgid "IMAGES"
 msgstr ""
 
@@ -2001,7 +2001,7 @@ msgid "Missing profile name"
 msgstr ""
 
 #: lxc/project.go:111 lxc/project.go:180 lxc/project.go:258 lxc/project.go:358
-#: lxc/project.go:500 lxc/project.go:558 lxc/project.go:644
+#: lxc/project.go:506 lxc/project.go:564 lxc/project.go:650
 msgid "Missing project name"
 msgstr ""
 
@@ -2073,11 +2073,15 @@ msgid "Must supply instance name for: "
 msgstr ""
 
 #: lxc/cluster.go:132 lxc/list.go:435 lxc/network.go:878 lxc/profile.go:620
-#: lxc/project.go:455 lxc/remote.go:517 lxc/storage.go:558
+#: lxc/project.go:460 lxc/remote.go:517 lxc/storage.go:558
 #: lxc/storage_volume.go:1136
 msgid "NAME"
 msgstr ""
 
+#: lxc/project.go:464
+msgid "NETWORKS"
+msgstr ""
+
 #: lxc/info.go:380
 msgid "NIC:"
 msgstr ""
@@ -2087,7 +2091,8 @@ msgid "NICs:"
 msgstr ""
 
 #: lxc/network.go:855 lxc/operation.go:143 lxc/project.go:429
-#: lxc/project.go:434 lxc/project.go:439 lxc/remote.go:480 lxc/remote.go:485
+#: lxc/project.go:434 lxc/project.go:439 lxc/project.go:444 lxc/remote.go:480
+#: lxc/remote.go:485
 msgid "NO"
 msgstr ""
 
@@ -2235,7 +2240,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:438 lxc/project.go:457
+#: lxc/list.go:438 lxc/project.go:462
 msgid "PROFILES"
 msgstr ""
 
@@ -2393,7 +2398,7 @@ msgstr ""
 msgid "Project %s deleted"
 msgstr ""
 
-#: lxc/project.go:515
+#: lxc/project.go:521
 #, c-format
 msgid "Project %s renamed to %s"
 msgstr ""
@@ -2474,7 +2479,7 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/project.go:699 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
+#: lxc/project.go:705 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
 #: lxc/remote.go:709
 #, c-format
 msgid "Remote %s doesn't exist"
@@ -2562,7 +2567,7 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
-#: lxc/project.go:475 lxc/project.go:476
+#: lxc/project.go:481 lxc/project.go:482
 msgid "Rename projects"
 msgstr ""
 
@@ -2667,7 +2672,7 @@ msgstr ""
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/project.go:458
+#: lxc/project.go:463
 msgid "STORAGE VOLUMES"
 msgstr ""
 
@@ -2757,11 +2762,11 @@ msgid ""
 "    lxc profile set [<remote>:]<profile> <key> <value>"
 msgstr ""
 
-#: lxc/project.go:530
+#: lxc/project.go:536
 msgid "Set project configuration keys"
 msgstr ""
 
-#: lxc/project.go:531
+#: lxc/project.go:537
 msgid ""
 "Set project configuration keys\n"
 "\n"
@@ -2868,7 +2873,7 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
-#: lxc/project.go:619 lxc/project.go:620
+#: lxc/project.go:625 lxc/project.go:626
 msgid "Show project options"
 msgstr ""
 
@@ -3039,7 +3044,7 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
-#: lxc/project.go:672 lxc/project.go:673
+#: lxc/project.go:678 lxc/project.go:679
 msgid "Switch the current project"
 msgstr ""
 
@@ -3232,7 +3237,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:459 lxc/storage.go:567
+#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:465 lxc/storage.go:567
 #: lxc/storage_volume.go:1139
 msgid "USED BY"
 msgstr ""
@@ -3277,7 +3282,7 @@ msgstr ""
 msgid "Unset profile configuration keys"
 msgstr ""
 
-#: lxc/project.go:590 lxc/project.go:591
+#: lxc/project.go:596 lxc/project.go:597
 msgid "Unset project configuration keys"
 msgstr ""
 
@@ -3366,7 +3371,8 @@ msgid "Whether or not to snapshot the instance's running state"
 msgstr ""
 
 #: lxc/network.go:857 lxc/operation.go:145 lxc/project.go:431
-#: lxc/project.go:436 lxc/project.go:441 lxc/remote.go:482 lxc/remote.go:487
+#: lxc/project.go:436 lxc/project.go:441 lxc/project.go:446 lxc/remote.go:482
+#: lxc/remote.go:487
 msgid "YES"
 msgstr ""
 
@@ -3490,7 +3496,7 @@ msgstr ""
 msgid "create [<remote>:]<project>"
 msgstr ""
 
-#: lxc/project.go:446
+#: lxc/project.go:451
 msgid "current"
 msgstr ""
 
@@ -4139,7 +4145,7 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
-#: lxc/project.go:473
+#: lxc/project.go:479
 msgid "rename [<remote>:]<project> <new-name>"
 msgstr ""
 
@@ -4175,7 +4181,7 @@ msgstr ""
 msgid "set [<remote>:]<profile> <key><value>..."
 msgstr ""
 
-#: lxc/project.go:529
+#: lxc/project.go:535
 msgid "set [<remote>:]<project> <key>=<value>..."
 msgstr ""
 
@@ -4227,7 +4233,7 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
-#: lxc/project.go:618
+#: lxc/project.go:624
 msgid "show [<remote>:]<project>"
 msgstr ""
 
@@ -4271,7 +4277,7 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
-#: lxc/project.go:671
+#: lxc/project.go:677
 msgid "switch [<remote>:]<project>"
 msgstr ""
 
@@ -4316,7 +4322,7 @@ msgstr ""
 msgid "unset [<remote>:]<profile> <key>"
 msgstr ""
 
-#: lxc/project.go:589
+#: lxc/project.go:595
 msgid "unset [<remote>:]<project> <key>"
 msgstr ""
 
diff --git a/po/it.po b/po/it.po
index d19f1beed5..18588e8a60 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: 2020-08-24 11:17-0400\n"
+"POT-Creation-Date: 2020-08-25 11:06+0100\n"
 "PO-Revision-Date: 2019-09-06 07:09+0000\n"
 "Last-Translator: Luigi Operoso <brokenpip3 at gmail.com>\n"
 "Language-Team: Italian <https://hosted.weblate.org/projects/linux-containers/"
@@ -1033,8 +1033,8 @@ msgstr ""
 #: lxc/profile.go:577 lxc/profile.go:636 lxc/profile.go:712 lxc/profile.go:762
 #: lxc/profile.go:821 lxc/profile.go:875 lxc/project.go:29 lxc/project.go:86
 #: lxc/project.go:151 lxc/project.go:214 lxc/project.go:334 lxc/project.go:384
-#: lxc/project.go:476 lxc/project.go:531 lxc/project.go:591 lxc/project.go:620
-#: lxc/project.go:673 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
+#: lxc/project.go:482 lxc/project.go:537 lxc/project.go:597 lxc/project.go:626
+#: lxc/project.go:679 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
 #: lxc/remote.go:84 lxc/remote.go:423 lxc/remote.go:459 lxc/remote.go:539
 #: lxc/remote.go:601 lxc/remote.go:651 lxc/remote.go:689 lxc/rename.go:21
 #: lxc/restore.go:24 lxc/snapshot.go:27 lxc/storage.go:33 lxc/storage.go:89
@@ -1495,7 +1495,7 @@ msgstr ""
 msgid "ID: %s"
 msgstr ""
 
-#: lxc/project.go:456
+#: lxc/project.go:461
 msgid "IMAGES"
 msgstr ""
 
@@ -2146,7 +2146,7 @@ msgid "Missing profile name"
 msgstr ""
 
 #: lxc/project.go:111 lxc/project.go:180 lxc/project.go:258 lxc/project.go:358
-#: lxc/project.go:500 lxc/project.go:558 lxc/project.go:644
+#: lxc/project.go:506 lxc/project.go:564 lxc/project.go:650
 #, fuzzy
 msgid "Missing project name"
 msgstr "Il nome del container è: %s"
@@ -2219,11 +2219,15 @@ msgid "Must supply instance name for: "
 msgstr ""
 
 #: lxc/cluster.go:132 lxc/list.go:435 lxc/network.go:878 lxc/profile.go:620
-#: lxc/project.go:455 lxc/remote.go:517 lxc/storage.go:558
+#: lxc/project.go:460 lxc/remote.go:517 lxc/storage.go:558
 #: lxc/storage_volume.go:1136
 msgid "NAME"
 msgstr ""
 
+#: lxc/project.go:464
+msgid "NETWORKS"
+msgstr ""
+
 #: lxc/info.go:380
 msgid "NIC:"
 msgstr ""
@@ -2233,7 +2237,8 @@ msgid "NICs:"
 msgstr ""
 
 #: lxc/network.go:855 lxc/operation.go:143 lxc/project.go:429
-#: lxc/project.go:434 lxc/project.go:439 lxc/remote.go:480 lxc/remote.go:485
+#: lxc/project.go:434 lxc/project.go:439 lxc/project.go:444 lxc/remote.go:480
+#: lxc/remote.go:485
 msgid "NO"
 msgstr ""
 
@@ -2381,7 +2386,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:438 lxc/project.go:457
+#: lxc/list.go:438 lxc/project.go:462
 msgid "PROFILES"
 msgstr ""
 
@@ -2541,7 +2546,7 @@ msgstr ""
 msgid "Project %s deleted"
 msgstr ""
 
-#: lxc/project.go:515
+#: lxc/project.go:521
 #, c-format
 msgid "Project %s renamed to %s"
 msgstr ""
@@ -2623,7 +2628,7 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr "il remote %s esiste già"
 
-#: lxc/project.go:699 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
+#: lxc/project.go:705 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
 #: lxc/remote.go:709
 #, fuzzy, c-format
 msgid "Remote %s doesn't exist"
@@ -2713,7 +2718,7 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
-#: lxc/project.go:475 lxc/project.go:476
+#: lxc/project.go:481 lxc/project.go:482
 msgid "Rename projects"
 msgstr ""
 
@@ -2820,7 +2825,7 @@ msgstr ""
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/project.go:458
+#: lxc/project.go:463
 msgid "STORAGE VOLUMES"
 msgstr ""
 
@@ -2910,11 +2915,11 @@ msgid ""
 "    lxc profile set [<remote>:]<profile> <key> <value>"
 msgstr ""
 
-#: lxc/project.go:530
+#: lxc/project.go:536
 msgid "Set project configuration keys"
 msgstr ""
 
-#: lxc/project.go:531
+#: lxc/project.go:537
 msgid ""
 "Set project configuration keys\n"
 "\n"
@@ -3021,7 +3026,7 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
-#: lxc/project.go:619 lxc/project.go:620
+#: lxc/project.go:625 lxc/project.go:626
 msgid "Show project options"
 msgstr ""
 
@@ -3194,7 +3199,7 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
-#: lxc/project.go:672 lxc/project.go:673
+#: lxc/project.go:678 lxc/project.go:679
 msgid "Switch the current project"
 msgstr ""
 
@@ -3388,7 +3393,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:459 lxc/storage.go:567
+#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:465 lxc/storage.go:567
 #: lxc/storage_volume.go:1139
 msgid "USED BY"
 msgstr ""
@@ -3434,7 +3439,7 @@ msgstr ""
 msgid "Unset profile configuration keys"
 msgstr ""
 
-#: lxc/project.go:590 lxc/project.go:591
+#: lxc/project.go:596 lxc/project.go:597
 msgid "Unset project configuration keys"
 msgstr ""
 
@@ -3523,7 +3528,8 @@ msgid "Whether or not to snapshot the instance's running state"
 msgstr ""
 
 #: lxc/network.go:857 lxc/operation.go:145 lxc/project.go:431
-#: lxc/project.go:436 lxc/project.go:441 lxc/remote.go:482 lxc/remote.go:487
+#: lxc/project.go:436 lxc/project.go:441 lxc/project.go:446 lxc/remote.go:482
+#: lxc/remote.go:487
 msgid "YES"
 msgstr ""
 
@@ -3653,7 +3659,7 @@ msgstr ""
 msgid "create [<remote>:]<project>"
 msgstr ""
 
-#: lxc/project.go:446
+#: lxc/project.go:451
 msgid "current"
 msgstr ""
 
@@ -4321,7 +4327,7 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
-#: lxc/project.go:473
+#: lxc/project.go:479
 msgid "rename [<remote>:]<project> <new-name>"
 msgstr ""
 
@@ -4360,7 +4366,7 @@ msgstr ""
 msgid "set [<remote>:]<profile> <key><value>..."
 msgstr ""
 
-#: lxc/project.go:529
+#: lxc/project.go:535
 msgid "set [<remote>:]<project> <key>=<value>..."
 msgstr ""
 
@@ -4416,7 +4422,7 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
-#: lxc/project.go:618
+#: lxc/project.go:624
 msgid "show [<remote>:]<project>"
 msgstr ""
 
@@ -4464,7 +4470,7 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
-#: lxc/project.go:671
+#: lxc/project.go:677
 #, fuzzy
 msgid "switch [<remote>:]<project>"
 msgstr "Creazione del container in corso"
@@ -4511,7 +4517,7 @@ msgstr ""
 msgid "unset [<remote>:]<profile> <key>"
 msgstr ""
 
-#: lxc/project.go:589
+#: lxc/project.go:595
 msgid "unset [<remote>:]<project> <key>"
 msgstr ""
 
diff --git a/po/ja.po b/po/ja.po
index 00c940d7e2..6fa7a7d534 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: 2020-08-24 11:17-0400\n"
+"POT-Creation-Date: 2020-08-25 11:06+0100\n"
 "PO-Revision-Date: 2020-07-03 17:01+0000\n"
 "Last-Translator: KATOH Yasufumi <karma at jazz.email.ne.jp>\n"
 "Language-Team: Japanese <https://hosted.weblate.org/projects/linux-"
@@ -1048,8 +1048,8 @@ msgstr "ストレージボリュームを削除します"
 #: lxc/profile.go:577 lxc/profile.go:636 lxc/profile.go:712 lxc/profile.go:762
 #: lxc/profile.go:821 lxc/profile.go:875 lxc/project.go:29 lxc/project.go:86
 #: lxc/project.go:151 lxc/project.go:214 lxc/project.go:334 lxc/project.go:384
-#: lxc/project.go:476 lxc/project.go:531 lxc/project.go:591 lxc/project.go:620
-#: lxc/project.go:673 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
+#: lxc/project.go:482 lxc/project.go:537 lxc/project.go:597 lxc/project.go:626
+#: lxc/project.go:679 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
 #: lxc/remote.go:84 lxc/remote.go:423 lxc/remote.go:459 lxc/remote.go:539
 #: lxc/remote.go:601 lxc/remote.go:651 lxc/remote.go:689 lxc/rename.go:21
 #: lxc/restore.go:24 lxc/snapshot.go:27 lxc/storage.go:33 lxc/storage.go:89
@@ -1548,7 +1548,7 @@ msgstr "ID: %d"
 msgid "ID: %s"
 msgstr "ID: %s"
 
-#: lxc/project.go:456
+#: lxc/project.go:461
 msgid "IMAGES"
 msgstr "IMAGES"
 
@@ -2305,7 +2305,7 @@ msgid "Missing profile name"
 msgstr "プロファイル名を指定する必要があります"
 
 #: lxc/project.go:111 lxc/project.go:180 lxc/project.go:258 lxc/project.go:358
-#: lxc/project.go:500 lxc/project.go:558 lxc/project.go:644
+#: lxc/project.go:506 lxc/project.go:564 lxc/project.go:650
 msgid "Missing project name"
 msgstr "プロジェクト名を指定する必要があります"
 
@@ -2382,11 +2382,15 @@ msgid "Must supply instance name for: "
 msgstr "インスタンス名を指定する必要があります: "
 
 #: lxc/cluster.go:132 lxc/list.go:435 lxc/network.go:878 lxc/profile.go:620
-#: lxc/project.go:455 lxc/remote.go:517 lxc/storage.go:558
+#: lxc/project.go:460 lxc/remote.go:517 lxc/storage.go:558
 #: lxc/storage_volume.go:1136
 msgid "NAME"
 msgstr "NAME"
 
+#: lxc/project.go:464
+msgid "NETWORKS"
+msgstr ""
+
 #: lxc/info.go:380
 msgid "NIC:"
 msgstr "NIC:"
@@ -2396,7 +2400,8 @@ msgid "NICs:"
 msgstr "NICs:"
 
 #: lxc/network.go:855 lxc/operation.go:143 lxc/project.go:429
-#: lxc/project.go:434 lxc/project.go:439 lxc/remote.go:480 lxc/remote.go:485
+#: lxc/project.go:434 lxc/project.go:439 lxc/project.go:444 lxc/remote.go:480
+#: lxc/remote.go:485
 msgid "NO"
 msgstr "NO"
 
@@ -2545,7 +2550,7 @@ msgstr "PID"
 msgid "PROCESSES"
 msgstr "PROCESSES"
 
-#: lxc/list.go:438 lxc/project.go:457
+#: lxc/list.go:438 lxc/project.go:462
 msgid "PROFILES"
 msgstr "PROFILES"
 
@@ -2703,7 +2708,7 @@ msgstr "プロジェクト %s を作成しました"
 msgid "Project %s deleted"
 msgstr "プロジェクト %s を削除しました"
 
-#: lxc/project.go:515
+#: lxc/project.go:521
 #, c-format
 msgid "Project %s renamed to %s"
 msgstr "プロジェクト名 %s を %s に変更しました"
@@ -2784,7 +2789,7 @@ msgstr "イメージの更新中: %s"
 msgid "Remote %s already exists"
 msgstr "リモート %s は既に存在します"
 
-#: lxc/project.go:699 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
+#: lxc/project.go:705 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
 #: lxc/remote.go:709
 #, c-format
 msgid "Remote %s doesn't exist"
@@ -2872,7 +2877,7 @@ msgstr "ネットワーク名を変更します"
 msgid "Rename profiles"
 msgstr "プロファイル名を変更します"
 
-#: lxc/project.go:475 lxc/project.go:476
+#: lxc/project.go:481 lxc/project.go:482
 msgid "Rename projects"
 msgstr "プロジェクト名を変更します"
 
@@ -2984,7 +2989,7 @@ msgstr "STATUS"
 msgid "STORAGE POOL"
 msgstr "STORAGE POOL"
 
-#: lxc/project.go:458
+#: lxc/project.go:463
 msgid "STORAGE VOLUMES"
 msgstr "STORAGE VOLUMES"
 
@@ -3094,11 +3099,11 @@ msgstr ""
 "後方互換性のため、単一の設定を行う場合は次の形式でも設定できます:\n"
 "    lxc profile set [<remote>:]<profile> <key> <value>"
 
-#: lxc/project.go:530
+#: lxc/project.go:536
 msgid "Set project configuration keys"
 msgstr "プロジェクトの設定項目を設定します"
 
-#: lxc/project.go:531
+#: lxc/project.go:537
 msgid ""
 "Set project configuration keys\n"
 "\n"
@@ -3217,7 +3222,7 @@ msgstr "ネットワークの設定を表示します"
 msgid "Show profile configurations"
 msgstr "プロファイルの設定を表示します"
 
-#: lxc/project.go:619 lxc/project.go:620
+#: lxc/project.go:625 lxc/project.go:626
 msgid "Show project options"
 msgstr "プロジェクトの設定を表示します"
 
@@ -3388,7 +3393,7 @@ msgstr "Swap (現在値)"
 msgid "Swap (peak)"
 msgstr "Swap (ピーク)"
 
-#: lxc/project.go:672 lxc/project.go:673
+#: lxc/project.go:678 lxc/project.go:679
 msgid "Switch the current project"
 msgstr "現在のプロジェクトを切り替えます"
 
@@ -3605,7 +3610,7 @@ msgstr "UPLOAD DATE"
 msgid "URL"
 msgstr "URL"
 
-#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:459 lxc/storage.go:567
+#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:465 lxc/storage.go:567
 #: lxc/storage_volume.go:1139
 msgid "USED BY"
 msgstr "USED BY"
@@ -3650,7 +3655,7 @@ msgstr "ネットワークの設定を削除します"
 msgid "Unset profile configuration keys"
 msgstr "プロファイルの設定を削除します"
 
-#: lxc/project.go:590 lxc/project.go:591
+#: lxc/project.go:596 lxc/project.go:597
 msgid "Unset project configuration keys"
 msgstr "プロジェクトの設定を削除します"
 
@@ -3745,7 +3750,8 @@ msgid "Whether or not to snapshot the instance's running state"
 msgstr "インスタンスの稼動状態のスナップショットを取得するかどうか"
 
 #: lxc/network.go:857 lxc/operation.go:145 lxc/project.go:431
-#: lxc/project.go:436 lxc/project.go:441 lxc/remote.go:482 lxc/remote.go:487
+#: lxc/project.go:436 lxc/project.go:441 lxc/project.go:446 lxc/remote.go:482
+#: lxc/remote.go:487
 msgid "YES"
 msgstr "YES"
 
@@ -3874,7 +3880,7 @@ msgstr "create [<remote>:]<profile>"
 msgid "create [<remote>:]<project>"
 msgstr "create [<remote>:]<project>"
 
-#: lxc/project.go:446
+#: lxc/project.go:451
 msgid "current"
 msgstr "現在値"
 
@@ -4653,7 +4659,7 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr "rename [<remote>:]<profile> <new-name>"
 
-#: lxc/project.go:473
+#: lxc/project.go:479
 msgid "rename [<remote>:]<project> <new-name>"
 msgstr "rename [<remote>:]<project> <new-name>"
 
@@ -4689,7 +4695,7 @@ msgstr "set [<remote>:]<pool> <volume> <key>=<value>..."
 msgid "set [<remote>:]<profile> <key><value>..."
 msgstr "set [<remote>:]<profile> <key><value>..."
 
-#: lxc/project.go:529
+#: lxc/project.go:535
 msgid "set [<remote>:]<project> <key>=<value>..."
 msgstr "set [<remote>:]<project> <key>=<value>..."
 
@@ -4741,7 +4747,7 @@ msgstr "show [<remote>:]<pool> <volume>[/<snapshot>]"
 msgid "show [<remote>:]<profile>"
 msgstr "show [<remote>:]<profile>"
 
-#: lxc/project.go:618
+#: lxc/project.go:624
 msgid "show [<remote>:]<project>"
 msgstr "show [<remote>:]<project>"
 
@@ -4785,7 +4791,7 @@ msgstr "storage"
 msgid "switch <remote>"
 msgstr "switch <remote>"
 
-#: lxc/project.go:671
+#: lxc/project.go:677
 msgid "switch [<remote>:]<project>"
 msgstr "switch [<remote>:] <project>"
 
@@ -4830,7 +4836,7 @@ msgstr "unset [<remote>:]<pool> <volume> <key>"
 msgid "unset [<remote>:]<profile> <key>"
 msgstr "unset [<remote>:]<profile> <key>"
 
-#: lxc/project.go:589
+#: lxc/project.go:595
 msgid "unset [<remote>:]<project> <key>"
 msgstr "unset [<remote>:]<project> <key>"
 
diff --git a/po/ko.po b/po/ko.po
index 28de36733a..9d9ec61845 100644
--- a/po/ko.po
+++ b/po/ko.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: 2020-08-24 11:17-0400\n"
+"POT-Creation-Date: 2020-08-25 11:06+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -905,8 +905,8 @@ msgstr ""
 #: lxc/profile.go:577 lxc/profile.go:636 lxc/profile.go:712 lxc/profile.go:762
 #: lxc/profile.go:821 lxc/profile.go:875 lxc/project.go:29 lxc/project.go:86
 #: lxc/project.go:151 lxc/project.go:214 lxc/project.go:334 lxc/project.go:384
-#: lxc/project.go:476 lxc/project.go:531 lxc/project.go:591 lxc/project.go:620
-#: lxc/project.go:673 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
+#: lxc/project.go:482 lxc/project.go:537 lxc/project.go:597 lxc/project.go:626
+#: lxc/project.go:679 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
 #: lxc/remote.go:84 lxc/remote.go:423 lxc/remote.go:459 lxc/remote.go:539
 #: lxc/remote.go:601 lxc/remote.go:651 lxc/remote.go:689 lxc/rename.go:21
 #: lxc/restore.go:24 lxc/snapshot.go:27 lxc/storage.go:33 lxc/storage.go:89
@@ -1361,7 +1361,7 @@ msgstr ""
 msgid "ID: %s"
 msgstr ""
 
-#: lxc/project.go:456
+#: lxc/project.go:461
 msgid "IMAGES"
 msgstr ""
 
@@ -2001,7 +2001,7 @@ msgid "Missing profile name"
 msgstr ""
 
 #: lxc/project.go:111 lxc/project.go:180 lxc/project.go:258 lxc/project.go:358
-#: lxc/project.go:500 lxc/project.go:558 lxc/project.go:644
+#: lxc/project.go:506 lxc/project.go:564 lxc/project.go:650
 msgid "Missing project name"
 msgstr ""
 
@@ -2073,11 +2073,15 @@ msgid "Must supply instance name for: "
 msgstr ""
 
 #: lxc/cluster.go:132 lxc/list.go:435 lxc/network.go:878 lxc/profile.go:620
-#: lxc/project.go:455 lxc/remote.go:517 lxc/storage.go:558
+#: lxc/project.go:460 lxc/remote.go:517 lxc/storage.go:558
 #: lxc/storage_volume.go:1136
 msgid "NAME"
 msgstr ""
 
+#: lxc/project.go:464
+msgid "NETWORKS"
+msgstr ""
+
 #: lxc/info.go:380
 msgid "NIC:"
 msgstr ""
@@ -2087,7 +2091,8 @@ msgid "NICs:"
 msgstr ""
 
 #: lxc/network.go:855 lxc/operation.go:143 lxc/project.go:429
-#: lxc/project.go:434 lxc/project.go:439 lxc/remote.go:480 lxc/remote.go:485
+#: lxc/project.go:434 lxc/project.go:439 lxc/project.go:444 lxc/remote.go:480
+#: lxc/remote.go:485
 msgid "NO"
 msgstr ""
 
@@ -2235,7 +2240,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:438 lxc/project.go:457
+#: lxc/list.go:438 lxc/project.go:462
 msgid "PROFILES"
 msgstr ""
 
@@ -2393,7 +2398,7 @@ msgstr ""
 msgid "Project %s deleted"
 msgstr ""
 
-#: lxc/project.go:515
+#: lxc/project.go:521
 #, c-format
 msgid "Project %s renamed to %s"
 msgstr ""
@@ -2474,7 +2479,7 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/project.go:699 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
+#: lxc/project.go:705 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
 #: lxc/remote.go:709
 #, c-format
 msgid "Remote %s doesn't exist"
@@ -2562,7 +2567,7 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
-#: lxc/project.go:475 lxc/project.go:476
+#: lxc/project.go:481 lxc/project.go:482
 msgid "Rename projects"
 msgstr ""
 
@@ -2667,7 +2672,7 @@ msgstr ""
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/project.go:458
+#: lxc/project.go:463
 msgid "STORAGE VOLUMES"
 msgstr ""
 
@@ -2757,11 +2762,11 @@ msgid ""
 "    lxc profile set [<remote>:]<profile> <key> <value>"
 msgstr ""
 
-#: lxc/project.go:530
+#: lxc/project.go:536
 msgid "Set project configuration keys"
 msgstr ""
 
-#: lxc/project.go:531
+#: lxc/project.go:537
 msgid ""
 "Set project configuration keys\n"
 "\n"
@@ -2868,7 +2873,7 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
-#: lxc/project.go:619 lxc/project.go:620
+#: lxc/project.go:625 lxc/project.go:626
 msgid "Show project options"
 msgstr ""
 
@@ -3039,7 +3044,7 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
-#: lxc/project.go:672 lxc/project.go:673
+#: lxc/project.go:678 lxc/project.go:679
 msgid "Switch the current project"
 msgstr ""
 
@@ -3232,7 +3237,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:459 lxc/storage.go:567
+#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:465 lxc/storage.go:567
 #: lxc/storage_volume.go:1139
 msgid "USED BY"
 msgstr ""
@@ -3277,7 +3282,7 @@ msgstr ""
 msgid "Unset profile configuration keys"
 msgstr ""
 
-#: lxc/project.go:590 lxc/project.go:591
+#: lxc/project.go:596 lxc/project.go:597
 msgid "Unset project configuration keys"
 msgstr ""
 
@@ -3366,7 +3371,8 @@ msgid "Whether or not to snapshot the instance's running state"
 msgstr ""
 
 #: lxc/network.go:857 lxc/operation.go:145 lxc/project.go:431
-#: lxc/project.go:436 lxc/project.go:441 lxc/remote.go:482 lxc/remote.go:487
+#: lxc/project.go:436 lxc/project.go:441 lxc/project.go:446 lxc/remote.go:482
+#: lxc/remote.go:487
 msgid "YES"
 msgstr ""
 
@@ -3490,7 +3496,7 @@ msgstr ""
 msgid "create [<remote>:]<project>"
 msgstr ""
 
-#: lxc/project.go:446
+#: lxc/project.go:451
 msgid "current"
 msgstr ""
 
@@ -4139,7 +4145,7 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
-#: lxc/project.go:473
+#: lxc/project.go:479
 msgid "rename [<remote>:]<project> <new-name>"
 msgstr ""
 
@@ -4175,7 +4181,7 @@ msgstr ""
 msgid "set [<remote>:]<profile> <key><value>..."
 msgstr ""
 
-#: lxc/project.go:529
+#: lxc/project.go:535
 msgid "set [<remote>:]<project> <key>=<value>..."
 msgstr ""
 
@@ -4227,7 +4233,7 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
-#: lxc/project.go:618
+#: lxc/project.go:624
 msgid "show [<remote>:]<project>"
 msgstr ""
 
@@ -4271,7 +4277,7 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
-#: lxc/project.go:671
+#: lxc/project.go:677
 msgid "switch [<remote>:]<project>"
 msgstr ""
 
@@ -4316,7 +4322,7 @@ msgstr ""
 msgid "unset [<remote>:]<profile> <key>"
 msgstr ""
 
-#: lxc/project.go:589
+#: lxc/project.go:595
 msgid "unset [<remote>:]<project> <key>"
 msgstr ""
 
diff --git a/po/lxd.pot b/po/lxd.pot
index 6852851b17..d734315b5d 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: 2020-08-24 11:17-0400\n"
+        "POT-Creation-Date: 2020-08-25 11:06+0100\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"
@@ -839,7 +839,7 @@ msgstr  ""
 msgid   "Delete storage volumes"
 msgstr  ""
 
-#: lxc/action.go:31 lxc/action.go:50 lxc/action.go:70 lxc/action.go:91 lxc/alias.go:22 lxc/alias.go:54 lxc/alias.go:100 lxc/alias.go:144 lxc/alias.go:195 lxc/cluster.go:31 lxc/cluster.go:74 lxc/cluster.go:154 lxc/cluster.go:204 lxc/cluster.go:254 lxc/cluster.go:337 lxc/cluster.go:422 lxc/config.go:30 lxc/config.go:89 lxc/config.go:360 lxc/config.go:452 lxc/config.go:610 lxc/config.go:734 lxc/config_device.go:24 lxc/config_device.go:76 lxc/config_device.go:188 lxc/config_device.go:261 lxc/config_device.go:327 lxc/config_device.go:416 lxc/config_device.go:507 lxc/config_device.go:513 lxc/config_device.go:613 lxc/config_device.go:681 lxc/config_metadata.go:27 lxc/config_metadata.go:52 lxc/config_metadata.go:174 lxc/config_template.go:28 lxc/config_template.go:65 lxc/config_template.go:108 lxc/config_template.go:150 lxc/config_template.go:236 lxc/config_template.go:295 lxc/config_trust.go:28 lxc/config_trust.go:57 lxc/config_trust.go:115 lxc/config_trust.go:193 lxc/console.go:36 lxc/copy.go:40 lxc/delete.go:30 lxc/exec.go:40 lxc/export.go:32 lxc/file.go:72 lxc/file.go:105 lxc/file.go:154 lxc/file.go:217 lxc/file.go:407 lxc/image.go:38 lxc/image.go:129 lxc/image.go:277 lxc/image.go:328 lxc/image.go:453 lxc/image.go:612 lxc/image.go:840 lxc/image.go:975 lxc/image.go:1273 lxc/image.go:1352 lxc/image_alias.go:25 lxc/image_alias.go:58 lxc/image_alias.go:105 lxc/image_alias.go:150 lxc/image_alias.go:252 lxc/import.go:28 lxc/info.go:33 lxc/init.go:40 lxc/launch.go:25 lxc/list.go:45 lxc/main.go:50 lxc/manpage.go:20 lxc/monitor.go:30 lxc/move.go:36 lxc/network.go:33 lxc/network.go:109 lxc/network.go:182 lxc/network.go:255 lxc/network.go:329 lxc/network.go:379 lxc/network.go:464 lxc/network.go:549 lxc/network.go:672 lxc/network.go:730 lxc/network.go:810 lxc/network.go:905 lxc/network.go:974 lxc/network.go:1024 lxc/network.go:1094 lxc/network.go:1156 lxc/operation.go:24 lxc/operation.go:53 lxc/operation.go:102 lxc/operation.go:181 lxc/profile.go:29 lxc/profile.go:101 lxc/profile.go:164 lxc/profile.go:244 lxc/profile.go:300 lxc/profile.go:354 lxc/profile.go:404 lxc/profile.go:528 lxc/profile.go:577 lxc/profile.go:636 lxc/profile.go:712 lxc/profile.go:762 lxc/profile.go:821 lxc/profile.go:875 lxc/project.go:29 lxc/project.go:86 lxc/project.go:151 lxc/project.go:214 lxc/project.go:334 lxc/project.go:384 lxc/project.go:476 lxc/project.go:531 lxc/project.go:591 lxc/project.go:620 lxc/project.go:673 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33 lxc/remote.go:84 lxc/remote.go:423 lxc/remote.go:459 lxc/remote.go:539 lxc/remote.go:601 lxc/remote.go:651 lxc/remote.go:689 lxc/rename.go:21 lxc/restore.go:24 lxc/snapshot.go:27 lxc/storage.go:33 lxc/storage.go:89 lxc/storage.go:163 lxc/storage.go:213 lxc/storage.go:333 lxc/storage.go:388 lxc/storage.go:508 lxc/storage.go:582 lxc/storage.go:651 lxc/storage.go:735 lxc/storage_volume.go:33 lxc/storage_volume.go:140 lxc/storage_volume.go:223 lxc/storage_volume.go:310 lxc/storage_volume.go:472 lxc/storage_volume.go:551 lxc/storage_volume.go:627 lxc/storage_volume.go:709 lxc/storage_volume.go:790 lxc/storage_volume.go:990 lxc/storage_volume.go:1081 lxc/storage_volume.go:1161 lxc/storage_volume.go:1192 lxc/storage_volume.go:1305 lxc/storage_volume.go:1381 lxc/storage_volume.go:1480 lxc/storage_volume.go:1513 lxc/storage_volume.go:1589 lxc/version.go:22
+#: lxc/action.go:31 lxc/action.go:50 lxc/action.go:70 lxc/action.go:91 lxc/alias.go:22 lxc/alias.go:54 lxc/alias.go:100 lxc/alias.go:144 lxc/alias.go:195 lxc/cluster.go:31 lxc/cluster.go:74 lxc/cluster.go:154 lxc/cluster.go:204 lxc/cluster.go:254 lxc/cluster.go:337 lxc/cluster.go:422 lxc/config.go:30 lxc/config.go:89 lxc/config.go:360 lxc/config.go:452 lxc/config.go:610 lxc/config.go:734 lxc/config_device.go:24 lxc/config_device.go:76 lxc/config_device.go:188 lxc/config_device.go:261 lxc/config_device.go:327 lxc/config_device.go:416 lxc/config_device.go:507 lxc/config_device.go:513 lxc/config_device.go:613 lxc/config_device.go:681 lxc/config_metadata.go:27 lxc/config_metadata.go:52 lxc/config_metadata.go:174 lxc/config_template.go:28 lxc/config_template.go:65 lxc/config_template.go:108 lxc/config_template.go:150 lxc/config_template.go:236 lxc/config_template.go:295 lxc/config_trust.go:28 lxc/config_trust.go:57 lxc/config_trust.go:115 lxc/config_trust.go:193 lxc/console.go:36 lxc/copy.go:40 lxc/delete.go:30 lxc/exec.go:40 lxc/export.go:32 lxc/file.go:72 lxc/file.go:105 lxc/file.go:154 lxc/file.go:217 lxc/file.go:407 lxc/image.go:38 lxc/image.go:129 lxc/image.go:277 lxc/image.go:328 lxc/image.go:453 lxc/image.go:612 lxc/image.go:840 lxc/image.go:975 lxc/image.go:1273 lxc/image.go:1352 lxc/image_alias.go:25 lxc/image_alias.go:58 lxc/image_alias.go:105 lxc/image_alias.go:150 lxc/image_alias.go:252 lxc/import.go:28 lxc/info.go:33 lxc/init.go:40 lxc/launch.go:25 lxc/list.go:45 lxc/main.go:50 lxc/manpage.go:20 lxc/monitor.go:30 lxc/move.go:36 lxc/network.go:33 lxc/network.go:109 lxc/network.go:182 lxc/network.go:255 lxc/network.go:329 lxc/network.go:379 lxc/network.go:464 lxc/network.go:549 lxc/network.go:672 lxc/network.go:730 lxc/network.go:810 lxc/network.go:905 lxc/network.go:974 lxc/network.go:1024 lxc/network.go:1094 lxc/network.go:1156 lxc/operation.go:24 lxc/operation.go:53 lxc/operation.go:102 lxc/operation.go:181 lxc/profile.go:29 lxc/profile.go:101 lxc/profile.go:164 lxc/profile.go:244 lxc/profile.go:300 lxc/profile.go:354 lxc/profile.go:404 lxc/profile.go:528 lxc/profile.go:577 lxc/profile.go:636 lxc/profile.go:712 lxc/profile.go:762 lxc/profile.go:821 lxc/profile.go:875 lxc/project.go:29 lxc/project.go:86 lxc/project.go:151 lxc/project.go:214 lxc/project.go:334 lxc/project.go:384 lxc/project.go:482 lxc/project.go:537 lxc/project.go:597 lxc/project.go:626 lxc/project.go:679 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33 lxc/remote.go:84 lxc/remote.go:423 lxc/remote.go:459 lxc/remote.go:539 lxc/remote.go:601 lxc/remote.go:651 lxc/remote.go:689 lxc/rename.go:21 lxc/restore.go:24 lxc/snapshot.go:27 lxc/storage.go:33 lxc/storage.go:89 lxc/storage.go:163 lxc/storage.go:213 lxc/storage.go:333 lxc/storage.go:388 lxc/storage.go:508 lxc/storage.go:582 lxc/storage.go:651 lxc/storage.go:735 lxc/storage_volume.go:33 lxc/storage_volume.go:140 lxc/storage_volume.go:223 lxc/storage_volume.go:310 lxc/storage_volume.go:472 lxc/storage_volume.go:551 lxc/storage_volume.go:627 lxc/storage_volume.go:709 lxc/storage_volume.go:790 lxc/storage_volume.go:990 lxc/storage_volume.go:1081 lxc/storage_volume.go:1161 lxc/storage_volume.go:1192 lxc/storage_volume.go:1305 lxc/storage_volume.go:1381 lxc/storage_volume.go:1480 lxc/storage_volume.go:1513 lxc/storage_volume.go:1589 lxc/version.go:22
 msgid   "Description"
 msgstr  ""
 
@@ -1261,7 +1261,7 @@ msgstr  ""
 msgid   "ID: %s"
 msgstr  ""
 
-#: lxc/project.go:456
+#: lxc/project.go:461
 msgid   "IMAGES"
 msgstr  ""
 
@@ -1866,7 +1866,7 @@ msgstr  ""
 msgid   "Missing profile name"
 msgstr  ""
 
-#: lxc/project.go:111 lxc/project.go:180 lxc/project.go:258 lxc/project.go:358 lxc/project.go:500 lxc/project.go:558 lxc/project.go:644
+#: lxc/project.go:111 lxc/project.go:180 lxc/project.go:258 lxc/project.go:358 lxc/project.go:506 lxc/project.go:564 lxc/project.go:650
 msgid   "Missing project name"
 msgstr  ""
 
@@ -1935,10 +1935,14 @@ msgstr  ""
 msgid   "Must supply instance name for: "
 msgstr  ""
 
-#: lxc/cluster.go:132 lxc/list.go:435 lxc/network.go:878 lxc/profile.go:620 lxc/project.go:455 lxc/remote.go:517 lxc/storage.go:558 lxc/storage_volume.go:1136
+#: lxc/cluster.go:132 lxc/list.go:435 lxc/network.go:878 lxc/profile.go:620 lxc/project.go:460 lxc/remote.go:517 lxc/storage.go:558 lxc/storage_volume.go:1136
 msgid   "NAME"
 msgstr  ""
 
+#: lxc/project.go:464
+msgid   "NETWORKS"
+msgstr  ""
+
 #: lxc/info.go:380
 msgid   "NIC:"
 msgstr  ""
@@ -1947,7 +1951,7 @@ msgstr  ""
 msgid   "NICs:"
 msgstr  ""
 
-#: lxc/network.go:855 lxc/operation.go:143 lxc/project.go:429 lxc/project.go:434 lxc/project.go:439 lxc/remote.go:480 lxc/remote.go:485
+#: lxc/network.go:855 lxc/operation.go:143 lxc/project.go:429 lxc/project.go:434 lxc/project.go:439 lxc/project.go:444 lxc/remote.go:480 lxc/remote.go:485
 msgid   "NO"
 msgstr  ""
 
@@ -2095,7 +2099,7 @@ msgstr  ""
 msgid   "PROCESSES"
 msgstr  ""
 
-#: lxc/list.go:438 lxc/project.go:457
+#: lxc/list.go:438 lxc/project.go:462
 msgid   "PROFILES"
 msgstr  ""
 
@@ -2251,7 +2255,7 @@ msgstr  ""
 msgid   "Project %s deleted"
 msgstr  ""
 
-#: lxc/project.go:515
+#: lxc/project.go:521
 #, c-format
 msgid   "Project %s renamed to %s"
 msgstr  ""
@@ -2332,7 +2336,7 @@ msgstr  ""
 msgid   "Remote %s already exists"
 msgstr  ""
 
-#: lxc/project.go:699 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671 lxc/remote.go:709
+#: lxc/project.go:705 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671 lxc/remote.go:709
 #, c-format
 msgid   "Remote %s doesn't exist"
 msgstr  ""
@@ -2418,7 +2422,7 @@ msgstr  ""
 msgid   "Rename profiles"
 msgstr  ""
 
-#: lxc/project.go:475 lxc/project.go:476
+#: lxc/project.go:481 lxc/project.go:482
 msgid   "Rename projects"
 msgstr  ""
 
@@ -2521,7 +2525,7 @@ msgstr  ""
 msgid   "STORAGE POOL"
 msgstr  ""
 
-#: lxc/project.go:458
+#: lxc/project.go:463
 msgid   "STORAGE VOLUMES"
 msgstr  ""
 
@@ -2601,11 +2605,11 @@ msgid   "Set profile configuration keys\n"
         "    lxc profile set [<remote>:]<profile> <key> <value>"
 msgstr  ""
 
-#: lxc/project.go:530
+#: lxc/project.go:536
 msgid   "Set project configuration keys"
 msgstr  ""
 
-#: lxc/project.go:531
+#: lxc/project.go:537
 msgid   "Set project configuration keys\n"
         "\n"
         "For backward compatibility, a single configuration key may still be set with:\n"
@@ -2706,7 +2710,7 @@ msgstr  ""
 msgid   "Show profile configurations"
 msgstr  ""
 
-#: lxc/project.go:619 lxc/project.go:620
+#: lxc/project.go:625 lxc/project.go:626
 msgid   "Show project options"
 msgstr  ""
 
@@ -2877,7 +2881,7 @@ msgstr  ""
 msgid   "Swap (peak)"
 msgstr  ""
 
-#: lxc/project.go:672 lxc/project.go:673
+#: lxc/project.go:678 lxc/project.go:679
 msgid   "Switch the current project"
 msgstr  ""
 
@@ -3058,7 +3062,7 @@ msgstr  ""
 msgid   "URL"
 msgstr  ""
 
-#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:459 lxc/storage.go:567 lxc/storage_volume.go:1139
+#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:465 lxc/storage.go:567 lxc/storage_volume.go:1139
 msgid   "USED BY"
 msgstr  ""
 
@@ -3102,7 +3106,7 @@ msgstr  ""
 msgid   "Unset profile configuration keys"
 msgstr  ""
 
-#: lxc/project.go:590 lxc/project.go:591
+#: lxc/project.go:596 lxc/project.go:597
 msgid   "Unset project configuration keys"
 msgstr  ""
 
@@ -3186,7 +3190,7 @@ msgstr  ""
 msgid   "Whether or not to snapshot the instance's running state"
 msgstr  ""
 
-#: lxc/network.go:857 lxc/operation.go:145 lxc/project.go:431 lxc/project.go:436 lxc/project.go:441 lxc/remote.go:482 lxc/remote.go:487
+#: lxc/network.go:857 lxc/operation.go:145 lxc/project.go:431 lxc/project.go:436 lxc/project.go:441 lxc/project.go:446 lxc/remote.go:482 lxc/remote.go:487
 msgid   "YES"
 msgstr  ""
 
@@ -3306,7 +3310,7 @@ msgstr  ""
 msgid   "create [<remote>:]<project>"
 msgstr  ""
 
-#: lxc/project.go:446
+#: lxc/project.go:451
 msgid   "current"
 msgstr  ""
 
@@ -3902,7 +3906,7 @@ msgstr  ""
 msgid   "rename [<remote>:]<profile> <new-name>"
 msgstr  ""
 
-#: lxc/project.go:473
+#: lxc/project.go:479
 msgid   "rename [<remote>:]<project> <new-name>"
 msgstr  ""
 
@@ -3938,7 +3942,7 @@ msgstr  ""
 msgid   "set [<remote>:]<profile> <key><value>..."
 msgstr  ""
 
-#: lxc/project.go:529
+#: lxc/project.go:535
 msgid   "set [<remote>:]<project> <key>=<value>..."
 msgstr  ""
 
@@ -3990,7 +3994,7 @@ msgstr  ""
 msgid   "show [<remote>:]<profile>"
 msgstr  ""
 
-#: lxc/project.go:618
+#: lxc/project.go:624
 msgid   "show [<remote>:]<project>"
 msgstr  ""
 
@@ -4034,7 +4038,7 @@ msgstr  ""
 msgid   "switch <remote>"
 msgstr  ""
 
-#: lxc/project.go:671
+#: lxc/project.go:677
 msgid   "switch [<remote>:]<project>"
 msgstr  ""
 
@@ -4079,7 +4083,7 @@ msgstr  ""
 msgid   "unset [<remote>:]<profile> <key>"
 msgstr  ""
 
-#: lxc/project.go:589
+#: lxc/project.go:595
 msgid   "unset [<remote>:]<project> <key>"
 msgstr  ""
 
diff --git a/po/nb_NO.po b/po/nb_NO.po
index 05b8775f94..4bf3b82575 100644
--- a/po/nb_NO.po
+++ b/po/nb_NO.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: 2020-08-24 11:17-0400\n"
+"POT-Creation-Date: 2020-08-25 11:06+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -905,8 +905,8 @@ msgstr ""
 #: lxc/profile.go:577 lxc/profile.go:636 lxc/profile.go:712 lxc/profile.go:762
 #: lxc/profile.go:821 lxc/profile.go:875 lxc/project.go:29 lxc/project.go:86
 #: lxc/project.go:151 lxc/project.go:214 lxc/project.go:334 lxc/project.go:384
-#: lxc/project.go:476 lxc/project.go:531 lxc/project.go:591 lxc/project.go:620
-#: lxc/project.go:673 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
+#: lxc/project.go:482 lxc/project.go:537 lxc/project.go:597 lxc/project.go:626
+#: lxc/project.go:679 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
 #: lxc/remote.go:84 lxc/remote.go:423 lxc/remote.go:459 lxc/remote.go:539
 #: lxc/remote.go:601 lxc/remote.go:651 lxc/remote.go:689 lxc/rename.go:21
 #: lxc/restore.go:24 lxc/snapshot.go:27 lxc/storage.go:33 lxc/storage.go:89
@@ -1361,7 +1361,7 @@ msgstr ""
 msgid "ID: %s"
 msgstr ""
 
-#: lxc/project.go:456
+#: lxc/project.go:461
 msgid "IMAGES"
 msgstr ""
 
@@ -2001,7 +2001,7 @@ msgid "Missing profile name"
 msgstr ""
 
 #: lxc/project.go:111 lxc/project.go:180 lxc/project.go:258 lxc/project.go:358
-#: lxc/project.go:500 lxc/project.go:558 lxc/project.go:644
+#: lxc/project.go:506 lxc/project.go:564 lxc/project.go:650
 msgid "Missing project name"
 msgstr ""
 
@@ -2073,11 +2073,15 @@ msgid "Must supply instance name for: "
 msgstr ""
 
 #: lxc/cluster.go:132 lxc/list.go:435 lxc/network.go:878 lxc/profile.go:620
-#: lxc/project.go:455 lxc/remote.go:517 lxc/storage.go:558
+#: lxc/project.go:460 lxc/remote.go:517 lxc/storage.go:558
 #: lxc/storage_volume.go:1136
 msgid "NAME"
 msgstr ""
 
+#: lxc/project.go:464
+msgid "NETWORKS"
+msgstr ""
+
 #: lxc/info.go:380
 msgid "NIC:"
 msgstr ""
@@ -2087,7 +2091,8 @@ msgid "NICs:"
 msgstr ""
 
 #: lxc/network.go:855 lxc/operation.go:143 lxc/project.go:429
-#: lxc/project.go:434 lxc/project.go:439 lxc/remote.go:480 lxc/remote.go:485
+#: lxc/project.go:434 lxc/project.go:439 lxc/project.go:444 lxc/remote.go:480
+#: lxc/remote.go:485
 msgid "NO"
 msgstr ""
 
@@ -2235,7 +2240,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:438 lxc/project.go:457
+#: lxc/list.go:438 lxc/project.go:462
 msgid "PROFILES"
 msgstr ""
 
@@ -2393,7 +2398,7 @@ msgstr ""
 msgid "Project %s deleted"
 msgstr ""
 
-#: lxc/project.go:515
+#: lxc/project.go:521
 #, c-format
 msgid "Project %s renamed to %s"
 msgstr ""
@@ -2474,7 +2479,7 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/project.go:699 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
+#: lxc/project.go:705 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
 #: lxc/remote.go:709
 #, c-format
 msgid "Remote %s doesn't exist"
@@ -2562,7 +2567,7 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
-#: lxc/project.go:475 lxc/project.go:476
+#: lxc/project.go:481 lxc/project.go:482
 msgid "Rename projects"
 msgstr ""
 
@@ -2667,7 +2672,7 @@ msgstr ""
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/project.go:458
+#: lxc/project.go:463
 msgid "STORAGE VOLUMES"
 msgstr ""
 
@@ -2757,11 +2762,11 @@ msgid ""
 "    lxc profile set [<remote>:]<profile> <key> <value>"
 msgstr ""
 
-#: lxc/project.go:530
+#: lxc/project.go:536
 msgid "Set project configuration keys"
 msgstr ""
 
-#: lxc/project.go:531
+#: lxc/project.go:537
 msgid ""
 "Set project configuration keys\n"
 "\n"
@@ -2868,7 +2873,7 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
-#: lxc/project.go:619 lxc/project.go:620
+#: lxc/project.go:625 lxc/project.go:626
 msgid "Show project options"
 msgstr ""
 
@@ -3039,7 +3044,7 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
-#: lxc/project.go:672 lxc/project.go:673
+#: lxc/project.go:678 lxc/project.go:679
 msgid "Switch the current project"
 msgstr ""
 
@@ -3232,7 +3237,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:459 lxc/storage.go:567
+#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:465 lxc/storage.go:567
 #: lxc/storage_volume.go:1139
 msgid "USED BY"
 msgstr ""
@@ -3277,7 +3282,7 @@ msgstr ""
 msgid "Unset profile configuration keys"
 msgstr ""
 
-#: lxc/project.go:590 lxc/project.go:591
+#: lxc/project.go:596 lxc/project.go:597
 msgid "Unset project configuration keys"
 msgstr ""
 
@@ -3366,7 +3371,8 @@ msgid "Whether or not to snapshot the instance's running state"
 msgstr ""
 
 #: lxc/network.go:857 lxc/operation.go:145 lxc/project.go:431
-#: lxc/project.go:436 lxc/project.go:441 lxc/remote.go:482 lxc/remote.go:487
+#: lxc/project.go:436 lxc/project.go:441 lxc/project.go:446 lxc/remote.go:482
+#: lxc/remote.go:487
 msgid "YES"
 msgstr ""
 
@@ -3490,7 +3496,7 @@ msgstr ""
 msgid "create [<remote>:]<project>"
 msgstr ""
 
-#: lxc/project.go:446
+#: lxc/project.go:451
 msgid "current"
 msgstr ""
 
@@ -4139,7 +4145,7 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
-#: lxc/project.go:473
+#: lxc/project.go:479
 msgid "rename [<remote>:]<project> <new-name>"
 msgstr ""
 
@@ -4175,7 +4181,7 @@ msgstr ""
 msgid "set [<remote>:]<profile> <key><value>..."
 msgstr ""
 
-#: lxc/project.go:529
+#: lxc/project.go:535
 msgid "set [<remote>:]<project> <key>=<value>..."
 msgstr ""
 
@@ -4227,7 +4233,7 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
-#: lxc/project.go:618
+#: lxc/project.go:624
 msgid "show [<remote>:]<project>"
 msgstr ""
 
@@ -4271,7 +4277,7 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
-#: lxc/project.go:671
+#: lxc/project.go:677
 msgid "switch [<remote>:]<project>"
 msgstr ""
 
@@ -4316,7 +4322,7 @@ msgstr ""
 msgid "unset [<remote>:]<profile> <key>"
 msgstr ""
 
-#: lxc/project.go:589
+#: lxc/project.go:595
 msgid "unset [<remote>:]<project> <key>"
 msgstr ""
 
diff --git a/po/nl.po b/po/nl.po
index 21b96dc9e9..c150a674d7 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: 2020-08-24 11:17-0400\n"
+"POT-Creation-Date: 2020-08-25 11:06+0100\n"
 "PO-Revision-Date: 2019-09-06 07:09+0000\n"
 "Last-Translator: Stéphane Graber <stgraber at stgraber.org>\n"
 "Language-Team: Dutch <https://hosted.weblate.org/projects/linux-containers/"
@@ -1022,8 +1022,8 @@ msgstr ""
 #: lxc/profile.go:577 lxc/profile.go:636 lxc/profile.go:712 lxc/profile.go:762
 #: lxc/profile.go:821 lxc/profile.go:875 lxc/project.go:29 lxc/project.go:86
 #: lxc/project.go:151 lxc/project.go:214 lxc/project.go:334 lxc/project.go:384
-#: lxc/project.go:476 lxc/project.go:531 lxc/project.go:591 lxc/project.go:620
-#: lxc/project.go:673 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
+#: lxc/project.go:482 lxc/project.go:537 lxc/project.go:597 lxc/project.go:626
+#: lxc/project.go:679 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
 #: lxc/remote.go:84 lxc/remote.go:423 lxc/remote.go:459 lxc/remote.go:539
 #: lxc/remote.go:601 lxc/remote.go:651 lxc/remote.go:689 lxc/rename.go:21
 #: lxc/restore.go:24 lxc/snapshot.go:27 lxc/storage.go:33 lxc/storage.go:89
@@ -1478,7 +1478,7 @@ msgstr ""
 msgid "ID: %s"
 msgstr ""
 
-#: lxc/project.go:456
+#: lxc/project.go:461
 msgid "IMAGES"
 msgstr ""
 
@@ -2118,7 +2118,7 @@ msgid "Missing profile name"
 msgstr ""
 
 #: lxc/project.go:111 lxc/project.go:180 lxc/project.go:258 lxc/project.go:358
-#: lxc/project.go:500 lxc/project.go:558 lxc/project.go:644
+#: lxc/project.go:506 lxc/project.go:564 lxc/project.go:650
 msgid "Missing project name"
 msgstr ""
 
@@ -2190,11 +2190,15 @@ msgid "Must supply instance name for: "
 msgstr ""
 
 #: lxc/cluster.go:132 lxc/list.go:435 lxc/network.go:878 lxc/profile.go:620
-#: lxc/project.go:455 lxc/remote.go:517 lxc/storage.go:558
+#: lxc/project.go:460 lxc/remote.go:517 lxc/storage.go:558
 #: lxc/storage_volume.go:1136
 msgid "NAME"
 msgstr ""
 
+#: lxc/project.go:464
+msgid "NETWORKS"
+msgstr ""
+
 #: lxc/info.go:380
 msgid "NIC:"
 msgstr ""
@@ -2204,7 +2208,8 @@ msgid "NICs:"
 msgstr ""
 
 #: lxc/network.go:855 lxc/operation.go:143 lxc/project.go:429
-#: lxc/project.go:434 lxc/project.go:439 lxc/remote.go:480 lxc/remote.go:485
+#: lxc/project.go:434 lxc/project.go:439 lxc/project.go:444 lxc/remote.go:480
+#: lxc/remote.go:485
 msgid "NO"
 msgstr ""
 
@@ -2352,7 +2357,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:438 lxc/project.go:457
+#: lxc/list.go:438 lxc/project.go:462
 msgid "PROFILES"
 msgstr ""
 
@@ -2510,7 +2515,7 @@ msgstr ""
 msgid "Project %s deleted"
 msgstr ""
 
-#: lxc/project.go:515
+#: lxc/project.go:521
 #, c-format
 msgid "Project %s renamed to %s"
 msgstr ""
@@ -2591,7 +2596,7 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/project.go:699 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
+#: lxc/project.go:705 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
 #: lxc/remote.go:709
 #, c-format
 msgid "Remote %s doesn't exist"
@@ -2679,7 +2684,7 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
-#: lxc/project.go:475 lxc/project.go:476
+#: lxc/project.go:481 lxc/project.go:482
 msgid "Rename projects"
 msgstr ""
 
@@ -2784,7 +2789,7 @@ msgstr ""
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/project.go:458
+#: lxc/project.go:463
 msgid "STORAGE VOLUMES"
 msgstr ""
 
@@ -2874,11 +2879,11 @@ msgid ""
 "    lxc profile set [<remote>:]<profile> <key> <value>"
 msgstr ""
 
-#: lxc/project.go:530
+#: lxc/project.go:536
 msgid "Set project configuration keys"
 msgstr ""
 
-#: lxc/project.go:531
+#: lxc/project.go:537
 msgid ""
 "Set project configuration keys\n"
 "\n"
@@ -2985,7 +2990,7 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
-#: lxc/project.go:619 lxc/project.go:620
+#: lxc/project.go:625 lxc/project.go:626
 msgid "Show project options"
 msgstr ""
 
@@ -3156,7 +3161,7 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
-#: lxc/project.go:672 lxc/project.go:673
+#: lxc/project.go:678 lxc/project.go:679
 msgid "Switch the current project"
 msgstr ""
 
@@ -3349,7 +3354,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:459 lxc/storage.go:567
+#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:465 lxc/storage.go:567
 #: lxc/storage_volume.go:1139
 msgid "USED BY"
 msgstr ""
@@ -3394,7 +3399,7 @@ msgstr ""
 msgid "Unset profile configuration keys"
 msgstr ""
 
-#: lxc/project.go:590 lxc/project.go:591
+#: lxc/project.go:596 lxc/project.go:597
 msgid "Unset project configuration keys"
 msgstr ""
 
@@ -3483,7 +3488,8 @@ msgid "Whether or not to snapshot the instance's running state"
 msgstr ""
 
 #: lxc/network.go:857 lxc/operation.go:145 lxc/project.go:431
-#: lxc/project.go:436 lxc/project.go:441 lxc/remote.go:482 lxc/remote.go:487
+#: lxc/project.go:436 lxc/project.go:441 lxc/project.go:446 lxc/remote.go:482
+#: lxc/remote.go:487
 msgid "YES"
 msgstr ""
 
@@ -3607,7 +3613,7 @@ msgstr ""
 msgid "create [<remote>:]<project>"
 msgstr ""
 
-#: lxc/project.go:446
+#: lxc/project.go:451
 msgid "current"
 msgstr ""
 
@@ -4256,7 +4262,7 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
-#: lxc/project.go:473
+#: lxc/project.go:479
 msgid "rename [<remote>:]<project> <new-name>"
 msgstr ""
 
@@ -4292,7 +4298,7 @@ msgstr ""
 msgid "set [<remote>:]<profile> <key><value>..."
 msgstr ""
 
-#: lxc/project.go:529
+#: lxc/project.go:535
 msgid "set [<remote>:]<project> <key>=<value>..."
 msgstr ""
 
@@ -4344,7 +4350,7 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
-#: lxc/project.go:618
+#: lxc/project.go:624
 msgid "show [<remote>:]<project>"
 msgstr ""
 
@@ -4388,7 +4394,7 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
-#: lxc/project.go:671
+#: lxc/project.go:677
 msgid "switch [<remote>:]<project>"
 msgstr ""
 
@@ -4433,7 +4439,7 @@ msgstr ""
 msgid "unset [<remote>:]<profile> <key>"
 msgstr ""
 
-#: lxc/project.go:589
+#: lxc/project.go:595
 msgid "unset [<remote>:]<project> <key>"
 msgstr ""
 
diff --git a/po/pa.po b/po/pa.po
index 6078136311..74c22351a8 100644
--- a/po/pa.po
+++ b/po/pa.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: 2020-08-24 11:17-0400\n"
+"POT-Creation-Date: 2020-08-25 11:06+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -905,8 +905,8 @@ msgstr ""
 #: lxc/profile.go:577 lxc/profile.go:636 lxc/profile.go:712 lxc/profile.go:762
 #: lxc/profile.go:821 lxc/profile.go:875 lxc/project.go:29 lxc/project.go:86
 #: lxc/project.go:151 lxc/project.go:214 lxc/project.go:334 lxc/project.go:384
-#: lxc/project.go:476 lxc/project.go:531 lxc/project.go:591 lxc/project.go:620
-#: lxc/project.go:673 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
+#: lxc/project.go:482 lxc/project.go:537 lxc/project.go:597 lxc/project.go:626
+#: lxc/project.go:679 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
 #: lxc/remote.go:84 lxc/remote.go:423 lxc/remote.go:459 lxc/remote.go:539
 #: lxc/remote.go:601 lxc/remote.go:651 lxc/remote.go:689 lxc/rename.go:21
 #: lxc/restore.go:24 lxc/snapshot.go:27 lxc/storage.go:33 lxc/storage.go:89
@@ -1361,7 +1361,7 @@ msgstr ""
 msgid "ID: %s"
 msgstr ""
 
-#: lxc/project.go:456
+#: lxc/project.go:461
 msgid "IMAGES"
 msgstr ""
 
@@ -2001,7 +2001,7 @@ msgid "Missing profile name"
 msgstr ""
 
 #: lxc/project.go:111 lxc/project.go:180 lxc/project.go:258 lxc/project.go:358
-#: lxc/project.go:500 lxc/project.go:558 lxc/project.go:644
+#: lxc/project.go:506 lxc/project.go:564 lxc/project.go:650
 msgid "Missing project name"
 msgstr ""
 
@@ -2073,11 +2073,15 @@ msgid "Must supply instance name for: "
 msgstr ""
 
 #: lxc/cluster.go:132 lxc/list.go:435 lxc/network.go:878 lxc/profile.go:620
-#: lxc/project.go:455 lxc/remote.go:517 lxc/storage.go:558
+#: lxc/project.go:460 lxc/remote.go:517 lxc/storage.go:558
 #: lxc/storage_volume.go:1136
 msgid "NAME"
 msgstr ""
 
+#: lxc/project.go:464
+msgid "NETWORKS"
+msgstr ""
+
 #: lxc/info.go:380
 msgid "NIC:"
 msgstr ""
@@ -2087,7 +2091,8 @@ msgid "NICs:"
 msgstr ""
 
 #: lxc/network.go:855 lxc/operation.go:143 lxc/project.go:429
-#: lxc/project.go:434 lxc/project.go:439 lxc/remote.go:480 lxc/remote.go:485
+#: lxc/project.go:434 lxc/project.go:439 lxc/project.go:444 lxc/remote.go:480
+#: lxc/remote.go:485
 msgid "NO"
 msgstr ""
 
@@ -2235,7 +2240,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:438 lxc/project.go:457
+#: lxc/list.go:438 lxc/project.go:462
 msgid "PROFILES"
 msgstr ""
 
@@ -2393,7 +2398,7 @@ msgstr ""
 msgid "Project %s deleted"
 msgstr ""
 
-#: lxc/project.go:515
+#: lxc/project.go:521
 #, c-format
 msgid "Project %s renamed to %s"
 msgstr ""
@@ -2474,7 +2479,7 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/project.go:699 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
+#: lxc/project.go:705 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
 #: lxc/remote.go:709
 #, c-format
 msgid "Remote %s doesn't exist"
@@ -2562,7 +2567,7 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
-#: lxc/project.go:475 lxc/project.go:476
+#: lxc/project.go:481 lxc/project.go:482
 msgid "Rename projects"
 msgstr ""
 
@@ -2667,7 +2672,7 @@ msgstr ""
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/project.go:458
+#: lxc/project.go:463
 msgid "STORAGE VOLUMES"
 msgstr ""
 
@@ -2757,11 +2762,11 @@ msgid ""
 "    lxc profile set [<remote>:]<profile> <key> <value>"
 msgstr ""
 
-#: lxc/project.go:530
+#: lxc/project.go:536
 msgid "Set project configuration keys"
 msgstr ""
 
-#: lxc/project.go:531
+#: lxc/project.go:537
 msgid ""
 "Set project configuration keys\n"
 "\n"
@@ -2868,7 +2873,7 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
-#: lxc/project.go:619 lxc/project.go:620
+#: lxc/project.go:625 lxc/project.go:626
 msgid "Show project options"
 msgstr ""
 
@@ -3039,7 +3044,7 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
-#: lxc/project.go:672 lxc/project.go:673
+#: lxc/project.go:678 lxc/project.go:679
 msgid "Switch the current project"
 msgstr ""
 
@@ -3232,7 +3237,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:459 lxc/storage.go:567
+#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:465 lxc/storage.go:567
 #: lxc/storage_volume.go:1139
 msgid "USED BY"
 msgstr ""
@@ -3277,7 +3282,7 @@ msgstr ""
 msgid "Unset profile configuration keys"
 msgstr ""
 
-#: lxc/project.go:590 lxc/project.go:591
+#: lxc/project.go:596 lxc/project.go:597
 msgid "Unset project configuration keys"
 msgstr ""
 
@@ -3366,7 +3371,8 @@ msgid "Whether or not to snapshot the instance's running state"
 msgstr ""
 
 #: lxc/network.go:857 lxc/operation.go:145 lxc/project.go:431
-#: lxc/project.go:436 lxc/project.go:441 lxc/remote.go:482 lxc/remote.go:487
+#: lxc/project.go:436 lxc/project.go:441 lxc/project.go:446 lxc/remote.go:482
+#: lxc/remote.go:487
 msgid "YES"
 msgstr ""
 
@@ -3490,7 +3496,7 @@ msgstr ""
 msgid "create [<remote>:]<project>"
 msgstr ""
 
-#: lxc/project.go:446
+#: lxc/project.go:451
 msgid "current"
 msgstr ""
 
@@ -4139,7 +4145,7 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
-#: lxc/project.go:473
+#: lxc/project.go:479
 msgid "rename [<remote>:]<project> <new-name>"
 msgstr ""
 
@@ -4175,7 +4181,7 @@ msgstr ""
 msgid "set [<remote>:]<profile> <key><value>..."
 msgstr ""
 
-#: lxc/project.go:529
+#: lxc/project.go:535
 msgid "set [<remote>:]<project> <key>=<value>..."
 msgstr ""
 
@@ -4227,7 +4233,7 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
-#: lxc/project.go:618
+#: lxc/project.go:624
 msgid "show [<remote>:]<project>"
 msgstr ""
 
@@ -4271,7 +4277,7 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
-#: lxc/project.go:671
+#: lxc/project.go:677
 msgid "switch [<remote>:]<project>"
 msgstr ""
 
@@ -4316,7 +4322,7 @@ msgstr ""
 msgid "unset [<remote>:]<profile> <key>"
 msgstr ""
 
-#: lxc/project.go:589
+#: lxc/project.go:595
 msgid "unset [<remote>:]<project> <key>"
 msgstr ""
 
diff --git a/po/pl.po b/po/pl.po
index 4122621f87..2a2193d6e9 100644
--- a/po/pl.po
+++ b/po/pl.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: 2020-08-24 11:17-0400\n"
+"POT-Creation-Date: 2020-08-25 11:06+0100\n"
 "PO-Revision-Date: 2018-09-08 19:22+0000\n"
 "Last-Translator: m4sk1n <me at m4sk.in>\n"
 "Language-Team: Polish <https://hosted.weblate.org/projects/linux-containers/"
@@ -1032,8 +1032,8 @@ msgstr ""
 #: lxc/profile.go:577 lxc/profile.go:636 lxc/profile.go:712 lxc/profile.go:762
 #: lxc/profile.go:821 lxc/profile.go:875 lxc/project.go:29 lxc/project.go:86
 #: lxc/project.go:151 lxc/project.go:214 lxc/project.go:334 lxc/project.go:384
-#: lxc/project.go:476 lxc/project.go:531 lxc/project.go:591 lxc/project.go:620
-#: lxc/project.go:673 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
+#: lxc/project.go:482 lxc/project.go:537 lxc/project.go:597 lxc/project.go:626
+#: lxc/project.go:679 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
 #: lxc/remote.go:84 lxc/remote.go:423 lxc/remote.go:459 lxc/remote.go:539
 #: lxc/remote.go:601 lxc/remote.go:651 lxc/remote.go:689 lxc/rename.go:21
 #: lxc/restore.go:24 lxc/snapshot.go:27 lxc/storage.go:33 lxc/storage.go:89
@@ -1488,7 +1488,7 @@ msgstr ""
 msgid "ID: %s"
 msgstr ""
 
-#: lxc/project.go:456
+#: lxc/project.go:461
 msgid "IMAGES"
 msgstr ""
 
@@ -2128,7 +2128,7 @@ msgid "Missing profile name"
 msgstr ""
 
 #: lxc/project.go:111 lxc/project.go:180 lxc/project.go:258 lxc/project.go:358
-#: lxc/project.go:500 lxc/project.go:558 lxc/project.go:644
+#: lxc/project.go:506 lxc/project.go:564 lxc/project.go:650
 msgid "Missing project name"
 msgstr ""
 
@@ -2200,11 +2200,15 @@ msgid "Must supply instance name for: "
 msgstr ""
 
 #: lxc/cluster.go:132 lxc/list.go:435 lxc/network.go:878 lxc/profile.go:620
-#: lxc/project.go:455 lxc/remote.go:517 lxc/storage.go:558
+#: lxc/project.go:460 lxc/remote.go:517 lxc/storage.go:558
 #: lxc/storage_volume.go:1136
 msgid "NAME"
 msgstr ""
 
+#: lxc/project.go:464
+msgid "NETWORKS"
+msgstr ""
+
 #: lxc/info.go:380
 msgid "NIC:"
 msgstr ""
@@ -2214,7 +2218,8 @@ msgid "NICs:"
 msgstr ""
 
 #: lxc/network.go:855 lxc/operation.go:143 lxc/project.go:429
-#: lxc/project.go:434 lxc/project.go:439 lxc/remote.go:480 lxc/remote.go:485
+#: lxc/project.go:434 lxc/project.go:439 lxc/project.go:444 lxc/remote.go:480
+#: lxc/remote.go:485
 msgid "NO"
 msgstr ""
 
@@ -2362,7 +2367,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:438 lxc/project.go:457
+#: lxc/list.go:438 lxc/project.go:462
 msgid "PROFILES"
 msgstr ""
 
@@ -2520,7 +2525,7 @@ msgstr ""
 msgid "Project %s deleted"
 msgstr ""
 
-#: lxc/project.go:515
+#: lxc/project.go:521
 #, c-format
 msgid "Project %s renamed to %s"
 msgstr ""
@@ -2601,7 +2606,7 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/project.go:699 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
+#: lxc/project.go:705 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
 #: lxc/remote.go:709
 #, c-format
 msgid "Remote %s doesn't exist"
@@ -2689,7 +2694,7 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
-#: lxc/project.go:475 lxc/project.go:476
+#: lxc/project.go:481 lxc/project.go:482
 msgid "Rename projects"
 msgstr ""
 
@@ -2794,7 +2799,7 @@ msgstr ""
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/project.go:458
+#: lxc/project.go:463
 msgid "STORAGE VOLUMES"
 msgstr ""
 
@@ -2884,11 +2889,11 @@ msgid ""
 "    lxc profile set [<remote>:]<profile> <key> <value>"
 msgstr ""
 
-#: lxc/project.go:530
+#: lxc/project.go:536
 msgid "Set project configuration keys"
 msgstr ""
 
-#: lxc/project.go:531
+#: lxc/project.go:537
 msgid ""
 "Set project configuration keys\n"
 "\n"
@@ -2995,7 +3000,7 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
-#: lxc/project.go:619 lxc/project.go:620
+#: lxc/project.go:625 lxc/project.go:626
 msgid "Show project options"
 msgstr ""
 
@@ -3166,7 +3171,7 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
-#: lxc/project.go:672 lxc/project.go:673
+#: lxc/project.go:678 lxc/project.go:679
 msgid "Switch the current project"
 msgstr ""
 
@@ -3359,7 +3364,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:459 lxc/storage.go:567
+#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:465 lxc/storage.go:567
 #: lxc/storage_volume.go:1139
 msgid "USED BY"
 msgstr ""
@@ -3404,7 +3409,7 @@ msgstr ""
 msgid "Unset profile configuration keys"
 msgstr ""
 
-#: lxc/project.go:590 lxc/project.go:591
+#: lxc/project.go:596 lxc/project.go:597
 msgid "Unset project configuration keys"
 msgstr ""
 
@@ -3493,7 +3498,8 @@ msgid "Whether or not to snapshot the instance's running state"
 msgstr ""
 
 #: lxc/network.go:857 lxc/operation.go:145 lxc/project.go:431
-#: lxc/project.go:436 lxc/project.go:441 lxc/remote.go:482 lxc/remote.go:487
+#: lxc/project.go:436 lxc/project.go:441 lxc/project.go:446 lxc/remote.go:482
+#: lxc/remote.go:487
 msgid "YES"
 msgstr ""
 
@@ -3617,7 +3623,7 @@ msgstr ""
 msgid "create [<remote>:]<project>"
 msgstr ""
 
-#: lxc/project.go:446
+#: lxc/project.go:451
 msgid "current"
 msgstr ""
 
@@ -4266,7 +4272,7 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
-#: lxc/project.go:473
+#: lxc/project.go:479
 msgid "rename [<remote>:]<project> <new-name>"
 msgstr ""
 
@@ -4302,7 +4308,7 @@ msgstr ""
 msgid "set [<remote>:]<profile> <key><value>..."
 msgstr ""
 
-#: lxc/project.go:529
+#: lxc/project.go:535
 msgid "set [<remote>:]<project> <key>=<value>..."
 msgstr ""
 
@@ -4354,7 +4360,7 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
-#: lxc/project.go:618
+#: lxc/project.go:624
 msgid "show [<remote>:]<project>"
 msgstr ""
 
@@ -4398,7 +4404,7 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
-#: lxc/project.go:671
+#: lxc/project.go:677
 msgid "switch [<remote>:]<project>"
 msgstr ""
 
@@ -4443,7 +4449,7 @@ msgstr ""
 msgid "unset [<remote>:]<profile> <key>"
 msgstr ""
 
-#: lxc/project.go:589
+#: lxc/project.go:595
 msgid "unset [<remote>:]<project> <key>"
 msgstr ""
 
diff --git a/po/pt_BR.po b/po/pt_BR.po
index 5b8b6096ed..3a8b6870c4 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.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: 2020-08-24 11:17-0400\n"
+"POT-Creation-Date: 2020-08-25 11:06+0100\n"
 "PO-Revision-Date: 2019-09-06 07:09+0000\n"
 "Last-Translator: Stéphane Graber <stgraber at stgraber.org>\n"
 "Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/"
@@ -1069,8 +1069,8 @@ msgstr ""
 #: lxc/profile.go:577 lxc/profile.go:636 lxc/profile.go:712 lxc/profile.go:762
 #: lxc/profile.go:821 lxc/profile.go:875 lxc/project.go:29 lxc/project.go:86
 #: lxc/project.go:151 lxc/project.go:214 lxc/project.go:334 lxc/project.go:384
-#: lxc/project.go:476 lxc/project.go:531 lxc/project.go:591 lxc/project.go:620
-#: lxc/project.go:673 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
+#: lxc/project.go:482 lxc/project.go:537 lxc/project.go:597 lxc/project.go:626
+#: lxc/project.go:679 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
 #: lxc/remote.go:84 lxc/remote.go:423 lxc/remote.go:459 lxc/remote.go:539
 #: lxc/remote.go:601 lxc/remote.go:651 lxc/remote.go:689 lxc/rename.go:21
 #: lxc/restore.go:24 lxc/snapshot.go:27 lxc/storage.go:33 lxc/storage.go:89
@@ -1538,7 +1538,7 @@ msgstr ""
 msgid "ID: %s"
 msgstr ""
 
-#: lxc/project.go:456
+#: lxc/project.go:461
 msgid "IMAGES"
 msgstr ""
 
@@ -2186,7 +2186,7 @@ msgid "Missing profile name"
 msgstr ""
 
 #: lxc/project.go:111 lxc/project.go:180 lxc/project.go:258 lxc/project.go:358
-#: lxc/project.go:500 lxc/project.go:558 lxc/project.go:644
+#: lxc/project.go:506 lxc/project.go:564 lxc/project.go:650
 msgid "Missing project name"
 msgstr ""
 
@@ -2258,11 +2258,15 @@ msgid "Must supply instance name for: "
 msgstr ""
 
 #: lxc/cluster.go:132 lxc/list.go:435 lxc/network.go:878 lxc/profile.go:620
-#: lxc/project.go:455 lxc/remote.go:517 lxc/storage.go:558
+#: lxc/project.go:460 lxc/remote.go:517 lxc/storage.go:558
 #: lxc/storage_volume.go:1136
 msgid "NAME"
 msgstr ""
 
+#: lxc/project.go:464
+msgid "NETWORKS"
+msgstr ""
+
 #: lxc/info.go:380
 msgid "NIC:"
 msgstr ""
@@ -2272,7 +2276,8 @@ msgid "NICs:"
 msgstr ""
 
 #: lxc/network.go:855 lxc/operation.go:143 lxc/project.go:429
-#: lxc/project.go:434 lxc/project.go:439 lxc/remote.go:480 lxc/remote.go:485
+#: lxc/project.go:434 lxc/project.go:439 lxc/project.go:444 lxc/remote.go:480
+#: lxc/remote.go:485
 msgid "NO"
 msgstr ""
 
@@ -2420,7 +2425,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:438 lxc/project.go:457
+#: lxc/list.go:438 lxc/project.go:462
 msgid "PROFILES"
 msgstr ""
 
@@ -2582,7 +2587,7 @@ msgstr ""
 msgid "Project %s deleted"
 msgstr ""
 
-#: lxc/project.go:515
+#: lxc/project.go:521
 #, c-format
 msgid "Project %s renamed to %s"
 msgstr ""
@@ -2664,7 +2669,7 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/project.go:699 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
+#: lxc/project.go:705 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
 #: lxc/remote.go:709
 #, c-format
 msgid "Remote %s doesn't exist"
@@ -2753,7 +2758,7 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
-#: lxc/project.go:475 lxc/project.go:476
+#: lxc/project.go:481 lxc/project.go:482
 msgid "Rename projects"
 msgstr ""
 
@@ -2859,7 +2864,7 @@ msgstr ""
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/project.go:458
+#: lxc/project.go:463
 msgid "STORAGE VOLUMES"
 msgstr ""
 
@@ -2951,12 +2956,12 @@ msgid ""
 "    lxc profile set [<remote>:]<profile> <key> <value>"
 msgstr ""
 
-#: lxc/project.go:530
+#: lxc/project.go:536
 #, fuzzy
 msgid "Set project configuration keys"
 msgstr "Editar configurações de perfil como YAML"
 
-#: lxc/project.go:531
+#: lxc/project.go:537
 msgid ""
 "Set project configuration keys\n"
 "\n"
@@ -3068,7 +3073,7 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
-#: lxc/project.go:619 lxc/project.go:620
+#: lxc/project.go:625 lxc/project.go:626
 msgid "Show project options"
 msgstr ""
 
@@ -3240,7 +3245,7 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
-#: lxc/project.go:672 lxc/project.go:673
+#: lxc/project.go:678 lxc/project.go:679
 msgid "Switch the current project"
 msgstr ""
 
@@ -3433,7 +3438,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:459 lxc/storage.go:567
+#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:465 lxc/storage.go:567
 #: lxc/storage_volume.go:1139
 msgid "USED BY"
 msgstr ""
@@ -3481,7 +3486,7 @@ msgstr ""
 msgid "Unset profile configuration keys"
 msgstr ""
 
-#: lxc/project.go:590 lxc/project.go:591
+#: lxc/project.go:596 lxc/project.go:597
 #, fuzzy
 msgid "Unset project configuration keys"
 msgstr "Editar configurações de perfil como YAML"
@@ -3571,7 +3576,8 @@ msgid "Whether or not to snapshot the instance's running state"
 msgstr ""
 
 #: lxc/network.go:857 lxc/operation.go:145 lxc/project.go:431
-#: lxc/project.go:436 lxc/project.go:441 lxc/remote.go:482 lxc/remote.go:487
+#: lxc/project.go:436 lxc/project.go:441 lxc/project.go:446 lxc/remote.go:482
+#: lxc/remote.go:487
 msgid "YES"
 msgstr ""
 
@@ -3695,7 +3701,7 @@ msgstr ""
 msgid "create [<remote>:]<project>"
 msgstr ""
 
-#: lxc/project.go:446
+#: lxc/project.go:451
 msgid "current"
 msgstr ""
 
@@ -4344,7 +4350,7 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
-#: lxc/project.go:473
+#: lxc/project.go:479
 msgid "rename [<remote>:]<project> <new-name>"
 msgstr ""
 
@@ -4380,7 +4386,7 @@ msgstr ""
 msgid "set [<remote>:]<profile> <key><value>..."
 msgstr ""
 
-#: lxc/project.go:529
+#: lxc/project.go:535
 msgid "set [<remote>:]<project> <key>=<value>..."
 msgstr ""
 
@@ -4432,7 +4438,7 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
-#: lxc/project.go:618
+#: lxc/project.go:624
 msgid "show [<remote>:]<project>"
 msgstr ""
 
@@ -4476,7 +4482,7 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
-#: lxc/project.go:671
+#: lxc/project.go:677
 msgid "switch [<remote>:]<project>"
 msgstr ""
 
@@ -4521,7 +4527,7 @@ msgstr ""
 msgid "unset [<remote>:]<profile> <key>"
 msgstr ""
 
-#: lxc/project.go:589
+#: lxc/project.go:595
 msgid "unset [<remote>:]<project> <key>"
 msgstr ""
 
diff --git a/po/ru.po b/po/ru.po
index e3c042a038..74f567a4e9 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: 2020-08-24 11:17-0400\n"
+"POT-Creation-Date: 2020-08-25 11:06+0100\n"
 "PO-Revision-Date: 2018-06-22 15:57+0000\n"
 "Last-Translator: Александр Киль <shorrey at gmail.com>\n"
 "Language-Team: Russian <https://hosted.weblate.org/projects/linux-containers/"
@@ -1054,8 +1054,8 @@ msgstr "Копирование образа: %s"
 #: lxc/profile.go:577 lxc/profile.go:636 lxc/profile.go:712 lxc/profile.go:762
 #: lxc/profile.go:821 lxc/profile.go:875 lxc/project.go:29 lxc/project.go:86
 #: lxc/project.go:151 lxc/project.go:214 lxc/project.go:334 lxc/project.go:384
-#: lxc/project.go:476 lxc/project.go:531 lxc/project.go:591 lxc/project.go:620
-#: lxc/project.go:673 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
+#: lxc/project.go:482 lxc/project.go:537 lxc/project.go:597 lxc/project.go:626
+#: lxc/project.go:679 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
 #: lxc/remote.go:84 lxc/remote.go:423 lxc/remote.go:459 lxc/remote.go:539
 #: lxc/remote.go:601 lxc/remote.go:651 lxc/remote.go:689 lxc/rename.go:21
 #: lxc/restore.go:24 lxc/snapshot.go:27 lxc/storage.go:33 lxc/storage.go:89
@@ -1519,7 +1519,7 @@ msgstr ""
 msgid "ID: %s"
 msgstr ""
 
-#: lxc/project.go:456
+#: lxc/project.go:461
 msgid "IMAGES"
 msgstr ""
 
@@ -2177,7 +2177,7 @@ msgid "Missing profile name"
 msgstr ""
 
 #: lxc/project.go:111 lxc/project.go:180 lxc/project.go:258 lxc/project.go:358
-#: lxc/project.go:500 lxc/project.go:558 lxc/project.go:644
+#: lxc/project.go:506 lxc/project.go:564 lxc/project.go:650
 #, fuzzy
 msgid "Missing project name"
 msgstr "Имя контейнера: %s"
@@ -2252,11 +2252,15 @@ msgid "Must supply instance name for: "
 msgstr ""
 
 #: lxc/cluster.go:132 lxc/list.go:435 lxc/network.go:878 lxc/profile.go:620
-#: lxc/project.go:455 lxc/remote.go:517 lxc/storage.go:558
+#: lxc/project.go:460 lxc/remote.go:517 lxc/storage.go:558
 #: lxc/storage_volume.go:1136
 msgid "NAME"
 msgstr ""
 
+#: lxc/project.go:464
+msgid "NETWORKS"
+msgstr ""
+
 #: lxc/info.go:380
 msgid "NIC:"
 msgstr ""
@@ -2266,7 +2270,8 @@ msgid "NICs:"
 msgstr ""
 
 #: lxc/network.go:855 lxc/operation.go:143 lxc/project.go:429
-#: lxc/project.go:434 lxc/project.go:439 lxc/remote.go:480 lxc/remote.go:485
+#: lxc/project.go:434 lxc/project.go:439 lxc/project.go:444 lxc/remote.go:480
+#: lxc/remote.go:485
 msgid "NO"
 msgstr ""
 
@@ -2417,7 +2422,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:438 lxc/project.go:457
+#: lxc/list.go:438 lxc/project.go:462
 msgid "PROFILES"
 msgstr ""
 
@@ -2575,7 +2580,7 @@ msgstr ""
 msgid "Project %s deleted"
 msgstr ""
 
-#: lxc/project.go:515
+#: lxc/project.go:521
 #, c-format
 msgid "Project %s renamed to %s"
 msgstr ""
@@ -2657,7 +2662,7 @@ msgstr "Копирование образа: %s"
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/project.go:699 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
+#: lxc/project.go:705 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
 #: lxc/remote.go:709
 #, c-format
 msgid "Remote %s doesn't exist"
@@ -2747,7 +2752,7 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
-#: lxc/project.go:475 lxc/project.go:476
+#: lxc/project.go:481 lxc/project.go:482
 msgid "Rename projects"
 msgstr ""
 
@@ -2857,7 +2862,7 @@ msgstr ""
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/project.go:458
+#: lxc/project.go:463
 msgid "STORAGE VOLUMES"
 msgstr ""
 
@@ -2947,11 +2952,11 @@ msgid ""
 "    lxc profile set [<remote>:]<profile> <key> <value>"
 msgstr ""
 
-#: lxc/project.go:530
+#: lxc/project.go:536
 msgid "Set project configuration keys"
 msgstr ""
 
-#: lxc/project.go:531
+#: lxc/project.go:537
 msgid ""
 "Set project configuration keys\n"
 "\n"
@@ -3060,7 +3065,7 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
-#: lxc/project.go:619 lxc/project.go:620
+#: lxc/project.go:625 lxc/project.go:626
 msgid "Show project options"
 msgstr ""
 
@@ -3235,7 +3240,7 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
-#: lxc/project.go:672 lxc/project.go:673
+#: lxc/project.go:678 lxc/project.go:679
 msgid "Switch the current project"
 msgstr ""
 
@@ -3428,7 +3433,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:459 lxc/storage.go:567
+#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:465 lxc/storage.go:567
 #: lxc/storage_volume.go:1139
 msgid "USED BY"
 msgstr ""
@@ -3473,7 +3478,7 @@ msgstr ""
 msgid "Unset profile configuration keys"
 msgstr ""
 
-#: lxc/project.go:590 lxc/project.go:591
+#: lxc/project.go:596 lxc/project.go:597
 msgid "Unset project configuration keys"
 msgstr ""
 
@@ -3562,7 +3567,8 @@ msgid "Whether or not to snapshot the instance's running state"
 msgstr ""
 
 #: lxc/network.go:857 lxc/operation.go:145 lxc/project.go:431
-#: lxc/project.go:436 lxc/project.go:441 lxc/remote.go:482 lxc/remote.go:487
+#: lxc/project.go:436 lxc/project.go:441 lxc/project.go:446 lxc/remote.go:482
+#: lxc/remote.go:487
 msgid "YES"
 msgstr ""
 
@@ -3707,7 +3713,7 @@ msgstr ""
 msgid "create [<remote>:]<project>"
 msgstr ""
 
-#: lxc/project.go:446
+#: lxc/project.go:451
 msgid "current"
 msgstr ""
 
@@ -4496,7 +4502,7 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
-#: lxc/project.go:473
+#: lxc/project.go:479
 msgid "rename [<remote>:]<project> <new-name>"
 msgstr ""
 
@@ -4560,7 +4566,7 @@ msgstr ""
 "\n"
 "lxc %s [<remote>:]<container> [[<remote>:]<container>...]%s"
 
-#: lxc/project.go:529
+#: lxc/project.go:535
 #, fuzzy
 msgid "set [<remote>:]<project> <key>=<value>..."
 msgstr ""
@@ -4636,7 +4642,7 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
-#: lxc/project.go:618
+#: lxc/project.go:624
 msgid "show [<remote>:]<project>"
 msgstr ""
 
@@ -4700,7 +4706,7 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
-#: lxc/project.go:671
+#: lxc/project.go:677
 #, fuzzy
 msgid "switch [<remote>:]<project>"
 msgstr ""
@@ -4753,7 +4759,7 @@ msgstr ""
 msgid "unset [<remote>:]<profile> <key>"
 msgstr ""
 
-#: lxc/project.go:589
+#: lxc/project.go:595
 #, fuzzy
 msgid "unset [<remote>:]<project> <key>"
 msgstr ""
diff --git a/po/sl.po b/po/sl.po
index 6c071b9352..031ee9e3d4 100644
--- a/po/sl.po
+++ b/po/sl.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: 2020-08-24 11:17-0400\n"
+"POT-Creation-Date: 2020-08-25 11:06+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -905,8 +905,8 @@ msgstr ""
 #: lxc/profile.go:577 lxc/profile.go:636 lxc/profile.go:712 lxc/profile.go:762
 #: lxc/profile.go:821 lxc/profile.go:875 lxc/project.go:29 lxc/project.go:86
 #: lxc/project.go:151 lxc/project.go:214 lxc/project.go:334 lxc/project.go:384
-#: lxc/project.go:476 lxc/project.go:531 lxc/project.go:591 lxc/project.go:620
-#: lxc/project.go:673 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
+#: lxc/project.go:482 lxc/project.go:537 lxc/project.go:597 lxc/project.go:626
+#: lxc/project.go:679 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
 #: lxc/remote.go:84 lxc/remote.go:423 lxc/remote.go:459 lxc/remote.go:539
 #: lxc/remote.go:601 lxc/remote.go:651 lxc/remote.go:689 lxc/rename.go:21
 #: lxc/restore.go:24 lxc/snapshot.go:27 lxc/storage.go:33 lxc/storage.go:89
@@ -1361,7 +1361,7 @@ msgstr ""
 msgid "ID: %s"
 msgstr ""
 
-#: lxc/project.go:456
+#: lxc/project.go:461
 msgid "IMAGES"
 msgstr ""
 
@@ -2001,7 +2001,7 @@ msgid "Missing profile name"
 msgstr ""
 
 #: lxc/project.go:111 lxc/project.go:180 lxc/project.go:258 lxc/project.go:358
-#: lxc/project.go:500 lxc/project.go:558 lxc/project.go:644
+#: lxc/project.go:506 lxc/project.go:564 lxc/project.go:650
 msgid "Missing project name"
 msgstr ""
 
@@ -2073,11 +2073,15 @@ msgid "Must supply instance name for: "
 msgstr ""
 
 #: lxc/cluster.go:132 lxc/list.go:435 lxc/network.go:878 lxc/profile.go:620
-#: lxc/project.go:455 lxc/remote.go:517 lxc/storage.go:558
+#: lxc/project.go:460 lxc/remote.go:517 lxc/storage.go:558
 #: lxc/storage_volume.go:1136
 msgid "NAME"
 msgstr ""
 
+#: lxc/project.go:464
+msgid "NETWORKS"
+msgstr ""
+
 #: lxc/info.go:380
 msgid "NIC:"
 msgstr ""
@@ -2087,7 +2091,8 @@ msgid "NICs:"
 msgstr ""
 
 #: lxc/network.go:855 lxc/operation.go:143 lxc/project.go:429
-#: lxc/project.go:434 lxc/project.go:439 lxc/remote.go:480 lxc/remote.go:485
+#: lxc/project.go:434 lxc/project.go:439 lxc/project.go:444 lxc/remote.go:480
+#: lxc/remote.go:485
 msgid "NO"
 msgstr ""
 
@@ -2235,7 +2240,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:438 lxc/project.go:457
+#: lxc/list.go:438 lxc/project.go:462
 msgid "PROFILES"
 msgstr ""
 
@@ -2393,7 +2398,7 @@ msgstr ""
 msgid "Project %s deleted"
 msgstr ""
 
-#: lxc/project.go:515
+#: lxc/project.go:521
 #, c-format
 msgid "Project %s renamed to %s"
 msgstr ""
@@ -2474,7 +2479,7 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/project.go:699 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
+#: lxc/project.go:705 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
 #: lxc/remote.go:709
 #, c-format
 msgid "Remote %s doesn't exist"
@@ -2562,7 +2567,7 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
-#: lxc/project.go:475 lxc/project.go:476
+#: lxc/project.go:481 lxc/project.go:482
 msgid "Rename projects"
 msgstr ""
 
@@ -2667,7 +2672,7 @@ msgstr ""
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/project.go:458
+#: lxc/project.go:463
 msgid "STORAGE VOLUMES"
 msgstr ""
 
@@ -2757,11 +2762,11 @@ msgid ""
 "    lxc profile set [<remote>:]<profile> <key> <value>"
 msgstr ""
 
-#: lxc/project.go:530
+#: lxc/project.go:536
 msgid "Set project configuration keys"
 msgstr ""
 
-#: lxc/project.go:531
+#: lxc/project.go:537
 msgid ""
 "Set project configuration keys\n"
 "\n"
@@ -2868,7 +2873,7 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
-#: lxc/project.go:619 lxc/project.go:620
+#: lxc/project.go:625 lxc/project.go:626
 msgid "Show project options"
 msgstr ""
 
@@ -3039,7 +3044,7 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
-#: lxc/project.go:672 lxc/project.go:673
+#: lxc/project.go:678 lxc/project.go:679
 msgid "Switch the current project"
 msgstr ""
 
@@ -3232,7 +3237,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:459 lxc/storage.go:567
+#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:465 lxc/storage.go:567
 #: lxc/storage_volume.go:1139
 msgid "USED BY"
 msgstr ""
@@ -3277,7 +3282,7 @@ msgstr ""
 msgid "Unset profile configuration keys"
 msgstr ""
 
-#: lxc/project.go:590 lxc/project.go:591
+#: lxc/project.go:596 lxc/project.go:597
 msgid "Unset project configuration keys"
 msgstr ""
 
@@ -3366,7 +3371,8 @@ msgid "Whether or not to snapshot the instance's running state"
 msgstr ""
 
 #: lxc/network.go:857 lxc/operation.go:145 lxc/project.go:431
-#: lxc/project.go:436 lxc/project.go:441 lxc/remote.go:482 lxc/remote.go:487
+#: lxc/project.go:436 lxc/project.go:441 lxc/project.go:446 lxc/remote.go:482
+#: lxc/remote.go:487
 msgid "YES"
 msgstr ""
 
@@ -3490,7 +3496,7 @@ msgstr ""
 msgid "create [<remote>:]<project>"
 msgstr ""
 
-#: lxc/project.go:446
+#: lxc/project.go:451
 msgid "current"
 msgstr ""
 
@@ -4139,7 +4145,7 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
-#: lxc/project.go:473
+#: lxc/project.go:479
 msgid "rename [<remote>:]<project> <new-name>"
 msgstr ""
 
@@ -4175,7 +4181,7 @@ msgstr ""
 msgid "set [<remote>:]<profile> <key><value>..."
 msgstr ""
 
-#: lxc/project.go:529
+#: lxc/project.go:535
 msgid "set [<remote>:]<project> <key>=<value>..."
 msgstr ""
 
@@ -4227,7 +4233,7 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
-#: lxc/project.go:618
+#: lxc/project.go:624
 msgid "show [<remote>:]<project>"
 msgstr ""
 
@@ -4271,7 +4277,7 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
-#: lxc/project.go:671
+#: lxc/project.go:677
 msgid "switch [<remote>:]<project>"
 msgstr ""
 
@@ -4316,7 +4322,7 @@ msgstr ""
 msgid "unset [<remote>:]<profile> <key>"
 msgstr ""
 
-#: lxc/project.go:589
+#: lxc/project.go:595
 msgid "unset [<remote>:]<project> <key>"
 msgstr ""
 
diff --git a/po/sr.po b/po/sr.po
index 195e6b352f..0af7a986af 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: 2020-08-24 11:17-0400\n"
+"POT-Creation-Date: 2020-08-25 11:06+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -905,8 +905,8 @@ msgstr ""
 #: lxc/profile.go:577 lxc/profile.go:636 lxc/profile.go:712 lxc/profile.go:762
 #: lxc/profile.go:821 lxc/profile.go:875 lxc/project.go:29 lxc/project.go:86
 #: lxc/project.go:151 lxc/project.go:214 lxc/project.go:334 lxc/project.go:384
-#: lxc/project.go:476 lxc/project.go:531 lxc/project.go:591 lxc/project.go:620
-#: lxc/project.go:673 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
+#: lxc/project.go:482 lxc/project.go:537 lxc/project.go:597 lxc/project.go:626
+#: lxc/project.go:679 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
 #: lxc/remote.go:84 lxc/remote.go:423 lxc/remote.go:459 lxc/remote.go:539
 #: lxc/remote.go:601 lxc/remote.go:651 lxc/remote.go:689 lxc/rename.go:21
 #: lxc/restore.go:24 lxc/snapshot.go:27 lxc/storage.go:33 lxc/storage.go:89
@@ -1361,7 +1361,7 @@ msgstr ""
 msgid "ID: %s"
 msgstr ""
 
-#: lxc/project.go:456
+#: lxc/project.go:461
 msgid "IMAGES"
 msgstr ""
 
@@ -2001,7 +2001,7 @@ msgid "Missing profile name"
 msgstr ""
 
 #: lxc/project.go:111 lxc/project.go:180 lxc/project.go:258 lxc/project.go:358
-#: lxc/project.go:500 lxc/project.go:558 lxc/project.go:644
+#: lxc/project.go:506 lxc/project.go:564 lxc/project.go:650
 msgid "Missing project name"
 msgstr ""
 
@@ -2073,11 +2073,15 @@ msgid "Must supply instance name for: "
 msgstr ""
 
 #: lxc/cluster.go:132 lxc/list.go:435 lxc/network.go:878 lxc/profile.go:620
-#: lxc/project.go:455 lxc/remote.go:517 lxc/storage.go:558
+#: lxc/project.go:460 lxc/remote.go:517 lxc/storage.go:558
 #: lxc/storage_volume.go:1136
 msgid "NAME"
 msgstr ""
 
+#: lxc/project.go:464
+msgid "NETWORKS"
+msgstr ""
+
 #: lxc/info.go:380
 msgid "NIC:"
 msgstr ""
@@ -2087,7 +2091,8 @@ msgid "NICs:"
 msgstr ""
 
 #: lxc/network.go:855 lxc/operation.go:143 lxc/project.go:429
-#: lxc/project.go:434 lxc/project.go:439 lxc/remote.go:480 lxc/remote.go:485
+#: lxc/project.go:434 lxc/project.go:439 lxc/project.go:444 lxc/remote.go:480
+#: lxc/remote.go:485
 msgid "NO"
 msgstr ""
 
@@ -2235,7 +2240,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:438 lxc/project.go:457
+#: lxc/list.go:438 lxc/project.go:462
 msgid "PROFILES"
 msgstr ""
 
@@ -2393,7 +2398,7 @@ msgstr ""
 msgid "Project %s deleted"
 msgstr ""
 
-#: lxc/project.go:515
+#: lxc/project.go:521
 #, c-format
 msgid "Project %s renamed to %s"
 msgstr ""
@@ -2474,7 +2479,7 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/project.go:699 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
+#: lxc/project.go:705 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
 #: lxc/remote.go:709
 #, c-format
 msgid "Remote %s doesn't exist"
@@ -2562,7 +2567,7 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
-#: lxc/project.go:475 lxc/project.go:476
+#: lxc/project.go:481 lxc/project.go:482
 msgid "Rename projects"
 msgstr ""
 
@@ -2667,7 +2672,7 @@ msgstr ""
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/project.go:458
+#: lxc/project.go:463
 msgid "STORAGE VOLUMES"
 msgstr ""
 
@@ -2757,11 +2762,11 @@ msgid ""
 "    lxc profile set [<remote>:]<profile> <key> <value>"
 msgstr ""
 
-#: lxc/project.go:530
+#: lxc/project.go:536
 msgid "Set project configuration keys"
 msgstr ""
 
-#: lxc/project.go:531
+#: lxc/project.go:537
 msgid ""
 "Set project configuration keys\n"
 "\n"
@@ -2868,7 +2873,7 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
-#: lxc/project.go:619 lxc/project.go:620
+#: lxc/project.go:625 lxc/project.go:626
 msgid "Show project options"
 msgstr ""
 
@@ -3039,7 +3044,7 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
-#: lxc/project.go:672 lxc/project.go:673
+#: lxc/project.go:678 lxc/project.go:679
 msgid "Switch the current project"
 msgstr ""
 
@@ -3232,7 +3237,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:459 lxc/storage.go:567
+#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:465 lxc/storage.go:567
 #: lxc/storage_volume.go:1139
 msgid "USED BY"
 msgstr ""
@@ -3277,7 +3282,7 @@ msgstr ""
 msgid "Unset profile configuration keys"
 msgstr ""
 
-#: lxc/project.go:590 lxc/project.go:591
+#: lxc/project.go:596 lxc/project.go:597
 msgid "Unset project configuration keys"
 msgstr ""
 
@@ -3366,7 +3371,8 @@ msgid "Whether or not to snapshot the instance's running state"
 msgstr ""
 
 #: lxc/network.go:857 lxc/operation.go:145 lxc/project.go:431
-#: lxc/project.go:436 lxc/project.go:441 lxc/remote.go:482 lxc/remote.go:487
+#: lxc/project.go:436 lxc/project.go:441 lxc/project.go:446 lxc/remote.go:482
+#: lxc/remote.go:487
 msgid "YES"
 msgstr ""
 
@@ -3490,7 +3496,7 @@ msgstr ""
 msgid "create [<remote>:]<project>"
 msgstr ""
 
-#: lxc/project.go:446
+#: lxc/project.go:451
 msgid "current"
 msgstr ""
 
@@ -4139,7 +4145,7 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
-#: lxc/project.go:473
+#: lxc/project.go:479
 msgid "rename [<remote>:]<project> <new-name>"
 msgstr ""
 
@@ -4175,7 +4181,7 @@ msgstr ""
 msgid "set [<remote>:]<profile> <key><value>..."
 msgstr ""
 
-#: lxc/project.go:529
+#: lxc/project.go:535
 msgid "set [<remote>:]<project> <key>=<value>..."
 msgstr ""
 
@@ -4227,7 +4233,7 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
-#: lxc/project.go:618
+#: lxc/project.go:624
 msgid "show [<remote>:]<project>"
 msgstr ""
 
@@ -4271,7 +4277,7 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
-#: lxc/project.go:671
+#: lxc/project.go:677
 msgid "switch [<remote>:]<project>"
 msgstr ""
 
@@ -4316,7 +4322,7 @@ msgstr ""
 msgid "unset [<remote>:]<profile> <key>"
 msgstr ""
 
-#: lxc/project.go:589
+#: lxc/project.go:595
 msgid "unset [<remote>:]<project> <key>"
 msgstr ""
 
diff --git a/po/sv.po b/po/sv.po
index 741f4a2f94..dfa5565c4c 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: 2020-08-24 11:17-0400\n"
+"POT-Creation-Date: 2020-08-25 11:06+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -905,8 +905,8 @@ msgstr ""
 #: lxc/profile.go:577 lxc/profile.go:636 lxc/profile.go:712 lxc/profile.go:762
 #: lxc/profile.go:821 lxc/profile.go:875 lxc/project.go:29 lxc/project.go:86
 #: lxc/project.go:151 lxc/project.go:214 lxc/project.go:334 lxc/project.go:384
-#: lxc/project.go:476 lxc/project.go:531 lxc/project.go:591 lxc/project.go:620
-#: lxc/project.go:673 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
+#: lxc/project.go:482 lxc/project.go:537 lxc/project.go:597 lxc/project.go:626
+#: lxc/project.go:679 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
 #: lxc/remote.go:84 lxc/remote.go:423 lxc/remote.go:459 lxc/remote.go:539
 #: lxc/remote.go:601 lxc/remote.go:651 lxc/remote.go:689 lxc/rename.go:21
 #: lxc/restore.go:24 lxc/snapshot.go:27 lxc/storage.go:33 lxc/storage.go:89
@@ -1361,7 +1361,7 @@ msgstr ""
 msgid "ID: %s"
 msgstr ""
 
-#: lxc/project.go:456
+#: lxc/project.go:461
 msgid "IMAGES"
 msgstr ""
 
@@ -2001,7 +2001,7 @@ msgid "Missing profile name"
 msgstr ""
 
 #: lxc/project.go:111 lxc/project.go:180 lxc/project.go:258 lxc/project.go:358
-#: lxc/project.go:500 lxc/project.go:558 lxc/project.go:644
+#: lxc/project.go:506 lxc/project.go:564 lxc/project.go:650
 msgid "Missing project name"
 msgstr ""
 
@@ -2073,11 +2073,15 @@ msgid "Must supply instance name for: "
 msgstr ""
 
 #: lxc/cluster.go:132 lxc/list.go:435 lxc/network.go:878 lxc/profile.go:620
-#: lxc/project.go:455 lxc/remote.go:517 lxc/storage.go:558
+#: lxc/project.go:460 lxc/remote.go:517 lxc/storage.go:558
 #: lxc/storage_volume.go:1136
 msgid "NAME"
 msgstr ""
 
+#: lxc/project.go:464
+msgid "NETWORKS"
+msgstr ""
+
 #: lxc/info.go:380
 msgid "NIC:"
 msgstr ""
@@ -2087,7 +2091,8 @@ msgid "NICs:"
 msgstr ""
 
 #: lxc/network.go:855 lxc/operation.go:143 lxc/project.go:429
-#: lxc/project.go:434 lxc/project.go:439 lxc/remote.go:480 lxc/remote.go:485
+#: lxc/project.go:434 lxc/project.go:439 lxc/project.go:444 lxc/remote.go:480
+#: lxc/remote.go:485
 msgid "NO"
 msgstr ""
 
@@ -2235,7 +2240,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:438 lxc/project.go:457
+#: lxc/list.go:438 lxc/project.go:462
 msgid "PROFILES"
 msgstr ""
 
@@ -2393,7 +2398,7 @@ msgstr ""
 msgid "Project %s deleted"
 msgstr ""
 
-#: lxc/project.go:515
+#: lxc/project.go:521
 #, c-format
 msgid "Project %s renamed to %s"
 msgstr ""
@@ -2474,7 +2479,7 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/project.go:699 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
+#: lxc/project.go:705 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
 #: lxc/remote.go:709
 #, c-format
 msgid "Remote %s doesn't exist"
@@ -2562,7 +2567,7 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
-#: lxc/project.go:475 lxc/project.go:476
+#: lxc/project.go:481 lxc/project.go:482
 msgid "Rename projects"
 msgstr ""
 
@@ -2667,7 +2672,7 @@ msgstr ""
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/project.go:458
+#: lxc/project.go:463
 msgid "STORAGE VOLUMES"
 msgstr ""
 
@@ -2757,11 +2762,11 @@ msgid ""
 "    lxc profile set [<remote>:]<profile> <key> <value>"
 msgstr ""
 
-#: lxc/project.go:530
+#: lxc/project.go:536
 msgid "Set project configuration keys"
 msgstr ""
 
-#: lxc/project.go:531
+#: lxc/project.go:537
 msgid ""
 "Set project configuration keys\n"
 "\n"
@@ -2868,7 +2873,7 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
-#: lxc/project.go:619 lxc/project.go:620
+#: lxc/project.go:625 lxc/project.go:626
 msgid "Show project options"
 msgstr ""
 
@@ -3039,7 +3044,7 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
-#: lxc/project.go:672 lxc/project.go:673
+#: lxc/project.go:678 lxc/project.go:679
 msgid "Switch the current project"
 msgstr ""
 
@@ -3232,7 +3237,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:459 lxc/storage.go:567
+#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:465 lxc/storage.go:567
 #: lxc/storage_volume.go:1139
 msgid "USED BY"
 msgstr ""
@@ -3277,7 +3282,7 @@ msgstr ""
 msgid "Unset profile configuration keys"
 msgstr ""
 
-#: lxc/project.go:590 lxc/project.go:591
+#: lxc/project.go:596 lxc/project.go:597
 msgid "Unset project configuration keys"
 msgstr ""
 
@@ -3366,7 +3371,8 @@ msgid "Whether or not to snapshot the instance's running state"
 msgstr ""
 
 #: lxc/network.go:857 lxc/operation.go:145 lxc/project.go:431
-#: lxc/project.go:436 lxc/project.go:441 lxc/remote.go:482 lxc/remote.go:487
+#: lxc/project.go:436 lxc/project.go:441 lxc/project.go:446 lxc/remote.go:482
+#: lxc/remote.go:487
 msgid "YES"
 msgstr ""
 
@@ -3490,7 +3496,7 @@ msgstr ""
 msgid "create [<remote>:]<project>"
 msgstr ""
 
-#: lxc/project.go:446
+#: lxc/project.go:451
 msgid "current"
 msgstr ""
 
@@ -4139,7 +4145,7 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
-#: lxc/project.go:473
+#: lxc/project.go:479
 msgid "rename [<remote>:]<project> <new-name>"
 msgstr ""
 
@@ -4175,7 +4181,7 @@ msgstr ""
 msgid "set [<remote>:]<profile> <key><value>..."
 msgstr ""
 
-#: lxc/project.go:529
+#: lxc/project.go:535
 msgid "set [<remote>:]<project> <key>=<value>..."
 msgstr ""
 
@@ -4227,7 +4233,7 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
-#: lxc/project.go:618
+#: lxc/project.go:624
 msgid "show [<remote>:]<project>"
 msgstr ""
 
@@ -4271,7 +4277,7 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
-#: lxc/project.go:671
+#: lxc/project.go:677
 msgid "switch [<remote>:]<project>"
 msgstr ""
 
@@ -4316,7 +4322,7 @@ msgstr ""
 msgid "unset [<remote>:]<profile> <key>"
 msgstr ""
 
-#: lxc/project.go:589
+#: lxc/project.go:595
 msgid "unset [<remote>:]<project> <key>"
 msgstr ""
 
diff --git a/po/te.po b/po/te.po
index 194779f43a..02c45011d9 100644
--- a/po/te.po
+++ b/po/te.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: 2020-08-24 11:17-0400\n"
+"POT-Creation-Date: 2020-08-25 11:06+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -905,8 +905,8 @@ msgstr ""
 #: lxc/profile.go:577 lxc/profile.go:636 lxc/profile.go:712 lxc/profile.go:762
 #: lxc/profile.go:821 lxc/profile.go:875 lxc/project.go:29 lxc/project.go:86
 #: lxc/project.go:151 lxc/project.go:214 lxc/project.go:334 lxc/project.go:384
-#: lxc/project.go:476 lxc/project.go:531 lxc/project.go:591 lxc/project.go:620
-#: lxc/project.go:673 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
+#: lxc/project.go:482 lxc/project.go:537 lxc/project.go:597 lxc/project.go:626
+#: lxc/project.go:679 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
 #: lxc/remote.go:84 lxc/remote.go:423 lxc/remote.go:459 lxc/remote.go:539
 #: lxc/remote.go:601 lxc/remote.go:651 lxc/remote.go:689 lxc/rename.go:21
 #: lxc/restore.go:24 lxc/snapshot.go:27 lxc/storage.go:33 lxc/storage.go:89
@@ -1361,7 +1361,7 @@ msgstr ""
 msgid "ID: %s"
 msgstr ""
 
-#: lxc/project.go:456
+#: lxc/project.go:461
 msgid "IMAGES"
 msgstr ""
 
@@ -2001,7 +2001,7 @@ msgid "Missing profile name"
 msgstr ""
 
 #: lxc/project.go:111 lxc/project.go:180 lxc/project.go:258 lxc/project.go:358
-#: lxc/project.go:500 lxc/project.go:558 lxc/project.go:644
+#: lxc/project.go:506 lxc/project.go:564 lxc/project.go:650
 msgid "Missing project name"
 msgstr ""
 
@@ -2073,11 +2073,15 @@ msgid "Must supply instance name for: "
 msgstr ""
 
 #: lxc/cluster.go:132 lxc/list.go:435 lxc/network.go:878 lxc/profile.go:620
-#: lxc/project.go:455 lxc/remote.go:517 lxc/storage.go:558
+#: lxc/project.go:460 lxc/remote.go:517 lxc/storage.go:558
 #: lxc/storage_volume.go:1136
 msgid "NAME"
 msgstr ""
 
+#: lxc/project.go:464
+msgid "NETWORKS"
+msgstr ""
+
 #: lxc/info.go:380
 msgid "NIC:"
 msgstr ""
@@ -2087,7 +2091,8 @@ msgid "NICs:"
 msgstr ""
 
 #: lxc/network.go:855 lxc/operation.go:143 lxc/project.go:429
-#: lxc/project.go:434 lxc/project.go:439 lxc/remote.go:480 lxc/remote.go:485
+#: lxc/project.go:434 lxc/project.go:439 lxc/project.go:444 lxc/remote.go:480
+#: lxc/remote.go:485
 msgid "NO"
 msgstr ""
 
@@ -2235,7 +2240,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:438 lxc/project.go:457
+#: lxc/list.go:438 lxc/project.go:462
 msgid "PROFILES"
 msgstr ""
 
@@ -2393,7 +2398,7 @@ msgstr ""
 msgid "Project %s deleted"
 msgstr ""
 
-#: lxc/project.go:515
+#: lxc/project.go:521
 #, c-format
 msgid "Project %s renamed to %s"
 msgstr ""
@@ -2474,7 +2479,7 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/project.go:699 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
+#: lxc/project.go:705 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
 #: lxc/remote.go:709
 #, c-format
 msgid "Remote %s doesn't exist"
@@ -2562,7 +2567,7 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
-#: lxc/project.go:475 lxc/project.go:476
+#: lxc/project.go:481 lxc/project.go:482
 msgid "Rename projects"
 msgstr ""
 
@@ -2667,7 +2672,7 @@ msgstr ""
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/project.go:458
+#: lxc/project.go:463
 msgid "STORAGE VOLUMES"
 msgstr ""
 
@@ -2757,11 +2762,11 @@ msgid ""
 "    lxc profile set [<remote>:]<profile> <key> <value>"
 msgstr ""
 
-#: lxc/project.go:530
+#: lxc/project.go:536
 msgid "Set project configuration keys"
 msgstr ""
 
-#: lxc/project.go:531
+#: lxc/project.go:537
 msgid ""
 "Set project configuration keys\n"
 "\n"
@@ -2868,7 +2873,7 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
-#: lxc/project.go:619 lxc/project.go:620
+#: lxc/project.go:625 lxc/project.go:626
 msgid "Show project options"
 msgstr ""
 
@@ -3039,7 +3044,7 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
-#: lxc/project.go:672 lxc/project.go:673
+#: lxc/project.go:678 lxc/project.go:679
 msgid "Switch the current project"
 msgstr ""
 
@@ -3232,7 +3237,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:459 lxc/storage.go:567
+#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:465 lxc/storage.go:567
 #: lxc/storage_volume.go:1139
 msgid "USED BY"
 msgstr ""
@@ -3277,7 +3282,7 @@ msgstr ""
 msgid "Unset profile configuration keys"
 msgstr ""
 
-#: lxc/project.go:590 lxc/project.go:591
+#: lxc/project.go:596 lxc/project.go:597
 msgid "Unset project configuration keys"
 msgstr ""
 
@@ -3366,7 +3371,8 @@ msgid "Whether or not to snapshot the instance's running state"
 msgstr ""
 
 #: lxc/network.go:857 lxc/operation.go:145 lxc/project.go:431
-#: lxc/project.go:436 lxc/project.go:441 lxc/remote.go:482 lxc/remote.go:487
+#: lxc/project.go:436 lxc/project.go:441 lxc/project.go:446 lxc/remote.go:482
+#: lxc/remote.go:487
 msgid "YES"
 msgstr ""
 
@@ -3490,7 +3496,7 @@ msgstr ""
 msgid "create [<remote>:]<project>"
 msgstr ""
 
-#: lxc/project.go:446
+#: lxc/project.go:451
 msgid "current"
 msgstr ""
 
@@ -4139,7 +4145,7 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
-#: lxc/project.go:473
+#: lxc/project.go:479
 msgid "rename [<remote>:]<project> <new-name>"
 msgstr ""
 
@@ -4175,7 +4181,7 @@ msgstr ""
 msgid "set [<remote>:]<profile> <key><value>..."
 msgstr ""
 
-#: lxc/project.go:529
+#: lxc/project.go:535
 msgid "set [<remote>:]<project> <key>=<value>..."
 msgstr ""
 
@@ -4227,7 +4233,7 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
-#: lxc/project.go:618
+#: lxc/project.go:624
 msgid "show [<remote>:]<project>"
 msgstr ""
 
@@ -4271,7 +4277,7 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
-#: lxc/project.go:671
+#: lxc/project.go:677
 msgid "switch [<remote>:]<project>"
 msgstr ""
 
@@ -4316,7 +4322,7 @@ msgstr ""
 msgid "unset [<remote>:]<profile> <key>"
 msgstr ""
 
-#: lxc/project.go:589
+#: lxc/project.go:595
 msgid "unset [<remote>:]<project> <key>"
 msgstr ""
 
diff --git a/po/tr.po b/po/tr.po
index 71b8b9d460..8043625960 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: 2020-08-24 11:17-0400\n"
+"POT-Creation-Date: 2020-08-25 11:06+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -905,8 +905,8 @@ msgstr ""
 #: lxc/profile.go:577 lxc/profile.go:636 lxc/profile.go:712 lxc/profile.go:762
 #: lxc/profile.go:821 lxc/profile.go:875 lxc/project.go:29 lxc/project.go:86
 #: lxc/project.go:151 lxc/project.go:214 lxc/project.go:334 lxc/project.go:384
-#: lxc/project.go:476 lxc/project.go:531 lxc/project.go:591 lxc/project.go:620
-#: lxc/project.go:673 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
+#: lxc/project.go:482 lxc/project.go:537 lxc/project.go:597 lxc/project.go:626
+#: lxc/project.go:679 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
 #: lxc/remote.go:84 lxc/remote.go:423 lxc/remote.go:459 lxc/remote.go:539
 #: lxc/remote.go:601 lxc/remote.go:651 lxc/remote.go:689 lxc/rename.go:21
 #: lxc/restore.go:24 lxc/snapshot.go:27 lxc/storage.go:33 lxc/storage.go:89
@@ -1361,7 +1361,7 @@ msgstr ""
 msgid "ID: %s"
 msgstr ""
 
-#: lxc/project.go:456
+#: lxc/project.go:461
 msgid "IMAGES"
 msgstr ""
 
@@ -2001,7 +2001,7 @@ msgid "Missing profile name"
 msgstr ""
 
 #: lxc/project.go:111 lxc/project.go:180 lxc/project.go:258 lxc/project.go:358
-#: lxc/project.go:500 lxc/project.go:558 lxc/project.go:644
+#: lxc/project.go:506 lxc/project.go:564 lxc/project.go:650
 msgid "Missing project name"
 msgstr ""
 
@@ -2073,11 +2073,15 @@ msgid "Must supply instance name for: "
 msgstr ""
 
 #: lxc/cluster.go:132 lxc/list.go:435 lxc/network.go:878 lxc/profile.go:620
-#: lxc/project.go:455 lxc/remote.go:517 lxc/storage.go:558
+#: lxc/project.go:460 lxc/remote.go:517 lxc/storage.go:558
 #: lxc/storage_volume.go:1136
 msgid "NAME"
 msgstr ""
 
+#: lxc/project.go:464
+msgid "NETWORKS"
+msgstr ""
+
 #: lxc/info.go:380
 msgid "NIC:"
 msgstr ""
@@ -2087,7 +2091,8 @@ msgid "NICs:"
 msgstr ""
 
 #: lxc/network.go:855 lxc/operation.go:143 lxc/project.go:429
-#: lxc/project.go:434 lxc/project.go:439 lxc/remote.go:480 lxc/remote.go:485
+#: lxc/project.go:434 lxc/project.go:439 lxc/project.go:444 lxc/remote.go:480
+#: lxc/remote.go:485
 msgid "NO"
 msgstr ""
 
@@ -2235,7 +2240,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:438 lxc/project.go:457
+#: lxc/list.go:438 lxc/project.go:462
 msgid "PROFILES"
 msgstr ""
 
@@ -2393,7 +2398,7 @@ msgstr ""
 msgid "Project %s deleted"
 msgstr ""
 
-#: lxc/project.go:515
+#: lxc/project.go:521
 #, c-format
 msgid "Project %s renamed to %s"
 msgstr ""
@@ -2474,7 +2479,7 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/project.go:699 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
+#: lxc/project.go:705 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
 #: lxc/remote.go:709
 #, c-format
 msgid "Remote %s doesn't exist"
@@ -2562,7 +2567,7 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
-#: lxc/project.go:475 lxc/project.go:476
+#: lxc/project.go:481 lxc/project.go:482
 msgid "Rename projects"
 msgstr ""
 
@@ -2667,7 +2672,7 @@ msgstr ""
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/project.go:458
+#: lxc/project.go:463
 msgid "STORAGE VOLUMES"
 msgstr ""
 
@@ -2757,11 +2762,11 @@ msgid ""
 "    lxc profile set [<remote>:]<profile> <key> <value>"
 msgstr ""
 
-#: lxc/project.go:530
+#: lxc/project.go:536
 msgid "Set project configuration keys"
 msgstr ""
 
-#: lxc/project.go:531
+#: lxc/project.go:537
 msgid ""
 "Set project configuration keys\n"
 "\n"
@@ -2868,7 +2873,7 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
-#: lxc/project.go:619 lxc/project.go:620
+#: lxc/project.go:625 lxc/project.go:626
 msgid "Show project options"
 msgstr ""
 
@@ -3039,7 +3044,7 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
-#: lxc/project.go:672 lxc/project.go:673
+#: lxc/project.go:678 lxc/project.go:679
 msgid "Switch the current project"
 msgstr ""
 
@@ -3232,7 +3237,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:459 lxc/storage.go:567
+#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:465 lxc/storage.go:567
 #: lxc/storage_volume.go:1139
 msgid "USED BY"
 msgstr ""
@@ -3277,7 +3282,7 @@ msgstr ""
 msgid "Unset profile configuration keys"
 msgstr ""
 
-#: lxc/project.go:590 lxc/project.go:591
+#: lxc/project.go:596 lxc/project.go:597
 msgid "Unset project configuration keys"
 msgstr ""
 
@@ -3366,7 +3371,8 @@ msgid "Whether or not to snapshot the instance's running state"
 msgstr ""
 
 #: lxc/network.go:857 lxc/operation.go:145 lxc/project.go:431
-#: lxc/project.go:436 lxc/project.go:441 lxc/remote.go:482 lxc/remote.go:487
+#: lxc/project.go:436 lxc/project.go:441 lxc/project.go:446 lxc/remote.go:482
+#: lxc/remote.go:487
 msgid "YES"
 msgstr ""
 
@@ -3490,7 +3496,7 @@ msgstr ""
 msgid "create [<remote>:]<project>"
 msgstr ""
 
-#: lxc/project.go:446
+#: lxc/project.go:451
 msgid "current"
 msgstr ""
 
@@ -4139,7 +4145,7 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
-#: lxc/project.go:473
+#: lxc/project.go:479
 msgid "rename [<remote>:]<project> <new-name>"
 msgstr ""
 
@@ -4175,7 +4181,7 @@ msgstr ""
 msgid "set [<remote>:]<profile> <key><value>..."
 msgstr ""
 
-#: lxc/project.go:529
+#: lxc/project.go:535
 msgid "set [<remote>:]<project> <key>=<value>..."
 msgstr ""
 
@@ -4227,7 +4233,7 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
-#: lxc/project.go:618
+#: lxc/project.go:624
 msgid "show [<remote>:]<project>"
 msgstr ""
 
@@ -4271,7 +4277,7 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
-#: lxc/project.go:671
+#: lxc/project.go:677
 msgid "switch [<remote>:]<project>"
 msgstr ""
 
@@ -4316,7 +4322,7 @@ msgstr ""
 msgid "unset [<remote>:]<profile> <key>"
 msgstr ""
 
-#: lxc/project.go:589
+#: lxc/project.go:595
 msgid "unset [<remote>:]<project> <key>"
 msgstr ""
 
diff --git a/po/ug.po b/po/ug.po
index 0ca2da8dc1..9bee7359ae 100644
--- a/po/ug.po
+++ b/po/ug.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: 2020-08-24 11:17-0400\n"
+"POT-Creation-Date: 2020-08-25 11:06+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -905,8 +905,8 @@ msgstr ""
 #: lxc/profile.go:577 lxc/profile.go:636 lxc/profile.go:712 lxc/profile.go:762
 #: lxc/profile.go:821 lxc/profile.go:875 lxc/project.go:29 lxc/project.go:86
 #: lxc/project.go:151 lxc/project.go:214 lxc/project.go:334 lxc/project.go:384
-#: lxc/project.go:476 lxc/project.go:531 lxc/project.go:591 lxc/project.go:620
-#: lxc/project.go:673 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
+#: lxc/project.go:482 lxc/project.go:537 lxc/project.go:597 lxc/project.go:626
+#: lxc/project.go:679 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
 #: lxc/remote.go:84 lxc/remote.go:423 lxc/remote.go:459 lxc/remote.go:539
 #: lxc/remote.go:601 lxc/remote.go:651 lxc/remote.go:689 lxc/rename.go:21
 #: lxc/restore.go:24 lxc/snapshot.go:27 lxc/storage.go:33 lxc/storage.go:89
@@ -1361,7 +1361,7 @@ msgstr ""
 msgid "ID: %s"
 msgstr ""
 
-#: lxc/project.go:456
+#: lxc/project.go:461
 msgid "IMAGES"
 msgstr ""
 
@@ -2001,7 +2001,7 @@ msgid "Missing profile name"
 msgstr ""
 
 #: lxc/project.go:111 lxc/project.go:180 lxc/project.go:258 lxc/project.go:358
-#: lxc/project.go:500 lxc/project.go:558 lxc/project.go:644
+#: lxc/project.go:506 lxc/project.go:564 lxc/project.go:650
 msgid "Missing project name"
 msgstr ""
 
@@ -2073,11 +2073,15 @@ msgid "Must supply instance name for: "
 msgstr ""
 
 #: lxc/cluster.go:132 lxc/list.go:435 lxc/network.go:878 lxc/profile.go:620
-#: lxc/project.go:455 lxc/remote.go:517 lxc/storage.go:558
+#: lxc/project.go:460 lxc/remote.go:517 lxc/storage.go:558
 #: lxc/storage_volume.go:1136
 msgid "NAME"
 msgstr ""
 
+#: lxc/project.go:464
+msgid "NETWORKS"
+msgstr ""
+
 #: lxc/info.go:380
 msgid "NIC:"
 msgstr ""
@@ -2087,7 +2091,8 @@ msgid "NICs:"
 msgstr ""
 
 #: lxc/network.go:855 lxc/operation.go:143 lxc/project.go:429
-#: lxc/project.go:434 lxc/project.go:439 lxc/remote.go:480 lxc/remote.go:485
+#: lxc/project.go:434 lxc/project.go:439 lxc/project.go:444 lxc/remote.go:480
+#: lxc/remote.go:485
 msgid "NO"
 msgstr ""
 
@@ -2235,7 +2240,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:438 lxc/project.go:457
+#: lxc/list.go:438 lxc/project.go:462
 msgid "PROFILES"
 msgstr ""
 
@@ -2393,7 +2398,7 @@ msgstr ""
 msgid "Project %s deleted"
 msgstr ""
 
-#: lxc/project.go:515
+#: lxc/project.go:521
 #, c-format
 msgid "Project %s renamed to %s"
 msgstr ""
@@ -2474,7 +2479,7 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/project.go:699 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
+#: lxc/project.go:705 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
 #: lxc/remote.go:709
 #, c-format
 msgid "Remote %s doesn't exist"
@@ -2562,7 +2567,7 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
-#: lxc/project.go:475 lxc/project.go:476
+#: lxc/project.go:481 lxc/project.go:482
 msgid "Rename projects"
 msgstr ""
 
@@ -2667,7 +2672,7 @@ msgstr ""
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/project.go:458
+#: lxc/project.go:463
 msgid "STORAGE VOLUMES"
 msgstr ""
 
@@ -2757,11 +2762,11 @@ msgid ""
 "    lxc profile set [<remote>:]<profile> <key> <value>"
 msgstr ""
 
-#: lxc/project.go:530
+#: lxc/project.go:536
 msgid "Set project configuration keys"
 msgstr ""
 
-#: lxc/project.go:531
+#: lxc/project.go:537
 msgid ""
 "Set project configuration keys\n"
 "\n"
@@ -2868,7 +2873,7 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
-#: lxc/project.go:619 lxc/project.go:620
+#: lxc/project.go:625 lxc/project.go:626
 msgid "Show project options"
 msgstr ""
 
@@ -3039,7 +3044,7 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
-#: lxc/project.go:672 lxc/project.go:673
+#: lxc/project.go:678 lxc/project.go:679
 msgid "Switch the current project"
 msgstr ""
 
@@ -3232,7 +3237,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:459 lxc/storage.go:567
+#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:465 lxc/storage.go:567
 #: lxc/storage_volume.go:1139
 msgid "USED BY"
 msgstr ""
@@ -3277,7 +3282,7 @@ msgstr ""
 msgid "Unset profile configuration keys"
 msgstr ""
 
-#: lxc/project.go:590 lxc/project.go:591
+#: lxc/project.go:596 lxc/project.go:597
 msgid "Unset project configuration keys"
 msgstr ""
 
@@ -3366,7 +3371,8 @@ msgid "Whether or not to snapshot the instance's running state"
 msgstr ""
 
 #: lxc/network.go:857 lxc/operation.go:145 lxc/project.go:431
-#: lxc/project.go:436 lxc/project.go:441 lxc/remote.go:482 lxc/remote.go:487
+#: lxc/project.go:436 lxc/project.go:441 lxc/project.go:446 lxc/remote.go:482
+#: lxc/remote.go:487
 msgid "YES"
 msgstr ""
 
@@ -3490,7 +3496,7 @@ msgstr ""
 msgid "create [<remote>:]<project>"
 msgstr ""
 
-#: lxc/project.go:446
+#: lxc/project.go:451
 msgid "current"
 msgstr ""
 
@@ -4139,7 +4145,7 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
-#: lxc/project.go:473
+#: lxc/project.go:479
 msgid "rename [<remote>:]<project> <new-name>"
 msgstr ""
 
@@ -4175,7 +4181,7 @@ msgstr ""
 msgid "set [<remote>:]<profile> <key><value>..."
 msgstr ""
 
-#: lxc/project.go:529
+#: lxc/project.go:535
 msgid "set [<remote>:]<project> <key>=<value>..."
 msgstr ""
 
@@ -4227,7 +4233,7 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
-#: lxc/project.go:618
+#: lxc/project.go:624
 msgid "show [<remote>:]<project>"
 msgstr ""
 
@@ -4271,7 +4277,7 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
-#: lxc/project.go:671
+#: lxc/project.go:677
 msgid "switch [<remote>:]<project>"
 msgstr ""
 
@@ -4316,7 +4322,7 @@ msgstr ""
 msgid "unset [<remote>:]<profile> <key>"
 msgstr ""
 
-#: lxc/project.go:589
+#: lxc/project.go:595
 msgid "unset [<remote>:]<project> <key>"
 msgstr ""
 
diff --git a/po/uk.po b/po/uk.po
index 4ab161f49c..584a0debdd 100644
--- a/po/uk.po
+++ b/po/uk.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: 2020-08-24 11:17-0400\n"
+"POT-Creation-Date: 2020-08-25 11:06+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -905,8 +905,8 @@ msgstr ""
 #: lxc/profile.go:577 lxc/profile.go:636 lxc/profile.go:712 lxc/profile.go:762
 #: lxc/profile.go:821 lxc/profile.go:875 lxc/project.go:29 lxc/project.go:86
 #: lxc/project.go:151 lxc/project.go:214 lxc/project.go:334 lxc/project.go:384
-#: lxc/project.go:476 lxc/project.go:531 lxc/project.go:591 lxc/project.go:620
-#: lxc/project.go:673 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
+#: lxc/project.go:482 lxc/project.go:537 lxc/project.go:597 lxc/project.go:626
+#: lxc/project.go:679 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
 #: lxc/remote.go:84 lxc/remote.go:423 lxc/remote.go:459 lxc/remote.go:539
 #: lxc/remote.go:601 lxc/remote.go:651 lxc/remote.go:689 lxc/rename.go:21
 #: lxc/restore.go:24 lxc/snapshot.go:27 lxc/storage.go:33 lxc/storage.go:89
@@ -1361,7 +1361,7 @@ msgstr ""
 msgid "ID: %s"
 msgstr ""
 
-#: lxc/project.go:456
+#: lxc/project.go:461
 msgid "IMAGES"
 msgstr ""
 
@@ -2001,7 +2001,7 @@ msgid "Missing profile name"
 msgstr ""
 
 #: lxc/project.go:111 lxc/project.go:180 lxc/project.go:258 lxc/project.go:358
-#: lxc/project.go:500 lxc/project.go:558 lxc/project.go:644
+#: lxc/project.go:506 lxc/project.go:564 lxc/project.go:650
 msgid "Missing project name"
 msgstr ""
 
@@ -2073,11 +2073,15 @@ msgid "Must supply instance name for: "
 msgstr ""
 
 #: lxc/cluster.go:132 lxc/list.go:435 lxc/network.go:878 lxc/profile.go:620
-#: lxc/project.go:455 lxc/remote.go:517 lxc/storage.go:558
+#: lxc/project.go:460 lxc/remote.go:517 lxc/storage.go:558
 #: lxc/storage_volume.go:1136
 msgid "NAME"
 msgstr ""
 
+#: lxc/project.go:464
+msgid "NETWORKS"
+msgstr ""
+
 #: lxc/info.go:380
 msgid "NIC:"
 msgstr ""
@@ -2087,7 +2091,8 @@ msgid "NICs:"
 msgstr ""
 
 #: lxc/network.go:855 lxc/operation.go:143 lxc/project.go:429
-#: lxc/project.go:434 lxc/project.go:439 lxc/remote.go:480 lxc/remote.go:485
+#: lxc/project.go:434 lxc/project.go:439 lxc/project.go:444 lxc/remote.go:480
+#: lxc/remote.go:485
 msgid "NO"
 msgstr ""
 
@@ -2235,7 +2240,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:438 lxc/project.go:457
+#: lxc/list.go:438 lxc/project.go:462
 msgid "PROFILES"
 msgstr ""
 
@@ -2393,7 +2398,7 @@ msgstr ""
 msgid "Project %s deleted"
 msgstr ""
 
-#: lxc/project.go:515
+#: lxc/project.go:521
 #, c-format
 msgid "Project %s renamed to %s"
 msgstr ""
@@ -2474,7 +2479,7 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/project.go:699 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
+#: lxc/project.go:705 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
 #: lxc/remote.go:709
 #, c-format
 msgid "Remote %s doesn't exist"
@@ -2562,7 +2567,7 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
-#: lxc/project.go:475 lxc/project.go:476
+#: lxc/project.go:481 lxc/project.go:482
 msgid "Rename projects"
 msgstr ""
 
@@ -2667,7 +2672,7 @@ msgstr ""
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/project.go:458
+#: lxc/project.go:463
 msgid "STORAGE VOLUMES"
 msgstr ""
 
@@ -2757,11 +2762,11 @@ msgid ""
 "    lxc profile set [<remote>:]<profile> <key> <value>"
 msgstr ""
 
-#: lxc/project.go:530
+#: lxc/project.go:536
 msgid "Set project configuration keys"
 msgstr ""
 
-#: lxc/project.go:531
+#: lxc/project.go:537
 msgid ""
 "Set project configuration keys\n"
 "\n"
@@ -2868,7 +2873,7 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
-#: lxc/project.go:619 lxc/project.go:620
+#: lxc/project.go:625 lxc/project.go:626
 msgid "Show project options"
 msgstr ""
 
@@ -3039,7 +3044,7 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
-#: lxc/project.go:672 lxc/project.go:673
+#: lxc/project.go:678 lxc/project.go:679
 msgid "Switch the current project"
 msgstr ""
 
@@ -3232,7 +3237,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:459 lxc/storage.go:567
+#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:465 lxc/storage.go:567
 #: lxc/storage_volume.go:1139
 msgid "USED BY"
 msgstr ""
@@ -3277,7 +3282,7 @@ msgstr ""
 msgid "Unset profile configuration keys"
 msgstr ""
 
-#: lxc/project.go:590 lxc/project.go:591
+#: lxc/project.go:596 lxc/project.go:597
 msgid "Unset project configuration keys"
 msgstr ""
 
@@ -3366,7 +3371,8 @@ msgid "Whether or not to snapshot the instance's running state"
 msgstr ""
 
 #: lxc/network.go:857 lxc/operation.go:145 lxc/project.go:431
-#: lxc/project.go:436 lxc/project.go:441 lxc/remote.go:482 lxc/remote.go:487
+#: lxc/project.go:436 lxc/project.go:441 lxc/project.go:446 lxc/remote.go:482
+#: lxc/remote.go:487
 msgid "YES"
 msgstr ""
 
@@ -3490,7 +3496,7 @@ msgstr ""
 msgid "create [<remote>:]<project>"
 msgstr ""
 
-#: lxc/project.go:446
+#: lxc/project.go:451
 msgid "current"
 msgstr ""
 
@@ -4139,7 +4145,7 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
-#: lxc/project.go:473
+#: lxc/project.go:479
 msgid "rename [<remote>:]<project> <new-name>"
 msgstr ""
 
@@ -4175,7 +4181,7 @@ msgstr ""
 msgid "set [<remote>:]<profile> <key><value>..."
 msgstr ""
 
-#: lxc/project.go:529
+#: lxc/project.go:535
 msgid "set [<remote>:]<project> <key>=<value>..."
 msgstr ""
 
@@ -4227,7 +4233,7 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
-#: lxc/project.go:618
+#: lxc/project.go:624
 msgid "show [<remote>:]<project>"
 msgstr ""
 
@@ -4271,7 +4277,7 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
-#: lxc/project.go:671
+#: lxc/project.go:677
 msgid "switch [<remote>:]<project>"
 msgstr ""
 
@@ -4316,7 +4322,7 @@ msgstr ""
 msgid "unset [<remote>:]<profile> <key>"
 msgstr ""
 
-#: lxc/project.go:589
+#: lxc/project.go:595
 msgid "unset [<remote>:]<project> <key>"
 msgstr ""
 
diff --git a/po/zh_Hans.po b/po/zh_Hans.po
index c036716986..c18521f39e 100644
--- a/po/zh_Hans.po
+++ b/po/zh_Hans.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: lxd\n"
 "Report-Msgid-Bugs-To: lxc-devel at lists.linuxcontainers.org\n"
-"POT-Creation-Date: 2020-08-24 11:17-0400\n"
+"POT-Creation-Date: 2020-08-25 11:06+0100\n"
 "PO-Revision-Date: 2018-09-11 19:15+0000\n"
 "Last-Translator: 0x0916 <w at laoqinren.net>\n"
 "Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/"
@@ -908,8 +908,8 @@ msgstr ""
 #: lxc/profile.go:577 lxc/profile.go:636 lxc/profile.go:712 lxc/profile.go:762
 #: lxc/profile.go:821 lxc/profile.go:875 lxc/project.go:29 lxc/project.go:86
 #: lxc/project.go:151 lxc/project.go:214 lxc/project.go:334 lxc/project.go:384
-#: lxc/project.go:476 lxc/project.go:531 lxc/project.go:591 lxc/project.go:620
-#: lxc/project.go:673 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
+#: lxc/project.go:482 lxc/project.go:537 lxc/project.go:597 lxc/project.go:626
+#: lxc/project.go:679 lxc/publish.go:31 lxc/query.go:32 lxc/remote.go:33
 #: lxc/remote.go:84 lxc/remote.go:423 lxc/remote.go:459 lxc/remote.go:539
 #: lxc/remote.go:601 lxc/remote.go:651 lxc/remote.go:689 lxc/rename.go:21
 #: lxc/restore.go:24 lxc/snapshot.go:27 lxc/storage.go:33 lxc/storage.go:89
@@ -1364,7 +1364,7 @@ msgstr ""
 msgid "ID: %s"
 msgstr ""
 
-#: lxc/project.go:456
+#: lxc/project.go:461
 msgid "IMAGES"
 msgstr ""
 
@@ -2004,7 +2004,7 @@ msgid "Missing profile name"
 msgstr ""
 
 #: lxc/project.go:111 lxc/project.go:180 lxc/project.go:258 lxc/project.go:358
-#: lxc/project.go:500 lxc/project.go:558 lxc/project.go:644
+#: lxc/project.go:506 lxc/project.go:564 lxc/project.go:650
 msgid "Missing project name"
 msgstr ""
 
@@ -2076,11 +2076,15 @@ msgid "Must supply instance name for: "
 msgstr ""
 
 #: lxc/cluster.go:132 lxc/list.go:435 lxc/network.go:878 lxc/profile.go:620
-#: lxc/project.go:455 lxc/remote.go:517 lxc/storage.go:558
+#: lxc/project.go:460 lxc/remote.go:517 lxc/storage.go:558
 #: lxc/storage_volume.go:1136
 msgid "NAME"
 msgstr ""
 
+#: lxc/project.go:464
+msgid "NETWORKS"
+msgstr ""
+
 #: lxc/info.go:380
 msgid "NIC:"
 msgstr ""
@@ -2090,7 +2094,8 @@ msgid "NICs:"
 msgstr ""
 
 #: lxc/network.go:855 lxc/operation.go:143 lxc/project.go:429
-#: lxc/project.go:434 lxc/project.go:439 lxc/remote.go:480 lxc/remote.go:485
+#: lxc/project.go:434 lxc/project.go:439 lxc/project.go:444 lxc/remote.go:480
+#: lxc/remote.go:485
 msgid "NO"
 msgstr ""
 
@@ -2238,7 +2243,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:438 lxc/project.go:457
+#: lxc/list.go:438 lxc/project.go:462
 msgid "PROFILES"
 msgstr ""
 
@@ -2396,7 +2401,7 @@ msgstr ""
 msgid "Project %s deleted"
 msgstr ""
 
-#: lxc/project.go:515
+#: lxc/project.go:521
 #, c-format
 msgid "Project %s renamed to %s"
 msgstr ""
@@ -2477,7 +2482,7 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/project.go:699 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
+#: lxc/project.go:705 lxc/remote.go:559 lxc/remote.go:621 lxc/remote.go:671
 #: lxc/remote.go:709
 #, c-format
 msgid "Remote %s doesn't exist"
@@ -2565,7 +2570,7 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
-#: lxc/project.go:475 lxc/project.go:476
+#: lxc/project.go:481 lxc/project.go:482
 msgid "Rename projects"
 msgstr ""
 
@@ -2670,7 +2675,7 @@ msgstr ""
 msgid "STORAGE POOL"
 msgstr ""
 
-#: lxc/project.go:458
+#: lxc/project.go:463
 msgid "STORAGE VOLUMES"
 msgstr ""
 
@@ -2760,11 +2765,11 @@ msgid ""
 "    lxc profile set [<remote>:]<profile> <key> <value>"
 msgstr ""
 
-#: lxc/project.go:530
+#: lxc/project.go:536
 msgid "Set project configuration keys"
 msgstr ""
 
-#: lxc/project.go:531
+#: lxc/project.go:537
 msgid ""
 "Set project configuration keys\n"
 "\n"
@@ -2871,7 +2876,7 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
-#: lxc/project.go:619 lxc/project.go:620
+#: lxc/project.go:625 lxc/project.go:626
 msgid "Show project options"
 msgstr ""
 
@@ -3042,7 +3047,7 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
-#: lxc/project.go:672 lxc/project.go:673
+#: lxc/project.go:678 lxc/project.go:679
 msgid "Switch the current project"
 msgstr ""
 
@@ -3235,7 +3240,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:459 lxc/storage.go:567
+#: lxc/network.go:884 lxc/profile.go:621 lxc/project.go:465 lxc/storage.go:567
 #: lxc/storage_volume.go:1139
 msgid "USED BY"
 msgstr ""
@@ -3280,7 +3285,7 @@ msgstr ""
 msgid "Unset profile configuration keys"
 msgstr ""
 
-#: lxc/project.go:590 lxc/project.go:591
+#: lxc/project.go:596 lxc/project.go:597
 msgid "Unset project configuration keys"
 msgstr ""
 
@@ -3369,7 +3374,8 @@ msgid "Whether or not to snapshot the instance's running state"
 msgstr ""
 
 #: lxc/network.go:857 lxc/operation.go:145 lxc/project.go:431
-#: lxc/project.go:436 lxc/project.go:441 lxc/remote.go:482 lxc/remote.go:487
+#: lxc/project.go:436 lxc/project.go:441 lxc/project.go:446 lxc/remote.go:482
+#: lxc/remote.go:487
 msgid "YES"
 msgstr ""
 
@@ -3493,7 +3499,7 @@ msgstr ""
 msgid "create [<remote>:]<project>"
 msgstr ""
 
-#: lxc/project.go:446
+#: lxc/project.go:451
 msgid "current"
 msgstr ""
 
@@ -4142,7 +4148,7 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
-#: lxc/project.go:473
+#: lxc/project.go:479
 msgid "rename [<remote>:]<project> <new-name>"
 msgstr ""
 
@@ -4178,7 +4184,7 @@ msgstr ""
 msgid "set [<remote>:]<profile> <key><value>..."
 msgstr ""
 
-#: lxc/project.go:529
+#: lxc/project.go:535
 msgid "set [<remote>:]<project> <key>=<value>..."
 msgstr ""
 
@@ -4230,7 +4236,7 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
-#: lxc/project.go:618
+#: lxc/project.go:624
 msgid "show [<remote>:]<project>"
 msgstr ""
 
@@ -4274,7 +4280,7 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
-#: lxc/project.go:671
+#: lxc/project.go:677
 msgid "switch [<remote>:]<project>"
 msgstr ""
 
@@ -4319,7 +4325,7 @@ msgstr ""
 msgid "unset [<remote>:]<profile> <key>"
 msgstr ""
 
-#: lxc/project.go:589
+#: lxc/project.go:595
 msgid "unset [<remote>:]<project> <key>"
 msgstr ""
 

From a9e8dedf8919552bae325cce9e73385aed052f31 Mon Sep 17 00:00:00 2001
From: Thomas Parrott <thomas.parrott at canonical.com>
Date: Thu, 27 Aug 2020 14:10:33 +0100
Subject: [PATCH 63/63] lxd/api/cluster: Uses default project for networks
 during cluster join

Signed-off-by: Thomas Parrott <thomas.parrott at canonical.com>
---
 lxd/api_cluster.go | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/lxd/api_cluster.go b/lxd/api_cluster.go
index a9345985c4..3488add5e2 100644
--- a/lxd/api_cluster.go
+++ b/lxd/api_cluster.go
@@ -19,6 +19,7 @@ import (
 	"github.com/lxc/lxd/lxd/db"
 	"github.com/lxc/lxd/lxd/node"
 	"github.com/lxc/lxd/lxd/operations"
+	"github.com/lxc/lxd/lxd/project"
 	"github.com/lxc/lxd/lxd/response"
 	"github.com/lxc/lxd/lxd/util"
 	"github.com/lxc/lxd/shared"
@@ -413,13 +414,13 @@ func clusterPutJoin(d *Daemon, req api.ClusterPut) response.Response {
 		}
 
 		networks := []api.Network{}
-		networkNames, err := d.cluster.GetNetworks()
+		networkNames, err := d.cluster.GetNetworks(project.Default)
 		if err != nil && err != db.ErrNoSuchObject {
 			return err
 		}
 
 		for _, name := range networkNames {
-			_, network, err := d.cluster.GetNetworkInAnyState(name)
+			_, network, err := d.cluster.GetNetworkInAnyState(project.Default, name)
 			if err != nil {
 				return err
 			}
@@ -1023,7 +1024,7 @@ func clusterNodeDelete(d *Daemon, r *http.Request) response.Response {
 			return response.SmartError(err)
 		}
 
-		networks, err := d.cluster.GetNetworks()
+		networks, err := d.cluster.GetNetworks(project.Default)
 		if err != nil {
 			return response.SmartError(err)
 		}
@@ -1501,7 +1502,7 @@ func clusterCheckStoragePoolsMatch(cluster *db.Cluster, reqPools []api.StoragePo
 }
 
 func clusterCheckNetworksMatch(cluster *db.Cluster, reqNetworks []api.Network) error {
-	networkNames, err := cluster.GetNonPendingNetworks()
+	networkNames, err := cluster.GetNonPendingNetworks(project.Default)
 	if err != nil && err != db.ErrNoSuchObject {
 		return err
 	}
@@ -1512,7 +1513,7 @@ func clusterCheckNetworksMatch(cluster *db.Cluster, reqNetworks []api.Network) e
 				continue
 			}
 			found = true
-			_, network, err := cluster.GetNetworkInAnyState(name)
+			_, network, err := cluster.GetNetworkInAnyState(project.Default, name)
 			if err != nil {
 				return err
 			}


More information about the lxc-devel mailing list