diff --git a/pom.xml b/pom.xml
index 4555176..399261a 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
   <groupId>de.mannheim.ids</groupId>
   <artifactId>SRU-WS</artifactId>
   <packaging>war</packaging>
-  <version>0.0.1-SNAPSHOT</version>
+  <version>1.0.1-SNAPSHOT</version>
   <name>SRU-WS Maven Webapp</name>
   <url>http://maven.apache.org</url>  
   
diff --git a/src/main/java/de/mannheim/ids/sruws/SRU_WS.java b/src/main/java/de/mannheim/ids/sruws/SRU_WS.java
index a58e14c..88e45bf 100644
--- a/src/main/java/de/mannheim/ids/sruws/SRU_WS.java
+++ b/src/main/java/de/mannheim/ids/sruws/SRU_WS.java
@@ -9,7 +9,6 @@
 import java.net.URISyntaxException;
 import java.net.URLDecoder;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -70,6 +69,7 @@
 	private static final String HITS_NS = "http://clarin.eu/fcs/dataview/hits";
     private static final String HITS_PREFIX = "hits";    
     private static final String FCS_NS = "http://clarin.eu/fcs/1.0";
+	private static final String FCS_RESOURCE = "http://clarin.eu/fcs/resource";
     private static final String FCS_PREFIX = "fcs";    
     //private static final String FCS_KWIC_NS = "http://clarin.eu/fcs/1.0/kwic";
     //private static final String FCS_KWIC_PREFIX = "kwic";
@@ -100,13 +100,14 @@
 	@POST
 	@Produces(MediaType.TEXT_XML)
 	@Consumes("text/query-cql")
-	public StreamingOutput doPost(@QueryParam("query") String query, 
-			@QueryParam("endpoint") String endpoint, 
-			@QueryParam("maximumRecords") int maximumRecords) throws IOException, ServletException{
-		
-		return process(endpoint, query,  maximumRecords);				
+	public StreamingOutput doPost(String query,
+			@QueryParam("endpoint") String endpoint,
+			@QueryParam("maximumRecords") int maximumRecords)
+			throws IOException, ServletException {
+
+		return process(endpoint, query, maximumRecords);
 	}
-	
+
 	private StreamingOutput process(String endpoint, String query, int max) 
 			throws IOException, ServletException {		
 		
@@ -131,11 +132,11 @@
 					
 		if (max==0) max = DEFAULT_MAX_RECORDS;
 		
-		endpointUri = config.getInitParameter(endpointBase+endpoint);
-		logger.info("Endpoint URL {} ",endpointUri);
+		endpointUri = config.getInitParameter(endpointBase + endpoint);
+		// logger.info("Endpoint URL {} ",endpointUri);
 		
 		generateCorpusList();
-		logger.info(query.toString());
+		// logger.info(query.toString());
 		
 		HttpGet getReq = createSearchRetrieveRequest(query, max);			
 		CloseableHttpClient httpClient = HttpClients.createDefault();
@@ -146,6 +147,7 @@
 		String text;
 		try {
 			text = readKwicInput(bis);
+			// text = readKwicInput(bis);
 			//logger.info(text);
 		} catch (XMLStreamException e) {				
 			throw new ServletException("XML streaming error");
@@ -260,14 +262,27 @@
 			e = reader.next();
 			
 			if (e == XMLEvent.START_ELEMENT &&
+					reader.getLocalName().equals("Result")
+					&& reader.getPrefix().equals(HITS_PREFIX)
+					&& reader.getNamespaceURI().equals(HITS_NS)) {
+
+				sb = new StringBuilder();
+				reader.next();
+				sb.append(reader.getText());
+				sb.append(" "); // left context
+			}
+			else if (e == XMLEvent.START_ELEMENT
+					&&
 					reader.getLocalName().equals("Resource") &&
 					reader.getPrefix().equals(FCS_PREFIX) &&
-					reader.getNamespaceURI().equals(FCS_NS)){
+					(reader.getNamespaceURI().equals(FCS_NS)||
+							reader.getNamespaceURI().equals(FCS_RESOURCE)) ){
 				
 				for (int i=0; i<reader.getAttributeCount(); i++){
 					if (reader.getAttributeLocalName(i).equals("pid")){
 						String pid = reader.getAttributeValue(i);						
-						logger.info("Corpus: " + URLDecoder.decode(pid,"UTF-8"));						
+						// logger.info("Corpus: " +
+						// URLDecoder.decode(pid,"UTF-8"));
 						c = corpusList.get(URLDecoder.decode(pid,"UTF-8"));
 						if (c == null) c = defaultCorpus;
 					}					
@@ -288,10 +303,14 @@
 					e = reader.next();
 				}
 				sb.append(" ");
-			}				
+			}
 
 			else if (e == XMLEvent.START_ELEMENT &&
-					reader.getLocalName().equals("kw")){				
+					(reader.getLocalName().equals("kw") ||
+							(reader.getLocalName().equals("Hit")
+									&& reader.getPrefix().equals(HITS_PREFIX)
+									&& reader.getNamespaceURI().equals(HITS_NS))) 
+			 ){	
 				e = reader.next();
 				if (e == XMLEvent.CHARACTERS){
 					String keyword = reader.getText();
@@ -302,61 +321,20 @@
 			}
 			
 			else if (e == XMLEvent.END_ELEMENT && 
-					reader.getLocalName().equals("kwic")){
+					(reader.getLocalName().equals("kwic") || 
+					reader.getLocalName().equals("Hit"))
+				) {
 				
 				kwic = normalizeString(sb.toString());
 				Sentence s = createSentence(kwic);
 				c.addSentence(s);
-				//logger.info(kwic);
+				// logger.info(kwic);
 				kwicCollector.append(s.getSentenceString());				
 			}				
 		}
 		return kwicCollector.toString();
 	}	
 	
-	private String readInput(InputStream is, List<String[]> tokenizedSentences) 
-			throws XMLStreamException{
-		
-		String kwic;
-		StringBuilder sb;
-		StringBuilder kwicCollector = new StringBuilder();	
-		
-		XMLInputFactory f = XMLInputFactory.newInstance();
-		XMLStreamReader reader = f.createXMLStreamReader(is);
-		
-		while (reader.hasNext()) {			
-			if (reader.next() == XMLEvent.START_ELEMENT &&
-					reader.getLocalName().equals("Result") &&
-					reader.getPrefix().equals(HITS_PREFIX) &&
-					reader.getNamespaceURI().equals(HITS_NS)){
-					
-				sb = new StringBuilder();
-				
-				reader.next();					
-				sb.append(reader.getText());
-				sb.append(" "); // left context
-				
-				reader.next();
-				if (reader.getLocalName().equals("Hit") &&
-						reader.getPrefix().equals(HITS_PREFIX) &&
-						reader.getNamespaceURI().equals(HITS_NS)){
-					
-					reader.next();
-					sb.append(reader.getText());
-					sb.append(" ");
-				}
-				reader.next(); // end element Hit					
-				reader.next();
-				sb.append(reader.getText()); // right context
-				
-				kwic = normalizeString(sb.toString());
-				tokenizedSentences.add(kwic.split("\\s+"));
-				kwicCollector.append(kwic);
-			}			
-		}
-		return kwicCollector.toString();
-	}
-	
 	private Sentence createSentence(String kwic){
 		String[] tokens = kwic.split("\\s+");				
 		int open = ArrayUtils.indexOf(tokens,"#");
@@ -367,7 +345,7 @@
 		int[] keyIndexes = new int[close-open];
 		int j=0;
 		for (int i=open; i<close; i++){
-			//logger.info(i+" "+tokens[i]);
+			// logger.info(i + " " + tokens[i]);
 			keyIndexes[j] = i;
 			j++;
 		}
@@ -378,7 +356,6 @@
 			sb.append(" ");
 		}
 		String sentenceString = sb.toString();
-		
 		return new Sentence(sentenceString, tokens, keyIndexes);		
 	}
 	
@@ -415,6 +392,7 @@
 			builder.setParameter("startRecord", "1");
 			builder.setParameter("maximumRecords", String.valueOf(maximumRecords));
 			URI requestURI = builder.build();
+			logger.info(requestURI.toString());
 			return new HttpGet(requestURI);
 		}
 		catch (URISyntaxException e) {
diff --git a/src/main/webapp/WEB-INF/web.xml b/src/main/webapp/WEB-INF/web.xml
index d2235e6..e98c4eb 100644
--- a/src/main/webapp/WEB-INF/web.xml
+++ b/src/main/webapp/WEB-INF/web.xml
@@ -7,7 +7,6 @@
   
   <servlet>    
     <servlet-name>SRU_WS</servlet-name>        
-    <!-- <servlet-class>de.mannheim.ids.sruws.SRU_WS</servlet-class> -->
     <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class>
     <init-param>
       <param-name>com.sun.jersey.config.property.packages</param-name>
@@ -41,13 +40,13 @@
     </init-param>    			 
 
     
-    <!-- broken sentences -->
+    <!-- Other endpoints delivering broken sentences -->
     
     <!-- same case like goethe, pid is sub-resource  -->    
-    <!-- <init-param> 
+    <init-param> 
         <param-name>de.mannheim.ids.sruws.endpoint.muenchen</param-name>
         <param-value>https://clarin.phonetik.uni-muenchen.de/BASSRU/</param-value>
-    </init-param> -->
+    </init-param>
     
     <!-- weird pid -->
     <!-- <init-param>
@@ -67,6 +66,17 @@
         <param-value>http://fedora.clarin-d.uni-saarland.de/sru2/</param-value>
     </init-param> -->
     
+    <!-- <init-param>
+    	<param-name>de.mannheim.ids.sruws.endpoint.lindat</param-name>
+    	<param-value>http://lindat.mff.cuni.cz/services/fcs</param-value>
+    </init-param> -->
+      
+    <!-- Dutch -->
+    <!-- <init-param>
+    	<param-name>de.mannheim.ids.sruws.endpoint.dans</param-name>
+    	<param-value>http://srucql.dans.knaw.nl</param-value>
+    </init-param> -->
+       
     <load-on-startup>1</load-on-startup>
   </servlet>
   <servlet-mapping>
diff --git a/src/test/java/de/mannheim/ids/sruws/test/TestClient.java b/src/test/java/de/mannheim/ids/sruws/test/TestClient.java
index 45de13d..f5a995e 100644
--- a/src/test/java/de/mannheim/ids/sruws/test/TestClient.java
+++ b/src/test/java/de/mannheim/ids/sruws/test/TestClient.java
@@ -6,15 +6,21 @@
 import java.io.FileWriter;
 import java.io.IOException;
 import java.io.InputStreamReader;
+import java.nio.charset.Charset;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.apache.http.HttpEntity;
 import org.apache.http.HttpHeaders;
+import org.apache.http.HttpRequest;
 import org.apache.http.HttpResponse;
 import org.apache.http.NameValuePair;
 import org.apache.http.client.HttpClient;
 import org.apache.http.client.entity.UrlEncodedFormEntity;
 import org.apache.http.client.methods.HttpPost;
+import org.apache.http.entity.ByteArrayEntity;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.impl.client.HttpClientBuilder;
 import org.apache.http.impl.client.HttpClients;
 import org.apache.http.message.BasicNameValuePair;
 
@@ -22,19 +28,25 @@
 		
 	public static void main(String arg[]) throws IOException{
 		String url =
-				//"http://localhost:8080/SRU-WS/";
-				"http://clarin.ids-mannheim.de/sruws/";
+ "http://localhost:8080/SRU-WS/" +
+		// "http://clarin.ids-mannheim.de/fcsws" +
+			    "?maximumRecords=10&endpoint=korap";
 		
-		HttpClient client = HttpClients.createDefault();
+		HttpClient client = HttpClientBuilder.create().build();
 		HttpPost post = new HttpPost(url);		
-		post.setHeader(HttpHeaders.ACCEPT,"text/query-cql");		
+		post.setHeader(HttpHeaders.CONTENT_TYPE, "text/query-cql");
 		
-		List<NameValuePair> urlParameters = new ArrayList<NameValuePair>();
-		urlParameters.add(new BasicNameValuePair("query", "Baden-Württemberg"));
-		urlParameters.add(new BasicNameValuePair("maximumRecords", "5"));
-		urlParameters.add(new BasicNameValuePair("endpoint", "korap")); 
-		post.setEntity(new UrlEncodedFormEntity(urlParameters));
-				
+		// List<NameValuePair> urlParameters = new ArrayList<NameValuePair>();
+		// urlParameters.add(new BasicNameValuePair("query",
+		// "Baden-Württemberg"));
+		// urlParameters.add(new BasicNameValuePair("maximumRecords", "5"));
+		// urlParameters.add(new BasicNameValuePair("endpoint", "korap"));
+		// post.setEntity(new UrlEncodedFormEntity(urlParameters));
+
+		String query = "Baden-Württemberg";
+		HttpEntity entity = new StringEntity(query, Charset.defaultCharset());
+		post.setEntity(entity);
+
 		HttpResponse response = client.execute(post);
 		System.out.println("Sending 'POST' request to URL : " + url);
 		System.out.println("Post parameters : " + post.getEntity());
@@ -45,15 +57,15 @@
 					response.getStatusLine().getReasonPhrase());
 		}
 				
-		FileWriter fw = new FileWriter(new File("test.xml"));
+		// FileWriter fw = new FileWriter(new File("test.xml"));
 		
 		BufferedReader reader = new BufferedReader(new InputStreamReader(
 				response.getEntity().getContent()));
 		String line;
 		while ((line = reader.readLine()) != null){
-			//System.out.println(line);
-			fw.append(line+"\n");
+			System.out.println(line);
+			// fw.append(line+"\n");
 		}
-		fw.close();
+		// fw.close();
 	}	
 }
