Index: src/main/java/de/mpiwg/itgroup/annotations/Annotation.java
===================================================================
--- src/main/java/de/mpiwg/itgroup/annotations/Annotation.java	(revision 76)
+++ src/main/java/de/mpiwg/itgroup/annotations/Annotation.java	(revision 84)
@@ -68,5 +68,5 @@
      */
     public static enum FragmentTypes {
-        XPOINTER, AREA
+        XPOINTER, AREA, WKT
     };
     
Index: src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorResourceImpl.java
===================================================================
--- src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorResourceImpl.java	(revision 76)
+++ src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorResourceImpl.java	(revision 84)
@@ -272,4 +272,6 @@
                 } else if (xt == FragmentTypes.AREA) {
                     jo.put("shapes", transformToShapes(fragments));
+                } else if (xt == FragmentTypes.WKT) {
+                    jo.put("shapes", transformToShapes(fragments));
                 }
             }
@@ -376,17 +378,19 @@
     }
 
-    private JSONArray transformToShapes(List<String> xpointers) {
+    private JSONArray transformToShapes(List<String> fragments) {
         JSONArray ja = new JSONArray();
-        Pattern rg = Pattern.compile("xywh=(\\w*):([\\d\\.]+),([\\d\\.]+),([\\d\\.]+),([\\d\\.]+)");
-        try {
-            for (String xpointer : xpointers) {
-                String decoded = xpointer;
-                Matcher m = rg.matcher(decoded);
-                if (m.find()) {
-                    String units = m.group(1);
-                    float x = getFloat(m.group(2));
-                    float y = getFloat(m.group(3));
-                    float width = getFloat(m.group(4));
-                    float height = getFloat(m.group(5));
+        Pattern xywhPattern = Pattern.compile("xywh=(\\w*):([\\d\\.]+),([\\d\\.]+),([\\d\\.]+),([\\d\\.]+)");
+        Pattern wktPattern = Pattern.compile("wkt=(\\w+)\\(+([\\d\\.\\,\\ ]+)\\)+");
+        try {
+            for (String fragment : fragments) {
+                Matcher xywhMatch = xywhPattern.matcher(fragment);
+                Matcher wktMatch = wktPattern.matcher(fragment);
+                if (xywhMatch.find()) {
+                	// xywh rectangle fragment
+                    String units = xywhMatch.group(1);
+                    float x = getFloat(xywhMatch.group(2));
+                    float y = getFloat(xywhMatch.group(3));
+                    float width = getFloat(xywhMatch.group(4));
+                    float height = getFloat(xywhMatch.group(5));
                     JSONObject shape = new JSONObject();
                     JSONObject geom = new JSONObject();
@@ -404,4 +408,22 @@
                     }
                     ja.put(shape);
+                } else if (wktMatch.find()) {
+                	// wkt shape fragment
+                	String type = wktMatch.group(1);
+                	String coordString = wktMatch.group(2);
+                    JSONObject shape = new JSONObject();
+                    JSONObject geom = new JSONObject();
+                    shape.put("type", type.toLowerCase());
+                    // TODO: add units/crs to fragment?
+                    geom.put("units", "fraction");
+                    JSONArray coords = new JSONArray();
+                    String[] coordPairs = coordString.split(", *");
+                    for (String coordPairString : coordPairs) {
+                    	String[] coordPair = coordPairString.split(" +");
+                    	coords.put(new JSONArray(coordPair));
+                    }
+                    geom.put("coordinates", coords);
+                	shape.put("geometry", geom);
+                	ja.put(shape);
                 }
             }
@@ -417,8 +439,10 @@
         JSONObject geom = shape.getJSONObject("geometry");
         if (type.equalsIgnoreCase("point")) {
+        	// point shape
             String x = geom.getString("x");
             String y = geom.getString("y");
             fragment = String.format("xywh=fraction:%s,%s,0,0", x, y);
         } else if (type.equalsIgnoreCase("rectangle")) {
+        	// rectangle shape
             String x = geom.getString("x");
             String y = geom.getString("y");
@@ -426,4 +450,20 @@
             String height = geom.getString("height");
             fragment = String.format("xywh=fraction:%s,%s,%s,%s", x, y, width, height);
+        } else if (type.equalsIgnoreCase("polygon")) {
+        	// polygon shape
+        	JSONArray coordArray = geom.getJSONArray("coordinates");
+            StringBuilder coords = new StringBuilder();
+            int numCoords = coordArray.length();
+        	for (int i = 0; i < numCoords; ++i) {
+        		JSONArray coordPair = coordArray.getJSONArray(i);
+        		coords.append(coordPair.getString(0));
+        		coords.append(" ");
+        		coords.append(coordPair.getString(1));
+        		if (i < numCoords-1) {
+        			coords.append(", ");
+        		}
+        	}
+        	// TODO: add units/crs to wkt
+            fragment = String.format("wkt=POLYGON((%s))", coords);
         } else {
             logger.severe("Unable to parse this shape: " + shape);
@@ -614,7 +654,11 @@
                 if (shapes.length() > 0) {
                     JSONObject shape = shapes.getJSONObject(0);
-                    annot.setFragmentType(FragmentTypes.AREA);
                     String fragment = parseShape(shape);
                     annot.setTargetFragment(fragment);
+                    if (fragment.startsWith("wkt=")) {
+                    	annot.setFragmentType(FragmentTypes.WKT);
+                    } else {
+                    	annot.setFragmentType(FragmentTypes.AREA);
+                    }
                 }
             }
