diff --git a/Changes b/Changes
index 71ce573..6b8d71c 100644
--- a/Changes
+++ b/Changes
@@ -1,6 +1,7 @@
 # version 1.1-SNAPSHOT
 - Change VC and query names to lowercase
 - Implemented pipe response rewriting for match info API (#814)
+- Add pipe response for the metadata web-service.
 
 # version 1.0.1
 
diff --git a/src/main/java/de/ids_mannheim/korap/core/service/SearchService.java b/src/main/java/de/ids_mannheim/korap/core/service/SearchService.java
index a139a4d..b2857f2 100644
--- a/src/main/java/de/ids_mannheim/korap/core/service/SearchService.java
+++ b/src/main/java/de/ids_mannheim/korap/core/service/SearchService.java
@@ -574,7 +574,8 @@
     }
 
     public String retrieveDocMetadata (String corpusId, String docId,
-            String textId, String fields, String username, HttpHeaders headers)
+            String textId, String fields, String username, HttpHeaders headers, 
+            String responsePipes)
             throws KustvaktException {
         List<String> fieldList = null;
         if (fields != null && !fields.isEmpty()) {
@@ -588,6 +589,8 @@
         String textSigle = searchKrill.getTextSigle(corpusId, docId, textId);
         String results = searchKrill.getFields(textSigle, fieldList, p);
         
+        results = runPipes(results, responsePipes);
+        
         return results;
     }
 
diff --git a/src/main/java/de/ids_mannheim/korap/core/web/controller/SearchController.java b/src/main/java/de/ids_mannheim/korap/core/web/controller/SearchController.java
index 6f40ba2..a5903f1 100644
--- a/src/main/java/de/ids_mannheim/korap/core/web/controller/SearchController.java
+++ b/src/main/java/de/ids_mannheim/korap/core/web/controller/SearchController.java
@@ -418,12 +418,14 @@
             @PathParam("docId") String docId,
             @PathParam("textId") String textId,
             @QueryParam("fields") String fields, 
+            @QueryParam("response-pipes") String responsePipes,
             @Context SecurityContext ctx,
             @Context HttpHeaders headers) throws KustvaktException {
         TokenContext tokenContext = (TokenContext) ctx.getUserPrincipal();
         try {
             String results = searchService.retrieveDocMetadata(corpusId, docId,
-                    textId, fields, tokenContext.getUsername(), headers);
+                    textId, fields, tokenContext.getUsername(), headers, 
+                    responsePipes);
             return Response.ok(results).build();
         }
         catch (KustvaktException e) {
diff --git a/src/test/java/de/ids_mannheim/korap/web/controller/SearchPipeTest.java b/src/test/java/de/ids_mannheim/korap/web/controller/SearchPipeTest.java
index 41fe378..0ffa391 100644
--- a/src/test/java/de/ids_mannheim/korap/web/controller/SearchPipeTest.java
+++ b/src/test/java/de/ids_mannheim/korap/web/controller/SearchPipeTest.java
@@ -46,6 +46,8 @@
     private String glemmUri = "http://localhost:" + port + "/glemm";
 	private String termMapperUri = "http://localhost:" + port
 			+ "/term-mapper?foundry=corenlp";
+	private String termMapperUri2 = "http://localhost:" + port
+			+ "/term-mapper?fields=@all";
 
     public SearchPipeTest () throws URISyntaxException, IOException {
         pipeJson = IOUtils.toString(
@@ -139,6 +141,40 @@
 				+ "\"corenlp/p:ADJA\">freie</span> <span title="
 				+ "\"corenlp/p:NN\">Weg</span>"));
 	}
+	
+	@Test
+	public void testRetrieveMetadataWithResponsePipe ()
+			throws KustvaktException {
+		
+		mockClient.reset()
+        .when(request().withMethod("POST")
+        		.withPath("/term-mapper")
+        		.withQueryStringParameter("fields", "@all")
+                .withHeaders(
+                        new Header("Content-Type",
+                                "application/json; charset=utf-8"),
+                        new Header("Accept", "application/json")))
+        .respond(response()
+                .withHeader(new Header("Content-Type",
+                        "application/json; charset=utf-8"))
+                .withBody(termMapperJson).withStatusCode(200));
+
+		Response response = target().path(API_VERSION).path("corpus")
+				.path("GOE").path("AGA").path("01784")
+				.queryParam("fields", "@all")
+				.queryParam("response-pipes", termMapperUri2)
+				.request().get();
+		assertEquals(Status.OK.getStatusCode(), response.getStatus());
+		String entity = response.readEntity(String.class);
+		JsonNode node = JsonUtils.readTree(entity);
+		
+		assertTrue(node.at("/snippet").asText().startsWith(
+				"<span class=\"context-left\"></span><span class=\"match\">"
+				+ "<span title=\"corenlp/p:ART\">der</span> <span title="
+				+ "\"corenlp/p:ADJA\">alte</span> <span title="
+				+ "\"corenlp/p:ADJA\">freie</span> <span title="
+				+ "\"corenlp/p:NN\">Weg</span>"));
+	}
     
     @Test
     public void testSearchWithPipes ()
