diff --git a/CHANGES b/CHANGES
index 2eddfc4..cfac631 100644
--- a/CHANGES
+++ b/CHANGES
@@ -8,6 +8,8 @@
 	- [bugfix] Queries with regular expressions in spanNext() are now
 	  correctly rewritten (diewald)
 	- [bugfix] Ignore foundry for orth layer (diewald)
+	- [feature] Support fields in meta (diewald)
+	- [sigh] Support more legacy APIs (diewald)
 
 0.47 2014-11-05
         - [feature] Support new index format with more metadata (diewald)
diff --git a/src/main/java/de/ids_mannheim/korap/KorapCollection.java b/src/main/java/de/ids_mannheim/korap/KorapCollection.java
index ff0ef24..5dcb81d 100644
--- a/src/main/java/de/ids_mannheim/korap/KorapCollection.java
+++ b/src/main/java/de/ids_mannheim/korap/KorapCollection.java
@@ -83,12 +83,32 @@
 	this.filter = new ArrayList<FilterOperation>(5);
     };
 
+    public void fromJSON (String jsonString) throws QueryException {
+	ObjectMapper mapper = new ObjectMapper();
+	try {
+	    this.fromJSON((JsonNode) mapper.readValue(jsonString, JsonNode.class));
+	}
+	catch (Exception e) {
+	    this.error = e.getMessage();
+	};
+    };
 
     public void fromJSON (JsonNode json) throws QueryException {
 	this.filter(new KorapFilter(json));
     };
 
 
+    public void fromJSONLegacy (String jsonString) throws QueryException {
+	ObjectMapper mapper = new ObjectMapper();
+	try {
+	    this.fromJSONLegacy((JsonNode) mapper.readValue(jsonString, JsonNode.class));
+	}
+	catch (Exception e) {
+	    this.error = e.getMessage();
+	};
+    };
+
+
     /**
      * Legacy API for collection filters.
      */
diff --git a/src/main/java/de/ids_mannheim/korap/KorapIndex.java b/src/main/java/de/ids_mannheim/korap/KorapIndex.java
index 7278877..7072d87 100644
--- a/src/main/java/de/ids_mannheim/korap/KorapIndex.java
+++ b/src/main/java/de/ids_mannheim/korap/KorapIndex.java
@@ -103,10 +103,6 @@
     private static ByteBuffer bb       = ByteBuffer.allocate(4),
 	                      bbOffset = ByteBuffer.allocate(8),
 	                      bbTerm   = ByteBuffer.allocate(16);
-    
-
-    private Set<String> fieldsToLoad;
-
     // Logger
     private final static Logger log = LoggerFactory.getLogger(KorapIndex.class);
 
@@ -145,24 +141,10 @@
     public KorapIndex (Directory directory) throws IOException {
 	this.directory = directory;
 
-	fieldsToLoad = new HashSet<String>(16);
-	fieldsToLoad.add("author");
-	fieldsToLoad.add("ID");
-	fieldsToLoad.add("textSigle");
-	fieldsToLoad.add("UID");
-	fieldsToLoad.add("title");
-	fieldsToLoad.add("subTitle");
-	fieldsToLoad.add("textClass");
-	fieldsToLoad.add("pubPlace");
-	fieldsToLoad.add("pubDate");
-	fieldsToLoad.add("corpusID");
-	fieldsToLoad.add("foundries");
-	fieldsToLoad.add("layerInfo");
-	fieldsToLoad.add("tokenization");
-
 	// Base analyzer for searching and indexing
 	// StandardAnalyzer analyzer = new StandardAnalyzer(Version.LUCENE_CURRENT);
 
+	// TODO: Why is this here?
 	Map<String,Analyzer> analyzerPerField = new HashMap<String,Analyzer>();
 	analyzerPerField.put("textClass", new WhitespaceAnalyzer(Version.LUCENE_CURRENT));
 	analyzerPerField.put("foundries", new WhitespaceAnalyzer(Version.LUCENE_CURRENT));
@@ -767,20 +749,22 @@
 		// We've found the correct document! Hurray!
 		if (DEBUG)
 		    log.trace("We've found a matching document");
-		HashSet<String> fieldsToLoadLocal = new HashSet<>(fieldsToLoad);
-		fieldsToLoadLocal.add(field);
+
+		HashSet<String> fields = (HashSet<String>)
+		    new KorapSearch().getFields().clone();
+		fields.add(field);
 
 		// Get terms from the document
 		Terms docTerms = atomic.reader().getTermVector(localDocID, field);
 
 		// Load the necessary fields of the document
-		Document doc = atomic.reader().document(localDocID, fieldsToLoadLocal);
+		Document doc = atomic.reader().document(localDocID, fields);
 
 		// Put some more information to the match
 		PositionsToOffset pto = new PositionsToOffset(atomic, field);
 		match.setPositionsToOffset(pto);
 		match.setLocalDocID(localDocID);
-		match.populateDocument(doc, field, fieldsToLoadLocal);
+		match.populateDocument(doc, field, fields);
 		if (DEBUG)
 		    log.trace("The document has the id '{}'", match.getDocID());
 
@@ -1086,8 +1070,8 @@
 	    kr.setVersion(this.getVersion());
 
 	// The following fields should be lifted for matches
-	HashSet<String> fieldsToLoadLocal = new HashSet<>(fieldsToLoad);
-	fieldsToLoadLocal.add(field);
+	HashSet<String> fields = (HashSet<String>) ks.getFields().clone();
+	fields.add(field);
 
 	// Some initializations ...
 	int i                       = 0,
@@ -1183,11 +1167,8 @@
 
 		    int docID = atomic.docBase + localDocID;
 
-		    // Document doc = lreader.document(docID, fieldsToLoadLocal);
-
-
 		    // Do not load all of this, in case the doc is the same!
-		    Document doc = lreader.document(localDocID, fieldsToLoadLocal);
+		    Document doc = lreader.document(localDocID, fields);
 		    KorapMatch match = kr.addMatch(
 		        pto,
 			localDocID,
@@ -1199,7 +1180,7 @@
 			match.addPayload((List<byte[]>) spans.getPayload());
 
 		    match.internalDocID = docID;
-		    match.populateDocument(doc, field, fieldsToLoadLocal);
+		    match.populateDocument(doc, field, fields);
 		    
 		    if (DEBUG) {
 			if (match.getDocID() != null)
@@ -1289,8 +1270,8 @@
 	long t1 = System.nanoTime();
 
 	// Only load UID
-	HashSet<String> fieldsToLoadLocal = new HashSet<>();
-	fieldsToLoadLocal.add("UID");
+	HashSet<String> fields = new HashSet<>(1);
+	fields.add("UID");
 
 	// List<KorapMatch> atomicMatches = new ArrayList<KorapMatch>(10);
 
@@ -1344,7 +1325,7 @@
 
 			// Read document id from index
 			uniqueDocIDString =
-			    lreader.document(localDocID, fieldsToLoadLocal).get("UID");
+			    lreader.document(localDocID, fields).get("UID");
 
 			if (uniqueDocIDString != null)
 			    uniqueDocID = Integer.parseInt(uniqueDocIDString);
diff --git a/src/main/java/de/ids_mannheim/korap/KorapSearch.java b/src/main/java/de/ids_mannheim/korap/KorapSearch.java
index b56a6d0..adb574c 100644
--- a/src/main/java/de/ids_mannheim/korap/KorapSearch.java
+++ b/src/main/java/de/ids_mannheim/korap/KorapSearch.java
@@ -47,6 +47,25 @@
 
     {
 	context  = new SearchContext();
+
+	// Lift legacy fields per default
+	fields = new HashSet<String>(16);
+	for (String field : new String[]{
+		"ID",
+		"UID",
+		"textSigle",
+		"corpusID",
+		"author",
+		"title",
+		"subTitle",
+		"textClass",
+		"pubPlace",
+		"pubDate",
+		"foundries",
+		"layerInfo",
+		"tokenization"}) {
+	    fields.add(field);
+	};
     };
 
     public KorapSearch (String jsonString) {
@@ -127,6 +146,22 @@
 		    // Defined resource count
 		    if (meta.has("itemsPerResource"))
 			this.setItemsPerResource(meta.get("itemsPerResource").asInt());
+
+		    // Only lift a limited amount of fields from the metadata
+		    if (meta.has("fields")) {
+
+			// Remove legacy default fields
+			this.fields.clear();
+
+			// Add fields
+			if (meta.get("fields").isArray()) {
+			    for (JsonNode field : (JsonNode) meta.get("fields")) {
+				this.addField(field.asText());
+			    };
+			}
+			else
+			    this.addField(meta.get("fields").asText());
+		    };
 		};
 	    };
 	}
@@ -284,11 +319,15 @@
 	return this.itemsPerResource;
     };
 
-    // Get map of fields to lift
+    // Add field to set of fields
+    public KorapSearch addField (String field) {
+	this.fields.add(field);
+	return this;
+    };
+
+    // Get set of fields
     public HashSet<String> getFields () {
-	if (this.fields != null)
-	    return this.fields;
-	return (HashSet<String>) null;
+	return this.fields;
     };
 
     public KorapSearch setCollection (KorapCollection kc) {
diff --git a/src/test/java/de/ids_mannheim/korap/search/TestMetaFields.java b/src/test/java/de/ids_mannheim/korap/search/TestMetaFields.java
new file mode 100644
index 0000000..0677fc1
--- /dev/null
+++ b/src/test/java/de/ids_mannheim/korap/search/TestMetaFields.java
@@ -0,0 +1,101 @@
+package de.ids_mannheim.korap.search;
+
+import java.util.*;
+import java.io.*;
+
+import static de.ids_mannheim.korap.TestSimple.*;
+
+import de.ids_mannheim.korap.KorapSearch;
+import de.ids_mannheim.korap.KorapCollection;
+import de.ids_mannheim.korap.KorapQuery;
+import de.ids_mannheim.korap.KorapIndex;
+import de.ids_mannheim.korap.index.FieldDocument;
+import de.ids_mannheim.korap.index.SearchContext;
+import de.ids_mannheim.korap.KorapFilter;
+import de.ids_mannheim.korap.KorapResult;
+import java.nio.file.Files;
+import java.nio.file.FileSystem;
+import java.nio.file.Path;
+import java.nio.charset.StandardCharsets;
+import java.nio.ByteBuffer;
+
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.JsonNode;
+
+import static org.junit.Assert.*;
+import org.junit.Test;
+import org.junit.Ignore;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+@RunWith(JUnit4.class)
+public class TestMetaFields {
+
+    @Test
+    public void searchMetaFields () throws IOException {
+
+	// Construct index
+	KorapIndex ki = new KorapIndex();
+	// Indexing test files
+	for (String i : new String[] {"00001",
+				      "00002"}) {
+	    ki.addDocFile(
+	        getClass().getResource("/wiki/" + i + ".json.gz").getFile(), true
+            );
+	};
+	ki.commit();
+
+	String json = getString(
+            getClass().getResource("/queries/metas/fields.jsonld").getFile()
+        );
+	
+	KorapSearch ks = new KorapSearch(json);
+	KorapResult kr = ks.run(ki);
+	assertEquals(17, kr.getTotalResults());
+	assertEquals(0, kr.getStartIndex());
+	assertEquals(9, kr.getItemsPerPage());
+
+	ObjectMapper mapper = new ObjectMapper();
+	JsonNode res = mapper.readTree(kr.toJSON());
+	assertEquals(0, res.at("/matches/0/UID").asInt());
+	assertEquals("WPD", res.at("/matches/0/corpusID").asText());
+	assertEquals("", res.at("/matches/0/docID").asText());
+	assertEquals("", res.at("/matches/0/textSigle").asText());
+	assertEquals("", res.at("/matches/0/ID").asText());
+	assertEquals("", res.at("/matches/0/author").asText());
+	assertEquals("", res.at("/matches/0/title").asText());
+	assertEquals("", res.at("/matches/0/subTitle").asText());
+	assertEquals("", res.at("/matches/0/textClass").asText());
+	assertEquals("", res.at("/matches/0/pubPlace").asText());
+	assertEquals("", res.at("/matches/0/pubDate").asText());
+	assertEquals("", res.at("/matches/0/foundries").asText());
+	assertEquals("", res.at("/matches/0/layerInfo").asText());
+	assertEquals("", res.at("/matches/0/tokenization").asText());
+
+	json = getString(
+            getClass().getResource("/queries/metas/fields_2.jsonld").getFile()
+        );
+	ks = new KorapSearch(json);
+	kr = ks.run(ki);
+	assertEquals(17, kr.getTotalResults());
+	assertEquals(0, kr.getStartIndex());
+	assertEquals(2, kr.getItemsPerPage());
+	
+	mapper = new ObjectMapper();
+	res = mapper.readTree(kr.toJSON());
+	assertEquals(0, res.at("/matches/0/UID").asInt());
+	assertEquals("", res.at("/matches/0/corpusID").asText());
+	assertEquals("Ruru,Jens.Ol,Aglarech", res.at("/matches/0/author").asText());
+	assertEquals("A", res.at("/matches/0/title").asText());
+	assertEquals("WPD_AAA.00001", res.at("/matches/0/docID").asText());
+	assertEquals("", res.at("/matches/0/textSigle").asText());
+	assertEquals("match-WPD_AAA.00001-p6-7", res.at("/matches/0/ID").asText());
+	assertEquals("", res.at("/matches/0/subTitle").asText());
+	assertEquals("", res.at("/matches/0/textClass").asText());
+	assertEquals("", res.at("/matches/0/pubPlace").asText());
+	assertEquals("", res.at("/matches/0/pubDate").asText());
+	assertEquals("", res.at("/matches/0/foundries").asText());
+	assertEquals("", res.at("/matches/0/layerInfo").asText());
+	assertEquals("", res.at("/matches/0/tokenization").asText());
+    };
+};
diff --git a/src/test/resources/queries/metas/fields.jsonld b/src/test/resources/queries/metas/fields.jsonld
new file mode 100644
index 0000000..42966ac
--- /dev/null
+++ b/src/test/resources/queries/metas/fields.jsonld
@@ -0,0 +1,30 @@
+{
+  "@context" : "http://ids-mannheim.de/ns/KorAP/json-ld/v0.2/context.jsonld",
+  "announcements" : [],
+  "collections" : [
+    {
+      "@type" : "korap:meta-filter",
+      "@value" : {
+        "@field" : "korap:field#corpusID",
+        "@type" : "korap:term",
+        "@value" : "WPD"
+      }
+    }
+  ],
+  "errors" : [],
+  "meta" : {
+    "fields":["UID","corpusID"],
+    "count":9
+  },
+  "query" : {
+    "@type" : "korap:token",
+    "wrap" : {
+      "@type" : "korap:term",
+      "key" : "Buchstabe",
+      "foundry" : "tt",
+      "layer" : "lemma",
+      "match" : "match:eq"
+    }
+  },
+  "warnings" : []
+}
diff --git a/src/test/resources/queries/metas/fields_2.jsonld b/src/test/resources/queries/metas/fields_2.jsonld
new file mode 100644
index 0000000..c141962
--- /dev/null
+++ b/src/test/resources/queries/metas/fields_2.jsonld
@@ -0,0 +1,30 @@
+{
+  "@context" : "http://ids-mannheim.de/ns/KorAP/json-ld/v0.2/context.jsonld",
+  "announcements" : [],
+  "collections" : [
+    {
+      "@type" : "korap:meta-filter",
+      "@value" : {
+        "@field" : "korap:field#corpusID",
+        "@type" : "korap:term",
+        "@value" : "WPD"
+      }
+    }
+  ],
+  "errors" : [],
+  "meta" : {
+    "fields":["ID","docID","author", "title", "subTitle"],
+    "count":2
+  },
+  "query" : {
+    "@type" : "korap:token",
+    "wrap" : {
+      "@type" : "korap:term",
+      "key" : "Buchstabe",
+      "foundry" : "tt",
+      "layer" : "lemma",
+      "match" : "match:eq"
+    }
+  },
+  "warnings" : []
+}
