diff --git a/src/main/java/de/ids_mannheim/korap/handlers/BatchBuilder.java b/src/main/java/de/ids_mannheim/korap/handlers/BatchBuilder.java
deleted file mode 100644
index c362773..0000000
--- a/src/main/java/de/ids_mannheim/korap/handlers/BatchBuilder.java
+++ /dev/null
@@ -1,72 +0,0 @@
-package de.ids_mannheim.korap.handlers;
-
-import org.apache.logging.log4j.LogManager;
-import org.apache.logging.log4j.Logger;
-import org.springframework.dao.DataAccessException;
-import org.springframework.jdbc.core.JdbcOperations;
-import org.springframework.jdbc.core.RowMapper;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-
-/**
- * @author hanl
- * @date 24/03/2014
- */
-public class BatchBuilder {
-
-    private static final int SINGLE_BATCH = 1;
-    private static final int SMALL_BATCH = 4;
-    private static final int SMALL_MEDIUM_BATCH = 6;
-    private static final int MEDIUM_BATCH = 8;
-    private static final int LARGE_BATCH = 12;
-    private Logger log = LogManager.getLogger(BatchBuilder.class);
-
-    private JdbcOperations operations;
-
-    public BatchBuilder (JdbcOperations operations) {
-        this.operations = operations;
-    }
-
-    public <T> List<T> selectFromIDs (String query, Collection ids,
-            RowMapper<T> mapper) {
-        List l = new ArrayList(ids);
-        int size = ids.size();
-        List<T> values = new ArrayList<>();
-        while (size > 0) {
-            int batchSize = SINGLE_BATCH;
-            if (size >= LARGE_BATCH)
-                batchSize = LARGE_BATCH;
-            else if (size >= MEDIUM_BATCH)
-                batchSize = MEDIUM_BATCH;
-            else if (size >= SMALL_MEDIUM_BATCH)
-                batchSize = SMALL_MEDIUM_BATCH;
-            else if (size >= SMALL_BATCH)
-                batchSize = SMALL_BATCH;
-            size -= batchSize;
-            StringBuilder inClause = new StringBuilder();
-            for (int i = 0; i < batchSize; i++) {
-                inClause.append('?');
-                inClause.append(',');
-            }
-            inClause.deleteCharAt(inClause.length() - 1);
-            String sql = query + " (" + inClause.toString() + ");";
-            Object[] args = new Object[batchSize];
-            List d = new ArrayList();
-            for (int idx = 0; idx < batchSize; idx++) {
-                args[idx] = l.get(idx);
-                d.add(idx, args[idx]);
-            }
-            l.removeAll(d);
-            try {
-                values.addAll(this.operations.query(sql, args, mapper));
-            }
-            catch (DataAccessException e) {
-                log.error("Exception during database retrieval", e);
-            }
-
-        }
-        return values;
-    }
-}
diff --git a/src/main/java/de/ids_mannheim/korap/handlers/RowMapperFactory.java b/src/main/java/de/ids_mannheim/korap/handlers/RowMapperFactory.java
deleted file mode 100644
index 47ad065..0000000
--- a/src/main/java/de/ids_mannheim/korap/handlers/RowMapperFactory.java
+++ /dev/null
@@ -1,79 +0,0 @@
-package de.ids_mannheim.korap.handlers;
-
-import java.sql.ResultSet;
-import java.sql.SQLException;
-import java.sql.Timestamp;
-import java.util.Map;
-
-import org.springframework.jdbc.core.RowMapper;
-
-import de.ids_mannheim.korap.config.Attributes;
-import de.ids_mannheim.korap.config.URIParam;
-import de.ids_mannheim.korap.user.KorAPUser;
-import de.ids_mannheim.korap.user.User;
-
-/**
- * @author hanl
- * @date 14/01/2014
- */
-public class RowMapperFactory {
-
-    public static class UserMapMapper implements RowMapper<Map<?, ?>> {
-
-        @Override
-        public Map<?, ?> mapRow (ResultSet rs, int rowNum) throws SQLException {
-            User user = new UserMapper().mapRow(rs, rowNum);
-            return user.toMap();
-        }
-    }
-
-    public static class UserMapper implements RowMapper<User> {
-
-        @Override
-        public User mapRow (ResultSet rs, int rowNum) throws SQLException {
-            User user;
-            switch (rs.getInt("type")) {
-                case 0:
-                    user = getKorAP(rs);
-                    break;
-                //                case 1:
-                //                    user = getShib(rs);
-                //                    break;
-                default:
-                    user = User.UserFactory.getDemoUser();
-                    user.setId(rs.getInt("id"));
-                    user.setAccountCreation(
-                            rs.getTimestamp(Attributes.ACCOUNT_CREATION)
-                                    .getTime());
-                    return user;
-            }
-            return user;
-        }
-
-        private KorAPUser getKorAP (ResultSet rs) throws SQLException {
-            KorAPUser user = User.UserFactory
-                    .getUser(rs.getString(Attributes.USERNAME));
-            user.setPassword(rs.getString(Attributes.PASSWORD));
-            user.setId(rs.getInt(Attributes.ID));
-            user.setAccountLocked(rs.getBoolean(Attributes.ACCOUNTLOCK));
-            user.setAccountCreation(rs.getLong(Attributes.ACCOUNT_CREATION));
-            user.setAccountLink(rs.getString(Attributes.ACCOUNTLINK));
-            long l = rs.getLong(Attributes.URI_EXPIRATION);
-
-            URIParam param = new URIParam(rs.getString(Attributes.URI_FRAGMENT),
-                    l == 0 ? -1 : new Timestamp(l).getTime());
-            user.addField(param);
-            return user;
-        }
-
-        //        private ShibbolethUser getShib (ResultSet rs) throws SQLException {
-        //            ShibbolethUser user = User.UserFactory.getShibInstance(
-        //                    rs.getString(Attributes.USERNAME),
-        //                    rs.getString(Attributes.MAIL), rs.getString(Attributes.CN));
-        //            user.setId(rs.getInt(Attributes.ID));
-        //            return user;
-        //        }
-
-    }
-
-}
