diff --git a/core/pom.xml b/core/pom.xml
index 47081e0..aff703d 100644
--- a/core/pom.xml
+++ b/core/pom.xml
@@ -279,8 +279,7 @@
 		<dependency>
 			<groupId>de.ids_mannheim.korap</groupId>
 			<artifactId>Krill</artifactId>
-			<!-- <version>[0.58.1,)</version> -->
-			<version>0.58.3</version>
+			<version>[0.58.3,)</version>
 			<exclusions>
 				<exclusion>
 					<groupId>org.xerial</groupId>
diff --git a/core/src/main/java/de/ids_mannheim/korap/authentication/AuthenticationManager.java b/core/src/main/java/de/ids_mannheim/korap/authentication/AuthenticationManager.java
index a56cc76..e782ea6 100644
--- a/core/src/main/java/de/ids_mannheim/korap/authentication/AuthenticationManager.java
+++ b/core/src/main/java/de/ids_mannheim/korap/authentication/AuthenticationManager.java
@@ -76,9 +76,6 @@
 
     public abstract void lockAccount (User user) throws KustvaktException;
 
-    public abstract User createUserAccount (Map<String, Object> attributes,
-            boolean confirmation_required) throws KustvaktException;
-
     public abstract boolean deleteAccount (User user) throws KustvaktException;
 
     public abstract <T extends Userdata> T getUserData (User user,
@@ -87,15 +84,6 @@
     public abstract void updateUserData (Userdata data)
             throws KustvaktException;
 
-    public abstract Object[] validateResetPasswordRequest (String username,
-            String email) throws KustvaktException;
-
-    public abstract void resetPassword (String uriFragment, String username,
-            String newPassphrase) throws KustvaktException;
-
-    public abstract void confirmRegistration (String uriFragment,
-            String username) throws KustvaktException;
-
     public String providerList () {
         return "provider list: " + this.providers.toString();
     }
diff --git a/core/src/main/java/de/ids_mannheim/korap/user/DataFactory.java b/core/src/main/java/de/ids_mannheim/korap/user/DataFactory.java
index 4b14b42..bb86cb2 100644
--- a/core/src/main/java/de/ids_mannheim/korap/user/DataFactory.java
+++ b/core/src/main/java/de/ids_mannheim/korap/user/DataFactory.java
@@ -1,16 +1,20 @@
 package de.ids_mannheim.korap.user;
 
+import java.io.IOException;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+
 import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.node.ArrayNode;
 import com.fasterxml.jackson.databind.node.ObjectNode;
-import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.exceptions.StatusCodes;
-import de.ids_mannheim.korap.interfaces.ValidatorIface;
-import de.ids_mannheim.korap.interfaces.db.UserDataDbIface;
-import de.ids_mannheim.korap.utils.JsonUtils;
 
-import java.io.IOException;
-import java.util.*;
+import de.ids_mannheim.korap.exceptions.KustvaktException;
+import de.ids_mannheim.korap.interfaces.ValidatorIface;
+import de.ids_mannheim.korap.utils.JsonUtils;
 
 /**
  * @author hanl
@@ -18,8 +22,6 @@
  */
 public abstract class DataFactory {
 
-    private static final Map<Class<? extends Userdata>, UserDataDbIface> instances = new HashMap<>();
-
     private static DataFactory factory;
 
 
diff --git a/full/src/main/java/de/ids_mannheim/korap/authentication/KustvaktAuthenticationManager.java b/full/src/main/java/de/ids_mannheim/korap/authentication/KustvaktAuthenticationManager.java
index e6bce21..fa2d380 100644
--- a/full/src/main/java/de/ids_mannheim/korap/authentication/KustvaktAuthenticationManager.java
+++ b/full/src/main/java/de/ids_mannheim/korap/authentication/KustvaktAuthenticationManager.java
@@ -621,165 +621,7 @@
 		entHandler.updateAccount(u);
 	}
 
-	public KorAPUser checkPasswordAllowance(KorAPUser user, String oldPassword, String newPassword)
-			throws KustvaktException {
-		String dbPassword = user.getPassword();
-
-		if (oldPassword.trim().equals(newPassword.trim())) {
-			// TODO: special error StatusCodes for this?
-			throw new WrappedException(new KustvaktException(user.getId(), StatusCodes.ILLEGAL_ARGUMENT),
-					StatusCodes.PASSWORD_RESET_FAILED, newPassword);
-		}
-
-		boolean check = crypto.checkHash(oldPassword, dbPassword);
-
-		if (!check)
-			throw new WrappedException(new KustvaktException(user.getId(), StatusCodes.BAD_CREDENTIALS),
-					StatusCodes.PASSWORD_RESET_FAILED);
-
-		try {
-			user.setPassword(crypto.secureHash(newPassword));
-		} catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
-			throw new WrappedException(
-					new KustvaktException(user.getId(), StatusCodes.ILLEGAL_ARGUMENT, "password invalid", newPassword),
-					StatusCodes.PASSWORD_RESET_FAILED, user.toString(), newPassword);
-		}
-		return user;
-	}
-
-	// fixme: use clientinfo for logging/auditing?! = from where did he access
-	// the reset function?
-	@Override
-	public void resetPassword(String uriFragment, String username, String newPassphrase) throws KustvaktException {
-		try {
-			validator.validateEntry(username, Attributes.USERNAME);
-			validator.validateEntry(newPassphrase, Attributes.PASSWORD);
-		} catch (KustvaktException e) {
-			jlog.error("Error: "+ e.string());
-			throw new WrappedException(
-					new KustvaktException(username, StatusCodes.ILLEGAL_ARGUMENT, "password invalid", newPassphrase),
-					StatusCodes.PASSWORD_RESET_FAILED, username, newPassphrase);
-		}
-
-		try {
-			newPassphrase = crypto.secureHash(newPassphrase);
-		} catch (NoSuchAlgorithmException | UnsupportedEncodingException e) {
-			jlog.error("Encoding/Algorithm Error", e);
-			throw new WrappedException(
-					new KustvaktException(username, StatusCodes.ILLEGAL_ARGUMENT, "password invalid", newPassphrase),
-					StatusCodes.PASSWORD_RESET_FAILED, username, uriFragment, newPassphrase);
-		}
-		int result = entHandler.resetPassphrase(username, uriFragment, newPassphrase);
-
-		if (result == 0)
-			throw new WrappedException(
-					new KustvaktException(username, StatusCodes.EXPIRED, "URI fragment expired", uriFragment),
-					StatusCodes.PASSWORD_RESET_FAILED, username, uriFragment);
-		else if (result == 1)
-			jlog.info("successfully reset password for user "+ username);
-	}
-
-	public void confirmRegistration(String uriFragment, String username) throws KustvaktException {
-		try {
-			validator.validateEntry(username, Attributes.USERNAME);
-		} catch (KustvaktException e) {
-			jlog.error("Error: "+ e.string());
-			throw new WrappedException(e, StatusCodes.ACCOUNT_CONFIRMATION_FAILED, username, uriFragment);
-		}
-		int r = entHandler.activateAccount(username, uriFragment);
-		if (r == 0) {
-			User user;
-			try {
-				user = entHandler.getAccount(username);
-			} catch (EmptyResultException e) {
-				throw new WrappedException(new KustvaktException(username, StatusCodes.BAD_CREDENTIALS),
-						StatusCodes.ACCOUNT_CONFIRMATION_FAILED, username, uriFragment);
-			}
-			entHandler.deleteAccount(user.getId());
-			throw new WrappedException(new KustvaktException(user.getId(), StatusCodes.EXPIRED),
-					StatusCodes.ACCOUNT_CONFIRMATION_FAILED, username, uriFragment);
-		} else if (r == 1)
-			jlog.info("successfully confirmed user registration for user "+ username);
-		// register successful audit!
-	}
-
-	/**
-	 * @param attributes
-	 * @return
-	 * @throws KustvaktException
-	 */
-	// fixme: remove clientinfo object (not needed), use json representation to
-	// get stuff
-	public User createUserAccount(Map<String, Object> attributes, boolean confirmation_required)
-			throws KustvaktException {
-		Map<String, Object> safeMap = validator.validateMap(attributes);
-
-		if (safeMap.get(Attributes.USERNAME) == null || ((String) safeMap.get(Attributes.USERNAME)).isEmpty())
-			throw new KustvaktException(StatusCodes.ILLEGAL_ARGUMENT, "username must be set", "username");
-		if (safeMap.get(Attributes.PASSWORD) == null || ((String) safeMap.get(Attributes.PASSWORD)).isEmpty())
-			throw new KustvaktException(safeMap.get(Attributes.USERNAME), StatusCodes.ILLEGAL_ARGUMENT,
-					"password must be set", "password");
-
-		String username = validator.validateEntry((String) safeMap.get(Attributes.USERNAME), Attributes.USERNAME);
-		String password = validator.validateEntry((String) safeMap.get(Attributes.PASSWORD), Attributes.PASSWORD);
-		String hash;
-		try {
-			hash = crypto.secureHash(password);
-		} catch (UnsupportedEncodingException | NoSuchAlgorithmException e) {
-			jlog.error("Encryption error", e);
-			throw new KustvaktException(StatusCodes.ILLEGAL_ARGUMENT);
-		}
-
-		KorAPUser user = User.UserFactory.getUser(username);
-		Object id = attributes.get(Attributes.ID);
-		if (id != null && id instanceof Integer)
-			user.setId((Integer) id);
-
-		user.setAccountLocked(confirmation_required);
-		if (confirmation_required) {
-			URIParam param = new URIParam(crypto.createToken(),
-					TimeUtils.plusSeconds(config.getTokenTTL()).getMillis());
-			user.addField(param);
-		}
-		user.setPassword(hash);
-
-//		String o = (String) attributes.get(Attributes.IS_ADMIN);
-//		boolean b = Boolean.parseBoolean(o);
-//		user.setSystemAdmin(b);
-
-		try {
-			UserDetails details = new UserDetails();
-			details.read(safeMap, true);
-
-			UserSettings settings = new UserSettings();
-			settings.read(safeMap, true);
-
-			jlog.info("Creating new user account for user "+ user.getUsername());
-			entHandler.createAccount(user);
-//			if (user.isSystemAdmin() && user instanceof KorAPUser) {
-//				adminDao.addAccount(user);
-//				user.setCorpusAccess(CorpusAccess.ALL);
-//			}
-			details.setUserId(user.getId());
-			settings.setUserId(user.getId());
-
-			UserDataDbIface dao = BeansFactory.getTypeFactory().getTypeInterfaceBean(userdatadaos, UserDetails.class);
-			// todo: remove this
-			assert dao != null;
-			dao.store(details);
-			dao = BeansFactory.getTypeFactory().getTypeInterfaceBean(userdatadaos, UserSettings.class);
-			assert dao != null;
-			dao.store(settings);
-		} catch (KustvaktException e) {
-			jlog.error("Error: "+ e.string());
-			throw new WrappedException(e, StatusCodes.CREATE_ACCOUNT_FAILED, user.toString());
-		}
-
-		auditing.audit(AuditRecord.serviceRecord(user.getUsername(), StatusCodes.CREATE_ACCOUNT_SUCCESSFUL));
-		return user;
-	}
-
-	// todo:
+		// todo:
 	private ShibbolethUser createShibbUserAccount(Map<String, Object> attributes) throws KustvaktException {
         if (DEBUG) {
             jlog.debug("creating shibboleth user account for user attr: "
@@ -903,45 +745,6 @@
 		return result;
 	}
 
-	public Object[] validateResetPasswordRequest(String username, String email) throws KustvaktException {
-		String uritoken;
-		validator.validateEntry(email, Attributes.EMAIL);
-		User ident;
-		try {
-			ident = entHandler.getAccount(username);
-			if (ident instanceof DemoUser)
-				// throw new
-				// NotAuthorizedException(StatusCodes.PERMISSION_DENIED,
-				// "password reset now allowed for DemoUser", "");
-				throw new WrappedException(username, StatusCodes.PASSWORD_RESET_FAILED, username);
-		} catch (EmptyResultException e) {
-			throw new WrappedException(
-					new KustvaktException(username, StatusCodes.ILLEGAL_ARGUMENT, "username not found", username),
-					StatusCodes.PASSWORD_RESET_FAILED, username);
-		}
-
-		Userdata data = this.getUserData(ident, UserDetails.class);
-		KorAPUser user = (KorAPUser) ident;
-
-		if (!email.equals(data.get(Attributes.EMAIL)))
-			// throw new NotAuthorizedException(StatusCodes.ILLEGAL_ARGUMENT,
-			// "invalid parameter: email", "email");
-			throw new WrappedException(
-					new KustvaktException(user.getId(), StatusCodes.ILLEGAL_ARGUMENT, "email invalid", email),
-					StatusCodes.PASSWORD_RESET_FAILED, email);
-		uritoken = crypto.encodeBase();
-		URIParam param = new URIParam(uritoken, TimeUtils.plusHours(24).getMillis());
-		user.addField(param);
-
-		try {
-			entHandler.updateAccount(user);
-		} catch (KustvaktException e) {
-			jlog.error("Error "+ e.string());
-			throw new WrappedException(e, StatusCodes.PASSWORD_RESET_FAILED);
-		}
-		return new Object[] { uritoken, TimeUtils.format(param.getUriExpiration()) };
-	}
-
 	// EM: not in the new DB
 	@Override
 	public <T extends Userdata> T getUserData(User user, Class<T> clazz) throws WrappedException {
diff --git a/full/src/main/java/de/ids_mannheim/korap/web/controller/UserController.java b/full/src/main/java/de/ids_mannheim/korap/web/controller/UserController.java
index d1cb539..216cad5 100644
--- a/full/src/main/java/de/ids_mannheim/korap/web/controller/UserController.java
+++ b/full/src/main/java/de/ids_mannheim/korap/web/controller/UserController.java
@@ -2,7 +2,6 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
@@ -13,17 +12,14 @@
 import javax.ws.rs.Consumes;
 import javax.ws.rs.DELETE;
 import javax.ws.rs.GET;
-import javax.ws.rs.HeaderParam;
 import javax.ws.rs.POST;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.Context;
-import javax.ws.rs.core.HttpHeaders;
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.SecurityContext;
-import javax.ws.rs.core.UriBuilder;
 import javax.ws.rs.core.UriInfo;
 
 import org.apache.logging.log4j.LogManager;
@@ -32,16 +28,12 @@
 import org.springframework.stereotype.Controller;
 
 import com.fasterxml.jackson.databind.JsonNode;
-import com.fasterxml.jackson.databind.node.ObjectNode;
-import com.sun.jersey.spi.container.ContainerRequest;
 import com.sun.jersey.spi.container.ResourceFilters;
 
 import de.ids_mannheim.korap.authentication.AuthenticationManager;
 import de.ids_mannheim.korap.config.Attributes;
 import de.ids_mannheim.korap.config.Scopes;
-import de.ids_mannheim.korap.config.URIParam;
 import de.ids_mannheim.korap.exceptions.KustvaktException;
-import de.ids_mannheim.korap.exceptions.StatusCodes;
 import de.ids_mannheim.korap.security.context.TokenContext;
 import de.ids_mannheim.korap.user.KorAPUser;
 import de.ids_mannheim.korap.user.User;
@@ -51,7 +43,6 @@
 import de.ids_mannheim.korap.user.Userdata;
 import de.ids_mannheim.korap.utils.JsonUtils;
 import de.ids_mannheim.korap.utils.StringUtils;
-import de.ids_mannheim.korap.utils.TimeUtils;
 import de.ids_mannheim.korap.web.KustvaktResponseHandler;
 import de.ids_mannheim.korap.web.filter.APIVersionFilter;
 import de.ids_mannheim.korap.web.filter.AuthenticationFilter;
@@ -59,14 +50,12 @@
 import de.ids_mannheim.korap.web.filter.DemoUserFilter;
 import de.ids_mannheim.korap.web.filter.PiwikFilter;
 
-/** Some of the APIs are not applicable due to changes in DB, 
- * i.e. users are not saved in the DB.
+/** 
  * 
  * @author hanl, margaretha
- * @lastUpdate 11/2017
  */
 @Controller
-@Path("v0.1/user")
+@Path("{version}/user")
 @Produces(MediaType.APPLICATION_JSON + ";charset=utf-8")
 @ResourceFilters({APIVersionFilter.class, PiwikFilter.class })
 public class UserController {
@@ -80,64 +69,7 @@
 
     private @Context UriInfo info;
 
-
-    // fixme: json contains password in clear text. Encrypt request?
-    // EM: no encryption is needed for communications over https. 
-    // It should not be necessary in IDS internal network. 
-
-    @Deprecated
-    // fixme: should also collect service exception, not just db exception!
-    @POST
-    @Path("register")
-    @Consumes(MediaType.APPLICATION_JSON)
-    public Response signUp (
-            @HeaderParam(ContainerRequest.USER_AGENT) String agent,
-            @HeaderParam(ContainerRequest.HOST) String host,
-            @Context Locale locale, Map values) {
-
-        values.put(Attributes.HOST, host);
-        values.put(Attributes.USER_AGENT, agent);
-        UriBuilder uriBuilder;
-        User user;
-        try {
-            uriBuilder = info.getBaseUriBuilder();
-            uriBuilder.path("user").path("confirm");
-            user = controller.createUserAccount(values, true);
-        }
-        catch (KustvaktException e) {
-            throw kustvaktResponseHandler.throwit(e);
-        }
-        URIParam uri = user.getField(URIParam.class);
-        if (uri.hasValues()) {
-            uriBuilder
-                    .queryParam(Attributes.QUERY_PARAM_URI,
-                            uri.getUriFragment())
-                    .queryParam(Attributes.QUERY_PARAM_USER,
-                            user.getUsername());
-            jlog.info("registration was successful for user "+
-                    user.getUsername());
-            Map<String, Object> object = new HashMap<String, Object>();
-            object.put("confirm_uri", uriBuilder.build());
-            object.put("uri_expiration",
-                    TimeUtils.format(uri.getUriExpiration()));
-            try {
-                return Response.ok(JsonUtils.toJSON(object)).build();
-            }
-            catch (KustvaktException e) {
-                throw kustvaktResponseHandler.throwit(e);
-            }
-        }
-        else {
-            jlog.error("Failed creating confirmation and expiry tokens.");
-            // EM: why illegal argument when uri fragment/param is self-generated 
-            throw kustvaktResponseHandler.throwit(StatusCodes.ILLEGAL_ARGUMENT,
-                    "failed to validate uri parameter",
-                    "confirmation fragment");
-        }
-
-    }
-
-    @Deprecated
+    // EM: may be used for managing shib users
     //todo: password update in special function? --> password reset only!
     @POST
     @Path("update")
@@ -162,107 +94,7 @@
         }
         return Response.ok().build();
     }
-
-    @Deprecated
-    @GET
-    @Path("confirm")
-    @Produces(MediaType.TEXT_HTML)
-    public Response confirmRegistration (@QueryParam("uri") String uritoken,
-            @Context Locale locale, @QueryParam("user") String username) {
-        if (uritoken == null || uritoken.isEmpty())
-            throw kustvaktResponseHandler.throwit(StatusCodes.ILLEGAL_ARGUMENT,
-                    "parameter missing", "uri parameter");
-        if (username == null || username.isEmpty())
-            throw kustvaktResponseHandler.throwit(StatusCodes.ILLEGAL_ARGUMENT,
-                    "parameter missing", "Username");
-
-        try {
-            controller.confirmRegistration(uritoken, username);
-        }
-        catch (KustvaktException e) {
-            e.printStackTrace();
-            throw kustvaktResponseHandler.throwit(e);
-        }
-        return Response.ok().build();
-    }
-
-    @Deprecated
-    // todo: auditing!
-    @POST
-    @Path("requestReset")
-    @Produces(MediaType.TEXT_HTML)
-    @Consumes({ MediaType.APPLICATION_JSON,
-            MediaType.APPLICATION_FORM_URLENCODED })
-    public Response requestPasswordReset (@Context Locale locale, String json) {
-        JsonNode node;
-        try {
-            node = JsonUtils.readTree(json);
-        }
-        catch (KustvaktException e1) {
-            throw kustvaktResponseHandler.throwit(e1);
-        }
-        StringBuilder builder = new StringBuilder();
-        String username, email;
-        username = node.path(Attributes.USERNAME).asText();
-        email = node.path(Attributes.EMAIL).asText();
-
-        // deprecated --> depends on the client!
-        //        String url = config.getMailProperties()
-        //                .getProperty("korap.frontend.url", "");
-        //        if (url.isEmpty())
-        //            return Response.ok("URLException: Missing source URL").build();
-
-        //        URIUtils utils = new URIUtils(info);
-        // may inject the actual REST url in a redirect request?!
-        //        UriBuilder uriBuilder = UriBuilder.fromUri(url).fragment("reset");
-        Object[] objects;
-        try {
-            builder.append("?");
-            // just append the endpint fragment plus the query parameter.
-            // the address by which the data is handled depends on the frontend
-            objects = controller.validateResetPasswordRequest(username, email);
-            builder.append(Attributes.QUERY_PARAM_URI).append("=")
-                    .append(objects[0]);
-            builder.append(Attributes.QUERY_PARAM_USER).append("=")
-                    .append(username);
-        }
-        catch (KustvaktException e) {
-            jlog.error("Eoxception encountered! "+ e.string());
-            throw kustvaktResponseHandler.throwit(e);
-        }
-
-        ObjectNode obj = JsonUtils.createObjectNode();
-        obj.put(Attributes.URI, builder.toString());
-        obj.put(Attributes.URI_EXPIRATION, objects[1].toString());
-        try {
-            return Response.ok(JsonUtils.toJSON(obj)).build();
-        }
-        catch (KustvaktException e) {
-            throw kustvaktResponseHandler.throwit(e);
-        }
-    }
-
-    @Deprecated
-    @POST
-    @Path("reset")
-    @Produces(MediaType.TEXT_HTML)
-    @Consumes({ MediaType.APPLICATION_JSON,
-            MediaType.APPLICATION_FORM_URLENCODED })
-    public Response resetPassword (
-            @QueryParam(Attributes.QUERY_PARAM_URI) String uri,
-            @QueryParam(Attributes.QUERY_PARAM_USER) String username,
-            @Context HttpHeaders headers, String passphrase) {
-        try {
-            controller.resetPassword(uri, username, passphrase);
-        }
-        catch (KustvaktException e) {
-            jlog.error("Exception encountered!", e);
-            return Response.notModified().build();
-        }
-        return Response.ok().build();
-    }
-
-
+    
     // todo: refactor and make something out of if --> needs to give some sort of feedback!
     @GET
     @Path("info")
@@ -346,7 +178,6 @@
         return Response.ok().build();
     }
 
-
     @GET
     @Path("details")
     @ResourceFilters({ AuthenticationFilter.class, DemoUserFilter.class,
@@ -372,6 +203,7 @@
     }
 
 
+    // EM: may be used for managing shib users
     @POST
     @Path("details")
     @Consumes({ MediaType.APPLICATION_JSON })
@@ -463,7 +295,7 @@
         }
     }
 
-    @Deprecated
+    // EM: may be used for managing shib users
     @DELETE
     @ResourceFilters({ AuthenticationFilter.class, PiwikFilter.class,
             BlockingFilter.class })
diff --git a/full/src/main/resources/default-config.xml b/full/src/main/resources/default-config.xml
index 2fbd0ae..d543d53 100644
--- a/full/src/main/resources/default-config.xml
+++ b/full/src/main/resources/default-config.xml
@@ -296,11 +296,6 @@
 		<ref bean="userdata_settings" />
 	</util:list>
 
-
-	<util:list id="kustvakt_resources"
-		value-type="de.ids_mannheim.korap.interfaces.db.ResourceOperationIface">
-	</util:list>
-
 	<!-- specify type for constructor argument -->
 	<bean id="authenticationManager"
 		class="de.ids_mannheim.korap.authentication.KustvaktAuthenticationManager">
diff --git a/full/src/test/java/de/ids_mannheim/korap/config/TestHelper.java b/full/src/test/java/de/ids_mannheim/korap/config/TestHelper.java
index 689ca7b..4a66f9c 100644
--- a/full/src/test/java/de/ids_mannheim/korap/config/TestHelper.java
+++ b/full/src/test/java/de/ids_mannheim/korap/config/TestHelper.java
@@ -99,15 +99,15 @@
         Map m = getUserCredentials();
         assertNotNull("userdatabase handler must not be null", dao);
 
-        try {
-            manager.createUserAccount(m, false);
-        }
-        catch (KustvaktException e) {
-            throw new RuntimeException(e);
-            /*// do nothing
-            jlog.error("Error: {}", e.string());
-            assertNotNull("Test user could not be set up", null);*/
-        }
+//        try {
+//            manager.createUserAccount(m, false);
+//        }
+//        catch (KustvaktException e) {
+//            throw new RuntimeException(e);
+//            /*// do nothing
+//            jlog.error("Error: {}", e.string());
+//            assertNotNull("Test user could not be set up", null);*/
+//        }
         assertNotEquals(0, dao.size());
         return this;
     }
diff --git a/full/src/test/resources/test-config.xml b/full/src/test/resources/test-config.xml
index 00361de..d597eb4 100644
--- a/full/src/test/resources/test-config.xml
+++ b/full/src/test/resources/test-config.xml
@@ -282,10 +282,6 @@
 		<ref bean="userdata_settings" />
 	</util:list>
 
-	<util:list id="kustvakt_resources"
-		value-type="de.ids_mannheim.korap.interfaces.db.ResourceOperationIface">
-	</util:list>
-
 	<!-- specify type for constructor argument -->
 	<bean id="authenticationManager"
 		class="de.ids_mannheim.korap.authentication.KustvaktAuthenticationManager">
diff --git a/lite/src/main/java/de/ids_mannheim/korap/authentication/DummyAuthenticationManager.java b/lite/src/main/java/de/ids_mannheim/korap/authentication/DummyAuthenticationManager.java
index 06cbf5f..cd8f02c 100644
--- a/lite/src/main/java/de/ids_mannheim/korap/authentication/DummyAuthenticationManager.java
+++ b/lite/src/main/java/de/ids_mannheim/korap/authentication/DummyAuthenticationManager.java
@@ -84,13 +84,6 @@
     }
 
     @Override
-    public User createUserAccount (Map<String, Object> attributes,
-            boolean confirmation_required) throws KustvaktException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
     public boolean deleteAccount (User user) throws KustvaktException {
         // TODO Auto-generated method stub
         return false;
@@ -110,27 +103,6 @@
     }
 
     @Override
-    public Object[] validateResetPasswordRequest (String username, String email)
-            throws KustvaktException {
-        // TODO Auto-generated method stub
-        return null;
-    }
-
-    @Override
-    public void resetPassword (String uriFragment, String username,
-            String newPassphrase) throws KustvaktException {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
-    public void confirmRegistration (String uriFragment, String username)
-            throws KustvaktException {
-        // TODO Auto-generated method stub
-
-    }
-
-    @Override
     public User getUser (String username, String method)
             throws KustvaktException {
         // TODO Auto-generated method stub
