diff --git a/api/album_lists.go b/server/subsonic/album_lists.go
similarity index 98%
rename from api/album_lists.go
rename to server/subsonic/album_lists.go
index 0f8d19759..b553feddf 100644
--- a/api/album_lists.go
+++ b/server/subsonic/album_lists.go
@@ -1,12 +1,12 @@
-package api
+package subsonic
 
 import (
 	"errors"
 	"net/http"
 
-	"github.com/cloudsonic/sonic-server/api/responses"
 	"github.com/cloudsonic/sonic-server/engine"
 	"github.com/cloudsonic/sonic-server/log"
+	"github.com/cloudsonic/sonic-server/server/subsonic/responses"
 	"github.com/cloudsonic/sonic-server/utils"
 )
 
diff --git a/api/album_lists_test.go b/server/subsonic/album_lists_test.go
similarity index 99%
rename from api/album_lists_test.go
rename to server/subsonic/album_lists_test.go
index 7c21fc089..9632c1db7 100644
--- a/api/album_lists_test.go
+++ b/server/subsonic/album_lists_test.go
@@ -1,4 +1,4 @@
-package api
+package subsonic
 
 import (
 	"errors"
diff --git a/api/api.go b/server/subsonic/api.go
similarity index 95%
rename from api/api.go
rename to server/subsonic/api.go
index c6b0a5def..00cc15630 100644
--- a/api/api.go
+++ b/server/subsonic/api.go
@@ -1,4 +1,4 @@
-package api
+package subsonic
 
 import (
 	"encoding/json"
@@ -6,15 +6,15 @@ import (
 	"fmt"
 	"net/http"
 
-	"github.com/cloudsonic/sonic-server/api/responses"
 	"github.com/cloudsonic/sonic-server/conf"
 	"github.com/cloudsonic/sonic-server/engine"
+	"github.com/cloudsonic/sonic-server/server/subsonic/responses"
 	"github.com/go-chi/chi"
 )
 
 const Version = "1.8.0"
 
-type SubsonicHandler = func(http.ResponseWriter, *http.Request) (*responses.Subsonic, error)
+type Handler = func(http.ResponseWriter, *http.Request) (*responses.Subsonic, error)
 
 type Router struct {
 	Browser       engine.Browser
@@ -123,7 +123,7 @@ func (api *Router) routes() http.Handler {
 
 // Add the Subsonic handler, with and without `.view` extension
 // Ex: if path = `ping` it will create the routes `/ping` and `/ping.view`
-func H(r chi.Router, path string, f SubsonicHandler) {
+func H(r chi.Router, path string, f Handler) {
 	handle := func(w http.ResponseWriter, r *http.Request) {
 		res, err := f(w, r)
 		if err != nil {
diff --git a/api/api_suite_test.go b/server/subsonic/api_suite_test.go
similarity index 93%
rename from api/api_suite_test.go
rename to server/subsonic/api_suite_test.go
index f7ea9a128..a9204bd4e 100644
--- a/api/api_suite_test.go
+++ b/server/subsonic/api_suite_test.go
@@ -1,4 +1,4 @@
-package api
+package subsonic
 
 import (
 	"testing"
diff --git a/api/browsing.go b/server/subsonic/browsing.go
similarity index 98%
rename from api/browsing.go
rename to server/subsonic/browsing.go
index fa3eae695..c08962bbd 100644
--- a/api/browsing.go
+++ b/server/subsonic/browsing.go
@@ -1,15 +1,15 @@
-package api
+package subsonic
 
 import (
 	"fmt"
 	"net/http"
 	"time"
 
-	"github.com/cloudsonic/sonic-server/api/responses"
 	"github.com/cloudsonic/sonic-server/conf"
 	"github.com/cloudsonic/sonic-server/engine"
 	"github.com/cloudsonic/sonic-server/log"
 	"github.com/cloudsonic/sonic-server/model"
+	"github.com/cloudsonic/sonic-server/server/subsonic/responses"
 	"github.com/cloudsonic/sonic-server/utils"
 )
 
diff --git a/api/helpers.go b/server/subsonic/helpers.go
similarity index 98%
rename from api/helpers.go
rename to server/subsonic/helpers.go
index f607d814f..4561611e0 100644
--- a/api/helpers.go
+++ b/server/subsonic/helpers.go
@@ -1,4 +1,4 @@
-package api
+package subsonic
 
 import (
 	"fmt"
@@ -7,9 +7,9 @@ import (
 	"strings"
 	"time"
 
-	"github.com/cloudsonic/sonic-server/api/responses"
 	"github.com/cloudsonic/sonic-server/engine"
 	"github.com/cloudsonic/sonic-server/model"
+	"github.com/cloudsonic/sonic-server/server/subsonic/responses"
 	"github.com/cloudsonic/sonic-server/utils"
 )
 
diff --git a/api/media_annotation.go b/server/subsonic/media_annotation.go
similarity index 98%
rename from api/media_annotation.go
rename to server/subsonic/media_annotation.go
index 52c2f3327..7ab0d54da 100644
--- a/api/media_annotation.go
+++ b/server/subsonic/media_annotation.go
@@ -1,13 +1,13 @@
-package api
+package subsonic
 
 import (
 	"net/http"
 	"time"
 
-	"github.com/cloudsonic/sonic-server/api/responses"
 	"github.com/cloudsonic/sonic-server/engine"
 	"github.com/cloudsonic/sonic-server/log"
 	"github.com/cloudsonic/sonic-server/model"
+	"github.com/cloudsonic/sonic-server/server/subsonic/responses"
 )
 
 type MediaAnnotationController struct {
diff --git a/api/media_retrieval.go b/server/subsonic/media_retrieval.go
similarity index 94%
rename from api/media_retrieval.go
rename to server/subsonic/media_retrieval.go
index 4e874c204..fb8146d35 100644
--- a/api/media_retrieval.go
+++ b/server/subsonic/media_retrieval.go
@@ -1,14 +1,14 @@
-package api
+package subsonic
 
 import (
 	"io"
 	"net/http"
 	"os"
 
-	"github.com/cloudsonic/sonic-server/api/responses"
 	"github.com/cloudsonic/sonic-server/engine"
 	"github.com/cloudsonic/sonic-server/log"
 	"github.com/cloudsonic/sonic-server/model"
+	"github.com/cloudsonic/sonic-server/server/subsonic/responses"
 )
 
 type MediaRetrievalController struct {
diff --git a/api/media_retrieval_test.go b/server/subsonic/media_retrieval_test.go
similarity index 99%
rename from api/media_retrieval_test.go
rename to server/subsonic/media_retrieval_test.go
index 6f42a0ae3..fad68437b 100644
--- a/api/media_retrieval_test.go
+++ b/server/subsonic/media_retrieval_test.go
@@ -1,4 +1,4 @@
-package api
+package subsonic
 
 import (
 	"errors"
diff --git a/api/middlewares.go b/server/subsonic/middlewares.go
similarity index 96%
rename from api/middlewares.go
rename to server/subsonic/middlewares.go
index 739a5ecee..f36910a45 100644
--- a/api/middlewares.go
+++ b/server/subsonic/middlewares.go
@@ -1,4 +1,4 @@
-package api
+package subsonic
 
 import (
 	"context"
@@ -8,9 +8,9 @@ import (
 	"net/http"
 	"strings"
 
-	"github.com/cloudsonic/sonic-server/api/responses"
 	"github.com/cloudsonic/sonic-server/conf"
 	"github.com/cloudsonic/sonic-server/log"
+	"github.com/cloudsonic/sonic-server/server/subsonic/responses"
 )
 
 func checkRequiredParameters(next http.Handler) http.Handler {
diff --git a/api/middlewares_test.go b/server/subsonic/middlewares_test.go
similarity index 99%
rename from api/middlewares_test.go
rename to server/subsonic/middlewares_test.go
index 4bd8dc263..bf3dc9156 100644
--- a/api/middlewares_test.go
+++ b/server/subsonic/middlewares_test.go
@@ -1,4 +1,4 @@
-package api
+package subsonic
 
 import (
 	"net/http"
diff --git a/api/playlists.go b/server/subsonic/playlists.go
similarity index 97%
rename from api/playlists.go
rename to server/subsonic/playlists.go
index 075ef8a88..8f5feb08a 100644
--- a/api/playlists.go
+++ b/server/subsonic/playlists.go
@@ -1,13 +1,13 @@
-package api
+package subsonic
 
 import (
 	"fmt"
 	"net/http"
 
-	"github.com/cloudsonic/sonic-server/api/responses"
 	"github.com/cloudsonic/sonic-server/engine"
 	"github.com/cloudsonic/sonic-server/log"
 	"github.com/cloudsonic/sonic-server/model"
+	"github.com/cloudsonic/sonic-server/server/subsonic/responses"
 )
 
 type PlaylistsController struct {
diff --git a/api/responses/.snapshots/responses-snapshotMatcher-Match-Responses AlbumList with data should match .JSON b/server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses AlbumList with data should match .JSON
similarity index 100%
rename from api/responses/.snapshots/responses-snapshotMatcher-Match-Responses AlbumList with data should match .JSON
rename to server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses AlbumList with data should match .JSON
diff --git a/api/responses/.snapshots/responses-snapshotMatcher-Match-Responses AlbumList with data should match .XML b/server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses AlbumList with data should match .XML
similarity index 100%
rename from api/responses/.snapshots/responses-snapshotMatcher-Match-Responses AlbumList with data should match .XML
rename to server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses AlbumList with data should match .XML
diff --git a/api/responses/.snapshots/responses-snapshotMatcher-Match-Responses AlbumList without data should match .JSON b/server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses AlbumList without data should match .JSON
similarity index 100%
rename from api/responses/.snapshots/responses-snapshotMatcher-Match-Responses AlbumList without data should match .JSON
rename to server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses AlbumList without data should match .JSON
diff --git a/api/responses/.snapshots/responses-snapshotMatcher-Match-Responses AlbumList without data should match .XML b/server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses AlbumList without data should match .XML
similarity index 100%
rename from api/responses/.snapshots/responses-snapshotMatcher-Match-Responses AlbumList without data should match .XML
rename to server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses AlbumList without data should match .XML
diff --git a/api/responses/.snapshots/responses-snapshotMatcher-Match-Responses Child with data should match .JSON b/server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses Child with data should match .JSON
similarity index 100%
rename from api/responses/.snapshots/responses-snapshotMatcher-Match-Responses Child with data should match .JSON
rename to server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses Child with data should match .JSON
diff --git a/api/responses/.snapshots/responses-snapshotMatcher-Match-Responses Child with data should match .XML b/server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses Child with data should match .XML
similarity index 100%
rename from api/responses/.snapshots/responses-snapshotMatcher-Match-Responses Child with data should match .XML
rename to server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses Child with data should match .XML
diff --git a/api/responses/.snapshots/responses-snapshotMatcher-Match-Responses Directory with data should match .JSON b/server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses Directory with data should match .JSON
similarity index 100%
rename from api/responses/.snapshots/responses-snapshotMatcher-Match-Responses Directory with data should match .JSON
rename to server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses Directory with data should match .JSON
diff --git a/api/responses/.snapshots/responses-snapshotMatcher-Match-Responses Directory with data should match .XML b/server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses Directory with data should match .XML
similarity index 100%
rename from api/responses/.snapshots/responses-snapshotMatcher-Match-Responses Directory with data should match .XML
rename to server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses Directory with data should match .XML
diff --git a/api/responses/.snapshots/responses-snapshotMatcher-Match-Responses Directory without data should match .JSON b/server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses Directory without data should match .JSON
similarity index 100%
rename from api/responses/.snapshots/responses-snapshotMatcher-Match-Responses Directory without data should match .JSON
rename to server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses Directory without data should match .JSON
diff --git a/api/responses/.snapshots/responses-snapshotMatcher-Match-Responses Directory without data should match .XML b/server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses Directory without data should match .XML
similarity index 100%
rename from api/responses/.snapshots/responses-snapshotMatcher-Match-Responses Directory without data should match .XML
rename to server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses Directory without data should match .XML
diff --git a/api/responses/.snapshots/responses-snapshotMatcher-Match-Responses EmptyResponse should match .JSON b/server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses EmptyResponse should match .JSON
similarity index 100%
rename from api/responses/.snapshots/responses-snapshotMatcher-Match-Responses EmptyResponse should match .JSON
rename to server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses EmptyResponse should match .JSON
diff --git a/api/responses/.snapshots/responses-snapshotMatcher-Match-Responses EmptyResponse should match .XML b/server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses EmptyResponse should match .XML
similarity index 100%
rename from api/responses/.snapshots/responses-snapshotMatcher-Match-Responses EmptyResponse should match .XML
rename to server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses EmptyResponse should match .XML
diff --git a/api/responses/.snapshots/responses-snapshotMatcher-Match-Responses Genres with data should match .JSON b/server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses Genres with data should match .JSON
similarity index 100%
rename from api/responses/.snapshots/responses-snapshotMatcher-Match-Responses Genres with data should match .JSON
rename to server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses Genres with data should match .JSON
diff --git a/api/responses/.snapshots/responses-snapshotMatcher-Match-Responses Genres with data should match .XML b/server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses Genres with data should match .XML
similarity index 100%
rename from api/responses/.snapshots/responses-snapshotMatcher-Match-Responses Genres with data should match .XML
rename to server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses Genres with data should match .XML
diff --git a/api/responses/.snapshots/responses-snapshotMatcher-Match-Responses Genres without data should match .JSON b/server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses Genres without data should match .JSON
similarity index 100%
rename from api/responses/.snapshots/responses-snapshotMatcher-Match-Responses Genres without data should match .JSON
rename to server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses Genres without data should match .JSON
diff --git a/api/responses/.snapshots/responses-snapshotMatcher-Match-Responses Genres without data should match .XML b/server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses Genres without data should match .XML
similarity index 100%
rename from api/responses/.snapshots/responses-snapshotMatcher-Match-Responses Genres without data should match .XML
rename to server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses Genres without data should match .XML
diff --git a/api/responses/.snapshots/responses-snapshotMatcher-Match-Responses Indexes with data should match .JSON b/server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses Indexes with data should match .JSON
similarity index 100%
rename from api/responses/.snapshots/responses-snapshotMatcher-Match-Responses Indexes with data should match .JSON
rename to server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses Indexes with data should match .JSON
diff --git a/api/responses/.snapshots/responses-snapshotMatcher-Match-Responses Indexes with data should match .XML b/server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses Indexes with data should match .XML
similarity index 100%
rename from api/responses/.snapshots/responses-snapshotMatcher-Match-Responses Indexes with data should match .XML
rename to server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses Indexes with data should match .XML
diff --git a/api/responses/.snapshots/responses-snapshotMatcher-Match-Responses Indexes without data should match .JSON b/server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses Indexes without data should match .JSON
similarity index 100%
rename from api/responses/.snapshots/responses-snapshotMatcher-Match-Responses Indexes without data should match .JSON
rename to server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses Indexes without data should match .JSON
diff --git a/api/responses/.snapshots/responses-snapshotMatcher-Match-Responses Indexes without data should match .XML b/server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses Indexes without data should match .XML
similarity index 100%
rename from api/responses/.snapshots/responses-snapshotMatcher-Match-Responses Indexes without data should match .XML
rename to server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses Indexes without data should match .XML
diff --git a/api/responses/.snapshots/responses-snapshotMatcher-Match-Responses License should match .JSON b/server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses License should match .JSON
similarity index 100%
rename from api/responses/.snapshots/responses-snapshotMatcher-Match-Responses License should match .JSON
rename to server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses License should match .JSON
diff --git a/api/responses/.snapshots/responses-snapshotMatcher-Match-Responses License should match .XML b/server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses License should match .XML
similarity index 100%
rename from api/responses/.snapshots/responses-snapshotMatcher-Match-Responses License should match .XML
rename to server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses License should match .XML
diff --git a/api/responses/.snapshots/responses-snapshotMatcher-Match-Responses MusicFolders with data should match .JSON b/server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses MusicFolders with data should match .JSON
similarity index 100%
rename from api/responses/.snapshots/responses-snapshotMatcher-Match-Responses MusicFolders with data should match .JSON
rename to server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses MusicFolders with data should match .JSON
diff --git a/api/responses/.snapshots/responses-snapshotMatcher-Match-Responses MusicFolders with data should match .XML b/server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses MusicFolders with data should match .XML
similarity index 100%
rename from api/responses/.snapshots/responses-snapshotMatcher-Match-Responses MusicFolders with data should match .XML
rename to server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses MusicFolders with data should match .XML
diff --git a/api/responses/.snapshots/responses-snapshotMatcher-Match-Responses MusicFolders without data should match .JSON b/server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses MusicFolders without data should match .JSON
similarity index 100%
rename from api/responses/.snapshots/responses-snapshotMatcher-Match-Responses MusicFolders without data should match .JSON
rename to server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses MusicFolders without data should match .JSON
diff --git a/api/responses/.snapshots/responses-snapshotMatcher-Match-Responses MusicFolders without data should match .XML b/server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses MusicFolders without data should match .XML
similarity index 100%
rename from api/responses/.snapshots/responses-snapshotMatcher-Match-Responses MusicFolders without data should match .XML
rename to server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses MusicFolders without data should match .XML
diff --git a/api/responses/.snapshots/responses-snapshotMatcher-Match-Responses Playlists with data should match .JSON b/server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses Playlists with data should match .JSON
similarity index 100%
rename from api/responses/.snapshots/responses-snapshotMatcher-Match-Responses Playlists with data should match .JSON
rename to server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses Playlists with data should match .JSON
diff --git a/api/responses/.snapshots/responses-snapshotMatcher-Match-Responses Playlists with data should match .XML b/server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses Playlists with data should match .XML
similarity index 100%
rename from api/responses/.snapshots/responses-snapshotMatcher-Match-Responses Playlists with data should match .XML
rename to server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses Playlists with data should match .XML
diff --git a/api/responses/.snapshots/responses-snapshotMatcher-Match-Responses Playlists without data should match .JSON b/server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses Playlists without data should match .JSON
similarity index 100%
rename from api/responses/.snapshots/responses-snapshotMatcher-Match-Responses Playlists without data should match .JSON
rename to server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses Playlists without data should match .JSON
diff --git a/api/responses/.snapshots/responses-snapshotMatcher-Match-Responses Playlists without data should match .XML b/server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses Playlists without data should match .XML
similarity index 100%
rename from api/responses/.snapshots/responses-snapshotMatcher-Match-Responses Playlists without data should match .XML
rename to server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses Playlists without data should match .XML
diff --git a/api/responses/.snapshots/responses-snapshotMatcher-Match-Responses User with data should match .JSON b/server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses User with data should match .JSON
similarity index 100%
rename from api/responses/.snapshots/responses-snapshotMatcher-Match-Responses User with data should match .JSON
rename to server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses User with data should match .JSON
diff --git a/api/responses/.snapshots/responses-snapshotMatcher-Match-Responses User with data should match .XML b/server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses User with data should match .XML
similarity index 100%
rename from api/responses/.snapshots/responses-snapshotMatcher-Match-Responses User with data should match .XML
rename to server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses User with data should match .XML
diff --git a/api/responses/.snapshots/responses-snapshotMatcher-Match-Responses User without data should match .JSON b/server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses User without data should match .JSON
similarity index 100%
rename from api/responses/.snapshots/responses-snapshotMatcher-Match-Responses User without data should match .JSON
rename to server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses User without data should match .JSON
diff --git a/api/responses/.snapshots/responses-snapshotMatcher-Match-Responses User without data should match .XML b/server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses User without data should match .XML
similarity index 100%
rename from api/responses/.snapshots/responses-snapshotMatcher-Match-Responses User without data should match .XML
rename to server/subsonic/responses/.snapshots/responses-snapshotMatcher-Match-Responses User without data should match .XML
diff --git a/api/responses/errors.go b/server/subsonic/responses/errors.go
similarity index 100%
rename from api/responses/errors.go
rename to server/subsonic/responses/errors.go
diff --git a/api/responses/responses.go b/server/subsonic/responses/responses.go
similarity index 100%
rename from api/responses/responses.go
rename to server/subsonic/responses/responses.go
diff --git a/api/responses/responses_suite_test.go b/server/subsonic/responses/responses_suite_test.go
similarity index 100%
rename from api/responses/responses_suite_test.go
rename to server/subsonic/responses/responses_suite_test.go
diff --git a/api/responses/responses_test.go b/server/subsonic/responses/responses_test.go
similarity index 99%
rename from api/responses/responses_test.go
rename to server/subsonic/responses/responses_test.go
index 9b7998b71..99f8b1b13 100644
--- a/api/responses/responses_test.go
+++ b/server/subsonic/responses/responses_test.go
@@ -10,7 +10,7 @@ import (
 	"encoding/xml"
 	"time"
 
-	. "github.com/cloudsonic/sonic-server/api/responses"
+	. "github.com/cloudsonic/sonic-server/server/subsonic/responses"
 	. "github.com/onsi/ginkgo"
 	. "github.com/onsi/gomega"
 )
diff --git a/api/searching.go b/server/subsonic/searching.go
similarity index 97%
rename from api/searching.go
rename to server/subsonic/searching.go
index 2d5f89f02..4bf84ef05 100644
--- a/api/searching.go
+++ b/server/subsonic/searching.go
@@ -1,12 +1,12 @@
-package api
+package subsonic
 
 import (
 	"fmt"
 	"net/http"
 
-	"github.com/cloudsonic/sonic-server/api/responses"
 	"github.com/cloudsonic/sonic-server/engine"
 	"github.com/cloudsonic/sonic-server/log"
+	"github.com/cloudsonic/sonic-server/server/subsonic/responses"
 )
 
 type SearchingController struct {
diff --git a/api/stream.go b/server/subsonic/stream.go
similarity index 96%
rename from api/stream.go
rename to server/subsonic/stream.go
index f27d61fd1..f37548034 100644
--- a/api/stream.go
+++ b/server/subsonic/stream.go
@@ -1,12 +1,12 @@
-package api
+package subsonic
 
 import (
 	"net/http"
 
-	"github.com/cloudsonic/sonic-server/api/responses"
 	"github.com/cloudsonic/sonic-server/engine"
 	"github.com/cloudsonic/sonic-server/log"
 	"github.com/cloudsonic/sonic-server/model"
+	"github.com/cloudsonic/sonic-server/server/subsonic/responses"
 	"github.com/cloudsonic/sonic-server/utils"
 )
 
diff --git a/api/system.go b/server/subsonic/system.go
similarity index 85%
rename from api/system.go
rename to server/subsonic/system.go
index dc190ee49..42c83cf5f 100644
--- a/api/system.go
+++ b/server/subsonic/system.go
@@ -1,9 +1,9 @@
-package api
+package subsonic
 
 import (
 	"net/http"
 
-	"github.com/cloudsonic/sonic-server/api/responses"
+	"github.com/cloudsonic/sonic-server/server/subsonic/responses"
 )
 
 type SystemController struct{}
diff --git a/api/users.go b/server/subsonic/users.go
similarity index 89%
rename from api/users.go
rename to server/subsonic/users.go
index 940a7802e..f21f90209 100644
--- a/api/users.go
+++ b/server/subsonic/users.go
@@ -1,9 +1,9 @@
-package api
+package subsonic
 
 import (
 	"net/http"
 
-	"github.com/cloudsonic/sonic-server/api/responses"
+	"github.com/cloudsonic/sonic-server/server/subsonic/responses"
 )
 
 type UsersController struct{}
diff --git a/api/wire_gen.go b/server/subsonic/wire_gen.go
similarity index 99%
rename from api/wire_gen.go
rename to server/subsonic/wire_gen.go
index 391f314e1..28d05923f 100644
--- a/api/wire_gen.go
+++ b/server/subsonic/wire_gen.go
@@ -3,7 +3,7 @@
 //go:generate wire
 //+build !wireinject
 
-package api
+package subsonic
 
 import (
 	"github.com/google/wire"
diff --git a/api/wire_injectors.go b/server/subsonic/wire_injectors.go
similarity index 98%
rename from api/wire_injectors.go
rename to server/subsonic/wire_injectors.go
index ed96d2c42..e39dde24e 100644
--- a/api/wire_injectors.go
+++ b/server/subsonic/wire_injectors.go
@@ -1,6 +1,6 @@
 //+build wireinject
 
-package api
+package subsonic
 
 import (
 	"github.com/google/wire"
diff --git a/tests/matchers.go b/tests/matchers.go
index 904aeed9c..87f999b8a 100644
--- a/tests/matchers.go
+++ b/tests/matchers.go
@@ -7,7 +7,7 @@ import (
 	"encoding/xml"
 	"fmt"
 
-	"github.com/cloudsonic/sonic-server/api/responses"
+	"github.com/cloudsonic/sonic-server/server/subsonic/responses"
 	"github.com/smartystreets/goconvey/convey"
 )
 
diff --git a/wire_gen.go b/wire_gen.go
index 989084db6..d07f386e0 100644
--- a/wire_gen.go
+++ b/wire_gen.go
@@ -6,11 +6,11 @@
 package main
 
 import (
-	"github.com/cloudsonic/sonic-server/api"
 	"github.com/cloudsonic/sonic-server/engine"
 	"github.com/cloudsonic/sonic-server/persistence"
 	"github.com/cloudsonic/sonic-server/scanner"
 	"github.com/cloudsonic/sonic-server/server"
+	"github.com/cloudsonic/sonic-server/server/subsonic"
 	"github.com/google/wire"
 )
 
@@ -23,7 +23,7 @@ func CreateApp(musicFolder string) *server.Server {
 	return serverServer
 }
 
-func CreateSubsonicAPIRouter() *api.Router {
+func CreateSubsonicAPIRouter() *subsonic.Router {
 	dataStore := persistence.New()
 	browser := engine.NewBrowser(dataStore)
 	cover := engine.NewCover(dataStore)
@@ -33,10 +33,10 @@ func CreateSubsonicAPIRouter() *api.Router {
 	ratings := engine.NewRatings(dataStore)
 	scrobbler := engine.NewScrobbler(dataStore, nowPlayingRepository)
 	search := engine.NewSearch(dataStore)
-	router := api.NewRouter(browser, cover, listGenerator, playlists, ratings, scrobbler, search)
+	router := subsonic.NewRouter(browser, cover, listGenerator, playlists, ratings, scrobbler, search)
 	return router
 }
 
 // wire_injectors.go:
 
-var allProviders = wire.NewSet(engine.Set, scanner.New, api.NewRouter, persistence.Set)
+var allProviders = wire.NewSet(engine.Set, scanner.New, subsonic.NewRouter, persistence.Set)
diff --git a/wire_injectors.go b/wire_injectors.go
index 812899fce..13522057f 100644
--- a/wire_injectors.go
+++ b/wire_injectors.go
@@ -3,18 +3,18 @@
 package main
 
 import (
-	"github.com/cloudsonic/sonic-server/api"
 	"github.com/cloudsonic/sonic-server/engine"
 	"github.com/cloudsonic/sonic-server/persistence"
 	"github.com/cloudsonic/sonic-server/scanner"
 	"github.com/cloudsonic/sonic-server/server"
+	"github.com/cloudsonic/sonic-server/server/subsonic"
 	"github.com/google/wire"
 )
 
 var allProviders = wire.NewSet(
 	engine.Set,
 	scanner.New,
-	api.NewRouter,
+	subsonic.NewRouter,
 	persistence.Set,
 )
 
@@ -25,6 +25,6 @@ func CreateApp(musicFolder string) *server.Server {
 	))
 }
 
-func CreateSubsonicAPIRouter() *api.Router {
+func CreateSubsonicAPIRouter() *subsonic.Router {
 	panic(wire.Build(allProviders))
 }