diff --git a/cmd/wire_gen.go b/cmd/wire_gen.go
index 870937288..f3c99d890 100644
--- a/cmd/wire_gen.go
+++ b/cmd/wire_gen.go
@@ -47,13 +47,12 @@ func CreateSubsonicAPIRouter() (*subsonic.Router, error) {
 	users := engine.NewUsers(dataStore)
 	playlists := engine.NewPlaylists(dataStore)
 	scrobbler := engine.NewScrobbler(dataStore, nowPlayingRepository)
-	search := engine.NewSearch(dataStore)
 	transcoderTranscoder := transcoder.New()
 	transcodingCache := core.NewTranscodingCache()
 	mediaStreamer := core.NewMediaStreamer(dataStore, transcoderTranscoder, transcodingCache)
 	archiver := core.NewArchiver(dataStore)
 	players := engine.NewPlayers(dataStore)
-	router := subsonic.New(artwork, listGenerator, users, playlists, scrobbler, search, mediaStreamer, archiver, players, dataStore)
+	router := subsonic.New(artwork, listGenerator, users, playlists, scrobbler, mediaStreamer, archiver, players, dataStore)
 	return router, nil
 }
 
diff --git a/server/subsonic/api.go b/server/subsonic/api.go
index d0d992b00..e463aca4a 100644
--- a/server/subsonic/api.go
+++ b/server/subsonic/api.go
@@ -27,7 +27,6 @@ type Router struct {
 	ListGenerator engine.ListGenerator
 	Playlists     engine.Playlists
 	Scrobbler     engine.Scrobbler
-	Search        engine.Search
 	Users         engine.Users
 	Streamer      core.MediaStreamer
 	Archiver      core.Archiver
@@ -38,10 +37,10 @@ type Router struct {
 }
 
 func New(artwork core.Artwork, listGenerator engine.ListGenerator, users engine.Users,
-	playlists engine.Playlists, scrobbler engine.Scrobbler, search engine.Search,
-	streamer core.MediaStreamer, archiver core.Archiver, players engine.Players, ds model.DataStore) *Router {
+	playlists engine.Playlists, scrobbler engine.Scrobbler, streamer core.MediaStreamer,
+	archiver core.Archiver, players engine.Players, ds model.DataStore) *Router {
 	r := &Router{Artwork: artwork, ListGenerator: listGenerator, Playlists: playlists,
-		Scrobbler: scrobbler, Search: search, Users: users, Streamer: streamer, Archiver: archiver,
+		Scrobbler: scrobbler, Users: users, Streamer: streamer, Archiver: archiver,
 		Players: players, DataStore: ds}
 	r.mux = r.routes()
 	return r
diff --git a/server/subsonic/engine/search.go b/server/subsonic/engine/search.go
deleted file mode 100644
index b84bf93b6..000000000
--- a/server/subsonic/engine/search.go
+++ /dev/null
@@ -1,68 +0,0 @@
-package engine
-
-import (
-	"context"
-	"strings"
-
-	"github.com/deluan/navidrome/model"
-	"github.com/kennygrant/sanitize"
-)
-
-type Search interface {
-	SearchArtist(ctx context.Context, q string, offset int, size int) (Entries, error)
-	SearchAlbum(ctx context.Context, q string, offset int, size int) (Entries, error)
-	SearchSong(ctx context.Context, q string, offset int, size int) (Entries, error)
-}
-
-type search struct {
-	ds model.DataStore
-}
-
-func NewSearch(ds model.DataStore) Search {
-	s := &search{ds}
-	return s
-}
-
-func (s *search) SearchArtist(ctx context.Context, q string, offset int, size int) (Entries, error) {
-	q = sanitize.Accents(strings.ToLower(strings.TrimSuffix(q, "*")))
-	artists, err := s.ds.Artist(ctx).Search(q, offset, size)
-	if len(artists) == 0 || err != nil {
-		return nil, nil
-	}
-
-	artistIds := make([]string, len(artists))
-	for i, al := range artists {
-		artistIds[i] = al.ID
-	}
-	return FromArtists(artists), nil
-}
-
-func (s *search) SearchAlbum(ctx context.Context, q string, offset int, size int) (Entries, error) {
-	q = sanitize.Accents(strings.ToLower(strings.TrimSuffix(q, "*")))
-	albums, err := s.ds.Album(ctx).Search(q, offset, size)
-	if len(albums) == 0 || err != nil {
-		return nil, nil
-	}
-
-	albumIds := make([]string, len(albums))
-	for i, al := range albums {
-		albumIds[i] = al.ID
-	}
-
-	return FromAlbums(albums), nil
-}
-
-func (s *search) SearchSong(ctx context.Context, q string, offset int, size int) (Entries, error) {
-	q = sanitize.Accents(strings.ToLower(strings.TrimSuffix(q, "*")))
-	mediaFiles, err := s.ds.MediaFile(ctx).Search(q, offset, size)
-	if len(mediaFiles) == 0 || err != nil {
-		return nil, nil
-	}
-
-	trackIds := make([]string, len(mediaFiles))
-	for i, mf := range mediaFiles {
-		trackIds[i] = mf.ID
-	}
-
-	return FromMediaFiles(mediaFiles), nil
-}
diff --git a/server/subsonic/engine/wire_providers.go b/server/subsonic/engine/wire_providers.go
index 02c3b9a5c..aa1f15c95 100644
--- a/server/subsonic/engine/wire_providers.go
+++ b/server/subsonic/engine/wire_providers.go
@@ -8,7 +8,6 @@ var Set = wire.NewSet(
 	NewListGenerator,
 	NewPlaylists,
 	NewScrobbler,
-	NewSearch,
 	NewNowPlayingRepository,
 	NewUsers,
 	NewPlayers,
diff --git a/server/subsonic/searching.go b/server/subsonic/searching.go
index b3dde75c0..a2b0cf727 100644
--- a/server/subsonic/searching.go
+++ b/server/subsonic/searching.go
@@ -3,15 +3,17 @@ package subsonic
 import (
 	"fmt"
 	"net/http"
+	"strings"
 
 	"github.com/deluan/navidrome/log"
-	"github.com/deluan/navidrome/server/subsonic/engine"
+	"github.com/deluan/navidrome/model"
 	"github.com/deluan/navidrome/server/subsonic/responses"
 	"github.com/deluan/navidrome/utils"
+	"github.com/kennygrant/sanitize"
 )
 
 type SearchingController struct {
-	search engine.Search
+	ds model.DataStore
 }
 
 type searchParams struct {
@@ -24,8 +26,8 @@ type searchParams struct {
 	songOffset   int
 }
 
-func NewSearchingController(search engine.Search) *SearchingController {
-	return &SearchingController{search: search}
+func NewSearchingController(ds model.DataStore) *SearchingController {
+	return &SearchingController{ds: ds}
 }
 
 func (c *SearchingController) getParams(r *http.Request) (*searchParams, error) {
@@ -44,22 +46,26 @@ func (c *SearchingController) getParams(r *http.Request) (*searchParams, error)
 	return sp, nil
 }
 
-func (c *SearchingController) searchAll(r *http.Request, sp *searchParams) (engine.Entries, engine.Entries, engine.Entries) {
-	as, err := c.search.SearchArtist(r.Context(), sp.query, sp.artistOffset, sp.artistCount)
+func (c *SearchingController) searchAll(r *http.Request, sp *searchParams) (model.MediaFiles, model.Albums, model.Artists) {
+	q := sanitize.Accents(strings.ToLower(strings.TrimSuffix(sp.query, "*")))
+	ctx := r.Context()
+
+	artists, err := c.ds.Artist(ctx).Search(q, sp.artistOffset, sp.artistCount)
 	if err != nil {
-		log.Error(r, "Error searching for Artists", err)
+		log.Error(ctx, "Error searching for Artists", err)
 	}
-	als, err := c.search.SearchAlbum(r.Context(), sp.query, sp.albumOffset, sp.albumCount)
+	albums, err := c.ds.Album(ctx).Search(q, sp.albumOffset, sp.albumCount)
 	if err != nil {
-		log.Error(r, "Error searching for Albums", err)
+		log.Error(ctx, "Error searching for Albums", err)
 	}
-	mfs, err := c.search.SearchSong(r.Context(), sp.query, sp.songOffset, sp.songCount)
+	mediaFiles, err := c.ds.MediaFile(ctx).Search(q, sp.songOffset, sp.songCount)
 	if err != nil {
-		log.Error(r, "Error searching for MediaFiles", err)
+		log.Error(ctx, "Error searching for MediaFiles", err)
 	}
 
-	log.Debug(r, fmt.Sprintf("Search resulted in %d songs, %d albums and %d artists", len(mfs), len(als), len(as)), "query", sp.query)
-	return mfs, als, as
+	log.Debug(ctx, fmt.Sprintf("Search resulted in %d songs, %d albums and %d artists",
+		len(mediaFiles), len(albums), len(artists)), "query", sp.query)
+	return mediaFiles, albums, artists
 }
 
 func (c *SearchingController) Search2(w http.ResponseWriter, r *http.Request) (*responses.Subsonic, error) {
@@ -71,9 +77,19 @@ func (c *SearchingController) Search2(w http.ResponseWriter, r *http.Request) (*
 
 	response := newResponse()
 	searchResult2 := &responses.SearchResult2{}
-	searchResult2.Artist = toArtists(as)
-	searchResult2.Album = toChildren(r.Context(), als)
-	searchResult2.Song = toChildren(r.Context(), mfs)
+	searchResult2.Artist = make([]responses.Artist, len(as))
+	for i, artist := range as {
+		searchResult2.Artist[i] = responses.Artist{
+			Id:         artist.ID,
+			Name:       artist.Name,
+			AlbumCount: artist.AlbumCount,
+		}
+		if artist.Starred {
+			searchResult2.Artist[i].Starred = &artist.StarredAt
+		}
+	}
+	searchResult2.Album = childrenFromAlbums(r.Context(), als)
+	searchResult2.Song = childrenFromMediaFiles(r.Context(), mfs)
 	response.SearchResult2 = searchResult2
 	return response, nil
 }
@@ -88,19 +104,18 @@ func (c *SearchingController) Search3(w http.ResponseWriter, r *http.Request) (*
 	response := newResponse()
 	searchResult3 := &responses.SearchResult3{}
 	searchResult3.Artist = make([]responses.ArtistID3, len(as))
-	for i, e := range as {
+	for i, artist := range as {
 		searchResult3.Artist[i] = responses.ArtistID3{
-			Id:         e.Id,
-			Name:       e.Title,
-			CoverArt:   e.CoverArt,
-			AlbumCount: e.AlbumCount,
+			Id:         artist.ID,
+			Name:       artist.Name,
+			AlbumCount: artist.AlbumCount,
 		}
-		if !e.Starred.IsZero() {
-			searchResult3.Artist[i].Starred = &e.Starred
+		if artist.Starred {
+			searchResult3.Artist[i].Starred = &artist.StarredAt
 		}
 	}
-	searchResult3.Album = toAlbums(r.Context(), als)
-	searchResult3.Song = toChildren(r.Context(), mfs)
+	searchResult3.Album = childrenFromAlbums(r.Context(), als)
+	searchResult3.Song = childrenFromMediaFiles(r.Context(), mfs)
 	response.SearchResult3 = searchResult3
 	return response, nil
 }
diff --git a/server/subsonic/wire_gen.go b/server/subsonic/wire_gen.go
index e4eeb900a..c635a85ee 100644
--- a/server/subsonic/wire_gen.go
+++ b/server/subsonic/wire_gen.go
@@ -42,8 +42,8 @@ func initPlaylistsController(router *Router) *PlaylistsController {
 }
 
 func initSearchingController(router *Router) *SearchingController {
-	search := router.Search
-	searchingController := NewSearchingController(search)
+	dataStore := router.DataStore
+	searchingController := NewSearchingController(dataStore)
 	return searchingController
 }
 
@@ -84,6 +84,5 @@ var allProviders = wire.NewSet(
 	NewUsersController,
 	NewMediaRetrievalController,
 	NewStreamController,
-	NewBookmarksController, wire.FieldsOf(new(*Router), "Artwork", "ListGenerator", "Playlists", "Scrobbler",
-		"Search", "Streamer", "Archiver", "DataStore"),
+	NewBookmarksController, wire.FieldsOf(new(*Router), "Artwork", "ListGenerator", "Playlists", "Scrobbler", "Streamer", "Archiver", "DataStore"),
 )
diff --git a/server/subsonic/wire_injectors.go b/server/subsonic/wire_injectors.go
index 00eb306ad..2a621d978 100644
--- a/server/subsonic/wire_injectors.go
+++ b/server/subsonic/wire_injectors.go
@@ -17,8 +17,7 @@ var allProviders = wire.NewSet(
 	NewMediaRetrievalController,
 	NewStreamController,
 	NewBookmarksController,
-	wire.FieldsOf(new(*Router), "Artwork", "ListGenerator", "Playlists", "Scrobbler",
-		"Search", "Streamer", "Archiver", "DataStore"),
+	wire.FieldsOf(new(*Router), "Artwork", "ListGenerator", "Playlists", "Scrobbler", "Streamer", "Archiver", "DataStore"),
 )
 
 func initSystemController(router *Router) *SystemController {