[lxc-devel] [lxd/master] [WIP] Projects

freeekanayaka on Github lxc-bot at linuxcontainers.org
Mon Sep 3 08:25:00 UTC 2018


A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 301 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20180903/bedb5b61/attachment.bin>
-------------- next part --------------
From eeb3cf2a4f55f7f4374ae09c29de78fc9b8f7f6b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Mon, 6 Aug 2018 00:43:13 -0400
Subject: [PATCH 01/12] client: Add UseProject
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 client/interfaces.go |  1 +
 client/lxd.go        |  9 ++++++++-
 client/lxd_server.go | 18 ++++++++++++++++++
 3 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/client/interfaces.go b/client/interfaces.go
index 5995055fcb..124a83cd07 100644
--- a/client/interfaces.go
+++ b/client/interfaces.go
@@ -69,6 +69,7 @@ type ContainerServer interface {
 	RequireAuthenticated(authenticated bool)
 	IsClustered() (clustered bool)
 	UseTarget(name string) (client ContainerServer)
+	UseProject(name string) (client ContainerServer)
 
 	// Certificate functions
 	GetCertificateFingerprints() (fingerprints []string, err error)
diff --git a/client/lxd.go b/client/lxd.go
index df2fd321bc..86759792da 100644
--- a/client/lxd.go
+++ b/client/lxd.go
@@ -38,6 +38,7 @@ type ProtocolLXD struct {
 	requireAuthenticated bool
 
 	clusterTarget string
+	project       string
 }
 
 // GetConnectionInfo returns the basic connection information used to interact with the server
@@ -234,13 +235,19 @@ func (r *ProtocolLXD) query(method string, path string, data interface{}, ETag s
 		return nil, "", err
 	}
 
-	// Extract query fields and update for cluster targeting
+	// Extract query fields and update for cluster targeting or project
 	values := fields.Query()
 	if r.clusterTarget != "" {
 		if values.Get("target") == "" {
 			values.Set("target", r.clusterTarget)
 		}
 	}
+
+	if r.project != "" {
+		if values.Get("project") == "" {
+			values.Set("project", r.project)
+		}
+	}
 	fields.RawQuery = values.Encode()
 
 	// Run the actual query
diff --git a/client/lxd_server.go b/client/lxd_server.go
index aad1af0f0d..4cc20cc1c6 100644
--- a/client/lxd_server.go
+++ b/client/lxd_server.go
@@ -89,6 +89,23 @@ func (r *ProtocolLXD) GetServerResources() (*api.Resources, error) {
 	return &resources, nil
 }
 
+// UseProject returns a client that will use a specific project.
+func (r *ProtocolLXD) UseProject(name string) ContainerServer {
+	return &ProtocolLXD{
+		server:               r.server,
+		http:                 r.http,
+		httpCertificate:      r.httpCertificate,
+		httpHost:             r.httpHost,
+		httpProtocol:         r.httpProtocol,
+		httpUserAgent:        r.httpUserAgent,
+		bakeryClient:         r.bakeryClient,
+		bakeryInteractor:     r.bakeryInteractor,
+		requireAuthenticated: r.requireAuthenticated,
+		clusterTarget:        r.clusterTarget,
+		project:              name,
+	}
+}
+
 // UseTarget returns a client that will target a specific cluster member.
 // Use this member-specific operations such as specific container
 // placement, preparing a new storage pool or network, ...
@@ -103,6 +120,7 @@ func (r *ProtocolLXD) UseTarget(name string) ContainerServer {
 		bakeryClient:         r.bakeryClient,
 		bakeryInteractor:     r.bakeryInteractor,
 		requireAuthenticated: r.requireAuthenticated,
+		project:              r.project,
 		clusterTarget:        name,
 	}
 }

From 249a761375feb26267d3602fb5b23d1dd65d4560 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Wed, 15 Aug 2018 17:47:44 -0400
Subject: [PATCH 02/12] shared/api: Add projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 shared/api/project.go | 50 +++++++++++++++++++++++++++++++++++++++++++
 shared/api/server.go  |  3 +++
 2 files changed, 53 insertions(+)
 create mode 100644 shared/api/project.go

diff --git a/shared/api/project.go b/shared/api/project.go
new file mode 100644
index 0000000000..0be464c645
--- /dev/null
+++ b/shared/api/project.go
@@ -0,0 +1,50 @@
+package api
+
+// ProjectsPost represents the fields of a new LXD project
+//
+// API extension: projects
+type ProjectsPost struct {
+	ProjectPut `yaml:",inline"`
+
+	Name string `json:"name" yaml:"name"`
+}
+
+// ProjectPost represents the fields required to rename a LXD project
+//
+// API extension: projects
+type ProjectPost struct {
+	Name string `json:"name" yaml:"name"`
+}
+
+// ProjectFeatures represents the list of features enabled for the project
+//
+// API extension: projects
+type ProjectFeatures struct {
+	Images   bool `json:"images" yaml:"images"`
+	Profiles bool `json:"profiles" yaml:"profiles"`
+}
+
+// ProjectPut represents the modifiable fields of a LXD project
+//
+// API extension: projects
+type ProjectPut struct {
+	Description string           `json:"description" yaml:"description"`
+	Features    *ProjectFeatures `json:"features" yaml:"features"`
+}
+
+// Project represents a LXD project
+//
+// API extension: projects
+type Project struct {
+	ProjectPut `yaml:",inline"`
+
+	Name   string   `json:"name" yaml:"name"`
+	UsedBy []string `json:"used_by" yaml:"used_by"`
+}
+
+// Writable converts a full Project struct into a ProjectPut struct (filters read-only fields)
+//
+// API extension: projects
+func (project *Project) Writable() ProjectPut {
+	return project.ProjectPut
+}
diff --git a/shared/api/server.go b/shared/api/server.go
index cfb742b2e6..74fb07c2fd 100644
--- a/shared/api/server.go
+++ b/shared/api/server.go
@@ -20,6 +20,9 @@ type ServerEnvironment struct {
 	// API extension: clustering
 	ServerClustered bool   `json:"server_clustered" yaml:"server_clustered"`
 	ServerName      string `json:"server_name" yaml:"server_name"`
+
+	// API extension: projects
+	Project string `json:"project" yaml:"project"`
 }
 
 // ServerPut represents the modifiable fields of a LXD server configuration

From c3474e99e294d9adf01c9f2ae6a79e7ff4010489 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Wed, 15 Aug 2018 17:47:28 -0400
Subject: [PATCH 03/12] lxd/db: Add projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxd/db/cluster/open.go   |  23 ++-
 lxd/db/cluster/schema.go |  14 +-
 lxd/db/cluster/update.go |  94 ++++++++++++
 lxd/db/migration.go      |   7 +
 lxd/db/projects.go       | 303 +++++++++++++++++++++++++++++++++++++++
 5 files changed, 438 insertions(+), 3 deletions(-)
 create mode 100644 lxd/db/projects.go

diff --git a/lxd/db/cluster/open.go b/lxd/db/cluster/open.go
index ca9b7762f2..7fc242b60e 100644
--- a/lxd/db/cluster/open.go
+++ b/lxd/db/cluster/open.go
@@ -55,6 +55,13 @@ func Open(name string, store dqlite.ServerStore, options ...dqlite.DriverOption)
 // false and no error (if some nodes have a lower version, and we need to wait
 // till they get upgraded and restarted).
 func EnsureSchema(db *sql.DB, address string, dir string) (bool, error) {
+	// Disable foreign key enforcement during schema update
+	_, err := db.Exec("PRAGMA foreign_keys=OFF;")
+	if err != nil {
+		return false, err
+	}
+	defer db.Exec("PRAGMA foreign_keys=ON;")
+
 	someNodesAreBehind := false
 	apiExtensions := version.APIExtensionsCount()
 
@@ -149,7 +156,7 @@ func EnsureSchema(db *sql.DB, address string, dir string) (bool, error) {
 	schema.Hook(hook)
 
 	var initial int
-	err := query.Retry(func() error {
+	err = query.Retry(func() error {
 		var err error
 		initial, err = schema.Ensure(db)
 		return err
@@ -178,14 +185,26 @@ INSERT INTO nodes(id, name, address, schema, api_extensions) VALUES(1, 'none', '
 			return false, err
 		}
 
+		// Default project
 		stmt = `
-INSERT INTO profiles (name, description) VALUES ('default', 'Default LXD profile')
+INSERT INTO projects (name, description, has_images, has_profiles) VALUES ('default', 'Default LXD project', 1, 1);
 `
 		_, err = tx.Exec(stmt)
 		if err != nil {
 			tx.Rollback()
 			return false, err
 		}
+
+		// Default profile
+		stmt = `
+INSERT INTO profiles (name, description, project_id) VALUES ('default', 'Default LXD profile', 1)
+`
+		_, err = tx.Exec(stmt)
+		if err != nil {
+			tx.Rollback()
+			return false, err
+		}
+
 		err = tx.Commit()
 		if err != nil {
 			return false, err
diff --git a/lxd/db/cluster/schema.go b/lxd/db/cluster/schema.go
index cd15668986..7fcf7a0e14 100644
--- a/lxd/db/cluster/schema.go
+++ b/lxd/db/cluster/schema.go
@@ -31,6 +31,7 @@ CREATE TABLE containers (
     stateful INTEGER NOT NULL DEFAULT 0,
     last_use_date DATETIME,
     description TEXT,
+    project_id INTEGER NOT NULL DEFAULT 0 REFERENCES projects(id) ON DELETE CASCADE,
     UNIQUE (name),
     FOREIGN KEY (node_id) REFERENCES nodes (id) ON DELETE CASCADE
 );
@@ -91,6 +92,7 @@ CREATE TABLE images (
     cached INTEGER NOT NULL DEFAULT 0,
     last_use_date DATETIME,
     auto_update INTEGER NOT NULL DEFAULT 0,
+    project_id INTEGER NOT NULL DEFAULT 0 REFERENCES projects(id) ON DELETE CASCADE,
     UNIQUE (fingerprint)
 );
 CREATE TABLE images_aliases (
@@ -98,6 +100,7 @@ CREATE TABLE images_aliases (
     name TEXT NOT NULL,
     image_id INTEGER NOT NULL,
     description TEXT,
+    project_id INTEGER NOT NULL DEFAULT 0 REFERENCES projects(id) ON DELETE CASCADE,
     FOREIGN KEY (image_id) REFERENCES images (id) ON DELETE CASCADE,
     UNIQUE (name)
 );
@@ -175,6 +178,7 @@ CREATE TABLE profiles (
     id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
     name TEXT NOT NULL,
     description TEXT,
+    project_id INTEGER NOT NULL DEFAULT 0 REFERENCES projects(id) ON DELETE CASCADE,
     UNIQUE (name)
 );
 CREATE TABLE profiles_config (
@@ -201,6 +205,14 @@ CREATE TABLE profiles_devices_config (
     UNIQUE (profile_device_id, key),
     FOREIGN KEY (profile_device_id) REFERENCES profiles_devices (id) ON DELETE CASCADE
 );
+CREATE TABLE projects (
+    id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
+    name VARCHAR(255) NOT NULL,
+    has_images INTEGER NOT NULL default 0,
+    has_profiles INTEGER NOT NULL default 0,
+    description TEXT,
+    UNIQUE (name)
+);
 CREATE TABLE storage_pools (
     id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
     name TEXT NOT NULL,
@@ -247,5 +259,5 @@ CREATE TABLE storage_volumes_config (
     FOREIGN KEY (storage_volume_id) REFERENCES storage_volumes (id) ON DELETE CASCADE
 );
 
-INSERT INTO schema (version, updated_at) VALUES (10, strftime("%s"))
+INSERT INTO schema (version, updated_at) VALUES (11, strftime("%s"))
 `
diff --git a/lxd/db/cluster/update.go b/lxd/db/cluster/update.go
index c4fbc0a32e..277fda0e03 100644
--- a/lxd/db/cluster/update.go
+++ b/lxd/db/cluster/update.go
@@ -40,6 +40,100 @@ var updates = map[int]schema.Update{
 	8:  updateFromV7,
 	9:  updateFromV8,
 	10: updateFromV9,
+	11: updateFromV10,
+}
+
+func updateFromV10(tx *sql.Tx) error {
+	stmts := `
+CREATE TABLE projects (
+    id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
+    name VARCHAR(255) NOT NULL,
+    has_images INTEGER NOT NULL default 0,
+    has_profiles INTEGER NOT NULL default 0,
+    description TEXT,
+    UNIQUE (name)
+);
+INSERT INTO projects (name, description, has_images, has_profiles) VALUES ('default', 'Default LXD project', 1, 1);
+
+ALTER TABLE containers ADD COLUMN project_id INTEGER NOT NULL DEFAULT 1;
+ALTER TABLE images ADD COLUMN project_id INTEGER NOT NULL DEFAULT 1;
+ALTER TABLE images_aliases ADD COLUMN project_id INTEGER NOT NULL DEFAULT 1;
+ALTER TABLE profiles ADD COLUMN project_id INTEGER NOT NULL DEFAULT 1;
+
+CREATE TABLE tmp_containers (
+    id INTEGER primary key AUTOINCREMENT NOT NULL,
+    node_id INTEGER NOT NULL,
+    name TEXT NOT NULL,
+    architecture INTEGER NOT NULL,
+    type INTEGER NOT NULL,
+    ephemeral INTEGER NOT NULL DEFAULT 0,
+    creation_date DATETIME NOT NULL DEFAULT 0,
+    stateful INTEGER NOT NULL DEFAULT 0,
+    last_use_date DATETIME,
+    description TEXT,
+    project_id INTEGER NOT NULL,
+    UNIQUE (name),
+    FOREIGN KEY (node_id) REFERENCES nodes (id) ON DELETE CASCADE,
+    FOREIGN KEY (project_id) REFERENCES projects (id) ON DELETE CASCADE
+);
+
+CREATE TABLE tmp_images (
+    id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
+    fingerprint TEXT NOT NULL,
+    filename TEXT NOT NULL,
+    size INTEGER NOT NULL,
+    public INTEGER NOT NULL DEFAULT 0,
+    architecture INTEGER NOT NULL,
+    creation_date DATETIME,
+    expiry_date DATETIME,
+    upload_date DATETIME NOT NULL,
+    cached INTEGER NOT NULL DEFAULT 0,
+    last_use_date DATETIME,
+    auto_update INTEGER NOT NULL DEFAULT 0,
+    project_id INTEGER NOT NULL,
+    UNIQUE (fingerprint),
+    FOREIGN KEY (project_id) REFERENCES projects (id) ON DELETE CASCADE
+);
+
+CREATE TABLE tmp_images_aliases (
+    id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
+    name TEXT NOT NULL,
+    image_id INTEGER NOT NULL,
+    description TEXT,
+    project_id INTEGER NOT NULL,
+    UNIQUE (name),
+    FOREIGN KEY (image_id) REFERENCES images (id) ON DELETE CASCADE,
+    FOREIGN KEY (project_id) REFERENCES projects (id) ON DELETE CASCADE
+);
+
+CREATE TABLE tmp_profiles (
+    id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
+    name TEXT NOT NULL,
+    description TEXT,
+    project_id INTEGER NOT NULL,
+    UNIQUE (name),
+    FOREIGN KEY (project_id) REFERENCES projects (id) ON DELETE CASCADE
+);
+
+INSERT INTO tmp_containers SELECT * FROM containers;
+INSERT INTO tmp_images SELECT * FROM images;
+INSERT INTO tmp_images_aliases SELECT * FROM images_aliases;
+INSERT INTO tmp_profiles SELECT * FROM profiles;
+
+DROP TABLE containers;
+ALTER TABLE tmp_containers RENAME TO containers;
+
+DROP TABLE images;
+ALTER TABLE tmp_images RENAME TO images;
+
+DROP TABLE images_aliases;
+ALTER TABLE tmp_images_aliases RENAME TO images_aliases;
+
+DROP TABLE profiles;
+ALTER TABLE tmp_profiles RENAME TO profiles;
+`
+	_, err := tx.Exec(stmts)
+	return err
 }
 
 // Add a new 'type' column to the operations table.
diff --git a/lxd/db/migration.go b/lxd/db/migration.go
index f889c661fb..5f6de40084 100644
--- a/lxd/db/migration.go
+++ b/lxd/db/migration.go
@@ -92,6 +92,13 @@ DELETE FROM storage_volumes_config WHERE storage_volume_id NOT IN (SELECT id FRO
 
 // ImportPreClusteringData imports the data loaded with LoadPreClusteringData.
 func (c *Cluster) ImportPreClusteringData(dump *Dump) error {
+	// Disable foreign key enforcement during schema update
+	_, err := c.db.Exec("PRAGMA foreign_keys=OFF;")
+	if err != nil {
+		return err
+	}
+	defer c.db.Exec("PRAGMA foreign_keys=ON;")
+
 	tx, err := c.db.Begin()
 	if err != nil {
 		return errors.Wrap(err, "failed to start cluster database transaction")
diff --git a/lxd/db/projects.go b/lxd/db/projects.go
new file mode 100644
index 0000000000..33282629bd
--- /dev/null
+++ b/lxd/db/projects.go
@@ -0,0 +1,303 @@
+package db
+
+import (
+	"database/sql"
+	"fmt"
+
+	"github.com/lxc/lxd/shared/api"
+	"github.com/lxc/lxd/shared/version"
+)
+
+// Projects returns a string list of projects
+func (c *Cluster) Projects() ([]api.Project, error) {
+	var id int64
+	var name string
+	var description string
+	var hasImages int
+	var hasProfiles int
+
+	// Sort out UsedBy
+	usedBy := map[int64][]string{}
+
+	// Containers
+	q := fmt.Sprintf("SELECT project_id, name FROM containers WHERE type=0")
+	inargs := []interface{}{}
+	outfmt := []interface{}{id, name}
+	result, err := queryScan(c.db, q, inargs, outfmt)
+	if err != nil {
+		return nil, err
+	}
+
+	for _, r := range result {
+		if usedBy[r[0].(int64)] == nil {
+			usedBy[r[0].(int64)] = []string{}
+		}
+		usedBy[r[0].(int64)] = append(usedBy[r[0].(int64)], fmt.Sprintf("/%s/containers/%s", version.APIVersion, r[1].(string)))
+	}
+
+	// Images
+	q = fmt.Sprintf("SELECT project_id, fingerprint FROM images")
+	result, err = queryScan(c.db, q, inargs, outfmt)
+	if err != nil {
+		return nil, err
+	}
+
+	for _, r := range result {
+		if usedBy[r[0].(int64)] == nil {
+			usedBy[r[0].(int64)] = []string{}
+		}
+		usedBy[r[0].(int64)] = append(usedBy[r[0].(int64)], fmt.Sprintf("/%s/images/%s", version.APIVersion, r[1].(string)))
+	}
+
+	// Profiles
+	q = fmt.Sprintf("SELECT project_id, name FROM profiles")
+	result, err = queryScan(c.db, q, inargs, outfmt)
+	if err != nil {
+		return nil, err
+	}
+
+	for _, r := range result {
+		if usedBy[r[0].(int64)] == nil {
+			usedBy[r[0].(int64)] = []string{}
+		}
+		usedBy[r[0].(int64)] = append(usedBy[r[0].(int64)], fmt.Sprintf("/%s/profiles/%s", version.APIVersion, r[1].(string)))
+	}
+
+	// Get the projects themselves
+	q = fmt.Sprintf("SELECT id, name, description, has_images, has_profiles FROM projects")
+	outfmt = []interface{}{id, name, description, hasImages, hasProfiles}
+	result, err = queryScan(c.db, q, inargs, outfmt)
+	if err != nil {
+		return nil, err
+	}
+
+	response := []api.Project{}
+	for _, r := range result {
+		project := api.Project{
+			Name: r[1].(string),
+		}
+		project.Description = r[2].(string)
+		project.Features = &api.ProjectFeatures{
+			Images:   r[3].(int) == 1,
+			Profiles: r[4].(int) == 1,
+		}
+
+		// Fill in UsedBy
+		entries, ok := usedBy[r[0].(int64)]
+		if ok {
+			project.UsedBy = entries
+		} else {
+			project.UsedBy = []string{}
+		}
+
+		response = append(response, project)
+	}
+
+	return response, nil
+}
+
+// ProjectNames returns a string list of project names
+func (c *Cluster) ProjectNames() ([]string, error) {
+	q := fmt.Sprintf("SELECT name FROM projects")
+	inargs := []interface{}{}
+	var name string
+	outfmt := []interface{}{name}
+	result, err := queryScan(c.db, q, inargs, outfmt)
+	if err != nil {
+		return []string{}, err
+	}
+
+	response := []string{}
+	for _, r := range result {
+		response = append(response, r[0].(string))
+	}
+
+	return response, nil
+}
+
+// ProjectGet returns the project with the given name
+func (c *Cluster) ProjectGet(name string) (int64, *api.Project, error) {
+	id := int64(-1)
+	hasImages := int64(-1)
+	hasProfiles := int64(-1)
+	description := sql.NullString{}
+
+	q := "SELECT id, has_images, has_profiles, description FROM projects WHERE name=?"
+	arg1 := []interface{}{name}
+	arg2 := []interface{}{&id, &hasImages, &hasProfiles, &description}
+	err := dbQueryRowScan(c.db, q, arg1, arg2)
+	if err != nil {
+		if err == sql.ErrNoRows {
+			return -1, nil, ErrNoSuchObject
+		}
+
+		return -1, nil, err
+	}
+
+	project := api.Project{
+		Name: name,
+	}
+	project.Description = description.String
+	project.Features = &api.ProjectFeatures{
+		Images:   hasImages == 1,
+		Profiles: hasProfiles == 1,
+	}
+
+	// Fill UsedBy
+	project.UsedBy = []string{}
+	var qName string
+	inargs := []interface{}{id}
+	outfmt := []interface{}{qName}
+
+	// Containers
+	q = fmt.Sprintf("SELECT name FROM containers WHERE project_id=? AND type=0")
+	result, err := queryScan(c.db, q, inargs, outfmt)
+	if err != nil {
+		return -1, nil, err
+	}
+
+	for _, r := range result {
+		project.UsedBy = append(project.UsedBy, fmt.Sprintf("/%s/containers/%s", version.APIVersion, r[0].(string)))
+	}
+
+	// Images
+	if hasImages == 1 {
+		q = fmt.Sprintf("SELECT fingerprint FROM images WHERE project_id=?")
+		result, err := queryScan(c.db, q, inargs, outfmt)
+		if err != nil {
+			return -1, nil, err
+		}
+
+		for _, r := range result {
+			project.UsedBy = append(project.UsedBy, fmt.Sprintf("/%s/images/%s", version.APIVersion, r[0].(string)))
+		}
+	}
+
+	// Profiles
+	if hasProfiles == 1 {
+		q = fmt.Sprintf("SELECT name FROM profiles WHERE project_id=?")
+		result, err := queryScan(c.db, q, inargs, outfmt)
+		if err != nil {
+			return -1, nil, err
+		}
+
+		for _, r := range result {
+			project.UsedBy = append(project.UsedBy, fmt.Sprintf("/%s/profiles/%s", version.APIVersion, r[0].(string)))
+		}
+	}
+
+	return id, &project, nil
+}
+
+// ProjectCreate creates a new project
+func (c *Cluster) ProjectCreate(project api.ProjectsPost) (int64, error) {
+	// Convert to integers
+	hasImages := 0
+	if project.Features.Images {
+		hasImages = 1
+	}
+
+	hasProfiles := 0
+	if project.Features.Profiles {
+		hasProfiles = 1
+	}
+
+	// Create the database record
+	var id int64
+	err := c.Transaction(func(tx *ClusterTx) error {
+		result, err := tx.tx.Exec("INSERT INTO projects (name, has_images, has_profiles, description) VALUES (?, ?, ?, ?)",
+			project.Name, hasImages, hasProfiles, project.Description)
+		if err != nil {
+			return err
+		}
+
+		id, err = result.LastInsertId()
+		if err != nil {
+			return err
+		}
+
+		return nil
+	})
+	if err != nil {
+		id = -1
+	}
+
+	return id, nil
+}
+
+// ProjectCreateDefault creates the default project
+func (c *Cluster) ProjectCreateDefault() error {
+	id, _, _ := c.ProjectGet("default")
+
+	if id != -1 {
+		// The default project already exists
+		return nil
+	}
+
+	defaultProject := api.ProjectsPost{
+		Name: "default",
+	}
+	defaultProject.Description = "Default LXD project"
+	defaultProject.Features = &api.ProjectFeatures{
+		Images:   true,
+		Profiles: true,
+	}
+
+	_, err := c.ProjectCreate(defaultProject)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ProjectDelete deletes the project with the given name
+func (c *Cluster) ProjectDelete(name string) error {
+	err := c.Transaction(func(tx *ClusterTx) error {
+		_, err := tx.tx.Exec("DELETE FROM projects WHERE name=?", name)
+		return err
+	})
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ProjectRename renames the project with the given name to the given new name
+func (c *Cluster) ProjectRename(name string, project api.ProjectPost) error {
+	err := c.Transaction(func(tx *ClusterTx) error {
+		_, err := tx.tx.Exec("UPDATE projects SET name=? WHERE name=?", project.Name, name)
+		return err
+	})
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// ProjectUpdate updates the various fields of a project
+func (c *Cluster) ProjectUpdate(name string, project api.ProjectPut) error {
+	// Convert to integers
+	hasImages := 0
+	if project.Features != nil && project.Features.Images {
+		hasImages = 1
+	}
+
+	hasProfiles := 0
+	if project.Features != nil && project.Features.Profiles {
+		hasProfiles = 1
+	}
+
+	// Update the record
+	err := c.Transaction(func(tx *ClusterTx) error {
+		_, err := tx.tx.Exec("UPDATE projects SET description=?, has_images=?, has_profiles=? WHERE name=?", project.Description, hasImages, hasProfiles, name)
+		return err
+	})
+	if err != nil {
+		return err
+	}
+
+	return nil
+}

From 2eacbef446496aa0269e642ab4eecc6ae1e6544f Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Wed, 15 Aug 2018 18:03:04 -0400
Subject: [PATCH 04/12] lxd/projects: Add project API
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxd/api_1.0.go       |   8 ++
 lxd/api_project.go   | 309 +++++++++++++++++++++++++++++++++++++++++++
 lxd/db/operations.go |   3 +
 3 files changed, 320 insertions(+)
 create mode 100644 lxd/api_project.go

diff --git a/lxd/api_1.0.go b/lxd/api_1.0.go
index c3a250d8c5..0eb76b6834 100644
--- a/lxd/api_1.0.go
+++ b/lxd/api_1.0.go
@@ -68,6 +68,8 @@ var api10 = []Command{
 	operationWebsocket,
 	profileCmd,
 	profilesCmd,
+	projectCmd,
+	projectsCmd,
 	serverResourceCmd,
 	serverResourceCmd,
 	storagePoolCmd,
@@ -165,6 +167,11 @@ func api10Get(d *Daemon, r *http.Request) Response {
 		architectures = append(architectures, architectureName)
 	}
 
+	project := r.FormValue("project")
+	if project == "" {
+		project = "default"
+	}
+
 	env := api.ServerEnvironment{
 		Addresses:              addresses,
 		Architectures:          architectures,
@@ -175,6 +182,7 @@ func api10Get(d *Daemon, r *http.Request) Response {
 		Kernel:                 uname.Sysname,
 		KernelArchitecture:     uname.Machine,
 		KernelVersion:          uname.Release,
+		Project:                project,
 		Server:                 "lxd",
 		ServerPid:              os.Getpid(),
 		ServerVersion:          version.Version,
diff --git a/lxd/api_project.go b/lxd/api_project.go
new file mode 100644
index 0000000000..622e8b0616
--- /dev/null
+++ b/lxd/api_project.go
@@ -0,0 +1,309 @@
+package main
+
+import (
+	"bytes"
+	"encoding/json"
+	"fmt"
+	"io/ioutil"
+	"net/http"
+	"reflect"
+	"strings"
+
+	"github.com/gorilla/mux"
+
+	"github.com/lxc/lxd/lxd/db"
+	"github.com/lxc/lxd/lxd/util"
+	"github.com/lxc/lxd/shared"
+	"github.com/lxc/lxd/shared/api"
+	"github.com/lxc/lxd/shared/version"
+)
+
+var projectsCmd = Command{
+	name: "projects",
+	get:  apiProjectsGet,
+	post: apiProjectsPost,
+}
+
+var projectCmd = Command{
+	name:   "projects/{name}",
+	get:    apiProjectGet,
+	post:   apiProjectPost,
+	put:    apiProjectPut,
+	patch:  apiProjectPatch,
+	delete: apiProjectDelete,
+}
+
+func apiProjectsGet(d *Daemon, r *http.Request) Response {
+	recursion := util.IsRecursionRequest(r)
+
+	// Recursive query
+	if recursion {
+		projects, err := d.cluster.Projects()
+		if err != nil {
+			return SmartError(err)
+		}
+
+		return SyncResponse(true, projects)
+	}
+
+	// List of URLs
+	projects, err := d.cluster.ProjectNames()
+	if err != nil {
+		return SmartError(err)
+	}
+
+	urls := []string{}
+	for _, name := range projects {
+		urls = append(urls, fmt.Sprintf("/%s/projects/%s", version.APIVersion, name))
+	}
+
+	return SyncResponse(true, urls)
+}
+
+func apiProjectsPost(d *Daemon, r *http.Request) Response {
+	// Parse the request
+	project := api.ProjectsPost{}
+
+	err := json.NewDecoder(r.Body).Decode(&project)
+	if err != nil {
+		return BadRequest(err)
+	}
+
+	// Sanity checks
+	if project.Name == "" {
+		return BadRequest(fmt.Errorf("No name provided"))
+	}
+
+	_, entry, _ := d.cluster.ProjectGet(project.Name)
+	if entry != nil {
+		return BadRequest(fmt.Errorf("The project already exists"))
+	}
+
+	if strings.Contains(project.Name, "/") {
+		return BadRequest(fmt.Errorf("Project names may not contain slashes"))
+	}
+
+	if shared.StringInSlice(project.Name, []string{".", ".."}) {
+		return BadRequest(fmt.Errorf("Invalid project name '%s'", project.Name))
+	}
+
+	// Fill the features if not set by the client
+	if project.Features == nil {
+		project.Features = &api.ProjectFeatures{
+			Images:   true,
+			Profiles: true,
+		}
+	}
+
+	// Create the database entry
+	_, err = d.cluster.ProjectCreate(project)
+	if err != nil {
+		return SmartError(fmt.Errorf("Error inserting %s into database: %s", project.Name, err))
+	}
+
+	return SyncResponseLocation(true, nil, fmt.Sprintf("/%s/projects/%s", version.APIVersion, project.Name))
+}
+
+func apiProjectGet(d *Daemon, r *http.Request) Response {
+	name := mux.Vars(r)["name"]
+
+	// Get the database entry
+	_, project, err := d.cluster.ProjectGet(name)
+	if err != nil {
+		return SmartError(err)
+	}
+
+	etag := []interface{}{project.Description, *project.Features}
+	return SyncResponseETag(true, project, etag)
+}
+
+func apiProjectPut(d *Daemon, r *http.Request) Response {
+	name := mux.Vars(r)["name"]
+
+	// Get the current data
+	_, project, err := d.cluster.ProjectGet(name)
+	if err != nil {
+		return SmartError(err)
+	}
+
+	// Validate ETag
+	etag := []interface{}{project.Description, *project.Features}
+	err = util.EtagCheck(r, etag)
+	if err != nil {
+		return PreconditionFailed(err)
+	}
+
+	// Parse the request
+	req := api.ProjectPut{}
+
+	err = json.NewDecoder(r.Body).Decode(&req)
+	if err != nil {
+		return BadRequest(err)
+	}
+
+	// Sanity checks
+	if project.Name == "default" && !reflect.DeepEqual(req.Features, project.Features) {
+		return BadRequest(fmt.Errorf("You can't change the features of the default project"))
+	}
+
+	if len(project.UsedBy) != 0 && !reflect.DeepEqual(req.Features, project.Features) {
+		return BadRequest(fmt.Errorf("Features can only be changed on empty projects"))
+	}
+
+	// Update the database entry
+	err = d.cluster.ProjectUpdate(name, req)
+	if err != nil {
+		return SmartError(err)
+	}
+
+	return EmptySyncResponse
+}
+
+func apiProjectPatch(d *Daemon, r *http.Request) Response {
+	name := mux.Vars(r)["name"]
+
+	// Get the current data
+	_, project, err := d.cluster.ProjectGet(name)
+	if err != nil {
+		return SmartError(err)
+	}
+
+	// Validate ETag
+	etag := []interface{}{project.Description, *project.Features}
+	err = util.EtagCheck(r, etag)
+	if err != nil {
+		return PreconditionFailed(err)
+	}
+
+	body, err := ioutil.ReadAll(r.Body)
+	if err != nil {
+		return InternalError(err)
+	}
+
+	rdr1 := ioutil.NopCloser(bytes.NewBuffer(body))
+	rdr2 := ioutil.NopCloser(bytes.NewBuffer(body))
+
+	reqRaw := shared.Jmap{}
+	if err := json.NewDecoder(rdr1).Decode(&reqRaw); err != nil {
+		return BadRequest(err)
+	}
+
+	req := api.ProjectPut{}
+	if err := json.NewDecoder(rdr2).Decode(&req); err != nil {
+		return BadRequest(err)
+	}
+
+	// Check what was actually set in the query
+	_, err = reqRaw.GetString("description")
+	if err != nil {
+		req.Description = project.Description
+	}
+
+	features, err := reqRaw.GetMap("features")
+	if err == nil {
+		_, err = features.GetBool("images")
+		if err != nil {
+			req.Features.Images = project.Features.Images
+		}
+
+		_, err = features.GetBool("profiles")
+		if err != nil {
+			req.Features.Profiles = project.Features.Profiles
+		}
+	} else {
+		req.Features = project.Features
+	}
+
+	// Sanity checks
+	if project.Name == "default" && !reflect.DeepEqual(req.Features, project.Features) {
+		return BadRequest(fmt.Errorf("You can't change the features of the default project"))
+	}
+
+	if len(project.UsedBy) != 0 && !reflect.DeepEqual(req.Features, project.Features) {
+		return BadRequest(fmt.Errorf("Features can only be changed on empty projects"))
+	}
+
+	// Update the database entry
+	err = d.cluster.ProjectUpdate(name, req)
+	if err != nil {
+		return SmartError(err)
+	}
+
+	return EmptySyncResponse
+}
+
+func apiProjectPost(d *Daemon, r *http.Request) Response {
+	name := mux.Vars(r)["name"]
+
+	// Parse the request
+	req := api.ProjectPost{}
+
+	err := json.NewDecoder(r.Body).Decode(&req)
+	if err != nil {
+		return BadRequest(err)
+	}
+
+	// Sanity checks
+	if name == "default" {
+		return Forbidden(fmt.Errorf("The 'default' project cannot be renamed"))
+	}
+
+	_, newProject, err := d.cluster.ProjectGet(req.Name)
+	if err != db.ErrNoSuchObject {
+		if err != nil {
+			return InternalError(err)
+		}
+
+		if newProject != nil {
+			return BadRequest(fmt.Errorf("A project named '%s' already exists", req.Name))
+		}
+	}
+
+	// FIXME: Allow renaming non-empty projects
+	_, project, err := d.cluster.ProjectGet(name)
+	if err != nil {
+		return SmartError(err)
+	}
+
+	if len(project.UsedBy) != 0 {
+		return BadRequest(fmt.Errorf("Only empty projects can be renamed at this time"))
+	}
+
+	// Perform the rename
+	run := func(op *operation) error {
+		return d.cluster.ProjectRename(name, req)
+	}
+
+	op, err := operationCreate(d.cluster, operationClassTask, db.OperationProjectRename, nil, nil, run, nil, nil)
+	if err != nil {
+		return InternalError(err)
+	}
+
+	return OperationResponse(op)
+}
+
+func apiProjectDelete(d *Daemon, r *http.Request) Response {
+	name := mux.Vars(r)["name"]
+
+	// Sanity checks
+	if name == "default" {
+		return Forbidden(fmt.Errorf("The 'default' project cannot be deleted"))
+	}
+
+	_, project, err := d.cluster.ProjectGet(name)
+	if err != nil {
+		return SmartError(err)
+	}
+
+	if len(project.UsedBy) != 0 {
+		return BadRequest(fmt.Errorf("Only empty projects can be removed"))
+	}
+
+	// Perform the removal
+	err = d.cluster.ProjectDelete(name)
+	if err != nil {
+		return SmartError(err)
+	}
+
+	return EmptySyncResponse
+}
diff --git a/lxd/db/operations.go b/lxd/db/operations.go
index 3d9225e8cd..b97eb92bbd 100644
--- a/lxd/db/operations.go
+++ b/lxd/db/operations.go
@@ -50,6 +50,7 @@ const (
 	OperationVolumeCreate
 	OperationVolumeMigrate
 	OperationVolumeMove
+	OperationProjectRename
 )
 
 // Description return a human-readable description of the operation type.
@@ -121,6 +122,8 @@ func (t OperationType) Description() string {
 		return "Migrating storage volume"
 	case OperationVolumeMove:
 		return "Moving storage volume"
+	case OperationProjectRename:
+		return "Renaming project"
 	default:
 		return "Executing operation"
 

From 2a1c7c94277f0f34172c0bf3dbb93985f0d2ffd6 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Tue, 28 Aug 2018 11:08:46 -0700
Subject: [PATCH 05/12] TMP: Hardcode project_id=1 in queries
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxd/db/containers.go       |  2 +-
 lxd/db/containers_test.go  |  2 +-
 lxd/db/db_internal_test.go |  8 ++++----
 lxd/db/images.go           |  4 ++--
 lxd/db/node_test.go        | 10 +++++-----
 lxd/db/profiles.go         |  2 +-
 lxd/profiles_test.go       |  4 ++--
 7 files changed, 16 insertions(+), 16 deletions(-)

diff --git a/lxd/db/containers.go b/lxd/db/containers.go
index 261093433f..f6113091aa 100644
--- a/lxd/db/containers.go
+++ b/lxd/db/containers.go
@@ -725,7 +725,7 @@ func (c *Cluster) ContainerCreate(args ContainerArgs) (int, error) {
 			args.LastUsedDate = time.Unix(0, 0).UTC()
 		}
 
-		str := fmt.Sprintf("INSERT INTO containers (node_id, name, architecture, type, ephemeral, creation_date, last_use_date, stateful) VALUES (?, ?, ?, ?, ?, ?, ?, ?)")
+		str := fmt.Sprintf("INSERT INTO containers (node_id, name, architecture, type, ephemeral, creation_date, last_use_date, stateful, project_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?, 1)")
 		stmt, err := tx.tx.Prepare(str)
 		if err != nil {
 			return err
diff --git a/lxd/db/containers_test.go b/lxd/db/containers_test.go
index 5f6e84dcb5..3bcf359152 100644
--- a/lxd/db/containers_test.go
+++ b/lxd/db/containers_test.go
@@ -205,7 +205,7 @@ func TestContainerArgsNodeList(t *testing.T) {
 
 func addContainer(t *testing.T, tx *db.ClusterTx, nodeID int64, name string) {
 	stmt := `
-INSERT INTO containers(node_id, name, architecture, type) VALUES (?, ?, 1, ?)
+INSERT INTO containers(node_id, name, architecture, type, project_id) VALUES (?, ?, 1, ?, 1)
 `
 	_, err := tx.Tx().Exec(stmt, nodeID, name, db.CTypeRegular)
 	require.NoError(t, err)
diff --git a/lxd/db/db_internal_test.go b/lxd/db/db_internal_test.go
index 6595620a2a..7a2c16ab62 100644
--- a/lxd/db/db_internal_test.go
+++ b/lxd/db/db_internal_test.go
@@ -15,14 +15,14 @@ import (
 )
 
 const fixtures string = `
-    INSERT INTO containers (node_id, name, architecture, type) VALUES (1, 'thename', 1, 1);
-    INSERT INTO profiles (name) VALUES ('theprofile');
+    INSERT INTO containers (node_id, name, architecture, type, project_id) VALUES (1, 'thename', 1, 1, 1);
+    INSERT INTO profiles (name, project_id) VALUES ('theprofile', 1);
     INSERT INTO containers_profiles (container_id, profile_id) VALUES (1, 2);
     INSERT INTO containers_config (container_id, key, value) VALUES (1, 'thekey', 'thevalue');
     INSERT INTO containers_devices (container_id, name, type) VALUES (1, 'somename', 1);
     INSERT INTO containers_devices_config (key, value, container_device_id) VALUES ('configkey', 'configvalue', 1);
-    INSERT INTO images (fingerprint, filename, size, architecture, creation_date, expiry_date, upload_date, auto_update) VALUES ('fingerprint', 'filename', 1024, 0,  1431547174,  1431547175,  1431547176, 1);
-    INSERT INTO images_aliases (name, image_id, description) VALUES ('somealias', 1, 'some description');
+    INSERT INTO images (fingerprint, filename, size, architecture, creation_date, expiry_date, upload_date, auto_update, project_id) VALUES ('fingerprint', 'filename', 1024, 0,  1431547174,  1431547175,  1431547176, 1, 1);
+    INSERT INTO images_aliases (name, image_id, description, project_id) VALUES ('somealias', 1, 'some description', 1);
     INSERT INTO images_properties (image_id, type, key, value) VALUES (1, 0, 'thekey', 'some value');
     INSERT INTO profiles_config (profile_id, key, value) VALUES (2, 'thekey', 'thevalue');
     INSERT INTO profiles_devices (profile_id, name, type) VALUES (2, 'devicename', 1);
diff --git a/lxd/db/images.go b/lxd/db/images.go
index fd9589393f..f595341d0b 100644
--- a/lxd/db/images.go
+++ b/lxd/db/images.go
@@ -469,7 +469,7 @@ func (c *Cluster) ImageAliasesMove(source int, destination int) error {
 
 // ImageAliasAdd inserts an alias ento the database.
 func (c *Cluster) ImageAliasAdd(name string, imageID int, desc string) error {
-	stmt := `INSERT INTO images_aliases (name, image_id, description) values (?, ?, ?)`
+	stmt := `INSERT INTO images_aliases (name, image_id, description, project_id) values (?, ?, ?, 1)`
 	err := exec(c.db, stmt, name, imageID, desc)
 	return err
 }
@@ -566,7 +566,7 @@ func (c *Cluster) ImageInsert(fp string, fname string, sz int64, public bool, au
 			autoUpdateInt = 1
 		}
 
-		stmt, err := tx.tx.Prepare(`INSERT INTO images (fingerprint, filename, size, public, auto_update, architecture, creation_date, expiry_date, upload_date) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`)
+		stmt, err := tx.tx.Prepare(`INSERT INTO images (fingerprint, filename, size, public, auto_update, architecture, creation_date, expiry_date, upload_date, project_id) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, 1)`)
 		if err != nil {
 			return err
 		}
diff --git a/lxd/db/node_test.go b/lxd/db/node_test.go
index 6d681772d1..3be4348afb 100644
--- a/lxd/db/node_test.go
+++ b/lxd/db/node_test.go
@@ -226,7 +226,7 @@ func TestNodeIsEmpty_Containers(t *testing.T) {
 	assert.Equal(t, "", message)
 
 	_, err = tx.Tx().Exec(`
-INSERT INTO containers (id, node_id, name, architecture, type) VALUES (1, ?, 'foo', 1, 1)
+INSERT INTO containers (id, node_id, name, architecture, type, project_id) VALUES (1, ?, 'foo', 1, 1, 1)
 `, id)
 	require.NoError(t, err)
 
@@ -252,8 +252,8 @@ func TestNodeIsEmpty_Images(t *testing.T) {
 	require.NoError(t, err)
 
 	_, err = tx.Tx().Exec(`
-INSERT INTO images (id, fingerprint, filename, size, architecture, upload_date)
-  VALUES (1, 'abc', 'foo', 123, 1, ?)`, time.Now())
+INSERT INTO images (id, fingerprint, filename, size, architecture, upload_date, project_id)
+  VALUES (1, 'abc', 'foo', 123, 1, ?, 1)`, time.Now())
 	require.NoError(t, err)
 
 	_, err = tx.Tx().Exec(`
@@ -285,7 +285,7 @@ func TestNodeWithLeastContainers(t *testing.T) {
 
 	// Add a container to the default node (ID 1)
 	_, err = tx.Tx().Exec(`
-INSERT INTO containers (id, node_id, name, architecture, type) VALUES (1, 1, 'foo', 1, 1)
+INSERT INTO containers (id, node_id, name, architecture, type, project_id) VALUES (1, 1, 'foo', 1, 1, 1)
 `)
 	require.NoError(t, err)
 
@@ -305,7 +305,7 @@ func TestNodeWithLeastContainers_OfflineNode(t *testing.T) {
 
 	// Add a container to the newly created node.
 	_, err = tx.Tx().Exec(`
-INSERT INTO containers (id, node_id, name, architecture, type) VALUES (1, ?, 'foo', 1, 1)
+INSERT INTO containers (id, node_id, name, architecture, type, project_id) VALUES (1, ?, 'foo', 1, 1, 1)
 `, id)
 	require.NoError(t, err)
 
diff --git a/lxd/db/profiles.go b/lxd/db/profiles.go
index b990b0b06f..43912a4b28 100644
--- a/lxd/db/profiles.go
+++ b/lxd/db/profiles.go
@@ -71,7 +71,7 @@ func (c *Cluster) ProfileCreate(profile string, description string, config map[s
 
 	var id int64
 	err := c.Transaction(func(tx *ClusterTx) error {
-		result, err := tx.tx.Exec("INSERT INTO profiles (name, description) VALUES (?, ?)", profile, description)
+		result, err := tx.tx.Exec("INSERT INTO profiles (name, description, project_id) VALUES (?, ?, 1)", profile, description)
 		if err != nil {
 			return err
 		}
diff --git a/lxd/profiles_test.go b/lxd/profiles_test.go
index fd2dc3a7b2..163a6425e6 100644
--- a/lxd/profiles_test.go
+++ b/lxd/profiles_test.go
@@ -17,8 +17,8 @@ func Test_removing_a_profile_deletes_associated_configuration_entries(t *testing
 	// Insert a container and a related profile. Dont't forget that the profile
 	// we insert is profile ID 2 (there is a default profile already).
 	statements := `
-    INSERT INTO containers (node_id, name, architecture, type) VALUES (1, 'thename', 1, 1);
-    INSERT INTO profiles (name) VALUES ('theprofile');
+    INSERT INTO containers (node_id, name, architecture, type, project_id) VALUES (1, 'thename', 1, 1, 1);
+    INSERT INTO profiles (name, project_id) VALUES ('theprofile', 1);
     INSERT INTO containers_profiles (container_id, profile_id) VALUES (1, 2);
     INSERT INTO profiles_devices (name, profile_id) VALUES ('somename', 2);
     INSERT INTO profiles_config (key, value, profile_id) VALUES ('thekey', 'thevalue', 2);

From 9880db42ae6e172bc862e335b32a4fc530508f6b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Fri, 31 Aug 2018 10:01:36 -0700
Subject: [PATCH 06/12] client: Add support for projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 client/interfaces.go   |   9 +++
 client/lxd_projects.go | 129 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 138 insertions(+)
 create mode 100644 client/lxd_projects.go

diff --git a/client/interfaces.go b/client/interfaces.go
index 124a83cd07..1217d0479b 100644
--- a/client/interfaces.go
+++ b/client/interfaces.go
@@ -178,6 +178,15 @@ type ContainerServer interface {
 	RenameProfile(name string, profile api.ProfilePost) (err error)
 	DeleteProfile(name string) (err error)
 
+	// Project functions
+	GetProjectNames() (names []string, err error)
+	GetProjects() (projects []api.Project, err error)
+	GetProject(name string) (project *api.Project, ETag string, err error)
+	CreateProject(project api.ProjectsPost) (err error)
+	UpdateProject(name string, project api.ProjectPut, ETag string) (err error)
+	RenameProject(name string, project api.ProjectPost) (op Operation, err error)
+	DeleteProject(name string) (err error)
+
 	// Storage pool functions ("storage" API extension)
 	GetStoragePoolNames() (names []string, err error)
 	GetStoragePools() (pools []api.StoragePool, err error)
diff --git a/client/lxd_projects.go b/client/lxd_projects.go
new file mode 100644
index 0000000000..7e1f231625
--- /dev/null
+++ b/client/lxd_projects.go
@@ -0,0 +1,129 @@
+package lxd
+
+import (
+	"fmt"
+	"net/url"
+	"strings"
+
+	"github.com/lxc/lxd/shared/api"
+)
+
+// Project handling functions
+
+// GetProjectNames returns a list of available project names
+func (r *ProtocolLXD) GetProjectNames() ([]string, error) {
+	if !r.HasExtension("projects") {
+		return nil, fmt.Errorf("The server is missing the required \"projects\" API extension")
+	}
+
+	urls := []string{}
+
+	// Fetch the raw value
+	_, err := r.queryStruct("GET", "/projects", nil, "", &urls)
+	if err != nil {
+		return nil, err
+	}
+
+	// Parse it
+	names := []string{}
+	for _, url := range urls {
+		fields := strings.Split(url, "/projects/")
+		names = append(names, fields[len(fields)-1])
+	}
+
+	return names, nil
+}
+
+// GetProjects returns a list of available Project structs
+func (r *ProtocolLXD) GetProjects() ([]api.Project, error) {
+	if !r.HasExtension("projects") {
+		return nil, fmt.Errorf("The server is missing the required \"projects\" API extension")
+	}
+
+	projects := []api.Project{}
+
+	// Fetch the raw value
+	_, err := r.queryStruct("GET", "/projects?recursion=1", nil, "", &projects)
+	if err != nil {
+		return nil, err
+	}
+
+	return projects, nil
+}
+
+// GetProject returns a Project entry for the provided name
+func (r *ProtocolLXD) GetProject(name string) (*api.Project, string, error) {
+	if !r.HasExtension("projects") {
+		return nil, "", fmt.Errorf("The server is missing the required \"projects\" API extension")
+	}
+
+	project := api.Project{}
+
+	// Fetch the raw value
+	etag, err := r.queryStruct("GET", fmt.Sprintf("/projects/%s", url.QueryEscape(name)), nil, "", &project)
+	if err != nil {
+		return nil, "", err
+	}
+
+	return &project, etag, nil
+}
+
+// CreateProject defines a new container project
+func (r *ProtocolLXD) CreateProject(project api.ProjectsPost) error {
+	if !r.HasExtension("projects") {
+		return fmt.Errorf("The server is missing the required \"projects\" API extension")
+	}
+
+	// Send the request
+	_, _, err := r.query("POST", "/projects", project, "")
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// UpdateProject updates the project to match the provided Project struct
+func (r *ProtocolLXD) UpdateProject(name string, project api.ProjectPut, ETag string) error {
+	if !r.HasExtension("projects") {
+		return fmt.Errorf("The server is missing the required \"projects\" API extension")
+	}
+
+	// Send the request
+	_, _, err := r.query("PUT", fmt.Sprintf("/projects/%s", url.QueryEscape(name)), project, ETag)
+	if err != nil {
+		return err
+	}
+
+	return nil
+}
+
+// RenameProject renames an existing project entry
+func (r *ProtocolLXD) RenameProject(name string, project api.ProjectPost) (Operation, error) {
+	if !r.HasExtension("projects") {
+		return nil, fmt.Errorf("The server is missing the required \"projects\" API extension")
+	}
+
+	// Send the request
+	op, _, err := r.queryOperation("POST", fmt.Sprintf("/projects/%s", url.QueryEscape(name)), project, "")
+	if err != nil {
+		return nil, err
+	}
+
+	return op, nil
+}
+
+// DeleteProject deletes a project
+func (r *ProtocolLXD) DeleteProject(name string) error {
+	if !r.HasExtension("projects") {
+		return fmt.Errorf("The server is missing the required \"projects\" API extension")
+	}
+
+	// Send the request
+	_, _, err := r.query("DELETE", fmt.Sprintf("/projects/%s", url.QueryEscape(name)), nil, "")
+	if err != nil {
+		return err
+	}
+
+	return nil
+}

From 99ec7ab3d62eb1cde59278c80f0d5777d6aa25c0 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Fri, 31 Aug 2018 10:03:04 -0700
Subject: [PATCH 07/12] shared/version: Project API extension
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 shared/version/api.go | 1 +
 1 file changed, 1 insertion(+)

diff --git a/shared/version/api.go b/shared/version/api.go
index 0ac1c116c7..2819703d06 100644
--- a/shared/version/api.go
+++ b/shared/version/api.go
@@ -122,6 +122,7 @@ var APIExtensions = []string{
 	"container_full",
 	"candid_authentication",
 	"backup_compression",
+	"projects",
 }
 
 // APIExtensionsCount returns the number of available API extensions.

From cb5909ef6e5c33dde09b502a551301c064b7e6f2 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Fri, 31 Aug 2018 10:08:02 -0700
Subject: [PATCH 08/12] doc: Update for projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 doc/api-extensions.md |   6 ++
 doc/rest-api.md       | 128 ++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 134 insertions(+)

diff --git a/doc/api-extensions.md b/doc/api-extensions.md
index 426b388407..9a0fb0cf2c 100644
--- a/doc/api-extensions.md
+++ b/doc/api-extensions.md
@@ -579,3 +579,9 @@ core.macaroon.endpoint.
 ## backup\_compression
 This introduces a new backups.compression\_algorithm config key which
 allows configuration of backup compression.
+
+## projects
+Add a new project API, supporting creation, update and deletion of projects.
+
+Projects can hold containers, profiles or images at this point and let
+you get a separate view of your LXD resources by switching to it.
diff --git a/doc/rest-api.md b/doc/rest-api.md
index 650baf84c9..4c5abdb775 100644
--- a/doc/rest-api.md
+++ b/doc/rest-api.md
@@ -215,6 +215,8 @@ won't work and PUT needs to be used instead.
          * [`/1.0/operations/<uuid>/websocket`](#10operationsuuidwebsocket)
      * [`/1.0/profiles`](#10profiles)
        * [`/1.0/profiles/<name>`](#10profilesname)
+     * [`/1.0/projects`](#10projects)
+       * [`/1.0/projects/<name>`](#10projectsname)
      * [`/1.0/storage-pools`](#10storage-pools)
        * [`/1.0/storage-pools/<name>`](#10storage-poolsname)
          * [`/1.0/storage-pools/<name>/resources`](#10storage-poolsnameresources)
@@ -2238,6 +2240,132 @@ HTTP code for this should be 202 (Accepted).
 
 Attempting to delete the `default` profile will return the 403 (Forbidden) HTTP code.
 
+## `/1.0/projects`
+### GET
+ * Description: List of configuration projects
+ * Introduced: with API extension `projects`
+ * Authentication: trusted
+ * Operation: sync
+ * Return: list of URLs to defined projects
+
+Return:
+
+    [
+        "/1.0/projects/default"
+    ]
+
+### POST
+ * Description: define a new project
+ * Introduced: with API extension `projects`
+ * Authentication: trusted
+ * Operation: sync
+ * Return: standard return value or standard error
+
+Input:
+
+    {
+        "name": "test",
+        "features": {
+            "images": True,
+            "profiles": True,
+        },
+        "description": "Some description string"
+    }
+
+## `/1.0/projects/<name>`
+### GET
+ * Description: project configuration
+ * Introduced: with API extension `projects`
+ * Authentication: trusted
+ * Operation: sync
+ * Return: dict representing the project content
+
+Output:
+
+    {
+        "name": "test",
+        "features": {
+            "images": True,
+            "profiles": True,
+        },
+        "description": "Some description string",
+        "used_by": [
+            "/1.0/containers/blah"
+        ]
+    }
+
+### PUT (ETag supported)
+ * Description: replace the project information
+ * Introduced: with API extension `projects`
+ * Authentication: trusted
+ * Operation: sync
+ * Return: standard return value or standard error
+
+Input:
+
+    {
+        "features": {
+            "images": True,
+            "profiles": True,
+        },
+        "description": "Some description string"
+    }
+
+Same dict as used for initial creation and coming from GET. The name
+property can't be changed (see POST for that).
+
+### PATCH (ETag supported)
+ * Description: update the project information
+ * Introduced: with API extension `projects`
+ * Authentication: trusted
+ * Operation: sync
+ * Return: standard return value or standard error
+
+Input:
+
+    {
+        "features": {
+            "images": False
+        },
+        "description": "Some description string"
+    }
+
+### POST
+ * Description: rename a project
+ * Introduced: with API extension `projects`
+ * Authentication: trusted
+ * Operation: async
+ * Return: background operation or standard error
+
+Input (rename a project):
+
+    {
+        "name": "new-name"
+    }
+
+HTTP return value must be 204 (No content) and Location must point to
+the renamed resource.
+
+Renaming to an existing name must return the 409 (Conflict) HTTP code.
+
+Attempting to rename the `default` project will return the 403 (Forbidden) HTTP code.
+
+### DELETE
+ * Description: remove a project
+ * Introduced: with API extension `projects`
+ * Authentication: trusted
+ * Operation: sync
+ * Return: standard return value or standard error
+
+Input (none at present):
+
+    {
+    }
+
+HTTP code for this should be 202 (Accepted).
+
+Attempting to delete the `default` project will return the 403 (Forbidden) HTTP code.
+
 ## `/1.0/storage-pools`
 ### GET
  * Description: list of storage pools

From 50dedacc70b845b4ce9d704d510a67c1a27ebc46 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Sat, 1 Sep 2018 11:31:03 -0700
Subject: [PATCH 09/12] lxc/config: Add support for projects
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxc/config/file.go   | 10 +++++++++-
 lxc/config/remote.go |  9 +++++++++
 2 files changed, 18 insertions(+), 1 deletion(-)

diff --git a/lxc/config/file.go b/lxc/config/file.go
index 4f6f541983..036b1df6c7 100644
--- a/lxc/config/file.go
+++ b/lxc/config/file.go
@@ -41,6 +41,10 @@ func LoadConfig(path string) (*Config, error) {
 
 	// Apply the static remotes
 	for k, v := range StaticRemotes {
+		if c.Remotes[k].Project != "" {
+			v.Project = c.Remotes[k].Project
+		}
+
 		c.Remotes[k] = v
 	}
 
@@ -66,6 +70,10 @@ func (c *Config) SaveConfig(path string) error {
 
 	// Remove the static remotes
 	for k := range StaticRemotes {
+		if k == "local" {
+			continue
+		}
+
 		delete(conf.Remotes, k)
 	}
 
@@ -77,7 +85,7 @@ func (c *Config) SaveConfig(path string) error {
 	defer f.Close()
 
 	// Write the new config
-	data, err := yaml.Marshal(c)
+	data, err := yaml.Marshal(conf)
 	if err != nil {
 		return fmt.Errorf("Unable to marshal the configuration: %v", err)
 	}
diff --git a/lxc/config/remote.go b/lxc/config/remote.go
index bc1acf63ec..cb58ca646e 100644
--- a/lxc/config/remote.go
+++ b/lxc/config/remote.go
@@ -16,6 +16,7 @@ type Remote struct {
 	Protocol string `yaml:"protocol,omitempty"`
 	AuthType string `yaml:"auth_type,omitempty"`
 	Static   bool   `yaml:"-"`
+	Project  string `yaml:"project,omitempty"`
 }
 
 // ParseRemote splits remote and object
@@ -64,6 +65,10 @@ func (c *Config) GetContainerServer(name string) (lxd.ContainerServer, error) {
 			return nil, err
 		}
 
+		if remote.Project != "" && remote.Project != "default" {
+			d = d.UseProject(remote.Project)
+		}
+
 		return d, nil
 	}
 
@@ -77,6 +82,10 @@ func (c *Config) GetContainerServer(name string) (lxd.ContainerServer, error) {
 		return nil, err
 	}
 
+	if remote.Project != "" && remote.Project != "default" {
+		d = d.UseProject(remote.Project)
+	}
+
 	return d, nil
 }
 

From 0850b77a63a08160cbb98a37ad014c6ccfe38ef1 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Fri, 31 Aug 2018 10:27:35 -0700
Subject: [PATCH 10/12] lxc: Add project subcommand
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 lxc/main.go    |   4 +
 lxc/project.go | 531 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 535 insertions(+)
 create mode 100644 lxc/project.go

diff --git a/lxc/main.go b/lxc/main.go
index 1ec8c08a9f..c7693ed61c 100644
--- a/lxc/main.go
+++ b/lxc/main.go
@@ -161,6 +161,10 @@ For help with any of those, simply call them with --help.`))
 	profileCmd := cmdProfile{global: &globalCmd}
 	app.AddCommand(profileCmd.Command())
 
+	// profile sub-command
+	projectCmd := cmdProject{global: &globalCmd}
+	app.AddCommand(projectCmd.Command())
+
 	// query sub-command
 	queryCmd := cmdQuery{global: &globalCmd}
 	app.AddCommand(queryCmd.Command())
diff --git a/lxc/project.go b/lxc/project.go
new file mode 100644
index 0000000000..6188d39600
--- /dev/null
+++ b/lxc/project.go
@@ -0,0 +1,531 @@
+package main
+
+import (
+	"fmt"
+	"io/ioutil"
+	"os"
+	"sort"
+	"syscall"
+
+	"github.com/olekukonko/tablewriter"
+	"github.com/spf13/cobra"
+	"gopkg.in/yaml.v2"
+
+	"github.com/lxc/lxd/shared"
+	"github.com/lxc/lxd/shared/api"
+	cli "github.com/lxc/lxd/shared/cmd"
+	"github.com/lxc/lxd/shared/i18n"
+	"github.com/lxc/lxd/shared/termios"
+)
+
+type cmdProject struct {
+	global *cmdGlobal
+}
+
+func (c *cmdProject) Command() *cobra.Command {
+	cmd := &cobra.Command{}
+	cmd.Use = i18n.G("project")
+	cmd.Short = i18n.G("Manage projects")
+	cmd.Long = cli.FormatSection(i18n.G("Description"), i18n.G(
+		`Manage projects`))
+
+	// Create
+	projectCreateCmd := cmdProjectCreate{global: c.global, project: c}
+	cmd.AddCommand(projectCreateCmd.Command())
+
+	// Delete
+	projectDeleteCmd := cmdProjectDelete{global: c.global, project: c}
+	cmd.AddCommand(projectDeleteCmd.Command())
+
+	// Edit
+	projectEditCmd := cmdProjectEdit{global: c.global, project: c}
+	cmd.AddCommand(projectEditCmd.Command())
+
+	// List
+	projectListCmd := cmdProjectList{global: c.global, project: c}
+	cmd.AddCommand(projectListCmd.Command())
+
+	// Rename
+	projectRenameCmd := cmdProjectRename{global: c.global, project: c}
+	cmd.AddCommand(projectRenameCmd.Command())
+
+	// Show
+	projectShowCmd := cmdProjectShow{global: c.global, project: c}
+	cmd.AddCommand(projectShowCmd.Command())
+
+	// Set default
+	projectSwitchCmd := cmdProjectSwitch{global: c.global, project: c}
+	cmd.AddCommand(projectSwitchCmd.Command())
+
+	return cmd
+}
+
+// Create
+type cmdProjectCreate struct {
+	global  *cmdGlobal
+	project *cmdProject
+}
+
+func (c *cmdProjectCreate) Command() *cobra.Command {
+	cmd := &cobra.Command{}
+	cmd.Use = i18n.G("create [<remote>:]<project>")
+	cmd.Short = i18n.G("Create projects")
+	cmd.Long = cli.FormatSection(i18n.G("Description"), i18n.G(
+		`Create projects`))
+
+	cmd.RunE = c.Run
+
+	return cmd
+}
+
+func (c *cmdProjectCreate) Run(cmd *cobra.Command, args []string) error {
+	// Sanity checks
+	exit, err := c.global.CheckArgs(cmd, args, 1, 1)
+	if exit {
+		return err
+	}
+
+	// Parse remote
+	resources, err := c.global.ParseServers(args[0])
+	if err != nil {
+		return err
+	}
+
+	resource := resources[0]
+
+	if resource.name == "" {
+		return fmt.Errorf(i18n.G("Missing project name"))
+	}
+
+	// Create the project
+	project := api.ProjectsPost{}
+	project.Name = resource.name
+
+	err = resource.server.CreateProject(project)
+	if err != nil {
+		return err
+	}
+
+	if !c.global.flagQuiet {
+		fmt.Printf(i18n.G("Project %s created")+"\n", resource.name)
+	}
+
+	return nil
+}
+
+// Delete
+type cmdProjectDelete struct {
+	global  *cmdGlobal
+	project *cmdProject
+}
+
+func (c *cmdProjectDelete) Command() *cobra.Command {
+	cmd := &cobra.Command{}
+	cmd.Use = i18n.G("delete [<remote>:]<project>")
+	cmd.Aliases = []string{"rm"}
+	cmd.Short = i18n.G("Delete projects")
+	cmd.Long = cli.FormatSection(i18n.G("Description"), i18n.G(
+		`Delete projects`))
+
+	cmd.RunE = c.Run
+
+	return cmd
+}
+
+func (c *cmdProjectDelete) Run(cmd *cobra.Command, args []string) error {
+	// Sanity checks
+	exit, err := c.global.CheckArgs(cmd, args, 1, 1)
+	if exit {
+		return err
+	}
+
+	// Parse remote
+	resources, err := c.global.ParseServers(args[0])
+	if err != nil {
+		return err
+	}
+
+	resource := resources[0]
+
+	if resource.name == "" {
+		return fmt.Errorf(i18n.G("Missing project name"))
+	}
+
+	// Delete the project
+	err = resource.server.DeleteProject(resource.name)
+	if err != nil {
+		return err
+	}
+
+	if !c.global.flagQuiet {
+		fmt.Printf(i18n.G("Project %s deleted")+"\n", resource.name)
+	}
+
+	return nil
+}
+
+// Edit
+type cmdProjectEdit struct {
+	global  *cmdGlobal
+	project *cmdProject
+}
+
+func (c *cmdProjectEdit) Command() *cobra.Command {
+	cmd := &cobra.Command{}
+	cmd.Use = i18n.G("edit [<remote>:]<project>")
+	cmd.Short = i18n.G("Edit project configurations as YAML")
+	cmd.Long = cli.FormatSection(i18n.G("Description"), i18n.G(
+		`Edit project configurations as YAML`))
+	cmd.Example = cli.FormatSection("", i18n.G(
+		`lxc project edit <project> < project.yaml
+    Update a project using the content of project.yaml`))
+
+	cmd.RunE = c.Run
+
+	return cmd
+}
+
+func (c *cmdProjectEdit) helpTemplate() string {
+	return i18n.G(
+		`### This is a yaml representation of the project.
+### Any line starting with a '# will be ignored.
+###
+### A project consists of a set of features and a description.
+###
+### An example would look like:
+### name: my-project
+### features:
+###   images: True
+###   profiles: True
+### description: My own project
+###
+### Note that the name is shown but cannot be changed`)
+}
+
+func (c *cmdProjectEdit) Run(cmd *cobra.Command, args []string) error {
+	// Sanity checks
+	exit, err := c.global.CheckArgs(cmd, args, 1, 1)
+	if exit {
+		return err
+	}
+
+	// Parse remote
+	resources, err := c.global.ParseServers(args[0])
+	if err != nil {
+		return err
+	}
+
+	resource := resources[0]
+
+	if resource.name == "" {
+		return fmt.Errorf(i18n.G("Missing project name"))
+	}
+
+	// If stdin isn't a terminal, read text from it
+	if !termios.IsTerminal(int(syscall.Stdin)) {
+		contents, err := ioutil.ReadAll(os.Stdin)
+		if err != nil {
+			return err
+		}
+
+		newdata := api.ProjectPut{}
+		err = yaml.Unmarshal(contents, &newdata)
+		if err != nil {
+			return err
+		}
+
+		return resource.server.UpdateProject(resource.name, newdata, "")
+	}
+
+	// Extract the current value
+	project, etag, err := resource.server.GetProject(resource.name)
+	if err != nil {
+		return err
+	}
+
+	data, err := yaml.Marshal(&project)
+	if err != nil {
+		return err
+	}
+
+	// Spawn the editor
+	content, err := shared.TextEditor("", []byte(c.helpTemplate()+"\n\n"+string(data)))
+	if err != nil {
+		return err
+	}
+
+	for {
+		// Parse the text received from the editor
+		newdata := api.ProjectPut{}
+		err = yaml.Unmarshal(content, &newdata)
+		if err == nil {
+			err = resource.server.UpdateProject(resource.name, newdata, etag)
+		}
+
+		// Respawn the editor
+		if err != nil {
+			fmt.Fprintf(os.Stderr, i18n.G("Config parsing error: %s")+"\n", err)
+			fmt.Println(i18n.G("Press enter to open the editor again"))
+
+			_, err := os.Stdin.Read(make([]byte, 1))
+			if err != nil {
+				return err
+			}
+
+			content, err = shared.TextEditor("", content)
+			if err != nil {
+				return err
+			}
+			continue
+		}
+		break
+	}
+
+	return nil
+}
+
+// List
+type cmdProjectList struct {
+	global  *cmdGlobal
+	project *cmdProject
+}
+
+func (c *cmdProjectList) Command() *cobra.Command {
+	cmd := &cobra.Command{}
+	cmd.Use = i18n.G("list [<remote>:]")
+	cmd.Aliases = []string{"ls"}
+	cmd.Short = i18n.G("List projects")
+	cmd.Long = cli.FormatSection(i18n.G("Description"), i18n.G(
+		`List projects`))
+
+	cmd.RunE = c.Run
+
+	return cmd
+}
+
+func (c *cmdProjectList) Run(cmd *cobra.Command, args []string) error {
+	conf := c.global.conf
+
+	// Sanity checks
+	exit, err := c.global.CheckArgs(cmd, args, 0, 1)
+	if exit {
+		return err
+	}
+
+	// Parse remote
+	remote := conf.DefaultRemote
+	if len(args) > 0 {
+		remote = args[0]
+	}
+
+	resources, err := c.global.ParseServers(remote)
+	if err != nil {
+		return err
+	}
+
+	resource := resources[0]
+
+	// List projects
+	projects, err := resource.server.GetProjects()
+	if err != nil {
+		return err
+	}
+
+	fmt.Printf("%s: %v %s\n", remote, conf.Remotes[remote], conf.Remotes[remote].Project)
+	currentProject := conf.Remotes[remote].Project
+	if currentProject == "" {
+		currentProject = "default"
+	}
+
+	data := [][]string{}
+	for _, project := range projects {
+		images := i18n.G("NO")
+		if project.Features.Images {
+			images = i18n.G("YES")
+		}
+
+		profiles := i18n.G("NO")
+		if project.Features.Profiles {
+			profiles = i18n.G("YES")
+		}
+
+		name := project.Name
+		if name == currentProject {
+			name = fmt.Sprintf("%s (%s)", name, i18n.G("current"))
+		}
+
+		strUsedBy := fmt.Sprintf("%d", len(project.UsedBy))
+		data = append(data, []string{name, images, profiles, strUsedBy})
+	}
+
+	table := tablewriter.NewWriter(os.Stdout)
+	table.SetAutoWrapText(false)
+	table.SetAlignment(tablewriter.ALIGN_LEFT)
+	table.SetRowLine(true)
+	table.SetHeader([]string{
+		i18n.G("NAME"),
+		i18n.G("IMAGES"),
+		i18n.G("PROFILES"),
+		i18n.G("USED BY")})
+	sort.Sort(byName(data))
+	table.AppendBulk(data)
+	table.Render()
+
+	return nil
+}
+
+// Rename
+type cmdProjectRename struct {
+	global  *cmdGlobal
+	project *cmdProject
+}
+
+func (c *cmdProjectRename) Command() *cobra.Command {
+	cmd := &cobra.Command{}
+	cmd.Use = i18n.G("rename [<remote>:]<project> <new-name>")
+	cmd.Aliases = []string{"mv"}
+	cmd.Short = i18n.G("Rename projects")
+	cmd.Long = cli.FormatSection(i18n.G("Description"), i18n.G(
+		`Rename projects`))
+
+	cmd.RunE = c.Run
+
+	return cmd
+}
+
+func (c *cmdProjectRename) Run(cmd *cobra.Command, args []string) error {
+	// Sanity checks
+	exit, err := c.global.CheckArgs(cmd, args, 2, 2)
+	if exit {
+		return err
+	}
+
+	// Parse remote
+	resources, err := c.global.ParseServers(args[0])
+	if err != nil {
+		return err
+	}
+
+	resource := resources[0]
+
+	if resource.name == "" {
+		return fmt.Errorf(i18n.G("Missing project name"))
+	}
+
+	// Rename the project
+	op, err := resource.server.RenameProject(resource.name, api.ProjectPost{Name: args[1]})
+	if err != nil {
+		return err
+	}
+
+	err = op.Wait()
+	if err != nil {
+		return err
+	}
+
+	if !c.global.flagQuiet {
+		fmt.Printf(i18n.G("Project %s renamed to %s")+"\n", resource.name, args[1])
+	}
+
+	return nil
+}
+
+// Show
+type cmdProjectShow struct {
+	global  *cmdGlobal
+	project *cmdProject
+}
+
+func (c *cmdProjectShow) Command() *cobra.Command {
+	cmd := &cobra.Command{}
+	cmd.Use = i18n.G("show [<remote>:]<project>")
+	cmd.Short = i18n.G("Show project options")
+	cmd.Long = cli.FormatSection(i18n.G("Description"), i18n.G(
+		`Show project options`))
+
+	cmd.RunE = c.Run
+
+	return cmd
+}
+
+func (c *cmdProjectShow) Run(cmd *cobra.Command, args []string) error {
+	// Sanity checks
+	exit, err := c.global.CheckArgs(cmd, args, 1, 1)
+	if exit {
+		return err
+	}
+
+	// Parse remote
+	resources, err := c.global.ParseServers(args[0])
+	if err != nil {
+		return err
+	}
+
+	resource := resources[0]
+
+	if resource.name == "" {
+		return fmt.Errorf(i18n.G("Missing project name"))
+	}
+
+	// Show the project
+	project, _, err := resource.server.GetProject(resource.name)
+	if err != nil {
+		return err
+	}
+
+	data, err := yaml.Marshal(&project)
+	if err != nil {
+		return err
+	}
+
+	fmt.Printf("%s", data)
+
+	return nil
+}
+
+// Switch project
+type cmdProjectSwitch struct {
+	global  *cmdGlobal
+	project *cmdProject
+}
+
+func (c *cmdProjectSwitch) Command() *cobra.Command {
+	cmd := &cobra.Command{}
+	cmd.Use = i18n.G("switch [<remote>:] <project>")
+	cmd.Short = i18n.G("Switch the current project")
+	cmd.Long = cli.FormatSection(i18n.G("Description"), i18n.G(
+		`Switch the current project`))
+
+	cmd.RunE = c.Run
+
+	return cmd
+}
+
+func (c *cmdProjectSwitch) Run(cmd *cobra.Command, args []string) error {
+	conf := c.global.conf
+
+	// Sanity checks
+	exit, err := c.global.CheckArgs(cmd, args, 1, 2)
+	if exit {
+		return err
+	}
+
+	remote := conf.DefaultRemote
+	project := args[0]
+	if len(args) > 1 {
+		remote = args[0]
+		project = args[1]
+	}
+
+	// make sure the remote exists
+	rc, ok := conf.Remotes[remote]
+	if !ok {
+		return fmt.Errorf(i18n.G("Remote %s doesn't exist"), remote)
+	}
+
+	rc.Project = project
+
+	conf.Remotes[remote] = rc
+
+	return conf.SaveConfig(c.global.confPath)
+}

From b95f43ee9f6745030aa82d5ed5d2687a2f19c48a Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Fri, 31 Aug 2018 10:27:49 -0700
Subject: [PATCH 11/12] i18n: Update translation templates
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
 po/de.po      | 210 +++++++++++++++++++++++++++++++++++++++++--------
 po/el.po      | 179 ++++++++++++++++++++++++++++++++++--------
 po/es.po      | 195 +++++++++++++++++++++++++++++++++++++--------
 po/fa.po      | 179 ++++++++++++++++++++++++++++++++++--------
 po/fi.po      | 179 ++++++++++++++++++++++++++++++++++--------
 po/fr.po      | 213 ++++++++++++++++++++++++++++++++++++++++++--------
 po/hi.po      | 179 ++++++++++++++++++++++++++++++++++--------
 po/id.po      | 179 ++++++++++++++++++++++++++++++++++--------
 po/it.po      | 195 +++++++++++++++++++++++++++++++++++++--------
 po/ja.po      | 196 ++++++++++++++++++++++++++++++++++++++--------
 po/ko.po      | 179 ++++++++++++++++++++++++++++++++++--------
 po/lxd.pot    | 166 ++++++++++++++++++++++++++++++++-------
 po/nb_NO.po   | 179 ++++++++++++++++++++++++++++++++++--------
 po/nl.po      | 179 ++++++++++++++++++++++++++++++++++--------
 po/pa.po      | 179 ++++++++++++++++++++++++++++++++++--------
 po/pl.po      | 179 ++++++++++++++++++++++++++++++++++--------
 po/pt_BR.po   | 195 +++++++++++++++++++++++++++++++++++++--------
 po/ru.po      | 206 ++++++++++++++++++++++++++++++++++++++++--------
 po/sr.po      | 179 ++++++++++++++++++++++++++++++++++--------
 po/sv.po      | 179 ++++++++++++++++++++++++++++++++++--------
 po/tr.po      | 179 ++++++++++++++++++++++++++++++++++--------
 po/uk.po      | 179 ++++++++++++++++++++++++++++++++++--------
 po/zh.po      | 179 ++++++++++++++++++++++++++++++++++--------
 po/zh_Hans.po | 179 ++++++++++++++++++++++++++++++++++--------
 24 files changed, 3698 insertions(+), 742 deletions(-)

diff --git a/po/de.po b/po/de.po
index 40246e0c2f..534f768e09 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: 2018-08-23 15:14-0400\n"
+"POT-Creation-Date: 2018-09-02 06:35+0000\n"
 "PO-Revision-Date: 2018-06-05 04:58+0000\n"
 "Last-Translator: Krombel <krombel at krombel.de>\n"
 "Language-Team: German <https://hosted.weblate.org/projects/linux-containers/"
@@ -253,6 +253,41 @@ msgstr ""
 "###\n"
 "### Der Name wird zwar angezeigt, lässt sich jedoch nicht ändern.\n"
 
+#: lxc/project.go:189
+#, fuzzy
+msgid ""
+"### This is a yaml representation of the project.\n"
+"### Any line starting with a '# will be ignored.\n"
+"###\n"
+"### A project consists of a set of features and a description.\n"
+"###\n"
+"### An example would look like:\n"
+"### name: my-project\n"
+"### features:\n"
+"###   images: True\n"
+"###   profiles: True\n"
+"### description: My own project\n"
+"###\n"
+"### Note that the name is shown but cannot be changed"
+msgstr ""
+"### Dies ist eine Darstellung eines Profils in yaml.\n"
+"### Jede Zeile die mit '# beginnt wird ignoriert.\n"
+"###\n"
+"### Ein Profil besteht aus mehreren Konfigurationselementen gefolgt von\n"
+"### mehrere Geräten.\n"
+"###\n"
+"### Zum Beispiel:\n"
+"### name: onenic\n"
+"### config:\n"
+"###   raw.lxc: lxc.aa_profile=unconfined\n"
+"### devices:\n"
+"###   eth0:\n"
+"###     nictype: bridged\n"
+"###     parent: lxdbr0\n"
+"###     type: nic\n"
+"###\n"
+"### Der Name wird zwar angezeigt, lässt sich jedoch nicht ändern.\n"
+
 #: lxc/image.go:966
 #, c-format
 msgid "%s (%d more)"
@@ -576,8 +611,8 @@ msgid "Config key/value to apply to the target container"
 msgstr "kann nicht zum selben Container Namen kopieren"
 
 #: lxc/config.go:195 lxc/config.go:259 lxc/config_metadata.go:144
-#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/storage.go:303
-#: lxc/storage_volume.go:816
+#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/project.go:267
+#: lxc/storage.go:303 lxc/storage_volume.go:816
 #, fuzzy, c-format
 msgid "Config parsing error: %s"
 msgstr "YAML Analyse Fehler %v\n"
@@ -706,6 +741,11 @@ msgstr ""
 msgid "Create profiles"
 msgstr "Fehlerhafte Profil URL %s"
 
+#: lxc/project.go:72 lxc/project.go:73
+#, fuzzy
+msgid "Create projects"
+msgstr "Fehlerhafte Profil URL %s"
+
 #: lxc/storage.go:88 lxc/storage.go:89
 #, fuzzy
 msgid "Create storage pools"
@@ -782,6 +822,11 @@ msgstr ""
 msgid "Delete profiles"
 msgstr ""
 
+#: lxc/project.go:126 lxc/project.go:127
+#, fuzzy
+msgid "Delete projects"
+msgstr "Fehlerhafte Profil URL %s"
+
 #: lxc/storage.go:162 lxc/storage.go:163
 msgid "Delete storage pools"
 msgstr ""
@@ -809,7 +854,7 @@ msgstr "Kein Zertifikat für diese Verbindung"
 #: lxc/file.go:42 lxc/file.go:75 lxc/file.go:124 lxc/file.go:187
 #: lxc/file.go:377 lxc/image.go:42 lxc/image.go:131 lxc/image.go:265
 #: lxc/image.go:316 lxc/image.go:439 lxc/image.go:579 lxc/image.go:788
-#: lxc/image.go:902 lxc/image.go:1224 lxc/image.go:1301 lxc/image_alias.go:26
+#: lxc/image.go:902 lxc/image.go:1225 lxc/image.go:1302 lxc/image_alias.go:26
 #: lxc/image_alias.go:59 lxc/image_alias.go:106 lxc/image_alias.go:149
 #: lxc/image_alias.go:250 lxc/import.go:25 lxc/info.go:29 lxc/init.go:35
 #: lxc/launch.go:22 lxc/list.go:48 lxc/main.go:48 lxc/manpage.go:19
@@ -822,7 +867,9 @@ msgstr "Kein Zertifikat für diese Verbindung"
 #: lxc/profile.go:30 lxc/profile.go:102 lxc/profile.go:165 lxc/profile.go:245
 #: lxc/profile.go:301 lxc/profile.go:355 lxc/profile.go:405 lxc/profile.go:529
 #: lxc/profile.go:577 lxc/profile.go:641 lxc/profile.go:717 lxc/profile.go:767
-#: lxc/profile.go:826 lxc/profile.go:880 lxc/publish.go:34 lxc/query.go:30
+#: lxc/profile.go:826 lxc/profile.go:880 lxc/project.go:29 lxc/project.go:73
+#: lxc/project.go:127 lxc/project.go:177 lxc/project.go:298 lxc/project.go:388
+#: lxc/project.go:443 lxc/project.go:496 lxc/publish.go:34 lxc/query.go:30
 #: lxc/remote.go:37 lxc/remote.go:87 lxc/remote.go:383 lxc/remote.go:419
 #: lxc/remote.go:524 lxc/remote.go:586 lxc/remote.go:636 lxc/remote.go:674
 #: lxc/rename.go:21 lxc/restore.go:24 lxc/snapshot.go:21 lxc/storage.go:33
@@ -934,6 +981,10 @@ msgstr ""
 msgid "Edit profile configurations as YAML"
 msgstr ""
 
+#: lxc/project.go:176 lxc/project.go:177
+msgid "Edit project configurations as YAML"
+msgstr ""
+
 #: lxc/storage.go:212 lxc/storage.go:213
 msgid "Edit storage pool configurations as YAML"
 msgstr ""
@@ -1054,7 +1105,7 @@ msgstr ""
 msgid "FINGERPRINT"
 msgstr "FINGERABDRUCK"
 
-#: lxc/move.go:213
+#: lxc/move.go:214
 #, fuzzy
 msgid "Failed to connect to cluster member"
 msgstr "kann nicht zum selben Container Namen kopieren"
@@ -1165,6 +1216,10 @@ msgstr ""
 msgid "ID"
 msgstr ""
 
+#: lxc/project.go:367
+msgid "IMAGES"
+msgstr ""
+
 #: lxc/network.go:964
 msgid "IP ADDRESS"
 msgstr ""
@@ -1181,7 +1236,7 @@ msgstr ""
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:301
+#: lxc/main.go:305
 msgid ""
 "If this is your first time running LXD on this machine, you should also run: "
 "lxd init"
@@ -1192,7 +1247,7 @@ msgstr ""
 msgid "Ignore the container state"
 msgstr "Herunterfahren des Containers erzwingen."
 
-#: lxc/image.go:1284
+#: lxc/image.go:1285
 msgid "Image already up to date."
 msgstr ""
 
@@ -1204,7 +1259,7 @@ msgstr ""
 msgid "Image exported successfully!"
 msgstr ""
 
-#: lxc/image.go:288 lxc/image.go:1247
+#: lxc/image.go:288 lxc/image.go:1248
 msgid "Image identifier missing"
 msgstr ""
 
@@ -1218,7 +1273,7 @@ msgstr "Abbild mit Fingerabdruck %s importiert\n"
 msgid "Image imported with fingerprint: %s"
 msgstr "Abbild mit Fingerabdruck %s importiert\n"
 
-#: lxc/image.go:1282
+#: lxc/image.go:1283
 msgid "Image refreshed successfully!"
 msgstr ""
 
@@ -1275,7 +1330,7 @@ msgstr ""
 msgid "Invalid config key column format (too many fields): '%s'"
 msgstr ""
 
-#: lxc/image.go:1208 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
+#: lxc/image.go:1209 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
 #, fuzzy, c-format
 msgid "Invalid format %q"
 msgstr "Ungültiges Ziel %s"
@@ -1296,7 +1351,7 @@ msgid ""
 "Invalid name in '%s', empty string is only allowed when defining maxWidth"
 msgstr ""
 
-#: lxc/main.go:389
+#: lxc/main.go:393
 #, fuzzy
 msgid "Invalid number of arguments"
 msgstr "ungültiges Argument %s"
@@ -1512,6 +1567,10 @@ msgstr ""
 msgid "List profiles"
 msgstr ""
 
+#: lxc/project.go:297 lxc/project.go:298
+msgid "List projects"
+msgstr ""
+
 #: lxc/storage_volume.go:911 lxc/storage_volume.go:912
 #, fuzzy
 msgid "List storage volumes"
@@ -1639,6 +1698,11 @@ msgstr ""
 msgid "Manage profiles"
 msgstr "Fehlerhafte Profil URL %s"
 
+#: lxc/project.go:28 lxc/project.go:29
+#, fuzzy
+msgid "Manage projects"
+msgstr "Fehlerhafte Profil URL %s"
+
 #: lxc/storage.go:32 lxc/storage.go:33
 #, fuzzy
 msgid "Manage storage pools and volumes"
@@ -1687,11 +1751,11 @@ msgstr ""
 msgid "Memory usage:"
 msgstr ""
 
-#: lxc/move.go:226
+#: lxc/move.go:227
 msgid "Migration API failure"
 msgstr ""
 
-#: lxc/move.go:231
+#: lxc/move.go:232
 msgid "Migration operation failure"
 msgstr ""
 
@@ -1743,6 +1807,12 @@ msgstr "Profilname kann nicht geändert werden"
 msgid "Missing profile name"
 msgstr ""
 
+#: lxc/project.go:97 lxc/project.go:151 lxc/project.go:221 lxc/project.go:412
+#: lxc/project.go:467
+#, fuzzy
+msgid "Missing project name"
+msgstr "Profilname kann nicht geändert werden"
+
 #: lxc/profile.go:270
 msgid "Missing source profile name"
 msgstr ""
@@ -1807,11 +1877,13 @@ msgid "Must supply container name for: "
 msgstr "der Name des Ursprung Containers muss angegeben werden"
 
 #: lxc/cluster.go:124 lxc/list.go:459 lxc/network.go:858 lxc/profile.go:622
-#: lxc/remote.go:465 lxc/storage.go:549 lxc/storage_volume.go:960
+#: lxc/project.go:366 lxc/remote.go:465 lxc/storage.go:549
+#: lxc/storage_volume.go:960
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:844 lxc/operation.go:141 lxc/remote.go:440 lxc/remote.go:445
+#: lxc/network.go:844 lxc/operation.go:141 lxc/project.go:342
+#: lxc/project.go:347 lxc/remote.go:440 lxc/remote.go:445
 msgid "NO"
 msgstr ""
 
@@ -1922,7 +1994,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:462
+#: lxc/list.go:462 lxc/project.go:368
 msgid "PROFILES"
 msgstr ""
 
@@ -1952,7 +2024,7 @@ msgstr "kann nicht zum selben Container Namen kopieren"
 msgid "Pid: %d"
 msgstr ""
 
-#: lxc/network.go:643 lxc/profile.go:500 lxc/storage.go:304
+#: lxc/network.go:643 lxc/profile.go:500 lxc/project.go:268 lxc/storage.go:304
 #: lxc/storage_volume.go:817
 msgid "Press enter to open the editor again"
 msgstr ""
@@ -2038,6 +2110,21 @@ msgstr "Profil %s wurde auf %s angewandt\n"
 msgid "Profiles: %s"
 msgstr "Profil %s erstellt\n"
 
+#: lxc/project.go:110
+#, fuzzy, c-format
+msgid "Project %s created"
+msgstr "Profil %s erstellt\n"
+
+#: lxc/project.go:161
+#, fuzzy, c-format
+msgid "Project %s deleted"
+msgstr "Profil %s gelöscht\n"
+
+#: lxc/project.go:427
+#, fuzzy, c-format
+msgid "Project %s renamed to %s"
+msgstr "Profil %s wurde auf %s angewandt\n"
+
 #: lxc/image.go:861
 #, fuzzy
 msgid "Properties:"
@@ -2081,11 +2168,11 @@ msgstr ""
 msgid "Recursively transfer files"
 msgstr ""
 
-#: lxc/image.go:1223 lxc/image.go:1224
+#: lxc/image.go:1224 lxc/image.go:1225
 msgid "Refresh images"
 msgstr ""
 
-#: lxc/image.go:1252
+#: lxc/image.go:1253
 #, c-format
 msgid "Refreshing the image: %s"
 msgstr ""
@@ -2095,7 +2182,8 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr "entfernte Instanz %s existiert bereits"
 
-#: lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656 lxc/remote.go:694
+#: lxc/project.go:523 lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656
+#: lxc/remote.go:694
 #, fuzzy, c-format
 msgid "Remote %s doesn't exist"
 msgstr "entfernte Instanz %s existiert nicht"
@@ -2179,6 +2267,11 @@ msgstr ""
 msgid "Rename profiles"
 msgstr "Fehlerhafte Profil URL %s"
 
+#: lxc/project.go:387 lxc/project.go:388
+#, fuzzy
+msgid "Rename projects"
+msgstr "Fehlerhafte Profil URL %s"
+
 #: lxc/remote.go:523 lxc/remote.go:524
 msgid "Rename remotes"
 msgstr ""
@@ -2375,11 +2468,11 @@ msgstr ""
 msgid "Show full device configuration for containers or profiles"
 msgstr ""
 
-#: lxc/image.go:1300 lxc/image.go:1301
+#: lxc/image.go:1301 lxc/image.go:1302
 msgid "Show image properties"
 msgstr ""
 
-#: lxc/main.go:215 lxc/main.go:216
+#: lxc/main.go:219 lxc/main.go:220
 msgid "Show less common commands"
 msgstr ""
 
@@ -2395,6 +2488,10 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
+#: lxc/project.go:442 lxc/project.go:443
+msgid "Show project options"
+msgstr ""
+
 #: lxc/storage.go:649 lxc/storage.go:650
 msgid "Show storage pool configurations and resources"
 msgstr ""
@@ -2550,6 +2647,10 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
+#: lxc/project.go:495 lxc/project.go:496
+msgid "Switch the current project"
+msgstr ""
+
 #: lxc/remote.go:635 lxc/remote.go:636
 msgid "Switch the default remote"
 msgstr ""
@@ -2615,7 +2716,7 @@ msgstr ""
 msgid "The profile device doesn't exist"
 msgstr "entfernte Instanz %s existiert nicht"
 
-#: lxc/move.go:218
+#: lxc/move.go:219
 msgid "The source LXD instance is not clustered"
 msgstr ""
 
@@ -2656,7 +2757,7 @@ msgstr ""
 msgid "To detach from the console, press: <ctrl>+a q"
 msgstr ""
 
-#: lxc/main.go:304
+#: lxc/main.go:308
 msgid "To start your first container, try: lxc launch ubuntu:18.04"
 msgstr ""
 
@@ -2707,7 +2808,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:862 lxc/profile.go:623 lxc/storage.go:558
+#: lxc/network.go:862 lxc/profile.go:623 lxc/project.go:369 lxc/storage.go:558
 #: lxc/storage_volume.go:962
 msgid "USED BY"
 msgstr ""
@@ -2797,7 +2898,8 @@ msgstr ""
 msgid "Whether or not to snapshot the container's running state"
 msgstr "Zustand des laufenden Containers sichern oder nicht"
 
-#: lxc/network.go:846 lxc/operation.go:143 lxc/remote.go:442 lxc/remote.go:447
+#: lxc/network.go:846 lxc/operation.go:143 lxc/project.go:344
+#: lxc/project.go:349 lxc/remote.go:442 lxc/remote.go:447
 msgid "YES"
 msgstr ""
 
@@ -2815,7 +2917,7 @@ msgstr "kann nicht zum selben Container Namen kopieren"
 msgid "You must specify a destination container name when using --target"
 msgstr "der Name des Ursprung Containers muss angegeben werden"
 
-#: lxc/copy.go:72 lxc/move.go:202
+#: lxc/copy.go:72 lxc/move.go:203
 #, fuzzy
 msgid "You must specify a source container name"
 msgstr "der Name des Ursprung Containers muss angegeben werden"
@@ -2921,6 +3023,14 @@ msgstr ""
 msgid "create [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:71
+msgid "create [<remote>:]<project>"
+msgstr ""
+
+#: lxc/project.go:354
+msgid "current"
+msgstr ""
+
 #: lxc/remote.go:459
 msgid "default"
 msgstr ""
@@ -2980,6 +3090,14 @@ msgstr ""
 msgid "delete [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:124
+#, fuzzy
+msgid "delete [<remote>:]<project>"
+msgstr ""
+"Ändert den Laufzustand eines Containers in %s.\n"
+"\n"
+"lxd %s <Name>\n"
+
 #: lxc/storage.go:436
 msgid "description"
 msgstr ""
@@ -3048,6 +3166,10 @@ msgstr ""
 msgid "edit [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:175
+msgid "edit [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:86
 msgid "edit [<remote>:][<container>]"
 msgstr ""
@@ -3162,7 +3284,7 @@ msgid "list"
 msgstr ""
 
 #: lxc/cluster.go:61 lxc/config_trust.go:112 lxc/network.go:796
-#: lxc/operation.go:98 lxc/profile.go:574 lxc/storage.go:493
+#: lxc/operation.go:98 lxc/profile.go:574 lxc/project.go:295 lxc/storage.go:493
 msgid "list [<remote>:]"
 msgstr ""
 
@@ -3351,6 +3473,12 @@ msgid ""
 "    Update a profile using the content of profile.yaml"
 msgstr ""
 
+#: lxc/project.go:179
+msgid ""
+"lxc project edit <project> < project.yaml\n"
+"    Update a project using the content of project.yaml"
+msgstr ""
+
 #: lxc/query.go:32
 msgid ""
 "lxc query -X DELETE --wait /1.0/containers/c1\n"
@@ -3465,6 +3593,10 @@ msgstr ""
 msgid "profile"
 msgstr "Profil %s erstellt\n"
 
+#: lxc/project.go:27
+msgid "project"
+msgstr ""
+
 #: lxc/publish.go:32
 msgid ""
 "publish [<remote>:]<container>[/<snapshot>] [<remote>:] [flags] "
@@ -3496,7 +3628,7 @@ msgstr ""
 msgid "query [<remote>:]<API path>"
 msgstr ""
 
-#: lxc/image.go:1222
+#: lxc/image.go:1223
 #, fuzzy
 msgid "refresh [<remote>:]<image> [[<remote>:]<image>...]"
 msgstr ""
@@ -3569,6 +3701,10 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
+#: lxc/project.go:385
+msgid "rename [<remote>:]<project> <new-name>"
+msgstr ""
+
 #: lxc/action.go:68
 #, fuzzy
 msgid "restart [<remote>:]<container> [[<remote>:]<container>...]"
@@ -3621,7 +3757,7 @@ msgstr ""
 msgid "show [<remote>:]<container|profile>"
 msgstr ""
 
-#: lxc/image.go:1299
+#: lxc/image.go:1300
 msgid "show [<remote>:]<image>"
 msgstr ""
 
@@ -3649,6 +3785,10 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:441
+msgid "show [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:450
 msgid "show [<remote>:][<container>]"
 msgstr ""
@@ -3693,6 +3833,14 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
+#: lxc/project.go:494
+#, fuzzy
+msgid "switch [<remote>:] <project>"
+msgstr ""
+"Ändert den Laufzustand eines Containers in %s.\n"
+"\n"
+"lxd %s <Name>\n"
+
 #: lxc/info.go:255
 #, c-format
 msgid "taken at %s"
diff --git a/po/el.po b/po/el.po
index 0a08c99daf..41f9d38839 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: 2018-08-23 15:14-0400\n"
+"POT-Creation-Date: 2018-09-02 06:35+0000\n"
 "PO-Revision-Date: 2017-02-14 08:00+0000\n"
 "Last-Translator: Simos Xenitellis <simos.65 at gmail.com>\n"
 "Language-Team: Greek <https://hosted.weblate.org/projects/linux-containers/"
@@ -146,6 +146,23 @@ msgid ""
 "### Note that the name is shown but cannot be changed"
 msgstr ""
 
+#: lxc/project.go:189
+msgid ""
+"### This is a yaml representation of the project.\n"
+"### Any line starting with a '# will be ignored.\n"
+"###\n"
+"### A project consists of a set of features and a description.\n"
+"###\n"
+"### An example would look like:\n"
+"### name: my-project\n"
+"### features:\n"
+"###   images: True\n"
+"###   profiles: True\n"
+"### description: My own project\n"
+"###\n"
+"### Note that the name is shown but cannot be changed"
+msgstr ""
+
 #: lxc/image.go:966
 #, c-format
 msgid "%s (%d more)"
@@ -457,8 +474,8 @@ msgid "Config key/value to apply to the target container"
 msgstr ""
 
 #: lxc/config.go:195 lxc/config.go:259 lxc/config_metadata.go:144
-#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/storage.go:303
-#: lxc/storage_volume.go:816
+#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/project.go:267
+#: lxc/storage.go:303 lxc/storage_volume.go:816
 #, c-format
 msgid "Config parsing error: %s"
 msgstr ""
@@ -579,6 +596,10 @@ msgstr ""
 msgid "Create profiles"
 msgstr ""
 
+#: lxc/project.go:72 lxc/project.go:73
+msgid "Create projects"
+msgstr ""
+
 #: lxc/storage.go:88 lxc/storage.go:89
 msgid "Create storage pools"
 msgstr ""
@@ -650,6 +671,10 @@ msgstr ""
 msgid "Delete profiles"
 msgstr ""
 
+#: lxc/project.go:126 lxc/project.go:127
+msgid "Delete projects"
+msgstr ""
+
 #: lxc/storage.go:162 lxc/storage.go:163
 msgid "Delete storage pools"
 msgstr ""
@@ -676,7 +701,7 @@ msgstr ""
 #: lxc/file.go:42 lxc/file.go:75 lxc/file.go:124 lxc/file.go:187
 #: lxc/file.go:377 lxc/image.go:42 lxc/image.go:131 lxc/image.go:265
 #: lxc/image.go:316 lxc/image.go:439 lxc/image.go:579 lxc/image.go:788
-#: lxc/image.go:902 lxc/image.go:1224 lxc/image.go:1301 lxc/image_alias.go:26
+#: lxc/image.go:902 lxc/image.go:1225 lxc/image.go:1302 lxc/image_alias.go:26
 #: lxc/image_alias.go:59 lxc/image_alias.go:106 lxc/image_alias.go:149
 #: lxc/image_alias.go:250 lxc/import.go:25 lxc/info.go:29 lxc/init.go:35
 #: lxc/launch.go:22 lxc/list.go:48 lxc/main.go:48 lxc/manpage.go:19
@@ -689,7 +714,9 @@ msgstr ""
 #: lxc/profile.go:30 lxc/profile.go:102 lxc/profile.go:165 lxc/profile.go:245
 #: lxc/profile.go:301 lxc/profile.go:355 lxc/profile.go:405 lxc/profile.go:529
 #: lxc/profile.go:577 lxc/profile.go:641 lxc/profile.go:717 lxc/profile.go:767
-#: lxc/profile.go:826 lxc/profile.go:880 lxc/publish.go:34 lxc/query.go:30
+#: lxc/profile.go:826 lxc/profile.go:880 lxc/project.go:29 lxc/project.go:73
+#: lxc/project.go:127 lxc/project.go:177 lxc/project.go:298 lxc/project.go:388
+#: lxc/project.go:443 lxc/project.go:496 lxc/publish.go:34 lxc/query.go:30
 #: lxc/remote.go:37 lxc/remote.go:87 lxc/remote.go:383 lxc/remote.go:419
 #: lxc/remote.go:524 lxc/remote.go:586 lxc/remote.go:636 lxc/remote.go:674
 #: lxc/rename.go:21 lxc/restore.go:24 lxc/snapshot.go:21 lxc/storage.go:33
@@ -799,6 +826,10 @@ msgstr ""
 msgid "Edit profile configurations as YAML"
 msgstr ""
 
+#: lxc/project.go:176 lxc/project.go:177
+msgid "Edit project configurations as YAML"
+msgstr ""
+
 #: lxc/storage.go:212 lxc/storage.go:213
 msgid "Edit storage pool configurations as YAML"
 msgstr ""
@@ -913,7 +944,7 @@ msgstr ""
 msgid "FINGERPRINT"
 msgstr ""
 
-#: lxc/move.go:213
+#: lxc/move.go:214
 msgid "Failed to connect to cluster member"
 msgstr ""
 
@@ -1017,6 +1048,10 @@ msgstr ""
 msgid "ID"
 msgstr ""
 
+#: lxc/project.go:367
+msgid "IMAGES"
+msgstr ""
+
 #: lxc/network.go:964
 msgid "IP ADDRESS"
 msgstr ""
@@ -1033,7 +1068,7 @@ msgstr ""
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:301
+#: lxc/main.go:305
 msgid ""
 "If this is your first time running LXD on this machine, you should also run: "
 "lxd init"
@@ -1043,7 +1078,7 @@ msgstr ""
 msgid "Ignore the container state"
 msgstr ""
 
-#: lxc/image.go:1284
+#: lxc/image.go:1285
 msgid "Image already up to date."
 msgstr ""
 
@@ -1055,7 +1090,7 @@ msgstr ""
 msgid "Image exported successfully!"
 msgstr ""
 
-#: lxc/image.go:288 lxc/image.go:1247
+#: lxc/image.go:288 lxc/image.go:1248
 msgid "Image identifier missing"
 msgstr ""
 
@@ -1069,7 +1104,7 @@ msgstr ""
 msgid "Image imported with fingerprint: %s"
 msgstr ""
 
-#: lxc/image.go:1282
+#: lxc/image.go:1283
 msgid "Image refreshed successfully!"
 msgstr ""
 
@@ -1124,7 +1159,7 @@ msgstr ""
 msgid "Invalid config key column format (too many fields): '%s'"
 msgstr ""
 
-#: lxc/image.go:1208 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
+#: lxc/image.go:1209 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
 #, c-format
 msgid "Invalid format %q"
 msgstr ""
@@ -1145,7 +1180,7 @@ msgid ""
 "Invalid name in '%s', empty string is only allowed when defining maxWidth"
 msgstr ""
 
-#: lxc/main.go:389
+#: lxc/main.go:393
 msgid "Invalid number of arguments"
 msgstr ""
 
@@ -1341,6 +1376,10 @@ msgstr ""
 msgid "List profiles"
 msgstr ""
 
+#: lxc/project.go:297 lxc/project.go:298
+msgid "List projects"
+msgstr ""
+
 #: lxc/storage_volume.go:911 lxc/storage_volume.go:912
 msgid "List storage volumes"
 msgstr ""
@@ -1459,6 +1498,10 @@ msgstr ""
 msgid "Manage profiles"
 msgstr ""
 
+#: lxc/project.go:28 lxc/project.go:29
+msgid "Manage projects"
+msgstr ""
+
 #: lxc/storage.go:32 lxc/storage.go:33
 msgid "Manage storage pools and volumes"
 msgstr ""
@@ -1506,11 +1549,11 @@ msgstr ""
 msgid "Memory usage:"
 msgstr "  Χρήση μνήμης:"
 
-#: lxc/move.go:226
+#: lxc/move.go:227
 msgid "Migration API failure"
 msgstr ""
 
-#: lxc/move.go:231
+#: lxc/move.go:232
 msgid "Migration operation failure"
 msgstr ""
 
@@ -1558,6 +1601,11 @@ msgstr ""
 msgid "Missing profile name"
 msgstr ""
 
+#: lxc/project.go:97 lxc/project.go:151 lxc/project.go:221 lxc/project.go:412
+#: lxc/project.go:467
+msgid "Missing project name"
+msgstr ""
+
 #: lxc/profile.go:270
 msgid "Missing source profile name"
 msgstr ""
@@ -1616,11 +1664,13 @@ msgid "Must supply container name for: "
 msgstr ""
 
 #: lxc/cluster.go:124 lxc/list.go:459 lxc/network.go:858 lxc/profile.go:622
-#: lxc/remote.go:465 lxc/storage.go:549 lxc/storage_volume.go:960
+#: lxc/project.go:366 lxc/remote.go:465 lxc/storage.go:549
+#: lxc/storage_volume.go:960
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:844 lxc/operation.go:141 lxc/remote.go:440 lxc/remote.go:445
+#: lxc/network.go:844 lxc/operation.go:141 lxc/project.go:342
+#: lxc/project.go:347 lxc/remote.go:440 lxc/remote.go:445
 msgid "NO"
 msgstr ""
 
@@ -1728,7 +1778,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:462
+#: lxc/list.go:462 lxc/project.go:368
 msgid "PROFILES"
 msgstr ""
 
@@ -1757,7 +1807,7 @@ msgstr ""
 msgid "Pid: %d"
 msgstr ""
 
-#: lxc/network.go:643 lxc/profile.go:500 lxc/storage.go:304
+#: lxc/network.go:643 lxc/profile.go:500 lxc/project.go:268 lxc/storage.go:304
 #: lxc/storage_volume.go:817
 msgid "Press enter to open the editor again"
 msgstr ""
@@ -1841,6 +1891,21 @@ msgstr ""
 msgid "Profiles: %s"
 msgstr ""
 
+#: lxc/project.go:110
+#, c-format
+msgid "Project %s created"
+msgstr ""
+
+#: lxc/project.go:161
+#, c-format
+msgid "Project %s deleted"
+msgstr ""
+
+#: lxc/project.go:427
+#, c-format
+msgid "Project %s renamed to %s"
+msgstr ""
+
 #: lxc/image.go:861
 msgid "Properties:"
 msgstr ""
@@ -1880,11 +1945,11 @@ msgstr ""
 msgid "Recursively transfer files"
 msgstr ""
 
-#: lxc/image.go:1223 lxc/image.go:1224
+#: lxc/image.go:1224 lxc/image.go:1225
 msgid "Refresh images"
 msgstr ""
 
-#: lxc/image.go:1252
+#: lxc/image.go:1253
 #, c-format
 msgid "Refreshing the image: %s"
 msgstr ""
@@ -1894,7 +1959,8 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656 lxc/remote.go:694
+#: lxc/project.go:523 lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656
+#: lxc/remote.go:694
 #, c-format
 msgid "Remote %s doesn't exist"
 msgstr ""
@@ -1972,6 +2038,10 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
+#: lxc/project.go:387 lxc/project.go:388
+msgid "Rename projects"
+msgstr ""
+
 #: lxc/remote.go:523 lxc/remote.go:524
 msgid "Rename remotes"
 msgstr ""
@@ -2157,11 +2227,11 @@ msgstr ""
 msgid "Show full device configuration for containers or profiles"
 msgstr ""
 
-#: lxc/image.go:1300 lxc/image.go:1301
+#: lxc/image.go:1301 lxc/image.go:1302
 msgid "Show image properties"
 msgstr ""
 
-#: lxc/main.go:215 lxc/main.go:216
+#: lxc/main.go:219 lxc/main.go:220
 msgid "Show less common commands"
 msgstr ""
 
@@ -2177,6 +2247,10 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
+#: lxc/project.go:442 lxc/project.go:443
+msgid "Show project options"
+msgstr ""
+
 #: lxc/storage.go:649 lxc/storage.go:650
 msgid "Show storage pool configurations and resources"
 msgstr ""
@@ -2324,6 +2398,10 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
+#: lxc/project.go:495 lxc/project.go:496
+msgid "Switch the current project"
+msgstr ""
+
 #: lxc/remote.go:635 lxc/remote.go:636
 msgid "Switch the default remote"
 msgstr ""
@@ -2386,7 +2464,7 @@ msgstr ""
 msgid "The profile device doesn't exist"
 msgstr ""
 
-#: lxc/move.go:218
+#: lxc/move.go:219
 msgid "The source LXD instance is not clustered"
 msgstr ""
 
@@ -2423,7 +2501,7 @@ msgstr ""
 msgid "To detach from the console, press: <ctrl>+a q"
 msgstr ""
 
-#: lxc/main.go:304
+#: lxc/main.go:308
 msgid "To start your first container, try: lxc launch ubuntu:18.04"
 msgstr ""
 
@@ -2474,7 +2552,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:862 lxc/profile.go:623 lxc/storage.go:558
+#: lxc/network.go:862 lxc/profile.go:623 lxc/project.go:369 lxc/storage.go:558
 #: lxc/storage_volume.go:962
 msgid "USED BY"
 msgstr ""
@@ -2559,7 +2637,8 @@ msgstr ""
 msgid "Whether or not to snapshot the container's running state"
 msgstr ""
 
-#: lxc/network.go:846 lxc/operation.go:143 lxc/remote.go:442 lxc/remote.go:447
+#: lxc/network.go:846 lxc/operation.go:143 lxc/project.go:344
+#: lxc/project.go:349 lxc/remote.go:442 lxc/remote.go:447
 msgid "YES"
 msgstr ""
 
@@ -2575,7 +2654,7 @@ msgstr ""
 msgid "You must specify a destination container name when using --target"
 msgstr ""
 
-#: lxc/copy.go:72 lxc/move.go:202
+#: lxc/copy.go:72 lxc/move.go:203
 msgid "You must specify a source container name"
 msgstr ""
 
@@ -2679,6 +2758,14 @@ msgstr ""
 msgid "create [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:71
+msgid "create [<remote>:]<project>"
+msgstr ""
+
+#: lxc/project.go:354
+msgid "current"
+msgstr ""
+
 #: lxc/remote.go:459
 msgid "default"
 msgstr ""
@@ -2725,6 +2812,10 @@ msgstr ""
 msgid "delete [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:124
+msgid "delete [<remote>:]<project>"
+msgstr ""
+
 #: lxc/storage.go:436
 msgid "description"
 msgstr ""
@@ -2793,6 +2884,10 @@ msgstr ""
 msgid "edit [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:175
+msgid "edit [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:86
 msgid "edit [<remote>:][<container>]"
 msgstr ""
@@ -2903,7 +2998,7 @@ msgid "list"
 msgstr ""
 
 #: lxc/cluster.go:61 lxc/config_trust.go:112 lxc/network.go:796
-#: lxc/operation.go:98 lxc/profile.go:574 lxc/storage.go:493
+#: lxc/operation.go:98 lxc/profile.go:574 lxc/project.go:295 lxc/storage.go:493
 msgid "list [<remote>:]"
 msgstr ""
 
@@ -3088,6 +3183,12 @@ msgid ""
 "    Update a profile using the content of profile.yaml"
 msgstr ""
 
+#: lxc/project.go:179
+msgid ""
+"lxc project edit <project> < project.yaml\n"
+"    Update a project using the content of project.yaml"
+msgstr ""
+
 #: lxc/query.go:32
 msgid ""
 "lxc query -X DELETE --wait /1.0/containers/c1\n"
@@ -3190,6 +3291,10 @@ msgstr ""
 msgid "profile"
 msgstr ""
 
+#: lxc/project.go:27
+msgid "project"
+msgstr ""
+
 #: lxc/publish.go:32
 msgid ""
 "publish [<remote>:]<container>[/<snapshot>] [<remote>:] [flags] "
@@ -3212,7 +3317,7 @@ msgstr ""
 msgid "query [<remote>:]<API path>"
 msgstr ""
 
-#: lxc/image.go:1222
+#: lxc/image.go:1223
 msgid "refresh [<remote>:]<image> [[<remote>:]<image>...]"
 msgstr ""
 
@@ -3276,6 +3381,10 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
+#: lxc/project.go:385
+msgid "rename [<remote>:]<project> <new-name>"
+msgstr ""
+
 #: lxc/action.go:68
 msgid "restart [<remote>:]<container> [[<remote>:]<container>...]"
 msgstr ""
@@ -3324,7 +3433,7 @@ msgstr ""
 msgid "show [<remote>:]<container|profile>"
 msgstr ""
 
-#: lxc/image.go:1299
+#: lxc/image.go:1300
 msgid "show [<remote>:]<image>"
 msgstr ""
 
@@ -3352,6 +3461,10 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:441
+msgid "show [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:450
 msgid "show [<remote>:][<container>]"
 msgstr ""
@@ -3388,6 +3501,10 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
+#: lxc/project.go:494
+msgid "switch [<remote>:] <project>"
+msgstr ""
+
 #: lxc/info.go:255
 #, c-format
 msgid "taken at %s"
diff --git a/po/es.po b/po/es.po
index 794105f2dc..108fc09ece 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: 2018-08-23 15:14-0400\n"
+"POT-Creation-Date: 2018-09-02 06:35+0000\n"
 "PO-Revision-Date: 2018-02-10 11:39+0000\n"
 "Last-Translator: Allan Esquivel Sibaja <allan.esquivel.sibaja at gmail.com>\n"
 "Language-Team: Spanish <https://hosted.weblate.org/projects/linux-containers/"
@@ -203,6 +203,38 @@ msgid ""
 "### Note that the name is shown but cannot be changed"
 msgstr ""
 
+#: lxc/project.go:189
+#, fuzzy
+msgid ""
+"### This is a yaml representation of the project.\n"
+"### Any line starting with a '# will be ignored.\n"
+"###\n"
+"### A project consists of a set of features and a description.\n"
+"###\n"
+"### An example would look like:\n"
+"### name: my-project\n"
+"### features:\n"
+"###   images: True\n"
+"###   profiles: True\n"
+"### description: My own project\n"
+"###\n"
+"### Note that the name is shown but cannot be changed"
+msgstr ""
+"### Esta es una representación yaml de un pool de almacenamieto.\n"
+"### Cualquier línea que empiece con un '# será ignorada.\n"
+"###\n"
+"### Un pool de almacenamiento consiste en un conjunto de elementos de "
+"configuración.\n"
+"###\n"
+"### Un ejemplo se vería como:\n"
+"### name: default\n"
+"### driver: zfs\n"
+"### used_by: []\n"
+"### config:\n"
+"###   size: \"61203283968\"\n"
+"###   source: /home/chb/mnt/lxd_test/default.img\n"
+"###   zfs.pool_name: default"
+
 #: lxc/image.go:966
 #, c-format
 msgid "%s (%d more)"
@@ -515,8 +547,8 @@ msgid "Config key/value to apply to the target container"
 msgstr ""
 
 #: lxc/config.go:195 lxc/config.go:259 lxc/config_metadata.go:144
-#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/storage.go:303
-#: lxc/storage_volume.go:816
+#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/project.go:267
+#: lxc/storage.go:303 lxc/storage_volume.go:816
 #, c-format
 msgid "Config parsing error: %s"
 msgstr ""
@@ -638,6 +670,10 @@ msgstr ""
 msgid "Create profiles"
 msgstr ""
 
+#: lxc/project.go:72 lxc/project.go:73
+msgid "Create projects"
+msgstr ""
+
 #: lxc/storage.go:88 lxc/storage.go:89
 msgid "Create storage pools"
 msgstr ""
@@ -709,6 +745,10 @@ msgstr ""
 msgid "Delete profiles"
 msgstr ""
 
+#: lxc/project.go:126 lxc/project.go:127
+msgid "Delete projects"
+msgstr ""
+
 #: lxc/storage.go:162 lxc/storage.go:163
 msgid "Delete storage pools"
 msgstr ""
@@ -735,7 +775,7 @@ msgstr ""
 #: lxc/file.go:42 lxc/file.go:75 lxc/file.go:124 lxc/file.go:187
 #: lxc/file.go:377 lxc/image.go:42 lxc/image.go:131 lxc/image.go:265
 #: lxc/image.go:316 lxc/image.go:439 lxc/image.go:579 lxc/image.go:788
-#: lxc/image.go:902 lxc/image.go:1224 lxc/image.go:1301 lxc/image_alias.go:26
+#: lxc/image.go:902 lxc/image.go:1225 lxc/image.go:1302 lxc/image_alias.go:26
 #: lxc/image_alias.go:59 lxc/image_alias.go:106 lxc/image_alias.go:149
 #: lxc/image_alias.go:250 lxc/import.go:25 lxc/info.go:29 lxc/init.go:35
 #: lxc/launch.go:22 lxc/list.go:48 lxc/main.go:48 lxc/manpage.go:19
@@ -748,7 +788,9 @@ msgstr ""
 #: lxc/profile.go:30 lxc/profile.go:102 lxc/profile.go:165 lxc/profile.go:245
 #: lxc/profile.go:301 lxc/profile.go:355 lxc/profile.go:405 lxc/profile.go:529
 #: lxc/profile.go:577 lxc/profile.go:641 lxc/profile.go:717 lxc/profile.go:767
-#: lxc/profile.go:826 lxc/profile.go:880 lxc/publish.go:34 lxc/query.go:30
+#: lxc/profile.go:826 lxc/profile.go:880 lxc/project.go:29 lxc/project.go:73
+#: lxc/project.go:127 lxc/project.go:177 lxc/project.go:298 lxc/project.go:388
+#: lxc/project.go:443 lxc/project.go:496 lxc/publish.go:34 lxc/query.go:30
 #: lxc/remote.go:37 lxc/remote.go:87 lxc/remote.go:383 lxc/remote.go:419
 #: lxc/remote.go:524 lxc/remote.go:586 lxc/remote.go:636 lxc/remote.go:674
 #: lxc/rename.go:21 lxc/restore.go:24 lxc/snapshot.go:21 lxc/storage.go:33
@@ -857,6 +899,10 @@ msgstr ""
 msgid "Edit profile configurations as YAML"
 msgstr ""
 
+#: lxc/project.go:176 lxc/project.go:177
+msgid "Edit project configurations as YAML"
+msgstr ""
+
 #: lxc/storage.go:212 lxc/storage.go:213
 msgid "Edit storage pool configurations as YAML"
 msgstr ""
@@ -973,7 +1019,7 @@ msgstr ""
 msgid "FINGERPRINT"
 msgstr ""
 
-#: lxc/move.go:213
+#: lxc/move.go:214
 msgid "Failed to connect to cluster member"
 msgstr ""
 
@@ -1077,6 +1123,10 @@ msgstr ""
 msgid "ID"
 msgstr ""
 
+#: lxc/project.go:367
+msgid "IMAGES"
+msgstr ""
+
 #: lxc/network.go:964
 msgid "IP ADDRESS"
 msgstr ""
@@ -1093,7 +1143,7 @@ msgstr ""
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:301
+#: lxc/main.go:305
 msgid ""
 "If this is your first time running LXD on this machine, you should also run: "
 "lxd init"
@@ -1103,7 +1153,7 @@ msgstr ""
 msgid "Ignore the container state"
 msgstr ""
 
-#: lxc/image.go:1284
+#: lxc/image.go:1285
 msgid "Image already up to date."
 msgstr ""
 
@@ -1115,7 +1165,7 @@ msgstr ""
 msgid "Image exported successfully!"
 msgstr ""
 
-#: lxc/image.go:288 lxc/image.go:1247
+#: lxc/image.go:288 lxc/image.go:1248
 msgid "Image identifier missing"
 msgstr ""
 
@@ -1129,7 +1179,7 @@ msgstr ""
 msgid "Image imported with fingerprint: %s"
 msgstr ""
 
-#: lxc/image.go:1282
+#: lxc/image.go:1283
 msgid "Image refreshed successfully!"
 msgstr ""
 
@@ -1185,7 +1235,7 @@ msgstr ""
 msgid "Invalid config key column format (too many fields): '%s'"
 msgstr ""
 
-#: lxc/image.go:1208 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
+#: lxc/image.go:1209 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
 #, c-format
 msgid "Invalid format %q"
 msgstr ""
@@ -1206,7 +1256,7 @@ msgid ""
 "Invalid name in '%s', empty string is only allowed when defining maxWidth"
 msgstr ""
 
-#: lxc/main.go:389
+#: lxc/main.go:393
 msgid "Invalid number of arguments"
 msgstr ""
 
@@ -1403,6 +1453,10 @@ msgstr ""
 msgid "List profiles"
 msgstr ""
 
+#: lxc/project.go:297 lxc/project.go:298
+msgid "List projects"
+msgstr ""
+
 #: lxc/storage_volume.go:911 lxc/storage_volume.go:912
 msgid "List storage volumes"
 msgstr ""
@@ -1521,6 +1575,10 @@ msgstr ""
 msgid "Manage profiles"
 msgstr ""
 
+#: lxc/project.go:28 lxc/project.go:29
+msgid "Manage projects"
+msgstr ""
+
 #: lxc/storage.go:32 lxc/storage.go:33
 msgid "Manage storage pools and volumes"
 msgstr ""
@@ -1567,11 +1625,11 @@ msgstr ""
 msgid "Memory usage:"
 msgstr ""
 
-#: lxc/move.go:226
+#: lxc/move.go:227
 msgid "Migration API failure"
 msgstr ""
 
-#: lxc/move.go:231
+#: lxc/move.go:232
 msgid "Migration operation failure"
 msgstr ""
 
@@ -1620,6 +1678,12 @@ msgstr ""
 msgid "Missing profile name"
 msgstr ""
 
+#: lxc/project.go:97 lxc/project.go:151 lxc/project.go:221 lxc/project.go:412
+#: lxc/project.go:467
+#, fuzzy
+msgid "Missing project name"
+msgstr "Nombre del contenedor es: %s"
+
 #: lxc/profile.go:270
 msgid "Missing source profile name"
 msgstr ""
@@ -1679,11 +1743,13 @@ msgid "Must supply container name for: "
 msgstr ""
 
 #: lxc/cluster.go:124 lxc/list.go:459 lxc/network.go:858 lxc/profile.go:622
-#: lxc/remote.go:465 lxc/storage.go:549 lxc/storage_volume.go:960
+#: lxc/project.go:366 lxc/remote.go:465 lxc/storage.go:549
+#: lxc/storage_volume.go:960
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:844 lxc/operation.go:141 lxc/remote.go:440 lxc/remote.go:445
+#: lxc/network.go:844 lxc/operation.go:141 lxc/project.go:342
+#: lxc/project.go:347 lxc/remote.go:440 lxc/remote.go:445
 msgid "NO"
 msgstr ""
 
@@ -1790,7 +1856,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:462
+#: lxc/list.go:462 lxc/project.go:368
 msgid "PROFILES"
 msgstr ""
 
@@ -1819,7 +1885,7 @@ msgstr ""
 msgid "Pid: %d"
 msgstr ""
 
-#: lxc/network.go:643 lxc/profile.go:500 lxc/storage.go:304
+#: lxc/network.go:643 lxc/profile.go:500 lxc/project.go:268 lxc/storage.go:304
 #: lxc/storage_volume.go:817
 msgid "Press enter to open the editor again"
 msgstr ""
@@ -1903,6 +1969,21 @@ msgstr ""
 msgid "Profiles: %s"
 msgstr ""
 
+#: lxc/project.go:110
+#, c-format
+msgid "Project %s created"
+msgstr ""
+
+#: lxc/project.go:161
+#, c-format
+msgid "Project %s deleted"
+msgstr ""
+
+#: lxc/project.go:427
+#, c-format
+msgid "Project %s renamed to %s"
+msgstr ""
+
 #: lxc/image.go:861
 msgid "Properties:"
 msgstr ""
@@ -1942,11 +2023,11 @@ msgstr ""
 msgid "Recursively transfer files"
 msgstr ""
 
-#: lxc/image.go:1223 lxc/image.go:1224
+#: lxc/image.go:1224 lxc/image.go:1225
 msgid "Refresh images"
 msgstr ""
 
-#: lxc/image.go:1252
+#: lxc/image.go:1253
 #, c-format
 msgid "Refreshing the image: %s"
 msgstr ""
@@ -1956,7 +2037,8 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656 lxc/remote.go:694
+#: lxc/project.go:523 lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656
+#: lxc/remote.go:694
 #, c-format
 msgid "Remote %s doesn't exist"
 msgstr ""
@@ -2034,6 +2116,10 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
+#: lxc/project.go:387 lxc/project.go:388
+msgid "Rename projects"
+msgstr ""
+
 #: lxc/remote.go:523 lxc/remote.go:524
 msgid "Rename remotes"
 msgstr ""
@@ -2219,11 +2305,11 @@ msgstr ""
 msgid "Show full device configuration for containers or profiles"
 msgstr ""
 
-#: lxc/image.go:1300 lxc/image.go:1301
+#: lxc/image.go:1301 lxc/image.go:1302
 msgid "Show image properties"
 msgstr ""
 
-#: lxc/main.go:215 lxc/main.go:216
+#: lxc/main.go:219 lxc/main.go:220
 msgid "Show less common commands"
 msgstr ""
 
@@ -2239,6 +2325,10 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
+#: lxc/project.go:442 lxc/project.go:443
+msgid "Show project options"
+msgstr ""
+
 #: lxc/storage.go:649 lxc/storage.go:650
 msgid "Show storage pool configurations and resources"
 msgstr ""
@@ -2386,6 +2476,10 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
+#: lxc/project.go:495 lxc/project.go:496
+msgid "Switch the current project"
+msgstr ""
+
 #: lxc/remote.go:635 lxc/remote.go:636
 msgid "Switch the default remote"
 msgstr ""
@@ -2448,7 +2542,7 @@ msgstr ""
 msgid "The profile device doesn't exist"
 msgstr ""
 
-#: lxc/move.go:218
+#: lxc/move.go:219
 msgid "The source LXD instance is not clustered"
 msgstr ""
 
@@ -2485,7 +2579,7 @@ msgstr ""
 msgid "To detach from the console, press: <ctrl>+a q"
 msgstr ""
 
-#: lxc/main.go:304
+#: lxc/main.go:308
 msgid "To start your first container, try: lxc launch ubuntu:18.04"
 msgstr ""
 
@@ -2536,7 +2630,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:862 lxc/profile.go:623 lxc/storage.go:558
+#: lxc/network.go:862 lxc/profile.go:623 lxc/project.go:369 lxc/storage.go:558
 #: lxc/storage_volume.go:962
 msgid "USED BY"
 msgstr ""
@@ -2621,7 +2715,8 @@ msgstr ""
 msgid "Whether or not to snapshot the container's running state"
 msgstr ""
 
-#: lxc/network.go:846 lxc/operation.go:143 lxc/remote.go:442 lxc/remote.go:447
+#: lxc/network.go:846 lxc/operation.go:143 lxc/project.go:344
+#: lxc/project.go:349 lxc/remote.go:442 lxc/remote.go:447
 msgid "YES"
 msgstr ""
 
@@ -2637,7 +2732,7 @@ msgstr ""
 msgid "You must specify a destination container name when using --target"
 msgstr ""
 
-#: lxc/copy.go:72 lxc/move.go:202
+#: lxc/copy.go:72 lxc/move.go:203
 msgid "You must specify a source container name"
 msgstr ""
 
@@ -2742,6 +2837,14 @@ msgstr ""
 msgid "create [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:71
+msgid "create [<remote>:]<project>"
+msgstr ""
+
+#: lxc/project.go:354
+msgid "current"
+msgstr ""
+
 #: lxc/remote.go:459
 msgid "default"
 msgstr ""
@@ -2788,6 +2891,10 @@ msgstr ""
 msgid "delete [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:124
+msgid "delete [<remote>:]<project>"
+msgstr ""
+
 #: lxc/storage.go:436
 msgid "description"
 msgstr ""
@@ -2856,6 +2963,10 @@ msgstr ""
 msgid "edit [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:175
+msgid "edit [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:86
 msgid "edit [<remote>:][<container>]"
 msgstr ""
@@ -2966,7 +3077,7 @@ msgid "list"
 msgstr ""
 
 #: lxc/cluster.go:61 lxc/config_trust.go:112 lxc/network.go:796
-#: lxc/operation.go:98 lxc/profile.go:574 lxc/storage.go:493
+#: lxc/operation.go:98 lxc/profile.go:574 lxc/project.go:295 lxc/storage.go:493
 msgid "list [<remote>:]"
 msgstr ""
 
@@ -3151,6 +3262,12 @@ msgid ""
 "    Update a profile using the content of profile.yaml"
 msgstr ""
 
+#: lxc/project.go:179
+msgid ""
+"lxc project edit <project> < project.yaml\n"
+"    Update a project using the content of project.yaml"
+msgstr ""
+
 #: lxc/query.go:32
 msgid ""
 "lxc query -X DELETE --wait /1.0/containers/c1\n"
@@ -3253,6 +3370,10 @@ msgstr ""
 msgid "profile"
 msgstr ""
 
+#: lxc/project.go:27
+msgid "project"
+msgstr ""
+
 #: lxc/publish.go:32
 msgid ""
 "publish [<remote>:]<container>[/<snapshot>] [<remote>:] [flags] "
@@ -3275,7 +3396,7 @@ msgstr ""
 msgid "query [<remote>:]<API path>"
 msgstr ""
 
-#: lxc/image.go:1222
+#: lxc/image.go:1223
 msgid "refresh [<remote>:]<image> [[<remote>:]<image>...]"
 msgstr ""
 
@@ -3339,6 +3460,10 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
+#: lxc/project.go:385
+msgid "rename [<remote>:]<project> <new-name>"
+msgstr ""
+
 #: lxc/action.go:68
 msgid "restart [<remote>:]<container> [[<remote>:]<container>...]"
 msgstr ""
@@ -3387,7 +3512,7 @@ msgstr ""
 msgid "show [<remote>:]<container|profile>"
 msgstr ""
 
-#: lxc/image.go:1299
+#: lxc/image.go:1300
 msgid "show [<remote>:]<image>"
 msgstr ""
 
@@ -3415,6 +3540,10 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:441
+msgid "show [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:450
 msgid "show [<remote>:][<container>]"
 msgstr ""
@@ -3451,6 +3580,10 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
+#: lxc/project.go:494
+msgid "switch [<remote>:] <project>"
+msgstr ""
+
 #: lxc/info.go:255
 #, c-format
 msgid "taken at %s"
diff --git a/po/fa.po b/po/fa.po
index b01675fbdb..87ac3c01c2 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: 2018-08-23 15:14-0400\n"
+"POT-Creation-Date: 2018-09-02 06:35+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -143,6 +143,23 @@ msgid ""
 "### Note that the name is shown but cannot be changed"
 msgstr ""
 
+#: lxc/project.go:189
+msgid ""
+"### This is a yaml representation of the project.\n"
+"### Any line starting with a '# will be ignored.\n"
+"###\n"
+"### A project consists of a set of features and a description.\n"
+"###\n"
+"### An example would look like:\n"
+"### name: my-project\n"
+"### features:\n"
+"###   images: True\n"
+"###   profiles: True\n"
+"### description: My own project\n"
+"###\n"
+"### Note that the name is shown but cannot be changed"
+msgstr ""
+
 #: lxc/image.go:966
 #, c-format
 msgid "%s (%d more)"
@@ -453,8 +470,8 @@ msgid "Config key/value to apply to the target container"
 msgstr ""
 
 #: lxc/config.go:195 lxc/config.go:259 lxc/config_metadata.go:144
-#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/storage.go:303
-#: lxc/storage_volume.go:816
+#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/project.go:267
+#: lxc/storage.go:303 lxc/storage_volume.go:816
 #, c-format
 msgid "Config parsing error: %s"
 msgstr ""
@@ -575,6 +592,10 @@ msgstr ""
 msgid "Create profiles"
 msgstr ""
 
+#: lxc/project.go:72 lxc/project.go:73
+msgid "Create projects"
+msgstr ""
+
 #: lxc/storage.go:88 lxc/storage.go:89
 msgid "Create storage pools"
 msgstr ""
@@ -646,6 +667,10 @@ msgstr ""
 msgid "Delete profiles"
 msgstr ""
 
+#: lxc/project.go:126 lxc/project.go:127
+msgid "Delete projects"
+msgstr ""
+
 #: lxc/storage.go:162 lxc/storage.go:163
 msgid "Delete storage pools"
 msgstr ""
@@ -672,7 +697,7 @@ msgstr ""
 #: lxc/file.go:42 lxc/file.go:75 lxc/file.go:124 lxc/file.go:187
 #: lxc/file.go:377 lxc/image.go:42 lxc/image.go:131 lxc/image.go:265
 #: lxc/image.go:316 lxc/image.go:439 lxc/image.go:579 lxc/image.go:788
-#: lxc/image.go:902 lxc/image.go:1224 lxc/image.go:1301 lxc/image_alias.go:26
+#: lxc/image.go:902 lxc/image.go:1225 lxc/image.go:1302 lxc/image_alias.go:26
 #: lxc/image_alias.go:59 lxc/image_alias.go:106 lxc/image_alias.go:149
 #: lxc/image_alias.go:250 lxc/import.go:25 lxc/info.go:29 lxc/init.go:35
 #: lxc/launch.go:22 lxc/list.go:48 lxc/main.go:48 lxc/manpage.go:19
@@ -685,7 +710,9 @@ msgstr ""
 #: lxc/profile.go:30 lxc/profile.go:102 lxc/profile.go:165 lxc/profile.go:245
 #: lxc/profile.go:301 lxc/profile.go:355 lxc/profile.go:405 lxc/profile.go:529
 #: lxc/profile.go:577 lxc/profile.go:641 lxc/profile.go:717 lxc/profile.go:767
-#: lxc/profile.go:826 lxc/profile.go:880 lxc/publish.go:34 lxc/query.go:30
+#: lxc/profile.go:826 lxc/profile.go:880 lxc/project.go:29 lxc/project.go:73
+#: lxc/project.go:127 lxc/project.go:177 lxc/project.go:298 lxc/project.go:388
+#: lxc/project.go:443 lxc/project.go:496 lxc/publish.go:34 lxc/query.go:30
 #: lxc/remote.go:37 lxc/remote.go:87 lxc/remote.go:383 lxc/remote.go:419
 #: lxc/remote.go:524 lxc/remote.go:586 lxc/remote.go:636 lxc/remote.go:674
 #: lxc/rename.go:21 lxc/restore.go:24 lxc/snapshot.go:21 lxc/storage.go:33
@@ -794,6 +821,10 @@ msgstr ""
 msgid "Edit profile configurations as YAML"
 msgstr ""
 
+#: lxc/project.go:176 lxc/project.go:177
+msgid "Edit project configurations as YAML"
+msgstr ""
+
 #: lxc/storage.go:212 lxc/storage.go:213
 msgid "Edit storage pool configurations as YAML"
 msgstr ""
@@ -908,7 +939,7 @@ msgstr ""
 msgid "FINGERPRINT"
 msgstr ""
 
-#: lxc/move.go:213
+#: lxc/move.go:214
 msgid "Failed to connect to cluster member"
 msgstr ""
 
@@ -1012,6 +1043,10 @@ msgstr ""
 msgid "ID"
 msgstr ""
 
+#: lxc/project.go:367
+msgid "IMAGES"
+msgstr ""
+
 #: lxc/network.go:964
 msgid "IP ADDRESS"
 msgstr ""
@@ -1028,7 +1063,7 @@ msgstr ""
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:301
+#: lxc/main.go:305
 msgid ""
 "If this is your first time running LXD on this machine, you should also run: "
 "lxd init"
@@ -1038,7 +1073,7 @@ msgstr ""
 msgid "Ignore the container state"
 msgstr ""
 
-#: lxc/image.go:1284
+#: lxc/image.go:1285
 msgid "Image already up to date."
 msgstr ""
 
@@ -1050,7 +1085,7 @@ msgstr ""
 msgid "Image exported successfully!"
 msgstr ""
 
-#: lxc/image.go:288 lxc/image.go:1247
+#: lxc/image.go:288 lxc/image.go:1248
 msgid "Image identifier missing"
 msgstr ""
 
@@ -1064,7 +1099,7 @@ msgstr ""
 msgid "Image imported with fingerprint: %s"
 msgstr ""
 
-#: lxc/image.go:1282
+#: lxc/image.go:1283
 msgid "Image refreshed successfully!"
 msgstr ""
 
@@ -1119,7 +1154,7 @@ msgstr ""
 msgid "Invalid config key column format (too many fields): '%s'"
 msgstr ""
 
-#: lxc/image.go:1208 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
+#: lxc/image.go:1209 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
 #, c-format
 msgid "Invalid format %q"
 msgstr ""
@@ -1140,7 +1175,7 @@ msgid ""
 "Invalid name in '%s', empty string is only allowed when defining maxWidth"
 msgstr ""
 
-#: lxc/main.go:389
+#: lxc/main.go:393
 msgid "Invalid number of arguments"
 msgstr ""
 
@@ -1336,6 +1371,10 @@ msgstr ""
 msgid "List profiles"
 msgstr ""
 
+#: lxc/project.go:297 lxc/project.go:298
+msgid "List projects"
+msgstr ""
+
 #: lxc/storage_volume.go:911 lxc/storage_volume.go:912
 msgid "List storage volumes"
 msgstr ""
@@ -1454,6 +1493,10 @@ msgstr ""
 msgid "Manage profiles"
 msgstr ""
 
+#: lxc/project.go:28 lxc/project.go:29
+msgid "Manage projects"
+msgstr ""
+
 #: lxc/storage.go:32 lxc/storage.go:33
 msgid "Manage storage pools and volumes"
 msgstr ""
@@ -1500,11 +1543,11 @@ msgstr ""
 msgid "Memory usage:"
 msgstr ""
 
-#: lxc/move.go:226
+#: lxc/move.go:227
 msgid "Migration API failure"
 msgstr ""
 
-#: lxc/move.go:231
+#: lxc/move.go:232
 msgid "Migration operation failure"
 msgstr ""
 
@@ -1552,6 +1595,11 @@ msgstr ""
 msgid "Missing profile name"
 msgstr ""
 
+#: lxc/project.go:97 lxc/project.go:151 lxc/project.go:221 lxc/project.go:412
+#: lxc/project.go:467
+msgid "Missing project name"
+msgstr ""
+
 #: lxc/profile.go:270
 msgid "Missing source profile name"
 msgstr ""
@@ -1610,11 +1658,13 @@ msgid "Must supply container name for: "
 msgstr ""
 
 #: lxc/cluster.go:124 lxc/list.go:459 lxc/network.go:858 lxc/profile.go:622
-#: lxc/remote.go:465 lxc/storage.go:549 lxc/storage_volume.go:960
+#: lxc/project.go:366 lxc/remote.go:465 lxc/storage.go:549
+#: lxc/storage_volume.go:960
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:844 lxc/operation.go:141 lxc/remote.go:440 lxc/remote.go:445
+#: lxc/network.go:844 lxc/operation.go:141 lxc/project.go:342
+#: lxc/project.go:347 lxc/remote.go:440 lxc/remote.go:445
 msgid "NO"
 msgstr ""
 
@@ -1721,7 +1771,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:462
+#: lxc/list.go:462 lxc/project.go:368
 msgid "PROFILES"
 msgstr ""
 
@@ -1750,7 +1800,7 @@ msgstr ""
 msgid "Pid: %d"
 msgstr ""
 
-#: lxc/network.go:643 lxc/profile.go:500 lxc/storage.go:304
+#: lxc/network.go:643 lxc/profile.go:500 lxc/project.go:268 lxc/storage.go:304
 #: lxc/storage_volume.go:817
 msgid "Press enter to open the editor again"
 msgstr ""
@@ -1834,6 +1884,21 @@ msgstr ""
 msgid "Profiles: %s"
 msgstr ""
 
+#: lxc/project.go:110
+#, c-format
+msgid "Project %s created"
+msgstr ""
+
+#: lxc/project.go:161
+#, c-format
+msgid "Project %s deleted"
+msgstr ""
+
+#: lxc/project.go:427
+#, c-format
+msgid "Project %s renamed to %s"
+msgstr ""
+
 #: lxc/image.go:861
 msgid "Properties:"
 msgstr ""
@@ -1873,11 +1938,11 @@ msgstr ""
 msgid "Recursively transfer files"
 msgstr ""
 
-#: lxc/image.go:1223 lxc/image.go:1224
+#: lxc/image.go:1224 lxc/image.go:1225
 msgid "Refresh images"
 msgstr ""
 
-#: lxc/image.go:1252
+#: lxc/image.go:1253
 #, c-format
 msgid "Refreshing the image: %s"
 msgstr ""
@@ -1887,7 +1952,8 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656 lxc/remote.go:694
+#: lxc/project.go:523 lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656
+#: lxc/remote.go:694
 #, c-format
 msgid "Remote %s doesn't exist"
 msgstr ""
@@ -1965,6 +2031,10 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
+#: lxc/project.go:387 lxc/project.go:388
+msgid "Rename projects"
+msgstr ""
+
 #: lxc/remote.go:523 lxc/remote.go:524
 msgid "Rename remotes"
 msgstr ""
@@ -2150,11 +2220,11 @@ msgstr ""
 msgid "Show full device configuration for containers or profiles"
 msgstr ""
 
-#: lxc/image.go:1300 lxc/image.go:1301
+#: lxc/image.go:1301 lxc/image.go:1302
 msgid "Show image properties"
 msgstr ""
 
-#: lxc/main.go:215 lxc/main.go:216
+#: lxc/main.go:219 lxc/main.go:220
 msgid "Show less common commands"
 msgstr ""
 
@@ -2170,6 +2240,10 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
+#: lxc/project.go:442 lxc/project.go:443
+msgid "Show project options"
+msgstr ""
+
 #: lxc/storage.go:649 lxc/storage.go:650
 msgid "Show storage pool configurations and resources"
 msgstr ""
@@ -2317,6 +2391,10 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
+#: lxc/project.go:495 lxc/project.go:496
+msgid "Switch the current project"
+msgstr ""
+
 #: lxc/remote.go:635 lxc/remote.go:636
 msgid "Switch the default remote"
 msgstr ""
@@ -2379,7 +2457,7 @@ msgstr ""
 msgid "The profile device doesn't exist"
 msgstr ""
 
-#: lxc/move.go:218
+#: lxc/move.go:219
 msgid "The source LXD instance is not clustered"
 msgstr ""
 
@@ -2416,7 +2494,7 @@ msgstr ""
 msgid "To detach from the console, press: <ctrl>+a q"
 msgstr ""
 
-#: lxc/main.go:304
+#: lxc/main.go:308
 msgid "To start your first container, try: lxc launch ubuntu:18.04"
 msgstr ""
 
@@ -2467,7 +2545,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:862 lxc/profile.go:623 lxc/storage.go:558
+#: lxc/network.go:862 lxc/profile.go:623 lxc/project.go:369 lxc/storage.go:558
 #: lxc/storage_volume.go:962
 msgid "USED BY"
 msgstr ""
@@ -2552,7 +2630,8 @@ msgstr ""
 msgid "Whether or not to snapshot the container's running state"
 msgstr ""
 
-#: lxc/network.go:846 lxc/operation.go:143 lxc/remote.go:442 lxc/remote.go:447
+#: lxc/network.go:846 lxc/operation.go:143 lxc/project.go:344
+#: lxc/project.go:349 lxc/remote.go:442 lxc/remote.go:447
 msgid "YES"
 msgstr ""
 
@@ -2568,7 +2647,7 @@ msgstr ""
 msgid "You must specify a destination container name when using --target"
 msgstr ""
 
-#: lxc/copy.go:72 lxc/move.go:202
+#: lxc/copy.go:72 lxc/move.go:203
 msgid "You must specify a source container name"
 msgstr ""
 
@@ -2672,6 +2751,14 @@ msgstr ""
 msgid "create [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:71
+msgid "create [<remote>:]<project>"
+msgstr ""
+
+#: lxc/project.go:354
+msgid "current"
+msgstr ""
+
 #: lxc/remote.go:459
 msgid "default"
 msgstr ""
@@ -2718,6 +2805,10 @@ msgstr ""
 msgid "delete [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:124
+msgid "delete [<remote>:]<project>"
+msgstr ""
+
 #: lxc/storage.go:436
 msgid "description"
 msgstr ""
@@ -2786,6 +2877,10 @@ msgstr ""
 msgid "edit [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:175
+msgid "edit [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:86
 msgid "edit [<remote>:][<container>]"
 msgstr ""
@@ -2896,7 +2991,7 @@ msgid "list"
 msgstr ""
 
 #: lxc/cluster.go:61 lxc/config_trust.go:112 lxc/network.go:796
-#: lxc/operation.go:98 lxc/profile.go:574 lxc/storage.go:493
+#: lxc/operation.go:98 lxc/profile.go:574 lxc/project.go:295 lxc/storage.go:493
 msgid "list [<remote>:]"
 msgstr ""
 
@@ -3081,6 +3176,12 @@ msgid ""
 "    Update a profile using the content of profile.yaml"
 msgstr ""
 
+#: lxc/project.go:179
+msgid ""
+"lxc project edit <project> < project.yaml\n"
+"    Update a project using the content of project.yaml"
+msgstr ""
+
 #: lxc/query.go:32
 msgid ""
 "lxc query -X DELETE --wait /1.0/containers/c1\n"
@@ -3183,6 +3284,10 @@ msgstr ""
 msgid "profile"
 msgstr ""
 
+#: lxc/project.go:27
+msgid "project"
+msgstr ""
+
 #: lxc/publish.go:32
 msgid ""
 "publish [<remote>:]<container>[/<snapshot>] [<remote>:] [flags] "
@@ -3205,7 +3310,7 @@ msgstr ""
 msgid "query [<remote>:]<API path>"
 msgstr ""
 
-#: lxc/image.go:1222
+#: lxc/image.go:1223
 msgid "refresh [<remote>:]<image> [[<remote>:]<image>...]"
 msgstr ""
 
@@ -3269,6 +3374,10 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
+#: lxc/project.go:385
+msgid "rename [<remote>:]<project> <new-name>"
+msgstr ""
+
 #: lxc/action.go:68
 msgid "restart [<remote>:]<container> [[<remote>:]<container>...]"
 msgstr ""
@@ -3317,7 +3426,7 @@ msgstr ""
 msgid "show [<remote>:]<container|profile>"
 msgstr ""
 
-#: lxc/image.go:1299
+#: lxc/image.go:1300
 msgid "show [<remote>:]<image>"
 msgstr ""
 
@@ -3345,6 +3454,10 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:441
+msgid "show [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:450
 msgid "show [<remote>:][<container>]"
 msgstr ""
@@ -3381,6 +3494,10 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
+#: lxc/project.go:494
+msgid "switch [<remote>:] <project>"
+msgstr ""
+
 #: lxc/info.go:255
 #, c-format
 msgid "taken at %s"
diff --git a/po/fi.po b/po/fi.po
index f509a730f7..438c6a548c 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: 2018-08-23 15:14-0400\n"
+"POT-Creation-Date: 2018-09-02 06:35+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -143,6 +143,23 @@ msgid ""
 "### Note that the name is shown but cannot be changed"
 msgstr ""
 
+#: lxc/project.go:189
+msgid ""
+"### This is a yaml representation of the project.\n"
+"### Any line starting with a '# will be ignored.\n"
+"###\n"
+"### A project consists of a set of features and a description.\n"
+"###\n"
+"### An example would look like:\n"
+"### name: my-project\n"
+"### features:\n"
+"###   images: True\n"
+"###   profiles: True\n"
+"### description: My own project\n"
+"###\n"
+"### Note that the name is shown but cannot be changed"
+msgstr ""
+
 #: lxc/image.go:966
 #, c-format
 msgid "%s (%d more)"
@@ -453,8 +470,8 @@ msgid "Config key/value to apply to the target container"
 msgstr ""
 
 #: lxc/config.go:195 lxc/config.go:259 lxc/config_metadata.go:144
-#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/storage.go:303
-#: lxc/storage_volume.go:816
+#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/project.go:267
+#: lxc/storage.go:303 lxc/storage_volume.go:816
 #, c-format
 msgid "Config parsing error: %s"
 msgstr ""
@@ -575,6 +592,10 @@ msgstr ""
 msgid "Create profiles"
 msgstr ""
 
+#: lxc/project.go:72 lxc/project.go:73
+msgid "Create projects"
+msgstr ""
+
 #: lxc/storage.go:88 lxc/storage.go:89
 msgid "Create storage pools"
 msgstr ""
@@ -646,6 +667,10 @@ msgstr ""
 msgid "Delete profiles"
 msgstr ""
 
+#: lxc/project.go:126 lxc/project.go:127
+msgid "Delete projects"
+msgstr ""
+
 #: lxc/storage.go:162 lxc/storage.go:163
 msgid "Delete storage pools"
 msgstr ""
@@ -672,7 +697,7 @@ msgstr ""
 #: lxc/file.go:42 lxc/file.go:75 lxc/file.go:124 lxc/file.go:187
 #: lxc/file.go:377 lxc/image.go:42 lxc/image.go:131 lxc/image.go:265
 #: lxc/image.go:316 lxc/image.go:439 lxc/image.go:579 lxc/image.go:788
-#: lxc/image.go:902 lxc/image.go:1224 lxc/image.go:1301 lxc/image_alias.go:26
+#: lxc/image.go:902 lxc/image.go:1225 lxc/image.go:1302 lxc/image_alias.go:26
 #: lxc/image_alias.go:59 lxc/image_alias.go:106 lxc/image_alias.go:149
 #: lxc/image_alias.go:250 lxc/import.go:25 lxc/info.go:29 lxc/init.go:35
 #: lxc/launch.go:22 lxc/list.go:48 lxc/main.go:48 lxc/manpage.go:19
@@ -685,7 +710,9 @@ msgstr ""
 #: lxc/profile.go:30 lxc/profile.go:102 lxc/profile.go:165 lxc/profile.go:245
 #: lxc/profile.go:301 lxc/profile.go:355 lxc/profile.go:405 lxc/profile.go:529
 #: lxc/profile.go:577 lxc/profile.go:641 lxc/profile.go:717 lxc/profile.go:767
-#: lxc/profile.go:826 lxc/profile.go:880 lxc/publish.go:34 lxc/query.go:30
+#: lxc/profile.go:826 lxc/profile.go:880 lxc/project.go:29 lxc/project.go:73
+#: lxc/project.go:127 lxc/project.go:177 lxc/project.go:298 lxc/project.go:388
+#: lxc/project.go:443 lxc/project.go:496 lxc/publish.go:34 lxc/query.go:30
 #: lxc/remote.go:37 lxc/remote.go:87 lxc/remote.go:383 lxc/remote.go:419
 #: lxc/remote.go:524 lxc/remote.go:586 lxc/remote.go:636 lxc/remote.go:674
 #: lxc/rename.go:21 lxc/restore.go:24 lxc/snapshot.go:21 lxc/storage.go:33
@@ -794,6 +821,10 @@ msgstr ""
 msgid "Edit profile configurations as YAML"
 msgstr ""
 
+#: lxc/project.go:176 lxc/project.go:177
+msgid "Edit project configurations as YAML"
+msgstr ""
+
 #: lxc/storage.go:212 lxc/storage.go:213
 msgid "Edit storage pool configurations as YAML"
 msgstr ""
@@ -908,7 +939,7 @@ msgstr ""
 msgid "FINGERPRINT"
 msgstr ""
 
-#: lxc/move.go:213
+#: lxc/move.go:214
 msgid "Failed to connect to cluster member"
 msgstr ""
 
@@ -1012,6 +1043,10 @@ msgstr ""
 msgid "ID"
 msgstr ""
 
+#: lxc/project.go:367
+msgid "IMAGES"
+msgstr ""
+
 #: lxc/network.go:964
 msgid "IP ADDRESS"
 msgstr ""
@@ -1028,7 +1063,7 @@ msgstr ""
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:301
+#: lxc/main.go:305
 msgid ""
 "If this is your first time running LXD on this machine, you should also run: "
 "lxd init"
@@ -1038,7 +1073,7 @@ msgstr ""
 msgid "Ignore the container state"
 msgstr ""
 
-#: lxc/image.go:1284
+#: lxc/image.go:1285
 msgid "Image already up to date."
 msgstr ""
 
@@ -1050,7 +1085,7 @@ msgstr ""
 msgid "Image exported successfully!"
 msgstr ""
 
-#: lxc/image.go:288 lxc/image.go:1247
+#: lxc/image.go:288 lxc/image.go:1248
 msgid "Image identifier missing"
 msgstr ""
 
@@ -1064,7 +1099,7 @@ msgstr ""
 msgid "Image imported with fingerprint: %s"
 msgstr ""
 
-#: lxc/image.go:1282
+#: lxc/image.go:1283
 msgid "Image refreshed successfully!"
 msgstr ""
 
@@ -1119,7 +1154,7 @@ msgstr ""
 msgid "Invalid config key column format (too many fields): '%s'"
 msgstr ""
 
-#: lxc/image.go:1208 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
+#: lxc/image.go:1209 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
 #, c-format
 msgid "Invalid format %q"
 msgstr ""
@@ -1140,7 +1175,7 @@ msgid ""
 "Invalid name in '%s', empty string is only allowed when defining maxWidth"
 msgstr ""
 
-#: lxc/main.go:389
+#: lxc/main.go:393
 msgid "Invalid number of arguments"
 msgstr ""
 
@@ -1336,6 +1371,10 @@ msgstr ""
 msgid "List profiles"
 msgstr ""
 
+#: lxc/project.go:297 lxc/project.go:298
+msgid "List projects"
+msgstr ""
+
 #: lxc/storage_volume.go:911 lxc/storage_volume.go:912
 msgid "List storage volumes"
 msgstr ""
@@ -1454,6 +1493,10 @@ msgstr ""
 msgid "Manage profiles"
 msgstr ""
 
+#: lxc/project.go:28 lxc/project.go:29
+msgid "Manage projects"
+msgstr ""
+
 #: lxc/storage.go:32 lxc/storage.go:33
 msgid "Manage storage pools and volumes"
 msgstr ""
@@ -1500,11 +1543,11 @@ msgstr ""
 msgid "Memory usage:"
 msgstr ""
 
-#: lxc/move.go:226
+#: lxc/move.go:227
 msgid "Migration API failure"
 msgstr ""
 
-#: lxc/move.go:231
+#: lxc/move.go:232
 msgid "Migration operation failure"
 msgstr ""
 
@@ -1552,6 +1595,11 @@ msgstr ""
 msgid "Missing profile name"
 msgstr ""
 
+#: lxc/project.go:97 lxc/project.go:151 lxc/project.go:221 lxc/project.go:412
+#: lxc/project.go:467
+msgid "Missing project name"
+msgstr ""
+
 #: lxc/profile.go:270
 msgid "Missing source profile name"
 msgstr ""
@@ -1610,11 +1658,13 @@ msgid "Must supply container name for: "
 msgstr ""
 
 #: lxc/cluster.go:124 lxc/list.go:459 lxc/network.go:858 lxc/profile.go:622
-#: lxc/remote.go:465 lxc/storage.go:549 lxc/storage_volume.go:960
+#: lxc/project.go:366 lxc/remote.go:465 lxc/storage.go:549
+#: lxc/storage_volume.go:960
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:844 lxc/operation.go:141 lxc/remote.go:440 lxc/remote.go:445
+#: lxc/network.go:844 lxc/operation.go:141 lxc/project.go:342
+#: lxc/project.go:347 lxc/remote.go:440 lxc/remote.go:445
 msgid "NO"
 msgstr ""
 
@@ -1721,7 +1771,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:462
+#: lxc/list.go:462 lxc/project.go:368
 msgid "PROFILES"
 msgstr ""
 
@@ -1750,7 +1800,7 @@ msgstr ""
 msgid "Pid: %d"
 msgstr ""
 
-#: lxc/network.go:643 lxc/profile.go:500 lxc/storage.go:304
+#: lxc/network.go:643 lxc/profile.go:500 lxc/project.go:268 lxc/storage.go:304
 #: lxc/storage_volume.go:817
 msgid "Press enter to open the editor again"
 msgstr ""
@@ -1834,6 +1884,21 @@ msgstr ""
 msgid "Profiles: %s"
 msgstr ""
 
+#: lxc/project.go:110
+#, c-format
+msgid "Project %s created"
+msgstr ""
+
+#: lxc/project.go:161
+#, c-format
+msgid "Project %s deleted"
+msgstr ""
+
+#: lxc/project.go:427
+#, c-format
+msgid "Project %s renamed to %s"
+msgstr ""
+
 #: lxc/image.go:861
 msgid "Properties:"
 msgstr ""
@@ -1873,11 +1938,11 @@ msgstr ""
 msgid "Recursively transfer files"
 msgstr ""
 
-#: lxc/image.go:1223 lxc/image.go:1224
+#: lxc/image.go:1224 lxc/image.go:1225
 msgid "Refresh images"
 msgstr ""
 
-#: lxc/image.go:1252
+#: lxc/image.go:1253
 #, c-format
 msgid "Refreshing the image: %s"
 msgstr ""
@@ -1887,7 +1952,8 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656 lxc/remote.go:694
+#: lxc/project.go:523 lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656
+#: lxc/remote.go:694
 #, c-format
 msgid "Remote %s doesn't exist"
 msgstr ""
@@ -1965,6 +2031,10 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
+#: lxc/project.go:387 lxc/project.go:388
+msgid "Rename projects"
+msgstr ""
+
 #: lxc/remote.go:523 lxc/remote.go:524
 msgid "Rename remotes"
 msgstr ""
@@ -2150,11 +2220,11 @@ msgstr ""
 msgid "Show full device configuration for containers or profiles"
 msgstr ""
 
-#: lxc/image.go:1300 lxc/image.go:1301
+#: lxc/image.go:1301 lxc/image.go:1302
 msgid "Show image properties"
 msgstr ""
 
-#: lxc/main.go:215 lxc/main.go:216
+#: lxc/main.go:219 lxc/main.go:220
 msgid "Show less common commands"
 msgstr ""
 
@@ -2170,6 +2240,10 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
+#: lxc/project.go:442 lxc/project.go:443
+msgid "Show project options"
+msgstr ""
+
 #: lxc/storage.go:649 lxc/storage.go:650
 msgid "Show storage pool configurations and resources"
 msgstr ""
@@ -2317,6 +2391,10 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
+#: lxc/project.go:495 lxc/project.go:496
+msgid "Switch the current project"
+msgstr ""
+
 #: lxc/remote.go:635 lxc/remote.go:636
 msgid "Switch the default remote"
 msgstr ""
@@ -2379,7 +2457,7 @@ msgstr ""
 msgid "The profile device doesn't exist"
 msgstr ""
 
-#: lxc/move.go:218
+#: lxc/move.go:219
 msgid "The source LXD instance is not clustered"
 msgstr ""
 
@@ -2416,7 +2494,7 @@ msgstr ""
 msgid "To detach from the console, press: <ctrl>+a q"
 msgstr ""
 
-#: lxc/main.go:304
+#: lxc/main.go:308
 msgid "To start your first container, try: lxc launch ubuntu:18.04"
 msgstr ""
 
@@ -2467,7 +2545,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:862 lxc/profile.go:623 lxc/storage.go:558
+#: lxc/network.go:862 lxc/profile.go:623 lxc/project.go:369 lxc/storage.go:558
 #: lxc/storage_volume.go:962
 msgid "USED BY"
 msgstr ""
@@ -2552,7 +2630,8 @@ msgstr ""
 msgid "Whether or not to snapshot the container's running state"
 msgstr ""
 
-#: lxc/network.go:846 lxc/operation.go:143 lxc/remote.go:442 lxc/remote.go:447
+#: lxc/network.go:846 lxc/operation.go:143 lxc/project.go:344
+#: lxc/project.go:349 lxc/remote.go:442 lxc/remote.go:447
 msgid "YES"
 msgstr ""
 
@@ -2568,7 +2647,7 @@ msgstr ""
 msgid "You must specify a destination container name when using --target"
 msgstr ""
 
-#: lxc/copy.go:72 lxc/move.go:202
+#: lxc/copy.go:72 lxc/move.go:203
 msgid "You must specify a source container name"
 msgstr ""
 
@@ -2672,6 +2751,14 @@ msgstr ""
 msgid "create [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:71
+msgid "create [<remote>:]<project>"
+msgstr ""
+
+#: lxc/project.go:354
+msgid "current"
+msgstr ""
+
 #: lxc/remote.go:459
 msgid "default"
 msgstr ""
@@ -2718,6 +2805,10 @@ msgstr ""
 msgid "delete [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:124
+msgid "delete [<remote>:]<project>"
+msgstr ""
+
 #: lxc/storage.go:436
 msgid "description"
 msgstr ""
@@ -2786,6 +2877,10 @@ msgstr ""
 msgid "edit [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:175
+msgid "edit [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:86
 msgid "edit [<remote>:][<container>]"
 msgstr ""
@@ -2896,7 +2991,7 @@ msgid "list"
 msgstr ""
 
 #: lxc/cluster.go:61 lxc/config_trust.go:112 lxc/network.go:796
-#: lxc/operation.go:98 lxc/profile.go:574 lxc/storage.go:493
+#: lxc/operation.go:98 lxc/profile.go:574 lxc/project.go:295 lxc/storage.go:493
 msgid "list [<remote>:]"
 msgstr ""
 
@@ -3081,6 +3176,12 @@ msgid ""
 "    Update a profile using the content of profile.yaml"
 msgstr ""
 
+#: lxc/project.go:179
+msgid ""
+"lxc project edit <project> < project.yaml\n"
+"    Update a project using the content of project.yaml"
+msgstr ""
+
 #: lxc/query.go:32
 msgid ""
 "lxc query -X DELETE --wait /1.0/containers/c1\n"
@@ -3183,6 +3284,10 @@ msgstr ""
 msgid "profile"
 msgstr ""
 
+#: lxc/project.go:27
+msgid "project"
+msgstr ""
+
 #: lxc/publish.go:32
 msgid ""
 "publish [<remote>:]<container>[/<snapshot>] [<remote>:] [flags] "
@@ -3205,7 +3310,7 @@ msgstr ""
 msgid "query [<remote>:]<API path>"
 msgstr ""
 
-#: lxc/image.go:1222
+#: lxc/image.go:1223
 msgid "refresh [<remote>:]<image> [[<remote>:]<image>...]"
 msgstr ""
 
@@ -3269,6 +3374,10 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
+#: lxc/project.go:385
+msgid "rename [<remote>:]<project> <new-name>"
+msgstr ""
+
 #: lxc/action.go:68
 msgid "restart [<remote>:]<container> [[<remote>:]<container>...]"
 msgstr ""
@@ -3317,7 +3426,7 @@ msgstr ""
 msgid "show [<remote>:]<container|profile>"
 msgstr ""
 
-#: lxc/image.go:1299
+#: lxc/image.go:1300
 msgid "show [<remote>:]<image>"
 msgstr ""
 
@@ -3345,6 +3454,10 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:441
+msgid "show [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:450
 msgid "show [<remote>:][<container>]"
 msgstr ""
@@ -3381,6 +3494,10 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
+#: lxc/project.go:494
+msgid "switch [<remote>:] <project>"
+msgstr ""
+
 #: lxc/info.go:255
 #, c-format
 msgid "taken at %s"
diff --git a/po/fr.po b/po/fr.po
index ee04a089ff..c6f476d89f 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: 2018-08-23 15:14-0400\n"
+"POT-Creation-Date: 2018-09-02 06:35+0000\n"
 "PO-Revision-Date: 2018-03-06 13:50+0000\n"
 "Last-Translator: Alban Vidal <alban.vidal at zordhak.fr>\n"
 "Language-Team: French <https://hosted.weblate.org/projects/linux-containers/"
@@ -242,6 +242,40 @@ msgstr ""
 "###\n"
 "### Notez que le nom est affiché mais ne peut être modifié"
 
+#: lxc/project.go:189
+#, fuzzy
+msgid ""
+"### This is a yaml representation of the project.\n"
+"### Any line starting with a '# will be ignored.\n"
+"###\n"
+"### A project consists of a set of features and a description.\n"
+"###\n"
+"### An example would look like:\n"
+"### name: my-project\n"
+"### features:\n"
+"###   images: True\n"
+"###   profiles: True\n"
+"### description: My own project\n"
+"###\n"
+"### Note that the name is shown but cannot be changed"
+msgstr ""
+"### Ceci est une représentation yaml du profil.\n"
+"### Toute ligne commençant par un '# sera ignorée.\n"
+"###\n"
+"### Un profil est constitué d'un ensemble d'éléments de configuration.\n"
+"###\n"
+"### Un exemple resemblerait à :\n"
+"### name: onenic\n"
+"### config:\n"
+"###   raw.lxc: lxc.aa_profile=unconfined\n"
+"### devices:\n"
+"###   eth0:\n"
+"###     nictype: bridged\n"
+"###     parent: lxdbr0\n"
+"###     type: nic\n"
+"###\n"
+"### Notez que le nom est affiché mais ne peut être modifié"
+
 #: lxc/image.go:966
 #, c-format
 msgid "%s (%d more)"
@@ -570,8 +604,8 @@ msgid "Config key/value to apply to the target container"
 msgstr "Clé/valeur de configuration à appliquer au nouveau conteneur"
 
 #: lxc/config.go:195 lxc/config.go:259 lxc/config_metadata.go:144
-#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/storage.go:303
-#: lxc/storage_volume.go:816
+#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/project.go:267
+#: lxc/storage.go:303 lxc/storage_volume.go:816
 #, c-format
 msgid "Config parsing error: %s"
 msgstr "Erreur lors de la lecture de la configuration : %s"
@@ -715,6 +749,11 @@ msgstr ""
 msgid "Create profiles"
 msgstr "Créé : %s"
 
+#: lxc/project.go:72 lxc/project.go:73
+#, fuzzy
+msgid "Create projects"
+msgstr "Créé : %s"
+
 #: lxc/storage.go:88 lxc/storage.go:89
 #, fuzzy
 msgid "Create storage pools"
@@ -791,6 +830,11 @@ msgstr ""
 msgid "Delete profiles"
 msgstr ""
 
+#: lxc/project.go:126 lxc/project.go:127
+#, fuzzy
+msgid "Delete projects"
+msgstr "Récupération de l'image : %s"
+
 #: lxc/storage.go:162 lxc/storage.go:163
 msgid "Delete storage pools"
 msgstr ""
@@ -818,7 +862,7 @@ msgstr "Copie de l'image : %s"
 #: lxc/file.go:42 lxc/file.go:75 lxc/file.go:124 lxc/file.go:187
 #: lxc/file.go:377 lxc/image.go:42 lxc/image.go:131 lxc/image.go:265
 #: lxc/image.go:316 lxc/image.go:439 lxc/image.go:579 lxc/image.go:788
-#: lxc/image.go:902 lxc/image.go:1224 lxc/image.go:1301 lxc/image_alias.go:26
+#: lxc/image.go:902 lxc/image.go:1225 lxc/image.go:1302 lxc/image_alias.go:26
 #: lxc/image_alias.go:59 lxc/image_alias.go:106 lxc/image_alias.go:149
 #: lxc/image_alias.go:250 lxc/import.go:25 lxc/info.go:29 lxc/init.go:35
 #: lxc/launch.go:22 lxc/list.go:48 lxc/main.go:48 lxc/manpage.go:19
@@ -831,7 +875,9 @@ msgstr "Copie de l'image : %s"
 #: lxc/profile.go:30 lxc/profile.go:102 lxc/profile.go:165 lxc/profile.go:245
 #: lxc/profile.go:301 lxc/profile.go:355 lxc/profile.go:405 lxc/profile.go:529
 #: lxc/profile.go:577 lxc/profile.go:641 lxc/profile.go:717 lxc/profile.go:767
-#: lxc/profile.go:826 lxc/profile.go:880 lxc/publish.go:34 lxc/query.go:30
+#: lxc/profile.go:826 lxc/profile.go:880 lxc/project.go:29 lxc/project.go:73
+#: lxc/project.go:127 lxc/project.go:177 lxc/project.go:298 lxc/project.go:388
+#: lxc/project.go:443 lxc/project.go:496 lxc/publish.go:34 lxc/query.go:30
 #: lxc/remote.go:37 lxc/remote.go:87 lxc/remote.go:383 lxc/remote.go:419
 #: lxc/remote.go:524 lxc/remote.go:586 lxc/remote.go:636 lxc/remote.go:674
 #: lxc/rename.go:21 lxc/restore.go:24 lxc/snapshot.go:21 lxc/storage.go:33
@@ -943,6 +989,11 @@ msgstr ""
 msgid "Edit profile configurations as YAML"
 msgstr ""
 
+#: lxc/project.go:176 lxc/project.go:177
+#, fuzzy
+msgid "Edit project configurations as YAML"
+msgstr "Clé de configuration invalide"
+
 #: lxc/storage.go:212 lxc/storage.go:213
 msgid "Edit storage pool configurations as YAML"
 msgstr ""
@@ -1070,7 +1121,7 @@ msgstr "NOM"
 msgid "FINGERPRINT"
 msgstr "EMPREINTE"
 
-#: lxc/move.go:213
+#: lxc/move.go:214
 #, fuzzy
 msgid "Failed to connect to cluster member"
 msgstr "Profil à appliquer au nouveau conteneur"
@@ -1183,6 +1234,10 @@ msgstr "NOM"
 msgid "ID"
 msgstr "PID"
 
+#: lxc/project.go:367
+msgid "IMAGES"
+msgstr ""
+
 #: lxc/network.go:964
 msgid "IP ADDRESS"
 msgstr ""
@@ -1199,7 +1254,7 @@ msgstr "IPv6"
 msgid "ISSUE DATE"
 msgstr "DATE D'ÉMISSION"
 
-#: lxc/main.go:301
+#: lxc/main.go:305
 #, fuzzy
 msgid ""
 "If this is your first time running LXD on this machine, you should also run: "
@@ -1213,7 +1268,7 @@ msgstr ""
 msgid "Ignore the container state"
 msgstr "Ignorer l'état du conteneur (seulement pour start)"
 
-#: lxc/image.go:1284
+#: lxc/image.go:1285
 msgid "Image already up to date."
 msgstr ""
 
@@ -1226,7 +1281,7 @@ msgstr "Image copiée avec succès !"
 msgid "Image exported successfully!"
 msgstr "Image copiée avec succès !"
 
-#: lxc/image.go:288 lxc/image.go:1247
+#: lxc/image.go:288 lxc/image.go:1248
 msgid "Image identifier missing"
 msgstr ""
 
@@ -1240,7 +1295,7 @@ msgstr "Image importée avec l'empreinte : %s"
 msgid "Image imported with fingerprint: %s"
 msgstr "Image importée avec l'empreinte : %s"
 
-#: lxc/image.go:1282
+#: lxc/image.go:1283
 #, fuzzy
 msgid "Image refreshed successfully!"
 msgstr "Image copiée avec succès !"
@@ -1298,7 +1353,7 @@ msgstr "Clé de configuration invalide"
 msgid "Invalid config key column format (too many fields): '%s'"
 msgstr ""
 
-#: lxc/image.go:1208 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
+#: lxc/image.go:1209 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
 #, fuzzy, c-format
 msgid "Invalid format %q"
 msgstr "Cible invalide %s"
@@ -1319,7 +1374,7 @@ msgid ""
 "Invalid name in '%s', empty string is only allowed when defining maxWidth"
 msgstr ""
 
-#: lxc/main.go:389
+#: lxc/main.go:393
 #, fuzzy
 msgid "Invalid number of arguments"
 msgstr "nombre d'arguments incorrect pour la sous-comande"
@@ -1580,6 +1635,10 @@ msgstr ""
 msgid "List profiles"
 msgstr ""
 
+#: lxc/project.go:297 lxc/project.go:298
+msgid "List projects"
+msgstr ""
+
 #: lxc/storage_volume.go:911 lxc/storage_volume.go:912
 #, fuzzy
 msgid "List storage volumes"
@@ -1704,6 +1763,11 @@ msgstr ""
 msgid "Manage profiles"
 msgstr ""
 
+#: lxc/project.go:28 lxc/project.go:29
+#, fuzzy
+msgid "Manage projects"
+msgstr "Rendre l'image publique"
+
 #: lxc/storage.go:32 lxc/storage.go:33
 #, fuzzy
 msgid "Manage storage pools and volumes"
@@ -1753,12 +1817,12 @@ msgstr "Mémoire (pointe)"
 msgid "Memory usage:"
 msgstr "  Mémoire utilisée :"
 
-#: lxc/move.go:226
+#: lxc/move.go:227
 #, fuzzy
 msgid "Migration API failure"
 msgstr "Échec lors de la migration vers l'hôte source: %s"
 
-#: lxc/move.go:231
+#: lxc/move.go:232
 msgid "Migration operation failure"
 msgstr ""
 
@@ -1811,6 +1875,12 @@ msgstr "Nom de l'ensemble de stockage"
 msgid "Missing profile name"
 msgstr ""
 
+#: lxc/project.go:97 lxc/project.go:151 lxc/project.go:221 lxc/project.go:412
+#: lxc/project.go:467
+#, fuzzy
+msgid "Missing project name"
+msgstr "Nom de l'ensemble de stockage"
+
 #: lxc/profile.go:270
 msgid "Missing source profile name"
 msgstr ""
@@ -1876,11 +1946,13 @@ msgid "Must supply container name for: "
 msgstr "Vous devez fournir le nom d'un conteneur pour : "
 
 #: lxc/cluster.go:124 lxc/list.go:459 lxc/network.go:858 lxc/profile.go:622
-#: lxc/remote.go:465 lxc/storage.go:549 lxc/storage_volume.go:960
+#: lxc/project.go:366 lxc/remote.go:465 lxc/storage.go:549
+#: lxc/storage_volume.go:960
 msgid "NAME"
 msgstr "NOM"
 
-#: lxc/network.go:844 lxc/operation.go:141 lxc/remote.go:440 lxc/remote.go:445
+#: lxc/network.go:844 lxc/operation.go:141 lxc/project.go:342
+#: lxc/project.go:347 lxc/remote.go:440 lxc/remote.go:445
 msgid "NO"
 msgstr "NON"
 
@@ -1995,7 +2067,7 @@ msgstr "PID"
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:462
+#: lxc/list.go:462 lxc/project.go:368
 msgid "PROFILES"
 msgstr "PROFILS"
 
@@ -2025,7 +2097,7 @@ msgstr "Création du conteneur"
 msgid "Pid: %d"
 msgstr "Pid : %d"
 
-#: lxc/network.go:643 lxc/profile.go:500 lxc/storage.go:304
+#: lxc/network.go:643 lxc/profile.go:500 lxc/project.go:268 lxc/storage.go:304
 #: lxc/storage_volume.go:817
 msgid "Press enter to open the editor again"
 msgstr "Appuyer sur Entrée pour ouvrir à nouveau l'éditeur"
@@ -2110,6 +2182,21 @@ msgstr "Profils %s appliqués à %s"
 msgid "Profiles: %s"
 msgstr "Profils : %s"
 
+#: lxc/project.go:110
+#, fuzzy, c-format
+msgid "Project %s created"
+msgstr "Profil %s créé"
+
+#: lxc/project.go:161
+#, fuzzy, c-format
+msgid "Project %s deleted"
+msgstr "Profil %s supprimé"
+
+#: lxc/project.go:427
+#, fuzzy, c-format
+msgid "Project %s renamed to %s"
+msgstr "Profil %s ajouté à %s"
+
 #: lxc/image.go:861
 msgid "Properties:"
 msgstr "Propriétés :"
@@ -2153,12 +2240,12 @@ msgstr ""
 msgid "Recursively transfer files"
 msgstr "Pousser ou récupérer des fichiers récursivement"
 
-#: lxc/image.go:1223 lxc/image.go:1224
+#: lxc/image.go:1224 lxc/image.go:1225
 #, fuzzy
 msgid "Refresh images"
 msgstr "Récupération de l'image : %s"
 
-#: lxc/image.go:1252
+#: lxc/image.go:1253
 #, fuzzy, c-format
 msgid "Refreshing the image: %s"
 msgstr "Récupération de l'image : %s"
@@ -2168,7 +2255,8 @@ msgstr "Récupération de l'image : %s"
 msgid "Remote %s already exists"
 msgstr "le serveur distant %s existe déjà"
 
-#: lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656 lxc/remote.go:694
+#: lxc/project.go:523 lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656
+#: lxc/remote.go:694
 #, fuzzy, c-format
 msgid "Remote %s doesn't exist"
 msgstr "le serveur distant %s n'existe pas"
@@ -2251,6 +2339,11 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
+#: lxc/project.go:387 lxc/project.go:388
+#, fuzzy
+msgid "Rename projects"
+msgstr "Créé : %s"
+
 #: lxc/remote.go:523 lxc/remote.go:524
 msgid "Rename remotes"
 msgstr ""
@@ -2454,11 +2547,11 @@ msgstr ""
 msgid "Show full device configuration for containers or profiles"
 msgstr ""
 
-#: lxc/image.go:1300 lxc/image.go:1301
+#: lxc/image.go:1301 lxc/image.go:1302
 msgid "Show image properties"
 msgstr ""
 
-#: lxc/main.go:215 lxc/main.go:216
+#: lxc/main.go:219 lxc/main.go:220
 #, fuzzy
 msgid "Show less common commands"
 msgstr "Afficher les commandes moins communes"
@@ -2478,6 +2571,11 @@ msgstr "Afficher la configuration étendue"
 msgid "Show profile configurations"
 msgstr "Afficher la configuration étendue"
 
+#: lxc/project.go:442 lxc/project.go:443
+#, fuzzy
+msgid "Show project options"
+msgstr "Afficher la configuration étendue"
+
 #: lxc/storage.go:649 lxc/storage.go:650
 msgid "Show storage pool configurations and resources"
 msgstr ""
@@ -2633,6 +2731,11 @@ msgstr "Swap (courant)"
 msgid "Swap (peak)"
 msgstr "Swap (pointe)"
 
+#: lxc/project.go:495 lxc/project.go:496
+#, fuzzy
+msgid "Switch the current project"
+msgstr "impossible de supprimer le serveur distant par défaut"
+
 #: lxc/remote.go:635 lxc/remote.go:636
 #, fuzzy
 msgid "Switch the default remote"
@@ -2704,7 +2807,7 @@ msgstr "L'image locale '%s' n'a pas été trouvée, essayer '%s:' à la place."
 msgid "The profile device doesn't exist"
 msgstr "Le périphérique indiqué n'existe pas"
 
-#: lxc/move.go:218
+#: lxc/move.go:219
 msgid "The source LXD instance is not clustered"
 msgstr ""
 
@@ -2741,7 +2844,7 @@ msgstr "Pour créer un réseau, utiliser : lxc network create"
 msgid "To detach from the console, press: <ctrl>+a q"
 msgstr ""
 
-#: lxc/main.go:304
+#: lxc/main.go:308
 #, fuzzy
 msgid "To start your first container, try: lxc launch ubuntu:18.04"
 msgstr ""
@@ -2794,7 +2897,7 @@ msgstr "DATE DE PUBLICATION"
 msgid "URL"
 msgstr "URL"
 
-#: lxc/network.go:862 lxc/profile.go:623 lxc/storage.go:558
+#: lxc/network.go:862 lxc/profile.go:623 lxc/project.go:369 lxc/storage.go:558
 #: lxc/storage_volume.go:962
 msgid "USED BY"
 msgstr "UTILISÉ PAR"
@@ -2890,7 +2993,8 @@ msgstr ""
 msgid "Whether or not to snapshot the container's running state"
 msgstr "Réaliser ou pas l'instantané de l'état de fonctionnement du conteneur"
 
-#: lxc/network.go:846 lxc/operation.go:143 lxc/remote.go:442 lxc/remote.go:447
+#: lxc/network.go:846 lxc/operation.go:143 lxc/project.go:344
+#: lxc/project.go:349 lxc/remote.go:442 lxc/remote.go:447
 msgid "YES"
 msgstr "OUI"
 
@@ -2908,7 +3012,7 @@ msgstr "impossible de copier vers le même nom de conteneur"
 msgid "You must specify a destination container name when using --target"
 msgstr "vous devez spécifier un nom de conteneur source"
 
-#: lxc/copy.go:72 lxc/move.go:202
+#: lxc/copy.go:72 lxc/move.go:203
 #, fuzzy
 msgid "You must specify a source container name"
 msgstr "vous devez spécifier un nom de conteneur source"
@@ -3014,6 +3118,15 @@ msgstr ""
 msgid "create [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:71
+msgid "create [<remote>:]<project>"
+msgstr ""
+
+#: lxc/project.go:354
+#, fuzzy
+msgid "current"
+msgstr "Swap (courant)"
+
 #: lxc/remote.go:459
 msgid "default"
 msgstr "par défaut"
@@ -3076,6 +3189,14 @@ msgstr ""
 msgid "delete [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:124
+#, fuzzy
+msgid "delete [<remote>:]<project>"
+msgstr ""
+"Change l'état d'un ou plusieurs conteneurs à %s.\n"
+"\n"
+"lxc %s [<remote>:]<container> [[<remote>:]<container>...]%s"
+
 #: lxc/storage.go:436
 msgid "description"
 msgstr ""
@@ -3144,6 +3265,10 @@ msgstr ""
 msgid "edit [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:175
+msgid "edit [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:86
 msgid "edit [<remote>:][<container>]"
 msgstr ""
@@ -3259,7 +3384,7 @@ msgid "list"
 msgstr ""
 
 #: lxc/cluster.go:61 lxc/config_trust.go:112 lxc/network.go:796
-#: lxc/operation.go:98 lxc/profile.go:574 lxc/storage.go:493
+#: lxc/operation.go:98 lxc/profile.go:574 lxc/project.go:295 lxc/storage.go:493
 msgid "list [<remote>:]"
 msgstr ""
 
@@ -3466,6 +3591,12 @@ msgid ""
 "    Update a profile using the content of profile.yaml"
 msgstr ""
 
+#: lxc/project.go:179
+msgid ""
+"lxc project edit <project> < project.yaml\n"
+"    Update a project using the content of project.yaml"
+msgstr ""
+
 #: lxc/query.go:32
 msgid ""
 "lxc query -X DELETE --wait /1.0/containers/c1\n"
@@ -3583,6 +3714,10 @@ msgstr ""
 msgid "profile"
 msgstr "Profils : %s"
 
+#: lxc/project.go:27
+msgid "project"
+msgstr ""
+
 #: lxc/publish.go:32
 #, fuzzy
 msgid ""
@@ -3622,7 +3757,7 @@ msgstr ""
 msgid "query [<remote>:]<API path>"
 msgstr ""
 
-#: lxc/image.go:1222
+#: lxc/image.go:1223
 #, fuzzy
 msgid "refresh [<remote>:]<image> [[<remote>:]<image>...]"
 msgstr ""
@@ -3699,6 +3834,10 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
+#: lxc/project.go:385
+msgid "rename [<remote>:]<project> <new-name>"
+msgstr ""
+
 #: lxc/action.go:68
 #, fuzzy
 msgid "restart [<remote>:]<container> [[<remote>:]<container>...]"
@@ -3751,7 +3890,7 @@ msgstr ""
 msgid "show [<remote>:]<container|profile>"
 msgstr ""
 
-#: lxc/image.go:1299
+#: lxc/image.go:1300
 msgid "show [<remote>:]<image>"
 msgstr ""
 
@@ -3779,6 +3918,10 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:441
+msgid "show [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:450
 msgid "show [<remote>:][<container>]"
 msgstr ""
@@ -3824,6 +3967,14 @@ msgstr ""
 msgid "switch <remote>"
 msgstr "impossible de supprimer le serveur distant par défaut"
 
+#: lxc/project.go:494
+#, fuzzy
+msgid "switch [<remote>:] <project>"
+msgstr ""
+"Change l'état d'un ou plusieurs conteneurs à %s.\n"
+"\n"
+"lxc %s [<remote>:]<container> [[<remote>:]<container>...]%s"
+
 #: lxc/info.go:255
 #, c-format
 msgid "taken at %s"
diff --git a/po/hi.po b/po/hi.po
index 67781b0bd2..abb25bdb62 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: 2018-08-23 15:14-0400\n"
+"POT-Creation-Date: 2018-09-02 06:35+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -143,6 +143,23 @@ msgid ""
 "### Note that the name is shown but cannot be changed"
 msgstr ""
 
+#: lxc/project.go:189
+msgid ""
+"### This is a yaml representation of the project.\n"
+"### Any line starting with a '# will be ignored.\n"
+"###\n"
+"### A project consists of a set of features and a description.\n"
+"###\n"
+"### An example would look like:\n"
+"### name: my-project\n"
+"### features:\n"
+"###   images: True\n"
+"###   profiles: True\n"
+"### description: My own project\n"
+"###\n"
+"### Note that the name is shown but cannot be changed"
+msgstr ""
+
 #: lxc/image.go:966
 #, c-format
 msgid "%s (%d more)"
@@ -453,8 +470,8 @@ msgid "Config key/value to apply to the target container"
 msgstr ""
 
 #: lxc/config.go:195 lxc/config.go:259 lxc/config_metadata.go:144
-#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/storage.go:303
-#: lxc/storage_volume.go:816
+#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/project.go:267
+#: lxc/storage.go:303 lxc/storage_volume.go:816
 #, c-format
 msgid "Config parsing error: %s"
 msgstr ""
@@ -575,6 +592,10 @@ msgstr ""
 msgid "Create profiles"
 msgstr ""
 
+#: lxc/project.go:72 lxc/project.go:73
+msgid "Create projects"
+msgstr ""
+
 #: lxc/storage.go:88 lxc/storage.go:89
 msgid "Create storage pools"
 msgstr ""
@@ -646,6 +667,10 @@ msgstr ""
 msgid "Delete profiles"
 msgstr ""
 
+#: lxc/project.go:126 lxc/project.go:127
+msgid "Delete projects"
+msgstr ""
+
 #: lxc/storage.go:162 lxc/storage.go:163
 msgid "Delete storage pools"
 msgstr ""
@@ -672,7 +697,7 @@ msgstr ""
 #: lxc/file.go:42 lxc/file.go:75 lxc/file.go:124 lxc/file.go:187
 #: lxc/file.go:377 lxc/image.go:42 lxc/image.go:131 lxc/image.go:265
 #: lxc/image.go:316 lxc/image.go:439 lxc/image.go:579 lxc/image.go:788
-#: lxc/image.go:902 lxc/image.go:1224 lxc/image.go:1301 lxc/image_alias.go:26
+#: lxc/image.go:902 lxc/image.go:1225 lxc/image.go:1302 lxc/image_alias.go:26
 #: lxc/image_alias.go:59 lxc/image_alias.go:106 lxc/image_alias.go:149
 #: lxc/image_alias.go:250 lxc/import.go:25 lxc/info.go:29 lxc/init.go:35
 #: lxc/launch.go:22 lxc/list.go:48 lxc/main.go:48 lxc/manpage.go:19
@@ -685,7 +710,9 @@ msgstr ""
 #: lxc/profile.go:30 lxc/profile.go:102 lxc/profile.go:165 lxc/profile.go:245
 #: lxc/profile.go:301 lxc/profile.go:355 lxc/profile.go:405 lxc/profile.go:529
 #: lxc/profile.go:577 lxc/profile.go:641 lxc/profile.go:717 lxc/profile.go:767
-#: lxc/profile.go:826 lxc/profile.go:880 lxc/publish.go:34 lxc/query.go:30
+#: lxc/profile.go:826 lxc/profile.go:880 lxc/project.go:29 lxc/project.go:73
+#: lxc/project.go:127 lxc/project.go:177 lxc/project.go:298 lxc/project.go:388
+#: lxc/project.go:443 lxc/project.go:496 lxc/publish.go:34 lxc/query.go:30
 #: lxc/remote.go:37 lxc/remote.go:87 lxc/remote.go:383 lxc/remote.go:419
 #: lxc/remote.go:524 lxc/remote.go:586 lxc/remote.go:636 lxc/remote.go:674
 #: lxc/rename.go:21 lxc/restore.go:24 lxc/snapshot.go:21 lxc/storage.go:33
@@ -794,6 +821,10 @@ msgstr ""
 msgid "Edit profile configurations as YAML"
 msgstr ""
 
+#: lxc/project.go:176 lxc/project.go:177
+msgid "Edit project configurations as YAML"
+msgstr ""
+
 #: lxc/storage.go:212 lxc/storage.go:213
 msgid "Edit storage pool configurations as YAML"
 msgstr ""
@@ -908,7 +939,7 @@ msgstr ""
 msgid "FINGERPRINT"
 msgstr ""
 
-#: lxc/move.go:213
+#: lxc/move.go:214
 msgid "Failed to connect to cluster member"
 msgstr ""
 
@@ -1012,6 +1043,10 @@ msgstr ""
 msgid "ID"
 msgstr ""
 
+#: lxc/project.go:367
+msgid "IMAGES"
+msgstr ""
+
 #: lxc/network.go:964
 msgid "IP ADDRESS"
 msgstr ""
@@ -1028,7 +1063,7 @@ msgstr ""
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:301
+#: lxc/main.go:305
 msgid ""
 "If this is your first time running LXD on this machine, you should also run: "
 "lxd init"
@@ -1038,7 +1073,7 @@ msgstr ""
 msgid "Ignore the container state"
 msgstr ""
 
-#: lxc/image.go:1284
+#: lxc/image.go:1285
 msgid "Image already up to date."
 msgstr ""
 
@@ -1050,7 +1085,7 @@ msgstr ""
 msgid "Image exported successfully!"
 msgstr ""
 
-#: lxc/image.go:288 lxc/image.go:1247
+#: lxc/image.go:288 lxc/image.go:1248
 msgid "Image identifier missing"
 msgstr ""
 
@@ -1064,7 +1099,7 @@ msgstr ""
 msgid "Image imported with fingerprint: %s"
 msgstr ""
 
-#: lxc/image.go:1282
+#: lxc/image.go:1283
 msgid "Image refreshed successfully!"
 msgstr ""
 
@@ -1119,7 +1154,7 @@ msgstr ""
 msgid "Invalid config key column format (too many fields): '%s'"
 msgstr ""
 
-#: lxc/image.go:1208 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
+#: lxc/image.go:1209 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
 #, c-format
 msgid "Invalid format %q"
 msgstr ""
@@ -1140,7 +1175,7 @@ msgid ""
 "Invalid name in '%s', empty string is only allowed when defining maxWidth"
 msgstr ""
 
-#: lxc/main.go:389
+#: lxc/main.go:393
 msgid "Invalid number of arguments"
 msgstr ""
 
@@ -1336,6 +1371,10 @@ msgstr ""
 msgid "List profiles"
 msgstr ""
 
+#: lxc/project.go:297 lxc/project.go:298
+msgid "List projects"
+msgstr ""
+
 #: lxc/storage_volume.go:911 lxc/storage_volume.go:912
 msgid "List storage volumes"
 msgstr ""
@@ -1454,6 +1493,10 @@ msgstr ""
 msgid "Manage profiles"
 msgstr ""
 
+#: lxc/project.go:28 lxc/project.go:29
+msgid "Manage projects"
+msgstr ""
+
 #: lxc/storage.go:32 lxc/storage.go:33
 msgid "Manage storage pools and volumes"
 msgstr ""
@@ -1500,11 +1543,11 @@ msgstr ""
 msgid "Memory usage:"
 msgstr ""
 
-#: lxc/move.go:226
+#: lxc/move.go:227
 msgid "Migration API failure"
 msgstr ""
 
-#: lxc/move.go:231
+#: lxc/move.go:232
 msgid "Migration operation failure"
 msgstr ""
 
@@ -1552,6 +1595,11 @@ msgstr ""
 msgid "Missing profile name"
 msgstr ""
 
+#: lxc/project.go:97 lxc/project.go:151 lxc/project.go:221 lxc/project.go:412
+#: lxc/project.go:467
+msgid "Missing project name"
+msgstr ""
+
 #: lxc/profile.go:270
 msgid "Missing source profile name"
 msgstr ""
@@ -1610,11 +1658,13 @@ msgid "Must supply container name for: "
 msgstr ""
 
 #: lxc/cluster.go:124 lxc/list.go:459 lxc/network.go:858 lxc/profile.go:622
-#: lxc/remote.go:465 lxc/storage.go:549 lxc/storage_volume.go:960
+#: lxc/project.go:366 lxc/remote.go:465 lxc/storage.go:549
+#: lxc/storage_volume.go:960
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:844 lxc/operation.go:141 lxc/remote.go:440 lxc/remote.go:445
+#: lxc/network.go:844 lxc/operation.go:141 lxc/project.go:342
+#: lxc/project.go:347 lxc/remote.go:440 lxc/remote.go:445
 msgid "NO"
 msgstr ""
 
@@ -1721,7 +1771,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:462
+#: lxc/list.go:462 lxc/project.go:368
 msgid "PROFILES"
 msgstr ""
 
@@ -1750,7 +1800,7 @@ msgstr ""
 msgid "Pid: %d"
 msgstr ""
 
-#: lxc/network.go:643 lxc/profile.go:500 lxc/storage.go:304
+#: lxc/network.go:643 lxc/profile.go:500 lxc/project.go:268 lxc/storage.go:304
 #: lxc/storage_volume.go:817
 msgid "Press enter to open the editor again"
 msgstr ""
@@ -1834,6 +1884,21 @@ msgstr ""
 msgid "Profiles: %s"
 msgstr ""
 
+#: lxc/project.go:110
+#, c-format
+msgid "Project %s created"
+msgstr ""
+
+#: lxc/project.go:161
+#, c-format
+msgid "Project %s deleted"
+msgstr ""
+
+#: lxc/project.go:427
+#, c-format
+msgid "Project %s renamed to %s"
+msgstr ""
+
 #: lxc/image.go:861
 msgid "Properties:"
 msgstr ""
@@ -1873,11 +1938,11 @@ msgstr ""
 msgid "Recursively transfer files"
 msgstr ""
 
-#: lxc/image.go:1223 lxc/image.go:1224
+#: lxc/image.go:1224 lxc/image.go:1225
 msgid "Refresh images"
 msgstr ""
 
-#: lxc/image.go:1252
+#: lxc/image.go:1253
 #, c-format
 msgid "Refreshing the image: %s"
 msgstr ""
@@ -1887,7 +1952,8 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656 lxc/remote.go:694
+#: lxc/project.go:523 lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656
+#: lxc/remote.go:694
 #, c-format
 msgid "Remote %s doesn't exist"
 msgstr ""
@@ -1965,6 +2031,10 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
+#: lxc/project.go:387 lxc/project.go:388
+msgid "Rename projects"
+msgstr ""
+
 #: lxc/remote.go:523 lxc/remote.go:524
 msgid "Rename remotes"
 msgstr ""
@@ -2150,11 +2220,11 @@ msgstr ""
 msgid "Show full device configuration for containers or profiles"
 msgstr ""
 
-#: lxc/image.go:1300 lxc/image.go:1301
+#: lxc/image.go:1301 lxc/image.go:1302
 msgid "Show image properties"
 msgstr ""
 
-#: lxc/main.go:215 lxc/main.go:216
+#: lxc/main.go:219 lxc/main.go:220
 msgid "Show less common commands"
 msgstr ""
 
@@ -2170,6 +2240,10 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
+#: lxc/project.go:442 lxc/project.go:443
+msgid "Show project options"
+msgstr ""
+
 #: lxc/storage.go:649 lxc/storage.go:650
 msgid "Show storage pool configurations and resources"
 msgstr ""
@@ -2317,6 +2391,10 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
+#: lxc/project.go:495 lxc/project.go:496
+msgid "Switch the current project"
+msgstr ""
+
 #: lxc/remote.go:635 lxc/remote.go:636
 msgid "Switch the default remote"
 msgstr ""
@@ -2379,7 +2457,7 @@ msgstr ""
 msgid "The profile device doesn't exist"
 msgstr ""
 
-#: lxc/move.go:218
+#: lxc/move.go:219
 msgid "The source LXD instance is not clustered"
 msgstr ""
 
@@ -2416,7 +2494,7 @@ msgstr ""
 msgid "To detach from the console, press: <ctrl>+a q"
 msgstr ""
 
-#: lxc/main.go:304
+#: lxc/main.go:308
 msgid "To start your first container, try: lxc launch ubuntu:18.04"
 msgstr ""
 
@@ -2467,7 +2545,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:862 lxc/profile.go:623 lxc/storage.go:558
+#: lxc/network.go:862 lxc/profile.go:623 lxc/project.go:369 lxc/storage.go:558
 #: lxc/storage_volume.go:962
 msgid "USED BY"
 msgstr ""
@@ -2552,7 +2630,8 @@ msgstr ""
 msgid "Whether or not to snapshot the container's running state"
 msgstr ""
 
-#: lxc/network.go:846 lxc/operation.go:143 lxc/remote.go:442 lxc/remote.go:447
+#: lxc/network.go:846 lxc/operation.go:143 lxc/project.go:344
+#: lxc/project.go:349 lxc/remote.go:442 lxc/remote.go:447
 msgid "YES"
 msgstr ""
 
@@ -2568,7 +2647,7 @@ msgstr ""
 msgid "You must specify a destination container name when using --target"
 msgstr ""
 
-#: lxc/copy.go:72 lxc/move.go:202
+#: lxc/copy.go:72 lxc/move.go:203
 msgid "You must specify a source container name"
 msgstr ""
 
@@ -2672,6 +2751,14 @@ msgstr ""
 msgid "create [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:71
+msgid "create [<remote>:]<project>"
+msgstr ""
+
+#: lxc/project.go:354
+msgid "current"
+msgstr ""
+
 #: lxc/remote.go:459
 msgid "default"
 msgstr ""
@@ -2718,6 +2805,10 @@ msgstr ""
 msgid "delete [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:124
+msgid "delete [<remote>:]<project>"
+msgstr ""
+
 #: lxc/storage.go:436
 msgid "description"
 msgstr ""
@@ -2786,6 +2877,10 @@ msgstr ""
 msgid "edit [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:175
+msgid "edit [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:86
 msgid "edit [<remote>:][<container>]"
 msgstr ""
@@ -2896,7 +2991,7 @@ msgid "list"
 msgstr ""
 
 #: lxc/cluster.go:61 lxc/config_trust.go:112 lxc/network.go:796
-#: lxc/operation.go:98 lxc/profile.go:574 lxc/storage.go:493
+#: lxc/operation.go:98 lxc/profile.go:574 lxc/project.go:295 lxc/storage.go:493
 msgid "list [<remote>:]"
 msgstr ""
 
@@ -3081,6 +3176,12 @@ msgid ""
 "    Update a profile using the content of profile.yaml"
 msgstr ""
 
+#: lxc/project.go:179
+msgid ""
+"lxc project edit <project> < project.yaml\n"
+"    Update a project using the content of project.yaml"
+msgstr ""
+
 #: lxc/query.go:32
 msgid ""
 "lxc query -X DELETE --wait /1.0/containers/c1\n"
@@ -3183,6 +3284,10 @@ msgstr ""
 msgid "profile"
 msgstr ""
 
+#: lxc/project.go:27
+msgid "project"
+msgstr ""
+
 #: lxc/publish.go:32
 msgid ""
 "publish [<remote>:]<container>[/<snapshot>] [<remote>:] [flags] "
@@ -3205,7 +3310,7 @@ msgstr ""
 msgid "query [<remote>:]<API path>"
 msgstr ""
 
-#: lxc/image.go:1222
+#: lxc/image.go:1223
 msgid "refresh [<remote>:]<image> [[<remote>:]<image>...]"
 msgstr ""
 
@@ -3269,6 +3374,10 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
+#: lxc/project.go:385
+msgid "rename [<remote>:]<project> <new-name>"
+msgstr ""
+
 #: lxc/action.go:68
 msgid "restart [<remote>:]<container> [[<remote>:]<container>...]"
 msgstr ""
@@ -3317,7 +3426,7 @@ msgstr ""
 msgid "show [<remote>:]<container|profile>"
 msgstr ""
 
-#: lxc/image.go:1299
+#: lxc/image.go:1300
 msgid "show [<remote>:]<image>"
 msgstr ""
 
@@ -3345,6 +3454,10 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:441
+msgid "show [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:450
 msgid "show [<remote>:][<container>]"
 msgstr ""
@@ -3381,6 +3494,10 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
+#: lxc/project.go:494
+msgid "switch [<remote>:] <project>"
+msgstr ""
+
 #: lxc/info.go:255
 #, c-format
 msgid "taken at %s"
diff --git a/po/id.po b/po/id.po
index d98eeb3ffb..50b86628d6 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: 2018-08-23 15:14-0400\n"
+"POT-Creation-Date: 2018-09-02 06:35+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -143,6 +143,23 @@ msgid ""
 "### Note that the name is shown but cannot be changed"
 msgstr ""
 
+#: lxc/project.go:189
+msgid ""
+"### This is a yaml representation of the project.\n"
+"### Any line starting with a '# will be ignored.\n"
+"###\n"
+"### A project consists of a set of features and a description.\n"
+"###\n"
+"### An example would look like:\n"
+"### name: my-project\n"
+"### features:\n"
+"###   images: True\n"
+"###   profiles: True\n"
+"### description: My own project\n"
+"###\n"
+"### Note that the name is shown but cannot be changed"
+msgstr ""
+
 #: lxc/image.go:966
 #, c-format
 msgid "%s (%d more)"
@@ -453,8 +470,8 @@ msgid "Config key/value to apply to the target container"
 msgstr ""
 
 #: lxc/config.go:195 lxc/config.go:259 lxc/config_metadata.go:144
-#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/storage.go:303
-#: lxc/storage_volume.go:816
+#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/project.go:267
+#: lxc/storage.go:303 lxc/storage_volume.go:816
 #, c-format
 msgid "Config parsing error: %s"
 msgstr ""
@@ -575,6 +592,10 @@ msgstr ""
 msgid "Create profiles"
 msgstr ""
 
+#: lxc/project.go:72 lxc/project.go:73
+msgid "Create projects"
+msgstr ""
+
 #: lxc/storage.go:88 lxc/storage.go:89
 msgid "Create storage pools"
 msgstr ""
@@ -646,6 +667,10 @@ msgstr ""
 msgid "Delete profiles"
 msgstr ""
 
+#: lxc/project.go:126 lxc/project.go:127
+msgid "Delete projects"
+msgstr ""
+
 #: lxc/storage.go:162 lxc/storage.go:163
 msgid "Delete storage pools"
 msgstr ""
@@ -672,7 +697,7 @@ msgstr ""
 #: lxc/file.go:42 lxc/file.go:75 lxc/file.go:124 lxc/file.go:187
 #: lxc/file.go:377 lxc/image.go:42 lxc/image.go:131 lxc/image.go:265
 #: lxc/image.go:316 lxc/image.go:439 lxc/image.go:579 lxc/image.go:788
-#: lxc/image.go:902 lxc/image.go:1224 lxc/image.go:1301 lxc/image_alias.go:26
+#: lxc/image.go:902 lxc/image.go:1225 lxc/image.go:1302 lxc/image_alias.go:26
 #: lxc/image_alias.go:59 lxc/image_alias.go:106 lxc/image_alias.go:149
 #: lxc/image_alias.go:250 lxc/import.go:25 lxc/info.go:29 lxc/init.go:35
 #: lxc/launch.go:22 lxc/list.go:48 lxc/main.go:48 lxc/manpage.go:19
@@ -685,7 +710,9 @@ msgstr ""
 #: lxc/profile.go:30 lxc/profile.go:102 lxc/profile.go:165 lxc/profile.go:245
 #: lxc/profile.go:301 lxc/profile.go:355 lxc/profile.go:405 lxc/profile.go:529
 #: lxc/profile.go:577 lxc/profile.go:641 lxc/profile.go:717 lxc/profile.go:767
-#: lxc/profile.go:826 lxc/profile.go:880 lxc/publish.go:34 lxc/query.go:30
+#: lxc/profile.go:826 lxc/profile.go:880 lxc/project.go:29 lxc/project.go:73
+#: lxc/project.go:127 lxc/project.go:177 lxc/project.go:298 lxc/project.go:388
+#: lxc/project.go:443 lxc/project.go:496 lxc/publish.go:34 lxc/query.go:30
 #: lxc/remote.go:37 lxc/remote.go:87 lxc/remote.go:383 lxc/remote.go:419
 #: lxc/remote.go:524 lxc/remote.go:586 lxc/remote.go:636 lxc/remote.go:674
 #: lxc/rename.go:21 lxc/restore.go:24 lxc/snapshot.go:21 lxc/storage.go:33
@@ -794,6 +821,10 @@ msgstr ""
 msgid "Edit profile configurations as YAML"
 msgstr ""
 
+#: lxc/project.go:176 lxc/project.go:177
+msgid "Edit project configurations as YAML"
+msgstr ""
+
 #: lxc/storage.go:212 lxc/storage.go:213
 msgid "Edit storage pool configurations as YAML"
 msgstr ""
@@ -908,7 +939,7 @@ msgstr ""
 msgid "FINGERPRINT"
 msgstr ""
 
-#: lxc/move.go:213
+#: lxc/move.go:214
 msgid "Failed to connect to cluster member"
 msgstr ""
 
@@ -1012,6 +1043,10 @@ msgstr ""
 msgid "ID"
 msgstr ""
 
+#: lxc/project.go:367
+msgid "IMAGES"
+msgstr ""
+
 #: lxc/network.go:964
 msgid "IP ADDRESS"
 msgstr ""
@@ -1028,7 +1063,7 @@ msgstr ""
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:301
+#: lxc/main.go:305
 msgid ""
 "If this is your first time running LXD on this machine, you should also run: "
 "lxd init"
@@ -1038,7 +1073,7 @@ msgstr ""
 msgid "Ignore the container state"
 msgstr ""
 
-#: lxc/image.go:1284
+#: lxc/image.go:1285
 msgid "Image already up to date."
 msgstr ""
 
@@ -1050,7 +1085,7 @@ msgstr ""
 msgid "Image exported successfully!"
 msgstr ""
 
-#: lxc/image.go:288 lxc/image.go:1247
+#: lxc/image.go:288 lxc/image.go:1248
 msgid "Image identifier missing"
 msgstr ""
 
@@ -1064,7 +1099,7 @@ msgstr ""
 msgid "Image imported with fingerprint: %s"
 msgstr ""
 
-#: lxc/image.go:1282
+#: lxc/image.go:1283
 msgid "Image refreshed successfully!"
 msgstr ""
 
@@ -1119,7 +1154,7 @@ msgstr ""
 msgid "Invalid config key column format (too many fields): '%s'"
 msgstr ""
 
-#: lxc/image.go:1208 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
+#: lxc/image.go:1209 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
 #, c-format
 msgid "Invalid format %q"
 msgstr ""
@@ -1140,7 +1175,7 @@ msgid ""
 "Invalid name in '%s', empty string is only allowed when defining maxWidth"
 msgstr ""
 
-#: lxc/main.go:389
+#: lxc/main.go:393
 msgid "Invalid number of arguments"
 msgstr ""
 
@@ -1336,6 +1371,10 @@ msgstr ""
 msgid "List profiles"
 msgstr ""
 
+#: lxc/project.go:297 lxc/project.go:298
+msgid "List projects"
+msgstr ""
+
 #: lxc/storage_volume.go:911 lxc/storage_volume.go:912
 msgid "List storage volumes"
 msgstr ""
@@ -1454,6 +1493,10 @@ msgstr ""
 msgid "Manage profiles"
 msgstr ""
 
+#: lxc/project.go:28 lxc/project.go:29
+msgid "Manage projects"
+msgstr ""
+
 #: lxc/storage.go:32 lxc/storage.go:33
 msgid "Manage storage pools and volumes"
 msgstr ""
@@ -1500,11 +1543,11 @@ msgstr ""
 msgid "Memory usage:"
 msgstr ""
 
-#: lxc/move.go:226
+#: lxc/move.go:227
 msgid "Migration API failure"
 msgstr ""
 
-#: lxc/move.go:231
+#: lxc/move.go:232
 msgid "Migration operation failure"
 msgstr ""
 
@@ -1552,6 +1595,11 @@ msgstr ""
 msgid "Missing profile name"
 msgstr ""
 
+#: lxc/project.go:97 lxc/project.go:151 lxc/project.go:221 lxc/project.go:412
+#: lxc/project.go:467
+msgid "Missing project name"
+msgstr ""
+
 #: lxc/profile.go:270
 msgid "Missing source profile name"
 msgstr ""
@@ -1610,11 +1658,13 @@ msgid "Must supply container name for: "
 msgstr ""
 
 #: lxc/cluster.go:124 lxc/list.go:459 lxc/network.go:858 lxc/profile.go:622
-#: lxc/remote.go:465 lxc/storage.go:549 lxc/storage_volume.go:960
+#: lxc/project.go:366 lxc/remote.go:465 lxc/storage.go:549
+#: lxc/storage_volume.go:960
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:844 lxc/operation.go:141 lxc/remote.go:440 lxc/remote.go:445
+#: lxc/network.go:844 lxc/operation.go:141 lxc/project.go:342
+#: lxc/project.go:347 lxc/remote.go:440 lxc/remote.go:445
 msgid "NO"
 msgstr ""
 
@@ -1721,7 +1771,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:462
+#: lxc/list.go:462 lxc/project.go:368
 msgid "PROFILES"
 msgstr ""
 
@@ -1750,7 +1800,7 @@ msgstr ""
 msgid "Pid: %d"
 msgstr ""
 
-#: lxc/network.go:643 lxc/profile.go:500 lxc/storage.go:304
+#: lxc/network.go:643 lxc/profile.go:500 lxc/project.go:268 lxc/storage.go:304
 #: lxc/storage_volume.go:817
 msgid "Press enter to open the editor again"
 msgstr ""
@@ -1834,6 +1884,21 @@ msgstr ""
 msgid "Profiles: %s"
 msgstr ""
 
+#: lxc/project.go:110
+#, c-format
+msgid "Project %s created"
+msgstr ""
+
+#: lxc/project.go:161
+#, c-format
+msgid "Project %s deleted"
+msgstr ""
+
+#: lxc/project.go:427
+#, c-format
+msgid "Project %s renamed to %s"
+msgstr ""
+
 #: lxc/image.go:861
 msgid "Properties:"
 msgstr ""
@@ -1873,11 +1938,11 @@ msgstr ""
 msgid "Recursively transfer files"
 msgstr ""
 
-#: lxc/image.go:1223 lxc/image.go:1224
+#: lxc/image.go:1224 lxc/image.go:1225
 msgid "Refresh images"
 msgstr ""
 
-#: lxc/image.go:1252
+#: lxc/image.go:1253
 #, c-format
 msgid "Refreshing the image: %s"
 msgstr ""
@@ -1887,7 +1952,8 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656 lxc/remote.go:694
+#: lxc/project.go:523 lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656
+#: lxc/remote.go:694
 #, c-format
 msgid "Remote %s doesn't exist"
 msgstr ""
@@ -1965,6 +2031,10 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
+#: lxc/project.go:387 lxc/project.go:388
+msgid "Rename projects"
+msgstr ""
+
 #: lxc/remote.go:523 lxc/remote.go:524
 msgid "Rename remotes"
 msgstr ""
@@ -2150,11 +2220,11 @@ msgstr ""
 msgid "Show full device configuration for containers or profiles"
 msgstr ""
 
-#: lxc/image.go:1300 lxc/image.go:1301
+#: lxc/image.go:1301 lxc/image.go:1302
 msgid "Show image properties"
 msgstr ""
 
-#: lxc/main.go:215 lxc/main.go:216
+#: lxc/main.go:219 lxc/main.go:220
 msgid "Show less common commands"
 msgstr ""
 
@@ -2170,6 +2240,10 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
+#: lxc/project.go:442 lxc/project.go:443
+msgid "Show project options"
+msgstr ""
+
 #: lxc/storage.go:649 lxc/storage.go:650
 msgid "Show storage pool configurations and resources"
 msgstr ""
@@ -2317,6 +2391,10 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
+#: lxc/project.go:495 lxc/project.go:496
+msgid "Switch the current project"
+msgstr ""
+
 #: lxc/remote.go:635 lxc/remote.go:636
 msgid "Switch the default remote"
 msgstr ""
@@ -2379,7 +2457,7 @@ msgstr ""
 msgid "The profile device doesn't exist"
 msgstr ""
 
-#: lxc/move.go:218
+#: lxc/move.go:219
 msgid "The source LXD instance is not clustered"
 msgstr ""
 
@@ -2416,7 +2494,7 @@ msgstr ""
 msgid "To detach from the console, press: <ctrl>+a q"
 msgstr ""
 
-#: lxc/main.go:304
+#: lxc/main.go:308
 msgid "To start your first container, try: lxc launch ubuntu:18.04"
 msgstr ""
 
@@ -2467,7 +2545,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:862 lxc/profile.go:623 lxc/storage.go:558
+#: lxc/network.go:862 lxc/profile.go:623 lxc/project.go:369 lxc/storage.go:558
 #: lxc/storage_volume.go:962
 msgid "USED BY"
 msgstr ""
@@ -2552,7 +2630,8 @@ msgstr ""
 msgid "Whether or not to snapshot the container's running state"
 msgstr ""
 
-#: lxc/network.go:846 lxc/operation.go:143 lxc/remote.go:442 lxc/remote.go:447
+#: lxc/network.go:846 lxc/operation.go:143 lxc/project.go:344
+#: lxc/project.go:349 lxc/remote.go:442 lxc/remote.go:447
 msgid "YES"
 msgstr ""
 
@@ -2568,7 +2647,7 @@ msgstr ""
 msgid "You must specify a destination container name when using --target"
 msgstr ""
 
-#: lxc/copy.go:72 lxc/move.go:202
+#: lxc/copy.go:72 lxc/move.go:203
 msgid "You must specify a source container name"
 msgstr ""
 
@@ -2672,6 +2751,14 @@ msgstr ""
 msgid "create [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:71
+msgid "create [<remote>:]<project>"
+msgstr ""
+
+#: lxc/project.go:354
+msgid "current"
+msgstr ""
+
 #: lxc/remote.go:459
 msgid "default"
 msgstr ""
@@ -2718,6 +2805,10 @@ msgstr ""
 msgid "delete [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:124
+msgid "delete [<remote>:]<project>"
+msgstr ""
+
 #: lxc/storage.go:436
 msgid "description"
 msgstr ""
@@ -2786,6 +2877,10 @@ msgstr ""
 msgid "edit [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:175
+msgid "edit [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:86
 msgid "edit [<remote>:][<container>]"
 msgstr ""
@@ -2896,7 +2991,7 @@ msgid "list"
 msgstr ""
 
 #: lxc/cluster.go:61 lxc/config_trust.go:112 lxc/network.go:796
-#: lxc/operation.go:98 lxc/profile.go:574 lxc/storage.go:493
+#: lxc/operation.go:98 lxc/profile.go:574 lxc/project.go:295 lxc/storage.go:493
 msgid "list [<remote>:]"
 msgstr ""
 
@@ -3081,6 +3176,12 @@ msgid ""
 "    Update a profile using the content of profile.yaml"
 msgstr ""
 
+#: lxc/project.go:179
+msgid ""
+"lxc project edit <project> < project.yaml\n"
+"    Update a project using the content of project.yaml"
+msgstr ""
+
 #: lxc/query.go:32
 msgid ""
 "lxc query -X DELETE --wait /1.0/containers/c1\n"
@@ -3183,6 +3284,10 @@ msgstr ""
 msgid "profile"
 msgstr ""
 
+#: lxc/project.go:27
+msgid "project"
+msgstr ""
+
 #: lxc/publish.go:32
 msgid ""
 "publish [<remote>:]<container>[/<snapshot>] [<remote>:] [flags] "
@@ -3205,7 +3310,7 @@ msgstr ""
 msgid "query [<remote>:]<API path>"
 msgstr ""
 
-#: lxc/image.go:1222
+#: lxc/image.go:1223
 msgid "refresh [<remote>:]<image> [[<remote>:]<image>...]"
 msgstr ""
 
@@ -3269,6 +3374,10 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
+#: lxc/project.go:385
+msgid "rename [<remote>:]<project> <new-name>"
+msgstr ""
+
 #: lxc/action.go:68
 msgid "restart [<remote>:]<container> [[<remote>:]<container>...]"
 msgstr ""
@@ -3317,7 +3426,7 @@ msgstr ""
 msgid "show [<remote>:]<container|profile>"
 msgstr ""
 
-#: lxc/image.go:1299
+#: lxc/image.go:1300
 msgid "show [<remote>:]<image>"
 msgstr ""
 
@@ -3345,6 +3454,10 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:441
+msgid "show [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:450
 msgid "show [<remote>:][<container>]"
 msgstr ""
@@ -3381,6 +3494,10 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
+#: lxc/project.go:494
+msgid "switch [<remote>:] <project>"
+msgstr ""
+
 #: lxc/info.go:255
 #, c-format
 msgid "taken at %s"
diff --git a/po/it.po b/po/it.po
index ab92fa7355..1e99d6b6df 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: 2018-08-23 15:14-0400\n"
+"POT-Creation-Date: 2018-09-02 06:35+0000\n"
 "PO-Revision-Date: 2017-08-18 14:22+0000\n"
 "Last-Translator: Alberto Donato <alberto.donato at gmail.com>\n"
 "Language-Team: Italian <https://hosted.weblate.org/projects/linux-containers/"
@@ -168,6 +168,38 @@ msgid ""
 "### Note that the name is shown but cannot be changed"
 msgstr ""
 
+#: lxc/project.go:189
+#, fuzzy
+msgid ""
+"### This is a yaml representation of the project.\n"
+"### Any line starting with a '# will be ignored.\n"
+"###\n"
+"### A project consists of a set of features and a description.\n"
+"###\n"
+"### An example would look like:\n"
+"### name: my-project\n"
+"### features:\n"
+"###   images: True\n"
+"###   profiles: True\n"
+"### description: My own project\n"
+"###\n"
+"### Note that the name is shown but cannot be changed"
+msgstr ""
+"### Questa è una rappresentazione yaml di un pool di storage.\n"
+"### Le linee che iniziano con '# saranno ignorate.\n"
+"###\n"
+"### Un pool di storage consiste di un insieme di elementi di\n"
+"### configurazione.\n"
+"###\n"
+"### Un esempio è il seguente:\n"
+"### name: default\n"
+"### driver: zfs\n"
+"### used_by: []\n"
+"### config:\n"
+"###   size: \"61203283968\"\n"
+"###   source: /home/chb/mnt/lxd_test/default.img\n"
+"###   zfs.pool_name: default"
+
 #: lxc/image.go:966
 #, c-format
 msgid "%s (%d more)"
@@ -480,8 +512,8 @@ msgid "Config key/value to apply to the target container"
 msgstr ""
 
 #: lxc/config.go:195 lxc/config.go:259 lxc/config_metadata.go:144
-#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/storage.go:303
-#: lxc/storage_volume.go:816
+#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/project.go:267
+#: lxc/storage.go:303 lxc/storage_volume.go:816
 #, c-format
 msgid "Config parsing error: %s"
 msgstr ""
@@ -604,6 +636,10 @@ msgstr ""
 msgid "Create profiles"
 msgstr ""
 
+#: lxc/project.go:72 lxc/project.go:73
+msgid "Create projects"
+msgstr ""
+
 #: lxc/storage.go:88 lxc/storage.go:89
 msgid "Create storage pools"
 msgstr ""
@@ -675,6 +711,10 @@ msgstr ""
 msgid "Delete profiles"
 msgstr ""
 
+#: lxc/project.go:126 lxc/project.go:127
+msgid "Delete projects"
+msgstr ""
+
 #: lxc/storage.go:162 lxc/storage.go:163
 msgid "Delete storage pools"
 msgstr ""
@@ -701,7 +741,7 @@ msgstr ""
 #: lxc/file.go:42 lxc/file.go:75 lxc/file.go:124 lxc/file.go:187
 #: lxc/file.go:377 lxc/image.go:42 lxc/image.go:131 lxc/image.go:265
 #: lxc/image.go:316 lxc/image.go:439 lxc/image.go:579 lxc/image.go:788
-#: lxc/image.go:902 lxc/image.go:1224 lxc/image.go:1301 lxc/image_alias.go:26
+#: lxc/image.go:902 lxc/image.go:1225 lxc/image.go:1302 lxc/image_alias.go:26
 #: lxc/image_alias.go:59 lxc/image_alias.go:106 lxc/image_alias.go:149
 #: lxc/image_alias.go:250 lxc/import.go:25 lxc/info.go:29 lxc/init.go:35
 #: lxc/launch.go:22 lxc/list.go:48 lxc/main.go:48 lxc/manpage.go:19
@@ -714,7 +754,9 @@ msgstr ""
 #: lxc/profile.go:30 lxc/profile.go:102 lxc/profile.go:165 lxc/profile.go:245
 #: lxc/profile.go:301 lxc/profile.go:355 lxc/profile.go:405 lxc/profile.go:529
 #: lxc/profile.go:577 lxc/profile.go:641 lxc/profile.go:717 lxc/profile.go:767
-#: lxc/profile.go:826 lxc/profile.go:880 lxc/publish.go:34 lxc/query.go:30
+#: lxc/profile.go:826 lxc/profile.go:880 lxc/project.go:29 lxc/project.go:73
+#: lxc/project.go:127 lxc/project.go:177 lxc/project.go:298 lxc/project.go:388
+#: lxc/project.go:443 lxc/project.go:496 lxc/publish.go:34 lxc/query.go:30
 #: lxc/remote.go:37 lxc/remote.go:87 lxc/remote.go:383 lxc/remote.go:419
 #: lxc/remote.go:524 lxc/remote.go:586 lxc/remote.go:636 lxc/remote.go:674
 #: lxc/rename.go:21 lxc/restore.go:24 lxc/snapshot.go:21 lxc/storage.go:33
@@ -823,6 +865,10 @@ msgstr ""
 msgid "Edit profile configurations as YAML"
 msgstr ""
 
+#: lxc/project.go:176 lxc/project.go:177
+msgid "Edit project configurations as YAML"
+msgstr ""
+
 #: lxc/storage.go:212 lxc/storage.go:213
 msgid "Edit storage pool configurations as YAML"
 msgstr ""
@@ -939,7 +985,7 @@ msgstr ""
 msgid "FINGERPRINT"
 msgstr ""
 
-#: lxc/move.go:213
+#: lxc/move.go:214
 msgid "Failed to connect to cluster member"
 msgstr ""
 
@@ -1044,6 +1090,10 @@ msgstr ""
 msgid "ID"
 msgstr ""
 
+#: lxc/project.go:367
+msgid "IMAGES"
+msgstr ""
+
 #: lxc/network.go:964
 msgid "IP ADDRESS"
 msgstr ""
@@ -1060,7 +1110,7 @@ msgstr ""
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:301
+#: lxc/main.go:305
 msgid ""
 "If this is your first time running LXD on this machine, you should also run: "
 "lxd init"
@@ -1071,7 +1121,7 @@ msgstr ""
 msgid "Ignore the container state"
 msgstr "Creazione del container in corso"
 
-#: lxc/image.go:1284
+#: lxc/image.go:1285
 msgid "Image already up to date."
 msgstr ""
 
@@ -1083,7 +1133,7 @@ msgstr ""
 msgid "Image exported successfully!"
 msgstr ""
 
-#: lxc/image.go:288 lxc/image.go:1247
+#: lxc/image.go:288 lxc/image.go:1248
 msgid "Image identifier missing"
 msgstr ""
 
@@ -1097,7 +1147,7 @@ msgstr ""
 msgid "Image imported with fingerprint: %s"
 msgstr ""
 
-#: lxc/image.go:1282
+#: lxc/image.go:1283
 msgid "Image refreshed successfully!"
 msgstr ""
 
@@ -1153,7 +1203,7 @@ msgstr ""
 msgid "Invalid config key column format (too many fields): '%s'"
 msgstr ""
 
-#: lxc/image.go:1208 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
+#: lxc/image.go:1209 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
 #, fuzzy, c-format
 msgid "Invalid format %q"
 msgstr "Proprietà errata: %s"
@@ -1174,7 +1224,7 @@ msgid ""
 "Invalid name in '%s', empty string is only allowed when defining maxWidth"
 msgstr ""
 
-#: lxc/main.go:389
+#: lxc/main.go:393
 #, fuzzy
 msgid "Invalid number of arguments"
 msgstr "numero errato di argomenti del sottocomando"
@@ -1373,6 +1423,10 @@ msgstr ""
 msgid "List profiles"
 msgstr ""
 
+#: lxc/project.go:297 lxc/project.go:298
+msgid "List projects"
+msgstr ""
+
 #: lxc/storage_volume.go:911 lxc/storage_volume.go:912
 msgid "List storage volumes"
 msgstr ""
@@ -1493,6 +1547,10 @@ msgstr ""
 msgid "Manage profiles"
 msgstr ""
 
+#: lxc/project.go:28 lxc/project.go:29
+msgid "Manage projects"
+msgstr ""
+
 #: lxc/storage.go:32 lxc/storage.go:33
 msgid "Manage storage pools and volumes"
 msgstr ""
@@ -1539,11 +1597,11 @@ msgstr ""
 msgid "Memory usage:"
 msgstr ""
 
-#: lxc/move.go:226
+#: lxc/move.go:227
 msgid "Migration API failure"
 msgstr ""
 
-#: lxc/move.go:231
+#: lxc/move.go:232
 msgid "Migration operation failure"
 msgstr ""
 
@@ -1592,6 +1650,12 @@ msgstr ""
 msgid "Missing profile name"
 msgstr ""
 
+#: lxc/project.go:97 lxc/project.go:151 lxc/project.go:221 lxc/project.go:412
+#: lxc/project.go:467
+#, fuzzy
+msgid "Missing project name"
+msgstr "Il nome del container è: %s"
+
 #: lxc/profile.go:270
 msgid "Missing source profile name"
 msgstr ""
@@ -1650,11 +1714,13 @@ msgid "Must supply container name for: "
 msgstr ""
 
 #: lxc/cluster.go:124 lxc/list.go:459 lxc/network.go:858 lxc/profile.go:622
-#: lxc/remote.go:465 lxc/storage.go:549 lxc/storage_volume.go:960
+#: lxc/project.go:366 lxc/remote.go:465 lxc/storage.go:549
+#: lxc/storage_volume.go:960
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:844 lxc/operation.go:141 lxc/remote.go:440 lxc/remote.go:445
+#: lxc/network.go:844 lxc/operation.go:141 lxc/project.go:342
+#: lxc/project.go:347 lxc/remote.go:440 lxc/remote.go:445
 msgid "NO"
 msgstr ""
 
@@ -1761,7 +1827,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:462
+#: lxc/list.go:462 lxc/project.go:368
 msgid "PROFILES"
 msgstr ""
 
@@ -1791,7 +1857,7 @@ msgstr "Creazione del container in corso"
 msgid "Pid: %d"
 msgstr ""
 
-#: lxc/network.go:643 lxc/profile.go:500 lxc/storage.go:304
+#: lxc/network.go:643 lxc/profile.go:500 lxc/project.go:268 lxc/storage.go:304
 #: lxc/storage_volume.go:817
 msgid "Press enter to open the editor again"
 msgstr ""
@@ -1875,6 +1941,21 @@ msgstr ""
 msgid "Profiles: %s"
 msgstr ""
 
+#: lxc/project.go:110
+#, c-format
+msgid "Project %s created"
+msgstr ""
+
+#: lxc/project.go:161
+#, c-format
+msgid "Project %s deleted"
+msgstr ""
+
+#: lxc/project.go:427
+#, c-format
+msgid "Project %s renamed to %s"
+msgstr ""
+
 #: lxc/image.go:861
 msgid "Properties:"
 msgstr ""
@@ -1914,11 +1995,11 @@ msgstr ""
 msgid "Recursively transfer files"
 msgstr ""
 
-#: lxc/image.go:1223 lxc/image.go:1224
+#: lxc/image.go:1224 lxc/image.go:1225
 msgid "Refresh images"
 msgstr ""
 
-#: lxc/image.go:1252
+#: lxc/image.go:1253
 #, c-format
 msgid "Refreshing the image: %s"
 msgstr ""
@@ -1928,7 +2009,8 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr "il remote %s esiste già"
 
-#: lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656 lxc/remote.go:694
+#: lxc/project.go:523 lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656
+#: lxc/remote.go:694
 #, fuzzy, c-format
 msgid "Remote %s doesn't exist"
 msgstr "il remote %s non esiste"
@@ -2006,6 +2088,10 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
+#: lxc/project.go:387 lxc/project.go:388
+msgid "Rename projects"
+msgstr ""
+
 #: lxc/remote.go:523 lxc/remote.go:524
 msgid "Rename remotes"
 msgstr ""
@@ -2192,11 +2278,11 @@ msgstr ""
 msgid "Show full device configuration for containers or profiles"
 msgstr ""
 
-#: lxc/image.go:1300 lxc/image.go:1301
+#: lxc/image.go:1301 lxc/image.go:1302
 msgid "Show image properties"
 msgstr ""
 
-#: lxc/main.go:215 lxc/main.go:216
+#: lxc/main.go:219 lxc/main.go:220
 msgid "Show less common commands"
 msgstr ""
 
@@ -2212,6 +2298,10 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
+#: lxc/project.go:442 lxc/project.go:443
+msgid "Show project options"
+msgstr ""
+
 #: lxc/storage.go:649 lxc/storage.go:650
 msgid "Show storage pool configurations and resources"
 msgstr ""
@@ -2361,6 +2451,10 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
+#: lxc/project.go:495 lxc/project.go:496
+msgid "Switch the current project"
+msgstr ""
+
 #: lxc/remote.go:635 lxc/remote.go:636
 msgid "Switch the default remote"
 msgstr ""
@@ -2424,7 +2518,7 @@ msgstr ""
 msgid "The profile device doesn't exist"
 msgstr "il remote %s non esiste"
 
-#: lxc/move.go:218
+#: lxc/move.go:219
 msgid "The source LXD instance is not clustered"
 msgstr ""
 
@@ -2461,7 +2555,7 @@ msgstr ""
 msgid "To detach from the console, press: <ctrl>+a q"
 msgstr ""
 
-#: lxc/main.go:304
+#: lxc/main.go:308
 msgid "To start your first container, try: lxc launch ubuntu:18.04"
 msgstr ""
 
@@ -2512,7 +2606,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:862 lxc/profile.go:623 lxc/storage.go:558
+#: lxc/network.go:862 lxc/profile.go:623 lxc/project.go:369 lxc/storage.go:558
 #: lxc/storage_volume.go:962
 msgid "USED BY"
 msgstr ""
@@ -2598,7 +2692,8 @@ msgstr ""
 msgid "Whether or not to snapshot the container's running state"
 msgstr ""
 
-#: lxc/network.go:846 lxc/operation.go:143 lxc/remote.go:442 lxc/remote.go:447
+#: lxc/network.go:846 lxc/operation.go:143 lxc/project.go:344
+#: lxc/project.go:349 lxc/remote.go:442 lxc/remote.go:447
 msgid "YES"
 msgstr ""
 
@@ -2615,7 +2710,7 @@ msgstr ""
 msgid "You must specify a destination container name when using --target"
 msgstr "Occorre specificare un nome di container come origine"
 
-#: lxc/copy.go:72 lxc/move.go:202
+#: lxc/copy.go:72 lxc/move.go:203
 msgid "You must specify a source container name"
 msgstr "Occorre specificare un nome di container come origine"
 
@@ -2720,6 +2815,14 @@ msgstr ""
 msgid "create [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:71
+msgid "create [<remote>:]<project>"
+msgstr ""
+
+#: lxc/project.go:354
+msgid "current"
+msgstr ""
+
 #: lxc/remote.go:459
 msgid "default"
 msgstr ""
@@ -2766,6 +2869,10 @@ msgstr ""
 msgid "delete [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:124
+msgid "delete [<remote>:]<project>"
+msgstr ""
+
 #: lxc/storage.go:436
 msgid "description"
 msgstr ""
@@ -2834,6 +2941,10 @@ msgstr ""
 msgid "edit [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:175
+msgid "edit [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:86
 msgid "edit [<remote>:][<container>]"
 msgstr ""
@@ -2944,7 +3055,7 @@ msgid "list"
 msgstr ""
 
 #: lxc/cluster.go:61 lxc/config_trust.go:112 lxc/network.go:796
-#: lxc/operation.go:98 lxc/profile.go:574 lxc/storage.go:493
+#: lxc/operation.go:98 lxc/profile.go:574 lxc/project.go:295 lxc/storage.go:493
 msgid "list [<remote>:]"
 msgstr ""
 
@@ -3129,6 +3240,12 @@ msgid ""
 "    Update a profile using the content of profile.yaml"
 msgstr ""
 
+#: lxc/project.go:179
+msgid ""
+"lxc project edit <project> < project.yaml\n"
+"    Update a project using the content of project.yaml"
+msgstr ""
+
 #: lxc/query.go:32
 msgid ""
 "lxc query -X DELETE --wait /1.0/containers/c1\n"
@@ -3231,6 +3348,10 @@ msgstr ""
 msgid "profile"
 msgstr ""
 
+#: lxc/project.go:27
+msgid "project"
+msgstr ""
+
 #: lxc/publish.go:32
 msgid ""
 "publish [<remote>:]<container>[/<snapshot>] [<remote>:] [flags] "
@@ -3253,7 +3374,7 @@ msgstr ""
 msgid "query [<remote>:]<API path>"
 msgstr ""
 
-#: lxc/image.go:1222
+#: lxc/image.go:1223
 msgid "refresh [<remote>:]<image> [[<remote>:]<image>...]"
 msgstr ""
 
@@ -3317,6 +3438,10 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
+#: lxc/project.go:385
+msgid "rename [<remote>:]<project> <new-name>"
+msgstr ""
+
 #: lxc/action.go:68
 msgid "restart [<remote>:]<container> [[<remote>:]<container>...]"
 msgstr ""
@@ -3365,7 +3490,7 @@ msgstr ""
 msgid "show [<remote>:]<container|profile>"
 msgstr ""
 
-#: lxc/image.go:1299
+#: lxc/image.go:1300
 msgid "show [<remote>:]<image>"
 msgstr ""
 
@@ -3393,6 +3518,10 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:441
+msgid "show [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:450
 msgid "show [<remote>:][<container>]"
 msgstr ""
@@ -3429,6 +3558,10 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
+#: lxc/project.go:494
+msgid "switch [<remote>:] <project>"
+msgstr ""
+
 #: lxc/info.go:255
 #, c-format
 msgid "taken at %s"
diff --git a/po/ja.po b/po/ja.po
index 8514dfd8b4..2407012303 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: 2018-08-23 15:14-0400\n"
+"POT-Creation-Date: 2018-09-02 06:35+0000\n"
 "PO-Revision-Date: 2018-07-30 09:55+0000\n"
 "Last-Translator: KATOH Yasufumi <karma at jazz.email.ne.jp>\n"
 "Language-Team: Japanese <https://hosted.weblate.org/projects/linux-"
@@ -146,6 +146,23 @@ msgid ""
 "### Note that the name is shown but cannot be changed"
 msgstr ""
 
+#: lxc/project.go:189
+msgid ""
+"### This is a yaml representation of the project.\n"
+"### Any line starting with a '# will be ignored.\n"
+"###\n"
+"### A project consists of a set of features and a description.\n"
+"###\n"
+"### An example would look like:\n"
+"### name: my-project\n"
+"### features:\n"
+"###   images: True\n"
+"###   profiles: True\n"
+"### description: My own project\n"
+"###\n"
+"### Note that the name is shown but cannot be changed"
+msgstr ""
+
 #: lxc/image.go:966
 #, c-format
 msgid "%s (%d more)"
@@ -468,8 +485,8 @@ msgid "Config key/value to apply to the target container"
 msgstr "移動先のコンテナに適用するキー/値の設定"
 
 #: lxc/config.go:195 lxc/config.go:259 lxc/config_metadata.go:144
-#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/storage.go:303
-#: lxc/storage_volume.go:816
+#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/project.go:267
+#: lxc/storage.go:303 lxc/storage_volume.go:816
 #, c-format
 msgid "Config parsing error: %s"
 msgstr "設定の構文エラー: %s"
@@ -598,6 +615,11 @@ msgstr "新たにネットワークを作成します"
 msgid "Create profiles"
 msgstr "プロファイルを作成します"
 
+#: lxc/project.go:72 lxc/project.go:73
+#, fuzzy
+msgid "Create projects"
+msgstr "プロファイルを作成します"
+
 #: lxc/storage.go:88 lxc/storage.go:89
 msgid "Create storage pools"
 msgstr "ストレージプールを作成します"
@@ -669,6 +691,11 @@ msgstr "ネットワークを削除します"
 msgid "Delete profiles"
 msgstr "プロファイルを削除します"
 
+#: lxc/project.go:126 lxc/project.go:127
+#, fuzzy
+msgid "Delete projects"
+msgstr "プロファイルを削除します"
+
 #: lxc/storage.go:162 lxc/storage.go:163
 msgid "Delete storage pools"
 msgstr "ストレージプールを削除します"
@@ -695,7 +722,7 @@ msgstr "ストレージボリュームを削除します"
 #: lxc/file.go:42 lxc/file.go:75 lxc/file.go:124 lxc/file.go:187
 #: lxc/file.go:377 lxc/image.go:42 lxc/image.go:131 lxc/image.go:265
 #: lxc/image.go:316 lxc/image.go:439 lxc/image.go:579 lxc/image.go:788
-#: lxc/image.go:902 lxc/image.go:1224 lxc/image.go:1301 lxc/image_alias.go:26
+#: lxc/image.go:902 lxc/image.go:1225 lxc/image.go:1302 lxc/image_alias.go:26
 #: lxc/image_alias.go:59 lxc/image_alias.go:106 lxc/image_alias.go:149
 #: lxc/image_alias.go:250 lxc/import.go:25 lxc/info.go:29 lxc/init.go:35
 #: lxc/launch.go:22 lxc/list.go:48 lxc/main.go:48 lxc/manpage.go:19
@@ -708,7 +735,9 @@ msgstr "ストレージボリュームを削除します"
 #: lxc/profile.go:30 lxc/profile.go:102 lxc/profile.go:165 lxc/profile.go:245
 #: lxc/profile.go:301 lxc/profile.go:355 lxc/profile.go:405 lxc/profile.go:529
 #: lxc/profile.go:577 lxc/profile.go:641 lxc/profile.go:717 lxc/profile.go:767
-#: lxc/profile.go:826 lxc/profile.go:880 lxc/publish.go:34 lxc/query.go:30
+#: lxc/profile.go:826 lxc/profile.go:880 lxc/project.go:29 lxc/project.go:73
+#: lxc/project.go:127 lxc/project.go:177 lxc/project.go:298 lxc/project.go:388
+#: lxc/project.go:443 lxc/project.go:496 lxc/publish.go:34 lxc/query.go:30
 #: lxc/remote.go:37 lxc/remote.go:87 lxc/remote.go:383 lxc/remote.go:419
 #: lxc/remote.go:524 lxc/remote.go:586 lxc/remote.go:636 lxc/remote.go:674
 #: lxc/rename.go:21 lxc/restore.go:24 lxc/snapshot.go:21 lxc/storage.go:33
@@ -817,6 +846,11 @@ msgstr "ネットワーク設定をYAMLで編集します"
 msgid "Edit profile configurations as YAML"
 msgstr "プロファイル設定をYAMLで編集します"
 
+#: lxc/project.go:176 lxc/project.go:177
+#, fuzzy
+msgid "Edit project configurations as YAML"
+msgstr "プロファイル設定をYAMLで編集します"
+
 #: lxc/storage.go:212 lxc/storage.go:213
 msgid "Edit storage pool configurations as YAML"
 msgstr "ストレージプールの設定をYAMLで編集します"
@@ -946,7 +980,7 @@ msgstr ""
 msgid "FINGERPRINT"
 msgstr ""
 
-#: lxc/move.go:213
+#: lxc/move.go:214
 #, fuzzy
 msgid "Failed to connect to cluster member"
 msgstr "クラスタメンバの名前を変更します"
@@ -1051,6 +1085,10 @@ msgstr ""
 msgid "ID"
 msgstr "ID"
 
+#: lxc/project.go:367
+msgid "IMAGES"
+msgstr ""
+
 #: lxc/network.go:964
 msgid "IP ADDRESS"
 msgstr ""
@@ -1067,7 +1105,7 @@ msgstr "IPV6"
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:301
+#: lxc/main.go:305
 msgid ""
 "If this is your first time running LXD on this machine, you should also run: "
 "lxd init"
@@ -1077,7 +1115,7 @@ msgstr "初めてこのマシンで LXD を使う場合、lxd init と実行す
 msgid "Ignore the container state"
 msgstr "コンテナの状態を無視します"
 
-#: lxc/image.go:1284
+#: lxc/image.go:1285
 msgid "Image already up to date."
 msgstr "イメージは更新済みです。"
 
@@ -1089,7 +1127,7 @@ msgstr "イメージのコピーが成功しました!"
 msgid "Image exported successfully!"
 msgstr "イメージのエクスポートが成功しました!"
 
-#: lxc/image.go:288 lxc/image.go:1247
+#: lxc/image.go:288 lxc/image.go:1248
 msgid "Image identifier missing"
 msgstr "イメージ名を指定してください"
 
@@ -1103,7 +1141,7 @@ msgstr "イメージ名を指定してください: %s"
 msgid "Image imported with fingerprint: %s"
 msgstr "イメージは以下のフィンガープリントでインポートされました: %s"
 
-#: lxc/image.go:1282
+#: lxc/image.go:1283
 msgid "Image refreshed successfully!"
 msgstr "イメージの更新が成功しました!"
 
@@ -1163,7 +1201,7 @@ msgid "Invalid config key column format (too many fields): '%s'"
 msgstr ""
 "不正な設定項目のカラムフォーマットです (フィールド数が多すぎます): '%s'"
 
-#: lxc/image.go:1208 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
+#: lxc/image.go:1209 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
 #, c-format
 msgid "Invalid format %q"
 msgstr "不正なフォーマット %q"
@@ -1187,7 +1225,7 @@ msgid ""
 msgstr ""
 "'%s' は不正な名前です。空文字列は maxWidth を指定しているときのみ指定できます"
 
-#: lxc/main.go:389
+#: lxc/main.go:393
 msgid "Invalid number of arguments"
 msgstr "引数の数が不正です"
 
@@ -1462,6 +1500,11 @@ msgstr ""
 msgid "List profiles"
 msgstr "プロファイルを一覧表示します"
 
+#: lxc/project.go:297 lxc/project.go:298
+#, fuzzy
+msgid "List projects"
+msgstr "プロファイルを一覧表示します"
+
 #: lxc/storage_volume.go:911 lxc/storage_volume.go:912
 msgid "List storage volumes"
 msgstr "ストレージボリュームを一覧表示します"
@@ -1593,6 +1636,11 @@ msgstr ""
 msgid "Manage profiles"
 msgstr "プロファイルを管理します"
 
+#: lxc/project.go:28 lxc/project.go:29
+#, fuzzy
+msgid "Manage projects"
+msgstr "プロファイルを管理します"
+
 #: lxc/storage.go:32 lxc/storage.go:33
 msgid "Manage storage pools and volumes"
 msgstr "ストレージプール、ストレージボリュームを管理します"
@@ -1643,12 +1691,12 @@ msgstr "メモリ (ピーク)"
 msgid "Memory usage:"
 msgstr "メモリ消費量:"
 
-#: lxc/move.go:226
+#: lxc/move.go:227
 #, fuzzy
 msgid "Migration API failure"
 msgstr "ソースのホスト上でマイグレーションが失敗しました: %s"
 
-#: lxc/move.go:231
+#: lxc/move.go:232
 msgid "Migration operation failure"
 msgstr ""
 
@@ -1696,6 +1744,12 @@ msgstr "ストレージプール名を指定する必要があります"
 msgid "Missing profile name"
 msgstr "プロファイル名を指定する必要があります"
 
+#: lxc/project.go:97 lxc/project.go:151 lxc/project.go:221 lxc/project.go:412
+#: lxc/project.go:467
+#, fuzzy
+msgid "Missing project name"
+msgstr "プロファイル名を指定する必要があります"
+
 #: lxc/profile.go:270
 msgid "Missing source profile name"
 msgstr "コピー元のプロファイル名を指定する必要があります"
@@ -1759,11 +1813,13 @@ msgid "Must supply container name for: "
 msgstr "コンテナ名を指定する必要があります: "
 
 #: lxc/cluster.go:124 lxc/list.go:459 lxc/network.go:858 lxc/profile.go:622
-#: lxc/remote.go:465 lxc/storage.go:549 lxc/storage_volume.go:960
+#: lxc/project.go:366 lxc/remote.go:465 lxc/storage.go:549
+#: lxc/storage_volume.go:960
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:844 lxc/operation.go:141 lxc/remote.go:440 lxc/remote.go:445
+#: lxc/network.go:844 lxc/operation.go:141 lxc/project.go:342
+#: lxc/project.go:347 lxc/remote.go:440 lxc/remote.go:445
 msgid "NO"
 msgstr ""
 
@@ -1870,7 +1926,7 @@ msgstr "PID"
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:462
+#: lxc/list.go:462 lxc/project.go:368
 msgid "PROFILES"
 msgstr ""
 
@@ -1899,7 +1955,7 @@ msgstr "コンテナを一時停止します"
 msgid "Pid: %d"
 msgstr "Pid: %d"
 
-#: lxc/network.go:643 lxc/profile.go:500 lxc/storage.go:304
+#: lxc/network.go:643 lxc/profile.go:500 lxc/project.go:268 lxc/storage.go:304
 #: lxc/storage_volume.go:817
 msgid "Press enter to open the editor again"
 msgstr "再度エディタを開くためには Enter キーを押します"
@@ -1983,6 +2039,21 @@ msgstr "プロファイル %s が %s に追加されました"
 msgid "Profiles: %s"
 msgstr "プロファイル: %s"
 
+#: lxc/project.go:110
+#, fuzzy, c-format
+msgid "Project %s created"
+msgstr "プロファイル %s を作成しました"
+
+#: lxc/project.go:161
+#, fuzzy, c-format
+msgid "Project %s deleted"
+msgstr "プロファイル %s を削除しました"
+
+#: lxc/project.go:427
+#, fuzzy, c-format
+msgid "Project %s renamed to %s"
+msgstr "プロファイル名 %s を %s に変更しました"
+
 #: lxc/image.go:861
 msgid "Properties:"
 msgstr "プロパティ:"
@@ -2022,11 +2093,11 @@ msgstr ""
 msgid "Recursively transfer files"
 msgstr "再帰的にファイルを転送します"
 
-#: lxc/image.go:1223 lxc/image.go:1224
+#: lxc/image.go:1224 lxc/image.go:1225
 msgid "Refresh images"
 msgstr "イメージを更新します"
 
-#: lxc/image.go:1252
+#: lxc/image.go:1253
 #, c-format
 msgid "Refreshing the image: %s"
 msgstr "イメージの更新中: %s"
@@ -2036,7 +2107,8 @@ msgstr "イメージの更新中: %s"
 msgid "Remote %s already exists"
 msgstr "リモート %s は既に存在します"
 
-#: lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656 lxc/remote.go:694
+#: lxc/project.go:523 lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656
+#: lxc/remote.go:694
 #, c-format
 msgid "Remote %s doesn't exist"
 msgstr "リモート %s は存在しません"
@@ -2114,6 +2186,11 @@ msgstr "ネットワーク名を変更します"
 msgid "Rename profiles"
 msgstr "プロファイル名を変更します"
 
+#: lxc/project.go:387 lxc/project.go:388
+#, fuzzy
+msgid "Rename projects"
+msgstr "プロファイル名を変更します"
+
 #: lxc/remote.go:523 lxc/remote.go:524
 msgid "Rename remotes"
 msgstr "リモートサーバ名を変更します"
@@ -2306,11 +2383,11 @@ msgstr "バックグラウンド操作の詳細を表示します"
 msgid "Show full device configuration for containers or profiles"
 msgstr "コンテナもしくはプロファイルのデバイス設定をすべて表示します"
 
-#: lxc/image.go:1300 lxc/image.go:1301
+#: lxc/image.go:1301 lxc/image.go:1302
 msgid "Show image properties"
 msgstr "イメージのプロパティを表示します"
 
-#: lxc/main.go:215 lxc/main.go:216
+#: lxc/main.go:219 lxc/main.go:220
 msgid "Show less common commands"
 msgstr "全てのコマンドを表示します (主なコマンドだけではなく)"
 
@@ -2326,6 +2403,11 @@ msgstr "ネットワークの設定を表示します"
 msgid "Show profile configurations"
 msgstr "プロファイルの設定を表示します"
 
+#: lxc/project.go:442 lxc/project.go:443
+#, fuzzy
+msgid "Show project options"
+msgstr "プロファイルの設定を表示します"
+
 #: lxc/storage.go:649 lxc/storage.go:650
 msgid "Show storage pool configurations and resources"
 msgstr "ストレージプールの設定とリソースを表示します"
@@ -2473,6 +2555,11 @@ msgstr "Swap (現在値)"
 msgid "Swap (peak)"
 msgstr "Swap (ピーク)"
 
+#: lxc/project.go:495 lxc/project.go:496
+#, fuzzy
+msgid "Switch the current project"
+msgstr "デフォルトのリモートを設定します"
+
 #: lxc/remote.go:635 lxc/remote.go:636
 #, fuzzy
 msgid "Switch the default remote"
@@ -2541,7 +2628,7 @@ msgstr ""
 msgid "The profile device doesn't exist"
 msgstr "プロファイルのデバイスが存在しません"
 
-#: lxc/move.go:218
+#: lxc/move.go:219
 msgid "The source LXD instance is not clustered"
 msgstr ""
 
@@ -2582,7 +2669,7 @@ msgstr ""
 msgid "To detach from the console, press: <ctrl>+a q"
 msgstr "コンソールから切り離すには <ctrl>+a q を押します"
 
-#: lxc/main.go:304
+#: lxc/main.go:308
 msgid "To start your first container, try: lxc launch ubuntu:18.04"
 msgstr ""
 "初めてコンテナを起動するには、\"lxc launch ubuntu:18.04\" と実行してみてくだ"
@@ -2635,7 +2722,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:862 lxc/profile.go:623 lxc/storage.go:558
+#: lxc/network.go:862 lxc/profile.go:623 lxc/project.go:369 lxc/storage.go:558
 #: lxc/storage_volume.go:962
 msgid "USED BY"
 msgstr ""
@@ -2723,7 +2810,8 @@ msgstr ""
 msgid "Whether or not to snapshot the container's running state"
 msgstr "コンテナの稼動状態のスナップショットを取得するかどうか"
 
-#: lxc/network.go:846 lxc/operation.go:143 lxc/remote.go:442 lxc/remote.go:447
+#: lxc/network.go:846 lxc/operation.go:143 lxc/project.go:344
+#: lxc/project.go:349 lxc/remote.go:442 lxc/remote.go:447
 msgid "YES"
 msgstr ""
 
@@ -2739,7 +2827,7 @@ msgstr "--mode と同時に -t または -T は指定できません"
 msgid "You must specify a destination container name when using --target"
 msgstr "--target オプションを使うときはコピー先のコンテナ名を指定してください"
 
-#: lxc/copy.go:72 lxc/move.go:202
+#: lxc/copy.go:72 lxc/move.go:203
 msgid "You must specify a source container name"
 msgstr "コピー元のコンテナ名を指定してください"
 
@@ -2843,6 +2931,16 @@ msgstr ""
 msgid "create [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:71
+#, fuzzy
+msgid "create [<remote>:]<project>"
+msgstr "restore [<remote>:]<container> <snapshot>"
+
+#: lxc/project.go:354
+#, fuzzy
+msgid "current"
+msgstr "Swap (現在値)"
+
 #: lxc/remote.go:459
 msgid "default"
 msgstr ""
@@ -2892,6 +2990,11 @@ msgstr ""
 msgid "delete [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:124
+#, fuzzy
+msgid "delete [<remote>:]<project>"
+msgstr "delete [<remote>:]<image> [[<remote>:]<image>...]"
+
 #: lxc/storage.go:436
 msgid "description"
 msgstr "説明"
@@ -2962,6 +3065,10 @@ msgstr ""
 msgid "edit [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:175
+msgid "edit [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:86
 msgid "edit [<remote>:][<container>]"
 msgstr ""
@@ -3074,7 +3181,7 @@ msgid "list"
 msgstr ""
 
 #: lxc/cluster.go:61 lxc/config_trust.go:112 lxc/network.go:796
-#: lxc/operation.go:98 lxc/profile.go:574 lxc/storage.go:493
+#: lxc/operation.go:98 lxc/profile.go:574 lxc/project.go:295 lxc/storage.go:493
 msgid "list [<remote>:]"
 msgstr ""
 
@@ -3338,6 +3445,15 @@ msgstr ""
 "lxc profile edit <profile> < profile.yaml\n"
 "    profile.yaml の内容でプロファイルを更新します"
 
+#: lxc/project.go:179
+#, fuzzy
+msgid ""
+"lxc project edit <project> < project.yaml\n"
+"    Update a project using the content of project.yaml"
+msgstr ""
+"lxc profile edit <profile> < profile.yaml\n"
+"    profile.yaml の内容でプロファイルを更新します"
+
 #: lxc/query.go:32
 msgid ""
 "lxc query -X DELETE --wait /1.0/containers/c1\n"
@@ -3462,6 +3578,10 @@ msgstr "`lxc profile` コマンドを使ってください"
 msgid "profile"
 msgstr "profile"
 
+#: lxc/project.go:27
+msgid "project"
+msgstr ""
+
 #: lxc/publish.go:32
 msgid ""
 "publish [<remote>:]<container>[/<snapshot>] [<remote>:] [flags] "
@@ -3490,7 +3610,7 @@ msgstr ""
 msgid "query [<remote>:]<API path>"
 msgstr ""
 
-#: lxc/image.go:1222
+#: lxc/image.go:1223
 msgid "refresh [<remote>:]<image> [[<remote>:]<image>...]"
 msgstr "refresh [<remote>:]<image> [[<remote>:]<image>...]"
 
@@ -3554,6 +3674,11 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
+#: lxc/project.go:385
+#, fuzzy
+msgid "rename [<remote>:]<project> <new-name>"
+msgstr "restore [<remote>:]<container> <snapshot>"
+
 #: lxc/action.go:68
 msgid "restart [<remote>:]<container> [[<remote>:]<container>...]"
 msgstr "restart [<remote>:]<container> [[<remote>:]<container>...]"
@@ -3602,7 +3727,7 @@ msgstr ""
 msgid "show [<remote>:]<container|profile>"
 msgstr ""
 
-#: lxc/image.go:1299
+#: lxc/image.go:1300
 msgid "show [<remote>:]<image>"
 msgstr ""
 
@@ -3630,6 +3755,10 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:441
+msgid "show [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:450
 msgid "show [<remote>:][<container>]"
 msgstr ""
@@ -3667,6 +3796,11 @@ msgstr ""
 msgid "switch <remote>"
 msgstr "set-default <remote>"
 
+#: lxc/project.go:494
+#, fuzzy
+msgid "switch [<remote>:] <project>"
+msgstr "restore [<remote>:]<container> <snapshot>"
+
 #: lxc/info.go:255
 #, c-format
 msgid "taken at %s"
diff --git a/po/ko.po b/po/ko.po
index 762033187a..5799a0ffd6 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: 2018-08-23 15:14-0400\n"
+"POT-Creation-Date: 2018-09-02 06:35+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -143,6 +143,23 @@ msgid ""
 "### Note that the name is shown but cannot be changed"
 msgstr ""
 
+#: lxc/project.go:189
+msgid ""
+"### This is a yaml representation of the project.\n"
+"### Any line starting with a '# will be ignored.\n"
+"###\n"
+"### A project consists of a set of features and a description.\n"
+"###\n"
+"### An example would look like:\n"
+"### name: my-project\n"
+"### features:\n"
+"###   images: True\n"
+"###   profiles: True\n"
+"### description: My own project\n"
+"###\n"
+"### Note that the name is shown but cannot be changed"
+msgstr ""
+
 #: lxc/image.go:966
 #, c-format
 msgid "%s (%d more)"
@@ -453,8 +470,8 @@ msgid "Config key/value to apply to the target container"
 msgstr ""
 
 #: lxc/config.go:195 lxc/config.go:259 lxc/config_metadata.go:144
-#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/storage.go:303
-#: lxc/storage_volume.go:816
+#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/project.go:267
+#: lxc/storage.go:303 lxc/storage_volume.go:816
 #, c-format
 msgid "Config parsing error: %s"
 msgstr ""
@@ -575,6 +592,10 @@ msgstr ""
 msgid "Create profiles"
 msgstr ""
 
+#: lxc/project.go:72 lxc/project.go:73
+msgid "Create projects"
+msgstr ""
+
 #: lxc/storage.go:88 lxc/storage.go:89
 msgid "Create storage pools"
 msgstr ""
@@ -646,6 +667,10 @@ msgstr ""
 msgid "Delete profiles"
 msgstr ""
 
+#: lxc/project.go:126 lxc/project.go:127
+msgid "Delete projects"
+msgstr ""
+
 #: lxc/storage.go:162 lxc/storage.go:163
 msgid "Delete storage pools"
 msgstr ""
@@ -672,7 +697,7 @@ msgstr ""
 #: lxc/file.go:42 lxc/file.go:75 lxc/file.go:124 lxc/file.go:187
 #: lxc/file.go:377 lxc/image.go:42 lxc/image.go:131 lxc/image.go:265
 #: lxc/image.go:316 lxc/image.go:439 lxc/image.go:579 lxc/image.go:788
-#: lxc/image.go:902 lxc/image.go:1224 lxc/image.go:1301 lxc/image_alias.go:26
+#: lxc/image.go:902 lxc/image.go:1225 lxc/image.go:1302 lxc/image_alias.go:26
 #: lxc/image_alias.go:59 lxc/image_alias.go:106 lxc/image_alias.go:149
 #: lxc/image_alias.go:250 lxc/import.go:25 lxc/info.go:29 lxc/init.go:35
 #: lxc/launch.go:22 lxc/list.go:48 lxc/main.go:48 lxc/manpage.go:19
@@ -685,7 +710,9 @@ msgstr ""
 #: lxc/profile.go:30 lxc/profile.go:102 lxc/profile.go:165 lxc/profile.go:245
 #: lxc/profile.go:301 lxc/profile.go:355 lxc/profile.go:405 lxc/profile.go:529
 #: lxc/profile.go:577 lxc/profile.go:641 lxc/profile.go:717 lxc/profile.go:767
-#: lxc/profile.go:826 lxc/profile.go:880 lxc/publish.go:34 lxc/query.go:30
+#: lxc/profile.go:826 lxc/profile.go:880 lxc/project.go:29 lxc/project.go:73
+#: lxc/project.go:127 lxc/project.go:177 lxc/project.go:298 lxc/project.go:388
+#: lxc/project.go:443 lxc/project.go:496 lxc/publish.go:34 lxc/query.go:30
 #: lxc/remote.go:37 lxc/remote.go:87 lxc/remote.go:383 lxc/remote.go:419
 #: lxc/remote.go:524 lxc/remote.go:586 lxc/remote.go:636 lxc/remote.go:674
 #: lxc/rename.go:21 lxc/restore.go:24 lxc/snapshot.go:21 lxc/storage.go:33
@@ -794,6 +821,10 @@ msgstr ""
 msgid "Edit profile configurations as YAML"
 msgstr ""
 
+#: lxc/project.go:176 lxc/project.go:177
+msgid "Edit project configurations as YAML"
+msgstr ""
+
 #: lxc/storage.go:212 lxc/storage.go:213
 msgid "Edit storage pool configurations as YAML"
 msgstr ""
@@ -908,7 +939,7 @@ msgstr ""
 msgid "FINGERPRINT"
 msgstr ""
 
-#: lxc/move.go:213
+#: lxc/move.go:214
 msgid "Failed to connect to cluster member"
 msgstr ""
 
@@ -1012,6 +1043,10 @@ msgstr ""
 msgid "ID"
 msgstr ""
 
+#: lxc/project.go:367
+msgid "IMAGES"
+msgstr ""
+
 #: lxc/network.go:964
 msgid "IP ADDRESS"
 msgstr ""
@@ -1028,7 +1063,7 @@ msgstr ""
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:301
+#: lxc/main.go:305
 msgid ""
 "If this is your first time running LXD on this machine, you should also run: "
 "lxd init"
@@ -1038,7 +1073,7 @@ msgstr ""
 msgid "Ignore the container state"
 msgstr ""
 
-#: lxc/image.go:1284
+#: lxc/image.go:1285
 msgid "Image already up to date."
 msgstr ""
 
@@ -1050,7 +1085,7 @@ msgstr ""
 msgid "Image exported successfully!"
 msgstr ""
 
-#: lxc/image.go:288 lxc/image.go:1247
+#: lxc/image.go:288 lxc/image.go:1248
 msgid "Image identifier missing"
 msgstr ""
 
@@ -1064,7 +1099,7 @@ msgstr ""
 msgid "Image imported with fingerprint: %s"
 msgstr ""
 
-#: lxc/image.go:1282
+#: lxc/image.go:1283
 msgid "Image refreshed successfully!"
 msgstr ""
 
@@ -1119,7 +1154,7 @@ msgstr ""
 msgid "Invalid config key column format (too many fields): '%s'"
 msgstr ""
 
-#: lxc/image.go:1208 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
+#: lxc/image.go:1209 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
 #, c-format
 msgid "Invalid format %q"
 msgstr ""
@@ -1140,7 +1175,7 @@ msgid ""
 "Invalid name in '%s', empty string is only allowed when defining maxWidth"
 msgstr ""
 
-#: lxc/main.go:389
+#: lxc/main.go:393
 msgid "Invalid number of arguments"
 msgstr ""
 
@@ -1336,6 +1371,10 @@ msgstr ""
 msgid "List profiles"
 msgstr ""
 
+#: lxc/project.go:297 lxc/project.go:298
+msgid "List projects"
+msgstr ""
+
 #: lxc/storage_volume.go:911 lxc/storage_volume.go:912
 msgid "List storage volumes"
 msgstr ""
@@ -1454,6 +1493,10 @@ msgstr ""
 msgid "Manage profiles"
 msgstr ""
 
+#: lxc/project.go:28 lxc/project.go:29
+msgid "Manage projects"
+msgstr ""
+
 #: lxc/storage.go:32 lxc/storage.go:33
 msgid "Manage storage pools and volumes"
 msgstr ""
@@ -1500,11 +1543,11 @@ msgstr ""
 msgid "Memory usage:"
 msgstr ""
 
-#: lxc/move.go:226
+#: lxc/move.go:227
 msgid "Migration API failure"
 msgstr ""
 
-#: lxc/move.go:231
+#: lxc/move.go:232
 msgid "Migration operation failure"
 msgstr ""
 
@@ -1552,6 +1595,11 @@ msgstr ""
 msgid "Missing profile name"
 msgstr ""
 
+#: lxc/project.go:97 lxc/project.go:151 lxc/project.go:221 lxc/project.go:412
+#: lxc/project.go:467
+msgid "Missing project name"
+msgstr ""
+
 #: lxc/profile.go:270
 msgid "Missing source profile name"
 msgstr ""
@@ -1610,11 +1658,13 @@ msgid "Must supply container name for: "
 msgstr ""
 
 #: lxc/cluster.go:124 lxc/list.go:459 lxc/network.go:858 lxc/profile.go:622
-#: lxc/remote.go:465 lxc/storage.go:549 lxc/storage_volume.go:960
+#: lxc/project.go:366 lxc/remote.go:465 lxc/storage.go:549
+#: lxc/storage_volume.go:960
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:844 lxc/operation.go:141 lxc/remote.go:440 lxc/remote.go:445
+#: lxc/network.go:844 lxc/operation.go:141 lxc/project.go:342
+#: lxc/project.go:347 lxc/remote.go:440 lxc/remote.go:445
 msgid "NO"
 msgstr ""
 
@@ -1721,7 +1771,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:462
+#: lxc/list.go:462 lxc/project.go:368
 msgid "PROFILES"
 msgstr ""
 
@@ -1750,7 +1800,7 @@ msgstr ""
 msgid "Pid: %d"
 msgstr ""
 
-#: lxc/network.go:643 lxc/profile.go:500 lxc/storage.go:304
+#: lxc/network.go:643 lxc/profile.go:500 lxc/project.go:268 lxc/storage.go:304
 #: lxc/storage_volume.go:817
 msgid "Press enter to open the editor again"
 msgstr ""
@@ -1834,6 +1884,21 @@ msgstr ""
 msgid "Profiles: %s"
 msgstr ""
 
+#: lxc/project.go:110
+#, c-format
+msgid "Project %s created"
+msgstr ""
+
+#: lxc/project.go:161
+#, c-format
+msgid "Project %s deleted"
+msgstr ""
+
+#: lxc/project.go:427
+#, c-format
+msgid "Project %s renamed to %s"
+msgstr ""
+
 #: lxc/image.go:861
 msgid "Properties:"
 msgstr ""
@@ -1873,11 +1938,11 @@ msgstr ""
 msgid "Recursively transfer files"
 msgstr ""
 
-#: lxc/image.go:1223 lxc/image.go:1224
+#: lxc/image.go:1224 lxc/image.go:1225
 msgid "Refresh images"
 msgstr ""
 
-#: lxc/image.go:1252
+#: lxc/image.go:1253
 #, c-format
 msgid "Refreshing the image: %s"
 msgstr ""
@@ -1887,7 +1952,8 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656 lxc/remote.go:694
+#: lxc/project.go:523 lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656
+#: lxc/remote.go:694
 #, c-format
 msgid "Remote %s doesn't exist"
 msgstr ""
@@ -1965,6 +2031,10 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
+#: lxc/project.go:387 lxc/project.go:388
+msgid "Rename projects"
+msgstr ""
+
 #: lxc/remote.go:523 lxc/remote.go:524
 msgid "Rename remotes"
 msgstr ""
@@ -2150,11 +2220,11 @@ msgstr ""
 msgid "Show full device configuration for containers or profiles"
 msgstr ""
 
-#: lxc/image.go:1300 lxc/image.go:1301
+#: lxc/image.go:1301 lxc/image.go:1302
 msgid "Show image properties"
 msgstr ""
 
-#: lxc/main.go:215 lxc/main.go:216
+#: lxc/main.go:219 lxc/main.go:220
 msgid "Show less common commands"
 msgstr ""
 
@@ -2170,6 +2240,10 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
+#: lxc/project.go:442 lxc/project.go:443
+msgid "Show project options"
+msgstr ""
+
 #: lxc/storage.go:649 lxc/storage.go:650
 msgid "Show storage pool configurations and resources"
 msgstr ""
@@ -2317,6 +2391,10 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
+#: lxc/project.go:495 lxc/project.go:496
+msgid "Switch the current project"
+msgstr ""
+
 #: lxc/remote.go:635 lxc/remote.go:636
 msgid "Switch the default remote"
 msgstr ""
@@ -2379,7 +2457,7 @@ msgstr ""
 msgid "The profile device doesn't exist"
 msgstr ""
 
-#: lxc/move.go:218
+#: lxc/move.go:219
 msgid "The source LXD instance is not clustered"
 msgstr ""
 
@@ -2416,7 +2494,7 @@ msgstr ""
 msgid "To detach from the console, press: <ctrl>+a q"
 msgstr ""
 
-#: lxc/main.go:304
+#: lxc/main.go:308
 msgid "To start your first container, try: lxc launch ubuntu:18.04"
 msgstr ""
 
@@ -2467,7 +2545,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:862 lxc/profile.go:623 lxc/storage.go:558
+#: lxc/network.go:862 lxc/profile.go:623 lxc/project.go:369 lxc/storage.go:558
 #: lxc/storage_volume.go:962
 msgid "USED BY"
 msgstr ""
@@ -2552,7 +2630,8 @@ msgstr ""
 msgid "Whether or not to snapshot the container's running state"
 msgstr ""
 
-#: lxc/network.go:846 lxc/operation.go:143 lxc/remote.go:442 lxc/remote.go:447
+#: lxc/network.go:846 lxc/operation.go:143 lxc/project.go:344
+#: lxc/project.go:349 lxc/remote.go:442 lxc/remote.go:447
 msgid "YES"
 msgstr ""
 
@@ -2568,7 +2647,7 @@ msgstr ""
 msgid "You must specify a destination container name when using --target"
 msgstr ""
 
-#: lxc/copy.go:72 lxc/move.go:202
+#: lxc/copy.go:72 lxc/move.go:203
 msgid "You must specify a source container name"
 msgstr ""
 
@@ -2672,6 +2751,14 @@ msgstr ""
 msgid "create [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:71
+msgid "create [<remote>:]<project>"
+msgstr ""
+
+#: lxc/project.go:354
+msgid "current"
+msgstr ""
+
 #: lxc/remote.go:459
 msgid "default"
 msgstr ""
@@ -2718,6 +2805,10 @@ msgstr ""
 msgid "delete [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:124
+msgid "delete [<remote>:]<project>"
+msgstr ""
+
 #: lxc/storage.go:436
 msgid "description"
 msgstr ""
@@ -2786,6 +2877,10 @@ msgstr ""
 msgid "edit [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:175
+msgid "edit [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:86
 msgid "edit [<remote>:][<container>]"
 msgstr ""
@@ -2896,7 +2991,7 @@ msgid "list"
 msgstr ""
 
 #: lxc/cluster.go:61 lxc/config_trust.go:112 lxc/network.go:796
-#: lxc/operation.go:98 lxc/profile.go:574 lxc/storage.go:493
+#: lxc/operation.go:98 lxc/profile.go:574 lxc/project.go:295 lxc/storage.go:493
 msgid "list [<remote>:]"
 msgstr ""
 
@@ -3081,6 +3176,12 @@ msgid ""
 "    Update a profile using the content of profile.yaml"
 msgstr ""
 
+#: lxc/project.go:179
+msgid ""
+"lxc project edit <project> < project.yaml\n"
+"    Update a project using the content of project.yaml"
+msgstr ""
+
 #: lxc/query.go:32
 msgid ""
 "lxc query -X DELETE --wait /1.0/containers/c1\n"
@@ -3183,6 +3284,10 @@ msgstr ""
 msgid "profile"
 msgstr ""
 
+#: lxc/project.go:27
+msgid "project"
+msgstr ""
+
 #: lxc/publish.go:32
 msgid ""
 "publish [<remote>:]<container>[/<snapshot>] [<remote>:] [flags] "
@@ -3205,7 +3310,7 @@ msgstr ""
 msgid "query [<remote>:]<API path>"
 msgstr ""
 
-#: lxc/image.go:1222
+#: lxc/image.go:1223
 msgid "refresh [<remote>:]<image> [[<remote>:]<image>...]"
 msgstr ""
 
@@ -3269,6 +3374,10 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
+#: lxc/project.go:385
+msgid "rename [<remote>:]<project> <new-name>"
+msgstr ""
+
 #: lxc/action.go:68
 msgid "restart [<remote>:]<container> [[<remote>:]<container>...]"
 msgstr ""
@@ -3317,7 +3426,7 @@ msgstr ""
 msgid "show [<remote>:]<container|profile>"
 msgstr ""
 
-#: lxc/image.go:1299
+#: lxc/image.go:1300
 msgid "show [<remote>:]<image>"
 msgstr ""
 
@@ -3345,6 +3454,10 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:441
+msgid "show [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:450
 msgid "show [<remote>:][<container>]"
 msgstr ""
@@ -3381,6 +3494,10 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
+#: lxc/project.go:494
+msgid "switch [<remote>:] <project>"
+msgstr ""
+
 #: lxc/info.go:255
 #, c-format
 msgid "taken at %s"
diff --git a/po/lxd.pot b/po/lxd.pot
index d365658c25..3dc25073bb 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: 2018-08-23 15:14-0400\n"
+        "POT-Creation-Date: 2018-09-01 23:36-0700\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"
@@ -136,6 +136,22 @@ msgid   "### This is a yaml representation of the profile.\n"
         "### Note that the name is shown but cannot be changed"
 msgstr  ""
 
+#: lxc/project.go:189
+msgid   "### This is a yaml representation of the project.\n"
+        "### Any line starting with a '# will be ignored.\n"
+        "###\n"
+        "### A project consists of a set of features and a description.\n"
+        "###\n"
+        "### An example would look like:\n"
+        "### name: my-project\n"
+        "### features:\n"
+        "###   images: True\n"
+        "###   profiles: True\n"
+        "### description: My own project\n"
+        "###\n"
+        "### Note that the name is shown but cannot be changed"
+msgstr  ""
+
 #: lxc/image.go:966
 #, c-format
 msgid   "%s (%d more)"
@@ -433,7 +449,7 @@ msgstr  ""
 msgid   "Config key/value to apply to the target container"
 msgstr  ""
 
-#: lxc/config.go:195 lxc/config.go:259 lxc/config_metadata.go:144 lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/storage.go:303 lxc/storage_volume.go:816
+#: lxc/config.go:195 lxc/config.go:259 lxc/config_metadata.go:144 lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/project.go:267 lxc/storage.go:303 lxc/storage_volume.go:816
 #, c-format
 msgid   "Config parsing error: %s"
 msgstr  ""
@@ -552,6 +568,10 @@ msgstr  ""
 msgid   "Create profiles"
 msgstr  ""
 
+#: lxc/project.go:72 lxc/project.go:73
+msgid   "Create projects"
+msgstr  ""
+
 #: lxc/storage.go:88 lxc/storage.go:89
 msgid   "Create storage pools"
 msgstr  ""
@@ -622,6 +642,10 @@ msgstr  ""
 msgid   "Delete profiles"
 msgstr  ""
 
+#: lxc/project.go:126 lxc/project.go:127
+msgid   "Delete projects"
+msgstr  ""
+
 #: lxc/storage.go:162 lxc/storage.go:163
 msgid   "Delete storage pools"
 msgstr  ""
@@ -630,7 +654,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:23 lxc/alias.go:55 lxc/alias.go:99 lxc/alias.go:147 lxc/alias.go:198 lxc/cluster.go:27 lxc/cluster.go:64 lxc/cluster.go:147 lxc/cluster.go:197 lxc/cluster.go:246 lxc/cluster.go:295 lxc/config.go:29 lxc/config.go:88 lxc/config.go:289 lxc/config.go:355 lxc/config.go:452 lxc/config.go:560 lxc/config_device.go:24 lxc/config_device.go:76 lxc/config_device.go:182 lxc/config_device.go:255 lxc/config_device.go:321 lxc/config_device.go:410 lxc/config_device.go:500 lxc/config_device.go:589 lxc/config_device.go:657 lxc/config_metadata.go:29 lxc/config_metadata.go:54 lxc/config_metadata.go:176 lxc/config_template.go:30 lxc/config_template.go:67 lxc/config_template.go:110 lxc/config_template.go:152 lxc/config_template.go:236 lxc/config_template.go:298 lxc/config_trust.go:30 lxc/config_trust.go:59 lxc/config_trust.go:115 lxc/config_trust.go:197 lxc/console.go:32 lxc/copy.go:37 lxc/delete.go:30 lxc/exec.go:39 lxc/export.go:30 lxc/file.go:42 lxc/file.go:75 lxc/file.go:124 lxc/file.go:187 lxc/file.go:377 lxc/image.go:42 lxc/image.go:131 lxc/image.go:265 lxc/image.go:316 lxc/image.go:439 lxc/image.go:579 lxc/image.go:788 lxc/image.go:902 lxc/image.go:1224 lxc/image.go:1301 lxc/image_alias.go:26 lxc/image_alias.go:59 lxc/image_alias.go:106 lxc/image_alias.go:149 lxc/image_alias.go:250 lxc/import.go:25 lxc/info.go:29 lxc/init.go:35 lxc/launch.go:22 lxc/list.go:48 lxc/main.go:48 lxc/manpage.go:19 lxc/monitor.go:31 lxc/move.go:36 lxc/network.go:34 lxc/network.go:110 lxc/network.go:183 lxc/network.go:256 lxc/network.go:328 lxc/network.go:378 lxc/network.go:463 lxc/network.go:548 lxc/network.go:671 lxc/network.go:729 lxc/network.go:799 lxc/network.go:919 lxc/network.go:984 lxc/network.go:1034 lxc/network.go:1103 lxc/network.go:1165 lxc/operation.go:25 lxc/operation.go:54 lxc/operation.go:101 lxc/operation.go:177 lxc/profile.go:30 lxc/profile.go:102 lxc/profile.go:165 lxc/profile.go:245 lxc/profile.go:301 lxc/profile.go:355 lxc/profile.go:405 lxc/profile.go:529 lxc/profile.go:577 lxc/profile.go:641 lxc/profile.go:717 lxc/profile.go:767 lxc/profile.go:826 lxc/profile.go:880 lxc/publish.go:34 lxc/query.go:30 lxc/remote.go:37 lxc/remote.go:87 lxc/remote.go:383 lxc/remote.go:419 lxc/remote.go:524 lxc/remote.go:586 lxc/remote.go:636 lxc/remote.go:674 lxc/rename.go:21 lxc/restore.go:24 lxc/snapshot.go:21 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:496 lxc/storage.go:578 lxc/storage.go:650 lxc/storage.go:734 lxc/storage_volume.go:34 lxc/storage_volume.go:122 lxc/storage_volume.go:201 lxc/storage_volume.go:283 lxc/storage_volume.go:416 lxc/storage_volume.go:493 lxc/storage_volume.go:555 lxc/storage_volume.go:637 lxc/storage_volume.go:718 lxc/storage_volume.go:847 lxc/storage_volume.go:912 lxc/storage_volume.go:988 lxc/storage_volume.go:1019 lxc/storage_volume.go:1085 lxc/storage_volume.go:1162 lxc/storage_volume.go:1237 lxc/version.go:22
+#: lxc/action.go:31 lxc/action.go:50 lxc/action.go:70 lxc/action.go:91 lxc/alias.go:23 lxc/alias.go:55 lxc/alias.go:99 lxc/alias.go:147 lxc/alias.go:198 lxc/cluster.go:27 lxc/cluster.go:64 lxc/cluster.go:147 lxc/cluster.go:197 lxc/cluster.go:246 lxc/cluster.go:295 lxc/config.go:29 lxc/config.go:88 lxc/config.go:289 lxc/config.go:355 lxc/config.go:452 lxc/config.go:560 lxc/config_device.go:24 lxc/config_device.go:76 lxc/config_device.go:182 lxc/config_device.go:255 lxc/config_device.go:321 lxc/config_device.go:410 lxc/config_device.go:500 lxc/config_device.go:589 lxc/config_device.go:657 lxc/config_metadata.go:29 lxc/config_metadata.go:54 lxc/config_metadata.go:176 lxc/config_template.go:30 lxc/config_template.go:67 lxc/config_template.go:110 lxc/config_template.go:152 lxc/config_template.go:236 lxc/config_template.go:298 lxc/config_trust.go:30 lxc/config_trust.go:59 lxc/config_trust.go:115 lxc/config_trust.go:197 lxc/console.go:32 lxc/copy.go:37 lxc/delete.go:30 lxc/exec.go:39 lxc/export.go:30 lxc/file.go:42 lxc/file.go:75 lxc/file.go:124 lxc/file.go:187 lxc/file.go:377 lxc/image.go:42 lxc/image.go:131 lxc/image.go:265 lxc/image.go:316 lxc/image.go:439 lxc/image.go:579 lxc/image.go:788 lxc/image.go:902 lxc/image.go:1225 lxc/image.go:1302 lxc/image_alias.go:26 lxc/image_alias.go:59 lxc/image_alias.go:106 lxc/image_alias.go:149 lxc/image_alias.go:250 lxc/import.go:25 lxc/info.go:29 lxc/init.go:35 lxc/launch.go:22 lxc/list.go:48 lxc/main.go:48 lxc/manpage.go:19 lxc/monitor.go:31 lxc/move.go:36 lxc/network.go:34 lxc/network.go:110 lxc/network.go:183 lxc/network.go:256 lxc/network.go:328 lxc/network.go:378 lxc/network.go:463 lxc/network.go:548 lxc/network.go:671 lxc/network.go:729 lxc/network.go:799 lxc/network.go:919 lxc/network.go:984 lxc/network.go:1034 lxc/network.go:1103 lxc/network.go:1165 lxc/operation.go:25 lxc/operation.go:54 lxc/operation.go:101 lxc/operation.go:177 lxc/profile.go:30 lxc/profile.go:102 lxc/profile.go:165 lxc/profile.go:245 lxc/profile.go:301 lxc/profile.go:355 lxc/profile.go:405 lxc/profile.go:529 lxc/profile.go:577 lxc/profile.go:641 lxc/profile.go:717 lxc/profile.go:767 lxc/profile.go:826 lxc/profile.go:880 lxc/project.go:29 lxc/project.go:73 lxc/project.go:127 lxc/project.go:177 lxc/project.go:298 lxc/project.go:388 lxc/project.go:443 lxc/project.go:496 lxc/publish.go:34 lxc/query.go:30 lxc/remote.go:37 lxc/remote.go:87 lxc/remote.go:383 lxc/remote.go:419 lxc/remote.go:524 lxc/remote.go:586 lxc/remote.go:636 lxc/remote.go:674 lxc/rename.go:21 lxc/restore.go:24 lxc/snapshot.go:21 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:496 lxc/storage.go:578 lxc/storage.go:650 lxc/storage.go:734 lxc/storage_volume.go:34 lxc/storage_volume.go:122 lxc/storage_volume.go:201 lxc/storage_volume.go:283 lxc/storage_volume.go:416 lxc/storage_volume.go:493 lxc/storage_volume.go:555 lxc/storage_volume.go:637 lxc/storage_volume.go:718 lxc/storage_volume.go:847 lxc/storage_volume.go:912 lxc/storage_volume.go:988 lxc/storage_volume.go:1019 lxc/storage_volume.go:1085 lxc/storage_volume.go:1162 lxc/storage_volume.go:1237 lxc/version.go:22
 msgid   "Description"
 msgstr  ""
 
@@ -726,6 +750,10 @@ msgstr  ""
 msgid   "Edit profile configurations as YAML"
 msgstr  ""
 
+#: lxc/project.go:176 lxc/project.go:177
+msgid   "Edit project configurations as YAML"
+msgstr  ""
+
 #: lxc/storage.go:212 lxc/storage.go:213
 msgid   "Edit storage pool configurations as YAML"
 msgstr  ""
@@ -833,7 +861,7 @@ msgstr  ""
 msgid   "FINGERPRINT"
 msgstr  ""
 
-#: lxc/move.go:213
+#: lxc/move.go:214
 msgid   "Failed to connect to cluster member"
 msgstr  ""
 
@@ -937,6 +965,10 @@ msgstr  ""
 msgid   "ID"
 msgstr  ""
 
+#: lxc/project.go:367
+msgid   "IMAGES"
+msgstr  ""
+
 #: lxc/network.go:964
 msgid   "IP ADDRESS"
 msgstr  ""
@@ -953,7 +985,7 @@ msgstr  ""
 msgid   "ISSUE DATE"
 msgstr  ""
 
-#: lxc/main.go:301
+#: lxc/main.go:305
 msgid   "If this is your first time running LXD on this machine, you should also run: lxd init"
 msgstr  ""
 
@@ -961,7 +993,7 @@ msgstr  ""
 msgid   "Ignore the container state"
 msgstr  ""
 
-#: lxc/image.go:1284
+#: lxc/image.go:1285
 msgid   "Image already up to date."
 msgstr  ""
 
@@ -973,7 +1005,7 @@ msgstr  ""
 msgid   "Image exported successfully!"
 msgstr  ""
 
-#: lxc/image.go:288 lxc/image.go:1247
+#: lxc/image.go:288 lxc/image.go:1248
 msgid   "Image identifier missing"
 msgstr  ""
 
@@ -987,7 +1019,7 @@ msgstr  ""
 msgid   "Image imported with fingerprint: %s"
 msgstr  ""
 
-#: lxc/image.go:1282
+#: lxc/image.go:1283
 msgid   "Image refreshed successfully!"
 msgstr  ""
 
@@ -1041,7 +1073,7 @@ msgstr  ""
 msgid   "Invalid config key column format (too many fields): '%s'"
 msgstr  ""
 
-#: lxc/image.go:1208 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
+#: lxc/image.go:1209 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
 #, c-format
 msgid   "Invalid format %q"
 msgstr  ""
@@ -1061,7 +1093,7 @@ msgstr  ""
 msgid   "Invalid name in '%s', empty string is only allowed when defining maxWidth"
 msgstr  ""
 
-#: lxc/main.go:389
+#: lxc/main.go:393
 msgid   "Invalid number of arguments"
 msgstr  ""
 
@@ -1251,6 +1283,10 @@ msgstr  ""
 msgid   "List profiles"
 msgstr  ""
 
+#: lxc/project.go:297 lxc/project.go:298
+msgid   "List projects"
+msgstr  ""
+
 #: lxc/storage_volume.go:911 lxc/storage_volume.go:912
 msgid   "List storage volumes"
 msgstr  ""
@@ -1368,6 +1404,10 @@ msgstr  ""
 msgid   "Manage profiles"
 msgstr  ""
 
+#: lxc/project.go:28 lxc/project.go:29
+msgid   "Manage projects"
+msgstr  ""
+
 #: lxc/storage.go:32 lxc/storage.go:33
 msgid   "Manage storage pools and volumes"
 msgstr  ""
@@ -1412,11 +1452,11 @@ msgstr  ""
 msgid   "Memory usage:"
 msgstr  ""
 
-#: lxc/move.go:226
+#: lxc/move.go:227
 msgid   "Migration API failure"
 msgstr  ""
 
-#: lxc/move.go:231
+#: lxc/move.go:232
 msgid   "Migration operation failure"
 msgstr  ""
 
@@ -1448,6 +1488,10 @@ msgstr  ""
 msgid   "Missing profile name"
 msgstr  ""
 
+#: lxc/project.go:97 lxc/project.go:151 lxc/project.go:221 lxc/project.go:412 lxc/project.go:467
+msgid   "Missing project name"
+msgstr  ""
+
 #: lxc/profile.go:270
 msgid   "Missing source profile name"
 msgstr  ""
@@ -1503,11 +1547,11 @@ msgstr  ""
 msgid   "Must supply container name for: "
 msgstr  ""
 
-#: lxc/cluster.go:124 lxc/list.go:459 lxc/network.go:858 lxc/profile.go:622 lxc/remote.go:465 lxc/storage.go:549 lxc/storage_volume.go:960
+#: lxc/cluster.go:124 lxc/list.go:459 lxc/network.go:858 lxc/profile.go:622 lxc/project.go:366 lxc/remote.go:465 lxc/storage.go:549 lxc/storage_volume.go:960
 msgid   "NAME"
 msgstr  ""
 
-#: lxc/network.go:844 lxc/operation.go:141 lxc/remote.go:440 lxc/remote.go:445
+#: lxc/network.go:844 lxc/operation.go:141 lxc/project.go:342 lxc/project.go:347 lxc/remote.go:440 lxc/remote.go:445
 msgid   "NO"
 msgstr  ""
 
@@ -1614,7 +1658,7 @@ msgstr  ""
 msgid   "PROCESSES"
 msgstr  ""
 
-#: lxc/list.go:462
+#: lxc/list.go:462 lxc/project.go:368
 msgid   "PROFILES"
 msgstr  ""
 
@@ -1643,7 +1687,7 @@ msgstr  ""
 msgid   "Pid: %d"
 msgstr  ""
 
-#: lxc/network.go:643 lxc/profile.go:500 lxc/storage.go:304 lxc/storage_volume.go:817
+#: lxc/network.go:643 lxc/profile.go:500 lxc/project.go:268 lxc/storage.go:304 lxc/storage_volume.go:817
 msgid   "Press enter to open the editor again"
 msgstr  ""
 
@@ -1725,6 +1769,21 @@ msgstr  ""
 msgid   "Profiles: %s"
 msgstr  ""
 
+#: lxc/project.go:110
+#, c-format
+msgid   "Project %s created"
+msgstr  ""
+
+#: lxc/project.go:161
+#, c-format
+msgid   "Project %s deleted"
+msgstr  ""
+
+#: lxc/project.go:427
+#, c-format
+msgid   "Project %s renamed to %s"
+msgstr  ""
+
 #: lxc/image.go:861
 msgid   "Properties:"
 msgstr  ""
@@ -1764,11 +1823,11 @@ msgstr  ""
 msgid   "Recursively transfer files"
 msgstr  ""
 
-#: lxc/image.go:1223 lxc/image.go:1224
+#: lxc/image.go:1224 lxc/image.go:1225
 msgid   "Refresh images"
 msgstr  ""
 
-#: lxc/image.go:1252
+#: lxc/image.go:1253
 #, c-format
 msgid   "Refreshing the image: %s"
 msgstr  ""
@@ -1778,7 +1837,7 @@ msgstr  ""
 msgid   "Remote %s already exists"
 msgstr  ""
 
-#: lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656 lxc/remote.go:694
+#: lxc/project.go:523 lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656 lxc/remote.go:694
 #, c-format
 msgid   "Remote %s doesn't exist"
 msgstr  ""
@@ -1855,6 +1914,10 @@ msgstr  ""
 msgid   "Rename profiles"
 msgstr  ""
 
+#: lxc/project.go:387 lxc/project.go:388
+msgid   "Rename projects"
+msgstr  ""
+
 #: lxc/remote.go:523 lxc/remote.go:524
 msgid   "Rename remotes"
 msgstr  ""
@@ -2038,11 +2101,11 @@ msgstr  ""
 msgid   "Show full device configuration for containers or profiles"
 msgstr  ""
 
-#: lxc/image.go:1300 lxc/image.go:1301
+#: lxc/image.go:1301 lxc/image.go:1302
 msgid   "Show image properties"
 msgstr  ""
 
-#: lxc/main.go:215 lxc/main.go:216
+#: lxc/main.go:219 lxc/main.go:220
 msgid   "Show less common commands"
 msgstr  ""
 
@@ -2058,6 +2121,10 @@ msgstr  ""
 msgid   "Show profile configurations"
 msgstr  ""
 
+#: lxc/project.go:442 lxc/project.go:443
+msgid   "Show project options"
+msgstr  ""
+
 #: lxc/storage.go:649 lxc/storage.go:650
 msgid   "Show storage pool configurations and resources"
 msgstr  ""
@@ -2205,6 +2272,10 @@ msgstr  ""
 msgid   "Swap (peak)"
 msgstr  ""
 
+#: lxc/project.go:495 lxc/project.go:496
+msgid   "Switch the current project"
+msgstr  ""
+
 #: lxc/remote.go:635 lxc/remote.go:636
 msgid   "Switch the default remote"
 msgstr  ""
@@ -2263,7 +2334,7 @@ msgstr  ""
 msgid   "The profile device doesn't exist"
 msgstr  ""
 
-#: lxc/move.go:218
+#: lxc/move.go:219
 msgid   "The source LXD instance is not clustered"
 msgstr  ""
 
@@ -2299,7 +2370,7 @@ msgstr  ""
 msgid   "To detach from the console, press: <ctrl>+a q"
 msgstr  ""
 
-#: lxc/main.go:304
+#: lxc/main.go:308
 msgid   "To start your first container, try: lxc launch ubuntu:18.04"
 msgstr  ""
 
@@ -2350,7 +2421,7 @@ msgstr  ""
 msgid   "URL"
 msgstr  ""
 
-#: lxc/network.go:862 lxc/profile.go:623 lxc/storage.go:558 lxc/storage_volume.go:962
+#: lxc/network.go:862 lxc/profile.go:623 lxc/project.go:369 lxc/storage.go:558 lxc/storage_volume.go:962
 msgid   "USED BY"
 msgstr  ""
 
@@ -2430,7 +2501,7 @@ msgstr  ""
 msgid   "Whether or not to snapshot the container's running state"
 msgstr  ""
 
-#: lxc/network.go:846 lxc/operation.go:143 lxc/remote.go:442 lxc/remote.go:447
+#: lxc/network.go:846 lxc/operation.go:143 lxc/project.go:344 lxc/project.go:349 lxc/remote.go:442 lxc/remote.go:447
 msgid   "YES"
 msgstr  ""
 
@@ -2446,7 +2517,7 @@ msgstr  ""
 msgid   "You must specify a destination container name when using --target"
 msgstr  ""
 
-#: lxc/copy.go:72 lxc/move.go:202
+#: lxc/copy.go:72 lxc/move.go:203
 msgid   "You must specify a source container name"
 msgstr  ""
 
@@ -2546,6 +2617,14 @@ msgstr  ""
 msgid   "create [<remote>:]<profile>"
 msgstr  ""
 
+#: lxc/project.go:71
+msgid   "create [<remote>:]<project>"
+msgstr  ""
+
+#: lxc/project.go:354
+msgid   "current"
+msgstr  ""
+
 #: lxc/remote.go:459
 msgid   "default"
 msgstr  ""
@@ -2590,6 +2669,10 @@ msgstr  ""
 msgid   "delete [<remote>:]<profile>"
 msgstr  ""
 
+#: lxc/project.go:124
+msgid   "delete [<remote>:]<project>"
+msgstr  ""
+
 #: lxc/storage.go:436
 msgid   "description"
 msgstr  ""
@@ -2658,6 +2741,10 @@ msgstr  ""
 msgid   "edit [<remote>:]<profile>"
 msgstr  ""
 
+#: lxc/project.go:175
+msgid   "edit [<remote>:]<project>"
+msgstr  ""
+
 #: lxc/config.go:86
 msgid   "edit [<remote>:][<container>]"
 msgstr  ""
@@ -2763,7 +2850,7 @@ msgstr  ""
 msgid   "list"
 msgstr  ""
 
-#: lxc/cluster.go:61 lxc/config_trust.go:112 lxc/network.go:796 lxc/operation.go:98 lxc/profile.go:574 lxc/storage.go:493
+#: lxc/cluster.go:61 lxc/config_trust.go:112 lxc/network.go:796 lxc/operation.go:98 lxc/profile.go:574 lxc/project.go:295 lxc/storage.go:493
 msgid   "list [<remote>:]"
 msgstr  ""
 
@@ -2923,6 +3010,11 @@ msgid   "lxc profile edit <profile> < profile.yaml\n"
         "    Update a profile using the content of profile.yaml"
 msgstr  ""
 
+#: lxc/project.go:179
+msgid   "lxc project edit <project> < project.yaml\n"
+        "    Update a project using the content of project.yaml"
+msgstr  ""
+
 #: lxc/query.go:32
 msgid   "lxc query -X DELETE --wait /1.0/containers/c1\n"
         "    Delete local container \"c1\"."
@@ -3015,6 +3107,10 @@ msgstr  ""
 msgid   "profile"
 msgstr  ""
 
+#: lxc/project.go:27
+msgid   "project"
+msgstr  ""
+
 #: lxc/publish.go:32
 msgid   "publish [<remote>:]<container>[/<snapshot>] [<remote>:] [flags] [key=value...]"
 msgstr  ""
@@ -3031,7 +3127,7 @@ msgstr  ""
 msgid   "query [<remote>:]<API path>"
 msgstr  ""
 
-#: lxc/image.go:1222
+#: lxc/image.go:1223
 msgid   "refresh [<remote>:]<image> [[<remote>:]<image>...]"
 msgstr  ""
 
@@ -3095,6 +3191,10 @@ msgstr  ""
 msgid   "rename [<remote>:]<profile> <new-name>"
 msgstr  ""
 
+#: lxc/project.go:385
+msgid   "rename [<remote>:]<project> <new-name>"
+msgstr  ""
+
 #: lxc/action.go:68
 msgid   "restart [<remote>:]<container> [[<remote>:]<container>...]"
 msgstr  ""
@@ -3143,7 +3243,7 @@ msgstr  ""
 msgid   "show [<remote>:]<container|profile>"
 msgstr  ""
 
-#: lxc/image.go:1299
+#: lxc/image.go:1300
 msgid   "show [<remote>:]<image>"
 msgstr  ""
 
@@ -3171,6 +3271,10 @@ msgstr  ""
 msgid   "show [<remote>:]<profile>"
 msgstr  ""
 
+#: lxc/project.go:441
+msgid   "show [<remote>:]<project>"
+msgstr  ""
+
 #: lxc/config.go:450
 msgid   "show [<remote>:][<container>]"
 msgstr  ""
@@ -3207,6 +3311,10 @@ msgstr  ""
 msgid   "switch <remote>"
 msgstr  ""
 
+#: lxc/project.go:494
+msgid   "switch [<remote>:] <project>"
+msgstr  ""
+
 #: lxc/info.go:255
 #, c-format
 msgid   "taken at %s"
diff --git a/po/nb_NO.po b/po/nb_NO.po
index cb3a3cc70c..a13cc2beb0 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: 2018-08-23 15:14-0400\n"
+"POT-Creation-Date: 2018-09-02 06:35+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -143,6 +143,23 @@ msgid ""
 "### Note that the name is shown but cannot be changed"
 msgstr ""
 
+#: lxc/project.go:189
+msgid ""
+"### This is a yaml representation of the project.\n"
+"### Any line starting with a '# will be ignored.\n"
+"###\n"
+"### A project consists of a set of features and a description.\n"
+"###\n"
+"### An example would look like:\n"
+"### name: my-project\n"
+"### features:\n"
+"###   images: True\n"
+"###   profiles: True\n"
+"### description: My own project\n"
+"###\n"
+"### Note that the name is shown but cannot be changed"
+msgstr ""
+
 #: lxc/image.go:966
 #, c-format
 msgid "%s (%d more)"
@@ -453,8 +470,8 @@ msgid "Config key/value to apply to the target container"
 msgstr ""
 
 #: lxc/config.go:195 lxc/config.go:259 lxc/config_metadata.go:144
-#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/storage.go:303
-#: lxc/storage_volume.go:816
+#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/project.go:267
+#: lxc/storage.go:303 lxc/storage_volume.go:816
 #, c-format
 msgid "Config parsing error: %s"
 msgstr ""
@@ -575,6 +592,10 @@ msgstr ""
 msgid "Create profiles"
 msgstr ""
 
+#: lxc/project.go:72 lxc/project.go:73
+msgid "Create projects"
+msgstr ""
+
 #: lxc/storage.go:88 lxc/storage.go:89
 msgid "Create storage pools"
 msgstr ""
@@ -646,6 +667,10 @@ msgstr ""
 msgid "Delete profiles"
 msgstr ""
 
+#: lxc/project.go:126 lxc/project.go:127
+msgid "Delete projects"
+msgstr ""
+
 #: lxc/storage.go:162 lxc/storage.go:163
 msgid "Delete storage pools"
 msgstr ""
@@ -672,7 +697,7 @@ msgstr ""
 #: lxc/file.go:42 lxc/file.go:75 lxc/file.go:124 lxc/file.go:187
 #: lxc/file.go:377 lxc/image.go:42 lxc/image.go:131 lxc/image.go:265
 #: lxc/image.go:316 lxc/image.go:439 lxc/image.go:579 lxc/image.go:788
-#: lxc/image.go:902 lxc/image.go:1224 lxc/image.go:1301 lxc/image_alias.go:26
+#: lxc/image.go:902 lxc/image.go:1225 lxc/image.go:1302 lxc/image_alias.go:26
 #: lxc/image_alias.go:59 lxc/image_alias.go:106 lxc/image_alias.go:149
 #: lxc/image_alias.go:250 lxc/import.go:25 lxc/info.go:29 lxc/init.go:35
 #: lxc/launch.go:22 lxc/list.go:48 lxc/main.go:48 lxc/manpage.go:19
@@ -685,7 +710,9 @@ msgstr ""
 #: lxc/profile.go:30 lxc/profile.go:102 lxc/profile.go:165 lxc/profile.go:245
 #: lxc/profile.go:301 lxc/profile.go:355 lxc/profile.go:405 lxc/profile.go:529
 #: lxc/profile.go:577 lxc/profile.go:641 lxc/profile.go:717 lxc/profile.go:767
-#: lxc/profile.go:826 lxc/profile.go:880 lxc/publish.go:34 lxc/query.go:30
+#: lxc/profile.go:826 lxc/profile.go:880 lxc/project.go:29 lxc/project.go:73
+#: lxc/project.go:127 lxc/project.go:177 lxc/project.go:298 lxc/project.go:388
+#: lxc/project.go:443 lxc/project.go:496 lxc/publish.go:34 lxc/query.go:30
 #: lxc/remote.go:37 lxc/remote.go:87 lxc/remote.go:383 lxc/remote.go:419
 #: lxc/remote.go:524 lxc/remote.go:586 lxc/remote.go:636 lxc/remote.go:674
 #: lxc/rename.go:21 lxc/restore.go:24 lxc/snapshot.go:21 lxc/storage.go:33
@@ -794,6 +821,10 @@ msgstr ""
 msgid "Edit profile configurations as YAML"
 msgstr ""
 
+#: lxc/project.go:176 lxc/project.go:177
+msgid "Edit project configurations as YAML"
+msgstr ""
+
 #: lxc/storage.go:212 lxc/storage.go:213
 msgid "Edit storage pool configurations as YAML"
 msgstr ""
@@ -908,7 +939,7 @@ msgstr ""
 msgid "FINGERPRINT"
 msgstr ""
 
-#: lxc/move.go:213
+#: lxc/move.go:214
 msgid "Failed to connect to cluster member"
 msgstr ""
 
@@ -1012,6 +1043,10 @@ msgstr ""
 msgid "ID"
 msgstr ""
 
+#: lxc/project.go:367
+msgid "IMAGES"
+msgstr ""
+
 #: lxc/network.go:964
 msgid "IP ADDRESS"
 msgstr ""
@@ -1028,7 +1063,7 @@ msgstr ""
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:301
+#: lxc/main.go:305
 msgid ""
 "If this is your first time running LXD on this machine, you should also run: "
 "lxd init"
@@ -1038,7 +1073,7 @@ msgstr ""
 msgid "Ignore the container state"
 msgstr ""
 
-#: lxc/image.go:1284
+#: lxc/image.go:1285
 msgid "Image already up to date."
 msgstr ""
 
@@ -1050,7 +1085,7 @@ msgstr ""
 msgid "Image exported successfully!"
 msgstr ""
 
-#: lxc/image.go:288 lxc/image.go:1247
+#: lxc/image.go:288 lxc/image.go:1248
 msgid "Image identifier missing"
 msgstr ""
 
@@ -1064,7 +1099,7 @@ msgstr ""
 msgid "Image imported with fingerprint: %s"
 msgstr ""
 
-#: lxc/image.go:1282
+#: lxc/image.go:1283
 msgid "Image refreshed successfully!"
 msgstr ""
 
@@ -1119,7 +1154,7 @@ msgstr ""
 msgid "Invalid config key column format (too many fields): '%s'"
 msgstr ""
 
-#: lxc/image.go:1208 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
+#: lxc/image.go:1209 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
 #, c-format
 msgid "Invalid format %q"
 msgstr ""
@@ -1140,7 +1175,7 @@ msgid ""
 "Invalid name in '%s', empty string is only allowed when defining maxWidth"
 msgstr ""
 
-#: lxc/main.go:389
+#: lxc/main.go:393
 msgid "Invalid number of arguments"
 msgstr ""
 
@@ -1336,6 +1371,10 @@ msgstr ""
 msgid "List profiles"
 msgstr ""
 
+#: lxc/project.go:297 lxc/project.go:298
+msgid "List projects"
+msgstr ""
+
 #: lxc/storage_volume.go:911 lxc/storage_volume.go:912
 msgid "List storage volumes"
 msgstr ""
@@ -1454,6 +1493,10 @@ msgstr ""
 msgid "Manage profiles"
 msgstr ""
 
+#: lxc/project.go:28 lxc/project.go:29
+msgid "Manage projects"
+msgstr ""
+
 #: lxc/storage.go:32 lxc/storage.go:33
 msgid "Manage storage pools and volumes"
 msgstr ""
@@ -1500,11 +1543,11 @@ msgstr ""
 msgid "Memory usage:"
 msgstr ""
 
-#: lxc/move.go:226
+#: lxc/move.go:227
 msgid "Migration API failure"
 msgstr ""
 
-#: lxc/move.go:231
+#: lxc/move.go:232
 msgid "Migration operation failure"
 msgstr ""
 
@@ -1552,6 +1595,11 @@ msgstr ""
 msgid "Missing profile name"
 msgstr ""
 
+#: lxc/project.go:97 lxc/project.go:151 lxc/project.go:221 lxc/project.go:412
+#: lxc/project.go:467
+msgid "Missing project name"
+msgstr ""
+
 #: lxc/profile.go:270
 msgid "Missing source profile name"
 msgstr ""
@@ -1610,11 +1658,13 @@ msgid "Must supply container name for: "
 msgstr ""
 
 #: lxc/cluster.go:124 lxc/list.go:459 lxc/network.go:858 lxc/profile.go:622
-#: lxc/remote.go:465 lxc/storage.go:549 lxc/storage_volume.go:960
+#: lxc/project.go:366 lxc/remote.go:465 lxc/storage.go:549
+#: lxc/storage_volume.go:960
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:844 lxc/operation.go:141 lxc/remote.go:440 lxc/remote.go:445
+#: lxc/network.go:844 lxc/operation.go:141 lxc/project.go:342
+#: lxc/project.go:347 lxc/remote.go:440 lxc/remote.go:445
 msgid "NO"
 msgstr ""
 
@@ -1721,7 +1771,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:462
+#: lxc/list.go:462 lxc/project.go:368
 msgid "PROFILES"
 msgstr ""
 
@@ -1750,7 +1800,7 @@ msgstr ""
 msgid "Pid: %d"
 msgstr ""
 
-#: lxc/network.go:643 lxc/profile.go:500 lxc/storage.go:304
+#: lxc/network.go:643 lxc/profile.go:500 lxc/project.go:268 lxc/storage.go:304
 #: lxc/storage_volume.go:817
 msgid "Press enter to open the editor again"
 msgstr ""
@@ -1834,6 +1884,21 @@ msgstr ""
 msgid "Profiles: %s"
 msgstr ""
 
+#: lxc/project.go:110
+#, c-format
+msgid "Project %s created"
+msgstr ""
+
+#: lxc/project.go:161
+#, c-format
+msgid "Project %s deleted"
+msgstr ""
+
+#: lxc/project.go:427
+#, c-format
+msgid "Project %s renamed to %s"
+msgstr ""
+
 #: lxc/image.go:861
 msgid "Properties:"
 msgstr ""
@@ -1873,11 +1938,11 @@ msgstr ""
 msgid "Recursively transfer files"
 msgstr ""
 
-#: lxc/image.go:1223 lxc/image.go:1224
+#: lxc/image.go:1224 lxc/image.go:1225
 msgid "Refresh images"
 msgstr ""
 
-#: lxc/image.go:1252
+#: lxc/image.go:1253
 #, c-format
 msgid "Refreshing the image: %s"
 msgstr ""
@@ -1887,7 +1952,8 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656 lxc/remote.go:694
+#: lxc/project.go:523 lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656
+#: lxc/remote.go:694
 #, c-format
 msgid "Remote %s doesn't exist"
 msgstr ""
@@ -1965,6 +2031,10 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
+#: lxc/project.go:387 lxc/project.go:388
+msgid "Rename projects"
+msgstr ""
+
 #: lxc/remote.go:523 lxc/remote.go:524
 msgid "Rename remotes"
 msgstr ""
@@ -2150,11 +2220,11 @@ msgstr ""
 msgid "Show full device configuration for containers or profiles"
 msgstr ""
 
-#: lxc/image.go:1300 lxc/image.go:1301
+#: lxc/image.go:1301 lxc/image.go:1302
 msgid "Show image properties"
 msgstr ""
 
-#: lxc/main.go:215 lxc/main.go:216
+#: lxc/main.go:219 lxc/main.go:220
 msgid "Show less common commands"
 msgstr ""
 
@@ -2170,6 +2240,10 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
+#: lxc/project.go:442 lxc/project.go:443
+msgid "Show project options"
+msgstr ""
+
 #: lxc/storage.go:649 lxc/storage.go:650
 msgid "Show storage pool configurations and resources"
 msgstr ""
@@ -2317,6 +2391,10 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
+#: lxc/project.go:495 lxc/project.go:496
+msgid "Switch the current project"
+msgstr ""
+
 #: lxc/remote.go:635 lxc/remote.go:636
 msgid "Switch the default remote"
 msgstr ""
@@ -2379,7 +2457,7 @@ msgstr ""
 msgid "The profile device doesn't exist"
 msgstr ""
 
-#: lxc/move.go:218
+#: lxc/move.go:219
 msgid "The source LXD instance is not clustered"
 msgstr ""
 
@@ -2416,7 +2494,7 @@ msgstr ""
 msgid "To detach from the console, press: <ctrl>+a q"
 msgstr ""
 
-#: lxc/main.go:304
+#: lxc/main.go:308
 msgid "To start your first container, try: lxc launch ubuntu:18.04"
 msgstr ""
 
@@ -2467,7 +2545,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:862 lxc/profile.go:623 lxc/storage.go:558
+#: lxc/network.go:862 lxc/profile.go:623 lxc/project.go:369 lxc/storage.go:558
 #: lxc/storage_volume.go:962
 msgid "USED BY"
 msgstr ""
@@ -2552,7 +2630,8 @@ msgstr ""
 msgid "Whether or not to snapshot the container's running state"
 msgstr ""
 
-#: lxc/network.go:846 lxc/operation.go:143 lxc/remote.go:442 lxc/remote.go:447
+#: lxc/network.go:846 lxc/operation.go:143 lxc/project.go:344
+#: lxc/project.go:349 lxc/remote.go:442 lxc/remote.go:447
 msgid "YES"
 msgstr ""
 
@@ -2568,7 +2647,7 @@ msgstr ""
 msgid "You must specify a destination container name when using --target"
 msgstr ""
 
-#: lxc/copy.go:72 lxc/move.go:202
+#: lxc/copy.go:72 lxc/move.go:203
 msgid "You must specify a source container name"
 msgstr ""
 
@@ -2672,6 +2751,14 @@ msgstr ""
 msgid "create [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:71
+msgid "create [<remote>:]<project>"
+msgstr ""
+
+#: lxc/project.go:354
+msgid "current"
+msgstr ""
+
 #: lxc/remote.go:459
 msgid "default"
 msgstr ""
@@ -2718,6 +2805,10 @@ msgstr ""
 msgid "delete [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:124
+msgid "delete [<remote>:]<project>"
+msgstr ""
+
 #: lxc/storage.go:436
 msgid "description"
 msgstr ""
@@ -2786,6 +2877,10 @@ msgstr ""
 msgid "edit [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:175
+msgid "edit [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:86
 msgid "edit [<remote>:][<container>]"
 msgstr ""
@@ -2896,7 +2991,7 @@ msgid "list"
 msgstr ""
 
 #: lxc/cluster.go:61 lxc/config_trust.go:112 lxc/network.go:796
-#: lxc/operation.go:98 lxc/profile.go:574 lxc/storage.go:493
+#: lxc/operation.go:98 lxc/profile.go:574 lxc/project.go:295 lxc/storage.go:493
 msgid "list [<remote>:]"
 msgstr ""
 
@@ -3081,6 +3176,12 @@ msgid ""
 "    Update a profile using the content of profile.yaml"
 msgstr ""
 
+#: lxc/project.go:179
+msgid ""
+"lxc project edit <project> < project.yaml\n"
+"    Update a project using the content of project.yaml"
+msgstr ""
+
 #: lxc/query.go:32
 msgid ""
 "lxc query -X DELETE --wait /1.0/containers/c1\n"
@@ -3183,6 +3284,10 @@ msgstr ""
 msgid "profile"
 msgstr ""
 
+#: lxc/project.go:27
+msgid "project"
+msgstr ""
+
 #: lxc/publish.go:32
 msgid ""
 "publish [<remote>:]<container>[/<snapshot>] [<remote>:] [flags] "
@@ -3205,7 +3310,7 @@ msgstr ""
 msgid "query [<remote>:]<API path>"
 msgstr ""
 
-#: lxc/image.go:1222
+#: lxc/image.go:1223
 msgid "refresh [<remote>:]<image> [[<remote>:]<image>...]"
 msgstr ""
 
@@ -3269,6 +3374,10 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
+#: lxc/project.go:385
+msgid "rename [<remote>:]<project> <new-name>"
+msgstr ""
+
 #: lxc/action.go:68
 msgid "restart [<remote>:]<container> [[<remote>:]<container>...]"
 msgstr ""
@@ -3317,7 +3426,7 @@ msgstr ""
 msgid "show [<remote>:]<container|profile>"
 msgstr ""
 
-#: lxc/image.go:1299
+#: lxc/image.go:1300
 msgid "show [<remote>:]<image>"
 msgstr ""
 
@@ -3345,6 +3454,10 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:441
+msgid "show [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:450
 msgid "show [<remote>:][<container>]"
 msgstr ""
@@ -3381,6 +3494,10 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
+#: lxc/project.go:494
+msgid "switch [<remote>:] <project>"
+msgstr ""
+
 #: lxc/info.go:255
 #, c-format
 msgid "taken at %s"
diff --git a/po/nl.po b/po/nl.po
index dfa71c6e92..8b5a68235f 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: 2018-08-23 15:14-0400\n"
+"POT-Creation-Date: 2018-09-02 06:35+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -143,6 +143,23 @@ msgid ""
 "### Note that the name is shown but cannot be changed"
 msgstr ""
 
+#: lxc/project.go:189
+msgid ""
+"### This is a yaml representation of the project.\n"
+"### Any line starting with a '# will be ignored.\n"
+"###\n"
+"### A project consists of a set of features and a description.\n"
+"###\n"
+"### An example would look like:\n"
+"### name: my-project\n"
+"### features:\n"
+"###   images: True\n"
+"###   profiles: True\n"
+"### description: My own project\n"
+"###\n"
+"### Note that the name is shown but cannot be changed"
+msgstr ""
+
 #: lxc/image.go:966
 #, c-format
 msgid "%s (%d more)"
@@ -453,8 +470,8 @@ msgid "Config key/value to apply to the target container"
 msgstr ""
 
 #: lxc/config.go:195 lxc/config.go:259 lxc/config_metadata.go:144
-#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/storage.go:303
-#: lxc/storage_volume.go:816
+#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/project.go:267
+#: lxc/storage.go:303 lxc/storage_volume.go:816
 #, c-format
 msgid "Config parsing error: %s"
 msgstr ""
@@ -575,6 +592,10 @@ msgstr ""
 msgid "Create profiles"
 msgstr ""
 
+#: lxc/project.go:72 lxc/project.go:73
+msgid "Create projects"
+msgstr ""
+
 #: lxc/storage.go:88 lxc/storage.go:89
 msgid "Create storage pools"
 msgstr ""
@@ -646,6 +667,10 @@ msgstr ""
 msgid "Delete profiles"
 msgstr ""
 
+#: lxc/project.go:126 lxc/project.go:127
+msgid "Delete projects"
+msgstr ""
+
 #: lxc/storage.go:162 lxc/storage.go:163
 msgid "Delete storage pools"
 msgstr ""
@@ -672,7 +697,7 @@ msgstr ""
 #: lxc/file.go:42 lxc/file.go:75 lxc/file.go:124 lxc/file.go:187
 #: lxc/file.go:377 lxc/image.go:42 lxc/image.go:131 lxc/image.go:265
 #: lxc/image.go:316 lxc/image.go:439 lxc/image.go:579 lxc/image.go:788
-#: lxc/image.go:902 lxc/image.go:1224 lxc/image.go:1301 lxc/image_alias.go:26
+#: lxc/image.go:902 lxc/image.go:1225 lxc/image.go:1302 lxc/image_alias.go:26
 #: lxc/image_alias.go:59 lxc/image_alias.go:106 lxc/image_alias.go:149
 #: lxc/image_alias.go:250 lxc/import.go:25 lxc/info.go:29 lxc/init.go:35
 #: lxc/launch.go:22 lxc/list.go:48 lxc/main.go:48 lxc/manpage.go:19
@@ -685,7 +710,9 @@ msgstr ""
 #: lxc/profile.go:30 lxc/profile.go:102 lxc/profile.go:165 lxc/profile.go:245
 #: lxc/profile.go:301 lxc/profile.go:355 lxc/profile.go:405 lxc/profile.go:529
 #: lxc/profile.go:577 lxc/profile.go:641 lxc/profile.go:717 lxc/profile.go:767
-#: lxc/profile.go:826 lxc/profile.go:880 lxc/publish.go:34 lxc/query.go:30
+#: lxc/profile.go:826 lxc/profile.go:880 lxc/project.go:29 lxc/project.go:73
+#: lxc/project.go:127 lxc/project.go:177 lxc/project.go:298 lxc/project.go:388
+#: lxc/project.go:443 lxc/project.go:496 lxc/publish.go:34 lxc/query.go:30
 #: lxc/remote.go:37 lxc/remote.go:87 lxc/remote.go:383 lxc/remote.go:419
 #: lxc/remote.go:524 lxc/remote.go:586 lxc/remote.go:636 lxc/remote.go:674
 #: lxc/rename.go:21 lxc/restore.go:24 lxc/snapshot.go:21 lxc/storage.go:33
@@ -794,6 +821,10 @@ msgstr ""
 msgid "Edit profile configurations as YAML"
 msgstr ""
 
+#: lxc/project.go:176 lxc/project.go:177
+msgid "Edit project configurations as YAML"
+msgstr ""
+
 #: lxc/storage.go:212 lxc/storage.go:213
 msgid "Edit storage pool configurations as YAML"
 msgstr ""
@@ -908,7 +939,7 @@ msgstr ""
 msgid "FINGERPRINT"
 msgstr ""
 
-#: lxc/move.go:213
+#: lxc/move.go:214
 msgid "Failed to connect to cluster member"
 msgstr ""
 
@@ -1012,6 +1043,10 @@ msgstr ""
 msgid "ID"
 msgstr ""
 
+#: lxc/project.go:367
+msgid "IMAGES"
+msgstr ""
+
 #: lxc/network.go:964
 msgid "IP ADDRESS"
 msgstr ""
@@ -1028,7 +1063,7 @@ msgstr ""
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:301
+#: lxc/main.go:305
 msgid ""
 "If this is your first time running LXD on this machine, you should also run: "
 "lxd init"
@@ -1038,7 +1073,7 @@ msgstr ""
 msgid "Ignore the container state"
 msgstr ""
 
-#: lxc/image.go:1284
+#: lxc/image.go:1285
 msgid "Image already up to date."
 msgstr ""
 
@@ -1050,7 +1085,7 @@ msgstr ""
 msgid "Image exported successfully!"
 msgstr ""
 
-#: lxc/image.go:288 lxc/image.go:1247
+#: lxc/image.go:288 lxc/image.go:1248
 msgid "Image identifier missing"
 msgstr ""
 
@@ -1064,7 +1099,7 @@ msgstr ""
 msgid "Image imported with fingerprint: %s"
 msgstr ""
 
-#: lxc/image.go:1282
+#: lxc/image.go:1283
 msgid "Image refreshed successfully!"
 msgstr ""
 
@@ -1119,7 +1154,7 @@ msgstr ""
 msgid "Invalid config key column format (too many fields): '%s'"
 msgstr ""
 
-#: lxc/image.go:1208 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
+#: lxc/image.go:1209 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
 #, c-format
 msgid "Invalid format %q"
 msgstr ""
@@ -1140,7 +1175,7 @@ msgid ""
 "Invalid name in '%s', empty string is only allowed when defining maxWidth"
 msgstr ""
 
-#: lxc/main.go:389
+#: lxc/main.go:393
 msgid "Invalid number of arguments"
 msgstr ""
 
@@ -1336,6 +1371,10 @@ msgstr ""
 msgid "List profiles"
 msgstr ""
 
+#: lxc/project.go:297 lxc/project.go:298
+msgid "List projects"
+msgstr ""
+
 #: lxc/storage_volume.go:911 lxc/storage_volume.go:912
 msgid "List storage volumes"
 msgstr ""
@@ -1454,6 +1493,10 @@ msgstr ""
 msgid "Manage profiles"
 msgstr ""
 
+#: lxc/project.go:28 lxc/project.go:29
+msgid "Manage projects"
+msgstr ""
+
 #: lxc/storage.go:32 lxc/storage.go:33
 msgid "Manage storage pools and volumes"
 msgstr ""
@@ -1500,11 +1543,11 @@ msgstr ""
 msgid "Memory usage:"
 msgstr ""
 
-#: lxc/move.go:226
+#: lxc/move.go:227
 msgid "Migration API failure"
 msgstr ""
 
-#: lxc/move.go:231
+#: lxc/move.go:232
 msgid "Migration operation failure"
 msgstr ""
 
@@ -1552,6 +1595,11 @@ msgstr ""
 msgid "Missing profile name"
 msgstr ""
 
+#: lxc/project.go:97 lxc/project.go:151 lxc/project.go:221 lxc/project.go:412
+#: lxc/project.go:467
+msgid "Missing project name"
+msgstr ""
+
 #: lxc/profile.go:270
 msgid "Missing source profile name"
 msgstr ""
@@ -1610,11 +1658,13 @@ msgid "Must supply container name for: "
 msgstr ""
 
 #: lxc/cluster.go:124 lxc/list.go:459 lxc/network.go:858 lxc/profile.go:622
-#: lxc/remote.go:465 lxc/storage.go:549 lxc/storage_volume.go:960
+#: lxc/project.go:366 lxc/remote.go:465 lxc/storage.go:549
+#: lxc/storage_volume.go:960
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:844 lxc/operation.go:141 lxc/remote.go:440 lxc/remote.go:445
+#: lxc/network.go:844 lxc/operation.go:141 lxc/project.go:342
+#: lxc/project.go:347 lxc/remote.go:440 lxc/remote.go:445
 msgid "NO"
 msgstr ""
 
@@ -1721,7 +1771,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:462
+#: lxc/list.go:462 lxc/project.go:368
 msgid "PROFILES"
 msgstr ""
 
@@ -1750,7 +1800,7 @@ msgstr ""
 msgid "Pid: %d"
 msgstr ""
 
-#: lxc/network.go:643 lxc/profile.go:500 lxc/storage.go:304
+#: lxc/network.go:643 lxc/profile.go:500 lxc/project.go:268 lxc/storage.go:304
 #: lxc/storage_volume.go:817
 msgid "Press enter to open the editor again"
 msgstr ""
@@ -1834,6 +1884,21 @@ msgstr ""
 msgid "Profiles: %s"
 msgstr ""
 
+#: lxc/project.go:110
+#, c-format
+msgid "Project %s created"
+msgstr ""
+
+#: lxc/project.go:161
+#, c-format
+msgid "Project %s deleted"
+msgstr ""
+
+#: lxc/project.go:427
+#, c-format
+msgid "Project %s renamed to %s"
+msgstr ""
+
 #: lxc/image.go:861
 msgid "Properties:"
 msgstr ""
@@ -1873,11 +1938,11 @@ msgstr ""
 msgid "Recursively transfer files"
 msgstr ""
 
-#: lxc/image.go:1223 lxc/image.go:1224
+#: lxc/image.go:1224 lxc/image.go:1225
 msgid "Refresh images"
 msgstr ""
 
-#: lxc/image.go:1252
+#: lxc/image.go:1253
 #, c-format
 msgid "Refreshing the image: %s"
 msgstr ""
@@ -1887,7 +1952,8 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656 lxc/remote.go:694
+#: lxc/project.go:523 lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656
+#: lxc/remote.go:694
 #, c-format
 msgid "Remote %s doesn't exist"
 msgstr ""
@@ -1965,6 +2031,10 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
+#: lxc/project.go:387 lxc/project.go:388
+msgid "Rename projects"
+msgstr ""
+
 #: lxc/remote.go:523 lxc/remote.go:524
 msgid "Rename remotes"
 msgstr ""
@@ -2150,11 +2220,11 @@ msgstr ""
 msgid "Show full device configuration for containers or profiles"
 msgstr ""
 
-#: lxc/image.go:1300 lxc/image.go:1301
+#: lxc/image.go:1301 lxc/image.go:1302
 msgid "Show image properties"
 msgstr ""
 
-#: lxc/main.go:215 lxc/main.go:216
+#: lxc/main.go:219 lxc/main.go:220
 msgid "Show less common commands"
 msgstr ""
 
@@ -2170,6 +2240,10 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
+#: lxc/project.go:442 lxc/project.go:443
+msgid "Show project options"
+msgstr ""
+
 #: lxc/storage.go:649 lxc/storage.go:650
 msgid "Show storage pool configurations and resources"
 msgstr ""
@@ -2317,6 +2391,10 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
+#: lxc/project.go:495 lxc/project.go:496
+msgid "Switch the current project"
+msgstr ""
+
 #: lxc/remote.go:635 lxc/remote.go:636
 msgid "Switch the default remote"
 msgstr ""
@@ -2379,7 +2457,7 @@ msgstr ""
 msgid "The profile device doesn't exist"
 msgstr ""
 
-#: lxc/move.go:218
+#: lxc/move.go:219
 msgid "The source LXD instance is not clustered"
 msgstr ""
 
@@ -2416,7 +2494,7 @@ msgstr ""
 msgid "To detach from the console, press: <ctrl>+a q"
 msgstr ""
 
-#: lxc/main.go:304
+#: lxc/main.go:308
 msgid "To start your first container, try: lxc launch ubuntu:18.04"
 msgstr ""
 
@@ -2467,7 +2545,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:862 lxc/profile.go:623 lxc/storage.go:558
+#: lxc/network.go:862 lxc/profile.go:623 lxc/project.go:369 lxc/storage.go:558
 #: lxc/storage_volume.go:962
 msgid "USED BY"
 msgstr ""
@@ -2552,7 +2630,8 @@ msgstr ""
 msgid "Whether or not to snapshot the container's running state"
 msgstr ""
 
-#: lxc/network.go:846 lxc/operation.go:143 lxc/remote.go:442 lxc/remote.go:447
+#: lxc/network.go:846 lxc/operation.go:143 lxc/project.go:344
+#: lxc/project.go:349 lxc/remote.go:442 lxc/remote.go:447
 msgid "YES"
 msgstr ""
 
@@ -2568,7 +2647,7 @@ msgstr ""
 msgid "You must specify a destination container name when using --target"
 msgstr ""
 
-#: lxc/copy.go:72 lxc/move.go:202
+#: lxc/copy.go:72 lxc/move.go:203
 msgid "You must specify a source container name"
 msgstr ""
 
@@ -2672,6 +2751,14 @@ msgstr ""
 msgid "create [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:71
+msgid "create [<remote>:]<project>"
+msgstr ""
+
+#: lxc/project.go:354
+msgid "current"
+msgstr ""
+
 #: lxc/remote.go:459
 msgid "default"
 msgstr ""
@@ -2718,6 +2805,10 @@ msgstr ""
 msgid "delete [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:124
+msgid "delete [<remote>:]<project>"
+msgstr ""
+
 #: lxc/storage.go:436
 msgid "description"
 msgstr ""
@@ -2786,6 +2877,10 @@ msgstr ""
 msgid "edit [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:175
+msgid "edit [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:86
 msgid "edit [<remote>:][<container>]"
 msgstr ""
@@ -2896,7 +2991,7 @@ msgid "list"
 msgstr ""
 
 #: lxc/cluster.go:61 lxc/config_trust.go:112 lxc/network.go:796
-#: lxc/operation.go:98 lxc/profile.go:574 lxc/storage.go:493
+#: lxc/operation.go:98 lxc/profile.go:574 lxc/project.go:295 lxc/storage.go:493
 msgid "list [<remote>:]"
 msgstr ""
 
@@ -3081,6 +3176,12 @@ msgid ""
 "    Update a profile using the content of profile.yaml"
 msgstr ""
 
+#: lxc/project.go:179
+msgid ""
+"lxc project edit <project> < project.yaml\n"
+"    Update a project using the content of project.yaml"
+msgstr ""
+
 #: lxc/query.go:32
 msgid ""
 "lxc query -X DELETE --wait /1.0/containers/c1\n"
@@ -3183,6 +3284,10 @@ msgstr ""
 msgid "profile"
 msgstr ""
 
+#: lxc/project.go:27
+msgid "project"
+msgstr ""
+
 #: lxc/publish.go:32
 msgid ""
 "publish [<remote>:]<container>[/<snapshot>] [<remote>:] [flags] "
@@ -3205,7 +3310,7 @@ msgstr ""
 msgid "query [<remote>:]<API path>"
 msgstr ""
 
-#: lxc/image.go:1222
+#: lxc/image.go:1223
 msgid "refresh [<remote>:]<image> [[<remote>:]<image>...]"
 msgstr ""
 
@@ -3269,6 +3374,10 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
+#: lxc/project.go:385
+msgid "rename [<remote>:]<project> <new-name>"
+msgstr ""
+
 #: lxc/action.go:68
 msgid "restart [<remote>:]<container> [[<remote>:]<container>...]"
 msgstr ""
@@ -3317,7 +3426,7 @@ msgstr ""
 msgid "show [<remote>:]<container|profile>"
 msgstr ""
 
-#: lxc/image.go:1299
+#: lxc/image.go:1300
 msgid "show [<remote>:]<image>"
 msgstr ""
 
@@ -3345,6 +3454,10 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:441
+msgid "show [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:450
 msgid "show [<remote>:][<container>]"
 msgstr ""
@@ -3381,6 +3494,10 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
+#: lxc/project.go:494
+msgid "switch [<remote>:] <project>"
+msgstr ""
+
 #: lxc/info.go:255
 #, c-format
 msgid "taken at %s"
diff --git a/po/pa.po b/po/pa.po
index 317fc27ba1..fa1db1039e 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: 2018-08-23 15:14-0400\n"
+"POT-Creation-Date: 2018-09-02 06:35+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -143,6 +143,23 @@ msgid ""
 "### Note that the name is shown but cannot be changed"
 msgstr ""
 
+#: lxc/project.go:189
+msgid ""
+"### This is a yaml representation of the project.\n"
+"### Any line starting with a '# will be ignored.\n"
+"###\n"
+"### A project consists of a set of features and a description.\n"
+"###\n"
+"### An example would look like:\n"
+"### name: my-project\n"
+"### features:\n"
+"###   images: True\n"
+"###   profiles: True\n"
+"### description: My own project\n"
+"###\n"
+"### Note that the name is shown but cannot be changed"
+msgstr ""
+
 #: lxc/image.go:966
 #, c-format
 msgid "%s (%d more)"
@@ -453,8 +470,8 @@ msgid "Config key/value to apply to the target container"
 msgstr ""
 
 #: lxc/config.go:195 lxc/config.go:259 lxc/config_metadata.go:144
-#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/storage.go:303
-#: lxc/storage_volume.go:816
+#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/project.go:267
+#: lxc/storage.go:303 lxc/storage_volume.go:816
 #, c-format
 msgid "Config parsing error: %s"
 msgstr ""
@@ -575,6 +592,10 @@ msgstr ""
 msgid "Create profiles"
 msgstr ""
 
+#: lxc/project.go:72 lxc/project.go:73
+msgid "Create projects"
+msgstr ""
+
 #: lxc/storage.go:88 lxc/storage.go:89
 msgid "Create storage pools"
 msgstr ""
@@ -646,6 +667,10 @@ msgstr ""
 msgid "Delete profiles"
 msgstr ""
 
+#: lxc/project.go:126 lxc/project.go:127
+msgid "Delete projects"
+msgstr ""
+
 #: lxc/storage.go:162 lxc/storage.go:163
 msgid "Delete storage pools"
 msgstr ""
@@ -672,7 +697,7 @@ msgstr ""
 #: lxc/file.go:42 lxc/file.go:75 lxc/file.go:124 lxc/file.go:187
 #: lxc/file.go:377 lxc/image.go:42 lxc/image.go:131 lxc/image.go:265
 #: lxc/image.go:316 lxc/image.go:439 lxc/image.go:579 lxc/image.go:788
-#: lxc/image.go:902 lxc/image.go:1224 lxc/image.go:1301 lxc/image_alias.go:26
+#: lxc/image.go:902 lxc/image.go:1225 lxc/image.go:1302 lxc/image_alias.go:26
 #: lxc/image_alias.go:59 lxc/image_alias.go:106 lxc/image_alias.go:149
 #: lxc/image_alias.go:250 lxc/import.go:25 lxc/info.go:29 lxc/init.go:35
 #: lxc/launch.go:22 lxc/list.go:48 lxc/main.go:48 lxc/manpage.go:19
@@ -685,7 +710,9 @@ msgstr ""
 #: lxc/profile.go:30 lxc/profile.go:102 lxc/profile.go:165 lxc/profile.go:245
 #: lxc/profile.go:301 lxc/profile.go:355 lxc/profile.go:405 lxc/profile.go:529
 #: lxc/profile.go:577 lxc/profile.go:641 lxc/profile.go:717 lxc/profile.go:767
-#: lxc/profile.go:826 lxc/profile.go:880 lxc/publish.go:34 lxc/query.go:30
+#: lxc/profile.go:826 lxc/profile.go:880 lxc/project.go:29 lxc/project.go:73
+#: lxc/project.go:127 lxc/project.go:177 lxc/project.go:298 lxc/project.go:388
+#: lxc/project.go:443 lxc/project.go:496 lxc/publish.go:34 lxc/query.go:30
 #: lxc/remote.go:37 lxc/remote.go:87 lxc/remote.go:383 lxc/remote.go:419
 #: lxc/remote.go:524 lxc/remote.go:586 lxc/remote.go:636 lxc/remote.go:674
 #: lxc/rename.go:21 lxc/restore.go:24 lxc/snapshot.go:21 lxc/storage.go:33
@@ -794,6 +821,10 @@ msgstr ""
 msgid "Edit profile configurations as YAML"
 msgstr ""
 
+#: lxc/project.go:176 lxc/project.go:177
+msgid "Edit project configurations as YAML"
+msgstr ""
+
 #: lxc/storage.go:212 lxc/storage.go:213
 msgid "Edit storage pool configurations as YAML"
 msgstr ""
@@ -908,7 +939,7 @@ msgstr ""
 msgid "FINGERPRINT"
 msgstr ""
 
-#: lxc/move.go:213
+#: lxc/move.go:214
 msgid "Failed to connect to cluster member"
 msgstr ""
 
@@ -1012,6 +1043,10 @@ msgstr ""
 msgid "ID"
 msgstr ""
 
+#: lxc/project.go:367
+msgid "IMAGES"
+msgstr ""
+
 #: lxc/network.go:964
 msgid "IP ADDRESS"
 msgstr ""
@@ -1028,7 +1063,7 @@ msgstr ""
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:301
+#: lxc/main.go:305
 msgid ""
 "If this is your first time running LXD on this machine, you should also run: "
 "lxd init"
@@ -1038,7 +1073,7 @@ msgstr ""
 msgid "Ignore the container state"
 msgstr ""
 
-#: lxc/image.go:1284
+#: lxc/image.go:1285
 msgid "Image already up to date."
 msgstr ""
 
@@ -1050,7 +1085,7 @@ msgstr ""
 msgid "Image exported successfully!"
 msgstr ""
 
-#: lxc/image.go:288 lxc/image.go:1247
+#: lxc/image.go:288 lxc/image.go:1248
 msgid "Image identifier missing"
 msgstr ""
 
@@ -1064,7 +1099,7 @@ msgstr ""
 msgid "Image imported with fingerprint: %s"
 msgstr ""
 
-#: lxc/image.go:1282
+#: lxc/image.go:1283
 msgid "Image refreshed successfully!"
 msgstr ""
 
@@ -1119,7 +1154,7 @@ msgstr ""
 msgid "Invalid config key column format (too many fields): '%s'"
 msgstr ""
 
-#: lxc/image.go:1208 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
+#: lxc/image.go:1209 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
 #, c-format
 msgid "Invalid format %q"
 msgstr ""
@@ -1140,7 +1175,7 @@ msgid ""
 "Invalid name in '%s', empty string is only allowed when defining maxWidth"
 msgstr ""
 
-#: lxc/main.go:389
+#: lxc/main.go:393
 msgid "Invalid number of arguments"
 msgstr ""
 
@@ -1336,6 +1371,10 @@ msgstr ""
 msgid "List profiles"
 msgstr ""
 
+#: lxc/project.go:297 lxc/project.go:298
+msgid "List projects"
+msgstr ""
+
 #: lxc/storage_volume.go:911 lxc/storage_volume.go:912
 msgid "List storage volumes"
 msgstr ""
@@ -1454,6 +1493,10 @@ msgstr ""
 msgid "Manage profiles"
 msgstr ""
 
+#: lxc/project.go:28 lxc/project.go:29
+msgid "Manage projects"
+msgstr ""
+
 #: lxc/storage.go:32 lxc/storage.go:33
 msgid "Manage storage pools and volumes"
 msgstr ""
@@ -1500,11 +1543,11 @@ msgstr ""
 msgid "Memory usage:"
 msgstr ""
 
-#: lxc/move.go:226
+#: lxc/move.go:227
 msgid "Migration API failure"
 msgstr ""
 
-#: lxc/move.go:231
+#: lxc/move.go:232
 msgid "Migration operation failure"
 msgstr ""
 
@@ -1552,6 +1595,11 @@ msgstr ""
 msgid "Missing profile name"
 msgstr ""
 
+#: lxc/project.go:97 lxc/project.go:151 lxc/project.go:221 lxc/project.go:412
+#: lxc/project.go:467
+msgid "Missing project name"
+msgstr ""
+
 #: lxc/profile.go:270
 msgid "Missing source profile name"
 msgstr ""
@@ -1610,11 +1658,13 @@ msgid "Must supply container name for: "
 msgstr ""
 
 #: lxc/cluster.go:124 lxc/list.go:459 lxc/network.go:858 lxc/profile.go:622
-#: lxc/remote.go:465 lxc/storage.go:549 lxc/storage_volume.go:960
+#: lxc/project.go:366 lxc/remote.go:465 lxc/storage.go:549
+#: lxc/storage_volume.go:960
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:844 lxc/operation.go:141 lxc/remote.go:440 lxc/remote.go:445
+#: lxc/network.go:844 lxc/operation.go:141 lxc/project.go:342
+#: lxc/project.go:347 lxc/remote.go:440 lxc/remote.go:445
 msgid "NO"
 msgstr ""
 
@@ -1721,7 +1771,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:462
+#: lxc/list.go:462 lxc/project.go:368
 msgid "PROFILES"
 msgstr ""
 
@@ -1750,7 +1800,7 @@ msgstr ""
 msgid "Pid: %d"
 msgstr ""
 
-#: lxc/network.go:643 lxc/profile.go:500 lxc/storage.go:304
+#: lxc/network.go:643 lxc/profile.go:500 lxc/project.go:268 lxc/storage.go:304
 #: lxc/storage_volume.go:817
 msgid "Press enter to open the editor again"
 msgstr ""
@@ -1834,6 +1884,21 @@ msgstr ""
 msgid "Profiles: %s"
 msgstr ""
 
+#: lxc/project.go:110
+#, c-format
+msgid "Project %s created"
+msgstr ""
+
+#: lxc/project.go:161
+#, c-format
+msgid "Project %s deleted"
+msgstr ""
+
+#: lxc/project.go:427
+#, c-format
+msgid "Project %s renamed to %s"
+msgstr ""
+
 #: lxc/image.go:861
 msgid "Properties:"
 msgstr ""
@@ -1873,11 +1938,11 @@ msgstr ""
 msgid "Recursively transfer files"
 msgstr ""
 
-#: lxc/image.go:1223 lxc/image.go:1224
+#: lxc/image.go:1224 lxc/image.go:1225
 msgid "Refresh images"
 msgstr ""
 
-#: lxc/image.go:1252
+#: lxc/image.go:1253
 #, c-format
 msgid "Refreshing the image: %s"
 msgstr ""
@@ -1887,7 +1952,8 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656 lxc/remote.go:694
+#: lxc/project.go:523 lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656
+#: lxc/remote.go:694
 #, c-format
 msgid "Remote %s doesn't exist"
 msgstr ""
@@ -1965,6 +2031,10 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
+#: lxc/project.go:387 lxc/project.go:388
+msgid "Rename projects"
+msgstr ""
+
 #: lxc/remote.go:523 lxc/remote.go:524
 msgid "Rename remotes"
 msgstr ""
@@ -2150,11 +2220,11 @@ msgstr ""
 msgid "Show full device configuration for containers or profiles"
 msgstr ""
 
-#: lxc/image.go:1300 lxc/image.go:1301
+#: lxc/image.go:1301 lxc/image.go:1302
 msgid "Show image properties"
 msgstr ""
 
-#: lxc/main.go:215 lxc/main.go:216
+#: lxc/main.go:219 lxc/main.go:220
 msgid "Show less common commands"
 msgstr ""
 
@@ -2170,6 +2240,10 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
+#: lxc/project.go:442 lxc/project.go:443
+msgid "Show project options"
+msgstr ""
+
 #: lxc/storage.go:649 lxc/storage.go:650
 msgid "Show storage pool configurations and resources"
 msgstr ""
@@ -2317,6 +2391,10 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
+#: lxc/project.go:495 lxc/project.go:496
+msgid "Switch the current project"
+msgstr ""
+
 #: lxc/remote.go:635 lxc/remote.go:636
 msgid "Switch the default remote"
 msgstr ""
@@ -2379,7 +2457,7 @@ msgstr ""
 msgid "The profile device doesn't exist"
 msgstr ""
 
-#: lxc/move.go:218
+#: lxc/move.go:219
 msgid "The source LXD instance is not clustered"
 msgstr ""
 
@@ -2416,7 +2494,7 @@ msgstr ""
 msgid "To detach from the console, press: <ctrl>+a q"
 msgstr ""
 
-#: lxc/main.go:304
+#: lxc/main.go:308
 msgid "To start your first container, try: lxc launch ubuntu:18.04"
 msgstr ""
 
@@ -2467,7 +2545,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:862 lxc/profile.go:623 lxc/storage.go:558
+#: lxc/network.go:862 lxc/profile.go:623 lxc/project.go:369 lxc/storage.go:558
 #: lxc/storage_volume.go:962
 msgid "USED BY"
 msgstr ""
@@ -2552,7 +2630,8 @@ msgstr ""
 msgid "Whether or not to snapshot the container's running state"
 msgstr ""
 
-#: lxc/network.go:846 lxc/operation.go:143 lxc/remote.go:442 lxc/remote.go:447
+#: lxc/network.go:846 lxc/operation.go:143 lxc/project.go:344
+#: lxc/project.go:349 lxc/remote.go:442 lxc/remote.go:447
 msgid "YES"
 msgstr ""
 
@@ -2568,7 +2647,7 @@ msgstr ""
 msgid "You must specify a destination container name when using --target"
 msgstr ""
 
-#: lxc/copy.go:72 lxc/move.go:202
+#: lxc/copy.go:72 lxc/move.go:203
 msgid "You must specify a source container name"
 msgstr ""
 
@@ -2672,6 +2751,14 @@ msgstr ""
 msgid "create [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:71
+msgid "create [<remote>:]<project>"
+msgstr ""
+
+#: lxc/project.go:354
+msgid "current"
+msgstr ""
+
 #: lxc/remote.go:459
 msgid "default"
 msgstr ""
@@ -2718,6 +2805,10 @@ msgstr ""
 msgid "delete [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:124
+msgid "delete [<remote>:]<project>"
+msgstr ""
+
 #: lxc/storage.go:436
 msgid "description"
 msgstr ""
@@ -2786,6 +2877,10 @@ msgstr ""
 msgid "edit [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:175
+msgid "edit [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:86
 msgid "edit [<remote>:][<container>]"
 msgstr ""
@@ -2896,7 +2991,7 @@ msgid "list"
 msgstr ""
 
 #: lxc/cluster.go:61 lxc/config_trust.go:112 lxc/network.go:796
-#: lxc/operation.go:98 lxc/profile.go:574 lxc/storage.go:493
+#: lxc/operation.go:98 lxc/profile.go:574 lxc/project.go:295 lxc/storage.go:493
 msgid "list [<remote>:]"
 msgstr ""
 
@@ -3081,6 +3176,12 @@ msgid ""
 "    Update a profile using the content of profile.yaml"
 msgstr ""
 
+#: lxc/project.go:179
+msgid ""
+"lxc project edit <project> < project.yaml\n"
+"    Update a project using the content of project.yaml"
+msgstr ""
+
 #: lxc/query.go:32
 msgid ""
 "lxc query -X DELETE --wait /1.0/containers/c1\n"
@@ -3183,6 +3284,10 @@ msgstr ""
 msgid "profile"
 msgstr ""
 
+#: lxc/project.go:27
+msgid "project"
+msgstr ""
+
 #: lxc/publish.go:32
 msgid ""
 "publish [<remote>:]<container>[/<snapshot>] [<remote>:] [flags] "
@@ -3205,7 +3310,7 @@ msgstr ""
 msgid "query [<remote>:]<API path>"
 msgstr ""
 
-#: lxc/image.go:1222
+#: lxc/image.go:1223
 msgid "refresh [<remote>:]<image> [[<remote>:]<image>...]"
 msgstr ""
 
@@ -3269,6 +3374,10 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
+#: lxc/project.go:385
+msgid "rename [<remote>:]<project> <new-name>"
+msgstr ""
+
 #: lxc/action.go:68
 msgid "restart [<remote>:]<container> [[<remote>:]<container>...]"
 msgstr ""
@@ -3317,7 +3426,7 @@ msgstr ""
 msgid "show [<remote>:]<container|profile>"
 msgstr ""
 
-#: lxc/image.go:1299
+#: lxc/image.go:1300
 msgid "show [<remote>:]<image>"
 msgstr ""
 
@@ -3345,6 +3454,10 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:441
+msgid "show [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:450
 msgid "show [<remote>:][<container>]"
 msgstr ""
@@ -3381,6 +3494,10 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
+#: lxc/project.go:494
+msgid "switch [<remote>:] <project>"
+msgstr ""
+
 #: lxc/info.go:255
 #, c-format
 msgid "taken at %s"
diff --git a/po/pl.po b/po/pl.po
index 349a911736..4a40a72ff4 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: 2018-08-23 15:14-0400\n"
+"POT-Creation-Date: 2018-09-02 06:35+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -143,6 +143,23 @@ msgid ""
 "### Note that the name is shown but cannot be changed"
 msgstr ""
 
+#: lxc/project.go:189
+msgid ""
+"### This is a yaml representation of the project.\n"
+"### Any line starting with a '# will be ignored.\n"
+"###\n"
+"### A project consists of a set of features and a description.\n"
+"###\n"
+"### An example would look like:\n"
+"### name: my-project\n"
+"### features:\n"
+"###   images: True\n"
+"###   profiles: True\n"
+"### description: My own project\n"
+"###\n"
+"### Note that the name is shown but cannot be changed"
+msgstr ""
+
 #: lxc/image.go:966
 #, c-format
 msgid "%s (%d more)"
@@ -453,8 +470,8 @@ msgid "Config key/value to apply to the target container"
 msgstr ""
 
 #: lxc/config.go:195 lxc/config.go:259 lxc/config_metadata.go:144
-#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/storage.go:303
-#: lxc/storage_volume.go:816
+#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/project.go:267
+#: lxc/storage.go:303 lxc/storage_volume.go:816
 #, c-format
 msgid "Config parsing error: %s"
 msgstr ""
@@ -575,6 +592,10 @@ msgstr ""
 msgid "Create profiles"
 msgstr ""
 
+#: lxc/project.go:72 lxc/project.go:73
+msgid "Create projects"
+msgstr ""
+
 #: lxc/storage.go:88 lxc/storage.go:89
 msgid "Create storage pools"
 msgstr ""
@@ -646,6 +667,10 @@ msgstr ""
 msgid "Delete profiles"
 msgstr ""
 
+#: lxc/project.go:126 lxc/project.go:127
+msgid "Delete projects"
+msgstr ""
+
 #: lxc/storage.go:162 lxc/storage.go:163
 msgid "Delete storage pools"
 msgstr ""
@@ -672,7 +697,7 @@ msgstr ""
 #: lxc/file.go:42 lxc/file.go:75 lxc/file.go:124 lxc/file.go:187
 #: lxc/file.go:377 lxc/image.go:42 lxc/image.go:131 lxc/image.go:265
 #: lxc/image.go:316 lxc/image.go:439 lxc/image.go:579 lxc/image.go:788
-#: lxc/image.go:902 lxc/image.go:1224 lxc/image.go:1301 lxc/image_alias.go:26
+#: lxc/image.go:902 lxc/image.go:1225 lxc/image.go:1302 lxc/image_alias.go:26
 #: lxc/image_alias.go:59 lxc/image_alias.go:106 lxc/image_alias.go:149
 #: lxc/image_alias.go:250 lxc/import.go:25 lxc/info.go:29 lxc/init.go:35
 #: lxc/launch.go:22 lxc/list.go:48 lxc/main.go:48 lxc/manpage.go:19
@@ -685,7 +710,9 @@ msgstr ""
 #: lxc/profile.go:30 lxc/profile.go:102 lxc/profile.go:165 lxc/profile.go:245
 #: lxc/profile.go:301 lxc/profile.go:355 lxc/profile.go:405 lxc/profile.go:529
 #: lxc/profile.go:577 lxc/profile.go:641 lxc/profile.go:717 lxc/profile.go:767
-#: lxc/profile.go:826 lxc/profile.go:880 lxc/publish.go:34 lxc/query.go:30
+#: lxc/profile.go:826 lxc/profile.go:880 lxc/project.go:29 lxc/project.go:73
+#: lxc/project.go:127 lxc/project.go:177 lxc/project.go:298 lxc/project.go:388
+#: lxc/project.go:443 lxc/project.go:496 lxc/publish.go:34 lxc/query.go:30
 #: lxc/remote.go:37 lxc/remote.go:87 lxc/remote.go:383 lxc/remote.go:419
 #: lxc/remote.go:524 lxc/remote.go:586 lxc/remote.go:636 lxc/remote.go:674
 #: lxc/rename.go:21 lxc/restore.go:24 lxc/snapshot.go:21 lxc/storage.go:33
@@ -794,6 +821,10 @@ msgstr ""
 msgid "Edit profile configurations as YAML"
 msgstr ""
 
+#: lxc/project.go:176 lxc/project.go:177
+msgid "Edit project configurations as YAML"
+msgstr ""
+
 #: lxc/storage.go:212 lxc/storage.go:213
 msgid "Edit storage pool configurations as YAML"
 msgstr ""
@@ -908,7 +939,7 @@ msgstr ""
 msgid "FINGERPRINT"
 msgstr ""
 
-#: lxc/move.go:213
+#: lxc/move.go:214
 msgid "Failed to connect to cluster member"
 msgstr ""
 
@@ -1012,6 +1043,10 @@ msgstr ""
 msgid "ID"
 msgstr ""
 
+#: lxc/project.go:367
+msgid "IMAGES"
+msgstr ""
+
 #: lxc/network.go:964
 msgid "IP ADDRESS"
 msgstr ""
@@ -1028,7 +1063,7 @@ msgstr ""
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:301
+#: lxc/main.go:305
 msgid ""
 "If this is your first time running LXD on this machine, you should also run: "
 "lxd init"
@@ -1038,7 +1073,7 @@ msgstr ""
 msgid "Ignore the container state"
 msgstr ""
 
-#: lxc/image.go:1284
+#: lxc/image.go:1285
 msgid "Image already up to date."
 msgstr ""
 
@@ -1050,7 +1085,7 @@ msgstr ""
 msgid "Image exported successfully!"
 msgstr ""
 
-#: lxc/image.go:288 lxc/image.go:1247
+#: lxc/image.go:288 lxc/image.go:1248
 msgid "Image identifier missing"
 msgstr ""
 
@@ -1064,7 +1099,7 @@ msgstr ""
 msgid "Image imported with fingerprint: %s"
 msgstr ""
 
-#: lxc/image.go:1282
+#: lxc/image.go:1283
 msgid "Image refreshed successfully!"
 msgstr ""
 
@@ -1119,7 +1154,7 @@ msgstr ""
 msgid "Invalid config key column format (too many fields): '%s'"
 msgstr ""
 
-#: lxc/image.go:1208 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
+#: lxc/image.go:1209 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
 #, c-format
 msgid "Invalid format %q"
 msgstr ""
@@ -1140,7 +1175,7 @@ msgid ""
 "Invalid name in '%s', empty string is only allowed when defining maxWidth"
 msgstr ""
 
-#: lxc/main.go:389
+#: lxc/main.go:393
 msgid "Invalid number of arguments"
 msgstr ""
 
@@ -1336,6 +1371,10 @@ msgstr ""
 msgid "List profiles"
 msgstr ""
 
+#: lxc/project.go:297 lxc/project.go:298
+msgid "List projects"
+msgstr ""
+
 #: lxc/storage_volume.go:911 lxc/storage_volume.go:912
 msgid "List storage volumes"
 msgstr ""
@@ -1454,6 +1493,10 @@ msgstr ""
 msgid "Manage profiles"
 msgstr ""
 
+#: lxc/project.go:28 lxc/project.go:29
+msgid "Manage projects"
+msgstr ""
+
 #: lxc/storage.go:32 lxc/storage.go:33
 msgid "Manage storage pools and volumes"
 msgstr ""
@@ -1500,11 +1543,11 @@ msgstr ""
 msgid "Memory usage:"
 msgstr ""
 
-#: lxc/move.go:226
+#: lxc/move.go:227
 msgid "Migration API failure"
 msgstr ""
 
-#: lxc/move.go:231
+#: lxc/move.go:232
 msgid "Migration operation failure"
 msgstr ""
 
@@ -1552,6 +1595,11 @@ msgstr ""
 msgid "Missing profile name"
 msgstr ""
 
+#: lxc/project.go:97 lxc/project.go:151 lxc/project.go:221 lxc/project.go:412
+#: lxc/project.go:467
+msgid "Missing project name"
+msgstr ""
+
 #: lxc/profile.go:270
 msgid "Missing source profile name"
 msgstr ""
@@ -1610,11 +1658,13 @@ msgid "Must supply container name for: "
 msgstr ""
 
 #: lxc/cluster.go:124 lxc/list.go:459 lxc/network.go:858 lxc/profile.go:622
-#: lxc/remote.go:465 lxc/storage.go:549 lxc/storage_volume.go:960
+#: lxc/project.go:366 lxc/remote.go:465 lxc/storage.go:549
+#: lxc/storage_volume.go:960
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:844 lxc/operation.go:141 lxc/remote.go:440 lxc/remote.go:445
+#: lxc/network.go:844 lxc/operation.go:141 lxc/project.go:342
+#: lxc/project.go:347 lxc/remote.go:440 lxc/remote.go:445
 msgid "NO"
 msgstr ""
 
@@ -1721,7 +1771,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:462
+#: lxc/list.go:462 lxc/project.go:368
 msgid "PROFILES"
 msgstr ""
 
@@ -1750,7 +1800,7 @@ msgstr ""
 msgid "Pid: %d"
 msgstr ""
 
-#: lxc/network.go:643 lxc/profile.go:500 lxc/storage.go:304
+#: lxc/network.go:643 lxc/profile.go:500 lxc/project.go:268 lxc/storage.go:304
 #: lxc/storage_volume.go:817
 msgid "Press enter to open the editor again"
 msgstr ""
@@ -1834,6 +1884,21 @@ msgstr ""
 msgid "Profiles: %s"
 msgstr ""
 
+#: lxc/project.go:110
+#, c-format
+msgid "Project %s created"
+msgstr ""
+
+#: lxc/project.go:161
+#, c-format
+msgid "Project %s deleted"
+msgstr ""
+
+#: lxc/project.go:427
+#, c-format
+msgid "Project %s renamed to %s"
+msgstr ""
+
 #: lxc/image.go:861
 msgid "Properties:"
 msgstr ""
@@ -1873,11 +1938,11 @@ msgstr ""
 msgid "Recursively transfer files"
 msgstr ""
 
-#: lxc/image.go:1223 lxc/image.go:1224
+#: lxc/image.go:1224 lxc/image.go:1225
 msgid "Refresh images"
 msgstr ""
 
-#: lxc/image.go:1252
+#: lxc/image.go:1253
 #, c-format
 msgid "Refreshing the image: %s"
 msgstr ""
@@ -1887,7 +1952,8 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656 lxc/remote.go:694
+#: lxc/project.go:523 lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656
+#: lxc/remote.go:694
 #, c-format
 msgid "Remote %s doesn't exist"
 msgstr ""
@@ -1965,6 +2031,10 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
+#: lxc/project.go:387 lxc/project.go:388
+msgid "Rename projects"
+msgstr ""
+
 #: lxc/remote.go:523 lxc/remote.go:524
 msgid "Rename remotes"
 msgstr ""
@@ -2150,11 +2220,11 @@ msgstr ""
 msgid "Show full device configuration for containers or profiles"
 msgstr ""
 
-#: lxc/image.go:1300 lxc/image.go:1301
+#: lxc/image.go:1301 lxc/image.go:1302
 msgid "Show image properties"
 msgstr ""
 
-#: lxc/main.go:215 lxc/main.go:216
+#: lxc/main.go:219 lxc/main.go:220
 msgid "Show less common commands"
 msgstr ""
 
@@ -2170,6 +2240,10 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
+#: lxc/project.go:442 lxc/project.go:443
+msgid "Show project options"
+msgstr ""
+
 #: lxc/storage.go:649 lxc/storage.go:650
 msgid "Show storage pool configurations and resources"
 msgstr ""
@@ -2317,6 +2391,10 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
+#: lxc/project.go:495 lxc/project.go:496
+msgid "Switch the current project"
+msgstr ""
+
 #: lxc/remote.go:635 lxc/remote.go:636
 msgid "Switch the default remote"
 msgstr ""
@@ -2379,7 +2457,7 @@ msgstr ""
 msgid "The profile device doesn't exist"
 msgstr ""
 
-#: lxc/move.go:218
+#: lxc/move.go:219
 msgid "The source LXD instance is not clustered"
 msgstr ""
 
@@ -2416,7 +2494,7 @@ msgstr ""
 msgid "To detach from the console, press: <ctrl>+a q"
 msgstr ""
 
-#: lxc/main.go:304
+#: lxc/main.go:308
 msgid "To start your first container, try: lxc launch ubuntu:18.04"
 msgstr ""
 
@@ -2467,7 +2545,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:862 lxc/profile.go:623 lxc/storage.go:558
+#: lxc/network.go:862 lxc/profile.go:623 lxc/project.go:369 lxc/storage.go:558
 #: lxc/storage_volume.go:962
 msgid "USED BY"
 msgstr ""
@@ -2552,7 +2630,8 @@ msgstr ""
 msgid "Whether or not to snapshot the container's running state"
 msgstr ""
 
-#: lxc/network.go:846 lxc/operation.go:143 lxc/remote.go:442 lxc/remote.go:447
+#: lxc/network.go:846 lxc/operation.go:143 lxc/project.go:344
+#: lxc/project.go:349 lxc/remote.go:442 lxc/remote.go:447
 msgid "YES"
 msgstr ""
 
@@ -2568,7 +2647,7 @@ msgstr ""
 msgid "You must specify a destination container name when using --target"
 msgstr ""
 
-#: lxc/copy.go:72 lxc/move.go:202
+#: lxc/copy.go:72 lxc/move.go:203
 msgid "You must specify a source container name"
 msgstr ""
 
@@ -2672,6 +2751,14 @@ msgstr ""
 msgid "create [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:71
+msgid "create [<remote>:]<project>"
+msgstr ""
+
+#: lxc/project.go:354
+msgid "current"
+msgstr ""
+
 #: lxc/remote.go:459
 msgid "default"
 msgstr ""
@@ -2718,6 +2805,10 @@ msgstr ""
 msgid "delete [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:124
+msgid "delete [<remote>:]<project>"
+msgstr ""
+
 #: lxc/storage.go:436
 msgid "description"
 msgstr ""
@@ -2786,6 +2877,10 @@ msgstr ""
 msgid "edit [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:175
+msgid "edit [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:86
 msgid "edit [<remote>:][<container>]"
 msgstr ""
@@ -2896,7 +2991,7 @@ msgid "list"
 msgstr ""
 
 #: lxc/cluster.go:61 lxc/config_trust.go:112 lxc/network.go:796
-#: lxc/operation.go:98 lxc/profile.go:574 lxc/storage.go:493
+#: lxc/operation.go:98 lxc/profile.go:574 lxc/project.go:295 lxc/storage.go:493
 msgid "list [<remote>:]"
 msgstr ""
 
@@ -3081,6 +3176,12 @@ msgid ""
 "    Update a profile using the content of profile.yaml"
 msgstr ""
 
+#: lxc/project.go:179
+msgid ""
+"lxc project edit <project> < project.yaml\n"
+"    Update a project using the content of project.yaml"
+msgstr ""
+
 #: lxc/query.go:32
 msgid ""
 "lxc query -X DELETE --wait /1.0/containers/c1\n"
@@ -3183,6 +3284,10 @@ msgstr ""
 msgid "profile"
 msgstr ""
 
+#: lxc/project.go:27
+msgid "project"
+msgstr ""
+
 #: lxc/publish.go:32
 msgid ""
 "publish [<remote>:]<container>[/<snapshot>] [<remote>:] [flags] "
@@ -3205,7 +3310,7 @@ msgstr ""
 msgid "query [<remote>:]<API path>"
 msgstr ""
 
-#: lxc/image.go:1222
+#: lxc/image.go:1223
 msgid "refresh [<remote>:]<image> [[<remote>:]<image>...]"
 msgstr ""
 
@@ -3269,6 +3374,10 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
+#: lxc/project.go:385
+msgid "rename [<remote>:]<project> <new-name>"
+msgstr ""
+
 #: lxc/action.go:68
 msgid "restart [<remote>:]<container> [[<remote>:]<container>...]"
 msgstr ""
@@ -3317,7 +3426,7 @@ msgstr ""
 msgid "show [<remote>:]<container|profile>"
 msgstr ""
 
-#: lxc/image.go:1299
+#: lxc/image.go:1300
 msgid "show [<remote>:]<image>"
 msgstr ""
 
@@ -3345,6 +3454,10 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:441
+msgid "show [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:450
 msgid "show [<remote>:][<container>]"
 msgstr ""
@@ -3381,6 +3494,10 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
+#: lxc/project.go:494
+msgid "switch [<remote>:] <project>"
+msgstr ""
+
 #: lxc/info.go:255
 #, c-format
 msgid "taken at %s"
diff --git a/po/pt_BR.po b/po/pt_BR.po
index 3724cf6784..5eee028c37 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: 2018-08-23 15:14-0400\n"
+"POT-Creation-Date: 2018-09-02 06:35+0000\n"
 "PO-Revision-Date: 2018-08-06 22:13+0000\n"
 "Last-Translator: Renato dos Santos <shazaum at gmail.com>\n"
 "Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/"
@@ -171,6 +171,38 @@ msgid ""
 "### Note that the name is shown but cannot be changed"
 msgstr ""
 
+#: lxc/project.go:189
+#, fuzzy
+msgid ""
+"### This is a yaml representation of the project.\n"
+"### Any line starting with a '# will be ignored.\n"
+"###\n"
+"### A project consists of a set of features and a description.\n"
+"###\n"
+"### An example would look like:\n"
+"### name: my-project\n"
+"### features:\n"
+"###   images: True\n"
+"###   profiles: True\n"
+"### description: My own project\n"
+"###\n"
+"### Note that the name is shown but cannot be changed"
+msgstr ""
+"### Esta é uma representação yaml de um pool de armazenamento\n"
+"### Qualquer linha iniciada com um '#' será ignorada.\n"
+"###\n"
+"### Um pool de armazenamento consiste em um conjunto de itens de "
+"configuração.\n"
+"###\n"
+"### Um exemplo seria algo como:\n"
+"### name: default\n"
+"### driver: zfs\n"
+"### used_by: []\n"
+"### config:\n"
+"###   size: \"61203283968\"\n"
+"###   source: /home/chb/mnt/lxd_test/default.img\n"
+"###   zfs.pool_name: default"
+
 #: lxc/image.go:966
 #, c-format
 msgid "%s (%d more)"
@@ -481,8 +513,8 @@ msgid "Config key/value to apply to the target container"
 msgstr ""
 
 #: lxc/config.go:195 lxc/config.go:259 lxc/config_metadata.go:144
-#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/storage.go:303
-#: lxc/storage_volume.go:816
+#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/project.go:267
+#: lxc/storage.go:303 lxc/storage_volume.go:816
 #, c-format
 msgid "Config parsing error: %s"
 msgstr ""
@@ -603,6 +635,10 @@ msgstr ""
 msgid "Create profiles"
 msgstr ""
 
+#: lxc/project.go:72 lxc/project.go:73
+msgid "Create projects"
+msgstr ""
+
 #: lxc/storage.go:88 lxc/storage.go:89
 msgid "Create storage pools"
 msgstr ""
@@ -674,6 +710,10 @@ msgstr ""
 msgid "Delete profiles"
 msgstr ""
 
+#: lxc/project.go:126 lxc/project.go:127
+msgid "Delete projects"
+msgstr ""
+
 #: lxc/storage.go:162 lxc/storage.go:163
 msgid "Delete storage pools"
 msgstr ""
@@ -700,7 +740,7 @@ msgstr ""
 #: lxc/file.go:42 lxc/file.go:75 lxc/file.go:124 lxc/file.go:187
 #: lxc/file.go:377 lxc/image.go:42 lxc/image.go:131 lxc/image.go:265
 #: lxc/image.go:316 lxc/image.go:439 lxc/image.go:579 lxc/image.go:788
-#: lxc/image.go:902 lxc/image.go:1224 lxc/image.go:1301 lxc/image_alias.go:26
+#: lxc/image.go:902 lxc/image.go:1225 lxc/image.go:1302 lxc/image_alias.go:26
 #: lxc/image_alias.go:59 lxc/image_alias.go:106 lxc/image_alias.go:149
 #: lxc/image_alias.go:250 lxc/import.go:25 lxc/info.go:29 lxc/init.go:35
 #: lxc/launch.go:22 lxc/list.go:48 lxc/main.go:48 lxc/manpage.go:19
@@ -713,7 +753,9 @@ msgstr ""
 #: lxc/profile.go:30 lxc/profile.go:102 lxc/profile.go:165 lxc/profile.go:245
 #: lxc/profile.go:301 lxc/profile.go:355 lxc/profile.go:405 lxc/profile.go:529
 #: lxc/profile.go:577 lxc/profile.go:641 lxc/profile.go:717 lxc/profile.go:767
-#: lxc/profile.go:826 lxc/profile.go:880 lxc/publish.go:34 lxc/query.go:30
+#: lxc/profile.go:826 lxc/profile.go:880 lxc/project.go:29 lxc/project.go:73
+#: lxc/project.go:127 lxc/project.go:177 lxc/project.go:298 lxc/project.go:388
+#: lxc/project.go:443 lxc/project.go:496 lxc/publish.go:34 lxc/query.go:30
 #: lxc/remote.go:37 lxc/remote.go:87 lxc/remote.go:383 lxc/remote.go:419
 #: lxc/remote.go:524 lxc/remote.go:586 lxc/remote.go:636 lxc/remote.go:674
 #: lxc/rename.go:21 lxc/restore.go:24 lxc/snapshot.go:21 lxc/storage.go:33
@@ -822,6 +864,11 @@ msgstr "Editar configurações de rede como YAML"
 msgid "Edit profile configurations as YAML"
 msgstr "Editar configurações de perfil como YAML"
 
+#: lxc/project.go:176 lxc/project.go:177
+#, fuzzy
+msgid "Edit project configurations as YAML"
+msgstr "Editar configurações de perfil como YAML"
+
 #: lxc/storage.go:212 lxc/storage.go:213
 msgid "Edit storage pool configurations as YAML"
 msgstr ""
@@ -936,7 +983,7 @@ msgstr ""
 msgid "FINGERPRINT"
 msgstr ""
 
-#: lxc/move.go:213
+#: lxc/move.go:214
 msgid "Failed to connect to cluster member"
 msgstr ""
 
@@ -1040,6 +1087,10 @@ msgstr ""
 msgid "ID"
 msgstr ""
 
+#: lxc/project.go:367
+msgid "IMAGES"
+msgstr ""
+
 #: lxc/network.go:964
 msgid "IP ADDRESS"
 msgstr ""
@@ -1056,7 +1107,7 @@ msgstr ""
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:301
+#: lxc/main.go:305
 msgid ""
 "If this is your first time running LXD on this machine, you should also run: "
 "lxd init"
@@ -1066,7 +1117,7 @@ msgstr ""
 msgid "Ignore the container state"
 msgstr ""
 
-#: lxc/image.go:1284
+#: lxc/image.go:1285
 msgid "Image already up to date."
 msgstr ""
 
@@ -1078,7 +1129,7 @@ msgstr ""
 msgid "Image exported successfully!"
 msgstr "Imagem exportada com sucesso!"
 
-#: lxc/image.go:288 lxc/image.go:1247
+#: lxc/image.go:288 lxc/image.go:1248
 msgid "Image identifier missing"
 msgstr "Falta o identificador da imagem"
 
@@ -1092,7 +1143,7 @@ msgstr "Falta o identificador da imagem: %s"
 msgid "Image imported with fingerprint: %s"
 msgstr ""
 
-#: lxc/image.go:1282
+#: lxc/image.go:1283
 msgid "Image refreshed successfully!"
 msgstr ""
 
@@ -1147,7 +1198,7 @@ msgstr ""
 msgid "Invalid config key column format (too many fields): '%s'"
 msgstr ""
 
-#: lxc/image.go:1208 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
+#: lxc/image.go:1209 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
 #, c-format
 msgid "Invalid format %q"
 msgstr ""
@@ -1168,7 +1219,7 @@ msgid ""
 "Invalid name in '%s', empty string is only allowed when defining maxWidth"
 msgstr ""
 
-#: lxc/main.go:389
+#: lxc/main.go:393
 msgid "Invalid number of arguments"
 msgstr ""
 
@@ -1364,6 +1415,10 @@ msgstr ""
 msgid "List profiles"
 msgstr ""
 
+#: lxc/project.go:297 lxc/project.go:298
+msgid "List projects"
+msgstr ""
+
 #: lxc/storage_volume.go:911 lxc/storage_volume.go:912
 msgid "List storage volumes"
 msgstr ""
@@ -1482,6 +1537,10 @@ msgstr ""
 msgid "Manage profiles"
 msgstr ""
 
+#: lxc/project.go:28 lxc/project.go:29
+msgid "Manage projects"
+msgstr ""
+
 #: lxc/storage.go:32 lxc/storage.go:33
 msgid "Manage storage pools and volumes"
 msgstr ""
@@ -1528,11 +1587,11 @@ msgstr ""
 msgid "Memory usage:"
 msgstr ""
 
-#: lxc/move.go:226
+#: lxc/move.go:227
 msgid "Migration API failure"
 msgstr ""
 
-#: lxc/move.go:231
+#: lxc/move.go:232
 msgid "Migration operation failure"
 msgstr ""
 
@@ -1580,6 +1639,11 @@ msgstr ""
 msgid "Missing profile name"
 msgstr ""
 
+#: lxc/project.go:97 lxc/project.go:151 lxc/project.go:221 lxc/project.go:412
+#: lxc/project.go:467
+msgid "Missing project name"
+msgstr ""
+
 #: lxc/profile.go:270
 msgid "Missing source profile name"
 msgstr ""
@@ -1638,11 +1702,13 @@ msgid "Must supply container name for: "
 msgstr ""
 
 #: lxc/cluster.go:124 lxc/list.go:459 lxc/network.go:858 lxc/profile.go:622
-#: lxc/remote.go:465 lxc/storage.go:549 lxc/storage_volume.go:960
+#: lxc/project.go:366 lxc/remote.go:465 lxc/storage.go:549
+#: lxc/storage_volume.go:960
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:844 lxc/operation.go:141 lxc/remote.go:440 lxc/remote.go:445
+#: lxc/network.go:844 lxc/operation.go:141 lxc/project.go:342
+#: lxc/project.go:347 lxc/remote.go:440 lxc/remote.go:445
 msgid "NO"
 msgstr ""
 
@@ -1749,7 +1815,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:462
+#: lxc/list.go:462 lxc/project.go:368
 msgid "PROFILES"
 msgstr ""
 
@@ -1778,7 +1844,7 @@ msgstr ""
 msgid "Pid: %d"
 msgstr ""
 
-#: lxc/network.go:643 lxc/profile.go:500 lxc/storage.go:304
+#: lxc/network.go:643 lxc/profile.go:500 lxc/project.go:268 lxc/storage.go:304
 #: lxc/storage_volume.go:817
 msgid "Press enter to open the editor again"
 msgstr ""
@@ -1862,6 +1928,21 @@ msgstr ""
 msgid "Profiles: %s"
 msgstr ""
 
+#: lxc/project.go:110
+#, c-format
+msgid "Project %s created"
+msgstr ""
+
+#: lxc/project.go:161
+#, c-format
+msgid "Project %s deleted"
+msgstr ""
+
+#: lxc/project.go:427
+#, c-format
+msgid "Project %s renamed to %s"
+msgstr ""
+
 #: lxc/image.go:861
 msgid "Properties:"
 msgstr ""
@@ -1901,11 +1982,11 @@ msgstr ""
 msgid "Recursively transfer files"
 msgstr ""
 
-#: lxc/image.go:1223 lxc/image.go:1224
+#: lxc/image.go:1224 lxc/image.go:1225
 msgid "Refresh images"
 msgstr ""
 
-#: lxc/image.go:1252
+#: lxc/image.go:1253
 #, c-format
 msgid "Refreshing the image: %s"
 msgstr ""
@@ -1915,7 +1996,8 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656 lxc/remote.go:694
+#: lxc/project.go:523 lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656
+#: lxc/remote.go:694
 #, c-format
 msgid "Remote %s doesn't exist"
 msgstr ""
@@ -1993,6 +2075,10 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
+#: lxc/project.go:387 lxc/project.go:388
+msgid "Rename projects"
+msgstr ""
+
 #: lxc/remote.go:523 lxc/remote.go:524
 msgid "Rename remotes"
 msgstr ""
@@ -2178,11 +2264,11 @@ msgstr ""
 msgid "Show full device configuration for containers or profiles"
 msgstr ""
 
-#: lxc/image.go:1300 lxc/image.go:1301
+#: lxc/image.go:1301 lxc/image.go:1302
 msgid "Show image properties"
 msgstr ""
 
-#: lxc/main.go:215 lxc/main.go:216
+#: lxc/main.go:219 lxc/main.go:220
 msgid "Show less common commands"
 msgstr ""
 
@@ -2198,6 +2284,10 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
+#: lxc/project.go:442 lxc/project.go:443
+msgid "Show project options"
+msgstr ""
+
 #: lxc/storage.go:649 lxc/storage.go:650
 msgid "Show storage pool configurations and resources"
 msgstr ""
@@ -2345,6 +2435,10 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
+#: lxc/project.go:495 lxc/project.go:496
+msgid "Switch the current project"
+msgstr ""
+
 #: lxc/remote.go:635 lxc/remote.go:636
 msgid "Switch the default remote"
 msgstr ""
@@ -2407,7 +2501,7 @@ msgstr ""
 msgid "The profile device doesn't exist"
 msgstr ""
 
-#: lxc/move.go:218
+#: lxc/move.go:219
 msgid "The source LXD instance is not clustered"
 msgstr ""
 
@@ -2444,7 +2538,7 @@ msgstr ""
 msgid "To detach from the console, press: <ctrl>+a q"
 msgstr ""
 
-#: lxc/main.go:304
+#: lxc/main.go:308
 msgid "To start your first container, try: lxc launch ubuntu:18.04"
 msgstr ""
 
@@ -2495,7 +2589,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:862 lxc/profile.go:623 lxc/storage.go:558
+#: lxc/network.go:862 lxc/profile.go:623 lxc/project.go:369 lxc/storage.go:558
 #: lxc/storage_volume.go:962
 msgid "USED BY"
 msgstr ""
@@ -2580,7 +2674,8 @@ msgstr ""
 msgid "Whether or not to snapshot the container's running state"
 msgstr ""
 
-#: lxc/network.go:846 lxc/operation.go:143 lxc/remote.go:442 lxc/remote.go:447
+#: lxc/network.go:846 lxc/operation.go:143 lxc/project.go:344
+#: lxc/project.go:349 lxc/remote.go:442 lxc/remote.go:447
 msgid "YES"
 msgstr ""
 
@@ -2596,7 +2691,7 @@ msgstr ""
 msgid "You must specify a destination container name when using --target"
 msgstr ""
 
-#: lxc/copy.go:72 lxc/move.go:202
+#: lxc/copy.go:72 lxc/move.go:203
 msgid "You must specify a source container name"
 msgstr ""
 
@@ -2700,6 +2795,14 @@ msgstr ""
 msgid "create [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:71
+msgid "create [<remote>:]<project>"
+msgstr ""
+
+#: lxc/project.go:354
+msgid "current"
+msgstr ""
+
 #: lxc/remote.go:459
 msgid "default"
 msgstr ""
@@ -2746,6 +2849,10 @@ msgstr ""
 msgid "delete [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:124
+msgid "delete [<remote>:]<project>"
+msgstr ""
+
 #: lxc/storage.go:436
 msgid "description"
 msgstr ""
@@ -2814,6 +2921,10 @@ msgstr ""
 msgid "edit [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:175
+msgid "edit [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:86
 msgid "edit [<remote>:][<container>]"
 msgstr ""
@@ -2924,7 +3035,7 @@ msgid "list"
 msgstr ""
 
 #: lxc/cluster.go:61 lxc/config_trust.go:112 lxc/network.go:796
-#: lxc/operation.go:98 lxc/profile.go:574 lxc/storage.go:493
+#: lxc/operation.go:98 lxc/profile.go:574 lxc/project.go:295 lxc/storage.go:493
 msgid "list [<remote>:]"
 msgstr ""
 
@@ -3109,6 +3220,12 @@ msgid ""
 "    Update a profile using the content of profile.yaml"
 msgstr ""
 
+#: lxc/project.go:179
+msgid ""
+"lxc project edit <project> < project.yaml\n"
+"    Update a project using the content of project.yaml"
+msgstr ""
+
 #: lxc/query.go:32
 msgid ""
 "lxc query -X DELETE --wait /1.0/containers/c1\n"
@@ -3211,6 +3328,10 @@ msgstr ""
 msgid "profile"
 msgstr ""
 
+#: lxc/project.go:27
+msgid "project"
+msgstr ""
+
 #: lxc/publish.go:32
 msgid ""
 "publish [<remote>:]<container>[/<snapshot>] [<remote>:] [flags] "
@@ -3233,7 +3354,7 @@ msgstr ""
 msgid "query [<remote>:]<API path>"
 msgstr ""
 
-#: lxc/image.go:1222
+#: lxc/image.go:1223
 msgid "refresh [<remote>:]<image> [[<remote>:]<image>...]"
 msgstr ""
 
@@ -3297,6 +3418,10 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
+#: lxc/project.go:385
+msgid "rename [<remote>:]<project> <new-name>"
+msgstr ""
+
 #: lxc/action.go:68
 msgid "restart [<remote>:]<container> [[<remote>:]<container>...]"
 msgstr ""
@@ -3345,7 +3470,7 @@ msgstr ""
 msgid "show [<remote>:]<container|profile>"
 msgstr ""
 
-#: lxc/image.go:1299
+#: lxc/image.go:1300
 msgid "show [<remote>:]<image>"
 msgstr ""
 
@@ -3373,6 +3498,10 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:441
+msgid "show [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:450
 msgid "show [<remote>:][<container>]"
 msgstr ""
@@ -3409,6 +3538,10 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
+#: lxc/project.go:494
+msgid "switch [<remote>:] <project>"
+msgstr ""
+
 #: lxc/info.go:255
 #, c-format
 msgid "taken at %s"
diff --git a/po/ru.po b/po/ru.po
index 04fe93093c..d45362d2a3 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: 2018-08-23 15:14-0400\n"
+"POT-Creation-Date: 2018-09-02 06:35+0000\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/"
@@ -235,6 +235,41 @@ msgstr ""
 "###\n"
 "### Обратите внимание, что имя отображается, но не может быть изменено"
 
+#: lxc/project.go:189
+#, fuzzy
+msgid ""
+"### This is a yaml representation of the project.\n"
+"### Any line starting with a '# will be ignored.\n"
+"###\n"
+"### A project consists of a set of features and a description.\n"
+"###\n"
+"### An example would look like:\n"
+"### name: my-project\n"
+"### features:\n"
+"###   images: True\n"
+"###   profiles: True\n"
+"### description: My own project\n"
+"###\n"
+"### Note that the name is shown but cannot be changed"
+msgstr ""
+"### Это представление профиля в формате YAML.\n"
+"### Любая строка начинающаяся с '#' будет игнорироваться.\n"
+"###\n"
+"### Профиль состоит из набора элементов конфигурации,\n"
+"### за которым следует набор устройств.\n"
+"###\n"
+"### Пример:\n"
+"### name: onenic\n"
+"### config:\n"
+"###   raw.lxc: lxc.aa_profile=unconfined\n"
+"### devices:\n"
+"###   eth0:\n"
+"###     nictype: bridged\n"
+"###     parent: lxdbr0\n"
+"###     type: nic\n"
+"###\n"
+"### Обратите внимание, что имя отображается, но не может быть изменено"
+
 #: lxc/image.go:966
 #, c-format
 msgid "%s (%d more)"
@@ -549,8 +584,8 @@ msgid "Config key/value to apply to the target container"
 msgstr ""
 
 #: lxc/config.go:195 lxc/config.go:259 lxc/config_metadata.go:144
-#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/storage.go:303
-#: lxc/storage_volume.go:816
+#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/project.go:267
+#: lxc/storage.go:303 lxc/storage_volume.go:816
 #, c-format
 msgid "Config parsing error: %s"
 msgstr ""
@@ -675,6 +710,10 @@ msgstr ""
 msgid "Create profiles"
 msgstr ""
 
+#: lxc/project.go:72 lxc/project.go:73
+msgid "Create projects"
+msgstr ""
+
 #: lxc/storage.go:88 lxc/storage.go:89
 #, fuzzy
 msgid "Create storage pools"
@@ -750,6 +789,10 @@ msgstr ""
 msgid "Delete profiles"
 msgstr ""
 
+#: lxc/project.go:126 lxc/project.go:127
+msgid "Delete projects"
+msgstr ""
+
 #: lxc/storage.go:162 lxc/storage.go:163
 msgid "Delete storage pools"
 msgstr ""
@@ -777,7 +820,7 @@ msgstr "Копирование образа: %s"
 #: lxc/file.go:42 lxc/file.go:75 lxc/file.go:124 lxc/file.go:187
 #: lxc/file.go:377 lxc/image.go:42 lxc/image.go:131 lxc/image.go:265
 #: lxc/image.go:316 lxc/image.go:439 lxc/image.go:579 lxc/image.go:788
-#: lxc/image.go:902 lxc/image.go:1224 lxc/image.go:1301 lxc/image_alias.go:26
+#: lxc/image.go:902 lxc/image.go:1225 lxc/image.go:1302 lxc/image_alias.go:26
 #: lxc/image_alias.go:59 lxc/image_alias.go:106 lxc/image_alias.go:149
 #: lxc/image_alias.go:250 lxc/import.go:25 lxc/info.go:29 lxc/init.go:35
 #: lxc/launch.go:22 lxc/list.go:48 lxc/main.go:48 lxc/manpage.go:19
@@ -790,7 +833,9 @@ msgstr "Копирование образа: %s"
 #: lxc/profile.go:30 lxc/profile.go:102 lxc/profile.go:165 lxc/profile.go:245
 #: lxc/profile.go:301 lxc/profile.go:355 lxc/profile.go:405 lxc/profile.go:529
 #: lxc/profile.go:577 lxc/profile.go:641 lxc/profile.go:717 lxc/profile.go:767
-#: lxc/profile.go:826 lxc/profile.go:880 lxc/publish.go:34 lxc/query.go:30
+#: lxc/profile.go:826 lxc/profile.go:880 lxc/project.go:29 lxc/project.go:73
+#: lxc/project.go:127 lxc/project.go:177 lxc/project.go:298 lxc/project.go:388
+#: lxc/project.go:443 lxc/project.go:496 lxc/publish.go:34 lxc/query.go:30
 #: lxc/remote.go:37 lxc/remote.go:87 lxc/remote.go:383 lxc/remote.go:419
 #: lxc/remote.go:524 lxc/remote.go:586 lxc/remote.go:636 lxc/remote.go:674
 #: lxc/rename.go:21 lxc/restore.go:24 lxc/snapshot.go:21 lxc/storage.go:33
@@ -901,6 +946,10 @@ msgstr ""
 msgid "Edit profile configurations as YAML"
 msgstr ""
 
+#: lxc/project.go:176 lxc/project.go:177
+msgid "Edit project configurations as YAML"
+msgstr ""
+
 #: lxc/storage.go:212 lxc/storage.go:213
 msgid "Edit storage pool configurations as YAML"
 msgstr ""
@@ -1018,7 +1067,7 @@ msgstr ""
 msgid "FINGERPRINT"
 msgstr ""
 
-#: lxc/move.go:213
+#: lxc/move.go:214
 msgid "Failed to connect to cluster member"
 msgstr ""
 
@@ -1122,6 +1171,10 @@ msgstr ""
 msgid "ID"
 msgstr ""
 
+#: lxc/project.go:367
+msgid "IMAGES"
+msgstr ""
+
 #: lxc/network.go:964
 msgid "IP ADDRESS"
 msgstr ""
@@ -1138,7 +1191,7 @@ msgstr ""
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:301
+#: lxc/main.go:305
 msgid ""
 "If this is your first time running LXD on this machine, you should also run: "
 "lxd init"
@@ -1149,7 +1202,7 @@ msgstr ""
 msgid "Ignore the container state"
 msgstr "Невозможно добавить имя контейнера в список"
 
-#: lxc/image.go:1284
+#: lxc/image.go:1285
 msgid "Image already up to date."
 msgstr ""
 
@@ -1161,7 +1214,7 @@ msgstr ""
 msgid "Image exported successfully!"
 msgstr ""
 
-#: lxc/image.go:288 lxc/image.go:1247
+#: lxc/image.go:288 lxc/image.go:1248
 msgid "Image identifier missing"
 msgstr ""
 
@@ -1175,7 +1228,7 @@ msgstr ""
 msgid "Image imported with fingerprint: %s"
 msgstr ""
 
-#: lxc/image.go:1282
+#: lxc/image.go:1283
 msgid "Image refreshed successfully!"
 msgstr ""
 
@@ -1232,7 +1285,7 @@ msgstr ""
 msgid "Invalid config key column format (too many fields): '%s'"
 msgstr ""
 
-#: lxc/image.go:1208 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
+#: lxc/image.go:1209 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
 #, c-format
 msgid "Invalid format %q"
 msgstr ""
@@ -1253,7 +1306,7 @@ msgid ""
 "Invalid name in '%s', empty string is only allowed when defining maxWidth"
 msgstr ""
 
-#: lxc/main.go:389
+#: lxc/main.go:393
 msgid "Invalid number of arguments"
 msgstr ""
 
@@ -1451,6 +1504,10 @@ msgstr ""
 msgid "List profiles"
 msgstr ""
 
+#: lxc/project.go:297 lxc/project.go:298
+msgid "List projects"
+msgstr ""
+
 #: lxc/storage_volume.go:911 lxc/storage_volume.go:912
 #, fuzzy
 msgid "List storage volumes"
@@ -1571,6 +1628,10 @@ msgstr ""
 msgid "Manage profiles"
 msgstr ""
 
+#: lxc/project.go:28 lxc/project.go:29
+msgid "Manage projects"
+msgstr ""
+
 #: lxc/storage.go:32 lxc/storage.go:33
 #, fuzzy
 msgid "Manage storage pools and volumes"
@@ -1620,11 +1681,11 @@ msgstr ""
 msgid "Memory usage:"
 msgstr " Использование памяти:"
 
-#: lxc/move.go:226
+#: lxc/move.go:227
 msgid "Migration API failure"
 msgstr ""
 
-#: lxc/move.go:231
+#: lxc/move.go:232
 msgid "Migration operation failure"
 msgstr ""
 
@@ -1673,6 +1734,12 @@ msgstr ""
 msgid "Missing profile name"
 msgstr ""
 
+#: lxc/project.go:97 lxc/project.go:151 lxc/project.go:221 lxc/project.go:412
+#: lxc/project.go:467
+#, fuzzy
+msgid "Missing project name"
+msgstr "Имя контейнера: %s"
+
 #: lxc/profile.go:270
 msgid "Missing source profile name"
 msgstr ""
@@ -1733,11 +1800,13 @@ msgid "Must supply container name for: "
 msgstr ""
 
 #: lxc/cluster.go:124 lxc/list.go:459 lxc/network.go:858 lxc/profile.go:622
-#: lxc/remote.go:465 lxc/storage.go:549 lxc/storage_volume.go:960
+#: lxc/project.go:366 lxc/remote.go:465 lxc/storage.go:549
+#: lxc/storage_volume.go:960
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:844 lxc/operation.go:141 lxc/remote.go:440 lxc/remote.go:445
+#: lxc/network.go:844 lxc/operation.go:141 lxc/project.go:342
+#: lxc/project.go:347 lxc/remote.go:440 lxc/remote.go:445
 msgid "NO"
 msgstr ""
 
@@ -1846,7 +1915,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:462
+#: lxc/list.go:462 lxc/project.go:368
 msgid "PROFILES"
 msgstr ""
 
@@ -1875,7 +1944,7 @@ msgstr ""
 msgid "Pid: %d"
 msgstr ""
 
-#: lxc/network.go:643 lxc/profile.go:500 lxc/storage.go:304
+#: lxc/network.go:643 lxc/profile.go:500 lxc/project.go:268 lxc/storage.go:304
 #: lxc/storage_volume.go:817
 msgid "Press enter to open the editor again"
 msgstr ""
@@ -1959,6 +2028,21 @@ msgstr ""
 msgid "Profiles: %s"
 msgstr ""
 
+#: lxc/project.go:110
+#, c-format
+msgid "Project %s created"
+msgstr ""
+
+#: lxc/project.go:161
+#, c-format
+msgid "Project %s deleted"
+msgstr ""
+
+#: lxc/project.go:427
+#, c-format
+msgid "Project %s renamed to %s"
+msgstr ""
+
 #: lxc/image.go:861
 msgid "Properties:"
 msgstr ""
@@ -1998,12 +2082,12 @@ msgstr ""
 msgid "Recursively transfer files"
 msgstr ""
 
-#: lxc/image.go:1223 lxc/image.go:1224
+#: lxc/image.go:1224 lxc/image.go:1225
 #, fuzzy
 msgid "Refresh images"
 msgstr "Копирование образа: %s"
 
-#: lxc/image.go:1252
+#: lxc/image.go:1253
 #, fuzzy, c-format
 msgid "Refreshing the image: %s"
 msgstr "Копирование образа: %s"
@@ -2013,7 +2097,8 @@ msgstr "Копирование образа: %s"
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656 lxc/remote.go:694
+#: lxc/project.go:523 lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656
+#: lxc/remote.go:694
 #, c-format
 msgid "Remote %s doesn't exist"
 msgstr ""
@@ -2093,6 +2178,10 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
+#: lxc/project.go:387 lxc/project.go:388
+msgid "Rename projects"
+msgstr ""
+
 #: lxc/remote.go:523 lxc/remote.go:524
 msgid "Rename remotes"
 msgstr ""
@@ -2281,11 +2370,11 @@ msgstr ""
 msgid "Show full device configuration for containers or profiles"
 msgstr ""
 
-#: lxc/image.go:1300 lxc/image.go:1301
+#: lxc/image.go:1301 lxc/image.go:1302
 msgid "Show image properties"
 msgstr ""
 
-#: lxc/main.go:215 lxc/main.go:216
+#: lxc/main.go:219 lxc/main.go:220
 msgid "Show less common commands"
 msgstr ""
 
@@ -2301,6 +2390,10 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
+#: lxc/project.go:442 lxc/project.go:443
+msgid "Show project options"
+msgstr ""
+
 #: lxc/storage.go:649 lxc/storage.go:650
 msgid "Show storage pool configurations and resources"
 msgstr ""
@@ -2450,6 +2543,10 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
+#: lxc/project.go:495 lxc/project.go:496
+msgid "Switch the current project"
+msgstr ""
+
 #: lxc/remote.go:635 lxc/remote.go:636
 msgid "Switch the default remote"
 msgstr ""
@@ -2512,7 +2609,7 @@ msgstr ""
 msgid "The profile device doesn't exist"
 msgstr ""
 
-#: lxc/move.go:218
+#: lxc/move.go:219
 msgid "The source LXD instance is not clustered"
 msgstr ""
 
@@ -2549,7 +2646,7 @@ msgstr ""
 msgid "To detach from the console, press: <ctrl>+a q"
 msgstr ""
 
-#: lxc/main.go:304
+#: lxc/main.go:308
 msgid "To start your first container, try: lxc launch ubuntu:18.04"
 msgstr ""
 
@@ -2600,7 +2697,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:862 lxc/profile.go:623 lxc/storage.go:558
+#: lxc/network.go:862 lxc/profile.go:623 lxc/project.go:369 lxc/storage.go:558
 #: lxc/storage_volume.go:962
 msgid "USED BY"
 msgstr ""
@@ -2685,7 +2782,8 @@ msgstr ""
 msgid "Whether or not to snapshot the container's running state"
 msgstr ""
 
-#: lxc/network.go:846 lxc/operation.go:143 lxc/remote.go:442 lxc/remote.go:447
+#: lxc/network.go:846 lxc/operation.go:143 lxc/project.go:344
+#: lxc/project.go:349 lxc/remote.go:442 lxc/remote.go:447
 msgid "YES"
 msgstr ""
 
@@ -2701,7 +2799,7 @@ msgstr ""
 msgid "You must specify a destination container name when using --target"
 msgstr ""
 
-#: lxc/copy.go:72 lxc/move.go:202
+#: lxc/copy.go:72 lxc/move.go:203
 msgid "You must specify a source container name"
 msgstr ""
 
@@ -2806,6 +2904,14 @@ msgstr ""
 msgid "create [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:71
+msgid "create [<remote>:]<project>"
+msgstr ""
+
+#: lxc/project.go:354
+msgid "current"
+msgstr ""
+
 #: lxc/remote.go:459
 msgid "default"
 msgstr ""
@@ -2864,6 +2970,14 @@ msgstr ""
 msgid "delete [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:124
+#, fuzzy
+msgid "delete [<remote>:]<project>"
+msgstr ""
+"Изменение состояния одного или нескольких контейнеров %s.\n"
+"\n"
+"lxc %s [<remote>:]<container> [[<remote>:]<container>...]%s"
+
 #: lxc/storage.go:436
 msgid "description"
 msgstr ""
@@ -2932,6 +3046,10 @@ msgstr ""
 msgid "edit [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:175
+msgid "edit [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:86
 msgid "edit [<remote>:][<container>]"
 msgstr ""
@@ -3046,7 +3164,7 @@ msgid "list"
 msgstr ""
 
 #: lxc/cluster.go:61 lxc/config_trust.go:112 lxc/network.go:796
-#: lxc/operation.go:98 lxc/profile.go:574 lxc/storage.go:493
+#: lxc/operation.go:98 lxc/profile.go:574 lxc/project.go:295 lxc/storage.go:493
 msgid "list [<remote>:]"
 msgstr ""
 
@@ -3231,6 +3349,12 @@ msgid ""
 "    Update a profile using the content of profile.yaml"
 msgstr ""
 
+#: lxc/project.go:179
+msgid ""
+"lxc project edit <project> < project.yaml\n"
+"    Update a project using the content of project.yaml"
+msgstr ""
+
 #: lxc/query.go:32
 msgid ""
 "lxc query -X DELETE --wait /1.0/containers/c1\n"
@@ -3341,6 +3465,10 @@ msgstr ""
 msgid "profile"
 msgstr ""
 
+#: lxc/project.go:27
+msgid "project"
+msgstr ""
+
 #: lxc/publish.go:32
 msgid ""
 "publish [<remote>:]<container>[/<snapshot>] [<remote>:] [flags] "
@@ -3371,7 +3499,7 @@ msgstr ""
 msgid "query [<remote>:]<API path>"
 msgstr ""
 
-#: lxc/image.go:1222
+#: lxc/image.go:1223
 #, fuzzy
 msgid "refresh [<remote>:]<image> [[<remote>:]<image>...]"
 msgstr ""
@@ -3443,6 +3571,10 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
+#: lxc/project.go:385
+msgid "rename [<remote>:]<project> <new-name>"
+msgstr ""
+
 #: lxc/action.go:68
 #, fuzzy
 msgid "restart [<remote>:]<container> [[<remote>:]<container>...]"
@@ -3495,7 +3627,7 @@ msgstr ""
 msgid "show [<remote>:]<container|profile>"
 msgstr ""
 
-#: lxc/image.go:1299
+#: lxc/image.go:1300
 msgid "show [<remote>:]<image>"
 msgstr ""
 
@@ -3523,6 +3655,10 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:441
+msgid "show [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:450
 msgid "show [<remote>:][<container>]"
 msgstr ""
@@ -3567,6 +3703,14 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
+#: lxc/project.go:494
+#, fuzzy
+msgid "switch [<remote>:] <project>"
+msgstr ""
+"Изменение состояния одного или нескольких контейнеров %s.\n"
+"\n"
+"lxc %s [<remote>:]<container> [[<remote>:]<container>...]%s"
+
 #: lxc/info.go:255
 #, c-format
 msgid "taken at %s"
diff --git a/po/sr.po b/po/sr.po
index 120ae80be6..bd4cd87cc0 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: 2018-08-23 15:14-0400\n"
+"POT-Creation-Date: 2018-09-02 06:35+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -143,6 +143,23 @@ msgid ""
 "### Note that the name is shown but cannot be changed"
 msgstr ""
 
+#: lxc/project.go:189
+msgid ""
+"### This is a yaml representation of the project.\n"
+"### Any line starting with a '# will be ignored.\n"
+"###\n"
+"### A project consists of a set of features and a description.\n"
+"###\n"
+"### An example would look like:\n"
+"### name: my-project\n"
+"### features:\n"
+"###   images: True\n"
+"###   profiles: True\n"
+"### description: My own project\n"
+"###\n"
+"### Note that the name is shown but cannot be changed"
+msgstr ""
+
 #: lxc/image.go:966
 #, c-format
 msgid "%s (%d more)"
@@ -453,8 +470,8 @@ msgid "Config key/value to apply to the target container"
 msgstr ""
 
 #: lxc/config.go:195 lxc/config.go:259 lxc/config_metadata.go:144
-#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/storage.go:303
-#: lxc/storage_volume.go:816
+#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/project.go:267
+#: lxc/storage.go:303 lxc/storage_volume.go:816
 #, c-format
 msgid "Config parsing error: %s"
 msgstr ""
@@ -575,6 +592,10 @@ msgstr ""
 msgid "Create profiles"
 msgstr ""
 
+#: lxc/project.go:72 lxc/project.go:73
+msgid "Create projects"
+msgstr ""
+
 #: lxc/storage.go:88 lxc/storage.go:89
 msgid "Create storage pools"
 msgstr ""
@@ -646,6 +667,10 @@ msgstr ""
 msgid "Delete profiles"
 msgstr ""
 
+#: lxc/project.go:126 lxc/project.go:127
+msgid "Delete projects"
+msgstr ""
+
 #: lxc/storage.go:162 lxc/storage.go:163
 msgid "Delete storage pools"
 msgstr ""
@@ -672,7 +697,7 @@ msgstr ""
 #: lxc/file.go:42 lxc/file.go:75 lxc/file.go:124 lxc/file.go:187
 #: lxc/file.go:377 lxc/image.go:42 lxc/image.go:131 lxc/image.go:265
 #: lxc/image.go:316 lxc/image.go:439 lxc/image.go:579 lxc/image.go:788
-#: lxc/image.go:902 lxc/image.go:1224 lxc/image.go:1301 lxc/image_alias.go:26
+#: lxc/image.go:902 lxc/image.go:1225 lxc/image.go:1302 lxc/image_alias.go:26
 #: lxc/image_alias.go:59 lxc/image_alias.go:106 lxc/image_alias.go:149
 #: lxc/image_alias.go:250 lxc/import.go:25 lxc/info.go:29 lxc/init.go:35
 #: lxc/launch.go:22 lxc/list.go:48 lxc/main.go:48 lxc/manpage.go:19
@@ -685,7 +710,9 @@ msgstr ""
 #: lxc/profile.go:30 lxc/profile.go:102 lxc/profile.go:165 lxc/profile.go:245
 #: lxc/profile.go:301 lxc/profile.go:355 lxc/profile.go:405 lxc/profile.go:529
 #: lxc/profile.go:577 lxc/profile.go:641 lxc/profile.go:717 lxc/profile.go:767
-#: lxc/profile.go:826 lxc/profile.go:880 lxc/publish.go:34 lxc/query.go:30
+#: lxc/profile.go:826 lxc/profile.go:880 lxc/project.go:29 lxc/project.go:73
+#: lxc/project.go:127 lxc/project.go:177 lxc/project.go:298 lxc/project.go:388
+#: lxc/project.go:443 lxc/project.go:496 lxc/publish.go:34 lxc/query.go:30
 #: lxc/remote.go:37 lxc/remote.go:87 lxc/remote.go:383 lxc/remote.go:419
 #: lxc/remote.go:524 lxc/remote.go:586 lxc/remote.go:636 lxc/remote.go:674
 #: lxc/rename.go:21 lxc/restore.go:24 lxc/snapshot.go:21 lxc/storage.go:33
@@ -794,6 +821,10 @@ msgstr ""
 msgid "Edit profile configurations as YAML"
 msgstr ""
 
+#: lxc/project.go:176 lxc/project.go:177
+msgid "Edit project configurations as YAML"
+msgstr ""
+
 #: lxc/storage.go:212 lxc/storage.go:213
 msgid "Edit storage pool configurations as YAML"
 msgstr ""
@@ -908,7 +939,7 @@ msgstr ""
 msgid "FINGERPRINT"
 msgstr ""
 
-#: lxc/move.go:213
+#: lxc/move.go:214
 msgid "Failed to connect to cluster member"
 msgstr ""
 
@@ -1012,6 +1043,10 @@ msgstr ""
 msgid "ID"
 msgstr ""
 
+#: lxc/project.go:367
+msgid "IMAGES"
+msgstr ""
+
 #: lxc/network.go:964
 msgid "IP ADDRESS"
 msgstr ""
@@ -1028,7 +1063,7 @@ msgstr ""
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:301
+#: lxc/main.go:305
 msgid ""
 "If this is your first time running LXD on this machine, you should also run: "
 "lxd init"
@@ -1038,7 +1073,7 @@ msgstr ""
 msgid "Ignore the container state"
 msgstr ""
 
-#: lxc/image.go:1284
+#: lxc/image.go:1285
 msgid "Image already up to date."
 msgstr ""
 
@@ -1050,7 +1085,7 @@ msgstr ""
 msgid "Image exported successfully!"
 msgstr ""
 
-#: lxc/image.go:288 lxc/image.go:1247
+#: lxc/image.go:288 lxc/image.go:1248
 msgid "Image identifier missing"
 msgstr ""
 
@@ -1064,7 +1099,7 @@ msgstr ""
 msgid "Image imported with fingerprint: %s"
 msgstr ""
 
-#: lxc/image.go:1282
+#: lxc/image.go:1283
 msgid "Image refreshed successfully!"
 msgstr ""
 
@@ -1119,7 +1154,7 @@ msgstr ""
 msgid "Invalid config key column format (too many fields): '%s'"
 msgstr ""
 
-#: lxc/image.go:1208 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
+#: lxc/image.go:1209 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
 #, c-format
 msgid "Invalid format %q"
 msgstr ""
@@ -1140,7 +1175,7 @@ msgid ""
 "Invalid name in '%s', empty string is only allowed when defining maxWidth"
 msgstr ""
 
-#: lxc/main.go:389
+#: lxc/main.go:393
 msgid "Invalid number of arguments"
 msgstr ""
 
@@ -1336,6 +1371,10 @@ msgstr ""
 msgid "List profiles"
 msgstr ""
 
+#: lxc/project.go:297 lxc/project.go:298
+msgid "List projects"
+msgstr ""
+
 #: lxc/storage_volume.go:911 lxc/storage_volume.go:912
 msgid "List storage volumes"
 msgstr ""
@@ -1454,6 +1493,10 @@ msgstr ""
 msgid "Manage profiles"
 msgstr ""
 
+#: lxc/project.go:28 lxc/project.go:29
+msgid "Manage projects"
+msgstr ""
+
 #: lxc/storage.go:32 lxc/storage.go:33
 msgid "Manage storage pools and volumes"
 msgstr ""
@@ -1500,11 +1543,11 @@ msgstr ""
 msgid "Memory usage:"
 msgstr ""
 
-#: lxc/move.go:226
+#: lxc/move.go:227
 msgid "Migration API failure"
 msgstr ""
 
-#: lxc/move.go:231
+#: lxc/move.go:232
 msgid "Migration operation failure"
 msgstr ""
 
@@ -1552,6 +1595,11 @@ msgstr ""
 msgid "Missing profile name"
 msgstr ""
 
+#: lxc/project.go:97 lxc/project.go:151 lxc/project.go:221 lxc/project.go:412
+#: lxc/project.go:467
+msgid "Missing project name"
+msgstr ""
+
 #: lxc/profile.go:270
 msgid "Missing source profile name"
 msgstr ""
@@ -1610,11 +1658,13 @@ msgid "Must supply container name for: "
 msgstr ""
 
 #: lxc/cluster.go:124 lxc/list.go:459 lxc/network.go:858 lxc/profile.go:622
-#: lxc/remote.go:465 lxc/storage.go:549 lxc/storage_volume.go:960
+#: lxc/project.go:366 lxc/remote.go:465 lxc/storage.go:549
+#: lxc/storage_volume.go:960
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:844 lxc/operation.go:141 lxc/remote.go:440 lxc/remote.go:445
+#: lxc/network.go:844 lxc/operation.go:141 lxc/project.go:342
+#: lxc/project.go:347 lxc/remote.go:440 lxc/remote.go:445
 msgid "NO"
 msgstr ""
 
@@ -1721,7 +1771,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:462
+#: lxc/list.go:462 lxc/project.go:368
 msgid "PROFILES"
 msgstr ""
 
@@ -1750,7 +1800,7 @@ msgstr ""
 msgid "Pid: %d"
 msgstr ""
 
-#: lxc/network.go:643 lxc/profile.go:500 lxc/storage.go:304
+#: lxc/network.go:643 lxc/profile.go:500 lxc/project.go:268 lxc/storage.go:304
 #: lxc/storage_volume.go:817
 msgid "Press enter to open the editor again"
 msgstr ""
@@ -1834,6 +1884,21 @@ msgstr ""
 msgid "Profiles: %s"
 msgstr ""
 
+#: lxc/project.go:110
+#, c-format
+msgid "Project %s created"
+msgstr ""
+
+#: lxc/project.go:161
+#, c-format
+msgid "Project %s deleted"
+msgstr ""
+
+#: lxc/project.go:427
+#, c-format
+msgid "Project %s renamed to %s"
+msgstr ""
+
 #: lxc/image.go:861
 msgid "Properties:"
 msgstr ""
@@ -1873,11 +1938,11 @@ msgstr ""
 msgid "Recursively transfer files"
 msgstr ""
 
-#: lxc/image.go:1223 lxc/image.go:1224
+#: lxc/image.go:1224 lxc/image.go:1225
 msgid "Refresh images"
 msgstr ""
 
-#: lxc/image.go:1252
+#: lxc/image.go:1253
 #, c-format
 msgid "Refreshing the image: %s"
 msgstr ""
@@ -1887,7 +1952,8 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656 lxc/remote.go:694
+#: lxc/project.go:523 lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656
+#: lxc/remote.go:694
 #, c-format
 msgid "Remote %s doesn't exist"
 msgstr ""
@@ -1965,6 +2031,10 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
+#: lxc/project.go:387 lxc/project.go:388
+msgid "Rename projects"
+msgstr ""
+
 #: lxc/remote.go:523 lxc/remote.go:524
 msgid "Rename remotes"
 msgstr ""
@@ -2150,11 +2220,11 @@ msgstr ""
 msgid "Show full device configuration for containers or profiles"
 msgstr ""
 
-#: lxc/image.go:1300 lxc/image.go:1301
+#: lxc/image.go:1301 lxc/image.go:1302
 msgid "Show image properties"
 msgstr ""
 
-#: lxc/main.go:215 lxc/main.go:216
+#: lxc/main.go:219 lxc/main.go:220
 msgid "Show less common commands"
 msgstr ""
 
@@ -2170,6 +2240,10 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
+#: lxc/project.go:442 lxc/project.go:443
+msgid "Show project options"
+msgstr ""
+
 #: lxc/storage.go:649 lxc/storage.go:650
 msgid "Show storage pool configurations and resources"
 msgstr ""
@@ -2317,6 +2391,10 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
+#: lxc/project.go:495 lxc/project.go:496
+msgid "Switch the current project"
+msgstr ""
+
 #: lxc/remote.go:635 lxc/remote.go:636
 msgid "Switch the default remote"
 msgstr ""
@@ -2379,7 +2457,7 @@ msgstr ""
 msgid "The profile device doesn't exist"
 msgstr ""
 
-#: lxc/move.go:218
+#: lxc/move.go:219
 msgid "The source LXD instance is not clustered"
 msgstr ""
 
@@ -2416,7 +2494,7 @@ msgstr ""
 msgid "To detach from the console, press: <ctrl>+a q"
 msgstr ""
 
-#: lxc/main.go:304
+#: lxc/main.go:308
 msgid "To start your first container, try: lxc launch ubuntu:18.04"
 msgstr ""
 
@@ -2467,7 +2545,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:862 lxc/profile.go:623 lxc/storage.go:558
+#: lxc/network.go:862 lxc/profile.go:623 lxc/project.go:369 lxc/storage.go:558
 #: lxc/storage_volume.go:962
 msgid "USED BY"
 msgstr ""
@@ -2552,7 +2630,8 @@ msgstr ""
 msgid "Whether or not to snapshot the container's running state"
 msgstr ""
 
-#: lxc/network.go:846 lxc/operation.go:143 lxc/remote.go:442 lxc/remote.go:447
+#: lxc/network.go:846 lxc/operation.go:143 lxc/project.go:344
+#: lxc/project.go:349 lxc/remote.go:442 lxc/remote.go:447
 msgid "YES"
 msgstr ""
 
@@ -2568,7 +2647,7 @@ msgstr ""
 msgid "You must specify a destination container name when using --target"
 msgstr ""
 
-#: lxc/copy.go:72 lxc/move.go:202
+#: lxc/copy.go:72 lxc/move.go:203
 msgid "You must specify a source container name"
 msgstr ""
 
@@ -2672,6 +2751,14 @@ msgstr ""
 msgid "create [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:71
+msgid "create [<remote>:]<project>"
+msgstr ""
+
+#: lxc/project.go:354
+msgid "current"
+msgstr ""
+
 #: lxc/remote.go:459
 msgid "default"
 msgstr ""
@@ -2718,6 +2805,10 @@ msgstr ""
 msgid "delete [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:124
+msgid "delete [<remote>:]<project>"
+msgstr ""
+
 #: lxc/storage.go:436
 msgid "description"
 msgstr ""
@@ -2786,6 +2877,10 @@ msgstr ""
 msgid "edit [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:175
+msgid "edit [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:86
 msgid "edit [<remote>:][<container>]"
 msgstr ""
@@ -2896,7 +2991,7 @@ msgid "list"
 msgstr ""
 
 #: lxc/cluster.go:61 lxc/config_trust.go:112 lxc/network.go:796
-#: lxc/operation.go:98 lxc/profile.go:574 lxc/storage.go:493
+#: lxc/operation.go:98 lxc/profile.go:574 lxc/project.go:295 lxc/storage.go:493
 msgid "list [<remote>:]"
 msgstr ""
 
@@ -3081,6 +3176,12 @@ msgid ""
 "    Update a profile using the content of profile.yaml"
 msgstr ""
 
+#: lxc/project.go:179
+msgid ""
+"lxc project edit <project> < project.yaml\n"
+"    Update a project using the content of project.yaml"
+msgstr ""
+
 #: lxc/query.go:32
 msgid ""
 "lxc query -X DELETE --wait /1.0/containers/c1\n"
@@ -3183,6 +3284,10 @@ msgstr ""
 msgid "profile"
 msgstr ""
 
+#: lxc/project.go:27
+msgid "project"
+msgstr ""
+
 #: lxc/publish.go:32
 msgid ""
 "publish [<remote>:]<container>[/<snapshot>] [<remote>:] [flags] "
@@ -3205,7 +3310,7 @@ msgstr ""
 msgid "query [<remote>:]<API path>"
 msgstr ""
 
-#: lxc/image.go:1222
+#: lxc/image.go:1223
 msgid "refresh [<remote>:]<image> [[<remote>:]<image>...]"
 msgstr ""
 
@@ -3269,6 +3374,10 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
+#: lxc/project.go:385
+msgid "rename [<remote>:]<project> <new-name>"
+msgstr ""
+
 #: lxc/action.go:68
 msgid "restart [<remote>:]<container> [[<remote>:]<container>...]"
 msgstr ""
@@ -3317,7 +3426,7 @@ msgstr ""
 msgid "show [<remote>:]<container|profile>"
 msgstr ""
 
-#: lxc/image.go:1299
+#: lxc/image.go:1300
 msgid "show [<remote>:]<image>"
 msgstr ""
 
@@ -3345,6 +3454,10 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:441
+msgid "show [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:450
 msgid "show [<remote>:][<container>]"
 msgstr ""
@@ -3381,6 +3494,10 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
+#: lxc/project.go:494
+msgid "switch [<remote>:] <project>"
+msgstr ""
+
 #: lxc/info.go:255
 #, c-format
 msgid "taken at %s"
diff --git a/po/sv.po b/po/sv.po
index 7025ac12b1..8b90692661 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: 2018-08-23 15:14-0400\n"
+"POT-Creation-Date: 2018-09-02 06:35+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -143,6 +143,23 @@ msgid ""
 "### Note that the name is shown but cannot be changed"
 msgstr ""
 
+#: lxc/project.go:189
+msgid ""
+"### This is a yaml representation of the project.\n"
+"### Any line starting with a '# will be ignored.\n"
+"###\n"
+"### A project consists of a set of features and a description.\n"
+"###\n"
+"### An example would look like:\n"
+"### name: my-project\n"
+"### features:\n"
+"###   images: True\n"
+"###   profiles: True\n"
+"### description: My own project\n"
+"###\n"
+"### Note that the name is shown but cannot be changed"
+msgstr ""
+
 #: lxc/image.go:966
 #, c-format
 msgid "%s (%d more)"
@@ -453,8 +470,8 @@ msgid "Config key/value to apply to the target container"
 msgstr ""
 
 #: lxc/config.go:195 lxc/config.go:259 lxc/config_metadata.go:144
-#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/storage.go:303
-#: lxc/storage_volume.go:816
+#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/project.go:267
+#: lxc/storage.go:303 lxc/storage_volume.go:816
 #, c-format
 msgid "Config parsing error: %s"
 msgstr ""
@@ -575,6 +592,10 @@ msgstr ""
 msgid "Create profiles"
 msgstr ""
 
+#: lxc/project.go:72 lxc/project.go:73
+msgid "Create projects"
+msgstr ""
+
 #: lxc/storage.go:88 lxc/storage.go:89
 msgid "Create storage pools"
 msgstr ""
@@ -646,6 +667,10 @@ msgstr ""
 msgid "Delete profiles"
 msgstr ""
 
+#: lxc/project.go:126 lxc/project.go:127
+msgid "Delete projects"
+msgstr ""
+
 #: lxc/storage.go:162 lxc/storage.go:163
 msgid "Delete storage pools"
 msgstr ""
@@ -672,7 +697,7 @@ msgstr ""
 #: lxc/file.go:42 lxc/file.go:75 lxc/file.go:124 lxc/file.go:187
 #: lxc/file.go:377 lxc/image.go:42 lxc/image.go:131 lxc/image.go:265
 #: lxc/image.go:316 lxc/image.go:439 lxc/image.go:579 lxc/image.go:788
-#: lxc/image.go:902 lxc/image.go:1224 lxc/image.go:1301 lxc/image_alias.go:26
+#: lxc/image.go:902 lxc/image.go:1225 lxc/image.go:1302 lxc/image_alias.go:26
 #: lxc/image_alias.go:59 lxc/image_alias.go:106 lxc/image_alias.go:149
 #: lxc/image_alias.go:250 lxc/import.go:25 lxc/info.go:29 lxc/init.go:35
 #: lxc/launch.go:22 lxc/list.go:48 lxc/main.go:48 lxc/manpage.go:19
@@ -685,7 +710,9 @@ msgstr ""
 #: lxc/profile.go:30 lxc/profile.go:102 lxc/profile.go:165 lxc/profile.go:245
 #: lxc/profile.go:301 lxc/profile.go:355 lxc/profile.go:405 lxc/profile.go:529
 #: lxc/profile.go:577 lxc/profile.go:641 lxc/profile.go:717 lxc/profile.go:767
-#: lxc/profile.go:826 lxc/profile.go:880 lxc/publish.go:34 lxc/query.go:30
+#: lxc/profile.go:826 lxc/profile.go:880 lxc/project.go:29 lxc/project.go:73
+#: lxc/project.go:127 lxc/project.go:177 lxc/project.go:298 lxc/project.go:388
+#: lxc/project.go:443 lxc/project.go:496 lxc/publish.go:34 lxc/query.go:30
 #: lxc/remote.go:37 lxc/remote.go:87 lxc/remote.go:383 lxc/remote.go:419
 #: lxc/remote.go:524 lxc/remote.go:586 lxc/remote.go:636 lxc/remote.go:674
 #: lxc/rename.go:21 lxc/restore.go:24 lxc/snapshot.go:21 lxc/storage.go:33
@@ -794,6 +821,10 @@ msgstr ""
 msgid "Edit profile configurations as YAML"
 msgstr ""
 
+#: lxc/project.go:176 lxc/project.go:177
+msgid "Edit project configurations as YAML"
+msgstr ""
+
 #: lxc/storage.go:212 lxc/storage.go:213
 msgid "Edit storage pool configurations as YAML"
 msgstr ""
@@ -908,7 +939,7 @@ msgstr ""
 msgid "FINGERPRINT"
 msgstr ""
 
-#: lxc/move.go:213
+#: lxc/move.go:214
 msgid "Failed to connect to cluster member"
 msgstr ""
 
@@ -1012,6 +1043,10 @@ msgstr ""
 msgid "ID"
 msgstr ""
 
+#: lxc/project.go:367
+msgid "IMAGES"
+msgstr ""
+
 #: lxc/network.go:964
 msgid "IP ADDRESS"
 msgstr ""
@@ -1028,7 +1063,7 @@ msgstr ""
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:301
+#: lxc/main.go:305
 msgid ""
 "If this is your first time running LXD on this machine, you should also run: "
 "lxd init"
@@ -1038,7 +1073,7 @@ msgstr ""
 msgid "Ignore the container state"
 msgstr ""
 
-#: lxc/image.go:1284
+#: lxc/image.go:1285
 msgid "Image already up to date."
 msgstr ""
 
@@ -1050,7 +1085,7 @@ msgstr ""
 msgid "Image exported successfully!"
 msgstr ""
 
-#: lxc/image.go:288 lxc/image.go:1247
+#: lxc/image.go:288 lxc/image.go:1248
 msgid "Image identifier missing"
 msgstr ""
 
@@ -1064,7 +1099,7 @@ msgstr ""
 msgid "Image imported with fingerprint: %s"
 msgstr ""
 
-#: lxc/image.go:1282
+#: lxc/image.go:1283
 msgid "Image refreshed successfully!"
 msgstr ""
 
@@ -1119,7 +1154,7 @@ msgstr ""
 msgid "Invalid config key column format (too many fields): '%s'"
 msgstr ""
 
-#: lxc/image.go:1208 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
+#: lxc/image.go:1209 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
 #, c-format
 msgid "Invalid format %q"
 msgstr ""
@@ -1140,7 +1175,7 @@ msgid ""
 "Invalid name in '%s', empty string is only allowed when defining maxWidth"
 msgstr ""
 
-#: lxc/main.go:389
+#: lxc/main.go:393
 msgid "Invalid number of arguments"
 msgstr ""
 
@@ -1336,6 +1371,10 @@ msgstr ""
 msgid "List profiles"
 msgstr ""
 
+#: lxc/project.go:297 lxc/project.go:298
+msgid "List projects"
+msgstr ""
+
 #: lxc/storage_volume.go:911 lxc/storage_volume.go:912
 msgid "List storage volumes"
 msgstr ""
@@ -1454,6 +1493,10 @@ msgstr ""
 msgid "Manage profiles"
 msgstr ""
 
+#: lxc/project.go:28 lxc/project.go:29
+msgid "Manage projects"
+msgstr ""
+
 #: lxc/storage.go:32 lxc/storage.go:33
 msgid "Manage storage pools and volumes"
 msgstr ""
@@ -1500,11 +1543,11 @@ msgstr ""
 msgid "Memory usage:"
 msgstr ""
 
-#: lxc/move.go:226
+#: lxc/move.go:227
 msgid "Migration API failure"
 msgstr ""
 
-#: lxc/move.go:231
+#: lxc/move.go:232
 msgid "Migration operation failure"
 msgstr ""
 
@@ -1552,6 +1595,11 @@ msgstr ""
 msgid "Missing profile name"
 msgstr ""
 
+#: lxc/project.go:97 lxc/project.go:151 lxc/project.go:221 lxc/project.go:412
+#: lxc/project.go:467
+msgid "Missing project name"
+msgstr ""
+
 #: lxc/profile.go:270
 msgid "Missing source profile name"
 msgstr ""
@@ -1610,11 +1658,13 @@ msgid "Must supply container name for: "
 msgstr ""
 
 #: lxc/cluster.go:124 lxc/list.go:459 lxc/network.go:858 lxc/profile.go:622
-#: lxc/remote.go:465 lxc/storage.go:549 lxc/storage_volume.go:960
+#: lxc/project.go:366 lxc/remote.go:465 lxc/storage.go:549
+#: lxc/storage_volume.go:960
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:844 lxc/operation.go:141 lxc/remote.go:440 lxc/remote.go:445
+#: lxc/network.go:844 lxc/operation.go:141 lxc/project.go:342
+#: lxc/project.go:347 lxc/remote.go:440 lxc/remote.go:445
 msgid "NO"
 msgstr ""
 
@@ -1721,7 +1771,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:462
+#: lxc/list.go:462 lxc/project.go:368
 msgid "PROFILES"
 msgstr ""
 
@@ -1750,7 +1800,7 @@ msgstr ""
 msgid "Pid: %d"
 msgstr ""
 
-#: lxc/network.go:643 lxc/profile.go:500 lxc/storage.go:304
+#: lxc/network.go:643 lxc/profile.go:500 lxc/project.go:268 lxc/storage.go:304
 #: lxc/storage_volume.go:817
 msgid "Press enter to open the editor again"
 msgstr ""
@@ -1834,6 +1884,21 @@ msgstr ""
 msgid "Profiles: %s"
 msgstr ""
 
+#: lxc/project.go:110
+#, c-format
+msgid "Project %s created"
+msgstr ""
+
+#: lxc/project.go:161
+#, c-format
+msgid "Project %s deleted"
+msgstr ""
+
+#: lxc/project.go:427
+#, c-format
+msgid "Project %s renamed to %s"
+msgstr ""
+
 #: lxc/image.go:861
 msgid "Properties:"
 msgstr ""
@@ -1873,11 +1938,11 @@ msgstr ""
 msgid "Recursively transfer files"
 msgstr ""
 
-#: lxc/image.go:1223 lxc/image.go:1224
+#: lxc/image.go:1224 lxc/image.go:1225
 msgid "Refresh images"
 msgstr ""
 
-#: lxc/image.go:1252
+#: lxc/image.go:1253
 #, c-format
 msgid "Refreshing the image: %s"
 msgstr ""
@@ -1887,7 +1952,8 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656 lxc/remote.go:694
+#: lxc/project.go:523 lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656
+#: lxc/remote.go:694
 #, c-format
 msgid "Remote %s doesn't exist"
 msgstr ""
@@ -1965,6 +2031,10 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
+#: lxc/project.go:387 lxc/project.go:388
+msgid "Rename projects"
+msgstr ""
+
 #: lxc/remote.go:523 lxc/remote.go:524
 msgid "Rename remotes"
 msgstr ""
@@ -2150,11 +2220,11 @@ msgstr ""
 msgid "Show full device configuration for containers or profiles"
 msgstr ""
 
-#: lxc/image.go:1300 lxc/image.go:1301
+#: lxc/image.go:1301 lxc/image.go:1302
 msgid "Show image properties"
 msgstr ""
 
-#: lxc/main.go:215 lxc/main.go:216
+#: lxc/main.go:219 lxc/main.go:220
 msgid "Show less common commands"
 msgstr ""
 
@@ -2170,6 +2240,10 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
+#: lxc/project.go:442 lxc/project.go:443
+msgid "Show project options"
+msgstr ""
+
 #: lxc/storage.go:649 lxc/storage.go:650
 msgid "Show storage pool configurations and resources"
 msgstr ""
@@ -2317,6 +2391,10 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
+#: lxc/project.go:495 lxc/project.go:496
+msgid "Switch the current project"
+msgstr ""
+
 #: lxc/remote.go:635 lxc/remote.go:636
 msgid "Switch the default remote"
 msgstr ""
@@ -2379,7 +2457,7 @@ msgstr ""
 msgid "The profile device doesn't exist"
 msgstr ""
 
-#: lxc/move.go:218
+#: lxc/move.go:219
 msgid "The source LXD instance is not clustered"
 msgstr ""
 
@@ -2416,7 +2494,7 @@ msgstr ""
 msgid "To detach from the console, press: <ctrl>+a q"
 msgstr ""
 
-#: lxc/main.go:304
+#: lxc/main.go:308
 msgid "To start your first container, try: lxc launch ubuntu:18.04"
 msgstr ""
 
@@ -2467,7 +2545,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:862 lxc/profile.go:623 lxc/storage.go:558
+#: lxc/network.go:862 lxc/profile.go:623 lxc/project.go:369 lxc/storage.go:558
 #: lxc/storage_volume.go:962
 msgid "USED BY"
 msgstr ""
@@ -2552,7 +2630,8 @@ msgstr ""
 msgid "Whether or not to snapshot the container's running state"
 msgstr ""
 
-#: lxc/network.go:846 lxc/operation.go:143 lxc/remote.go:442 lxc/remote.go:447
+#: lxc/network.go:846 lxc/operation.go:143 lxc/project.go:344
+#: lxc/project.go:349 lxc/remote.go:442 lxc/remote.go:447
 msgid "YES"
 msgstr ""
 
@@ -2568,7 +2647,7 @@ msgstr ""
 msgid "You must specify a destination container name when using --target"
 msgstr ""
 
-#: lxc/copy.go:72 lxc/move.go:202
+#: lxc/copy.go:72 lxc/move.go:203
 msgid "You must specify a source container name"
 msgstr ""
 
@@ -2672,6 +2751,14 @@ msgstr ""
 msgid "create [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:71
+msgid "create [<remote>:]<project>"
+msgstr ""
+
+#: lxc/project.go:354
+msgid "current"
+msgstr ""
+
 #: lxc/remote.go:459
 msgid "default"
 msgstr ""
@@ -2718,6 +2805,10 @@ msgstr ""
 msgid "delete [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:124
+msgid "delete [<remote>:]<project>"
+msgstr ""
+
 #: lxc/storage.go:436
 msgid "description"
 msgstr ""
@@ -2786,6 +2877,10 @@ msgstr ""
 msgid "edit [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:175
+msgid "edit [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:86
 msgid "edit [<remote>:][<container>]"
 msgstr ""
@@ -2896,7 +2991,7 @@ msgid "list"
 msgstr ""
 
 #: lxc/cluster.go:61 lxc/config_trust.go:112 lxc/network.go:796
-#: lxc/operation.go:98 lxc/profile.go:574 lxc/storage.go:493
+#: lxc/operation.go:98 lxc/profile.go:574 lxc/project.go:295 lxc/storage.go:493
 msgid "list [<remote>:]"
 msgstr ""
 
@@ -3081,6 +3176,12 @@ msgid ""
 "    Update a profile using the content of profile.yaml"
 msgstr ""
 
+#: lxc/project.go:179
+msgid ""
+"lxc project edit <project> < project.yaml\n"
+"    Update a project using the content of project.yaml"
+msgstr ""
+
 #: lxc/query.go:32
 msgid ""
 "lxc query -X DELETE --wait /1.0/containers/c1\n"
@@ -3183,6 +3284,10 @@ msgstr ""
 msgid "profile"
 msgstr ""
 
+#: lxc/project.go:27
+msgid "project"
+msgstr ""
+
 #: lxc/publish.go:32
 msgid ""
 "publish [<remote>:]<container>[/<snapshot>] [<remote>:] [flags] "
@@ -3205,7 +3310,7 @@ msgstr ""
 msgid "query [<remote>:]<API path>"
 msgstr ""
 
-#: lxc/image.go:1222
+#: lxc/image.go:1223
 msgid "refresh [<remote>:]<image> [[<remote>:]<image>...]"
 msgstr ""
 
@@ -3269,6 +3374,10 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
+#: lxc/project.go:385
+msgid "rename [<remote>:]<project> <new-name>"
+msgstr ""
+
 #: lxc/action.go:68
 msgid "restart [<remote>:]<container> [[<remote>:]<container>...]"
 msgstr ""
@@ -3317,7 +3426,7 @@ msgstr ""
 msgid "show [<remote>:]<container|profile>"
 msgstr ""
 
-#: lxc/image.go:1299
+#: lxc/image.go:1300
 msgid "show [<remote>:]<image>"
 msgstr ""
 
@@ -3345,6 +3454,10 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:441
+msgid "show [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:450
 msgid "show [<remote>:][<container>]"
 msgstr ""
@@ -3381,6 +3494,10 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
+#: lxc/project.go:494
+msgid "switch [<remote>:] <project>"
+msgstr ""
+
 #: lxc/info.go:255
 #, c-format
 msgid "taken at %s"
diff --git a/po/tr.po b/po/tr.po
index 29544cdb53..43bf5c79ad 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: 2018-08-23 15:14-0400\n"
+"POT-Creation-Date: 2018-09-02 06:35+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -143,6 +143,23 @@ msgid ""
 "### Note that the name is shown but cannot be changed"
 msgstr ""
 
+#: lxc/project.go:189
+msgid ""
+"### This is a yaml representation of the project.\n"
+"### Any line starting with a '# will be ignored.\n"
+"###\n"
+"### A project consists of a set of features and a description.\n"
+"###\n"
+"### An example would look like:\n"
+"### name: my-project\n"
+"### features:\n"
+"###   images: True\n"
+"###   profiles: True\n"
+"### description: My own project\n"
+"###\n"
+"### Note that the name is shown but cannot be changed"
+msgstr ""
+
 #: lxc/image.go:966
 #, c-format
 msgid "%s (%d more)"
@@ -453,8 +470,8 @@ msgid "Config key/value to apply to the target container"
 msgstr ""
 
 #: lxc/config.go:195 lxc/config.go:259 lxc/config_metadata.go:144
-#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/storage.go:303
-#: lxc/storage_volume.go:816
+#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/project.go:267
+#: lxc/storage.go:303 lxc/storage_volume.go:816
 #, c-format
 msgid "Config parsing error: %s"
 msgstr ""
@@ -575,6 +592,10 @@ msgstr ""
 msgid "Create profiles"
 msgstr ""
 
+#: lxc/project.go:72 lxc/project.go:73
+msgid "Create projects"
+msgstr ""
+
 #: lxc/storage.go:88 lxc/storage.go:89
 msgid "Create storage pools"
 msgstr ""
@@ -646,6 +667,10 @@ msgstr ""
 msgid "Delete profiles"
 msgstr ""
 
+#: lxc/project.go:126 lxc/project.go:127
+msgid "Delete projects"
+msgstr ""
+
 #: lxc/storage.go:162 lxc/storage.go:163
 msgid "Delete storage pools"
 msgstr ""
@@ -672,7 +697,7 @@ msgstr ""
 #: lxc/file.go:42 lxc/file.go:75 lxc/file.go:124 lxc/file.go:187
 #: lxc/file.go:377 lxc/image.go:42 lxc/image.go:131 lxc/image.go:265
 #: lxc/image.go:316 lxc/image.go:439 lxc/image.go:579 lxc/image.go:788
-#: lxc/image.go:902 lxc/image.go:1224 lxc/image.go:1301 lxc/image_alias.go:26
+#: lxc/image.go:902 lxc/image.go:1225 lxc/image.go:1302 lxc/image_alias.go:26
 #: lxc/image_alias.go:59 lxc/image_alias.go:106 lxc/image_alias.go:149
 #: lxc/image_alias.go:250 lxc/import.go:25 lxc/info.go:29 lxc/init.go:35
 #: lxc/launch.go:22 lxc/list.go:48 lxc/main.go:48 lxc/manpage.go:19
@@ -685,7 +710,9 @@ msgstr ""
 #: lxc/profile.go:30 lxc/profile.go:102 lxc/profile.go:165 lxc/profile.go:245
 #: lxc/profile.go:301 lxc/profile.go:355 lxc/profile.go:405 lxc/profile.go:529
 #: lxc/profile.go:577 lxc/profile.go:641 lxc/profile.go:717 lxc/profile.go:767
-#: lxc/profile.go:826 lxc/profile.go:880 lxc/publish.go:34 lxc/query.go:30
+#: lxc/profile.go:826 lxc/profile.go:880 lxc/project.go:29 lxc/project.go:73
+#: lxc/project.go:127 lxc/project.go:177 lxc/project.go:298 lxc/project.go:388
+#: lxc/project.go:443 lxc/project.go:496 lxc/publish.go:34 lxc/query.go:30
 #: lxc/remote.go:37 lxc/remote.go:87 lxc/remote.go:383 lxc/remote.go:419
 #: lxc/remote.go:524 lxc/remote.go:586 lxc/remote.go:636 lxc/remote.go:674
 #: lxc/rename.go:21 lxc/restore.go:24 lxc/snapshot.go:21 lxc/storage.go:33
@@ -794,6 +821,10 @@ msgstr ""
 msgid "Edit profile configurations as YAML"
 msgstr ""
 
+#: lxc/project.go:176 lxc/project.go:177
+msgid "Edit project configurations as YAML"
+msgstr ""
+
 #: lxc/storage.go:212 lxc/storage.go:213
 msgid "Edit storage pool configurations as YAML"
 msgstr ""
@@ -908,7 +939,7 @@ msgstr ""
 msgid "FINGERPRINT"
 msgstr ""
 
-#: lxc/move.go:213
+#: lxc/move.go:214
 msgid "Failed to connect to cluster member"
 msgstr ""
 
@@ -1012,6 +1043,10 @@ msgstr ""
 msgid "ID"
 msgstr ""
 
+#: lxc/project.go:367
+msgid "IMAGES"
+msgstr ""
+
 #: lxc/network.go:964
 msgid "IP ADDRESS"
 msgstr ""
@@ -1028,7 +1063,7 @@ msgstr ""
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:301
+#: lxc/main.go:305
 msgid ""
 "If this is your first time running LXD on this machine, you should also run: "
 "lxd init"
@@ -1038,7 +1073,7 @@ msgstr ""
 msgid "Ignore the container state"
 msgstr ""
 
-#: lxc/image.go:1284
+#: lxc/image.go:1285
 msgid "Image already up to date."
 msgstr ""
 
@@ -1050,7 +1085,7 @@ msgstr ""
 msgid "Image exported successfully!"
 msgstr ""
 
-#: lxc/image.go:288 lxc/image.go:1247
+#: lxc/image.go:288 lxc/image.go:1248
 msgid "Image identifier missing"
 msgstr ""
 
@@ -1064,7 +1099,7 @@ msgstr ""
 msgid "Image imported with fingerprint: %s"
 msgstr ""
 
-#: lxc/image.go:1282
+#: lxc/image.go:1283
 msgid "Image refreshed successfully!"
 msgstr ""
 
@@ -1119,7 +1154,7 @@ msgstr ""
 msgid "Invalid config key column format (too many fields): '%s'"
 msgstr ""
 
-#: lxc/image.go:1208 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
+#: lxc/image.go:1209 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
 #, c-format
 msgid "Invalid format %q"
 msgstr ""
@@ -1140,7 +1175,7 @@ msgid ""
 "Invalid name in '%s', empty string is only allowed when defining maxWidth"
 msgstr ""
 
-#: lxc/main.go:389
+#: lxc/main.go:393
 msgid "Invalid number of arguments"
 msgstr ""
 
@@ -1336,6 +1371,10 @@ msgstr ""
 msgid "List profiles"
 msgstr ""
 
+#: lxc/project.go:297 lxc/project.go:298
+msgid "List projects"
+msgstr ""
+
 #: lxc/storage_volume.go:911 lxc/storage_volume.go:912
 msgid "List storage volumes"
 msgstr ""
@@ -1454,6 +1493,10 @@ msgstr ""
 msgid "Manage profiles"
 msgstr ""
 
+#: lxc/project.go:28 lxc/project.go:29
+msgid "Manage projects"
+msgstr ""
+
 #: lxc/storage.go:32 lxc/storage.go:33
 msgid "Manage storage pools and volumes"
 msgstr ""
@@ -1500,11 +1543,11 @@ msgstr ""
 msgid "Memory usage:"
 msgstr ""
 
-#: lxc/move.go:226
+#: lxc/move.go:227
 msgid "Migration API failure"
 msgstr ""
 
-#: lxc/move.go:231
+#: lxc/move.go:232
 msgid "Migration operation failure"
 msgstr ""
 
@@ -1552,6 +1595,11 @@ msgstr ""
 msgid "Missing profile name"
 msgstr ""
 
+#: lxc/project.go:97 lxc/project.go:151 lxc/project.go:221 lxc/project.go:412
+#: lxc/project.go:467
+msgid "Missing project name"
+msgstr ""
+
 #: lxc/profile.go:270
 msgid "Missing source profile name"
 msgstr ""
@@ -1610,11 +1658,13 @@ msgid "Must supply container name for: "
 msgstr ""
 
 #: lxc/cluster.go:124 lxc/list.go:459 lxc/network.go:858 lxc/profile.go:622
-#: lxc/remote.go:465 lxc/storage.go:549 lxc/storage_volume.go:960
+#: lxc/project.go:366 lxc/remote.go:465 lxc/storage.go:549
+#: lxc/storage_volume.go:960
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:844 lxc/operation.go:141 lxc/remote.go:440 lxc/remote.go:445
+#: lxc/network.go:844 lxc/operation.go:141 lxc/project.go:342
+#: lxc/project.go:347 lxc/remote.go:440 lxc/remote.go:445
 msgid "NO"
 msgstr ""
 
@@ -1721,7 +1771,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:462
+#: lxc/list.go:462 lxc/project.go:368
 msgid "PROFILES"
 msgstr ""
 
@@ -1750,7 +1800,7 @@ msgstr ""
 msgid "Pid: %d"
 msgstr ""
 
-#: lxc/network.go:643 lxc/profile.go:500 lxc/storage.go:304
+#: lxc/network.go:643 lxc/profile.go:500 lxc/project.go:268 lxc/storage.go:304
 #: lxc/storage_volume.go:817
 msgid "Press enter to open the editor again"
 msgstr ""
@@ -1834,6 +1884,21 @@ msgstr ""
 msgid "Profiles: %s"
 msgstr ""
 
+#: lxc/project.go:110
+#, c-format
+msgid "Project %s created"
+msgstr ""
+
+#: lxc/project.go:161
+#, c-format
+msgid "Project %s deleted"
+msgstr ""
+
+#: lxc/project.go:427
+#, c-format
+msgid "Project %s renamed to %s"
+msgstr ""
+
 #: lxc/image.go:861
 msgid "Properties:"
 msgstr ""
@@ -1873,11 +1938,11 @@ msgstr ""
 msgid "Recursively transfer files"
 msgstr ""
 
-#: lxc/image.go:1223 lxc/image.go:1224
+#: lxc/image.go:1224 lxc/image.go:1225
 msgid "Refresh images"
 msgstr ""
 
-#: lxc/image.go:1252
+#: lxc/image.go:1253
 #, c-format
 msgid "Refreshing the image: %s"
 msgstr ""
@@ -1887,7 +1952,8 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656 lxc/remote.go:694
+#: lxc/project.go:523 lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656
+#: lxc/remote.go:694
 #, c-format
 msgid "Remote %s doesn't exist"
 msgstr ""
@@ -1965,6 +2031,10 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
+#: lxc/project.go:387 lxc/project.go:388
+msgid "Rename projects"
+msgstr ""
+
 #: lxc/remote.go:523 lxc/remote.go:524
 msgid "Rename remotes"
 msgstr ""
@@ -2150,11 +2220,11 @@ msgstr ""
 msgid "Show full device configuration for containers or profiles"
 msgstr ""
 
-#: lxc/image.go:1300 lxc/image.go:1301
+#: lxc/image.go:1301 lxc/image.go:1302
 msgid "Show image properties"
 msgstr ""
 
-#: lxc/main.go:215 lxc/main.go:216
+#: lxc/main.go:219 lxc/main.go:220
 msgid "Show less common commands"
 msgstr ""
 
@@ -2170,6 +2240,10 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
+#: lxc/project.go:442 lxc/project.go:443
+msgid "Show project options"
+msgstr ""
+
 #: lxc/storage.go:649 lxc/storage.go:650
 msgid "Show storage pool configurations and resources"
 msgstr ""
@@ -2317,6 +2391,10 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
+#: lxc/project.go:495 lxc/project.go:496
+msgid "Switch the current project"
+msgstr ""
+
 #: lxc/remote.go:635 lxc/remote.go:636
 msgid "Switch the default remote"
 msgstr ""
@@ -2379,7 +2457,7 @@ msgstr ""
 msgid "The profile device doesn't exist"
 msgstr ""
 
-#: lxc/move.go:218
+#: lxc/move.go:219
 msgid "The source LXD instance is not clustered"
 msgstr ""
 
@@ -2416,7 +2494,7 @@ msgstr ""
 msgid "To detach from the console, press: <ctrl>+a q"
 msgstr ""
 
-#: lxc/main.go:304
+#: lxc/main.go:308
 msgid "To start your first container, try: lxc launch ubuntu:18.04"
 msgstr ""
 
@@ -2467,7 +2545,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:862 lxc/profile.go:623 lxc/storage.go:558
+#: lxc/network.go:862 lxc/profile.go:623 lxc/project.go:369 lxc/storage.go:558
 #: lxc/storage_volume.go:962
 msgid "USED BY"
 msgstr ""
@@ -2552,7 +2630,8 @@ msgstr ""
 msgid "Whether or not to snapshot the container's running state"
 msgstr ""
 
-#: lxc/network.go:846 lxc/operation.go:143 lxc/remote.go:442 lxc/remote.go:447
+#: lxc/network.go:846 lxc/operation.go:143 lxc/project.go:344
+#: lxc/project.go:349 lxc/remote.go:442 lxc/remote.go:447
 msgid "YES"
 msgstr ""
 
@@ -2568,7 +2647,7 @@ msgstr ""
 msgid "You must specify a destination container name when using --target"
 msgstr ""
 
-#: lxc/copy.go:72 lxc/move.go:202
+#: lxc/copy.go:72 lxc/move.go:203
 msgid "You must specify a source container name"
 msgstr ""
 
@@ -2672,6 +2751,14 @@ msgstr ""
 msgid "create [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:71
+msgid "create [<remote>:]<project>"
+msgstr ""
+
+#: lxc/project.go:354
+msgid "current"
+msgstr ""
+
 #: lxc/remote.go:459
 msgid "default"
 msgstr ""
@@ -2718,6 +2805,10 @@ msgstr ""
 msgid "delete [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:124
+msgid "delete [<remote>:]<project>"
+msgstr ""
+
 #: lxc/storage.go:436
 msgid "description"
 msgstr ""
@@ -2786,6 +2877,10 @@ msgstr ""
 msgid "edit [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:175
+msgid "edit [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:86
 msgid "edit [<remote>:][<container>]"
 msgstr ""
@@ -2896,7 +2991,7 @@ msgid "list"
 msgstr ""
 
 #: lxc/cluster.go:61 lxc/config_trust.go:112 lxc/network.go:796
-#: lxc/operation.go:98 lxc/profile.go:574 lxc/storage.go:493
+#: lxc/operation.go:98 lxc/profile.go:574 lxc/project.go:295 lxc/storage.go:493
 msgid "list [<remote>:]"
 msgstr ""
 
@@ -3081,6 +3176,12 @@ msgid ""
 "    Update a profile using the content of profile.yaml"
 msgstr ""
 
+#: lxc/project.go:179
+msgid ""
+"lxc project edit <project> < project.yaml\n"
+"    Update a project using the content of project.yaml"
+msgstr ""
+
 #: lxc/query.go:32
 msgid ""
 "lxc query -X DELETE --wait /1.0/containers/c1\n"
@@ -3183,6 +3284,10 @@ msgstr ""
 msgid "profile"
 msgstr ""
 
+#: lxc/project.go:27
+msgid "project"
+msgstr ""
+
 #: lxc/publish.go:32
 msgid ""
 "publish [<remote>:]<container>[/<snapshot>] [<remote>:] [flags] "
@@ -3205,7 +3310,7 @@ msgstr ""
 msgid "query [<remote>:]<API path>"
 msgstr ""
 
-#: lxc/image.go:1222
+#: lxc/image.go:1223
 msgid "refresh [<remote>:]<image> [[<remote>:]<image>...]"
 msgstr ""
 
@@ -3269,6 +3374,10 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
+#: lxc/project.go:385
+msgid "rename [<remote>:]<project> <new-name>"
+msgstr ""
+
 #: lxc/action.go:68
 msgid "restart [<remote>:]<container> [[<remote>:]<container>...]"
 msgstr ""
@@ -3317,7 +3426,7 @@ msgstr ""
 msgid "show [<remote>:]<container|profile>"
 msgstr ""
 
-#: lxc/image.go:1299
+#: lxc/image.go:1300
 msgid "show [<remote>:]<image>"
 msgstr ""
 
@@ -3345,6 +3454,10 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:441
+msgid "show [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:450
 msgid "show [<remote>:][<container>]"
 msgstr ""
@@ -3381,6 +3494,10 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
+#: lxc/project.go:494
+msgid "switch [<remote>:] <project>"
+msgstr ""
+
 #: lxc/info.go:255
 #, c-format
 msgid "taken at %s"
diff --git a/po/uk.po b/po/uk.po
index 2a2715a72e..8dd9c228c5 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: 2018-08-23 15:14-0400\n"
+"POT-Creation-Date: 2018-09-02 06:35+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -143,6 +143,23 @@ msgid ""
 "### Note that the name is shown but cannot be changed"
 msgstr ""
 
+#: lxc/project.go:189
+msgid ""
+"### This is a yaml representation of the project.\n"
+"### Any line starting with a '# will be ignored.\n"
+"###\n"
+"### A project consists of a set of features and a description.\n"
+"###\n"
+"### An example would look like:\n"
+"### name: my-project\n"
+"### features:\n"
+"###   images: True\n"
+"###   profiles: True\n"
+"### description: My own project\n"
+"###\n"
+"### Note that the name is shown but cannot be changed"
+msgstr ""
+
 #: lxc/image.go:966
 #, c-format
 msgid "%s (%d more)"
@@ -453,8 +470,8 @@ msgid "Config key/value to apply to the target container"
 msgstr ""
 
 #: lxc/config.go:195 lxc/config.go:259 lxc/config_metadata.go:144
-#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/storage.go:303
-#: lxc/storage_volume.go:816
+#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/project.go:267
+#: lxc/storage.go:303 lxc/storage_volume.go:816
 #, c-format
 msgid "Config parsing error: %s"
 msgstr ""
@@ -575,6 +592,10 @@ msgstr ""
 msgid "Create profiles"
 msgstr ""
 
+#: lxc/project.go:72 lxc/project.go:73
+msgid "Create projects"
+msgstr ""
+
 #: lxc/storage.go:88 lxc/storage.go:89
 msgid "Create storage pools"
 msgstr ""
@@ -646,6 +667,10 @@ msgstr ""
 msgid "Delete profiles"
 msgstr ""
 
+#: lxc/project.go:126 lxc/project.go:127
+msgid "Delete projects"
+msgstr ""
+
 #: lxc/storage.go:162 lxc/storage.go:163
 msgid "Delete storage pools"
 msgstr ""
@@ -672,7 +697,7 @@ msgstr ""
 #: lxc/file.go:42 lxc/file.go:75 lxc/file.go:124 lxc/file.go:187
 #: lxc/file.go:377 lxc/image.go:42 lxc/image.go:131 lxc/image.go:265
 #: lxc/image.go:316 lxc/image.go:439 lxc/image.go:579 lxc/image.go:788
-#: lxc/image.go:902 lxc/image.go:1224 lxc/image.go:1301 lxc/image_alias.go:26
+#: lxc/image.go:902 lxc/image.go:1225 lxc/image.go:1302 lxc/image_alias.go:26
 #: lxc/image_alias.go:59 lxc/image_alias.go:106 lxc/image_alias.go:149
 #: lxc/image_alias.go:250 lxc/import.go:25 lxc/info.go:29 lxc/init.go:35
 #: lxc/launch.go:22 lxc/list.go:48 lxc/main.go:48 lxc/manpage.go:19
@@ -685,7 +710,9 @@ msgstr ""
 #: lxc/profile.go:30 lxc/profile.go:102 lxc/profile.go:165 lxc/profile.go:245
 #: lxc/profile.go:301 lxc/profile.go:355 lxc/profile.go:405 lxc/profile.go:529
 #: lxc/profile.go:577 lxc/profile.go:641 lxc/profile.go:717 lxc/profile.go:767
-#: lxc/profile.go:826 lxc/profile.go:880 lxc/publish.go:34 lxc/query.go:30
+#: lxc/profile.go:826 lxc/profile.go:880 lxc/project.go:29 lxc/project.go:73
+#: lxc/project.go:127 lxc/project.go:177 lxc/project.go:298 lxc/project.go:388
+#: lxc/project.go:443 lxc/project.go:496 lxc/publish.go:34 lxc/query.go:30
 #: lxc/remote.go:37 lxc/remote.go:87 lxc/remote.go:383 lxc/remote.go:419
 #: lxc/remote.go:524 lxc/remote.go:586 lxc/remote.go:636 lxc/remote.go:674
 #: lxc/rename.go:21 lxc/restore.go:24 lxc/snapshot.go:21 lxc/storage.go:33
@@ -794,6 +821,10 @@ msgstr ""
 msgid "Edit profile configurations as YAML"
 msgstr ""
 
+#: lxc/project.go:176 lxc/project.go:177
+msgid "Edit project configurations as YAML"
+msgstr ""
+
 #: lxc/storage.go:212 lxc/storage.go:213
 msgid "Edit storage pool configurations as YAML"
 msgstr ""
@@ -908,7 +939,7 @@ msgstr ""
 msgid "FINGERPRINT"
 msgstr ""
 
-#: lxc/move.go:213
+#: lxc/move.go:214
 msgid "Failed to connect to cluster member"
 msgstr ""
 
@@ -1012,6 +1043,10 @@ msgstr ""
 msgid "ID"
 msgstr ""
 
+#: lxc/project.go:367
+msgid "IMAGES"
+msgstr ""
+
 #: lxc/network.go:964
 msgid "IP ADDRESS"
 msgstr ""
@@ -1028,7 +1063,7 @@ msgstr ""
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:301
+#: lxc/main.go:305
 msgid ""
 "If this is your first time running LXD on this machine, you should also run: "
 "lxd init"
@@ -1038,7 +1073,7 @@ msgstr ""
 msgid "Ignore the container state"
 msgstr ""
 
-#: lxc/image.go:1284
+#: lxc/image.go:1285
 msgid "Image already up to date."
 msgstr ""
 
@@ -1050,7 +1085,7 @@ msgstr ""
 msgid "Image exported successfully!"
 msgstr ""
 
-#: lxc/image.go:288 lxc/image.go:1247
+#: lxc/image.go:288 lxc/image.go:1248
 msgid "Image identifier missing"
 msgstr ""
 
@@ -1064,7 +1099,7 @@ msgstr ""
 msgid "Image imported with fingerprint: %s"
 msgstr ""
 
-#: lxc/image.go:1282
+#: lxc/image.go:1283
 msgid "Image refreshed successfully!"
 msgstr ""
 
@@ -1119,7 +1154,7 @@ msgstr ""
 msgid "Invalid config key column format (too many fields): '%s'"
 msgstr ""
 
-#: lxc/image.go:1208 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
+#: lxc/image.go:1209 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
 #, c-format
 msgid "Invalid format %q"
 msgstr ""
@@ -1140,7 +1175,7 @@ msgid ""
 "Invalid name in '%s', empty string is only allowed when defining maxWidth"
 msgstr ""
 
-#: lxc/main.go:389
+#: lxc/main.go:393
 msgid "Invalid number of arguments"
 msgstr ""
 
@@ -1336,6 +1371,10 @@ msgstr ""
 msgid "List profiles"
 msgstr ""
 
+#: lxc/project.go:297 lxc/project.go:298
+msgid "List projects"
+msgstr ""
+
 #: lxc/storage_volume.go:911 lxc/storage_volume.go:912
 msgid "List storage volumes"
 msgstr ""
@@ -1454,6 +1493,10 @@ msgstr ""
 msgid "Manage profiles"
 msgstr ""
 
+#: lxc/project.go:28 lxc/project.go:29
+msgid "Manage projects"
+msgstr ""
+
 #: lxc/storage.go:32 lxc/storage.go:33
 msgid "Manage storage pools and volumes"
 msgstr ""
@@ -1500,11 +1543,11 @@ msgstr ""
 msgid "Memory usage:"
 msgstr ""
 
-#: lxc/move.go:226
+#: lxc/move.go:227
 msgid "Migration API failure"
 msgstr ""
 
-#: lxc/move.go:231
+#: lxc/move.go:232
 msgid "Migration operation failure"
 msgstr ""
 
@@ -1552,6 +1595,11 @@ msgstr ""
 msgid "Missing profile name"
 msgstr ""
 
+#: lxc/project.go:97 lxc/project.go:151 lxc/project.go:221 lxc/project.go:412
+#: lxc/project.go:467
+msgid "Missing project name"
+msgstr ""
+
 #: lxc/profile.go:270
 msgid "Missing source profile name"
 msgstr ""
@@ -1610,11 +1658,13 @@ msgid "Must supply container name for: "
 msgstr ""
 
 #: lxc/cluster.go:124 lxc/list.go:459 lxc/network.go:858 lxc/profile.go:622
-#: lxc/remote.go:465 lxc/storage.go:549 lxc/storage_volume.go:960
+#: lxc/project.go:366 lxc/remote.go:465 lxc/storage.go:549
+#: lxc/storage_volume.go:960
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:844 lxc/operation.go:141 lxc/remote.go:440 lxc/remote.go:445
+#: lxc/network.go:844 lxc/operation.go:141 lxc/project.go:342
+#: lxc/project.go:347 lxc/remote.go:440 lxc/remote.go:445
 msgid "NO"
 msgstr ""
 
@@ -1721,7 +1771,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:462
+#: lxc/list.go:462 lxc/project.go:368
 msgid "PROFILES"
 msgstr ""
 
@@ -1750,7 +1800,7 @@ msgstr ""
 msgid "Pid: %d"
 msgstr ""
 
-#: lxc/network.go:643 lxc/profile.go:500 lxc/storage.go:304
+#: lxc/network.go:643 lxc/profile.go:500 lxc/project.go:268 lxc/storage.go:304
 #: lxc/storage_volume.go:817
 msgid "Press enter to open the editor again"
 msgstr ""
@@ -1834,6 +1884,21 @@ msgstr ""
 msgid "Profiles: %s"
 msgstr ""
 
+#: lxc/project.go:110
+#, c-format
+msgid "Project %s created"
+msgstr ""
+
+#: lxc/project.go:161
+#, c-format
+msgid "Project %s deleted"
+msgstr ""
+
+#: lxc/project.go:427
+#, c-format
+msgid "Project %s renamed to %s"
+msgstr ""
+
 #: lxc/image.go:861
 msgid "Properties:"
 msgstr ""
@@ -1873,11 +1938,11 @@ msgstr ""
 msgid "Recursively transfer files"
 msgstr ""
 
-#: lxc/image.go:1223 lxc/image.go:1224
+#: lxc/image.go:1224 lxc/image.go:1225
 msgid "Refresh images"
 msgstr ""
 
-#: lxc/image.go:1252
+#: lxc/image.go:1253
 #, c-format
 msgid "Refreshing the image: %s"
 msgstr ""
@@ -1887,7 +1952,8 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656 lxc/remote.go:694
+#: lxc/project.go:523 lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656
+#: lxc/remote.go:694
 #, c-format
 msgid "Remote %s doesn't exist"
 msgstr ""
@@ -1965,6 +2031,10 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
+#: lxc/project.go:387 lxc/project.go:388
+msgid "Rename projects"
+msgstr ""
+
 #: lxc/remote.go:523 lxc/remote.go:524
 msgid "Rename remotes"
 msgstr ""
@@ -2150,11 +2220,11 @@ msgstr ""
 msgid "Show full device configuration for containers or profiles"
 msgstr ""
 
-#: lxc/image.go:1300 lxc/image.go:1301
+#: lxc/image.go:1301 lxc/image.go:1302
 msgid "Show image properties"
 msgstr ""
 
-#: lxc/main.go:215 lxc/main.go:216
+#: lxc/main.go:219 lxc/main.go:220
 msgid "Show less common commands"
 msgstr ""
 
@@ -2170,6 +2240,10 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
+#: lxc/project.go:442 lxc/project.go:443
+msgid "Show project options"
+msgstr ""
+
 #: lxc/storage.go:649 lxc/storage.go:650
 msgid "Show storage pool configurations and resources"
 msgstr ""
@@ -2317,6 +2391,10 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
+#: lxc/project.go:495 lxc/project.go:496
+msgid "Switch the current project"
+msgstr ""
+
 #: lxc/remote.go:635 lxc/remote.go:636
 msgid "Switch the default remote"
 msgstr ""
@@ -2379,7 +2457,7 @@ msgstr ""
 msgid "The profile device doesn't exist"
 msgstr ""
 
-#: lxc/move.go:218
+#: lxc/move.go:219
 msgid "The source LXD instance is not clustered"
 msgstr ""
 
@@ -2416,7 +2494,7 @@ msgstr ""
 msgid "To detach from the console, press: <ctrl>+a q"
 msgstr ""
 
-#: lxc/main.go:304
+#: lxc/main.go:308
 msgid "To start your first container, try: lxc launch ubuntu:18.04"
 msgstr ""
 
@@ -2467,7 +2545,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:862 lxc/profile.go:623 lxc/storage.go:558
+#: lxc/network.go:862 lxc/profile.go:623 lxc/project.go:369 lxc/storage.go:558
 #: lxc/storage_volume.go:962
 msgid "USED BY"
 msgstr ""
@@ -2552,7 +2630,8 @@ msgstr ""
 msgid "Whether or not to snapshot the container's running state"
 msgstr ""
 
-#: lxc/network.go:846 lxc/operation.go:143 lxc/remote.go:442 lxc/remote.go:447
+#: lxc/network.go:846 lxc/operation.go:143 lxc/project.go:344
+#: lxc/project.go:349 lxc/remote.go:442 lxc/remote.go:447
 msgid "YES"
 msgstr ""
 
@@ -2568,7 +2647,7 @@ msgstr ""
 msgid "You must specify a destination container name when using --target"
 msgstr ""
 
-#: lxc/copy.go:72 lxc/move.go:202
+#: lxc/copy.go:72 lxc/move.go:203
 msgid "You must specify a source container name"
 msgstr ""
 
@@ -2672,6 +2751,14 @@ msgstr ""
 msgid "create [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:71
+msgid "create [<remote>:]<project>"
+msgstr ""
+
+#: lxc/project.go:354
+msgid "current"
+msgstr ""
+
 #: lxc/remote.go:459
 msgid "default"
 msgstr ""
@@ -2718,6 +2805,10 @@ msgstr ""
 msgid "delete [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:124
+msgid "delete [<remote>:]<project>"
+msgstr ""
+
 #: lxc/storage.go:436
 msgid "description"
 msgstr ""
@@ -2786,6 +2877,10 @@ msgstr ""
 msgid "edit [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:175
+msgid "edit [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:86
 msgid "edit [<remote>:][<container>]"
 msgstr ""
@@ -2896,7 +2991,7 @@ msgid "list"
 msgstr ""
 
 #: lxc/cluster.go:61 lxc/config_trust.go:112 lxc/network.go:796
-#: lxc/operation.go:98 lxc/profile.go:574 lxc/storage.go:493
+#: lxc/operation.go:98 lxc/profile.go:574 lxc/project.go:295 lxc/storage.go:493
 msgid "list [<remote>:]"
 msgstr ""
 
@@ -3081,6 +3176,12 @@ msgid ""
 "    Update a profile using the content of profile.yaml"
 msgstr ""
 
+#: lxc/project.go:179
+msgid ""
+"lxc project edit <project> < project.yaml\n"
+"    Update a project using the content of project.yaml"
+msgstr ""
+
 #: lxc/query.go:32
 msgid ""
 "lxc query -X DELETE --wait /1.0/containers/c1\n"
@@ -3183,6 +3284,10 @@ msgstr ""
 msgid "profile"
 msgstr ""
 
+#: lxc/project.go:27
+msgid "project"
+msgstr ""
+
 #: lxc/publish.go:32
 msgid ""
 "publish [<remote>:]<container>[/<snapshot>] [<remote>:] [flags] "
@@ -3205,7 +3310,7 @@ msgstr ""
 msgid "query [<remote>:]<API path>"
 msgstr ""
 
-#: lxc/image.go:1222
+#: lxc/image.go:1223
 msgid "refresh [<remote>:]<image> [[<remote>:]<image>...]"
 msgstr ""
 
@@ -3269,6 +3374,10 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
+#: lxc/project.go:385
+msgid "rename [<remote>:]<project> <new-name>"
+msgstr ""
+
 #: lxc/action.go:68
 msgid "restart [<remote>:]<container> [[<remote>:]<container>...]"
 msgstr ""
@@ -3317,7 +3426,7 @@ msgstr ""
 msgid "show [<remote>:]<container|profile>"
 msgstr ""
 
-#: lxc/image.go:1299
+#: lxc/image.go:1300
 msgid "show [<remote>:]<image>"
 msgstr ""
 
@@ -3345,6 +3454,10 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:441
+msgid "show [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:450
 msgid "show [<remote>:][<container>]"
 msgstr ""
@@ -3381,6 +3494,10 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
+#: lxc/project.go:494
+msgid "switch [<remote>:] <project>"
+msgstr ""
+
 #: lxc/info.go:255
 #, c-format
 msgid "taken at %s"
diff --git a/po/zh.po b/po/zh.po
index 3ad141274e..095042f902 100644
--- a/po/zh.po
+++ b/po/zh.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: lxd\n"
 "Report-Msgid-Bugs-To: lxc-devel at lists.linuxcontainers.org\n"
-"POT-Creation-Date: 2018-08-23 15:14-0400\n"
+"POT-Creation-Date: 2018-09-02 06:35+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -143,6 +143,23 @@ msgid ""
 "### Note that the name is shown but cannot be changed"
 msgstr ""
 
+#: lxc/project.go:189
+msgid ""
+"### This is a yaml representation of the project.\n"
+"### Any line starting with a '# will be ignored.\n"
+"###\n"
+"### A project consists of a set of features and a description.\n"
+"###\n"
+"### An example would look like:\n"
+"### name: my-project\n"
+"### features:\n"
+"###   images: True\n"
+"###   profiles: True\n"
+"### description: My own project\n"
+"###\n"
+"### Note that the name is shown but cannot be changed"
+msgstr ""
+
 #: lxc/image.go:966
 #, c-format
 msgid "%s (%d more)"
@@ -453,8 +470,8 @@ msgid "Config key/value to apply to the target container"
 msgstr ""
 
 #: lxc/config.go:195 lxc/config.go:259 lxc/config_metadata.go:144
-#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/storage.go:303
-#: lxc/storage_volume.go:816
+#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/project.go:267
+#: lxc/storage.go:303 lxc/storage_volume.go:816
 #, c-format
 msgid "Config parsing error: %s"
 msgstr ""
@@ -575,6 +592,10 @@ msgstr ""
 msgid "Create profiles"
 msgstr ""
 
+#: lxc/project.go:72 lxc/project.go:73
+msgid "Create projects"
+msgstr ""
+
 #: lxc/storage.go:88 lxc/storage.go:89
 msgid "Create storage pools"
 msgstr ""
@@ -646,6 +667,10 @@ msgstr ""
 msgid "Delete profiles"
 msgstr ""
 
+#: lxc/project.go:126 lxc/project.go:127
+msgid "Delete projects"
+msgstr ""
+
 #: lxc/storage.go:162 lxc/storage.go:163
 msgid "Delete storage pools"
 msgstr ""
@@ -672,7 +697,7 @@ msgstr ""
 #: lxc/file.go:42 lxc/file.go:75 lxc/file.go:124 lxc/file.go:187
 #: lxc/file.go:377 lxc/image.go:42 lxc/image.go:131 lxc/image.go:265
 #: lxc/image.go:316 lxc/image.go:439 lxc/image.go:579 lxc/image.go:788
-#: lxc/image.go:902 lxc/image.go:1224 lxc/image.go:1301 lxc/image_alias.go:26
+#: lxc/image.go:902 lxc/image.go:1225 lxc/image.go:1302 lxc/image_alias.go:26
 #: lxc/image_alias.go:59 lxc/image_alias.go:106 lxc/image_alias.go:149
 #: lxc/image_alias.go:250 lxc/import.go:25 lxc/info.go:29 lxc/init.go:35
 #: lxc/launch.go:22 lxc/list.go:48 lxc/main.go:48 lxc/manpage.go:19
@@ -685,7 +710,9 @@ msgstr ""
 #: lxc/profile.go:30 lxc/profile.go:102 lxc/profile.go:165 lxc/profile.go:245
 #: lxc/profile.go:301 lxc/profile.go:355 lxc/profile.go:405 lxc/profile.go:529
 #: lxc/profile.go:577 lxc/profile.go:641 lxc/profile.go:717 lxc/profile.go:767
-#: lxc/profile.go:826 lxc/profile.go:880 lxc/publish.go:34 lxc/query.go:30
+#: lxc/profile.go:826 lxc/profile.go:880 lxc/project.go:29 lxc/project.go:73
+#: lxc/project.go:127 lxc/project.go:177 lxc/project.go:298 lxc/project.go:388
+#: lxc/project.go:443 lxc/project.go:496 lxc/publish.go:34 lxc/query.go:30
 #: lxc/remote.go:37 lxc/remote.go:87 lxc/remote.go:383 lxc/remote.go:419
 #: lxc/remote.go:524 lxc/remote.go:586 lxc/remote.go:636 lxc/remote.go:674
 #: lxc/rename.go:21 lxc/restore.go:24 lxc/snapshot.go:21 lxc/storage.go:33
@@ -794,6 +821,10 @@ msgstr ""
 msgid "Edit profile configurations as YAML"
 msgstr ""
 
+#: lxc/project.go:176 lxc/project.go:177
+msgid "Edit project configurations as YAML"
+msgstr ""
+
 #: lxc/storage.go:212 lxc/storage.go:213
 msgid "Edit storage pool configurations as YAML"
 msgstr ""
@@ -908,7 +939,7 @@ msgstr ""
 msgid "FINGERPRINT"
 msgstr ""
 
-#: lxc/move.go:213
+#: lxc/move.go:214
 msgid "Failed to connect to cluster member"
 msgstr ""
 
@@ -1012,6 +1043,10 @@ msgstr ""
 msgid "ID"
 msgstr ""
 
+#: lxc/project.go:367
+msgid "IMAGES"
+msgstr ""
+
 #: lxc/network.go:964
 msgid "IP ADDRESS"
 msgstr ""
@@ -1028,7 +1063,7 @@ msgstr ""
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:301
+#: lxc/main.go:305
 msgid ""
 "If this is your first time running LXD on this machine, you should also run: "
 "lxd init"
@@ -1038,7 +1073,7 @@ msgstr ""
 msgid "Ignore the container state"
 msgstr ""
 
-#: lxc/image.go:1284
+#: lxc/image.go:1285
 msgid "Image already up to date."
 msgstr ""
 
@@ -1050,7 +1085,7 @@ msgstr ""
 msgid "Image exported successfully!"
 msgstr ""
 
-#: lxc/image.go:288 lxc/image.go:1247
+#: lxc/image.go:288 lxc/image.go:1248
 msgid "Image identifier missing"
 msgstr ""
 
@@ -1064,7 +1099,7 @@ msgstr ""
 msgid "Image imported with fingerprint: %s"
 msgstr ""
 
-#: lxc/image.go:1282
+#: lxc/image.go:1283
 msgid "Image refreshed successfully!"
 msgstr ""
 
@@ -1119,7 +1154,7 @@ msgstr ""
 msgid "Invalid config key column format (too many fields): '%s'"
 msgstr ""
 
-#: lxc/image.go:1208 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
+#: lxc/image.go:1209 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
 #, c-format
 msgid "Invalid format %q"
 msgstr ""
@@ -1140,7 +1175,7 @@ msgid ""
 "Invalid name in '%s', empty string is only allowed when defining maxWidth"
 msgstr ""
 
-#: lxc/main.go:389
+#: lxc/main.go:393
 msgid "Invalid number of arguments"
 msgstr ""
 
@@ -1336,6 +1371,10 @@ msgstr ""
 msgid "List profiles"
 msgstr ""
 
+#: lxc/project.go:297 lxc/project.go:298
+msgid "List projects"
+msgstr ""
+
 #: lxc/storage_volume.go:911 lxc/storage_volume.go:912
 msgid "List storage volumes"
 msgstr ""
@@ -1454,6 +1493,10 @@ msgstr ""
 msgid "Manage profiles"
 msgstr ""
 
+#: lxc/project.go:28 lxc/project.go:29
+msgid "Manage projects"
+msgstr ""
+
 #: lxc/storage.go:32 lxc/storage.go:33
 msgid "Manage storage pools and volumes"
 msgstr ""
@@ -1500,11 +1543,11 @@ msgstr ""
 msgid "Memory usage:"
 msgstr ""
 
-#: lxc/move.go:226
+#: lxc/move.go:227
 msgid "Migration API failure"
 msgstr ""
 
-#: lxc/move.go:231
+#: lxc/move.go:232
 msgid "Migration operation failure"
 msgstr ""
 
@@ -1552,6 +1595,11 @@ msgstr ""
 msgid "Missing profile name"
 msgstr ""
 
+#: lxc/project.go:97 lxc/project.go:151 lxc/project.go:221 lxc/project.go:412
+#: lxc/project.go:467
+msgid "Missing project name"
+msgstr ""
+
 #: lxc/profile.go:270
 msgid "Missing source profile name"
 msgstr ""
@@ -1610,11 +1658,13 @@ msgid "Must supply container name for: "
 msgstr ""
 
 #: lxc/cluster.go:124 lxc/list.go:459 lxc/network.go:858 lxc/profile.go:622
-#: lxc/remote.go:465 lxc/storage.go:549 lxc/storage_volume.go:960
+#: lxc/project.go:366 lxc/remote.go:465 lxc/storage.go:549
+#: lxc/storage_volume.go:960
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:844 lxc/operation.go:141 lxc/remote.go:440 lxc/remote.go:445
+#: lxc/network.go:844 lxc/operation.go:141 lxc/project.go:342
+#: lxc/project.go:347 lxc/remote.go:440 lxc/remote.go:445
 msgid "NO"
 msgstr ""
 
@@ -1721,7 +1771,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:462
+#: lxc/list.go:462 lxc/project.go:368
 msgid "PROFILES"
 msgstr ""
 
@@ -1750,7 +1800,7 @@ msgstr ""
 msgid "Pid: %d"
 msgstr ""
 
-#: lxc/network.go:643 lxc/profile.go:500 lxc/storage.go:304
+#: lxc/network.go:643 lxc/profile.go:500 lxc/project.go:268 lxc/storage.go:304
 #: lxc/storage_volume.go:817
 msgid "Press enter to open the editor again"
 msgstr ""
@@ -1834,6 +1884,21 @@ msgstr ""
 msgid "Profiles: %s"
 msgstr ""
 
+#: lxc/project.go:110
+#, c-format
+msgid "Project %s created"
+msgstr ""
+
+#: lxc/project.go:161
+#, c-format
+msgid "Project %s deleted"
+msgstr ""
+
+#: lxc/project.go:427
+#, c-format
+msgid "Project %s renamed to %s"
+msgstr ""
+
 #: lxc/image.go:861
 msgid "Properties:"
 msgstr ""
@@ -1873,11 +1938,11 @@ msgstr ""
 msgid "Recursively transfer files"
 msgstr ""
 
-#: lxc/image.go:1223 lxc/image.go:1224
+#: lxc/image.go:1224 lxc/image.go:1225
 msgid "Refresh images"
 msgstr ""
 
-#: lxc/image.go:1252
+#: lxc/image.go:1253
 #, c-format
 msgid "Refreshing the image: %s"
 msgstr ""
@@ -1887,7 +1952,8 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656 lxc/remote.go:694
+#: lxc/project.go:523 lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656
+#: lxc/remote.go:694
 #, c-format
 msgid "Remote %s doesn't exist"
 msgstr ""
@@ -1965,6 +2031,10 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
+#: lxc/project.go:387 lxc/project.go:388
+msgid "Rename projects"
+msgstr ""
+
 #: lxc/remote.go:523 lxc/remote.go:524
 msgid "Rename remotes"
 msgstr ""
@@ -2150,11 +2220,11 @@ msgstr ""
 msgid "Show full device configuration for containers or profiles"
 msgstr ""
 
-#: lxc/image.go:1300 lxc/image.go:1301
+#: lxc/image.go:1301 lxc/image.go:1302
 msgid "Show image properties"
 msgstr ""
 
-#: lxc/main.go:215 lxc/main.go:216
+#: lxc/main.go:219 lxc/main.go:220
 msgid "Show less common commands"
 msgstr ""
 
@@ -2170,6 +2240,10 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
+#: lxc/project.go:442 lxc/project.go:443
+msgid "Show project options"
+msgstr ""
+
 #: lxc/storage.go:649 lxc/storage.go:650
 msgid "Show storage pool configurations and resources"
 msgstr ""
@@ -2317,6 +2391,10 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
+#: lxc/project.go:495 lxc/project.go:496
+msgid "Switch the current project"
+msgstr ""
+
 #: lxc/remote.go:635 lxc/remote.go:636
 msgid "Switch the default remote"
 msgstr ""
@@ -2379,7 +2457,7 @@ msgstr ""
 msgid "The profile device doesn't exist"
 msgstr ""
 
-#: lxc/move.go:218
+#: lxc/move.go:219
 msgid "The source LXD instance is not clustered"
 msgstr ""
 
@@ -2416,7 +2494,7 @@ msgstr ""
 msgid "To detach from the console, press: <ctrl>+a q"
 msgstr ""
 
-#: lxc/main.go:304
+#: lxc/main.go:308
 msgid "To start your first container, try: lxc launch ubuntu:18.04"
 msgstr ""
 
@@ -2467,7 +2545,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:862 lxc/profile.go:623 lxc/storage.go:558
+#: lxc/network.go:862 lxc/profile.go:623 lxc/project.go:369 lxc/storage.go:558
 #: lxc/storage_volume.go:962
 msgid "USED BY"
 msgstr ""
@@ -2552,7 +2630,8 @@ msgstr ""
 msgid "Whether or not to snapshot the container's running state"
 msgstr ""
 
-#: lxc/network.go:846 lxc/operation.go:143 lxc/remote.go:442 lxc/remote.go:447
+#: lxc/network.go:846 lxc/operation.go:143 lxc/project.go:344
+#: lxc/project.go:349 lxc/remote.go:442 lxc/remote.go:447
 msgid "YES"
 msgstr ""
 
@@ -2568,7 +2647,7 @@ msgstr ""
 msgid "You must specify a destination container name when using --target"
 msgstr ""
 
-#: lxc/copy.go:72 lxc/move.go:202
+#: lxc/copy.go:72 lxc/move.go:203
 msgid "You must specify a source container name"
 msgstr ""
 
@@ -2672,6 +2751,14 @@ msgstr ""
 msgid "create [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:71
+msgid "create [<remote>:]<project>"
+msgstr ""
+
+#: lxc/project.go:354
+msgid "current"
+msgstr ""
+
 #: lxc/remote.go:459
 msgid "default"
 msgstr ""
@@ -2718,6 +2805,10 @@ msgstr ""
 msgid "delete [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:124
+msgid "delete [<remote>:]<project>"
+msgstr ""
+
 #: lxc/storage.go:436
 msgid "description"
 msgstr ""
@@ -2786,6 +2877,10 @@ msgstr ""
 msgid "edit [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:175
+msgid "edit [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:86
 msgid "edit [<remote>:][<container>]"
 msgstr ""
@@ -2896,7 +2991,7 @@ msgid "list"
 msgstr ""
 
 #: lxc/cluster.go:61 lxc/config_trust.go:112 lxc/network.go:796
-#: lxc/operation.go:98 lxc/profile.go:574 lxc/storage.go:493
+#: lxc/operation.go:98 lxc/profile.go:574 lxc/project.go:295 lxc/storage.go:493
 msgid "list [<remote>:]"
 msgstr ""
 
@@ -3081,6 +3176,12 @@ msgid ""
 "    Update a profile using the content of profile.yaml"
 msgstr ""
 
+#: lxc/project.go:179
+msgid ""
+"lxc project edit <project> < project.yaml\n"
+"    Update a project using the content of project.yaml"
+msgstr ""
+
 #: lxc/query.go:32
 msgid ""
 "lxc query -X DELETE --wait /1.0/containers/c1\n"
@@ -3183,6 +3284,10 @@ msgstr ""
 msgid "profile"
 msgstr ""
 
+#: lxc/project.go:27
+msgid "project"
+msgstr ""
+
 #: lxc/publish.go:32
 msgid ""
 "publish [<remote>:]<container>[/<snapshot>] [<remote>:] [flags] "
@@ -3205,7 +3310,7 @@ msgstr ""
 msgid "query [<remote>:]<API path>"
 msgstr ""
 
-#: lxc/image.go:1222
+#: lxc/image.go:1223
 msgid "refresh [<remote>:]<image> [[<remote>:]<image>...]"
 msgstr ""
 
@@ -3269,6 +3374,10 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
+#: lxc/project.go:385
+msgid "rename [<remote>:]<project> <new-name>"
+msgstr ""
+
 #: lxc/action.go:68
 msgid "restart [<remote>:]<container> [[<remote>:]<container>...]"
 msgstr ""
@@ -3317,7 +3426,7 @@ msgstr ""
 msgid "show [<remote>:]<container|profile>"
 msgstr ""
 
-#: lxc/image.go:1299
+#: lxc/image.go:1300
 msgid "show [<remote>:]<image>"
 msgstr ""
 
@@ -3345,6 +3454,10 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:441
+msgid "show [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:450
 msgid "show [<remote>:][<container>]"
 msgstr ""
@@ -3381,6 +3494,10 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
+#: lxc/project.go:494
+msgid "switch [<remote>:] <project>"
+msgstr ""
+
 #: lxc/info.go:255
 #, c-format
 msgid "taken at %s"
diff --git a/po/zh_Hans.po b/po/zh_Hans.po
index ab7ef087d0..641f5f5d2b 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: 2018-08-23 15:14-0400\n"
+"POT-Creation-Date: 2018-09-02 06:35+0000\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: Automatically generated\n"
 "Language-Team: none\n"
@@ -143,6 +143,23 @@ msgid ""
 "### Note that the name is shown but cannot be changed"
 msgstr ""
 
+#: lxc/project.go:189
+msgid ""
+"### This is a yaml representation of the project.\n"
+"### Any line starting with a '# will be ignored.\n"
+"###\n"
+"### A project consists of a set of features and a description.\n"
+"###\n"
+"### An example would look like:\n"
+"### name: my-project\n"
+"### features:\n"
+"###   images: True\n"
+"###   profiles: True\n"
+"### description: My own project\n"
+"###\n"
+"### Note that the name is shown but cannot be changed"
+msgstr ""
+
 #: lxc/image.go:966
 #, c-format
 msgid "%s (%d more)"
@@ -453,8 +470,8 @@ msgid "Config key/value to apply to the target container"
 msgstr ""
 
 #: lxc/config.go:195 lxc/config.go:259 lxc/config_metadata.go:144
-#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/storage.go:303
-#: lxc/storage_volume.go:816
+#: lxc/image.go:409 lxc/network.go:642 lxc/profile.go:499 lxc/project.go:267
+#: lxc/storage.go:303 lxc/storage_volume.go:816
 #, c-format
 msgid "Config parsing error: %s"
 msgstr ""
@@ -575,6 +592,10 @@ msgstr ""
 msgid "Create profiles"
 msgstr ""
 
+#: lxc/project.go:72 lxc/project.go:73
+msgid "Create projects"
+msgstr ""
+
 #: lxc/storage.go:88 lxc/storage.go:89
 msgid "Create storage pools"
 msgstr ""
@@ -646,6 +667,10 @@ msgstr ""
 msgid "Delete profiles"
 msgstr ""
 
+#: lxc/project.go:126 lxc/project.go:127
+msgid "Delete projects"
+msgstr ""
+
 #: lxc/storage.go:162 lxc/storage.go:163
 msgid "Delete storage pools"
 msgstr ""
@@ -672,7 +697,7 @@ msgstr ""
 #: lxc/file.go:42 lxc/file.go:75 lxc/file.go:124 lxc/file.go:187
 #: lxc/file.go:377 lxc/image.go:42 lxc/image.go:131 lxc/image.go:265
 #: lxc/image.go:316 lxc/image.go:439 lxc/image.go:579 lxc/image.go:788
-#: lxc/image.go:902 lxc/image.go:1224 lxc/image.go:1301 lxc/image_alias.go:26
+#: lxc/image.go:902 lxc/image.go:1225 lxc/image.go:1302 lxc/image_alias.go:26
 #: lxc/image_alias.go:59 lxc/image_alias.go:106 lxc/image_alias.go:149
 #: lxc/image_alias.go:250 lxc/import.go:25 lxc/info.go:29 lxc/init.go:35
 #: lxc/launch.go:22 lxc/list.go:48 lxc/main.go:48 lxc/manpage.go:19
@@ -685,7 +710,9 @@ msgstr ""
 #: lxc/profile.go:30 lxc/profile.go:102 lxc/profile.go:165 lxc/profile.go:245
 #: lxc/profile.go:301 lxc/profile.go:355 lxc/profile.go:405 lxc/profile.go:529
 #: lxc/profile.go:577 lxc/profile.go:641 lxc/profile.go:717 lxc/profile.go:767
-#: lxc/profile.go:826 lxc/profile.go:880 lxc/publish.go:34 lxc/query.go:30
+#: lxc/profile.go:826 lxc/profile.go:880 lxc/project.go:29 lxc/project.go:73
+#: lxc/project.go:127 lxc/project.go:177 lxc/project.go:298 lxc/project.go:388
+#: lxc/project.go:443 lxc/project.go:496 lxc/publish.go:34 lxc/query.go:30
 #: lxc/remote.go:37 lxc/remote.go:87 lxc/remote.go:383 lxc/remote.go:419
 #: lxc/remote.go:524 lxc/remote.go:586 lxc/remote.go:636 lxc/remote.go:674
 #: lxc/rename.go:21 lxc/restore.go:24 lxc/snapshot.go:21 lxc/storage.go:33
@@ -794,6 +821,10 @@ msgstr ""
 msgid "Edit profile configurations as YAML"
 msgstr ""
 
+#: lxc/project.go:176 lxc/project.go:177
+msgid "Edit project configurations as YAML"
+msgstr ""
+
 #: lxc/storage.go:212 lxc/storage.go:213
 msgid "Edit storage pool configurations as YAML"
 msgstr ""
@@ -908,7 +939,7 @@ msgstr ""
 msgid "FINGERPRINT"
 msgstr ""
 
-#: lxc/move.go:213
+#: lxc/move.go:214
 msgid "Failed to connect to cluster member"
 msgstr ""
 
@@ -1012,6 +1043,10 @@ msgstr ""
 msgid "ID"
 msgstr ""
 
+#: lxc/project.go:367
+msgid "IMAGES"
+msgstr ""
+
 #: lxc/network.go:964
 msgid "IP ADDRESS"
 msgstr ""
@@ -1028,7 +1063,7 @@ msgstr ""
 msgid "ISSUE DATE"
 msgstr ""
 
-#: lxc/main.go:301
+#: lxc/main.go:305
 msgid ""
 "If this is your first time running LXD on this machine, you should also run: "
 "lxd init"
@@ -1038,7 +1073,7 @@ msgstr ""
 msgid "Ignore the container state"
 msgstr ""
 
-#: lxc/image.go:1284
+#: lxc/image.go:1285
 msgid "Image already up to date."
 msgstr ""
 
@@ -1050,7 +1085,7 @@ msgstr ""
 msgid "Image exported successfully!"
 msgstr ""
 
-#: lxc/image.go:288 lxc/image.go:1247
+#: lxc/image.go:288 lxc/image.go:1248
 msgid "Image identifier missing"
 msgstr ""
 
@@ -1064,7 +1099,7 @@ msgstr ""
 msgid "Image imported with fingerprint: %s"
 msgstr ""
 
-#: lxc/image.go:1282
+#: lxc/image.go:1283
 msgid "Image refreshed successfully!"
 msgstr ""
 
@@ -1119,7 +1154,7 @@ msgstr ""
 msgid "Invalid config key column format (too many fields): '%s'"
 msgstr ""
 
-#: lxc/image.go:1208 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
+#: lxc/image.go:1209 lxc/list.go:366 lxc/network.go:903 lxc/remote.go:507
 #, c-format
 msgid "Invalid format %q"
 msgstr ""
@@ -1140,7 +1175,7 @@ msgid ""
 "Invalid name in '%s', empty string is only allowed when defining maxWidth"
 msgstr ""
 
-#: lxc/main.go:389
+#: lxc/main.go:393
 msgid "Invalid number of arguments"
 msgstr ""
 
@@ -1336,6 +1371,10 @@ msgstr ""
 msgid "List profiles"
 msgstr ""
 
+#: lxc/project.go:297 lxc/project.go:298
+msgid "List projects"
+msgstr ""
+
 #: lxc/storage_volume.go:911 lxc/storage_volume.go:912
 msgid "List storage volumes"
 msgstr ""
@@ -1454,6 +1493,10 @@ msgstr ""
 msgid "Manage profiles"
 msgstr ""
 
+#: lxc/project.go:28 lxc/project.go:29
+msgid "Manage projects"
+msgstr ""
+
 #: lxc/storage.go:32 lxc/storage.go:33
 msgid "Manage storage pools and volumes"
 msgstr ""
@@ -1500,11 +1543,11 @@ msgstr ""
 msgid "Memory usage:"
 msgstr ""
 
-#: lxc/move.go:226
+#: lxc/move.go:227
 msgid "Migration API failure"
 msgstr ""
 
-#: lxc/move.go:231
+#: lxc/move.go:232
 msgid "Migration operation failure"
 msgstr ""
 
@@ -1552,6 +1595,11 @@ msgstr ""
 msgid "Missing profile name"
 msgstr ""
 
+#: lxc/project.go:97 lxc/project.go:151 lxc/project.go:221 lxc/project.go:412
+#: lxc/project.go:467
+msgid "Missing project name"
+msgstr ""
+
 #: lxc/profile.go:270
 msgid "Missing source profile name"
 msgstr ""
@@ -1610,11 +1658,13 @@ msgid "Must supply container name for: "
 msgstr ""
 
 #: lxc/cluster.go:124 lxc/list.go:459 lxc/network.go:858 lxc/profile.go:622
-#: lxc/remote.go:465 lxc/storage.go:549 lxc/storage_volume.go:960
+#: lxc/project.go:366 lxc/remote.go:465 lxc/storage.go:549
+#: lxc/storage_volume.go:960
 msgid "NAME"
 msgstr ""
 
-#: lxc/network.go:844 lxc/operation.go:141 lxc/remote.go:440 lxc/remote.go:445
+#: lxc/network.go:844 lxc/operation.go:141 lxc/project.go:342
+#: lxc/project.go:347 lxc/remote.go:440 lxc/remote.go:445
 msgid "NO"
 msgstr ""
 
@@ -1721,7 +1771,7 @@ msgstr ""
 msgid "PROCESSES"
 msgstr ""
 
-#: lxc/list.go:462
+#: lxc/list.go:462 lxc/project.go:368
 msgid "PROFILES"
 msgstr ""
 
@@ -1750,7 +1800,7 @@ msgstr ""
 msgid "Pid: %d"
 msgstr ""
 
-#: lxc/network.go:643 lxc/profile.go:500 lxc/storage.go:304
+#: lxc/network.go:643 lxc/profile.go:500 lxc/project.go:268 lxc/storage.go:304
 #: lxc/storage_volume.go:817
 msgid "Press enter to open the editor again"
 msgstr ""
@@ -1834,6 +1884,21 @@ msgstr ""
 msgid "Profiles: %s"
 msgstr ""
 
+#: lxc/project.go:110
+#, c-format
+msgid "Project %s created"
+msgstr ""
+
+#: lxc/project.go:161
+#, c-format
+msgid "Project %s deleted"
+msgstr ""
+
+#: lxc/project.go:427
+#, c-format
+msgid "Project %s renamed to %s"
+msgstr ""
+
 #: lxc/image.go:861
 msgid "Properties:"
 msgstr ""
@@ -1873,11 +1938,11 @@ msgstr ""
 msgid "Recursively transfer files"
 msgstr ""
 
-#: lxc/image.go:1223 lxc/image.go:1224
+#: lxc/image.go:1224 lxc/image.go:1225
 msgid "Refresh images"
 msgstr ""
 
-#: lxc/image.go:1252
+#: lxc/image.go:1253
 #, c-format
 msgid "Refreshing the image: %s"
 msgstr ""
@@ -1887,7 +1952,8 @@ msgstr ""
 msgid "Remote %s already exists"
 msgstr ""
 
-#: lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656 lxc/remote.go:694
+#: lxc/project.go:523 lxc/remote.go:544 lxc/remote.go:606 lxc/remote.go:656
+#: lxc/remote.go:694
 #, c-format
 msgid "Remote %s doesn't exist"
 msgstr ""
@@ -1965,6 +2031,10 @@ msgstr ""
 msgid "Rename profiles"
 msgstr ""
 
+#: lxc/project.go:387 lxc/project.go:388
+msgid "Rename projects"
+msgstr ""
+
 #: lxc/remote.go:523 lxc/remote.go:524
 msgid "Rename remotes"
 msgstr ""
@@ -2150,11 +2220,11 @@ msgstr ""
 msgid "Show full device configuration for containers or profiles"
 msgstr ""
 
-#: lxc/image.go:1300 lxc/image.go:1301
+#: lxc/image.go:1301 lxc/image.go:1302
 msgid "Show image properties"
 msgstr ""
 
-#: lxc/main.go:215 lxc/main.go:216
+#: lxc/main.go:219 lxc/main.go:220
 msgid "Show less common commands"
 msgstr ""
 
@@ -2170,6 +2240,10 @@ msgstr ""
 msgid "Show profile configurations"
 msgstr ""
 
+#: lxc/project.go:442 lxc/project.go:443
+msgid "Show project options"
+msgstr ""
+
 #: lxc/storage.go:649 lxc/storage.go:650
 msgid "Show storage pool configurations and resources"
 msgstr ""
@@ -2317,6 +2391,10 @@ msgstr ""
 msgid "Swap (peak)"
 msgstr ""
 
+#: lxc/project.go:495 lxc/project.go:496
+msgid "Switch the current project"
+msgstr ""
+
 #: lxc/remote.go:635 lxc/remote.go:636
 msgid "Switch the default remote"
 msgstr ""
@@ -2379,7 +2457,7 @@ msgstr ""
 msgid "The profile device doesn't exist"
 msgstr ""
 
-#: lxc/move.go:218
+#: lxc/move.go:219
 msgid "The source LXD instance is not clustered"
 msgstr ""
 
@@ -2416,7 +2494,7 @@ msgstr ""
 msgid "To detach from the console, press: <ctrl>+a q"
 msgstr ""
 
-#: lxc/main.go:304
+#: lxc/main.go:308
 msgid "To start your first container, try: lxc launch ubuntu:18.04"
 msgstr ""
 
@@ -2467,7 +2545,7 @@ msgstr ""
 msgid "URL"
 msgstr ""
 
-#: lxc/network.go:862 lxc/profile.go:623 lxc/storage.go:558
+#: lxc/network.go:862 lxc/profile.go:623 lxc/project.go:369 lxc/storage.go:558
 #: lxc/storage_volume.go:962
 msgid "USED BY"
 msgstr ""
@@ -2552,7 +2630,8 @@ msgstr ""
 msgid "Whether or not to snapshot the container's running state"
 msgstr ""
 
-#: lxc/network.go:846 lxc/operation.go:143 lxc/remote.go:442 lxc/remote.go:447
+#: lxc/network.go:846 lxc/operation.go:143 lxc/project.go:344
+#: lxc/project.go:349 lxc/remote.go:442 lxc/remote.go:447
 msgid "YES"
 msgstr ""
 
@@ -2568,7 +2647,7 @@ msgstr ""
 msgid "You must specify a destination container name when using --target"
 msgstr ""
 
-#: lxc/copy.go:72 lxc/move.go:202
+#: lxc/copy.go:72 lxc/move.go:203
 msgid "You must specify a source container name"
 msgstr ""
 
@@ -2672,6 +2751,14 @@ msgstr ""
 msgid "create [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:71
+msgid "create [<remote>:]<project>"
+msgstr ""
+
+#: lxc/project.go:354
+msgid "current"
+msgstr ""
+
 #: lxc/remote.go:459
 msgid "default"
 msgstr ""
@@ -2718,6 +2805,10 @@ msgstr ""
 msgid "delete [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:124
+msgid "delete [<remote>:]<project>"
+msgstr ""
+
 #: lxc/storage.go:436
 msgid "description"
 msgstr ""
@@ -2786,6 +2877,10 @@ msgstr ""
 msgid "edit [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:175
+msgid "edit [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:86
 msgid "edit [<remote>:][<container>]"
 msgstr ""
@@ -2896,7 +2991,7 @@ msgid "list"
 msgstr ""
 
 #: lxc/cluster.go:61 lxc/config_trust.go:112 lxc/network.go:796
-#: lxc/operation.go:98 lxc/profile.go:574 lxc/storage.go:493
+#: lxc/operation.go:98 lxc/profile.go:574 lxc/project.go:295 lxc/storage.go:493
 msgid "list [<remote>:]"
 msgstr ""
 
@@ -3081,6 +3176,12 @@ msgid ""
 "    Update a profile using the content of profile.yaml"
 msgstr ""
 
+#: lxc/project.go:179
+msgid ""
+"lxc project edit <project> < project.yaml\n"
+"    Update a project using the content of project.yaml"
+msgstr ""
+
 #: lxc/query.go:32
 msgid ""
 "lxc query -X DELETE --wait /1.0/containers/c1\n"
@@ -3183,6 +3284,10 @@ msgstr ""
 msgid "profile"
 msgstr ""
 
+#: lxc/project.go:27
+msgid "project"
+msgstr ""
+
 #: lxc/publish.go:32
 msgid ""
 "publish [<remote>:]<container>[/<snapshot>] [<remote>:] [flags] "
@@ -3205,7 +3310,7 @@ msgstr ""
 msgid "query [<remote>:]<API path>"
 msgstr ""
 
-#: lxc/image.go:1222
+#: lxc/image.go:1223
 msgid "refresh [<remote>:]<image> [[<remote>:]<image>...]"
 msgstr ""
 
@@ -3269,6 +3374,10 @@ msgstr ""
 msgid "rename [<remote>:]<profile> <new-name>"
 msgstr ""
 
+#: lxc/project.go:385
+msgid "rename [<remote>:]<project> <new-name>"
+msgstr ""
+
 #: lxc/action.go:68
 msgid "restart [<remote>:]<container> [[<remote>:]<container>...]"
 msgstr ""
@@ -3317,7 +3426,7 @@ msgstr ""
 msgid "show [<remote>:]<container|profile>"
 msgstr ""
 
-#: lxc/image.go:1299
+#: lxc/image.go:1300
 msgid "show [<remote>:]<image>"
 msgstr ""
 
@@ -3345,6 +3454,10 @@ msgstr ""
 msgid "show [<remote>:]<profile>"
 msgstr ""
 
+#: lxc/project.go:441
+msgid "show [<remote>:]<project>"
+msgstr ""
+
 #: lxc/config.go:450
 msgid "show [<remote>:][<container>]"
 msgstr ""
@@ -3381,6 +3494,10 @@ msgstr ""
 msgid "switch <remote>"
 msgstr ""
 
+#: lxc/project.go:494
+msgid "switch [<remote>:] <project>"
+msgstr ""
+
 #: lxc/info.go:255
 #, c-format
 msgid "taken at %s"

From 6650d52de35d690f26fa7536348965488f869265 Mon Sep 17 00:00:00 2001
From: Free Ekanayaka <free.ekanayaka at canonical.com>
Date: Mon, 3 Sep 2018 10:16:32 +0200
Subject: [PATCH 12/12] Don't disable foreign key enforcement during schema
 updates

Signed-off-by: Free Ekanayaka <free.ekanayaka at canonical.com>
---
 lxd/db/cluster/open.go        |  9 +-----
 lxd/db/cluster/update.go      | 28 ++++++++++++------
 lxd/db/cluster/update_test.go | 54 +++++++++++++++++++++++++++++++++++
 lxd/db/migration.go           | 24 +++++++++++-----
 4 files changed, 92 insertions(+), 23 deletions(-)

diff --git a/lxd/db/cluster/open.go b/lxd/db/cluster/open.go
index 7fc242b60e..d88c6d467b 100644
--- a/lxd/db/cluster/open.go
+++ b/lxd/db/cluster/open.go
@@ -55,13 +55,6 @@ func Open(name string, store dqlite.ServerStore, options ...dqlite.DriverOption)
 // false and no error (if some nodes have a lower version, and we need to wait
 // till they get upgraded and restarted).
 func EnsureSchema(db *sql.DB, address string, dir string) (bool, error) {
-	// Disable foreign key enforcement during schema update
-	_, err := db.Exec("PRAGMA foreign_keys=OFF;")
-	if err != nil {
-		return false, err
-	}
-	defer db.Exec("PRAGMA foreign_keys=ON;")
-
 	someNodesAreBehind := false
 	apiExtensions := version.APIExtensionsCount()
 
@@ -156,7 +149,7 @@ func EnsureSchema(db *sql.DB, address string, dir string) (bool, error) {
 	schema.Hook(hook)
 
 	var initial int
-	err = query.Retry(func() error {
+	err := query.Retry(func() error {
 		var err error
 		initial, err = schema.Ensure(db)
 		return err
diff --git a/lxd/db/cluster/update.go b/lxd/db/cluster/update.go
index 277fda0e03..d6d422d38f 100644
--- a/lxd/db/cluster/update.go
+++ b/lxd/db/cluster/update.go
@@ -95,15 +95,13 @@ CREATE TABLE tmp_images (
     FOREIGN KEY (project_id) REFERENCES projects (id) ON DELETE CASCADE
 );
 
-CREATE TABLE tmp_images_aliases (
+CREATE TABLE tmp_images_aliases1 (
     id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
     name TEXT NOT NULL,
     image_id INTEGER NOT NULL,
     description TEXT,
     project_id INTEGER NOT NULL,
-    UNIQUE (name),
-    FOREIGN KEY (image_id) REFERENCES images (id) ON DELETE CASCADE,
-    FOREIGN KEY (project_id) REFERENCES projects (id) ON DELETE CASCADE
+    UNIQUE (name)
 );
 
 CREATE TABLE tmp_profiles (
@@ -117,7 +115,7 @@ CREATE TABLE tmp_profiles (
 
 INSERT INTO tmp_containers SELECT * FROM containers;
 INSERT INTO tmp_images SELECT * FROM images;
-INSERT INTO tmp_images_aliases SELECT * FROM images_aliases;
+INSERT INTO tmp_images_aliases1 SELECT * FROM images_aliases;
 INSERT INTO tmp_profiles SELECT * FROM profiles;
 
 DROP TABLE containers;
@@ -126,11 +124,25 @@ ALTER TABLE tmp_containers RENAME TO containers;
 DROP TABLE images;
 ALTER TABLE tmp_images RENAME TO images;
 
-DROP TABLE images_aliases;
-ALTER TABLE tmp_images_aliases RENAME TO images_aliases;
-
 DROP TABLE profiles;
 ALTER TABLE tmp_profiles RENAME TO profiles;
+
+CREATE TABLE tmp_images_aliases2 (
+    id INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL,
+    name TEXT NOT NULL,
+    image_id INTEGER NOT NULL,
+    description TEXT,
+    project_id INTEGER NOT NULL,
+    UNIQUE (name),
+    FOREIGN KEY (image_id) REFERENCES images (id) ON DELETE CASCADE,
+    FOREIGN KEY (project_id) REFERENCES projects (id) ON DELETE CASCADE
+);
+
+INSERT INTO tmp_images_aliases2 SELECT * FROM tmp_images_aliases1;
+
+DROP TABLE images_aliases;
+DROP TABLE tmp_images_aliases1;
+ALTER TABLE tmp_images_aliases2 RENAME TO images_aliases;
 `
 	_, err := tx.Exec(stmts)
 	return err
diff --git a/lxd/db/cluster/update_test.go b/lxd/db/cluster/update_test.go
index 06452828f3..bb9833e963 100644
--- a/lxd/db/cluster/update_test.go
+++ b/lxd/db/cluster/update_test.go
@@ -372,3 +372,57 @@ func TestUpdateFromV9(t *testing.T) {
 	require.NoError(t, err)
 	require.Equal(t, []int{0}, types)
 }
+
+func TestUpdateFromV10(t *testing.T) {
+	schema := cluster.Schema()
+	db, err := schema.ExerciseUpdate(11, func(db *sql.DB) {
+		// Insert a node.
+		_, err := db.Exec(
+			"INSERT INTO nodes VALUES (1, 'n1', '', '1.2.3.4:666', 1, 32, ?, 0)",
+			time.Now())
+		require.NoError(t, err)
+
+		// Insert a container.
+		_, err = db.Exec(`
+INSERT INTO containers VALUES (1, 1, 'bionic', 1, 1, 0, ?, 0, ?, 'Bionic Beaver')
+`, time.Now(), time.Now())
+		require.NoError(t, err)
+
+		// Insert an image.
+		_, err = db.Exec(`
+INSERT INTO images VALUES (1, 'abcd', 'img.tgz', 123, 0, 0, NULL, NULL, ?, 0, NULL, 0)
+`, time.Now())
+		require.NoError(t, err)
+
+		// Insert an image alias.
+		_, err = db.Exec(`
+INSERT INTO images_aliases VALUES (1, 'my-img', 1, NULL)
+`, time.Now())
+		require.NoError(t, err)
+
+		// Insert a profile.
+		_, err = db.Exec(`
+INSERT INTO profiles VALUES (1, 'default', NULL)
+`, time.Now())
+		require.NoError(t, err)
+	})
+	require.NoError(t, err)
+
+	tx, err := db.Begin()
+	require.NoError(t, err)
+
+	defer tx.Rollback()
+
+	// Check that a project_id column has been added to the various talbles
+	// and that existing rows default to 1 (the ID of the default project).
+	for _, table := range []string{"containers", "images", "images_aliases"} {
+		count, err := query.Count(tx, table, "")
+		require.NoError(t, err)
+		assert.Equal(t, 1, count)
+
+		stmt := fmt.Sprintf("SELECT project_id FROM %s", table)
+		ids, err := query.SelectIntegers(tx, stmt)
+		require.NoError(t, err)
+		assert.Equal(t, []int{1}, ids)
+	}
+}
diff --git a/lxd/db/migration.go b/lxd/db/migration.go
index 5f6de40084..923c8bbc1d 100644
--- a/lxd/db/migration.go
+++ b/lxd/db/migration.go
@@ -90,15 +90,17 @@ DELETE FROM storage_volumes_config WHERE storage_volume_id NOT IN (SELECT id FRO
 	return dump, nil
 }
 
+// List of tables existing before clustering that had no project_id column and
+// that now require it.
+var preClusteringTablesRequiringProjectID = []string{
+	"containers",
+	"images",
+	"images_aliases",
+	"profiles",
+}
+
 // ImportPreClusteringData imports the data loaded with LoadPreClusteringData.
 func (c *Cluster) ImportPreClusteringData(dump *Dump) error {
-	// Disable foreign key enforcement during schema update
-	_, err := c.db.Exec("PRAGMA foreign_keys=OFF;")
-	if err != nil {
-		return err
-	}
-	defer c.db.Exec("PRAGMA foreign_keys=ON;")
-
 	tx, err := c.db.Begin()
 	if err != nil {
 		return errors.Wrap(err, "failed to start cluster database transaction")
@@ -114,6 +116,7 @@ func (c *Cluster) ImportPreClusteringData(dump *Dump) error {
 
 	for _, table := range preClusteringTables {
 		logger.Debugf("Migrating data for table %s", table)
+
 		for i, row := range dump.Data[table] {
 			for i, element := range row {
 				// Convert []byte columns to string. This is safe to do since
@@ -200,6 +203,13 @@ func (c *Cluster) ImportPreClusteringData(dump *Dump) error {
 			case "storage_volumes":
 				appendNodeID()
 			}
+
+			if shared.StringInSlice(table, preClusteringTablesRequiringProjectID) {
+				// These tables have a project_id reference in the new schema.
+				columns = append(columns, "project_id")
+				row = append(row, 1) // Reference the default project.
+			}
+
 			stmt := fmt.Sprintf("INSERT INTO %s(%s)", table, strings.Join(columns, ", "))
 			stmt += fmt.Sprintf(" VALUES %s", query.Params(len(columns)))
 			result, err := tx.Exec(stmt, row...)


More information about the lxc-devel mailing list