diff --git a/src/main/java/com/ericsson/gerrit/plugins/projectgroupstructure/Module.java b/src/main/java/com/ericsson/gerrit/plugins/projectgroupstructure/Module.java
index 5e80a96..088f253 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/projectgroupstructure/Module.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/projectgroupstructure/Module.java
@@ -18,7 +18,6 @@
 import com.google.gerrit.server.validators.ProjectCreationValidationListener;
 import com.google.inject.AbstractModule;
 
-
 class Module extends AbstractModule {
   @Override
   protected void configure() {
diff --git a/src/main/java/com/ericsson/gerrit/plugins/projectgroupstructure/ProjectCreationValidator.java b/src/main/java/com/ericsson/gerrit/plugins/projectgroupstructure/ProjectCreationValidator.java
index b7923bc..4a7f6a4 100644
--- a/src/main/java/com/ericsson/gerrit/plugins/projectgroupstructure/ProjectCreationValidator.java
+++ b/src/main/java/com/ericsson/gerrit/plugins/projectgroupstructure/ProjectCreationValidator.java
@@ -26,8 +26,8 @@
 import com.google.gerrit.extensions.restapi.TopLevelResource;
 import com.google.gerrit.reviewdb.client.AccountGroup;
 import com.google.gerrit.reviewdb.client.Project;
-import com.google.gerrit.server.config.AllProjectsNameProvider;
 import com.google.gerrit.server.account.GroupMembership;
+import com.google.gerrit.server.config.AllProjectsNameProvider;
 import com.google.gerrit.server.config.PluginConfigFactory;
 import com.google.gerrit.server.group.CreateGroup;
 import com.google.gerrit.server.project.CreateProjectArgs;
@@ -38,23 +38,18 @@
 import com.google.gwtorm.server.OrmException;
 import com.google.inject.Inject;
 import com.google.inject.Singleton;
-
+import java.io.IOException;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import java.io.IOException;
-
 @Singleton
-public class ProjectCreationValidator
-    implements ProjectCreationValidationListener {
-  private static final Logger log =
-      LoggerFactory.getLogger(ProjectCreationValidator.class);
+public class ProjectCreationValidator implements ProjectCreationValidationListener {
+  private static final Logger log = LoggerFactory.getLogger(ProjectCreationValidator.class);
 
   private static final String AN_ERROR_OCCURRED_MSG =
       "An error occurred while creating project, please contact Gerrit support";
 
-  private static final String SEE_DOCUMENTATION_MSG =
-      "\n\nSee documentation for more info: %s";
+  private static final String SEE_DOCUMENTATION_MSG = "\n\nSee documentation for more info: %s";
 
   private static final String MUST_BE_OWNER_TO_CREATE_PROJECT_MSG =
       "You must be owner of the parent project \"%s\" to create a nested project."
@@ -71,20 +66,18 @@
           + "Please create a root parent project (project with option "
           + "\"Only serve as parent for other projects\") that will hold "
           + "all your access rights and then create your regular project that "
-          + "inherits rights from your root project.\n\n" + "Example:\n"
+          + "inherits rights from your root project.\n\n"
+          + "Example:\n"
           + "\"someOrganization\"->parent project\n"
           + "\"someOrganization/someProject\"->regular project."
           + SEE_DOCUMENTATION_MSG;
 
   private static final String PROJECT_MUST_START_WITH_PARENT_NAME_MSG =
-      "Project name must start with parent project name, e.g. %s."
-          + SEE_DOCUMENTATION_MSG;
+      "Project name must start with parent project name, e.g. %s." + SEE_DOCUMENTATION_MSG;
 
-  static final String DELEGATE_PROJECT_CREATION_TO =
-      "delegateProjectCreationTo";
+  static final String DELEGATE_PROJECT_CREATION_TO = "delegateProjectCreationTo";
 
-  static final String DISABLE_GRANTING_PROJECT_OWNERSHIP =
-      "disableGrantingProjectOwnership";
+  static final String DISABLE_GRANTING_PROJECT_OWNERSHIP = "disableGrantingProjectOwnership";
 
   private final CreateGroup.Factory createGroupFactory;
   private final String documentationUrl;
@@ -93,7 +86,8 @@
   private final String pluginName;
 
   @Inject
-  public ProjectCreationValidator(CreateGroup.Factory createGroupFactory,
+  public ProjectCreationValidator(
+      CreateGroup.Factory createGroupFactory,
       @PluginCanonicalWebUrl String url,
       AllProjectsNameProvider allProjectsName,
       PluginConfigFactory cfg,
@@ -106,8 +100,7 @@
   }
 
   @Override
-  public void validateNewProject(CreateProjectArgs args)
-      throws ValidationException {
+  public void validateNewProject(CreateProjectArgs args) throws ValidationException {
     String name = args.getProjectName();
     log.debug("validating creation of {}", name);
     if (name.contains(" ")) {
@@ -141,97 +134,95 @@
   private boolean configDisableGrantingOwnership(ProjectControl parentCtrl)
       throws ValidationException {
     try {
-      return cfg
-          .getFromProjectConfigWithInheritance(
+      return cfg.getFromProjectConfigWithInheritance(
               parentCtrl.getProject().getNameKey(), pluginName)
           .getBoolean(DISABLE_GRANTING_PROJECT_OWNERSHIP, false);
     } catch (NoSuchProjectException e) {
-      log.error("Failed to check project config for "
-          + parentCtrl.getProject().getName() + ": " + e.getMessage(), e);
+      log.error(
+          "Failed to check project config for "
+              + parentCtrl.getProject().getName()
+              + ": "
+              + e.getMessage(),
+          e);
       throw new ValidationException(AN_ERROR_OCCURRED_MSG);
     }
   }
 
-  private AccountGroup.UUID createGroup(String name)
-      throws ValidationException {
+  private AccountGroup.UUID createGroup(String name) throws ValidationException {
     try {
       GroupInfo groupInfo = null;
       try {
-        groupInfo = createGroupFactory.create(name)
-            .apply(TopLevelResource.INSTANCE, new GroupInput());
+        groupInfo =
+            createGroupFactory.create(name).apply(TopLevelResource.INSTANCE, new GroupInput());
       } catch (ResourceConflictException e) {
         // name already exists, make sure it is unique by adding a abbreviated
         // sha1
-        String nameWithSha1 = name + "-" + Hashing.sha256()
-            .hashString(name, Charsets.UTF_8).toString().substring(0, 7);
+        String nameWithSha1 =
+            name
+                + "-"
+                + Hashing.sha256().hashString(name, Charsets.UTF_8).toString().substring(0, 7);
         log.info(
             "Failed to create group name {} because of a conflict: {}, trying to create {} instead",
-            name, e.getMessage(), nameWithSha1);
-        groupInfo = createGroupFactory.create(nameWithSha1)
-            .apply(TopLevelResource.INSTANCE, new GroupInput());
+            name,
+            e.getMessage(),
+            nameWithSha1);
+        groupInfo =
+            createGroupFactory
+                .create(nameWithSha1)
+                .apply(TopLevelResource.INSTANCE, new GroupInput());
       }
       return AccountGroup.UUID.parse(groupInfo.id);
-    } catch (RestApiException | OrmException | IOException e ) {
+    } catch (RestApiException | OrmException | IOException e) {
       log.error("Failed to create project " + name + ": " + e.getMessage(), e);
       throw new ValidationException(AN_ERROR_OCCURRED_MSG);
     }
   }
 
-  private void validateRootProject(String name, boolean permissionOnly)
-      throws ValidationException {
+  private void validateRootProject(String name, boolean permissionOnly) throws ValidationException {
     log.debug("validating root project name {}", name);
     if (name.contains("/")) {
       log.debug("rejecting creation of {}: name contains slashes", name);
-      throw new ValidationException(String
-          .format(ROOT_PROJECT_CANNOT_CONTAINS_SLASHES_MSG, documentationUrl));
+      throw new ValidationException(
+          String.format(ROOT_PROJECT_CANNOT_CONTAINS_SLASHES_MSG, documentationUrl));
     }
     if (!permissionOnly) {
-      log.debug("rejecting creation of {}: missing permissions only option",
-          name);
-      throw new ValidationException(String
-          .format(REGULAR_PROJECT_NOT_ALLOWED_AS_ROOT_MSG, documentationUrl));
+      log.debug("rejecting creation of {}: missing permissions only option", name);
+      throw new ValidationException(
+          String.format(REGULAR_PROJECT_NOT_ALLOWED_AS_ROOT_MSG, documentationUrl));
     }
     log.debug("allowing creation of root project {}", name);
   }
 
-  private void validateProject(String name, ProjectControl parentCtrl)
-      throws ValidationException {
+  private void validateProject(String name, ProjectControl parentCtrl) throws ValidationException {
     log.debug("validating name prefix of {}", name);
     Project parent = parentCtrl.getProject();
     String prefix = parent.getName() + "/";
     if (!name.startsWith(prefix)) {
-      log.debug("rejecting creation of {}: name is not starting with {}", name,
-          prefix);
+      log.debug("rejecting creation of {}: name is not starting with {}", name, prefix);
       throw new ValidationException(
-          String.format(PROJECT_MUST_START_WITH_PARENT_NAME_MSG, prefix + name,
-              documentationUrl));
+          String.format(PROJECT_MUST_START_WITH_PARENT_NAME_MSG, prefix + name, documentationUrl));
     }
     if (!parentCtrl.isOwner() && !isInDelegatingGroup(parentCtrl)) {
-      log.debug("rejecting creation of {}: user is not owner of {}", name,
-          parent.getName());
+      log.debug("rejecting creation of {}: user is not owner of {}", name, parent.getName());
       throw new ValidationException(
-          String.format(MUST_BE_OWNER_TO_CREATE_PROJECT_MSG, parent.getName(),
-              documentationUrl));
+          String.format(MUST_BE_OWNER_TO_CREATE_PROJECT_MSG, parent.getName(), documentationUrl));
     }
     log.debug("allowing creation of project {}", name);
   }
 
   private boolean isInDelegatingGroup(ProjectControl parentCtrl) {
     try {
-      GroupReference delegateProjectCreationTo = cfg
-          .getFromProjectConfigWithInheritance(
-              parentCtrl.getProject().getNameKey(), pluginName)
-          .getGroupReference(DELEGATE_PROJECT_CREATION_TO);
+      GroupReference delegateProjectCreationTo =
+          cfg.getFromProjectConfigWithInheritance(parentCtrl.getProject().getNameKey(), pluginName)
+              .getGroupReference(DELEGATE_PROJECT_CREATION_TO);
       if (delegateProjectCreationTo == null) {
         return false;
       }
       log.debug("delegateProjectCreationTo: {}", delegateProjectCreationTo);
-      GroupMembership effectiveGroups =
-          parentCtrl.getUser().getEffectiveGroups();
+      GroupMembership effectiveGroups = parentCtrl.getUser().getEffectiveGroups();
       return effectiveGroups.contains(delegateProjectCreationTo.getUUID());
     } catch (NoSuchProjectException e) {
-      log.error("isInDelegatingGroup with error ({}): {}",
-          e.getClass().getName(), e.getMessage());
+      log.error("isInDelegatingGroup with error ({}): {}", e.getClass().getName(), e.getMessage());
       return false;
     }
   }
diff --git a/src/test/java/com/ericsson/gerrit/plugins/projectgroupstructure/ProjectCreationValidatorIT.java b/src/test/java/com/ericsson/gerrit/plugins/projectgroupstructure/ProjectCreationValidatorIT.java
index f5adb68..72dfbe8 100644
--- a/src/test/java/com/ericsson/gerrit/plugins/projectgroupstructure/ProjectCreationValidatorIT.java
+++ b/src/test/java/com/ericsson/gerrit/plugins/projectgroupstructure/ProjectCreationValidatorIT.java
@@ -32,13 +32,12 @@
 import com.google.gerrit.reviewdb.client.Project;
 import com.google.gerrit.server.git.ProjectConfig;
 import com.google.gerrit.server.project.ProjectState;
-
 import org.junit.Before;
 import org.junit.Test;
 
 @TestPlugin(
-    name = "project-group-structure",
-    sysModule = "com.ericsson.gerrit.plugins.projectgroupstructure.Module"
+  name = "project-group-structure",
+  sysModule = "com.ericsson.gerrit.plugins.projectgroupstructure.Module"
 )
 public class ProjectCreationValidatorIT extends LightweightPluginDaemonTest {
 
@@ -58,22 +57,18 @@
   public void shouldProjectWithASpaceInTheirName() throws Exception {
     ProjectInput in = new ProjectInput();
     in.permissionsOnly = true;
-    RestResponse r =
-        userRestSession.put("/projects/" + Url.encode("project with space"), in);
+    RestResponse r = userRestSession.put("/projects/" + Url.encode("project with space"), in);
     r.assertConflict();
-    assertThat(r.getEntityContent())
-        .contains("Project name cannot contains spaces");
+    assertThat(r.getEntityContent()).contains("Project name cannot contains spaces");
   }
 
   @Test
   public void shouldAllowAnyUsersToCreateUnderAllProjects() throws Exception {
     ProjectInput in = new ProjectInput();
     in.permissionsOnly = true;
-    adminRestSession.put("/projects/" + name("someProject"), in)
-        .assertCreated();
+    adminRestSession.put("/projects/" + name("someProject"), in).assertCreated();
 
-    userRestSession.put("/projects/" + name("someOtherProject"), in)
-        .assertCreated();
+    userRestSession.put("/projects/" + name("someOtherProject"), in).assertCreated();
   }
 
   @Test
@@ -85,16 +80,13 @@
     userRestSession.put("/projects/" + parent, in).assertCreated();
 
     // Creation is rejected when root project name contains slashes
-    RestResponse r =
-        userRestSession.put("/projects/" + Url.encode("a/parentProject"), in);
+    RestResponse r = userRestSession.put("/projects/" + Url.encode("a/parentProject"), in);
     r.assertConflict();
-    assertThat(r.getEntityContent())
-        .contains("Root project name cannot contains slashes");
+    assertThat(r.getEntityContent()).contains("Root project name cannot contains slashes");
   }
 
   @Test
-  public void shouldBlockProjectWithParentNotPartOfProjectName()
-      throws Exception {
+  public void shouldBlockProjectWithParentNotPartOfProjectName() throws Exception {
     // Root project is OK without parent part of the name
     ProjectInput in = new ProjectInput();
     in.permissionsOnly = true;
@@ -106,20 +98,17 @@
     in.parent = parent;
     RestResponse r = userRestSession.put("/projects/childProject", in);
     r.assertConflict();
-    assertThat(r.getEntityContent())
-        .contains("Project name must start with parent project name");
+    assertThat(r.getEntityContent()).contains("Project name must start with parent project name");
 
     // Creation is OK when project name starts with parent
-    userRestSession.put("/projects/" + Url.encode(parent + "/childProject"), in)
-        .assertCreated();
+    userRestSession.put("/projects/" + Url.encode(parent + "/childProject"), in).assertCreated();
 
     // Creation is rejected when project name does not start with nested parent
     String nestedParent = parent + "/childProject";
     in.parent = nestedParent;
     r = userRestSession.put("/projects/grandchild", in);
     r.assertConflict();
-    assertThat(r.getEntityContent())
-        .contains("Project name must start with parent project name");
+    assertThat(r.getEntityContent()).contains("Project name must start with parent project name");
 
     // Creation is OK when project name starts with nested parent
     userRestSession
@@ -141,16 +130,13 @@
     // Creation is rejected when user is not owner of parent
     in = new ProjectInput();
     in.parent = parent;
-    RestResponse r = userRestSession
-        .put("/projects/" + Url.encode(parent + "/childProject"), in);
+    RestResponse r = userRestSession.put("/projects/" + Url.encode(parent + "/childProject"), in);
     r.assertConflict();
-    assertThat(r.getEntityContent())
-        .contains("You must be owner of the parent project");
+    assertThat(r.getEntityContent()).contains("You must be owner of the parent project");
 
     // Creation is OK when user is owner of parent
     g.addMembers(user.username);
-    userRestSession.put("/projects/" + Url.encode(parent + "/childProject"), in)
-        .assertCreated();
+    userRestSession.put("/projects/" + Url.encode(parent + "/childProject"), in).assertCreated();
   }
 
   @Test
@@ -164,8 +150,7 @@
     // Child project without name of parent as prefix
     in = new ProjectInput();
     in.parent = parent;
-    adminRestSession.put("/projects/" + Url.encode("orgA/childProject"), in)
-        .assertCreated();
+    adminRestSession.put("/projects/" + Url.encode("orgA/childProject"), in).assertCreated();
   }
 
   @Test
@@ -175,11 +160,10 @@
     ProjectInput in = new ProjectInput();
     in.permissionsOnly = true;
     userRestSession.put("/projects/" + rootProject, in).assertCreated();
-    ProjectState projectState =
-        projectCache.get(new Project.NameKey(rootProject));
+    ProjectState projectState = projectCache.get(new Project.NameKey(rootProject));
     assertThat(projectState.getOwners().size()).isEqualTo(1);
-    assertThat(projectState.getOwners()).contains(groupCache
-        .get(new AccountGroup.NameKey(rootProject + "-admins")).getGroupUUID());
+    assertThat(projectState.getOwners())
+        .contains(groupCache.get(new AccountGroup.NameKey(rootProject + "-admins")).getGroupUUID());
 
     // case when <project-name>-admins group already exists
     rootProject = name("rootProject2");
@@ -188,19 +172,22 @@
     userRestSession.put("/projects/" + rootProject, in).assertCreated();
     projectState = projectCache.get(new Project.NameKey(rootProject));
     assertThat(projectState.getOwners().size()).isEqualTo(1);
-    String expectedOwnerGroup = existingGroupName + "-"
-        + Hashing.sha256().hashString(existingGroupName, Charsets.UTF_8)
-            .toString().substring(0, 7);
-    assertThat(projectState.getOwners()).contains(groupCache
-        .get(new AccountGroup.NameKey(expectedOwnerGroup)).getGroupUUID());
+    String expectedOwnerGroup =
+        existingGroupName
+            + "-"
+            + Hashing.sha256()
+                .hashString(existingGroupName, Charsets.UTF_8)
+                .toString()
+                .substring(0, 7);
+    assertThat(projectState.getOwners())
+        .contains(groupCache.get(new AccountGroup.NameKey(expectedOwnerGroup)).getGroupUUID());
   }
 
   @Test
   public void shouldBlockRootCodeProject() throws Exception {
     RestResponse r = userRestSession.put("/projects/" + Url.encode("project1"));
     r.assertConflict();
-    assertThat(r.getEntityContent())
-        .contains("Regular projects are not allowed as root");
+    assertThat(r.getEntityContent()).contains("Regular projects are not allowed as root");
   }
 
   @Test
@@ -216,11 +203,9 @@
 
     in = new ProjectInput();
     in.parent = parent;
-    RestResponse r = userRestSession
-        .put("/projects/" + Url.encode(parent + "/childProject"), in);
+    RestResponse r = userRestSession.put("/projects/" + Url.encode(parent + "/childProject"), in);
     r.assertConflict();
-    assertThat(r.getEntityContent())
-        .contains("You must be owner of the parent project");
+    assertThat(r.getEntityContent()).contains("You must be owner of the parent project");
 
     // the user is in the delegating group
     String delegatingGroup = name("groupB");
@@ -239,8 +224,7 @@
   }
 
   @Test
-  public void shouldMakeUserOwnerIfNotAlreadyOwnerByInheritance()
-      throws Exception {
+  public void shouldMakeUserOwnerIfNotAlreadyOwnerByInheritance() throws Exception {
     String parent = name("parentProject");
     ProjectInput in = new ProjectInput();
     in.permissionsOnly = true;
@@ -252,37 +236,39 @@
     Project.NameKey parentNameKey = new Project.NameKey(parent);
     ProjectConfig cfg = projectCache.checkedGet(parentNameKey).getConfig();
     String gId = gApi.groups().id(delegatingGroup).get().id;
-    cfg.getPluginConfig(PLUGIN_NAME).setGroupReference(
-        ProjectCreationValidator.DELEGATE_PROJECT_CREATION_TO,
-        new GroupReference(AccountGroup.UUID.parse(gId), delegatingGroup));
+    cfg.getPluginConfig(PLUGIN_NAME)
+        .setGroupReference(
+            ProjectCreationValidator.DELEGATE_PROJECT_CREATION_TO,
+            new GroupReference(AccountGroup.UUID.parse(gId), delegatingGroup));
     saveProjectConfig(parentNameKey, cfg);
 
     // normal case, when <project-name>-admins group does not exist
     in = new ProjectInput();
     in.parent = parent;
     String childProject = parent + "/childProject";
-    userRestSession.put("/projects/" + Url.encode(childProject), in)
-        .assertCreated();
-    ProjectState projectState =
-        projectCache.get(new Project.NameKey(childProject));
+    userRestSession.put("/projects/" + Url.encode(childProject), in).assertCreated();
+    ProjectState projectState = projectCache.get(new Project.NameKey(childProject));
     assertThat(projectState.getOwners().size()).isEqualTo(1);
-    assertThat(projectState.getOwners()).contains(
-        groupCache.get(new AccountGroup.NameKey(childProject + "-admins"))
-            .getGroupUUID());
+    assertThat(projectState.getOwners())
+        .contains(
+            groupCache.get(new AccountGroup.NameKey(childProject + "-admins")).getGroupUUID());
 
     // case when <project-name>-admins group already exists
     String childProject2 = parent + "/childProject2";
     String existingGroupName = childProject2 + "-admins";
     gApi.groups().create(existingGroupName);
-    userRestSession.put("/projects/" + Url.encode(childProject2), in)
-        .assertCreated();
+    userRestSession.put("/projects/" + Url.encode(childProject2), in).assertCreated();
     projectState = projectCache.get(new Project.NameKey(childProject2));
     assertThat(projectState.getOwners().size()).isEqualTo(1);
-    String expectedOwnerGroup = existingGroupName + "-"
-        + Hashing.sha256().hashString(existingGroupName, Charsets.UTF_8)
-            .toString().substring(0, 7);
-    assertThat(projectState.getOwners()).contains(groupCache
-        .get(new AccountGroup.NameKey(expectedOwnerGroup)).getGroupUUID());
+    String expectedOwnerGroup =
+        existingGroupName
+            + "-"
+            + Hashing.sha256()
+                .hashString(existingGroupName, Charsets.UTF_8)
+                .toString()
+                .substring(0, 7);
+    assertThat(projectState.getOwners())
+        .contains(groupCache.get(new AccountGroup.NameKey(expectedOwnerGroup)).getGroupUUID());
   }
 
   @Test
@@ -299,20 +285,19 @@
     Project.NameKey parentNameKey = new Project.NameKey(parent);
     ProjectConfig cfg = projectCache.checkedGet(parentNameKey).getConfig();
     String gId = gApi.groups().id(delegatingGroup).get().id;
-    cfg.getPluginConfig(PLUGIN_NAME).setGroupReference(
-        ProjectCreationValidator.DELEGATE_PROJECT_CREATION_TO,
-        new GroupReference(AccountGroup.UUID.parse(gId), delegatingGroup));
-    cfg.getPluginConfig(PLUGIN_NAME).setBoolean(
-        ProjectCreationValidator.DISABLE_GRANTING_PROJECT_OWNERSHIP, true);
+    cfg.getPluginConfig(PLUGIN_NAME)
+        .setGroupReference(
+            ProjectCreationValidator.DELEGATE_PROJECT_CREATION_TO,
+            new GroupReference(AccountGroup.UUID.parse(gId), delegatingGroup));
+    cfg.getPluginConfig(PLUGIN_NAME)
+        .setBoolean(ProjectCreationValidator.DISABLE_GRANTING_PROJECT_OWNERSHIP, true);
     saveProjectConfig(parentNameKey, cfg);
 
     in = new ProjectInput();
     in.parent = parent;
     String childProject = parent + "/childProject";
-    userRestSession.put("/projects/" + Url.encode(childProject), in)
-        .assertCreated();
-    ProjectState projectState =
-        projectCache.get(new Project.NameKey(childProject));
+    userRestSession.put("/projects/" + Url.encode(childProject), in).assertCreated();
+    ProjectState projectState = projectCache.get(new Project.NameKey(childProject));
     assertThat(projectState.getOwners().size()).isEqualTo(0);
   }
 
@@ -329,11 +314,9 @@
 
     in = new ProjectInput();
     in.parent = parent;
-    RestResponse r = userRestSession
-        .put("/projects/" + Url.encode(parent + "/childProject"), in);
+    RestResponse r = userRestSession.put("/projects/" + Url.encode(parent + "/childProject"), in);
     r.assertConflict();
-    assertThat(r.getEntityContent())
-        .contains("You must be owner of the parent project");
+    assertThat(r.getEntityContent()).contains("You must be owner of the parent project");
 
     // the user is in the delegating group
     String delegatingGroup = name("groupB");
@@ -361,11 +344,9 @@
 
     in = new ProjectInput();
     in.parent = parent;
-    RestResponse r = userRestSession
-        .put("/projects/" + Url.encode(parent + "/childProject"), in);
+    RestResponse r = userRestSession.put("/projects/" + Url.encode(parent + "/childProject"), in);
     r.assertConflict();
-    assertThat(r.getEntityContent())
-        .contains("You must be owner of the parent project");
+    assertThat(r.getEntityContent()).contains("You must be owner of the parent project");
 
     // the user is in the nested delegating group
     String delegatingGroup = name("groupB");
@@ -401,11 +382,9 @@
 
     in = new ProjectInput();
     in.parent = parent;
-    RestResponse r = userRestSession
-        .put("/projects/" + Url.encode(parent + "/childProject"), in);
+    RestResponse r = userRestSession.put("/projects/" + Url.encode(parent + "/childProject"), in);
     r.assertConflict();
-    assertThat(r.getEntityContent())
-        .contains("You must be owner of the parent project");
+    assertThat(r.getEntityContent()).contains("You must be owner of the parent project");
 
     // the user is in the delegating group
     String delegatingGroup = name("groupB");
@@ -415,12 +394,12 @@
     Project.NameKey parentNameKey = new Project.NameKey(parent);
     ProjectConfig cfg = projectCache.checkedGet(parentNameKey).getConfig();
     String gId = gApi.groups().id(delegatingGroup).get().id;
-    cfg.getPluginConfig(PLUGIN_NAME).setGroupReference(
-        ProjectCreationValidator.DELEGATE_PROJECT_CREATION_TO,
-        new GroupReference(AccountGroup.UUID.parse(gId), delegatingGroup));
+    cfg.getPluginConfig(PLUGIN_NAME)
+        .setGroupReference(
+            ProjectCreationValidator.DELEGATE_PROJECT_CREATION_TO,
+            new GroupReference(AccountGroup.UUID.parse(gId), delegatingGroup));
     saveProjectConfig(parentNameKey, cfg);
-    userRestSession.put("/projects/" + Url.encode(parent + "/childProject"), in)
-        .assertConflict();
+    userRestSession.put("/projects/" + Url.encode(parent + "/childProject"), in).assertConflict();
   }
 
   @Test
@@ -436,11 +415,9 @@
 
     in = new ProjectInput();
     in.parent = parent;
-    RestResponse r = userRestSession
-        .put("/projects/" + Url.encode(parent + "/childProject"), in);
+    RestResponse r = userRestSession.put("/projects/" + Url.encode(parent + "/childProject"), in);
     r.assertConflict();
-    assertThat(r.getEntityContent())
-        .contains("You must be owner of the parent project");
+    assertThat(r.getEntityContent()).contains("You must be owner of the parent project");
 
     // The delegating group is not created
     String delegatingGroup = name("groupB");
@@ -448,16 +425,16 @@
     Project.NameKey parentNameKey = new Project.NameKey(parent);
     ProjectConfig cfg = projectCache.checkedGet(parentNameKey).getConfig();
     String gId = "fake-gId";
-    cfg.getPluginConfig(PLUGIN_NAME).setGroupReference(
-        ProjectCreationValidator.DELEGATE_PROJECT_CREATION_TO,
-        new GroupReference(AccountGroup.UUID.parse(gId), delegatingGroup));
+    cfg.getPluginConfig(PLUGIN_NAME)
+        .setGroupReference(
+            ProjectCreationValidator.DELEGATE_PROJECT_CREATION_TO,
+            new GroupReference(AccountGroup.UUID.parse(gId), delegatingGroup));
     saveProjectConfig(parentNameKey, cfg);
     userRestSession.put("/projects/" + Url.encode(parent + "/childProject"), in).assertConflict();
   }
 
   @Test
-  public void shouldNotBlockCreationIfDelegatingGroupIsRenamed()
-      throws Exception {
+  public void shouldNotBlockCreationIfDelegatingGroupIsRenamed() throws Exception {
     String ownerGroup = name("groupA");
     gApi.groups().create(ownerGroup);
 
@@ -469,11 +446,9 @@
 
     in = new ProjectInput();
     in.parent = parent;
-    RestResponse r = userRestSession
-        .put("/projects/" + Url.encode(parent + "/childProject"), in);
+    RestResponse r = userRestSession.put("/projects/" + Url.encode(parent + "/childProject"), in);
     r.assertConflict();
-    assertThat(r.getEntityContent())
-        .contains("You must be owner of the parent project");
+    assertThat(r.getEntityContent()).contains("You must be owner of the parent project");
 
     // the user is in the delegating group
     String delegatingGroup = name("groupB");
@@ -484,15 +459,15 @@
     ProjectConfig cfg = projectCache.checkedGet(parentNameKey).getConfig();
 
     String gId = gApi.groups().id(delegatingGroup).get().id;
-    cfg.getPluginConfig("project-group-structure").setGroupReference(
-        ProjectCreationValidator.DELEGATE_PROJECT_CREATION_TO,
-        new GroupReference(AccountGroup.UUID.parse(gId), delegatingGroup));
+    cfg.getPluginConfig("project-group-structure")
+        .setGroupReference(
+            ProjectCreationValidator.DELEGATE_PROJECT_CREATION_TO,
+            new GroupReference(AccountGroup.UUID.parse(gId), delegatingGroup));
     saveProjectConfig(parentNameKey, cfg);
 
     String newDelegatingGroup = name("groupC");
     gApi.groups().id(delegatingGroup).name(newDelegatingGroup);
 
-    userRestSession.put("/projects/" + Url.encode(parent + "/childProject"), in)
-        .assertCreated();
+    userRestSession.put("/projects/" + Url.encode(parent + "/childProject"), in).assertCreated();
   }
 }
