diff --git a/airsonic-main/src/main/java/org/airsonic/player/dao/AbstractDao.java b/airsonic-main/src/main/java/org/airsonic/player/dao/AbstractDao.java
deleted file mode 100644
index 4a4f7eefa..000000000
--- a/airsonic-main/src/main/java/org/airsonic/player/dao/AbstractDao.java
+++ /dev/null
@@ -1,308 +0,0 @@
-/*
- This file is part of Airsonic.
-
- Airsonic is free software: you can redistribute it and/or modify
- it under the terms of the GNU General Public License as published by
- the Free Software Foundation, either version 3 of the License, or
- (at your option) any later version.
-
- Airsonic is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU General Public License
- along with Airsonic. If not, see .
-
- Copyright 2016 (C) Airsonic Authors
- Based upon Subsonic, Copyright 2009 (C) Sindre Mehus
- */
-package org.airsonic.player.dao;
-
-import com.google.common.base.CaseFormat;
-import org.airsonic.player.util.LambdaUtils;
-import org.apache.commons.lang.StringUtils;
-import org.apache.commons.lang3.tuple.Pair;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.jdbc.core.JdbcTemplate;
-import org.springframework.jdbc.core.RowMapper;
-import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
-import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
-
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.invoke.MethodHandle;
-import java.lang.invoke.MethodHandles;
-import java.lang.reflect.Field;
-import java.nio.file.Path;
-import java.sql.Timestamp;
-import java.time.Instant;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Objects;
-import java.util.Optional;
-import java.util.concurrent.TimeUnit;
-import java.util.function.Function;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-/**
- * Abstract superclass for all DAO's.
- *
- * @author Sindre Mehus
- */
-public class AbstractDao {
- private static final Logger LOG = LoggerFactory.getLogger(AbstractDao.class);
-
- @Autowired
- JdbcTemplate jdbcTemplate;
-
- @Autowired
- NamedParameterJdbcTemplate namedParameterJdbcTemplate;
-
- public JdbcTemplate getJdbcTemplate() {
- return jdbcTemplate;
- }
-
- public NamedParameterJdbcTemplate getNamedParameterJdbcTemplate() {
- return namedParameterJdbcTemplate;
- }
-
- protected static String questionMarks(String columns) {
- int numberOfColumns = StringUtils.countMatches(columns, ",") + 1;
- return StringUtils.repeat("?", ", ", numberOfColumns);
- }
-
- protected static String prefix(String columns, String prefix) {
- List l = Arrays.asList(columns.split(", "));
- l.replaceAll(s -> prefix + "." + s);
- return String.join(", ", l);
- }
-
- protected static Object[] convertToDBTypes(Object[] args) {
- return args == null ? null : Stream.of(args)
- .map(AbstractDao::convertToDBType)
- .collect(Collectors.toList())
- .toArray();
- }
-
- protected static Map convertToDBTypes(Map args) {
- return args == null ? null : args.entrySet()
- .stream()
- .map(x -> Pair.of(x.getKey(), convertToDBType(x.getValue())))
- //can't use Collectors.toMap or Collectors.toConcurrentMap due to possible null value mappings
- .collect(HashMap::new, (m, v) -> m.put(v.getKey(), v.getValue()), HashMap::putAll);
- }
-
- protected static Object convertToDBType(Object x) {
- if (x instanceof Instant) {
- return Timestamp.from((Instant) x);
- }
-
- if (x instanceof Enum) {
- return ((Enum>) x).name();
- }
-
- if (x instanceof Path) {
- return ((Path) x).toString();
- }
-
- return x;
- }
-
- protected int update(String sql, Object... args) {
- long t = System.nanoTime();
- LOG.trace("Executing query: [{}]", sql);
- int result = getJdbcTemplate().update(sql, convertToDBTypes(args));
- LOG.trace("Updated {} rows", result);
- log(sql, t);
- return result;
- }
-
- protected int namedUpdate(String sql, Map args) {
- long t = System.nanoTime();
- LOG.trace("Executing query: [{}]", sql);
- int result = getNamedParameterJdbcTemplate().update(sql, convertToDBTypes(args));
- LOG.trace("Updated {} rows", result);
- log(sql, t);
- return result;
- }
-
- protected int batchedUpdate(String sql, Collection