diff --git a/lxd/apparmor.go b/lxd/apparmor.go
index <HASH>..<HASH> 100644
--- a/lxd/apparmor.go
+++ b/lxd/apparmor.go
@@ -250,6 +250,22 @@ const AA_PROFILE_NESTING = `
   mount options=bind /var/lib/lxd/shmounts/** -> /var/lib/lxd/**,
 `
 
+const AA_PROFILE_UNPRIVILEGED = `
+  pivot_root,
+
+  mount options=(rw,make-slave) -> **,
+  mount options=(rw,make-rslave) -> **,
+  mount options=(rw,make-shared) -> **,
+  mount options=(rw,make-rshared) -> **,
+  mount options=(rw,make-private) -> **,
+  mount options=(rw,make-rprivate) -> **,
+  mount options=(rw,make-unbindable) -> **,
+  mount options=(rw,make-runbindable) -> **,
+
+  mount options=(rw,bind),
+  mount options=(rw,rbind),
+`
+
 func mkApparmorName(name string) string {
 	if len(name)+7 >= 253 {
 		hash := sha256.New()
@@ -352,6 +368,12 @@ func getAAProfileContent(c container) string {
 		}
 	}
 
+	if !c.IsPrivileged() {
+		// Apply unprivileged bits
+		profile += "\n  ### Configuration: unprivileged containers\n"
+		profile += strings.TrimLeft(AA_PROFILE_UNPRIVILEGED, "\n")
+	}
+
 	// Append raw.apparmor
 	rawApparmor, ok := c.ExpandedConfig()["raw.apparmor"]
 	if ok {
apparmor: Be less restrictive when unprivileged

This change allows:
 - Various remount of /
 - pivot_root inside the container
 - All bind mounts

This can be used to bypass a bunch of our apparmor restrictions and so
would be completely unacceptable for privileged containers. But since we
use apparmor mostly as an added safety net for unpriivleged containers,
this should be fine.

Those changes should help running snapd inside a container.