diff --git a/src/main/java/de/ids_mannheim/korap/sru/KorapClient.java b/src/main/java/de/ids_mannheim/korap/sru/KorapClient.java
index 01c3b2b..db71ddb 100644
--- a/src/main/java/de/ids_mannheim/korap/sru/KorapClient.java
+++ b/src/main/java/de/ids_mannheim/korap/sru/KorapClient.java
@@ -162,7 +162,7 @@
         HttpUriRequest httpRequest = null;
         try {
             httpRequest = createSearchRequest(query, queryLanguage, version,
-                    startRecord - 1, maximumRecords);
+                    startRecord - 1, maximumRecords, corpora);
         }
         catch (URISyntaxException e) {
             throw new IOException("Failed creating http request.");
@@ -172,6 +172,8 @@
         KorapResult result = null;
         try {
             response = sendRequest(httpRequest);
+//            logger.info(response.toString());
+            
             BufferedInputStream jsonStream =
                     new BufferedInputStream(response.getEntity().getContent());
             try {
@@ -256,12 +258,13 @@
      *            the starting number of records/matches to return
      * @param maximumRecords
      *            the number of maximum records to return
+     * @param corpora 
      * @return a HttpGet request
      * @throws URISyntaxException
      */
     private HttpGet createSearchRequest (String query,
             QueryLanguage queryLanguage, String version, int startRecord,
-            int maximumRecords) throws URISyntaxException {
+            int maximumRecords, String[] corpora) throws URISyntaxException {
 
         if (maximumRecords <= 0) {
             maximumRecords = defaultNumOfRecords;
@@ -271,10 +274,24 @@
                     defaultMaxRecords);
             maximumRecords = defaultMaxRecords;
         }
+        
+        String corpusQuery = "";
+        int length = corpora.length;
+        if (corpora != null && length > 0){
+            for (int i=0; i<length; i++){
+                corpusQuery += "corpusSigle="+corpora[i];
+                if (i != length-1){
+                    corpusQuery += "|";
+                }
+            }
+        }
 
         List<NameValuePair> params = new ArrayList<NameValuePair>();
         params.add(new BasicNameValuePair("q", query));
         params.add(new BasicNameValuePair("ql", queryLanguage.toString()));
+        if (!corpusQuery.isEmpty()){
+            params.add(new BasicNameValuePair("cq", corpusQuery));
+        }
         params.add(new BasicNameValuePair("v", version));
         params.add(new BasicNameValuePair("context", DEFAULT_CONTEXT_TYPE));
         params.add(new BasicNameValuePair("count",
@@ -359,6 +376,7 @@
                         + "</snippet>";
             }
             catch (IOException e) {
+                logger.error(e.getMessage());
                 throw new IOException(
                         "Failed processing response from KorAP match info API.");
             }
diff --git a/src/main/java/de/ids_mannheim/korap/sru/KorapSRU.java b/src/main/java/de/ids_mannheim/korap/sru/KorapSRU.java
index e7271a5..f115436 100644
--- a/src/main/java/de/ids_mannheim/korap/sru/KorapSRU.java
+++ b/src/main/java/de/ids_mannheim/korap/sru/KorapSRU.java
@@ -88,7 +88,7 @@
             throw new SRUException(SRUConstants.SRU_UNSUPPORTED_PARAMETER_VALUE, 
                     "Query type "+ queryType+ " is not supported.");
         }
-        logger.info("Query language: " + queryType);
+//        logger.info("Query language: " + queryType);
         
         SRUVersion sruVersion = request.getVersion();
         // EM: actually not necessary because query type is only available in SRU 2.0
@@ -104,13 +104,13 @@
             throw new SRUException(SRUConstants.SRU_EMPTY_TERM_UNSUPPORTED,
                     "Empty term is not supported.");
         }
-        logger.info("korapsru query: " + queryStr);
+//        logger.info("korapsru query: " + queryStr);
 
         KorapResult korapResult = sendQuery(queryStr, request, version,
                 queryLanguage);
         checkKorapResultError(korapResult, queryLanguage,
                 isRewitesAllowed(request), diagnostics);
-        logger.info("Number of records: "+korapResult.getTotalResults());
+//        logger.info("Number of records: "+korapResult.getTotalResults());
 
         return new KorapSRUSearchResultSet(korapClient, diagnostics, korapResult, dataviews,
                 korapEndpointDescription.getTextLayer(),
@@ -335,6 +335,7 @@
     private String[] getCorporaList(SRURequest request) {
         try {
             String corpusPids = request.getExtraRequestData("x-fcs-context");
+//            logger.info("x-fcs-context: "+corpusPids);
             if (!corpusPids.isEmpty() && corpusPids != null) {
                 if (corpusPids.contains(",")) {
                     return corpusPids.split(",");
diff --git a/src/test/java/de/ids_mannheim/korap/test/KorapSRUTest.java b/src/test/java/de/ids_mannheim/korap/test/KorapSRUTest.java
index 96e870b..042851c 100644
--- a/src/test/java/de/ids_mannheim/korap/test/KorapSRUTest.java
+++ b/src/test/java/de/ids_mannheim/korap/test/KorapSRUTest.java
@@ -116,6 +116,22 @@
 //		assertEquals(50, node.getChildNodes().getLength());
 	}
 	
+	
+	@Test
+    public void searchRetrieveWithResourceId() throws IOException, URISyntaxException, IllegalStateException, SAXException{
+        HttpClient httpclient = HttpClients.createDefault();
+        URIBuilder builder = new URIBuilder();
+        builder.setScheme("http").setHost(host).setPort(port).setPath("/KorapSRU")
+                .setParameter("operation", "searchRetrieve")
+                .setParameter("query", "fein")
+                .setParameter("x-fcs-context", "GOE");
+        
+        URI uri = builder.build();
+        HttpGet request = new HttpGet(uri);
+        HttpResponse response = httpclient.execute(request);
+        checkSRUSearchRetrieveResponse(response);
+    } 
+	
 	@Test
 	public void explainTest() throws URISyntaxException, ClientProtocolException, IOException, IllegalStateException, SAXException{
 		HttpClient httpclient = HttpClients.createDefault();
