QPID-8374: [Broker-J][ACL] Allow case insensitive mapping of group members to groups in existing GroupProviders

This closes #42
diff --git a/broker-core/src/main/java/org/apache/qpid/server/model/AbstractGroupProvider.java b/broker-core/src/main/java/org/apache/qpid/server/model/AbstractCaseAwareGroupProvider.java
similarity index 81%
rename from broker-core/src/main/java/org/apache/qpid/server/model/AbstractGroupProvider.java
rename to broker-core/src/main/java/org/apache/qpid/server/model/AbstractCaseAwareGroupProvider.java
index 00f97a8..3e248d6 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/model/AbstractGroupProvider.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/model/AbstractCaseAwareGroupProvider.java
@@ -22,21 +22,17 @@
 
 import java.util.Map;
 
-public abstract class AbstractGroupProvider<X extends AbstractGroupProvider<X>>
+public abstract class AbstractCaseAwareGroupProvider<X extends AbstractCaseAwareGroupProvider<X>>
         extends AbstractConfiguredObject<X> implements GroupProvider<X>
 {
-    private final Container<?> _container;
-
     @ManagedAttributeField
     private boolean _caseSensitive;
 
-    protected AbstractGroupProvider(Container<?> container, Map<String, Object> attributes)
+    protected AbstractCaseAwareGroupProvider(Container<?> container, Map<String, Object> attributes)
     {
         super(container, attributes);
-        _container = container;
     }
 
-    @Override
     public boolean isCaseSensitive()
     {
         return _caseSensitive;
diff --git a/broker-core/src/main/java/org/apache/qpid/server/model/GroupProvider.java b/broker-core/src/main/java/org/apache/qpid/server/model/GroupProvider.java
index 1dfa3dd..c698c45 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/model/GroupProvider.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/model/GroupProvider.java
@@ -27,6 +27,4 @@
 {
     Set<Principal> getGroupPrincipalsForUser(Principal userPrincipal);
 
-    @ManagedAttribute(defaultValue = "true", description = "Allow to choose CaseSensitive or CaseInsensitive search of Groups and Users")
-    boolean isCaseSensitive();
-}
\ No newline at end of file
+}
diff --git a/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileBasedGroupProvider.java b/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileBasedGroupProvider.java
index e8c1886..7097941 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileBasedGroupProvider.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileBasedGroupProvider.java
@@ -21,12 +21,12 @@
 package org.apache.qpid.server.model.adapter;
 
 import org.apache.qpid.server.model.GroupManagingGroupProvider;
-import org.apache.qpid.server.model.GroupProvider;
 import org.apache.qpid.server.model.ManagedAttribute;
 import org.apache.qpid.server.model.ManagedObject;
+import org.apache.qpid.server.security.CaseAwareGroupProvider;
 
 @ManagedObject( category = false, type = "GroupFile", managesChildren = true )
-public interface FileBasedGroupProvider<X extends FileBasedGroupProvider<X>> extends GroupProvider<X>, GroupManagingGroupProvider
+public interface FileBasedGroupProvider<X extends FileBasedGroupProvider<X>> extends CaseAwareGroupProvider<X>, GroupManagingGroupProvider
 {
     String PATH="path";
 
diff --git a/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileBasedGroupProviderImpl.java b/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileBasedGroupProviderImpl.java
index f08ed53..3d4f0fc 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileBasedGroupProviderImpl.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/model/adapter/FileBasedGroupProviderImpl.java
@@ -37,6 +37,7 @@
 import org.slf4j.LoggerFactory;
 
 import org.apache.qpid.server.configuration.IllegalConfigurationException;
+import org.apache.qpid.server.model.AbstractCaseAwareGroupProvider;
 import org.apache.qpid.server.model.AbstractConfiguredObject;
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.model.Container;
@@ -53,7 +54,7 @@
 import org.apache.qpid.server.util.FileHelper;
 
 public class FileBasedGroupProviderImpl
-        extends AbstractConfiguredObject<FileBasedGroupProviderImpl> implements FileBasedGroupProvider<FileBasedGroupProviderImpl>
+        extends AbstractCaseAwareGroupProvider<FileBasedGroupProviderImpl> implements FileBasedGroupProvider<FileBasedGroupProviderImpl>
 {
     public static final String GROUP_FILE_PROVIDER_TYPE = "GroupFile";
     private static Logger LOGGER = LoggerFactory.getLogger(FileBasedGroupProviderImpl.class);
@@ -63,9 +64,6 @@
     private FileGroupDatabase _groupDatabase;
 
     @ManagedAttributeField
-    private boolean _caseSensitive;
-
-    @ManagedAttributeField
     private String _path;
 
     @ManagedObjectFactoryConstructor
@@ -73,8 +71,6 @@
                                       Container<?> container)
     {
         super(container, attributes);
-
-
         _container = container;
     }
 
@@ -312,12 +308,6 @@
         }
     }
 
-    @Override
-    public boolean isCaseSensitive()
-    {
-        return _caseSensitive;
-    }
-
     private class GroupAdapter extends AbstractConfiguredObject<GroupAdapter> implements Group<GroupAdapter>
     {
         public GroupAdapter(Map<String, Object> attributes)
diff --git a/broker-core/src/main/java/org/apache/qpid/server/security/CaseAwareGroupProvider.java b/broker-core/src/main/java/org/apache/qpid/server/security/CaseAwareGroupProvider.java
new file mode 100644
index 0000000..da0a06b
--- /dev/null
+++ b/broker-core/src/main/java/org/apache/qpid/server/security/CaseAwareGroupProvider.java
@@ -0,0 +1,37 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+package org.apache.qpid.server.security;
+
+import org.apache.qpid.server.model.GroupProvider;
+import org.apache.qpid.server.model.ManagedAttribute;
+import org.apache.qpid.server.model.ManagedContextDefault;
+
+public interface CaseAwareGroupProvider<X extends GroupProvider<X>> extends GroupProvider<X>
+{
+    String GROUP_PROVIDER_CASE_SENSITIVE = "qpid.groupProvider.caseSensitive";
+    @SuppressWarnings("unused")
+    @ManagedContextDefault(name = GROUP_PROVIDER_CASE_SENSITIVE)
+    String DEFAULT_GROUP_PROVIDER_CASE_SENSITIVE = "true";
+
+    @ManagedAttribute(defaultValue = "${" + GROUP_PROVIDER_CASE_SENSITIVE + "}",
+            description = "Allow to choose CaseSensitive or CaseInsensitive search of Groups and Users")
+    boolean isCaseSensitive();
+}
diff --git a/broker-core/src/main/java/org/apache/qpid/server/security/group/GroupProviderImpl.java b/broker-core/src/main/java/org/apache/qpid/server/security/group/GroupProviderImpl.java
index 352104d..558225b 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/security/group/GroupProviderImpl.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/security/group/GroupProviderImpl.java
@@ -29,21 +29,21 @@
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
 
-import org.apache.qpid.server.model.AbstractGroupProvider;
+import org.apache.qpid.server.model.AbstractCaseAwareGroupProvider;
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.model.Container;
 import org.apache.qpid.server.model.Group;
 import org.apache.qpid.server.model.GroupManagingGroupProvider;
 import org.apache.qpid.server.model.GroupMember;
-import org.apache.qpid.server.model.GroupProvider;
 import org.apache.qpid.server.model.ManagedObject;
 import org.apache.qpid.server.model.ManagedObjectFactoryConstructor;
 import org.apache.qpid.server.model.State;
 import org.apache.qpid.server.model.StateTransition;
+import org.apache.qpid.server.security.CaseAwareGroupProvider;
 
 @ManagedObject(category = false, type = GroupProviderImpl.CONFIG_TYPE)
-public class GroupProviderImpl extends AbstractGroupProvider<GroupProviderImpl>
-        implements GroupProvider<GroupProviderImpl>, GroupManagingGroupProvider
+public class GroupProviderImpl extends AbstractCaseAwareGroupProvider<GroupProviderImpl>
+        implements CaseAwareGroupProvider<GroupProviderImpl>, GroupManagingGroupProvider
 {
 
     public static final String CONFIG_TYPE = "ManagedGroupProvider";
diff --git a/broker-core/src/main/java/org/apache/qpid/server/security/group/cloudfoundry/CloudFoundryDashboardManagementGroupProviderImpl.java b/broker-core/src/main/java/org/apache/qpid/server/security/group/cloudfoundry/CloudFoundryDashboardManagementGroupProviderImpl.java
index 99e3212..0e551d1 100644
--- a/broker-core/src/main/java/org/apache/qpid/server/security/group/cloudfoundry/CloudFoundryDashboardManagementGroupProviderImpl.java
+++ b/broker-core/src/main/java/org/apache/qpid/server/security/group/cloudfoundry/CloudFoundryDashboardManagementGroupProviderImpl.java
@@ -49,7 +49,7 @@
 import org.slf4j.LoggerFactory;
 
 import org.apache.qpid.server.configuration.IllegalConfigurationException;
-import org.apache.qpid.server.model.AbstractGroupProvider;
+import org.apache.qpid.server.model.AbstractConfiguredObject;
 import org.apache.qpid.server.model.ConfiguredObject;
 import org.apache.qpid.server.model.Container;
 import org.apache.qpid.server.model.ManagedAttributeField;
@@ -70,7 +70,7 @@
  * See the CloudFoundry docs for more information:
  * http://docs.cloudfoundry.org/services/dashboard-sso.html#checking-user-permissions
  */
-public class CloudFoundryDashboardManagementGroupProviderImpl extends AbstractGroupProvider<CloudFoundryDashboardManagementGroupProviderImpl>
+public class CloudFoundryDashboardManagementGroupProviderImpl extends AbstractConfiguredObject<CloudFoundryDashboardManagementGroupProviderImpl>
         implements CloudFoundryDashboardManagementGroupProvider<CloudFoundryDashboardManagementGroupProviderImpl>
 {
     private static final Logger LOGGER = LoggerFactory.getLogger(CloudFoundryDashboardManagementGroupProviderImpl.class);
diff --git a/broker-core/src/test/java/org/apache/qpid/server/security/group/FileGroupDatabaseCaseInsensitiveTest.java b/broker-core/src/test/java/org/apache/qpid/server/security/group/FileGroupDatabaseCaseInsensitiveTest.java
index d393c3a..b712387 100644
--- a/broker-core/src/test/java/org/apache/qpid/server/security/group/FileGroupDatabaseCaseInsensitiveTest.java
+++ b/broker-core/src/test/java/org/apache/qpid/server/security/group/FileGroupDatabaseCaseInsensitiveTest.java
@@ -29,6 +29,7 @@
 import java.util.Set;
 
 import org.junit.After;
+import org.junit.Before;
 import org.junit.Test;
 
 import org.apache.qpid.test.utils.UnitTestBase;
@@ -44,36 +45,30 @@
     private static final String MY_GROUP1 = "myGroup1";
 
     private static final boolean CASE_SENSITIVE = false;
-    private static final FileGroupDatabase FILE_GROUP_DATABASE = new FileGroupDatabase(CASE_SENSITIVE);
-    private static final GroupProviderUtil UTIL;
-    private static final String GROUP_FILE;
+    private FileGroupDatabase _fileGroupDatabase;
+    private GroupProviderUtil _util;
+    private String _groupFile;
 
-    static
+    @Before
+    public void setUp() throws IOException
     {
-        try
-        {
-            UTIL = new GroupProviderUtil(FILE_GROUP_DATABASE);
-            GROUP_FILE = UTIL.getGroupFile();
-        }
-        catch (IOException e)
-        {
-           throw new RuntimeException(e);
-        }
+        _fileGroupDatabase = new FileGroupDatabase(CASE_SENSITIVE);
+        _util = new GroupProviderUtil(_fileGroupDatabase);
+        _groupFile = _util.getGroupFile();
     }
 
     @Test
     public void testGetUsersInGroupCaseInsensitive() throws Exception
     {
-        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2,user3");
-        FILE_GROUP_DATABASE.setGroupFile(GROUP_FILE);
+        _util.writeAndSetGroupFile("myGroup.users", "user1,user2,user3");
 
-        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
+        Set<String> users = _fileGroupDatabase.getUsersInGroup(MY_GROUP);
         assertNotNull(users);
         assertEquals(3, users.size());
-        Set<String> users2 = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP.toUpperCase());
+        Set<String> users2 = _fileGroupDatabase.getUsersInGroup(MY_GROUP.toUpperCase());
         assertNotNull(users2);
         assertEquals(3, users2.size());
-        Set<String> users3 = FILE_GROUP_DATABASE.getUsersInGroup("MyGrouP");
+        Set<String> users3 = _fileGroupDatabase.getUsersInGroup("MyGrouP");
         assertNotNull(users3);
         assertEquals(3, users3.size());
     }
@@ -81,9 +76,9 @@
     @Test
     public void testDuplicateUsersInGroupAreConflatedCaseInsensitive() throws Exception
     {
-        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user1,user3,user1");
+        _util.writeAndSetGroupFile("myGroup.users", "user1,user1,user3,user1");
 
-        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP.toUpperCase());
+        Set<String> users = _fileGroupDatabase.getUsersInGroup(MY_GROUP.toUpperCase());
         assertNotNull(users);
         assertEquals(2, users.size());
     }
@@ -91,9 +86,9 @@
     @Test
     public void testGetUsersWithEmptyGroupCaseInsensitive() throws Exception
     {
-        UTIL.writeAndSetGroupFile("myGroup.users", "");
+        _util.writeAndSetGroupFile("myGroup.users", "");
 
-        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP.toUpperCase());
+        Set<String> users = _fileGroupDatabase.getUsersInGroup(MY_GROUP.toUpperCase());
         assertNotNull(users);
         assertTrue(users.isEmpty());
     }
@@ -101,14 +96,13 @@
     @Test
     public void testGetGroupPrincipalsForUserWhenUserBelongsToOneGroupCaseInsensitive() throws Exception
     {
-        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2");
-        FILE_GROUP_DATABASE.setGroupFile(GROUP_FILE);
+        _util.writeAndSetGroupFile("myGroup.users", "user1,user2");
 
-        Set<String> groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1.toUpperCase());
+        Set<String> groups = _fileGroupDatabase.getGroupsForUser(USER1.toUpperCase());
         assertEquals(1, groups.size());
         assertTrue(groups.contains(MY_GROUP));
 
-        Set<String> groups2 = FILE_GROUP_DATABASE.getGroupsForUser("User2");
+        Set<String> groups2 = _fileGroupDatabase.getGroupsForUser("User2");
         assertEquals(1, groups2.size());
         assertTrue(groups2.contains(MY_GROUP));
     }
@@ -116,17 +110,16 @@
     @Test
     public void testGetGroupPrincipalsForUserWhenUserBelongsToTwoGroupCaseInsensitive() throws Exception
     {
-        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2",
-                                  "myGroup1.users", "user1,user3",
-                                  "myGroup2.users", "user2,user3");
-        FILE_GROUP_DATABASE.setGroupFile(GROUP_FILE);
+        _util.writeAndSetGroupFile("myGroup.users", "user1,user2",
+                                   "myGroup1.users", "user1,user3",
+                                   "myGroup2.users", "user2,user3");
 
-        Set<String> groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1.toUpperCase());
+        Set<String> groups = _fileGroupDatabase.getGroupsForUser(USER1.toUpperCase());
         assertEquals(2, groups.size());
         assertTrue(groups.contains(MY_GROUP));
         assertTrue(groups.contains(MY_GROUP1));
 
-        Set<String> groups2 = FILE_GROUP_DATABASE.getGroupsForUser("User2");
+        Set<String> groups2 = _fileGroupDatabase.getGroupsForUser("User2");
         assertEquals(2, groups2.size());
         assertTrue(groups2.contains(MY_GROUP));
         assertTrue(groups2.contains(MY_GROUP2));
@@ -135,19 +128,19 @@
     @Test
     public void testGetGroupPrincipalsForUserWhenUserAddedToGroupCaseInsensitive() throws Exception
     {
-        UTIL.writeAndSetGroupFile("myGroup1.users", "user1,user2", "myGroup2.users", USER2);
-        Set<String> groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1.toUpperCase());
+        _util.writeAndSetGroupFile("myGroup1.users", "user1,user2", "myGroup2.users", USER2);
+        Set<String> groups = _fileGroupDatabase.getGroupsForUser(USER1.toUpperCase());
         assertEquals(1, groups.size());
         assertTrue(groups.contains(MY_GROUP1));
 
-        FILE_GROUP_DATABASE.addUserToGroup(USER1, MY_GROUP2.toUpperCase());
+        _fileGroupDatabase.addUserToGroup(USER1, MY_GROUP2.toUpperCase());
 
-        groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1.toUpperCase());
+        groups = _fileGroupDatabase.getGroupsForUser(USER1.toUpperCase());
         assertEquals(2, groups.size());
         assertTrue(groups.contains(MY_GROUP1));
         assertTrue(groups.contains(MY_GROUP2));
 
-        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP2.toUpperCase());
+        Set<String> users = _fileGroupDatabase.getUsersInGroup(MY_GROUP2.toUpperCase());
         assertEquals(2, users.size());
         assertTrue(users.contains(USER1));
         assertTrue(users.contains(USER2));
@@ -156,15 +149,15 @@
     @Test
     public void testGetGroupPrincipalsForUserWhenUserRemovedFromGroupCaseInsensitive() throws Exception
     {
-        UTIL.writeAndSetGroupFile("myGroup1.users", "user1,user2", "myGroup2.users", "user1,user2");
-        Set<String> groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1);
+        _util.writeAndSetGroupFile("myGroup1.users", "user1,user2", "myGroup2.users", "user1,user2");
+        Set<String> groups = _fileGroupDatabase.getGroupsForUser(USER1);
         assertEquals(2, groups.size());
         assertTrue(groups.contains(MY_GROUP1));
         assertTrue(groups.contains(MY_GROUP2));
 
-        FILE_GROUP_DATABASE.removeUserFromGroup(USER1, MY_GROUP2);
+        _fileGroupDatabase.removeUserFromGroup(USER1, MY_GROUP2);
 
-        groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1);
+        groups = _fileGroupDatabase.getGroupsForUser(USER1);
         assertEquals(1, groups.size());
         assertTrue(groups.contains(MY_GROUP1));
     }
@@ -172,15 +165,15 @@
     @Test
     public void testGetGroupPrincipalsForUserWhenUserAddedToGroupTheyAreAlreadyInCaseInsensitive() throws Exception
     {
-        UTIL.writeAndSetGroupFile("myGroup.users", USER1);
-        FILE_GROUP_DATABASE.addUserToGroup(USER1, MY_GROUP);
+        _util.writeAndSetGroupFile("myGroup.users", USER1);
+        _fileGroupDatabase.addUserToGroup(USER1, MY_GROUP);
 
-        Set<String> groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1.toUpperCase());
+        Set<String> groups = _fileGroupDatabase.getGroupsForUser(USER1.toUpperCase());
 
         assertEquals(1, groups.size());
         assertTrue(groups.contains(MY_GROUP));
 
-        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP.toUpperCase());
+        Set<String> users = _fileGroupDatabase.getUsersInGroup(MY_GROUP.toUpperCase());
         assertEquals(1, users.size());
         assertTrue(users.contains(USER1));
     }
@@ -188,30 +181,30 @@
     @Test
     public void testGetGroupPrincipalsForUserWhenUserNotKnownCaseInsensitive() throws Exception
     {
-        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2");
-        Set<String> groups = FILE_GROUP_DATABASE.getGroupsForUser(USER3.toUpperCase());
+        _util.writeAndSetGroupFile("myGroup.users", "user1,user2");
+        Set<String> groups = _fileGroupDatabase.getGroupsForUser(USER3.toUpperCase());
         assertTrue(groups.isEmpty());
     }
 
     @Test
     public void testGetGroupPrincipalsForNullUserCaseInsensitive() throws Exception
     {
-        UTIL.writeAndSetGroupFile();
-        assertTrue(FILE_GROUP_DATABASE.getGroupsForUser(null).isEmpty());
+        _util.writeAndSetGroupFile();
+        assertTrue(_fileGroupDatabase.getGroupsForUser(null).isEmpty());
     }
 
     @Test
     public void testAddUserToExistingGroupCaseInsensitive() throws Exception
     {
-        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2");
+        _util.writeAndSetGroupFile("myGroup.users", "user1,user2");
 
-        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP.toUpperCase());
+        Set<String> users = _fileGroupDatabase.getUsersInGroup(MY_GROUP.toUpperCase());
         assertNotNull(users);
         assertEquals(2, users.size());
 
-        FILE_GROUP_DATABASE.addUserToGroup(USER3, MY_GROUP);
+        _fileGroupDatabase.addUserToGroup(USER3, MY_GROUP);
 
-        users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP.toUpperCase());
+        users = _fileGroupDatabase.getUsersInGroup(MY_GROUP.toUpperCase());
         assertNotNull(users);
         assertEquals(3, users.size());
     }
@@ -219,15 +212,15 @@
     @Test
     public void testAddUserToEmptyGroupCaseInsensitive() throws Exception
     {
-        UTIL.writeAndSetGroupFile("myGroup.users", "");
+        _util.writeAndSetGroupFile("myGroup.users", "");
 
-        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP.toUpperCase());
+        Set<String> users = _fileGroupDatabase.getUsersInGroup(MY_GROUP.toUpperCase());
         assertNotNull(users);
         assertTrue(users.isEmpty());
 
-        FILE_GROUP_DATABASE.addUserToGroup(USER3, MY_GROUP.toUpperCase());
+        _fileGroupDatabase.addUserToGroup(USER3, MY_GROUP.toUpperCase());
 
-        users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
+        users = _fileGroupDatabase.getUsersInGroup(MY_GROUP);
         assertNotNull(users);
         assertEquals(1, users.size());
     }
@@ -235,15 +228,15 @@
     @Test
     public void testAddUserToNonExistentGroupCaseInsensitive() throws Exception
     {
-        UTIL.writeAndSetGroupFile();
+        _util.writeAndSetGroupFile();
 
-        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP.toUpperCase());
+        Set<String> users = _fileGroupDatabase.getUsersInGroup(MY_GROUP.toUpperCase());
         assertNotNull(users);
         assertTrue(users.isEmpty());
 
         try
         {
-            FILE_GROUP_DATABASE.addUserToGroup(USER3, MY_GROUP);
+            _fileGroupDatabase.addUserToGroup(USER3, MY_GROUP);
             fail("Expected exception not thrown");
         }
         catch (IllegalArgumentException e)
@@ -251,7 +244,7 @@
             // pass
         }
 
-        users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
+        users = _fileGroupDatabase.getUsersInGroup(MY_GROUP);
         assertNotNull(users);
         assertTrue(users.isEmpty());
     }
@@ -259,15 +252,15 @@
     @Test
     public void testRemoveUserFromExistingGroupCaseInsensitive() throws Exception
     {
-        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2");
+        _util.writeAndSetGroupFile("myGroup.users", "user1,user2");
 
-        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP.toUpperCase());
+        Set<String> users = _fileGroupDatabase.getUsersInGroup(MY_GROUP.toUpperCase());
         assertNotNull(users);
         assertEquals(2, users.size());
 
-        FILE_GROUP_DATABASE.removeUserFromGroup(USER2.toUpperCase(), MY_GROUP.toUpperCase());
+        _fileGroupDatabase.removeUserFromGroup(USER2.toUpperCase(), MY_GROUP.toUpperCase());
 
-        users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
+        users = _fileGroupDatabase.getUsersInGroup(MY_GROUP);
         assertNotNull(users);
         assertEquals(1, users.size());
     }
@@ -275,11 +268,11 @@
     @Test
     public void testRemoveUserFromNonexistentGroupCaseInsensitive() throws Exception
     {
-        UTIL.writeAndSetGroupFile();
+        _util.writeAndSetGroupFile();
 
         try
         {
-            FILE_GROUP_DATABASE.removeUserFromGroup(USER1.toUpperCase(), MY_GROUP);
+            _fileGroupDatabase.removeUserFromGroup(USER1.toUpperCase(), MY_GROUP);
             fail("Expected exception not thrown");
         }
         catch (IllegalArgumentException e)
@@ -287,35 +280,35 @@
             // pass
         }
 
-        assertTrue(FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP.toUpperCase()).isEmpty());
+        assertTrue(_fileGroupDatabase.getUsersInGroup(MY_GROUP.toUpperCase()).isEmpty());
     }
 
     @Test
     public void testRemoveUserFromGroupTwiceCaseInsensitive() throws Exception
     {
-        UTIL.writeAndSetGroupFile("myGroup.users", USER1);
-        assertTrue(FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP).contains(USER1));
+        _util.writeAndSetGroupFile("myGroup.users", USER1);
+        assertTrue(_fileGroupDatabase.getUsersInGroup(MY_GROUP).contains(USER1));
 
-        FILE_GROUP_DATABASE.removeUserFromGroup(USER1, MY_GROUP.toUpperCase());
-        assertTrue(FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP).isEmpty());
+        _fileGroupDatabase.removeUserFromGroup(USER1, MY_GROUP.toUpperCase());
+        assertTrue(_fileGroupDatabase.getUsersInGroup(MY_GROUP).isEmpty());
 
-        FILE_GROUP_DATABASE.removeUserFromGroup(USER1.toUpperCase(), MY_GROUP);
-        assertTrue(FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP).isEmpty());
+        _fileGroupDatabase.removeUserFromGroup(USER1.toUpperCase(), MY_GROUP);
+        assertTrue(_fileGroupDatabase.getUsersInGroup(MY_GROUP).isEmpty());
     }
 
     @Test
     public void testAddUserPersistedToFileCaseInsensitive() throws Exception
     {
-        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2");
+        _util.writeAndSetGroupFile("myGroup.users", "user1,user2");
 
-        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP.toUpperCase());
+        Set<String> users = _fileGroupDatabase.getUsersInGroup(MY_GROUP.toUpperCase());
         assertEquals(2, users.size());
 
-        FILE_GROUP_DATABASE.addUserToGroup(USER3.toUpperCase(), MY_GROUP);
+        _fileGroupDatabase.addUserToGroup(USER3.toUpperCase(), MY_GROUP);
         assertEquals(3, users.size());
 
         FileGroupDatabase newGroupDatabase = new FileGroupDatabase(CASE_SENSITIVE);
-        newGroupDatabase.setGroupFile(GROUP_FILE);
+        newGroupDatabase.setGroupFile(_groupFile);
 
         Set<String> newUsers = newGroupDatabase.getUsersInGroup(MY_GROUP.toUpperCase());
         assertEquals(users.size(), newUsers.size());
@@ -324,16 +317,16 @@
     @Test
     public void testRemoveUserPersistedToFileCaseInsensitive() throws Exception
     {
-        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2");
+        _util.writeAndSetGroupFile("myGroup.users", "user1,user2");
 
-        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP.toUpperCase());
+        Set<String> users = _fileGroupDatabase.getUsersInGroup(MY_GROUP.toUpperCase());
         assertEquals(2, users.size());
 
-        FILE_GROUP_DATABASE.removeUserFromGroup(USER2.toUpperCase(), MY_GROUP);
+        _fileGroupDatabase.removeUserFromGroup(USER2.toUpperCase(), MY_GROUP);
         assertEquals(1, users.size());
 
         FileGroupDatabase newGroupDatabase = new FileGroupDatabase(CASE_SENSITIVE);
-        newGroupDatabase.setGroupFile(GROUP_FILE);
+        newGroupDatabase.setGroupFile(_groupFile);
 
         Set<String> newUsers = newGroupDatabase.getUsersInGroup(MY_GROUP.toUpperCase());
         assertEquals(users.size(), newUsers.size());
@@ -342,19 +335,19 @@
     @Test
     public void testCreateGroupPersistedToFileCaseInsensitive() throws Exception
     {
-        UTIL.writeAndSetGroupFile();
+        _util.writeAndSetGroupFile();
 
-        Set<String> groups = FILE_GROUP_DATABASE.getAllGroups();
+        Set<String> groups = _fileGroupDatabase.getAllGroups();
         assertTrue(groups.isEmpty());
 
-        FILE_GROUP_DATABASE.createGroup(MY_GROUP);
+        _fileGroupDatabase.createGroup(MY_GROUP);
 
-        groups = FILE_GROUP_DATABASE.getAllGroups();
+        groups = _fileGroupDatabase.getAllGroups();
         assertEquals(1, groups.size());
         assertTrue(groups.contains(MY_GROUP));
 
         FileGroupDatabase newGroupDatabase = new FileGroupDatabase(CASE_SENSITIVE);
-        newGroupDatabase.setGroupFile(GROUP_FILE);
+        newGroupDatabase.setGroupFile(_groupFile);
 
         Set<String> newGroups = newGroupDatabase.getAllGroups();
         assertEquals(1, newGroups.size());
@@ -364,25 +357,25 @@
     @Test
     public void testRemoveGroupPersistedToFileCaseInsensitive() throws Exception
     {
-        UTIL.writeAndSetGroupFile("myGroup1.users", "user1,user2", "myGroup2.users", "user1,user2");
+        _util.writeAndSetGroupFile("myGroup1.users", "user1,user2", "myGroup2.users", "user1,user2");
 
-        Set<String> groups = FILE_GROUP_DATABASE.getAllGroups();
+        Set<String> groups = _fileGroupDatabase.getAllGroups();
         assertEquals(2, groups.size());
 
-        Set<String> groupsForUser1 = FILE_GROUP_DATABASE.getGroupsForUser(USER1.toUpperCase());
+        Set<String> groupsForUser1 = _fileGroupDatabase.getGroupsForUser(USER1.toUpperCase());
         assertEquals(2, groupsForUser1.size());
 
-        FILE_GROUP_DATABASE.removeGroup(MY_GROUP1.toUpperCase());
+        _fileGroupDatabase.removeGroup(MY_GROUP1.toUpperCase());
 
-        groups = FILE_GROUP_DATABASE.getAllGroups();
+        groups = _fileGroupDatabase.getAllGroups();
         assertEquals(1, groups.size());
         assertTrue(groups.contains(MY_GROUP2));
 
-        groupsForUser1 = FILE_GROUP_DATABASE.getGroupsForUser(USER1.toUpperCase());
+        groupsForUser1 = _fileGroupDatabase.getGroupsForUser(USER1.toUpperCase());
         assertEquals(1, groupsForUser1.size());
 
         FileGroupDatabase newGroupDatabase = new FileGroupDatabase(CASE_SENSITIVE);
-        newGroupDatabase.setGroupFile(GROUP_FILE);
+        newGroupDatabase.setGroupFile(_groupFile);
 
         Set<String> newGroups = newGroupDatabase.getAllGroups();
         assertEquals(1, newGroups.size());
@@ -394,12 +387,11 @@
     }
 
     @After
-    public void tearDown() throws Exception
+    public void tearDown()
     {
-
-        if (GROUP_FILE != null)
+        if (_groupFile != null)
         {
-            File groupFile = new File(GROUP_FILE);
+            File groupFile = new File(_groupFile);
             if (groupFile.exists())
             {
                 groupFile.delete();
diff --git a/broker-core/src/test/java/org/apache/qpid/server/security/group/FileGroupDatabaseTest.java b/broker-core/src/test/java/org/apache/qpid/server/security/group/FileGroupDatabaseTest.java
index 408fa7d..9d2590d 100644
--- a/broker-core/src/test/java/org/apache/qpid/server/security/group/FileGroupDatabaseTest.java
+++ b/broker-core/src/test/java/org/apache/qpid/server/security/group/FileGroupDatabaseTest.java
@@ -26,10 +26,10 @@
 
 import java.io.File;
 import java.io.FileNotFoundException;
-import java.io.IOException;
 import java.util.Set;
 
 import org.junit.After;
+import org.junit.Before;
 import org.junit.Test;
 
 import org.apache.qpid.test.utils.UnitTestBase;
@@ -45,39 +45,32 @@
     private static final String MY_GROUP1 = "myGroup1";
 
     private static final boolean CASE_SENSITIVE = true;
-    private static final FileGroupDatabase FILE_GROUP_DATABASE = new FileGroupDatabase(CASE_SENSITIVE);
-    private static final GroupProviderUtil UTIL;
-    private static final String GROUP_FILE;
+    private FileGroupDatabase _fileGroupDatabase;
+    private GroupProviderUtil _util;
+    private String _groupFile;
 
-    static
+    @Before
+    public void setUp() throws Exception
     {
-        try
-        {
-            UTIL = new GroupProviderUtil(FILE_GROUP_DATABASE);
-            GROUP_FILE = UTIL.getGroupFile();
-        }
-        catch (IOException e)
-        {
-            throw new RuntimeException(e);
-        }
+        _fileGroupDatabase = new FileGroupDatabase(CASE_SENSITIVE);
+        _util = new GroupProviderUtil(_fileGroupDatabase);
+        _groupFile = _util.getGroupFile();
     }
 
     @Test
     public void testGetAllGroups() throws Exception
     {
-        UTIL.writeAndSetGroupFile("myGroup.users", USER1);
+        _util.writeAndSetGroupFile("myGroup.users", USER1);
 
-        Set<String> groups = FILE_GROUP_DATABASE.getAllGroups();
+        Set<String> groups = _fileGroupDatabase.getAllGroups();
         assertEquals(1, groups.size());
         assertTrue(groups.contains(MY_GROUP));
     }
 
     @Test
-    public void testGetAllGroupsWhenGroupFileEmpty() throws Exception
+    public void testGetAllGroupsWhenGroupFileEmpty()
     {
-        FILE_GROUP_DATABASE.setGroupFile(UTIL.createEmptyTestGroupFile());
-
-        Set<String> groups = FILE_GROUP_DATABASE.getAllGroups();
+        Set<String> groups = _fileGroupDatabase.getAllGroups();
         assertTrue(groups.isEmpty());
     }
 
@@ -86,7 +79,7 @@
     {
         try
         {
-            FILE_GROUP_DATABASE.setGroupFile("/not/a/file");
+            _fileGroupDatabase.setGroupFile("/not/a/file");
             fail("Exception not thrown");
         }
         catch (FileNotFoundException fnfe)
@@ -98,11 +91,11 @@
     @Test
     public void testInvalidFormat() throws Exception
     {
-        UTIL.writeGroupFile("name.notvalid", USER1);
+        _util.writeGroupFile("name.notvalid", USER1);
 
         try
         {
-            FILE_GROUP_DATABASE.setGroupFile(GROUP_FILE);
+            _fileGroupDatabase.setGroupFile(_groupFile);
             fail("Exception not thrown");
         }
         catch (IllegalArgumentException gde)
@@ -114,11 +107,9 @@
     @Test
     public void testGetUsersInGroup() throws Exception
     {
-        UTIL.writeGroupFile("myGroup.users", "user1,user2,user3");
+        _util.writeAndSetGroupFile("myGroup.users", "user1,user2,user3");
 
-        FILE_GROUP_DATABASE.setGroupFile(GROUP_FILE);
-
-        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
+        Set<String> users = _fileGroupDatabase.getUsersInGroup(MY_GROUP);
         assertNotNull(users);
         assertEquals(3, users.size());
     }
@@ -126,9 +117,9 @@
     @Test
     public void testDuplicateUsersInGroupAreConflated() throws Exception
     {
-        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user1,user3,user1");
+        _util.writeAndSetGroupFile("myGroup.users", "user1,user1,user3,user1");
 
-        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
+        Set<String> users = _fileGroupDatabase.getUsersInGroup(MY_GROUP);
         assertNotNull(users);
         assertEquals(2, users.size());
     }
@@ -136,9 +127,9 @@
     @Test
     public void testGetUsersWithEmptyGroup() throws Exception
     {
-        UTIL.writeAndSetGroupFile("myGroup.users", "");
+        _util.writeAndSetGroupFile("myGroup.users", "");
 
-        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
+        Set<String> users = _fileGroupDatabase.getUsersInGroup(MY_GROUP);
         assertNotNull(users);
         assertTrue(users.isEmpty());
     }
@@ -146,9 +137,9 @@
     @Test
     public void testGetUsersInNonExistentGroup() throws Exception
     {
-        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2,user3");
+        _util.writeAndSetGroupFile("myGroup.users", "user1,user2,user3");
 
-        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup("groupDoesntExist");
+        Set<String> users = _fileGroupDatabase.getUsersInGroup("groupDoesntExist");
         assertNotNull(users);
         assertTrue(users.isEmpty());
     }
@@ -156,15 +147,15 @@
     @Test
     public void testGetUsersInNullGroup() throws Exception
     {
-        UTIL.writeAndSetGroupFile();
-        assertTrue(FILE_GROUP_DATABASE.getUsersInGroup(null).isEmpty());
+        _util.writeAndSetGroupFile();
+        assertTrue(_fileGroupDatabase.getUsersInGroup(null).isEmpty());
     }
 
     @Test
     public void testGetGroupPrincipalsForUserWhenUserBelongsToOneGroup() throws Exception
     {
-        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2");
-        Set<String> groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1);
+        _util.writeAndSetGroupFile("myGroup.users", "user1,user2");
+        Set<String> groups = _fileGroupDatabase.getGroupsForUser(USER1);
         assertEquals(1, groups.size());
         assertTrue(groups.contains(MY_GROUP));
     }
@@ -172,8 +163,8 @@
     @Test
     public void testGetGroupPrincipalsForUserWhenUserBelongsToTwoGroup() throws Exception
     {
-        UTIL.writeAndSetGroupFile("myGroup1.users", "user1,user2", "myGroup2.users", "user1,user3");
-        Set<String> groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1);
+        _util.writeAndSetGroupFile("myGroup1.users", "user1,user2", "myGroup2.users", "user1,user3");
+        Set<String> groups = _fileGroupDatabase.getGroupsForUser(USER1);
         assertEquals(2, groups.size());
         assertTrue(groups.contains(MY_GROUP1));
         assertTrue(groups.contains(MY_GROUP2));
@@ -182,20 +173,20 @@
     @Test
     public void testGetGroupPrincipalsForUserWhenUserAddedToGroup() throws Exception
     {
-        UTIL.writeAndSetGroupFile("myGroup1.users", "user1,user2", "myGroup2.users", USER2);
-        Set<String> groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1);
+        _util.writeAndSetGroupFile("myGroup1.users", "user1,user2", "myGroup2.users", USER2);
+        Set<String> groups = _fileGroupDatabase.getGroupsForUser(USER1);
         assertEquals(1, groups.size());
         assertTrue(groups.contains(MY_GROUP1));
 
-        FILE_GROUP_DATABASE.addUserToGroup(USER1, MY_GROUP2);
+        _fileGroupDatabase.addUserToGroup(USER1, MY_GROUP2);
 
-        groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1);
+        groups = _fileGroupDatabase.getGroupsForUser(USER1);
         assertEquals(2, groups.size());
-        assertTrue(FILE_GROUP_DATABASE.getGroupsForUser(USER1.toUpperCase()).isEmpty());
+        assertTrue(_fileGroupDatabase.getGroupsForUser(USER1.toUpperCase()).isEmpty());
         assertTrue(groups.contains(MY_GROUP1));
         assertTrue(groups.contains(MY_GROUP2));
 
-        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP2);
+        Set<String> users = _fileGroupDatabase.getUsersInGroup(MY_GROUP2);
         assertEquals(2, users.size());
         assertTrue(users.contains(USER1));
         assertTrue(users.contains(USER2));
@@ -204,98 +195,98 @@
     @Test
     public void testGetGroupPrincipalsForUserWhenUserRemovedFromGroup() throws Exception
     {
-        UTIL.writeAndSetGroupFile("myGroup1.users", "user1,user2", "myGroup2.users", "user1,user2");
-        Set<String> groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1);
+        _util.writeAndSetGroupFile("myGroup1.users", "user1,user2", "myGroup2.users", "user1,user2");
+        Set<String> groups = _fileGroupDatabase.getGroupsForUser(USER1);
         assertEquals(2, groups.size());
         assertTrue(groups.contains(MY_GROUP1));
         assertTrue(groups.contains(MY_GROUP2));
 
-        FILE_GROUP_DATABASE.removeUserFromGroup(USER1, MY_GROUP2);
+        _fileGroupDatabase.removeUserFromGroup(USER1, MY_GROUP2);
 
-        groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1);
+        groups = _fileGroupDatabase.getGroupsForUser(USER1);
         assertEquals(1, groups.size());
         assertTrue(groups.contains(MY_GROUP1));
-        assertTrue(FILE_GROUP_DATABASE.getGroupsForUser(USER1.toUpperCase()).isEmpty());
+        assertTrue(_fileGroupDatabase.getGroupsForUser(USER1.toUpperCase()).isEmpty());
     }
 
     @Test
     public void testGetGroupPrincipalsForUserWhenUserAddedToGroupTheyAreAlreadyIn() throws Exception
     {
-        UTIL.writeAndSetGroupFile("myGroup.users", USER1);
-        FILE_GROUP_DATABASE.addUserToGroup(USER1, MY_GROUP);
+        _util.writeAndSetGroupFile("myGroup.users", USER1);
+        _fileGroupDatabase.addUserToGroup(USER1, MY_GROUP);
 
-        Set<String> groups = FILE_GROUP_DATABASE.getGroupsForUser(USER1);
+        Set<String> groups = _fileGroupDatabase.getGroupsForUser(USER1);
 
         assertEquals(1, groups.size());
         assertTrue(groups.contains(MY_GROUP));
 
-        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
+        Set<String> users = _fileGroupDatabase.getUsersInGroup(MY_GROUP);
         assertEquals(1, users.size());
         assertTrue(users.contains(USER1));
-        assertTrue(FILE_GROUP_DATABASE.getGroupsForUser(MY_GROUP.toUpperCase()).isEmpty());
+        assertTrue(_fileGroupDatabase.getGroupsForUser(MY_GROUP.toUpperCase()).isEmpty());
     }
 
     @Test
     public void testGetGroupPrincipalsForUserWhenUserNotKnown() throws Exception
     {
-        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2");
-        Set<String> groups = FILE_GROUP_DATABASE.getGroupsForUser(USER3);
+        _util.writeAndSetGroupFile("myGroup.users", "user1,user2");
+        Set<String> groups = _fileGroupDatabase.getGroupsForUser(USER3);
         assertTrue(groups.isEmpty());
     }
 
     @Test
     public void testGetGroupPrincipalsForNullUser() throws Exception
     {
-        UTIL.writeAndSetGroupFile();
-        assertTrue(FILE_GROUP_DATABASE.getGroupsForUser(null).isEmpty());
+        _util.writeAndSetGroupFile();
+        assertTrue(_fileGroupDatabase.getGroupsForUser(null).isEmpty());
     }
 
     @Test
     public void testAddUserToExistingGroup() throws Exception
     {
-        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2");
+        _util.writeAndSetGroupFile("myGroup.users", "user1,user2");
 
-        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
+        Set<String> users = _fileGroupDatabase.getUsersInGroup(MY_GROUP);
         assertNotNull(users);
         assertEquals(2, users.size());
 
-        FILE_GROUP_DATABASE.addUserToGroup(USER3, MY_GROUP);
+        _fileGroupDatabase.addUserToGroup(USER3, MY_GROUP);
 
-        users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
+        users = _fileGroupDatabase.getUsersInGroup(MY_GROUP);
         assertNotNull(users);
         assertEquals(3, users.size());
-        assertTrue(FILE_GROUP_DATABASE.getGroupsForUser(MY_GROUP.toUpperCase()).isEmpty());
+        assertTrue(_fileGroupDatabase.getGroupsForUser(MY_GROUP.toUpperCase()).isEmpty());
     }
 
     @Test
     public void testAddUserToEmptyGroup() throws Exception
     {
-        UTIL.writeAndSetGroupFile("myGroup.users", "");
+        _util.writeAndSetGroupFile("myGroup.users", "");
 
-        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
+        Set<String> users = _fileGroupDatabase.getUsersInGroup(MY_GROUP);
         assertNotNull(users);
         assertTrue(users.isEmpty());
 
-        FILE_GROUP_DATABASE.addUserToGroup(USER3, MY_GROUP);
+        _fileGroupDatabase.addUserToGroup(USER3, MY_GROUP);
 
-        users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
+        users = _fileGroupDatabase.getUsersInGroup(MY_GROUP);
         assertNotNull(users);
         assertEquals(1, users.size());
-        assertTrue(FILE_GROUP_DATABASE.getGroupsForUser(MY_GROUP.toUpperCase()).isEmpty());
+        assertTrue(_fileGroupDatabase.getGroupsForUser(MY_GROUP.toUpperCase()).isEmpty());
     }
 
     @Test
     public void testAddUserToNonExistentGroup() throws Exception
     {
-        UTIL.writeAndSetGroupFile();
+        _util.writeAndSetGroupFile();
 
-        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
+        Set<String> users = _fileGroupDatabase.getUsersInGroup(MY_GROUP);
         assertNotNull(users);
         assertTrue(users.isEmpty());
 
         try
         {
-            FILE_GROUP_DATABASE.addUserToGroup(USER3, MY_GROUP);
+            _fileGroupDatabase.addUserToGroup(USER3, MY_GROUP);
             fail("Expected exception not thrown");
         }
         catch (IllegalArgumentException e)
@@ -303,7 +294,7 @@
             // pass
         }
 
-        users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
+        users = _fileGroupDatabase.getUsersInGroup(MY_GROUP);
         assertNotNull(users);
         assertTrue(users.isEmpty());
     }
@@ -311,15 +302,15 @@
     @Test
     public void testRemoveUserFromExistingGroup() throws Exception
     {
-        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2");
+        _util.writeAndSetGroupFile("myGroup.users", "user1,user2");
 
-        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
+        Set<String> users = _fileGroupDatabase.getUsersInGroup(MY_GROUP);
         assertNotNull(users);
         assertEquals(2, users.size());
 
-        FILE_GROUP_DATABASE.removeUserFromGroup(USER2, MY_GROUP);
+        _fileGroupDatabase.removeUserFromGroup(USER2, MY_GROUP);
 
-        users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
+        users = _fileGroupDatabase.getUsersInGroup(MY_GROUP);
         assertNotNull(users);
         assertEquals(1, users.size());
     }
@@ -327,11 +318,11 @@
     @Test
     public void testRemoveUserFromNonexistentGroup() throws Exception
     {
-        UTIL.writeAndSetGroupFile();
+        _util.writeAndSetGroupFile();
 
         try
         {
-            FILE_GROUP_DATABASE.removeUserFromGroup(USER1, MY_GROUP);
+            _fileGroupDatabase.removeUserFromGroup(USER1, MY_GROUP);
             fail("Expected exception not thrown");
         }
         catch (IllegalArgumentException e)
@@ -339,35 +330,35 @@
             // pass
         }
 
-        assertTrue(FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP).isEmpty());
+        assertTrue(_fileGroupDatabase.getUsersInGroup(MY_GROUP).isEmpty());
     }
 
     @Test
     public void testRemoveUserFromGroupTwice() throws Exception
     {
-        UTIL.writeAndSetGroupFile("myGroup.users", USER1);
-        assertTrue(FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP).contains(USER1));
+        _util.writeAndSetGroupFile("myGroup.users", USER1);
+        assertTrue(_fileGroupDatabase.getUsersInGroup(MY_GROUP).contains(USER1));
 
-        FILE_GROUP_DATABASE.removeUserFromGroup(USER1, MY_GROUP);
-        assertTrue(FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP).isEmpty());
+        _fileGroupDatabase.removeUserFromGroup(USER1, MY_GROUP);
+        assertTrue(_fileGroupDatabase.getUsersInGroup(MY_GROUP).isEmpty());
 
-        FILE_GROUP_DATABASE.removeUserFromGroup(USER1, MY_GROUP);
-        assertTrue(FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP).isEmpty());
+        _fileGroupDatabase.removeUserFromGroup(USER1, MY_GROUP);
+        assertTrue(_fileGroupDatabase.getUsersInGroup(MY_GROUP).isEmpty());
     }
 
     @Test
     public void testAddUserPersistedToFile() throws Exception
     {
-        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2");
+        _util.writeAndSetGroupFile("myGroup.users", "user1,user2");
 
-        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
+        Set<String> users = _fileGroupDatabase.getUsersInGroup(MY_GROUP);
         assertEquals(2, users.size());
 
-        FILE_GROUP_DATABASE.addUserToGroup(USER3, MY_GROUP);
+        _fileGroupDatabase.addUserToGroup(USER3, MY_GROUP);
         assertEquals(3, users.size());
 
         FileGroupDatabase newGroupDatabase = new FileGroupDatabase(CASE_SENSITIVE);
-        newGroupDatabase.setGroupFile(GROUP_FILE);
+        newGroupDatabase.setGroupFile(_groupFile);
 
         Set<String> newUsers = newGroupDatabase.getUsersInGroup(MY_GROUP);
         assertEquals(users.size(), newUsers.size());
@@ -376,16 +367,16 @@
     @Test
     public void testRemoveUserPersistedToFile() throws Exception
     {
-        UTIL.writeAndSetGroupFile("myGroup.users", "user1,user2");
+        _util.writeAndSetGroupFile("myGroup.users", "user1,user2");
 
-        Set<String> users = FILE_GROUP_DATABASE.getUsersInGroup(MY_GROUP);
+        Set<String> users = _fileGroupDatabase.getUsersInGroup(MY_GROUP);
         assertEquals(2, users.size());
 
-        FILE_GROUP_DATABASE.removeUserFromGroup(USER2, MY_GROUP);
+        _fileGroupDatabase.removeUserFromGroup(USER2, MY_GROUP);
         assertEquals(1, users.size());
 
         FileGroupDatabase newGroupDatabase = new FileGroupDatabase(CASE_SENSITIVE);
-        newGroupDatabase.setGroupFile(GROUP_FILE);
+        newGroupDatabase.setGroupFile(_groupFile);
 
         Set<String> newUsers = newGroupDatabase.getUsersInGroup(MY_GROUP);
         assertEquals(users.size(), newUsers.size());
@@ -394,19 +385,19 @@
     @Test
     public void testCreateGroupPersistedToFile() throws Exception
     {
-        UTIL.writeAndSetGroupFile();
+        _util.writeAndSetGroupFile();
 
-        Set<String> groups = FILE_GROUP_DATABASE.getAllGroups();
+        Set<String> groups = _fileGroupDatabase.getAllGroups();
         assertTrue(groups.isEmpty());
 
-        FILE_GROUP_DATABASE.createGroup(MY_GROUP);
+        _fileGroupDatabase.createGroup(MY_GROUP);
 
-        groups = FILE_GROUP_DATABASE.getAllGroups();
+        groups = _fileGroupDatabase.getAllGroups();
         assertEquals(1, groups.size());
         assertTrue(groups.contains(MY_GROUP));
 
         FileGroupDatabase newGroupDatabase = new FileGroupDatabase(CASE_SENSITIVE);
-        newGroupDatabase.setGroupFile(GROUP_FILE);
+        newGroupDatabase.setGroupFile(_groupFile);
 
         Set<String> newGroups = newGroupDatabase.getAllGroups();
         assertEquals(1, newGroups.size());
@@ -416,25 +407,25 @@
     @Test
     public void testRemoveGroupPersistedToFile() throws Exception
     {
-        UTIL.writeAndSetGroupFile("myGroup1.users", "user1,user2", "myGroup2.users", "user1,user2");
+        _util.writeAndSetGroupFile("myGroup1.users", "user1,user2", "myGroup2.users", "user1,user2");
 
-        Set<String> groups = FILE_GROUP_DATABASE.getAllGroups();
+        Set<String> groups = _fileGroupDatabase.getAllGroups();
         assertEquals(2, groups.size());
 
-        Set<String> groupsForUser1 = FILE_GROUP_DATABASE.getGroupsForUser(USER1);
+        Set<String> groupsForUser1 = _fileGroupDatabase.getGroupsForUser(USER1);
         assertEquals(2, groupsForUser1.size());
 
-        FILE_GROUP_DATABASE.removeGroup(MY_GROUP1);
+        _fileGroupDatabase.removeGroup(MY_GROUP1);
 
-        groups = FILE_GROUP_DATABASE.getAllGroups();
+        groups = _fileGroupDatabase.getAllGroups();
         assertEquals(1, groups.size());
         assertTrue(groups.contains(MY_GROUP2));
 
-        groupsForUser1 = FILE_GROUP_DATABASE.getGroupsForUser(USER1);
+        groupsForUser1 = _fileGroupDatabase.getGroupsForUser(USER1);
         assertEquals(1, groupsForUser1.size());
 
         FileGroupDatabase newGroupDatabase = new FileGroupDatabase(CASE_SENSITIVE);
-        newGroupDatabase.setGroupFile(GROUP_FILE);
+        newGroupDatabase.setGroupFile(_groupFile);
 
         Set<String> newGroups = newGroupDatabase.getAllGroups();
         assertEquals(1, newGroups.size());
@@ -446,12 +437,11 @@
     }
 
     @After
-    public void tearDown() throws Exception
+    public void tearDown()
     {
-
-        if (GROUP_FILE != null)
+        if (_groupFile != null)
         {
-            File groupFile = new File(GROUP_FILE);
+            File groupFile = new File(_groupFile);
             if (groupFile.exists())
             {
                 groupFile.delete();
diff --git a/broker-plugins/management-http/src/main/java/resources/addGroupProvider.html b/broker-plugins/management-http/src/main/java/resources/addGroupProvider.html
index 03dc091..db5df79 100644
--- a/broker-plugins/management-http/src/main/java/resources/addGroupProvider.html
+++ b/broker-plugins/management-http/src/main/java/resources/addGroupProvider.html
@@ -50,20 +50,6 @@
                         </div>
                     </div>
                     <div class="clear">
-                        <div class="formLabel-labelCell">Case Sensitive Group Search:</div>
-                        <div class="tableContainer-valueCell formLabel-controlCell">
-                            <input type="checkbox" id="addGroupProvider.caseSensitive" checked="checked" value="on"
-                                   data-dojo-type="dijit/form/CheckBox"
-                                   data-dojo-props="
-                            name: 'caseSensitive',
-                            checked: true,
-                            required: false,
-                            placeHolder: 'group provider caseSensitive',
-                            searchAttr: 'caseSensitive',
-                            title: 'Case Sensitive/Insensitive Search'"/>
-                        </div>
-                    </div>
-                    <div class="clear">
                         <div id="addGroupProvider.typeFields"></div>
                     </div>
                     <div class="editorPanel clear"
diff --git a/broker-plugins/management-http/src/main/java/resources/groupprovider/groupfile/add.html b/broker-plugins/management-http/src/main/java/resources/groupprovider/groupfile/add.html
index 7fc458c..52c30d4 100644
--- a/broker-plugins/management-http/src/main/java/resources/groupprovider/groupfile/add.html
+++ b/broker-plugins/management-http/src/main/java/resources/groupprovider/groupfile/add.html
@@ -32,6 +32,20 @@
                               promptMessage: 'Enter path to file with groups'"/>
         </div>
     </div>
+    <div class="clear">
+        <div class="formLabel-labelCell">Case Sensitive Group Search:</div>
+        <div class="tableContainer-valueCell formLabel-controlCell">
+            <input type="checkbox" class="caseSensitive"
+                   data-dojo-type="dijit/form/CheckBox"
+                   data-dojo-props="
+                            name: 'caseSensitive',
+                            checked: true,
+                            required: false,
+                            placeHolder: 'group provider caseSensitive',
+                            searchAttr: 'caseSensitive',
+                            title: 'Case Sensitive/Insensitive Search'"/>
+        </div>
+    </div>
 
     <div class="clear"></div>
 </div>
diff --git a/broker-plugins/management-http/src/main/java/resources/groupprovider/groupfile/show.html b/broker-plugins/management-http/src/main/java/resources/groupprovider/groupfile/show.html
index 740c65f..0319e98 100644
--- a/broker-plugins/management-http/src/main/java/resources/groupprovider/groupfile/show.html
+++ b/broker-plugins/management-http/src/main/java/resources/groupprovider/groupfile/show.html
@@ -21,5 +21,9 @@
         <div class="formLabel-labelCell">Path to file:</div>
         <div ><span class="path" ></span></div>
     </div>
+    <div class="clear">
+        <div class="formLabel-labelCell">Case Sensitive Group Search:</div>
+        <div class="formValue-valueCell caseSensitive"></div>
+    </div>
     <div class="clear"></div>
 </div>
diff --git a/broker-plugins/management-http/src/main/java/resources/groupprovider/managedgroupprovider/add.html b/broker-plugins/management-http/src/main/java/resources/groupprovider/managedgroupprovider/add.html
new file mode 100644
index 0000000..ec8e0b1
--- /dev/null
+++ b/broker-plugins/management-http/src/main/java/resources/groupprovider/managedgroupprovider/add.html
@@ -0,0 +1,38 @@
+<!--
+ -
+ - Licensed to the Apache Software Foundation (ASF) under one
+ - or more contributor license agreements.  See the NOTICE file
+ - distributed with this work for additional information
+ - regarding copyright ownership.  The ASF licenses this file
+ - to you under the Apache License, Version 2.0 (the
+ - "License"); you may not use this file except in compliance
+ - with the License.  You may obtain a copy of the License at
+ -
+ -   http://www.apache.org/licenses/LICENSE-2.0
+ -
+ - Unless required by applicable law or agreed to in writing,
+ - software distributed under the License is distributed on an
+ - "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ - KIND, either express or implied.  See the License for the
+ - specific language governing permissions and limitations
+ - under the License.
+ -
+ -->
+<div>
+    <div class="clear">
+        <div class="formLabel-labelCell">Case Sensitive Group Search:</div>
+        <div class="tableContainer-valueCell formLabel-controlCell">
+            <input type="checkbox" class="caseSensitive"
+                   data-dojo-type="dijit/form/CheckBox"
+                   data-dojo-props="
+                            name: 'caseSensitive',
+                            checked: true,
+                            required: false,
+                            placeHolder: 'group provider caseSensitive',
+                            searchAttr: 'caseSensitive',
+                            title: 'Case Sensitive/Insensitive Search'"/>
+        </div>
+    </div>
+
+    <div class="clear"></div>
+</div>
diff --git a/broker-plugins/management-http/src/main/java/resources/groupprovider/managedgroupprovider/show.html b/broker-plugins/management-http/src/main/java/resources/groupprovider/managedgroupprovider/show.html
new file mode 100644
index 0000000..a2997ef
--- /dev/null
+++ b/broker-plugins/management-http/src/main/java/resources/groupprovider/managedgroupprovider/show.html
@@ -0,0 +1,25 @@
+<!--
+  ~ Licensed to the Apache Software Foundation (ASF) under one
+  ~ or more contributor license agreements.  See the NOTICE file
+  ~ distributed with this work for additional information
+  ~ regarding copyright ownership.  The ASF licenses this file
+  ~ to you under the Apache License, Version 2.0 (the
+  ~ "License"); you may not use this file except in compliance
+  ~ with the License.  You may obtain a copy of the License at
+  ~
+  ~   http://www.apache.org/licenses/LICENSE-2.0
+  ~
+  ~ Unless required by applicable law or agreed to in writing,
+  ~ software distributed under the License is distributed on an
+  ~ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  ~ KIND, either express or implied.  See the License for the
+  ~ specific language governing permissions and limitations
+  ~ under the License.
+  -->
+<div>
+    <div class="clear">
+        <div class="formLabel-labelCell">Case Sensitive Group Search:</div>
+        <div class="formValue-valueCell caseSensitive"></div>
+    </div>
+    <div class="clear"></div>
+</div>
diff --git a/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js b/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js
index db89e74..3cef2b7 100644
--- a/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js
+++ b/broker-plugins/management-http/src/main/java/resources/js/qpid/common/util.js
@@ -528,7 +528,7 @@
                 }
             }
             return object1 === object2;
-        }
+        };
 
         util.parseHtmlIntoDiv = function (containerNode, htmlTemplateLocation, postParseCallback)
         {
@@ -586,6 +586,7 @@
                 var fieldNode = obj[fieldName];
                 if (fieldNode)
                 {
+                    var formatter = null;
                     if (formatters && fieldNode.className)
                     {
                         var clazzes = fieldNode.className.split(" ");
@@ -593,17 +594,41 @@
                         {
                             var clazz = clazzes[idx];
                             var fmt = formatters[clazz];
-                            if (fmt && value)
+                            if (!!fmt)
                             {
-                                value = fmt(value);
+                                formatter = fmt;
+                                break;
                             }
                         }
                     }
-                    fieldNode.innerHTML = (value == undefined || value == null) ? "" : entities.encode(String(value));
+                    var innerHtml = "";
+                    if (value !== undefined && value !== null)
+                    {
+                        innerHtml = formatter === null ? entities.encode(String(value)) : formatter(value);
+                    }
+                    fieldNode.innerHTML = innerHtml;
                 }
             }
         };
 
+        util.getTypeFields = function (metadata, category, type)
+        {
+            var fields = [];
+            var typeMeta = metadata.getMetaData(category, type);
+            if (!!typeMeta)
+            {
+                var attributes = typeMeta.attributes;
+                for (var name in attributes)
+                {
+                    if (attributes.hasOwnProperty(name))
+                    {
+                        fields.push(name);
+                    }
+                }
+            }
+            return fields;
+        };
+
         util.applyMetadataToWidgets = function (domRoot, category, type, meta)
         {
             this.applyToWidgets(domRoot, category, type, null, meta);
@@ -776,7 +801,7 @@
         util.setMultiSelectOptions = function (multiSelectWidget, options)
         {
             util.addMultiSelectOptions(multiSelectWidget, options, true);
-        }
+        };
 
         util.addMultiSelectOptions = function (multiSelectWidget, options, clearExistingOptions)
         {
diff --git a/broker-plugins/management-http/src/main/java/resources/js/qpid/common/widgetconfigurer.js b/broker-plugins/management-http/src/main/java/resources/js/qpid/common/widgetconfigurer.js
index 3f86f62..3eba8fc 100644
--- a/broker-plugins/management-http/src/main/java/resources/js/qpid/common/widgetconfigurer.js
+++ b/broker-plugins/management-http/src/main/java/resources/js/qpid/common/widgetconfigurer.js
@@ -109,12 +109,12 @@
                 // Stash the default value and initial value so we can later differentiate
                 // when sending updates to the server
 
-                if (defaultValue)
+                if (defaultValue !== null && defaultValue !== undefined)
                 {
                     widget.defaultValue = defaultValue;
                 }
 
-                if (dataValue)
+                if (dataValue !== null && dataValue !== undefined)
                 {
                     widget.initialValue = dataValue;
                 }
@@ -180,6 +180,21 @@
                 }
             }
         },
+        _setDefaults: function (widget, category, type, data, meta, effectiveData)
+        {
+            if (!!widget.name)
+            {
+                var defaultValue = meta.getDefaultValueForAttribute(category, type, widget.name);
+                if (defaultValue !== null && defaultValue !== undefined)
+                {
+                    widget.defaultValue = defaultValue;
+                    if ( widget instanceof dijit.form.CheckBox)
+                    {
+                        widget.set("checked", defaultValue);
+                    }
+                }
+            }
+        },
         config: function (widget, category, type, data, meta, effectiveData)
         {
             this._processWidgetPrompt(widget, category, type, meta);
@@ -187,6 +202,10 @@
             {
                 this._processWidgetValue(widget, category, type, data, meta, effectiveData);
             }
+            else
+            {
+                this._setDefaults(widget, category, type, data, meta);
+            }
         },
         disableIfImmutable: function (widget, category, type, meta)
         {
diff --git a/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js b/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js
index ac57fab..f0f8be1 100644
--- a/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js
+++ b/broker-plugins/management-http/src/main/java/resources/js/qpid/management/Broker.js
@@ -820,19 +820,11 @@
                 }, {
                     name: "State",
                     field: "state",
-                    width: "20%"
+                    width: "30%"
                 }, {
                     name: "Type",
                     field: "type",
-                    width: "20%"
-                }, {
-                    name: "Case Sensitive Group Search",
-                    field: "caseSensitive",
-                    width: "20%",
-                    formatter: function (val)
-                    {
-                        return "<input type='checkbox' disabled='disabled'" + (val ? "checked='checked'" : "") + " />";
-                    }
+                    width: "30%"
                 }], function (obj)
                 {
                     connect.connect(obj.grid, "onRowDblClick", obj.grid, function (evt)
diff --git a/broker-plugins/management-http/src/main/java/resources/js/qpid/management/GroupProvider.js b/broker-plugins/management-http/src/main/java/resources/js/qpid/management/GroupProvider.js
index 9862246..a9c1a37 100644
--- a/broker-plugins/management-http/src/main/java/resources/js/qpid/management/GroupProvider.js
+++ b/broker-plugins/management-http/src/main/java/resources/js/qpid/management/GroupProvider.js
@@ -23,6 +23,7 @@
         "dojo/_base/connect",
         "dojo/_base/array",
         "dojo/_base/event",
+        "dojo/dom-construct",
         "qpid/common/properties",
         "qpid/common/updater",
         "qpid/common/util",
@@ -40,6 +41,7 @@
               connect,
               array,
               event,
+              construct,
               properties,
               updater,
               util,
@@ -106,12 +108,13 @@
 
             var type = this.groupProviderUpdater.groupProviderData.type;
             var providerDetailsNode = query(".providerDetails", contentPane.containerNode)[0];
+            var detailsNode = construct.create("div", null, providerDetailsNode, "last");
 
             require(["qpid/management/groupprovider/" + encodeURIComponent(type.toLowerCase()) + "/show"],
                 function (DetailsUI)
                 {
                     that.groupProviderUpdater.details = new DetailsUI({
-                        containerNode: providerDetailsNode,
+                        containerNode: detailsNode,
                         parent: that
                     });
                     that.groupProviderUpdater.details.update(that.groupProviderUpdater.groupProviderData);
@@ -185,7 +188,6 @@
             this.name = query(".name", node)[0];
             this.type = query(".type", node)[0];
             this.state = query(".state", node)[0];
-            this.caseSensitive = query(".caseSensitive", node)[0];
             this.managedInterfaces = {};
             this.details = null;
         }
@@ -195,8 +197,6 @@
             this.name.innerHTML = entities.encode(String(this.groupProviderData["name"]));
             this.type.innerHTML = entities.encode(String(this.groupProviderData["type"]));
             this.state.innerHTML = entities.encode(String(this.groupProviderData["state"]));
-            this.caseSensitive.innerHTML = "<input type='checkbox' disabled='disabled'" +
-                                           (this.groupProviderData["caseSensitive"] ? "checked='checked'" : "") + " />";
         };
 
         GroupProviderUpdater.prototype.update = function (callback)
diff --git a/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addGroupProvider.js b/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addGroupProvider.js
index 8975516..f8b0de0 100644
--- a/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addGroupProvider.js
+++ b/broker-plugins/management-http/src/main/java/resources/js/qpid/management/addGroupProvider.js
@@ -200,11 +200,13 @@
                         typeUI.show({
                             containerNode: that.groupProviderTypeFieldsContainer,
                             parent: that,
-                            data: that.initialData
+                            data: that.initialData,
+                            metadata: that.management.metadata
                         });
-                        util.applyMetadataToWidgets(that.groupProviderTypeFieldsContainer,
+                        util.applyToWidgets(that.groupProviderTypeFieldsContainer,
                             "GroupProvider",
                             type,
+                            that.initialData,
                             that.management.metadata);
                     }
                     catch (e)
diff --git a/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/cloudfoundrydashboardmanagement/show.js b/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/cloudfoundrydashboardmanagement/show.js
index 93751cd..257e12d 100644
--- a/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/cloudfoundrydashboardmanagement/show.js
+++ b/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/cloudfoundrydashboardmanagement/show.js
@@ -42,13 +42,16 @@
                 for (var serviceInstanceId in data.serviceToManagementGroupMapping)
                 {
                     tableContent += "<tr><td>" + entities.encode(serviceInstanceId) + "</td><td>: " + entities.encode(
-                            data.serviceToManagementGroupMapping[serviceInstanceId]) + "</td></tr>\n";
+                        data.serviceToManagementGroupMapping[serviceInstanceId]) + "</td></tr>\n";
                 }
                 var table = query(".serviceToManagementGroupMappingTable", this.containerNode)[0];
-                table.innerHTML = tableContent;
+                if (typeof table != "undefined")
+                {
+                    table.innerHTML = tableContent;
+                }
             }
             util.updateUI(data, fieldNames, this);
-        }
+        };
 
         return GroupProvider;
     });
diff --git a/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/groupfile/add.js b/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/groupfile/add.js
index 3a13daa..d65ff0c 100644
--- a/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/groupfile/add.js
+++ b/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/groupfile/add.js
@@ -18,12 +18,10 @@
  * under the License.
  *
  */
-define(["dojo/dom",
-        "dojo/query",
-        "dojo/_base/array",
+define(["dojo/query",
         "dijit/registry",
         "qpid/common/util",
-        "dojo/text!groupprovider/groupfile/add.html"], function (dom, query, array, registry, util, template)
+        "dojo/text!groupprovider/groupfile/add.html"], function (query, registry, util, template)
 {
 
     return {
@@ -33,8 +31,13 @@
             util.parse(data.containerNode, template, function ()
             {
                 var pathWidget = registry.byNode(query(".addGroupProviderPath", data.containerNode)[0]);
-                pathWidget.set("disabled", data.data && data.data.id ? true : false);
-                pathWidget.set("value",  data.data ? data.data.path : "");
+                pathWidget.set("disabled", !!(data.data && data.data.id));
+                pathWidget.set("value", data.data ? data.data.path : "");
+
+                var caseSensitiveWidget = registry.byNode(query(".caseSensitive", data.containerNode)[0]);
+                caseSensitiveWidget.set("checked", data.data && data.data.caseSensitive);
+
+                util.applyToWidgets(data.containerNode, "GroupProvider", "GroupFile", data.data, data.metadata);
             });
         }
     };
diff --git a/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/groupfile/show.js b/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/groupfile/show.js
index 7e6bd64..c630082 100644
--- a/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/groupfile/show.js
+++ b/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/groupfile/show.js
@@ -18,18 +18,20 @@
  * under the License.
  *
  */
-define(["qpid/common/util", "dojo/domReady!"], function (util)
+define(["qpid/common/util", "dijit/form/CheckBox", "dojo/domReady!"], function (util)
 {
+    var fieldNames;
 
     function GroupFile(data)
     {
-        util.buildUI(data.containerNode, data.parent, "groupprovider/groupfile/show.html", ["path"], this);
+        fieldNames = util.getTypeFields(data.parent.management.metadata, "GroupProvider", "GroupFile");
+        util.buildUI(data.containerNode, data.parent, "groupprovider/groupfile/show.html", fieldNames, this);
     }
 
     GroupFile.prototype.update = function (data)
     {
-        util.updateUI(data, ["path"], this);
-    }
+        util.updateUI(data, fieldNames, this, {"caseSensitive": util.buildCheckboxMarkup});
+    };
 
     return GroupFile;
 });
diff --git a/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/managedgroupprovider/add.js b/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/managedgroupprovider/add.js
index 3ef44d8..5fd34cc 100644
--- a/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/managedgroupprovider/add.js
+++ b/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/managedgroupprovider/add.js
@@ -18,11 +18,23 @@
  * under the License.
  *
  */
-define([], function ()
+define(["dojo/query",
+        "dijit/registry",
+        "qpid/common/util",
+        "dojo/text!groupprovider/managedgroupprovider/add.html"], function (query, registry, util, template)
 {
+
     return {
         show: function (data)
-        { /* nothing to do */
+        {
+            var that = this;
+            util.parse(data.containerNode, template, function ()
+            {
+                var caseSensitiveWidget = registry.byNode(query(".caseSensitive", data.containerNode)[0]);
+                caseSensitiveWidget.set("checked", data.data && data.data.caseSensitive);
+
+                util.applyToWidgets(data.containerNode, "GroupProvider", "ManagedGroupProvider", data.data, data.metadata);
+            });
         }
     };
 });
diff --git a/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/managedgroupprovider/show.js b/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/managedgroupprovider/show.js
index eaf8104..418d270 100644
--- a/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/managedgroupprovider/show.js
+++ b/broker-plugins/management-http/src/main/java/resources/js/qpid/management/groupprovider/managedgroupprovider/show.js
@@ -18,16 +18,21 @@
  * under the License.
  *
  */
-define([], function ()
+define(["qpid/common/util", "dijit/form/CheckBox", "dojo/domReady!"], function (util)
 {
 
+    var fieldNames;
+
     function ManagedGroupProvider(data)
     {
+        fieldNames = util.getTypeFields(data.parent.management.metadata, "GroupProvider", "ManagedGroupProvider");
+        util.buildUI(data.containerNode, data.parent, "groupprovider/managedgroupprovider/show.html", fieldNames, this);
     }
 
     ManagedGroupProvider.prototype.update = function (data)
     {
-    }
+        util.updateUI(data, fieldNames, this, {"caseSensitive": util.buildCheckboxMarkup});
+    };
 
     return ManagedGroupProvider;
 });
diff --git a/broker-plugins/management-http/src/main/java/resources/showGroupProvider.html b/broker-plugins/management-http/src/main/java/resources/showGroupProvider.html
index de3b84f..039c6e9 100644
--- a/broker-plugins/management-http/src/main/java/resources/showGroupProvider.html
+++ b/broker-plugins/management-http/src/main/java/resources/showGroupProvider.html
@@ -32,10 +32,6 @@
             <div class="formLabel-labelCell">State:</div>
             <div class="formValue-valueCell state"></div>
         </div>
-        <div class="clear">
-            <div class="formLabel-labelCell">Case Sensitive Group Search:</div>
-            <div class="formValue-valueCell caseSensitive"></div>
-        </div>
         <div class="clear"></div>
 
         <div class="providerDetails"></div>