diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
index f98f3a91e889458aaaa79ce4b96b0c386b2d193d..ac314ef59500b989fcde2286f1cc3f9714f39f85 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientService.java
@@ -55,6 +55,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityTypePropertyType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IGroupUpdates;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IPropertyTypeUpdates;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IVocabularyTermUpdates;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IVocabularyUpdates;
@@ -97,11 +98,16 @@ public interface ICommonClientService extends IClientService
             throws UserFailureException;
 
     /**
-     * Registers a new group with specified code and optional description and group leader ID.
+     * Registers a new group with specified code and optional description.
      */
-    public void registerGroup(String groupCode, String descriptionOrNull, String groupLeaderOrNull)
+    public void registerGroup(String groupCode, String descriptionOrNull)
             throws UserFailureException;
 
+    /**
+     * Updates group.
+     */
+    public void updateGroup(final IGroupUpdates updates) throws UserFailureException;
+
     /**
      * Returns a list of all persons which belong to the current database instance.
      */
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
index d69e8a1a9b1aeae9f115b7075e9289df088e51e1..1ccd36225e6b7a153b538276db927b96649560ef 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/ICommonClientServiceAsync.java
@@ -56,6 +56,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityTypePropertyType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IGroupUpdates;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IPropertyTypeUpdates;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IVocabularyTermUpdates;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IVocabularyUpdates;
@@ -88,10 +89,13 @@ public interface ICommonClientServiceAsync extends IClientServiceAsync
     public void prepareExportGroups(TableExportCriteria<Group> exportCriteria,
             AsyncCallback<String> callback);
 
-    /** @see ICommonClientService#registerGroup(String, String, String) */
-    public void registerGroup(String groupCode, String descriptionOrNull, String groupLeaderOrNull,
+    /** @see ICommonClientService#registerGroup(String, String) */
+    public void registerGroup(String groupCode, String descriptionOrNull,
             AsyncCallback<Void> callback);
 
+    /** @see ICommonClientService#updateGroup(IGroupUpdates) */
+    public void updateGroup(final IGroupUpdates updates, final AsyncCallback<Void> asyncCallback);
+
     /** @see ICommonClientService#listPersons(DefaultResultSetConfig) */
     public void listPersons(DefaultResultSetConfig<String, Person> criteria,
             AsyncCallback<ResultSet<Person>> asyncCallback);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java
index 0cef9408b3a98a685b3539533a82027e49ff9310..bbdff9ff37d2f0836280bee8dd7ed11b2be48ba9 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/Dict.java
@@ -553,8 +553,6 @@ public abstract class Dict
     //
     public static final String GROUP_BROWSER = "group_browser";
 
-    public static final String LEADER = "leader";
-
     public static final String BUTTON_ADD_GROUP = "button_add_group";
 
     //
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/model/GroupModel.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/model/GroupModel.java
index e6ccd4534cc6b499124f47a087a0baea1fe6f73d..b3a2be372ad226446eb27fe40cfb9c2187add214 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/model/GroupModel.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/model/GroupModel.java
@@ -41,7 +41,6 @@ public class GroupModel extends BaseModelData
     {
         set(ModelDataPropertyNames.CODE, group.getCode());
         set(ModelDataPropertyNames.DESCRIPTION, group.getDescription());
-        set(ModelDataPropertyNames.LEADER, group.getLeader());
         set(ModelDataPropertyNames.REGISTRATOR, group.getRegistrator());
         set(ModelDataPropertyNames.REGISTRATION_DATE, group.getRegistrationDate());
         set(ModelDataPropertyNames.OBJECT, group);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/model/ModelDataPropertyNames.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/model/ModelDataPropertyNames.java
index 18ce5729d79f820b03604cca26632fcde004473a..3531a4d46a930955017c54d2d55f00a2eafa3670 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/model/ModelDataPropertyNames.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/model/ModelDataPropertyNames.java
@@ -66,8 +66,6 @@ public final class ModelDataPropertyNames
 
     public static final String LAST_NAME = "lastName";
 
-    public static final String LEADER = "leader";
-
     public static final String LOCATION = "location";
 
     public static final String OBJECT = "object";
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/GroupGrid.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/GroupGrid.java
index 9a41f31ac83e277c703ea5160b58ac5fd2afb769..27a35518f15968298e4c38db877691529cc69841 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/GroupGrid.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/GroupGrid.java
@@ -21,7 +21,9 @@ import java.util.List;
 import com.extjs.gxt.ui.client.event.ComponentEvent;
 import com.extjs.gxt.ui.client.event.SelectionListener;
 import com.extjs.gxt.ui.client.widget.Dialog;
+import com.extjs.gxt.ui.client.widget.Window;
 import com.extjs.gxt.ui.client.widget.button.Button;
+import com.google.gwt.user.client.rpc.AsyncCallback;
 
 import ch.systemsx.cisd.openbis.generic.client.web.client.ICommonClientServiceAsync;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.AbstractAsyncCallback;
@@ -29,15 +31,19 @@ import ch.systemsx.cisd.openbis.generic.client.web.client.application.Dict;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.GenericConstants;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.IViewContext;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.framework.DisplayTypeIDGenerator;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.model.BaseEntityModel;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.amc.AddGroupDialog;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.framework.IColumnDefinitionKind;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.columns.specific.GroupColDefKind;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.field.DescriptionField;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.AbstractSimpleBrowserGrid;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.ColumnDefsAndConfigs;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IBrowserGridActionInvoker;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.grid.IDisposableComponent;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.AbstractDataListDeletionConfirmationDialog;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.ui.widget.AbstractRegistrationDialog;
 import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.IDelegatedAction;
+import ch.systemsx.cisd.openbis.generic.client.web.client.application.util.lang.StringEscapeUtils;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.DefaultResultSetConfig;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.Group;
 import ch.systemsx.cisd.openbis.generic.client.web.client.dto.IColumnDefinition;
@@ -63,6 +69,10 @@ public class GroupGrid extends AbstractSimpleBrowserGrid<Group>
 
     public static final String DELETE_BUTTON_ID = BROWSER_ID + "_delete-button";
 
+    public static final String EDIT_BUTTON_ID = BROWSER_ID + "-edit-button";
+
+    private final IDelegatedAction postRegistrationCallback;
+
     public static IDisposableComponent create(
             final IViewContext<ICommonClientServiceAsync> viewContext)
     {
@@ -75,6 +85,7 @@ public class GroupGrid extends AbstractSimpleBrowserGrid<Group>
     {
         super(viewContext, BROWSER_ID, GRID_ID);
         setDisplayTypeIDGenerator(DisplayTypeIDGenerator.PROJECT_BROWSER_GRID);
+        postRegistrationCallback = createRefreshGridAction();
     }
 
     private void extendBottomToolbar()
@@ -102,6 +113,19 @@ public class GroupGrid extends AbstractSimpleBrowserGrid<Group>
         addGroupButton.setId(ADD_BUTTON_ID);
         addButton(addGroupButton);
 
+        Button editButton =
+                createSelectedItemButton(viewContext.getMessage(Dict.BUTTON_EDIT),
+                        new ISelectedEntityInvoker<BaseEntityModel<Group>>()
+                            {
+                                public void invoke(BaseEntityModel<Group> selectedItem)
+                                {
+                                    Group group = selectedItem.getBaseObject();
+                                    createEditDialog(group).show();
+                                }
+                            });
+        editButton.setId(EDIT_BUTTON_ID);
+        addButton(editButton);
+
         Button deleteButton =
                 createSelectedItemsButton(viewContext.getMessage(Dict.BUTTON_DELETE),
                         new AbstractCreateDialogListener()
@@ -120,6 +144,34 @@ public class GroupGrid extends AbstractSimpleBrowserGrid<Group>
         addEntityOperationsSeparator();
     }
 
+    private Window createEditDialog(final Group group)
+    {
+        final String code = group.getCode();
+        final String description = group.getDescription();
+        final String title = viewContext.getMessage(Dict.EDIT_TITLE, "Group", code);
+
+        return new AbstractRegistrationDialog(viewContext, title, postRegistrationCallback)
+            {
+                private final DescriptionField descriptionField;
+
+                {
+                    boolean mandatory = false;
+
+                    descriptionField = createDescriptionField(viewContext, mandatory);
+                    descriptionField.setValue(StringEscapeUtils.unescapeHtml(description));
+                    addField(descriptionField);
+                }
+
+                @Override
+                protected void register(AsyncCallback<Void> registrationCallback)
+                {
+                    group.setDescription(descriptionField.getValue());
+
+                    viewContext.getService().updateGroup(group, registrationCallback);
+                }
+            };
+    }
+
     @Override
     protected IColumnDefinitionKind<Group>[] getStaticColumnsDefinition()
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/amc/AddGroupDialog.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/amc/AddGroupDialog.java
index 0a65d0d97d0da96b06cdea225851588418318704..f17ba45e8ac682966dcba563c4c14419fec2a1a4 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/amc/AddGroupDialog.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/amc/AddGroupDialog.java
@@ -56,6 +56,6 @@ public class AddGroupDialog extends AbstractRegistrationDialog
     protected void register(AsyncCallback<Void> registrationCallback)
     {
         viewContext.getService().registerGroup(codeField.getValue(), descriptionField.getValue(),
-                null, registrationCallback);
+                registrationCallback);
     }
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/GroupColDefKind.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/GroupColDefKind.java
index 037095542c4562493ddc28db282cacd5dd4dac89..ba8739d4f24a8d83e8183027e831384ed1ba4796 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/GroupColDefKind.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/application/ui/columns/specific/GroupColDefKind.java
@@ -44,15 +44,6 @@ public enum GroupColDefKind implements IColumnDefinitionKind<Group>
             }
         }),
 
-    LEADER(new AbstractColumnDefinitionKind<Group>(Dict.LEADER)
-        {
-            @Override
-            public String tryGetValue(Group entity)
-            {
-                return (entity.getLeader() == null) ? null : entity.getLeader().toString();
-            }
-        }),
-
     REGISTRATOR(new AbstractColumnDefinitionKind<Group>(Dict.REGISTRATOR)
         {
             @Override
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/Group.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/Group.java
index be971d0c1c1cea739c1d8c0819d2ff09a0fafa41..d5c564a504e7f7534d0f72574f7bc063443dfab1 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/Group.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/client/dto/Group.java
@@ -19,7 +19,7 @@ package ch.systemsx.cisd.openbis.generic.client.web.client.dto;
 import ch.systemsx.cisd.openbis.generic.shared.basic.IIdHolder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.CodeWithRegistration;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatabaseInstance;
-import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Person;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IGroupUpdates;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ServiceVersionHolder;
 import ch.systemsx.cisd.openbis.generic.shared.dto.GroupPE;
 
@@ -28,7 +28,7 @@ import ch.systemsx.cisd.openbis.generic.shared.dto.GroupPE;
  * 
  * @author Franz-Josef Elmer
  */
-public final class Group extends CodeWithRegistration<Group> implements IIdHolder
+public final class Group extends CodeWithRegistration<Group> implements IIdHolder, IGroupUpdates
 {
     private static final long serialVersionUID = ServiceVersionHolder.VERSION;
 
@@ -36,10 +36,6 @@ public final class Group extends CodeWithRegistration<Group> implements IIdHolde
 
     private String description;
 
-    private Person leader;
-
-    private Group parent;
-
     private DatabaseInstance instance;
 
     private String identifier;
@@ -54,26 +50,6 @@ public final class Group extends CodeWithRegistration<Group> implements IIdHolde
         this.description = description;
     }
 
-    public Person getLeader()
-    {
-        return leader;
-    }
-
-    public void setLeader(final Person leader)
-    {
-        this.leader = leader;
-    }
-
-    public Group getParent()
-    {
-        return parent;
-    }
-
-    public void setParent(final Group parent)
-    {
-        this.parent = parent;
-    }
-
     public DatabaseInstance getInstance()
     {
         return instance;
@@ -137,4 +113,5 @@ public final class Group extends CodeWithRegistration<Group> implements IIdHolde
     {
         return this.toString().hashCode();
     }
+
 }
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
index a3bf460660ab36defa9c485822a6d642a56464f9..a7419b28bb8e307c514ab6ca90f06ce6a015052e 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/client/web/server/CommonClientService.java
@@ -106,6 +106,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityTypePropertyType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentTypePropertyType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IGroupUpdates;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IPropertyTypeUpdates;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IVocabularyTermUpdates;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IVocabularyUpdates;
@@ -285,14 +286,27 @@ public final class CommonClientService extends AbstractClientService implements
     // IGenericClientService
     //
 
-    public final void registerGroup(final String groupCode, final String descriptionOrNull,
-            final String groupLeaderOrNull)
+    public final void registerGroup(final String groupCode, final String descriptionOrNull)
     {
         try
         {
             final String sessionToken = getSessionToken();
-            commonServer.registerGroup(sessionToken, groupCode, descriptionOrNull,
-                    groupLeaderOrNull);
+            commonServer.registerGroup(sessionToken, groupCode, descriptionOrNull);
+        } catch (final UserFailureException e)
+        {
+            throw UserFailureExceptionTranslator.translate(e);
+        }
+    }
+
+    public final void updateGroup(final IGroupUpdates updates)
+            throws ch.systemsx.cisd.openbis.generic.client.web.client.exception.UserFailureException
+    {
+        assert updates != null : "Unspecified updates.";
+
+        try
+        {
+            final String sessionToken = getSessionToken();
+            commonServer.updateGroup(sessionToken, updates);
         } catch (final UserFailureException e)
         {
             throw UserFailureExceptionTranslator.translate(e);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
index 6e51767ec46d8b87dff54789afc17f7129945d58..e93349ba8875b7fcc9e60043aca0926129a80723 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServer.java
@@ -70,6 +70,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescrip
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IGroupUpdates;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IPropertyTypeUpdates;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IVocabularyTermUpdates;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IVocabularyUpdates;
@@ -201,14 +202,24 @@ public final class CommonServer extends AbstractServer<ICommonServer> implements
     }
 
     public final void registerGroup(final String sessionToken, final String groupCode,
-            final String descriptionOrNull, final String groupLeaderOrNull)
+            final String descriptionOrNull)
     {
         final Session session = getSessionManager().getSession(sessionToken);
         final IGroupBO groupBO = businessObjectFactory.createGroupBO(session);
-        groupBO.define(groupCode, descriptionOrNull, groupLeaderOrNull);
+        groupBO.define(groupCode, descriptionOrNull);
         groupBO.save();
     }
 
+    public final void updateGroup(final String sessionToken, final IGroupUpdates updates)
+    {
+        assert sessionToken != null : "Unspecified session token";
+        assert updates != null : "Unspecified updates";
+
+        final Session session = getSessionManager().getSession(sessionToken);
+        final IGroupBO groupBO = businessObjectFactory.createGroupBO(session);
+        groupBO.update(updates);
+    }
+
     public final void registerPerson(final String sessionToken, final String userID)
     {
         final Session session = getSessionManager().getSession(sessionToken);
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
index e4d652e3a950234d73b3c75cfe62c462bbb0e40f..92d986625b078415b066ba7097633f19cda26c82 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/CommonServerLogger.java
@@ -36,6 +36,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescrip
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IGroupUpdates;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IPropertyTypeUpdates;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IVocabularyTermUpdates;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IVocabularyUpdates;
@@ -120,11 +121,16 @@ final class CommonServerLogger extends AbstractServerLogger implements ICommonSe
     }
 
     public void registerGroup(final String sessionToken, final String groupCode,
-            final String descriptionOrNull, final String groupLeaderOrNull)
+            final String descriptionOrNull)
     {
         logTracking(sessionToken, "register_group", "CODE(%s)", groupCode);
     }
 
+    public void updateGroup(String sessionToken, IGroupUpdates updates)
+    {
+        logTracking(sessionToken, "update_group", "GROUP(%s)", updates);
+    }
+
     public List<PersonPE> listPersons(final String sessionToken)
     {
         logAccess(sessionToken, "list_persons");
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/GroupBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/GroupBO.java
index f7a35193cd523313447226b59fc7181374394c8c..af9431c18507a00bfe4f35c43183cb916c5a687a 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/GroupBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/GroupBO.java
@@ -23,6 +23,7 @@ import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.IDAOFactory;
 import ch.systemsx.cisd.openbis.generic.server.util.GroupIdentifierHelper;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IGroupUpdates;
 import ch.systemsx.cisd.openbis.generic.shared.dto.DatabaseInstancePE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EventPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.EventType;
@@ -66,8 +67,22 @@ public final class GroupBO extends AbstractBusinessObject implements IGroupBO
         }
     }
 
-    public final void define(String groupCode, final String descriptionOrNull,
-            final String groupLeaderOrNull) throws UserFailureException
+    public void update(IGroupUpdates updates)
+    {
+        loadDataByTechId(TechId.create(updates));
+
+        group.setDescription(updates.getDescription());
+
+        validateAndSave();
+    }
+
+    private void validateAndSave()
+    {
+        getGroupDAO().validateAndSaveUpdatedEntity(group);
+    }
+
+    public final void define(String groupCode, final String descriptionOrNull)
+            throws UserFailureException
     {
         assert groupCode != null : "Unspecified group code.";
         group = new GroupPE();
@@ -79,18 +94,6 @@ public final class GroupBO extends AbstractBusinessObject implements IGroupBO
         group.setCode(groupIdentifier.getGroupCode());
         group.setDescription(descriptionOrNull);
         group.setRegistrator(findRegistrator());
-        if (groupLeaderOrNull != null)
-        {
-            final PersonPE groupLeader = getPersonDAO().tryFindPersonByUserId(groupLeaderOrNull);
-            if (groupLeader == null)
-            {
-                final String msg =
-                        "A group leader with the given user-name '" + groupLeaderOrNull
-                                + "' does not exist!";
-                throw new UserFailureException(msg);
-            }
-            group.setGroupLeader(groupLeader);
-        }
     }
 
     public GroupPE getGroup() throws UserFailureException
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IGroupBO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IGroupBO.java
index bc9ddd90327e170aadc8713f2b7df7cefd31bd6c..66690c8e6e6b5685b499ffec0269c0573eb2e9f8 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IGroupBO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/IGroupBO.java
@@ -18,6 +18,7 @@ package ch.systemsx.cisd.openbis.generic.server.business.bo;
 
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
 import ch.systemsx.cisd.openbis.generic.shared.basic.TechId;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IGroupUpdates;
 import ch.systemsx.cisd.openbis.generic.shared.dto.GroupPE;
 import ch.systemsx.cisd.openbis.generic.shared.dto.identifier.GroupIdentifier;
 
@@ -36,8 +37,7 @@ public interface IGroupBO extends IEntityBusinessObject
      * 
      * @throws UserFailureException if <code>group</code> does already exist.
      */
-    public void define(String groupCode, String descriptionOrNull, String groupLeaderOrNull)
-            throws UserFailureException;
+    public void define(String groupCode, String descriptionOrNull) throws UserFailureException;
 
     /**
      * Loads a group described by identifier from Database Layer.
@@ -52,6 +52,11 @@ public interface IGroupBO extends IEntityBusinessObject
      */
     public GroupPE getGroup() throws UserFailureException;
 
+    /**
+     * Updates the group.
+     */
+    public void update(IGroupUpdates updates);
+
     /**
      * Deletes group for specified reason.
      * 
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java
index eee2ab73d11427a14dc8acb26afae9c3db76bfa8..25e589b6ac3307bc333a9e46c158c0e8e1a04a80 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java
@@ -48,6 +48,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescrip
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IGroupUpdates;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IPropertyTypeUpdates;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IVocabularyTermUpdates;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IVocabularyUpdates;
@@ -109,13 +110,20 @@ public interface ICommonServer extends IServer
     public List<GroupPE> listGroups(String sessionToken, DatabaseInstanceIdentifier identifier);
 
     /**
-     * Registers a new group with specified code and optional description and group leader ID.
+     * Registers a new group with specified code and optional description.
      */
     @Transactional
     @RolesAllowed(RoleSet.INSTANCE_ADMIN)
     @DatabaseCreateOrDeleteModification(value = ObjectKind.GROUP)
-    public void registerGroup(String sessionToken, String groupCode, String descriptionOrNull,
-            String groupLeaderOrNull);
+    public void registerGroup(String sessionToken, String groupCode, String descriptionOrNull);
+
+    /**
+     * Updates a property type.
+     */
+    @Transactional
+    @RolesAllowed(RoleSet.INSTANCE_ADMIN)
+    @DatabaseUpdateModification(value = ObjectKind.GROUP)
+    public void updateGroup(final String sessionToken, final IGroupUpdates updates);
 
     /**
      * Returns all persons from current instance.
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/IGroupUpdates.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/IGroupUpdates.java
new file mode 100644
index 0000000000000000000000000000000000000000..2ddfc61d540c4ff0ed0335b164b9ca38d3d23625
--- /dev/null
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/basic/dto/IGroupUpdates.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright 2009 ETH Zuerich, CISD
+ *
+ * Licensed 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 ch.systemsx.cisd.openbis.generic.shared.basic.dto;
+
+import ch.systemsx.cisd.openbis.generic.shared.basic.ICodeProvider;
+import ch.systemsx.cisd.openbis.generic.shared.basic.IIdHolder;
+
+/**
+ * Description of the updates which should be performed on a property type.
+ * 
+ * @author Piotr Buczek
+ */
+public interface IGroupUpdates extends IIdHolder, ICodeProvider
+{
+    String getDescription();
+}
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/GroupPE.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/GroupPE.java
index 8da7acd2a70400aae160bb4a034153347dacb531..94c68c84dd225ad305e25b1f3f7491905c015a52 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/GroupPE.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/shared/dto/GroupPE.java
@@ -72,12 +72,8 @@ public final class GroupPE extends HibernateAbstractRegistrationHolder implement
 
     private String description;
 
-    private PersonPE groupLeader;
-
     private DatabaseInstancePE databaseInstance;
 
-    private GroupPE parent;
-
     // null if unknown
     private Boolean home;
 
@@ -98,18 +94,6 @@ public final class GroupPE extends HibernateAbstractRegistrationHolder implement
         this.description = description;
     }
 
-    @ManyToOne(fetch = FetchType.EAGER)
-    @JoinColumn(name = ColumnNames.PERSON_LEADER_COLUMN, updatable = false)
-    public final PersonPE getGroupLeader()
-    {
-        return groupLeader;
-    }
-
-    public final void setGroupLeader(final PersonPE groupLeader)
-    {
-        this.groupLeader = groupLeader;
-    }
-
     public final void setId(final Long id)
     {
         this.id = id;
@@ -128,18 +112,6 @@ public final class GroupPE extends HibernateAbstractRegistrationHolder implement
         this.databaseInstance = databaseInstance;
     }
 
-    @ManyToOne(fetch = FetchType.EAGER)
-    @JoinColumn(name = ColumnNames.GROUP_PARENT_COLUMN, updatable = false)
-    public final GroupPE getParent()
-    {
-        return parent;
-    }
-
-    public final void setParent(final GroupPE parent)
-    {
-        this.parent = parent;
-    }
-
     @Transient
     public final Boolean isHome()
     {
diff --git a/openbis/source/sql/generic/039/schema-039.sql b/openbis/source/sql/generic/039/schema-039.sql
index 1c633323e641d5045c66e2dcb4d70596e6dd9a9c..8558b3b5a4f7e8f8524394bc588358e832b59cda 100644
--- a/openbis/source/sql/generic/039/schema-039.sql
+++ b/openbis/source/sql/generic/039/schema-039.sql
@@ -52,7 +52,7 @@ CREATE TABLE EXPERIMENT_TYPES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTIO
 CREATE TABLE EXPERIMENT_TYPE_PROPERTY_TYPES (ID TECH_ID NOT NULL,EXTY_ID TECH_ID NOT NULL,PRTY_ID TECH_ID NOT NULL,IS_MANDATORY BOOLEAN_CHAR NOT NULL DEFAULT 'F',IS_MANAGED_INTERNALLY BOOLEAN_CHAR NOT NULL DEFAULT 'F',PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP);
 CREATE TABLE EXTERNAL_DATA (DATA_ID TECH_ID NOT NULL,LOCATION VARCHAR(1024) NOT NULL,FFTY_ID TECH_ID NOT NULL,LOTY_ID TECH_ID NOT NULL,CVTE_ID_STOR_FMT TECH_ID NOT NULL,IS_COMPLETE BOOLEAN_CHAR_OR_UNKNOWN NOT NULL DEFAULT 'U',CVTE_ID_STORE TECH_ID);
 CREATE TABLE FILE_FORMAT_TYPES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_1000,DBIN_ID TECH_ID NOT NULL);
-CREATE TABLE GROUPS (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DBIN_ID TECH_ID NOT NULL,GROU_ID_PARENT TECH_ID,PERS_ID_LEADER TECH_ID,DESCRIPTION DESCRIPTION_1000,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,PERS_ID_REGISTERER TECH_ID NOT NULL);
+CREATE TABLE GROUPS (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DBIN_ID TECH_ID NOT NULL,DESCRIPTION DESCRIPTION_1000,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,PERS_ID_REGISTERER TECH_ID NOT NULL);
 CREATE TABLE INVALIDATIONS (ID TECH_ID NOT NULL,PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP,REASON DESCRIPTION_1000);
 CREATE TABLE LOCATOR_TYPES (ID TECH_ID NOT NULL,CODE CODE NOT NULL,DESCRIPTION DESCRIPTION_1000);
 CREATE TABLE MATERIALS (ID TECH_ID NOT NULL,CODE CODE NOT NULL,MATY_ID TECH_ID NOT NULL,PERS_ID_REGISTERER TECH_ID NOT NULL,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP, DBIN_ID TECH_ID NOT NULL);
@@ -243,8 +243,6 @@ ALTER TABLE EXTERNAL_DATA ADD CONSTRAINT EXDA_FFTY_FK FOREIGN KEY (FFTY_ID) REFE
 ALTER TABLE EXTERNAL_DATA ADD CONSTRAINT EXDA_LOTY_FK FOREIGN KEY (LOTY_ID) REFERENCES LOCATOR_TYPES(ID);
 ALTER TABLE FILE_FORMAT_TYPES ADD CONSTRAINT FFTY_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);
 ALTER TABLE GROUPS ADD CONSTRAINT GROU_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);
-ALTER TABLE GROUPS ADD CONSTRAINT GROU_GROU_FK FOREIGN KEY (GROU_ID_PARENT) REFERENCES GROUPS(ID);
-ALTER TABLE GROUPS ADD CONSTRAINT GROU_PERS_FK_LEADER FOREIGN KEY (PERS_ID_LEADER) REFERENCES PERSONS(ID);
 ALTER TABLE GROUPS ADD CONSTRAINT GROU_PERS_FK_REGISTERER FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID);
 ALTER TABLE INVALIDATIONS ADD CONSTRAINT INVA_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID);
 ALTER TABLE MATERIALS ADD CONSTRAINT MATE_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);
@@ -379,8 +377,6 @@ CREATE INDEX EXPR_ETPT_FK_I ON EXPERIMENT_PROPERTIES (ETPT_ID);
 CREATE INDEX EXPR_EXPE_FK_I ON EXPERIMENT_PROPERTIES (EXPE_ID);
 CREATE INDEX EXPR_PERS_FK_I ON EXPERIMENT_PROPERTIES (PERS_ID_REGISTERER);
 CREATE INDEX GROU_DBIN_FK_I ON GROUPS (DBIN_ID);
-CREATE INDEX GROU_GROU_FK_I ON GROUPS (GROU_ID_PARENT);
-CREATE INDEX GROU_PERS_FK_I ON GROUPS (PERS_ID_LEADER);
 CREATE INDEX GROU_PERS_REGISTERED_BY_FK_I ON GROUPS (PERS_ID_REGISTERER);
 CREATE INDEX INVA_PERS_FK_I ON INVALIDATIONS (PERS_ID_REGISTERER);
 CREATE INDEX MAPR_CVTE_FK_I ON MATERIAL_PROPERTIES (CVTE_ID);
diff --git a/openbis/source/sql/postgresql/migration/migration-038-039.sql b/openbis/source/sql/postgresql/migration/migration-038-039.sql
index 8e926663fbdc04f3cd3275fa4379d766cf86b5e4..3db0da48714aff798ad7211d592d7cab6a03dab5 100644
--- a/openbis/source/sql/postgresql/migration/migration-038-039.sql
+++ b/openbis/source/sql/postgresql/migration/migration-038-039.sql
@@ -51,3 +51,7 @@ GRANT SELECT ON SEQUENCE AUTHORIZATION_GROUP_PERSON_ID_SEQ TO GROUP OPENBIS_READ
 GRANT SELECT ON TABLE AUTHORIZATION_GROUPS TO GROUP OPENBIS_READONLY;
 GRANT SELECT ON TABLE AUTHORIZATION_GROUP_PERSONS TO GROUP OPENBIS_READONLY;
 
+-- remove group leader and parent
+
+ALTER TABLE groups DROP COLUMN grou_id_parent;
+ALTER TABLE groups DROP COLUMN pers_id_leader;
\ No newline at end of file
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/CommonServerTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/CommonServerTest.java
index 18fa1c5bc8cb5a7847317fe448d8e6121b01766d..1360313631dd28b6cdef6131f6a03210eab3ed16 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/CommonServerTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/CommonServerTest.java
@@ -307,19 +307,18 @@ public final class CommonServerTest extends AbstractServerTestCase
         prepareGetSession();
         final String groupCode = "group";
         final String description = "description";
-        final String leader = "leader";
         context.checking(new Expectations()
             {
                 {
                     one(commonBusinessObjectFactory).createGroupBO(SESSION);
                     will(returnValue(groupBO));
 
-                    one(groupBO).define(groupCode, description, leader);
+                    one(groupBO).define(groupCode, description);
                     one(groupBO).save();
                 }
             });
 
-        createServer().registerGroup(SESSION_TOKEN, groupCode, description, leader);
+        createServer().registerGroup(SESSION_TOKEN, groupCode, description);
 
         context.assertIsSatisfied();
     }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/GroupBOTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/GroupBOTest.java
index 20edb57c5425868de93d2719503dedec205f33ec..cb9adb87c25d5c893c27fe3afa510fd8c683d6ee 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/GroupBOTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/GroupBOTest.java
@@ -53,11 +53,11 @@ public final class GroupBOTest extends AbstractBOTest
     @Test
     public final void testDefineWithNullCode()
     {
-        final GroupBO projectBO = createGroupBO();
+        final GroupBO groupBO = createGroupBO();
         boolean fail = true;
         try
         {
-            projectBO.define(null, null, null);
+            groupBO.define(null, null);
         } catch (final AssertionError ex)
         {
             fail = false;
@@ -82,7 +82,7 @@ public final class GroupBOTest extends AbstractBOTest
                     one(groupDAO).createGroup(groupDTO);
                 }
             });
-        projectBO.define(groupDTO.getCode(), null, null);
+        projectBO.define(groupDTO.getCode(), null);
         projectBO.save();
         context.assertIsSatisfied();
     }
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java.expected b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java.expected
index eee2ab73d11427a14dc8acb26afae9c3db76bfa8..25e589b6ac3307bc333a9e46c158c0e8e1a04a80 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java.expected
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/ICommonServer.java.expected
@@ -48,6 +48,7 @@ import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DatastoreServiceDescrip
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.EntityType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.ExperimentType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.FileFormatType;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IGroupUpdates;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IPropertyTypeUpdates;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IVocabularyTermUpdates;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IVocabularyUpdates;
@@ -109,13 +110,20 @@ public interface ICommonServer extends IServer
     public List<GroupPE> listGroups(String sessionToken, DatabaseInstanceIdentifier identifier);
 
     /**
-     * Registers a new group with specified code and optional description and group leader ID.
+     * Registers a new group with specified code and optional description.
      */
     @Transactional
     @RolesAllowed(RoleSet.INSTANCE_ADMIN)
     @DatabaseCreateOrDeleteModification(value = ObjectKind.GROUP)
-    public void registerGroup(String sessionToken, String groupCode, String descriptionOrNull,
-            String groupLeaderOrNull);
+    public void registerGroup(String sessionToken, String groupCode, String descriptionOrNull);
+
+    /**
+     * Updates a property type.
+     */
+    @Transactional
+    @RolesAllowed(RoleSet.INSTANCE_ADMIN)
+    @DatabaseUpdateModification(value = ObjectKind.GROUP)
+    public void updateGroup(final String sessionToken, final IGroupUpdates updates);
 
     /**
      * Returns all persons from current instance.
diff --git a/openbis/sourceTest/sql/postgresql/039/017=database_version_logs.tsv b/openbis/sourceTest/sql/postgresql/039/017=database_version_logs.tsv
index 7225b45c6cb7c27e23c57c7a98928dd18171017d..47ba2e69a90ae812db274d1b3c80a6cdf1f9e424 100644
--- a/openbis/sourceTest/sql/postgresql/039/017=database_version_logs.tsv
+++ b/openbis/sourceTest/sql/postgresql/039/017=database_version_logs.tsv
@@ -12,4 +12,4 @@
 036	source/sql/postgresql/migration/migration-035-036.sql	SUCCESS	2009-06-18 16:04:44.895	-- Change type description length\\012\\012ALTER TABLE sample_types ALTER COLUMN description TYPE DESCRIPTION_250;\\012ALTER TABLE data_set_types ALTER COLUMN description TYPE DESCRIPTION_250;\\012ALTER TABLE experiment_types ALTER COLUMN description TYPE DESCRIPTION_250;\\012ALTER TABLE material_types ALTER COLUMN description TYPE DESCRIPTION_250;\\012ALTER TABLE controlled_vocabularies ALTER COLUMN description TYPE DESCRIPTION_250;\\012ALTER TABLE data_types ALTER COLUMN description TYPE DESCRIPTION_250;\\012ALTER TABLE file_format_types ALTER COLUMN description TYPE DESCRIPTION_250;\\012ALTER TABLE locator_types ALTER COLUMN description TYPE DESCRIPTION_250;\\012ALTER TABLE property_types ALTER COLUMN description TYPE DESCRIPTION_250;\\012\\012DROP TYPE description_80;\\012\\012-- Add attachment title and description\\012\\012CREATE DOMAIN TITLE_100 AS VARCHAR(100);\\012\\012ALTER TABLE attachments ADD COLUMN title TITLE_100;\\012ALTER TABLE attachments ADD COLUMN description DESCRIPTION_1000;\\012\\012-- Add 'POWER_USER' to AUTHORIZATION_ROLE domain\\012\\012ALTER DOMAIN authorization_role DROP CONSTRAINT authorization_role_check;\\012ALTER DOMAIN authorization_role ADD CONSTRAINT authorization_role_check CHECK (VALUE IN ('ADMIN', 'POWER_USER', 'USER', 'OBSERVER', 'ETL_SERVER'));\\012	\N
 037	source/sql/postgresql/migration/migration-036-037.sql	SUCCESS	2009-07-15 13:41:33.593	-- JAVA ch.systemsx.cisd.openbis.generic.server.dataaccess.migration.MigrationStepFrom036To037\\012\\012-- Add Data Store Services table\\012\\012CREATE DOMAIN DATA_STORE_SERVICE_KIND AS VARCHAR(40) CHECK (VALUE IN ('PROCESSING', 'QUERIES'));\\012\\012CREATE TABLE DATA_STORE_SERVICES  (ID TECH_ID NOT NULL, KEY VARCHAR(256) NOT NULL, LABEL VARCHAR(256) NOT NULL, KIND DATA_STORE_SERVICE_KIND NOT NULL, DATA_STORE_ID TECH_ID NOT NULL);\\012CREATE TABLE DATA_STORE_SERVICE_DATA_SET_TYPES (DATA_STORE_SERVICE_ID TECH_ID NOT NULL, DATA_SET_TYPE_ID TECH_ID NOT NULL);\\012\\012CREATE SEQUENCE DATA_STORE_SERVICES_ID_SEQ;\\012\\012ALTER TABLE DATA_STORE_SERVICES ADD CONSTRAINT DSSE_PK PRIMARY KEY(ID);\\012\\012ALTER TABLE DATA_STORE_SERVICES ADD CONSTRAINT DSSE_BK_UK UNIQUE(KEY, DATA_STORE_ID);\\012ALTER TABLE DATA_STORE_SERVICE_DATA_SET_TYPES ADD CONSTRAINT DSSDST_BK_UK UNIQUE(DATA_STORE_SERVICE_ID, DATA_SET_TYPE_ID);\\012\\012ALTER TABLE DATA_STORE_SERVICES ADD CONSTRAINT DSSE_DS_FK FOREIGN KEY (DATA_STORE_ID) REFERENCES DATA_STORES(ID) ON DELETE CASCADE;\\012ALTER TABLE DATA_STORE_SERVICE_DATA_SET_TYPES ADD CONSTRAINT DSSDST_DS_FK FOREIGN KEY (DATA_STORE_SERVICE_ID) REFERENCES DATA_STORE_SERVICES(ID) ON DELETE CASCADE;\\012ALTER TABLE DATA_STORE_SERVICE_DATA_SET_TYPES ADD CONSTRAINT DSSDST_DST_FK FOREIGN KEY (DATA_SET_TYPE_ID) REFERENCES DATA_SET_TYPES(ID) ON DELETE CASCADE;\\012\\012CREATE INDEX DSSE_DS_FK_I ON DATA_STORE_SERVICES (DATA_STORE_ID);\\012CREATE INDEX DSSDST_DS_FK_I ON DATA_STORE_SERVICE_DATA_SET_TYPES (DATA_STORE_SERVICE_ID);\\012CREATE INDEX DSSDST_DST_FK_I ON DATA_STORE_SERVICE_DATA_SET_TYPES (DATA_SET_TYPE_ID);\\012\\012GRANT SELECT ON SEQUENCE DATA_STORE_SERVICES_ID_SEQ TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE DATA_STORE_SERVICES TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE DATA_STORE_SERVICE_DATA_SET_TYPES TO GROUP OPENBIS_READONLY;\\012	\N
 038	source/sql/postgresql/migration/migration-037-038.sql	SUCCESS	2009-07-15 13:43:15.137	-- Change events table check constraint (add 'GROUP')\\012\\012ALTER TABLE events DROP CONSTRAINT evnt_et_enum_ck;\\012ALTER TABLE events ADD CONSTRAINT evnt_et_enum_ck CHECK \\012\\011\\011(entity_type IN ('ATTACHMENT', 'DATASET', 'EXPERIMENT', 'GROUP', 'MATERIAL', 'PROJECT', 'PROPERTY_TYPE', 'SAMPLE', 'VOCABULARY'));\\012	\N
-039	source/sql/postgresql/migration/migration-038-039.sql	SUCCESS	2009-07-28 15:30:59.303	-- Longer descriptions\\012ALTER TABLE sample_types ALTER COLUMN description TYPE DESCRIPTION_1000;\\012ALTER TABLE data_set_types ALTER COLUMN description TYPE DESCRIPTION_1000;\\012ALTER TABLE experiment_types ALTER COLUMN description TYPE DESCRIPTION_1000;\\012ALTER TABLE material_types ALTER COLUMN description TYPE DESCRIPTION_1000;\\012ALTER TABLE controlled_vocabularies ALTER COLUMN description TYPE DESCRIPTION_1000;\\012ALTER TABLE data_types ALTER COLUMN description TYPE DESCRIPTION_1000;\\012ALTER TABLE file_format_types ALTER COLUMN description TYPE DESCRIPTION_1000;\\012ALTER TABLE locator_types ALTER COLUMN description TYPE DESCRIPTION_1000;\\012ALTER TABLE property_types ALTER COLUMN description TYPE DESCRIPTION_1000;\\012ALTER TABLE events ALTER COLUMN description TYPE DESCRIPTION_1000;\\012ALTER TABLE events ALTER COLUMN reason TYPE DESCRIPTION_1000;\\012ALTER TABLE groups ALTER COLUMN description TYPE DESCRIPTION_1000;\\012ALTER TABLE invalidations ALTER COLUMN reason TYPE DESCRIPTION_1000;\\012\\012\\012DROP TYPE DESCRIPTION_250;\\012\\012-- Add label and description to controlled vocabularies\\012\\012ALTER TABLE CONTROLLED_VOCABULARY_TERMS ADD COLUMN label COLUMN_LABEL;\\012ALTER TABLE CONTROLLED_VOCABULARY_TERMS ADD COLUMN description DESCRIPTION_1000;\\012\\012-- Add authorization groups\\012\\012CREATE TABLE AUTHORIZATION_GROUPS (ID TECH_ID NOT NULL, DBIN_ID TECH_ID NOT NULL, CODE CODE NOT NULL, DESCRIPTION DESCRIPTION_1000,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, PERS_ID_REGISTERER TECH_ID NOT NULL, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP);\\012ALTER TABLE AUTHORIZATION_GROUPS ADD CONSTRAINT AG_PK PRIMARY KEY(ID);\\012ALTER TABLE AUTHORIZATION_GROUPS ADD CONSTRAINT AG_BK_UK UNIQUE(CODE,DBIN_ID);\\012ALTER TABLE AUTHORIZATION_GROUPS ADD CONSTRAINT AG_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE AUTHORIZATION_GROUPS ADD CONSTRAINT AG_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID);\\012CREATE SEQUENCE AUTHORIZATION_GROUP_ID_SEQ;\\012\\012CREATE TABLE AUTHORIZATION_GROUP_PERSONS (ID TECH_ID NOT NULL, AG_ID TECH_ID NOT NULL, PERS_ID TECH_ID NOT NULL);\\012ALTER TABLE AUTHORIZATION_GROUP_PERSONS ADD CONSTRAINT AGP_PK PRIMARY KEY(ID);\\012ALTER TABLE AUTHORIZATION_GROUP_PERSONS ADD CONSTRAINT AGP_BK_UK UNIQUE(PERS_ID,AG_ID);\\012ALTER TABLE AUTHORIZATION_GROUP_PERSONS ADD CONSTRAINT AGP_AG_FK FOREIGN KEY (AG_ID) REFERENCES AUTHORIZATION_GROUPS(ID);\\012ALTER TABLE AUTHORIZATION_GROUP_PERSONS ADD CONSTRAINT AGP_PERS_FK FOREIGN KEY (PERS_ID) REFERENCES PERSONS(ID);\\012CREATE SEQUENCE AUTHORIZATION_GROUP_PERSON_ID_SEQ;\\012\\012ALTER TABLE ROLE_ASSIGNMENTS ALTER COLUMN PERS_ID_GRANTEE DROP NOT NULL;\\012ALTER TABLE ROLE_ASSIGNMENTS ADD COLUMN AG_ID_GRANTEE TECH_ID;\\012ALTER TABLE ROLE_ASSIGNMENTS DROP CONSTRAINT ROAS_GROUP_BK_UK;\\012ALTER TABLE ROLE_ASSIGNMENTS DROP CONSTRAINT ROAS_INSTANCE_BK_UK;\\012ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_AG_PERS_ARC_CK CHECK ((AG_ID_GRANTEE IS NOT NULL AND PERS_ID_GRANTEE IS NULL) OR (AG_ID_GRANTEE IS NULL AND PERS_ID_GRANTEE IS NOT NULL));\\012CREATE INDEX ROAS_AG_FK_I_GRANTEE ON ROLE_ASSIGNMENTS (AG_ID_GRANTEE);\\012\\012CREATE UNIQUE INDEX ROAS_ROLE_GROUP_DBI_AG_PERS_UQ_I ON ROLE_ASSIGNMENTS (ROLE_CODE, COALESCE(PERS_ID_GRANTEE,-1), COALESCE(AG_ID_GRANTEE,-1), COALESCE(GROU_ID,-1), COALESCE(DBIN_ID,-1));\\012\\012GRANT SELECT ON SEQUENCE AUTHORIZATION_GROUP_ID_SEQ TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON SEQUENCE AUTHORIZATION_GROUP_PERSON_ID_SEQ TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE AUTHORIZATION_GROUPS TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE AUTHORIZATION_GROUP_PERSONS TO GROUP OPENBIS_READONLY;\\012\\012	\N
+039	source/sql/postgresql/migration/migration-038-039.sql	SUCCESS	2009-07-31 15:23:28.813	-- Longer descriptions\\012ALTER TABLE sample_types ALTER COLUMN description TYPE DESCRIPTION_1000;\\012ALTER TABLE data_set_types ALTER COLUMN description TYPE DESCRIPTION_1000;\\012ALTER TABLE experiment_types ALTER COLUMN description TYPE DESCRIPTION_1000;\\012ALTER TABLE material_types ALTER COLUMN description TYPE DESCRIPTION_1000;\\012ALTER TABLE controlled_vocabularies ALTER COLUMN description TYPE DESCRIPTION_1000;\\012ALTER TABLE data_types ALTER COLUMN description TYPE DESCRIPTION_1000;\\012ALTER TABLE file_format_types ALTER COLUMN description TYPE DESCRIPTION_1000;\\012ALTER TABLE locator_types ALTER COLUMN description TYPE DESCRIPTION_1000;\\012ALTER TABLE property_types ALTER COLUMN description TYPE DESCRIPTION_1000;\\012ALTER TABLE events ALTER COLUMN description TYPE DESCRIPTION_1000;\\012ALTER TABLE events ALTER COLUMN reason TYPE DESCRIPTION_1000;\\012ALTER TABLE groups ALTER COLUMN description TYPE DESCRIPTION_1000;\\012ALTER TABLE invalidations ALTER COLUMN reason TYPE DESCRIPTION_1000;\\012\\012\\012DROP TYPE DESCRIPTION_250;\\012\\012-- Add label and description to controlled vocabularies\\012\\012ALTER TABLE CONTROLLED_VOCABULARY_TERMS ADD COLUMN label COLUMN_LABEL;\\012ALTER TABLE CONTROLLED_VOCABULARY_TERMS ADD COLUMN description DESCRIPTION_1000;\\012\\012-- Add authorization groups\\012\\012CREATE TABLE AUTHORIZATION_GROUPS (ID TECH_ID NOT NULL, DBIN_ID TECH_ID NOT NULL, CODE CODE NOT NULL, DESCRIPTION DESCRIPTION_1000,REGISTRATION_TIMESTAMP TIME_STAMP_DFL NOT NULL DEFAULT CURRENT_TIMESTAMP, PERS_ID_REGISTERER TECH_ID NOT NULL, MODIFICATION_TIMESTAMP TIME_STAMP DEFAULT CURRENT_TIMESTAMP);\\012ALTER TABLE AUTHORIZATION_GROUPS ADD CONSTRAINT AG_PK PRIMARY KEY(ID);\\012ALTER TABLE AUTHORIZATION_GROUPS ADD CONSTRAINT AG_BK_UK UNIQUE(CODE,DBIN_ID);\\012ALTER TABLE AUTHORIZATION_GROUPS ADD CONSTRAINT AG_DBIN_FK FOREIGN KEY (DBIN_ID) REFERENCES DATABASE_INSTANCES(ID);\\012ALTER TABLE AUTHORIZATION_GROUPS ADD CONSTRAINT AG_PERS_FK FOREIGN KEY (PERS_ID_REGISTERER) REFERENCES PERSONS(ID);\\012CREATE SEQUENCE AUTHORIZATION_GROUP_ID_SEQ;\\012\\012CREATE TABLE AUTHORIZATION_GROUP_PERSONS (ID TECH_ID NOT NULL, AG_ID TECH_ID NOT NULL, PERS_ID TECH_ID NOT NULL);\\012ALTER TABLE AUTHORIZATION_GROUP_PERSONS ADD CONSTRAINT AGP_PK PRIMARY KEY(ID);\\012ALTER TABLE AUTHORIZATION_GROUP_PERSONS ADD CONSTRAINT AGP_BK_UK UNIQUE(PERS_ID,AG_ID);\\012ALTER TABLE AUTHORIZATION_GROUP_PERSONS ADD CONSTRAINT AGP_AG_FK FOREIGN KEY (AG_ID) REFERENCES AUTHORIZATION_GROUPS(ID);\\012ALTER TABLE AUTHORIZATION_GROUP_PERSONS ADD CONSTRAINT AGP_PERS_FK FOREIGN KEY (PERS_ID) REFERENCES PERSONS(ID);\\012CREATE SEQUENCE AUTHORIZATION_GROUP_PERSON_ID_SEQ;\\012\\012ALTER TABLE ROLE_ASSIGNMENTS ALTER COLUMN PERS_ID_GRANTEE DROP NOT NULL;\\012ALTER TABLE ROLE_ASSIGNMENTS ADD COLUMN AG_ID_GRANTEE TECH_ID;\\012ALTER TABLE ROLE_ASSIGNMENTS DROP CONSTRAINT ROAS_GROUP_BK_UK;\\012ALTER TABLE ROLE_ASSIGNMENTS DROP CONSTRAINT ROAS_INSTANCE_BK_UK;\\012ALTER TABLE ROLE_ASSIGNMENTS ADD CONSTRAINT ROAS_AG_PERS_ARC_CK CHECK ((AG_ID_GRANTEE IS NOT NULL AND PERS_ID_GRANTEE IS NULL) OR (AG_ID_GRANTEE IS NULL AND PERS_ID_GRANTEE IS NOT NULL));\\012CREATE INDEX ROAS_AG_FK_I_GRANTEE ON ROLE_ASSIGNMENTS (AG_ID_GRANTEE);\\012\\012CREATE UNIQUE INDEX ROAS_ROLE_GROUP_DBI_AG_PERS_UQ_I ON ROLE_ASSIGNMENTS (ROLE_CODE, COALESCE(PERS_ID_GRANTEE,-1), COALESCE(AG_ID_GRANTEE,-1), COALESCE(GROU_ID,-1), COALESCE(DBIN_ID,-1));\\012\\012GRANT SELECT ON SEQUENCE AUTHORIZATION_GROUP_ID_SEQ TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON SEQUENCE AUTHORIZATION_GROUP_PERSON_ID_SEQ TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE AUTHORIZATION_GROUPS TO GROUP OPENBIS_READONLY;\\012GRANT SELECT ON TABLE AUTHORIZATION_GROUP_PERSONS TO GROUP OPENBIS_READONLY;\\012\\012-- remove group leader and parent\\012\\012ALTER TABLE groups DROP COLUMN grou_id_parent;\\012ALTER TABLE groups DROP COLUMN pers_id_leader;\\012	\N
diff --git a/openbis/sourceTest/sql/postgresql/039/025=groups.tsv b/openbis/sourceTest/sql/postgresql/039/025=groups.tsv
index 0cc5e0ff0a10fc61dc726c4ea55801aaeaab5738..dd9c78d91bd274ee25cac4060aaf68a7488e7001 100644
--- a/openbis/sourceTest/sql/postgresql/039/025=groups.tsv
+++ b/openbis/sourceTest/sql/postgresql/039/025=groups.tsv
@@ -1,2 +1,2 @@
-1	CISD	1	\N	\N	\N	2008-11-05 09:18:10.893+01	2
-2	TESTGROUP	1	\N	2	myDescription	2008-11-05 09:18:11.283+01	2
+1	CISD	1	\N	2008-11-05 09:18:10.893+01	2
+2	TESTGROUP	1	myDescription	2008-11-05 09:18:11.283+01	2
diff --git a/openbis/sourceTest/sql/postgresql/039/finish-039.sql b/openbis/sourceTest/sql/postgresql/039/finish-039.sql
index c107e683da22f4bdc559f4bbe4daecb7044770bc..61c71768e075affac4d5b69b0839ccc654b6c826 100644
--- a/openbis/sourceTest/sql/postgresql/039/finish-039.sql
+++ b/openbis/sourceTest/sql/postgresql/039/finish-039.sql
@@ -190,8 +190,6 @@ CREATE INDEX expr_etpt_fk_i ON experiment_properties USING btree (etpt_id);
 CREATE INDEX expr_expe_fk_i ON experiment_properties USING btree (expe_id);
 CREATE INDEX expr_pers_fk_i ON experiment_properties USING btree (pers_id_registerer);
 CREATE INDEX grou_dbin_fk_i ON groups USING btree (dbin_id);
-CREATE INDEX grou_grou_fk_i ON groups USING btree (grou_id_parent);
-CREATE INDEX grou_pers_fk_i ON groups USING btree (pers_id_leader);
 CREATE INDEX grou_pers_registered_by_fk_i ON groups USING btree (pers_id_registerer);
 CREATE INDEX inva_pers_fk_i ON invalidations USING btree (pers_id_registerer);
 CREATE INDEX mapr_cvte_fk_i ON material_properties USING btree (cvte_id);
@@ -368,10 +366,6 @@ ALTER TABLE ONLY file_format_types
     ADD CONSTRAINT ffty_dbin_fk FOREIGN KEY (dbin_id) REFERENCES database_instances(id);
 ALTER TABLE ONLY groups
     ADD CONSTRAINT grou_dbin_fk FOREIGN KEY (dbin_id) REFERENCES database_instances(id);
-ALTER TABLE ONLY groups
-    ADD CONSTRAINT grou_grou_fk FOREIGN KEY (grou_id_parent) REFERENCES groups(id);
-ALTER TABLE ONLY groups
-    ADD CONSTRAINT grou_pers_fk_leader FOREIGN KEY (pers_id_leader) REFERENCES persons(id);
 ALTER TABLE ONLY groups
     ADD CONSTRAINT grou_pers_fk_registerer FOREIGN KEY (pers_id_registerer) REFERENCES persons(id);
 ALTER TABLE ONLY invalidations
@@ -473,4 +467,3 @@ REVOKE ALL ON SCHEMA public FROM postgres;
 GRANT ALL ON SCHEMA public TO postgres;
 GRANT ALL ON SCHEMA public TO PUBLIC;
 
-
diff --git a/openbis/sourceTest/sql/postgresql/039/schema-039.sql b/openbis/sourceTest/sql/postgresql/039/schema-039.sql
index 4b716202917edefb6e9ef7d3906b83bb4132755b..cab0b5c758c15f633a4f7736a7cbdb6d43eeb34b 100644
--- a/openbis/sourceTest/sql/postgresql/039/schema-039.sql
+++ b/openbis/sourceTest/sql/postgresql/039/schema-039.sql
@@ -577,8 +577,6 @@ CREATE TABLE groups (
     id tech_id NOT NULL,
     code code NOT NULL,
     dbin_id tech_id NOT NULL,
-    grou_id_parent tech_id,
-    pers_id_leader tech_id,
     description description_1000,
     registration_timestamp time_stamp_dfl DEFAULT now() NOT NULL,
     pers_id_registerer tech_id NOT NULL