diff --git a/src/mapfile.py b/src/mapfile.py
index 702f4396ada5ccb4603676566d891b6d6ec6d6e4..ce71b7c950f6547077e26c0a52a201af6d79dbf9 100644
--- a/src/mapfile.py
+++ b/src/mapfile.py
@@ -128,8 +128,6 @@ class Layer(MetadataMixin):
         # we need to rename it to something we are sure is not used.
         sld_layer_name = "__mra_tmp_template"
 
-        print new_sld
-
         # This is realy ugly but etree has trouble with namespaces...
         # TODO: Do this again in an other way.
         fixedxml = re.sub(' [a-zzA-Z0-9]+:([a-zA-Z0-9]+=")', ' \\1', new_sld)
@@ -231,8 +229,8 @@ class LayerGroup(object):
         extent = layers[0].get_extent()
         for layer in layers[1:]:
             e = layer.get_extent()
-            extent.addX(e.minX, e.maxX)
-            extent.addY(e.minY, e.maxY)
+            extent.addX(e.minX(), e.maxX())
+            extent.addY(e.minY(), e.maxY())
 
         return extent
 
diff --git a/src/server.py b/src/server.py
index 9fb012511dc74a13fe15a13ed46926c49c8b4bc5..4c0a0da06273d99b703eb506a6f293cde1268d9b 100755
--- a/src/server.py
+++ b/src/server.py
@@ -860,6 +860,9 @@ class layergroup(object):
             raise webapp.Forbidden("Can't change the name of a layergroup.")
 
         layers = data.pop("layers", [])
+        if not isinstance(layers, list) or any(not isinstance(x, basestring) for x in layers):
+            raise webapp.BadRequest("layers must be a list of layer names.")
+
         lg.clear()
         lg.add(*layers)
 
diff --git a/tests/testScenario.py b/tests/testScenario.py
index ce64d9e8735505db028cb0aaf30e1d6bb25ebd56..1fc4cd453f51fc3129df4543621254895eca9f19 100644
--- a/tests/testScenario.py
+++ b/tests/testScenario.py
@@ -302,26 +302,60 @@ def _test_layers(target, map_name):
     _, r = APIRequest("POST", target + "/maps/" + map_name + "/layers",
                       {"layer":{"name":name, "resource":{"href":c_link}}},
                       get_response=True)
-    ctl_link = r.getheader("Location").rsplit(".", 1)[0]
+    cl_link = r.getheader("Location").rsplit(".", 1)[0]
 
     # Check GET.
-    ctl = APIRequest("GET", ctl_link)["layer"]
-    assert ctl["name"] == name
-    assert ctl["type"] == "RASTER"
+    cl = APIRequest("GET", cl_link)["layer"]
+    assert cl["name"] == name
+    assert cl["type"] == "RASTER"
 
     # Check GET.
     layers = APIRequest("GET", target + "/maps/" + map_name + "/layers")["layers"]
     assert len(layers) == 2
 
     # check GET fields
-    fields = APIRequest("GET", ctl_link + "/fields")["fields"]
+    fields = APIRequest("GET", cl_link + "/fields")["fields"]
     assert len(fields) == 0
 
     # check GET layerstyles
-    fields = APIRequest("GET", ctl_link + "/styles")["styles"]
+    fields = APIRequest("GET", cl_link + "/styles")["styles"]
     assert len(fields) == 0
 
 
+    # Now lets try layer groups.
+
+    layers = APIRequest("GET", target + "/maps/" + map_name + "/layergroups")["layerGroups"]
+    assert len(layers) == 0
+
+    # POST an empty group
+    name = "test_group"
+    _, r = APIRequest("POST", target + "/maps/" + map_name + "/layergroups", {"layerGroup":{"name":name}}, get_response=True)
+    g_link = r.getheader("Location").rsplit(".", 1)[0]
+
+    # GET it.
+    group = APIRequest("GET", g_link)["layerGroup"]
+    assert group["name"] == name
+    assert len(group["layers"]) == 0
+
+    # PUT some new layers in it.
+    group["layers"] = [x["name"] for x in group["layers"]] + [ftl["name"]]
+    del group["bounds"]
+    APIRequest("PUT", g_link, {"layerGroup":group})
+
+    # GET it.
+    group = APIRequest("GET", g_link)["layerGroup"]
+    assert len(group["layers"]) == 1
+
+    # PUT some new layers in it.
+    group["layers"] = [x["name"] for x in group["layers"]] + [cl["name"]]
+    del group["bounds"]
+    APIRequest("PUT", g_link, {"layerGroup":group})
+
+    # GET it.
+    group = APIRequest("GET", g_link)["layerGroup"]
+    assert len(group["layers"]) == 2
+
+
 def test_scenario():
 
     target = "http://localhost:8080"