Index: src/main/java/de/mpiwg/itgroup/annotations/neo4j/AnnotationStore.java
===================================================================
--- src/main/java/de/mpiwg/itgroup/annotations/neo4j/AnnotationStore.java	(revision 19)
+++ src/main/java/de/mpiwg/itgroup/annotations/neo4j/AnnotationStore.java	(revision 22)
@@ -140,4 +140,51 @@
     }
 
+    /**
+     * Returns the members of the group.
+     * 
+     * @param group
+     * @return
+     */
+    public List<Person> getMembersOfGroup(Group group) {
+        ArrayList<Person> members = new ArrayList<Person>();
+        Node gn = getActorNode(group);
+        Iterable<Relationship> rels = gn.getRelationships(RelationTypes.MEMBER_OF);
+        for (Relationship rel : rels) {
+            Node memberNode = rel.getStartNode();
+            Actor member = createActorFromNode(memberNode);
+            // make sure we're getting a group
+            if (!(member instanceof Person)) {
+                logger.error("source of MEMBER_OF is not PERSON! rel=" + rel);
+                continue;
+            }
+            members.add((Person) member);
+        }
+        return members;
+    }
+    
+    /**
+     * Returns the stored Actor matching the given one.
+     * 
+     * @param actor
+     * @return
+     */
+    public Actor getActor(Actor actor) {
+    	Node actorNode = getActorNode(actor);
+    	Actor storedActor = createActorFromNode(actorNode);
+    	return storedActor;
+    }
+    
+    /**
+     * Stores an Actor (Person or Group). Creates a new actor Node or returns an existing one.
+     * 
+     * @param actor
+     * @return
+     */
+    public Actor storeActor(Actor actor) {
+    	Node actorNode = getOrCreateActorNode(actor);
+    	Actor storedActor = createActorFromNode(actorNode);
+    	return storedActor;
+    }
+    
     /**
      * Returns the Annotation with the given id.
@@ -536,4 +583,18 @@
     }
 
+    protected Node getActorNode(Actor actor) {
+        // Person/Group is identified by URI or id
+        String uri = actor.getUriString();
+        Index<Node> idx;
+        if (actor.isGroup()) {
+            idx = getNodeIndex(NodeTypes.GROUP);
+        } else {
+            idx = getNodeIndex(NodeTypes.PERSON);
+        }
+        IndexHits<Node> persons = idx.get("uri", uri);
+        Node person = persons.getSingle();
+        return person;
+    }
+    
     protected Node getOrCreateActorNode(Actor actor) {
         // Person/Group is identified by URI or id
Index: src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotationStoreGroups.java
===================================================================
--- src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotationStoreGroups.java	(revision 21)
+++ src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotationStoreGroups.java	(revision 22)
@@ -6,20 +6,23 @@
 import java.util.List;
 
-import javax.servlet.ServletContext;
-
 import org.apache.log4j.Logger;
 import org.restlet.data.Form;
 import org.restlet.data.MediaType;
+import org.restlet.data.Reference;
+import org.restlet.data.Status;
 import org.restlet.representation.Representation;
 import org.restlet.representation.StringRepresentation;
 import org.restlet.resource.Get;
+import org.restlet.resource.Post;
 import org.restlet.resource.ServerResource;
 
+import de.mpiwg.itgroup.annotations.Actor;
 import de.mpiwg.itgroup.annotations.Group;
+import de.mpiwg.itgroup.annotations.Person;
 import de.mpiwg.itgroup.annotations.neo4j.AnnotationStore;
 
 /**
  * @author casties
- *
+ * 
  */
 public class AnnotationStoreGroups extends ServerResource {
@@ -29,33 +32,96 @@
     private AnnotationStore store;
 
+    /**
+     * GET with HTML content type. Lists all groups.
+     * 
+     * @param entity
+     * @return
+     */
     @Get("html")
-    public Representation doGetHTML(Representation entity){
-        Form form = getRequest().getResourceRef().getQueryAsForm();
+    public Representation doGetHTML(Representation entity) {
         // id from URI /annotations/groups/{id}
         String id = (String) getRequest().getAttributes().get("id");
         logger.debug("group-id=" + id);
-        String result="<html><body>\n<h1>Groups</h1>\n<table>";
-        result += "<tr><th>id</th><th>name</th><th>uri</th></tr>";
+        String result = null;
         store = getAnnotationStore();
         if (id == null) {
             // list all groups
+            result = "<html><body>\n<h1>Groups</h1>\n<table>";
+            result += "<tr><th>id</th><th>name</th><th>uri</th></tr>";
             List<Group> groups = store.getGroups("uri", "*");
             for (Group group : groups) {
-                String groupLink = group.getId();
-                result += String.format("<tr><td><a href=\"%s\">%s</a></td><td>%s</td><td>%s</td></tr>\n", groupLink, group.getId(), group.getName(), group.getUri());
+                Reference groupUrl = this.getReference();
+                groupUrl.addSegment(group.getId());
+                result += String.format("<tr><td><a href=\"%s\">%s</a></td><td>%s</td><td>%s</td></tr>\n", groupUrl,
+                        group.getId(), group.getName(), group.getUri());
             }
+            result += "</table>\n</body>\n</html>";
         } else {
             // just one group
-            List<Group> groups = store.getGroups("uri", "*");
-            for (Group group : groups) {
-                String groupLink = group.getId();
-                result += String.format("<tr><td><a href=\"%s\">%s</a></td><td>%s</td><td>%s</td></tr>\n", groupLink, group.getId(), group.getName(), group.getUri());
+            Reference groupsUrl = this.getReference().getParentRef();
+            result = "<html><body>\n<h1>Group</h1>\n";
+            result += String.format("<p><a href=\"%s\">All groups</a></p>", groupsUrl);
+            Group group = new Group(id);
+            group = (Group) store.getActor(group);
+            result += "<table>";
+            result += String.format("<tr><td><b>id</b></td><td>%s</td></tr>\n", group.getId());
+            result += String.format("<tr><td><b>name</b></td><td>%s</td></tr>\n", group.getName());
+            result += String.format("<tr><td><b>uri</b></td><td>%s</td></tr>\n", group.getUri());
+            result += "<tr><td><b>members</b></td><td>";
+            List<Person> members = store.getMembersOfGroup(group);
+            for (Person p : members) {
+                result += String.format("%s (%s)\n", p.getName(), p.getIdString());                
             }
+            result += "</td></tr>\n";
+            result += "</table>\n</body>\n</html>";
         }
-        result += "</table>\n</body>\n</html>";
-        
+
         logger.debug("sending:");
         logger.debug(result);
-        return new StringRepresentation(result,MediaType.TEXT_HTML);
+        return new StringRepresentation(result, MediaType.TEXT_HTML);
+    }
+
+    /**
+     * POST with HTML content-type. Creates a new Group.
+     * 
+     * @return
+     */
+    @Post
+    public Representation doPostHTML(Representation entity) {
+        logger.debug("AnnotationStoreGroups doPostHTML!");
+        // TODO: do authentication
+        Form form = new Form(entity);
+        String id = form.getFirstValue("id");
+        String name = form.getFirstValue("name");
+        if (id == null || id.isEmpty()) {
+            // invalid id
+            setStatus(Status.CLIENT_ERROR_BAD_REQUEST);
+            return null;
+        }
+        String gid = makeGroupId(id);
+        Group newGroup = new Group(gid, null, name);
+        store = getAnnotationStore();
+        Actor storedGroup = store.storeActor(newGroup);
+        gid = storedGroup.getId();
+        // return 303: see other
+        setStatus(Status.REDIRECTION_SEE_OTHER);
+        // go GET URL for this group
+        Reference groupUrl = this.getReference();
+        groupUrl.addSegment(gid);
+        this.getResponse().setLocationRef(groupUrl);
+        return null;
+    }
+
+    /**
+     * Returns a group id based on the given id.
+     * 
+     * @param id
+     * @return
+     */
+    protected String makeGroupId(String id) {
+        // TODO: should we use different ids?
+        id = id.replaceAll("\\W", "_");
+        id = id.toLowerCase();
+        return id;
     }
 
Index: src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotationStoreRestlet.java
===================================================================
--- src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotationStoreRestlet.java	(revision 18)
+++ src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotationStoreRestlet.java	(revision 22)
@@ -36,4 +36,5 @@
 
         router.attach("/groups", AnnotationStoreGroups.class);
+        router.attach("/groups/", AnnotationStoreGroups.class);
         router.attach("/groups/{id}", AnnotationStoreGroups.class);
 
Index: src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorAnnotations.java
===================================================================
--- src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorAnnotations.java	(revision 20)
+++ src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorAnnotations.java	(revision 22)
@@ -49,5 +49,9 @@
         logger.debug("annotation-id=" + id);
 
-        // TODO: what to return without id - list of all annotations?
+        if (id == null) {
+            // TODO: what to return without id - list all annotations?
+            setStatus(Status.CLIENT_ERROR_BAD_REQUEST);
+            return null;
+        }
 
         // do authentication
Index: src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorResourceImpl.java
===================================================================
--- src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorResourceImpl.java	(revision 19)
+++ src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorResourceImpl.java	(revision 22)
@@ -66,4 +66,5 @@
 
     public String encodeJsonId(String id) {
+        if (id == null) return null;
         try {
             return Base64.encodeBase64URLSafeString(id.getBytes("UTF-8"));
@@ -74,4 +75,5 @@
 
     public String decodeJsonId(String id) {
+        if (id == null) return null;
         try {
             return new String(Base64.decodeBase64(id), "UTF-8");
Index: src/main/java/de/mpiwg/itgroup/annotations/restlet/BaseRestlet.java
===================================================================
--- src/main/java/de/mpiwg/itgroup/annotations/restlet/BaseRestlet.java	(revision 19)
+++ src/main/java/de/mpiwg/itgroup/annotations/restlet/BaseRestlet.java	(revision 22)
@@ -135,4 +135,7 @@
                     logger.error("Unable to get resource " + dbFn);
                 }
+            } else {
+                // get existing AnnotationStore
+                store = (AnnotationStore) sc.getAttribute(ANNSTORE_KEY);
             }
             /*
