diff --git a/slapos/format.py b/slapos/format.py
index ee7b4841e9407b85d74316ce02445ff85b8f871d..98a91fc98beb888bc196e5c830469292247c5fce 100644
--- a/slapos/format.py
+++ b/slapos/format.py
@@ -52,6 +52,7 @@ import zipfile
 import lxml.etree
 import xml_marshaller.xml_marshaller
 
+from slapos.util import chownDirectory
 from slapos.util import mkdir_p
 import slapos.slap as slap
 
@@ -386,7 +387,7 @@ class Computer(object):
     if alter_user:
       slapsoft.create()
       slapsoft_pw = pwd.getpwnam(slapsoft.name)
-      os.chown(self.software_root, slapsoft_pw.pw_uid, slapsoft_pw.pw_gid)
+      chownDirectory(slapsoft.path, slapsoft_pw.pw_uid, slapsoft_pw.pw_gid)
     os.chmod(self.software_root, 0o755)
 
     # Speed hack:
@@ -513,8 +514,8 @@ class Partition(object):
       os.mkdir(self.path, 0o750)
     if alter_user:
       owner_pw = pwd.getpwnam(owner.name)
-      os.chown(self.path, owner_pw.pw_uid, owner_pw.pw_gid)
-    os.chmod(self.path, 0o750)
+      chownDirectory(self.path, owner_pw.pw_uid, owner_pw.pw_gid)
+    os.chmod(self.path, 0o755)
 
 
 class User(object):
diff --git a/slapos/tests/util.py b/slapos/tests/util.py
index 510027be0ddbccab9d9575881ce89b8918ad4f9b..35edcc7a3223a0942a49e3bcdce20f861523d6c2 100644
--- a/slapos/tests/util.py
+++ b/slapos/tests/util.py
@@ -28,6 +28,8 @@ import os
 import slapos.util
 import tempfile
 import unittest
+import shutil
+from pwd import getpwnam
 
 
 class TestMkdirP(unittest.TestCase):
@@ -43,6 +45,7 @@ class TestMkdirP(unittest.TestCase):
     wanted_directory = os.path.join(root_directory, 'foo', 'bar')
     slapos.util.mkdir_p(wanted_directory)
     self.assertTrue(os.path.isdir(wanted_directory))
+    shutil.rmtree(root_directory)
 
   def test_mkdir_already_existing(self):
     """
@@ -51,7 +54,58 @@ class TestMkdirP(unittest.TestCase):
     root_directory = tempfile.mkdtemp()
     slapos.util.mkdir_p(root_directory)
     self.assertTrue(os.path.isdir(root_directory))
+    shutil.rmtree(root_directory)
 
+  def test_chown_directory(self):
+    """
+    Test that slapos.util.chownDirectory correctly changes owner.
+    Note: requires root privileges.
+    """
+    root_slaptest = tempfile.mkdtemp()
+    wanted_directory0 = os.path.join(root_slaptest, 'slap-write0')
+    wanted_directory1 = os.path.join(root_slaptest, 'slap-write0', 'write-slap1')
+    wanted_directory2 = os.path.join(root_slaptest, 'slap-write0', 'write-slap1', 'write-teste2')
+    wanted_directory_mkdir0 = os.makedirs(wanted_directory0, mode=0777)
+    wanted_directory_mkdir1 = os.makedirs(wanted_directory1, mode=0777)
+    wanted_directory_mkdir2 = os.makedirs(wanted_directory2, mode=0777)
+    create_file_txt = tempfile.mkstemp(suffix='.txt', prefix='tmp', dir=wanted_directory2, text=True)
+    user = 'nobody'
+    try:
+      uid = getpwnam(user)[2]
+      gid = getpwnam(user)[3]
+    except KeyError:
+      raise unittest.SkipTest("user %s doesn't exist." % user)
+    try:
+      slapos.util.chownDirectory(root_slaptest, uid, gid)
+    except OSError:
+      raise unittest.SkipTest("No root privileges, impossible to chown.")
+
+    uid_check_root_slaptest = os.stat(root_slaptest)[4]
+    gid_check_root_slaptest = os.stat(root_slaptest)[5]
+    self.assertTrue(uid == uid_check_root_slaptest)
+    self.assertTrue(gid == gid_check_root_slaptest)
+
+    uid_check_wanted_directory0 = os.stat(wanted_directory0)[4]
+    gid_check_wanted_directory0 = os.stat(wanted_directory0)[5]
+    self.assertTrue(uid == uid_check_wanted_directory0)
+    self.assertTrue(gid == gid_check_wanted_directory0)
+
+    uid_check_wanted_directory1 = os.stat(wanted_directory1)[4]
+    gid_check_wanted_directory1 = os.stat(wanted_directory1)[5]
+    self.assertTrue(uid == uid_check_wanted_directory1)
+    self.assertTrue(gid == gid_check_wanted_directory1)
+
+    uid_check_wanted_directory2 = os.stat(wanted_directory2)[4]
+    gid_check_wanted_directory2 = os.stat(wanted_directory2)[5]
+    self.assertTrue(uid == uid_check_wanted_directory2)
+    self.assertTrue(gid == gid_check_wanted_directory2)
+
+    uid_check_file_txt = os.stat(create_file_txt[1])[4]
+    gid_check_file_txt = os.stat(create_file_txt[1])[5]
+    self.assertTrue(uid == uid_check_file_txt)
+    self.assertTrue(gid == gid_check_file_txt)
+
+    shutil.rmtree(root_slaptest)
 
 if __name__ == '__main__':
   unittest.main()
diff --git a/slapos/util.py b/slapos/util.py
index fcb300f00dc2aa641872b3fa3355a6300bd5d6b4..43a5654ff613adf2ff1abd5137472f7dc5e093a4 100644
--- a/slapos/util.py
+++ b/slapos/util.py
@@ -17,3 +17,10 @@ def mkdir_p(path, mode=0o777):
         else:
             raise
 
+def chownDirectory(path, uid, gid):
+  os.chown(path, uid, gid)
+  for root, dirs, files in os.walk(path):
+    for items in dirs, files:
+      for item in items:
+        if not os.path.islink(os.path.join(root, item)):
+          os.chown(os.path.join(root, item), uid, gid)