diff --git a/CMakeLists.txt b/CMakeLists.txt
new file mode 100644
index 00000000..7eef4529
--- /dev/null
+++ b/CMakeLists.txt
@@ -0,0 +1,18 @@
+cmake_minimum_required(VERSION 3.10)
+
+project(lms)
+
+set(CMAKE_CXX_STANDARD 17)
+set(CMAKE_CXX_STANDARD_REQUIRED True)
+
+find_package(PkgConfig)
+pkg_check_modules(IMAGEMAGICKXX REQUIRED ImageMagick++)
+
+
+SUBDIRS(src)
+
+install(DIRECTORY approot DESTINATION share/lms)
+install(DIRECTORY docroot DESTINATION share/lms)
+install(FILES systemd/default.service DESTINATION share/lms)
+install(FILES conf/lms.conf DESTINATION share/lms)
+
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
new file mode 100644
index 00000000..8853a8c7
--- /dev/null
+++ b/src/CMakeLists.txt
@@ -0,0 +1,4 @@
+add_compile_options(-Wall -Wextra -pedantic -Werror)
+
+SUBDIRS(liblms lms)
+
diff --git a/src/Makefile.am b/src/Makefile.am
index 4fd65f58..b5644219 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,171 +1,6 @@
bin_PROGRAMS = lms
lms_SOURCES = \
- $(srcdir)/api/subsonic/SubsonicId.cpp \
- $(srcdir)/api/subsonic/SubsonicId.hpp \
- $(srcdir)/api/subsonic/SubsonicResource.cpp \
- $(srcdir)/api/subsonic/SubsonicResource.hpp \
- $(srcdir)/api/subsonic/SubsonicResponse.cpp \
- $(srcdir)/api/subsonic/SubsonicResponse.hpp \
- $(srcdir)/auth/AuthTokenService.cpp \
- $(srcdir)/auth/AuthTokenService.hpp \
- $(srcdir)/auth/PasswordService.cpp \
- $(srcdir)/auth/PasswordService.hpp \
- $(srcdir)/auth/LoginThrottler.cpp \
- $(srcdir)/auth/LoginThrottler.hpp \
- $(srcdir)/av/AvInfo.cpp \
- $(srcdir)/av/AvInfo.hpp \
- $(srcdir)/av/AvTranscoder.cpp \
- $(srcdir)/av/AvTranscoder.hpp \
- $(srcdir)/av/AvTypes.cpp \
- $(srcdir)/av/AvTypes.hpp \
- $(srcdir)/cover/CoverArtGrabber.cpp \
- $(srcdir)/cover/CoverArtGrabber.hpp \
- $(srcdir)/database/Artist.cpp \
- $(srcdir)/database/Artist.hpp \
- $(srcdir)/database/Cluster.cpp \
- $(srcdir)/database/Cluster.hpp \
- $(srcdir)/database/Db.cpp \
- $(srcdir)/database/Db.hpp \
- $(srcdir)/database/TrackArtistLink.cpp \
- $(srcdir)/database/TrackArtistLink.hpp \
- $(srcdir)/database/TrackFeatures.cpp \
- $(srcdir)/database/TrackFeatures.hpp \
- $(srcdir)/database/TrackList.cpp \
- $(srcdir)/database/TrackList.hpp \
- $(srcdir)/database/Types.hpp \
- $(srcdir)/database/Release.cpp \
- $(srcdir)/database/Release.hpp \
- $(srcdir)/database/ScanSettings.cpp \
- $(srcdir)/database/ScanSettings.hpp \
- $(srcdir)/database/Session.cpp \
- $(srcdir)/database/Session.hpp \
- $(srcdir)/database/SessionPool.cpp \
- $(srcdir)/database/SessionPool.hpp \
- $(srcdir)/database/SqlQuery.cpp \
- $(srcdir)/database/SqlQuery.hpp \
- $(srcdir)/database/Track.cpp \
- $(srcdir)/database/Track.hpp \
- $(srcdir)/database/TrackBookmark.cpp \
- $(srcdir)/database/TrackBookmark.hpp \
- $(srcdir)/database/User.cpp \
- $(srcdir)/database/User.hpp \
- $(srcdir)/image/Image.cpp \
- $(srcdir)/image/Image.hpp \
- $(srcdir)/main/main.cpp \
- $(srcdir)/metadata/AvFormat.cpp \
- $(srcdir)/metadata/AvFormat.hpp \
- $(srcdir)/metadata/MetaData.hpp \
- $(srcdir)/metadata/TagLibParser.cpp \
- $(srcdir)/metadata/TagLibParser.hpp \
- $(srcdir)/scanner/MediaScanner.cpp \
- $(srcdir)/scanner/MediaScanner.hpp \
- $(srcdir)/scanner/MediaScannerStats.cpp \
- $(srcdir)/scanner/MediaScannerStats.hpp \
- $(srcdir)/scanner/MediaScannerAddon.hpp \
- $(srcdir)/similarity/SimilaritySearcher.cpp \
- $(srcdir)/similarity/SimilaritySearcher.hpp \
- $(srcdir)/similarity/cluster/SimilarityClusterSearcher.cpp \
- $(srcdir)/similarity/cluster/SimilarityClusterSearcher.hpp \
- $(srcdir)/similarity/features/AcousticBrainzUtils.cpp \
- $(srcdir)/similarity/features/AcousticBrainzUtils.hpp \
- $(srcdir)/similarity/features/SimilarityFeaturesCache.cpp \
- $(srcdir)/similarity/features/SimilarityFeaturesCache.hpp \
- $(srcdir)/similarity/features/SimilarityFeaturesDefs.cpp \
- $(srcdir)/similarity/features/SimilarityFeaturesDefs.hpp \
- $(srcdir)/similarity/features/SimilarityFeaturesScannerAddon.cpp \
- $(srcdir)/similarity/features/SimilarityFeaturesScannerAddon.hpp \
- $(srcdir)/similarity/features/SimilarityFeaturesSearcher.cpp \
- $(srcdir)/similarity/features/SimilarityFeaturesSearcher.hpp \
- $(srcdir)/similarity/features/som/DataNormalizer.cpp \
- $(srcdir)/similarity/features/som/DataNormalizer.hpp \
- $(srcdir)/similarity/features/som/InputVector.hpp \
- $(srcdir)/similarity/features/som/Matrix.hpp \
- $(srcdir)/similarity/features/som/Network.cpp \
- $(srcdir)/similarity/features/som/Network.hpp \
- $(srcdir)/ui/Auth.cpp \
- $(srcdir)/ui/Auth.hpp \
- $(srcdir)/ui/LmsApplication.cpp \
- $(srcdir)/ui/LmsApplication.hpp \
- $(srcdir)/ui/LmsApplicationException.hpp \
- $(srcdir)/ui/LmsApplicationGroup.cpp \
- $(srcdir)/ui/LmsApplicationGroup.hpp \
- $(srcdir)/ui/MediaPlayer.cpp \
- $(srcdir)/ui/MediaPlayer.hpp \
- $(srcdir)/ui/PlayQueueView.cpp \
- $(srcdir)/ui/PlayQueueView.hpp \
- $(srcdir)/ui/PlayHistoryView.cpp \
- $(srcdir)/ui/PlayHistoryView.hpp \
- $(srcdir)/ui/SettingsView.cpp \
- $(srcdir)/ui/SettingsView.hpp \
- $(srcdir)/ui/TrackStringUtils.cpp \
- $(srcdir)/ui/TrackStringUtils.hpp \
- $(srcdir)/ui/admin/DatabaseSettingsView.cpp \
- $(srcdir)/ui/admin/DatabaseSettingsView.hpp \
- $(srcdir)/ui/admin/DatabaseStatus.cpp \
- $(srcdir)/ui/admin/DatabaseStatus.hpp \
- $(srcdir)/ui/admin/InitWizardView.cpp \
- $(srcdir)/ui/admin/InitWizardView.hpp \
- $(srcdir)/ui/admin/UserView.cpp \
- $(srcdir)/ui/admin/UserView.hpp \
- $(srcdir)/ui/admin/UsersView.cpp \
- $(srcdir)/ui/admin/UsersView.hpp \
- $(srcdir)/ui/common/Validators.cpp \
- $(srcdir)/ui/common/Validators.hpp \
- $(srcdir)/ui/common/ValueStringModel.hpp \
- $(srcdir)/ui/explore/ArtistInfoView.cpp \
- $(srcdir)/ui/explore/ArtistInfoView.hpp \
- $(srcdir)/ui/explore/ArtistLink.cpp \
- $(srcdir)/ui/explore/ArtistLink.hpp \
- $(srcdir)/ui/explore/ArtistsInfoView.cpp \
- $(srcdir)/ui/explore/ArtistsInfoView.hpp \
- $(srcdir)/ui/explore/ArtistView.cpp \
- $(srcdir)/ui/explore/ArtistView.hpp \
- $(srcdir)/ui/explore/ArtistsView.cpp \
- $(srcdir)/ui/explore/ArtistsView.hpp \
- $(srcdir)/ui/explore/Explore.cpp \
- $(srcdir)/ui/explore/Explore.hpp \
- $(srcdir)/ui/explore/Filters.cpp \
- $(srcdir)/ui/explore/Filters.hpp \
- $(srcdir)/ui/explore/ReleaseInfoView.cpp \
- $(srcdir)/ui/explore/ReleaseInfoView.hpp \
- $(srcdir)/ui/explore/ReleaseLink.cpp \
- $(srcdir)/ui/explore/ReleaseLink.hpp \
- $(srcdir)/ui/explore/ReleasesInfoView.cpp \
- $(srcdir)/ui/explore/ReleasesInfoView.hpp \
- $(srcdir)/ui/explore/ReleasesView.cpp \
- $(srcdir)/ui/explore/ReleasesView.hpp \
- $(srcdir)/ui/explore/ReleaseView.cpp \
- $(srcdir)/ui/explore/ReleaseView.hpp \
- $(srcdir)/ui/explore/TracksInfoView.cpp \
- $(srcdir)/ui/explore/TracksInfoView.hpp \
- $(srcdir)/ui/explore/TracksView.cpp \
- $(srcdir)/ui/explore/TracksView.hpp \
- $(srcdir)/ui/resource/ImageResource.cpp \
- $(srcdir)/ui/resource/ImageResource.hpp \
- $(srcdir)/ui/resource/AudioResource.cpp \
- $(srcdir)/ui/resource/AudioResource.hpp \
- $(srcdir)/utils/Config.cpp \
- $(srcdir)/utils/Config.hpp \
- $(srcdir)/utils/Exception.hpp \
- $(srcdir)/utils/Logger.cpp \
- $(srcdir)/utils/Logger.hpp \
- $(srcdir)/utils/NetAddress.cpp \
- $(srcdir)/utils/NetAddress.hpp \
- $(srcdir)/utils/Path.cpp \
- $(srcdir)/utils/Path.hpp \
- $(srcdir)/utils/Random.cpp \
- $(srcdir)/utils/Random.hpp \
- $(srcdir)/utils/Service.hpp \
- $(srcdir)/utils/StreamLogger.cpp \
- $(srcdir)/utils/StreamLogger.hpp \
- $(srcdir)/utils/String.cpp \
- $(srcdir)/utils/String.hpp \
- $(srcdir)/utils/Utils.hpp \
- $(srcdir)/utils/UUID.cpp \
- $(srcdir)/utils/UUID.hpp \
- $(srcdir)/utils/WtLogger.cpp \
- $(srcdir)/utils/WtLogger.hpp
lms_CXXFLAGS=-std=c++17 -I$(srcdir)/ui $(MAGICKXX_CFLAGS) -D_REENTRANT
lms_LDADD=$(MAGICKXX_LIBS)
diff --git a/src/config/.empty b/src/config/.empty
deleted file mode 100644
index e69de29b..00000000
diff --git a/src/cover/CoverArtGrabber.hpp b/src/cover/CoverArtGrabber.hpp
deleted file mode 100644
index 07b4cc32..00000000
--- a/src/cover/CoverArtGrabber.hpp
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Copyright (C) 2015 Emeric Poupon
- *
- * This file is part of LMS.
- *
- * LMS 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.
- *
- * LMS 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 LMS. If not, see .
- */
-
-#pragma once
-
-#include
-#include