diff --git a/api/media_retrieval.go b/api/media_retrieval.go
index 414334556..5f3537698 100644
--- a/api/media_retrieval.go
+++ b/api/media_retrieval.go
@@ -40,7 +40,7 @@ func (c *MediaRetrievalController) GetCoverArt() {
 	switch {
 	case err == domain.ErrNotFound:
 		beego.Error(err, "Id:", id)
-		c.SendError(responses.ErrorDataNotFound, "Directory not found")
+		c.SendError(responses.ErrorDataNotFound, "Cover not found")
 	case err != nil:
 		beego.Error(err)
 		c.SendError(responses.ErrorGeneric, "Internal Error")
diff --git a/engine/browser.go b/engine/browser.go
index 8cd4ebd05..2f22ea4ac 100644
--- a/engine/browser.go
+++ b/engine/browser.go
@@ -143,6 +143,7 @@ func (b *browser) buildAlbumDir(al *domain.Album, tracks domain.MediaFiles) *Dir
 		Created:    al.CreatedAt,
 		Year:       al.Year,
 		Genre:      al.Genre,
+		CoverArt:   al.CoverArtId,
 	}
 
 	dir.Entries = make(Entries, len(tracks))
diff --git a/engine/cover.go b/engine/cover.go
index cdb40ee41..5a10c0347 100644
--- a/engine/cover.go
+++ b/engine/cover.go
@@ -8,6 +8,7 @@ import (
 	_ "image/png"
 	"io"
 	"os"
+	"strings"
 
 	"github.com/deluan/gosonic/domain"
 	"github.com/dhowden/tag"
@@ -20,22 +21,44 @@ type Cover interface {
 
 type cover struct {
 	mfileRepo domain.MediaFileRepository
+	albumRepo domain.AlbumRepository
 }
 
-func NewCover(mr domain.MediaFileRepository) Cover {
-	return &cover{mr}
+func NewCover(mr domain.MediaFileRepository, alr domain.AlbumRepository) Cover {
+	return &cover{mr, alr}
+}
+
+func (c *cover) getCoverPath(id string) (string, error) {
+	switch {
+	case strings.HasPrefix(id, "al-"):
+		id = id[3:]
+		al, err := c.albumRepo.Get(id)
+		if err != nil {
+			return "", err
+		}
+		return al.CoverArtPath, nil
+	default:
+		mf, err := c.mfileRepo.Get(id)
+		if err != nil {
+			return "", err
+		}
+		if mf.HasCoverArt {
+			return mf.Path, nil
+		}
+	}
+	return "", domain.ErrNotFound
 }
 
 func (c *cover) Get(id string, size int, out io.Writer) error {
-	mf, err := c.mfileRepo.Get(id)
+	path, err := c.getCoverPath(id)
 	if err != nil && err != domain.ErrNotFound {
 		return err
 	}
 
 	var reader io.Reader
 
-	if err == nil && mf.HasCoverArt {
-		reader, err = readFromTag(mf.Path)
+	if err != domain.ErrNotFound {
+		reader, err = readFromTag(path)
 	} else {
 		var f *os.File
 		f, err = os.Open("static/default_cover.jpg")
diff --git a/engine/cover_test.go b/engine/cover_test.go
index aeab41445..953713db6 100644
--- a/engine/cover_test.go
+++ b/engine/cover_test.go
@@ -17,8 +17,9 @@ func TestCover(t *testing.T) {
 	Init(t, false)
 
 	mockMediaFileRepo := persistence.CreateMockMediaFileRepo()
+	mockAlbumRepo := persistence.CreateMockAlbumRepo()
 
-	cover := engine.NewCover(mockMediaFileRepo)
+	cover := engine.NewCover(mockMediaFileRepo, mockAlbumRepo)
 	out := new(bytes.Buffer)
 
 	Convey("Subject: GetCoverArt Endpoint", t, func() {
@@ -70,6 +71,16 @@ func TestCover(t *testing.T) {
 				So(img.Bounds().Max.Y, ShouldEqual, 100)
 			})
 		})
+		Convey("When id is for an album", func() {
+			mockAlbumRepo.SetData(`[{"Id":"1","CoverArtPath":"tests/fixtures/01 Invisible (RED) Edit Version.mp3"}]`, 1)
+			err := cover.Get("al-1", 0, out)
+
+			Convey("Then it should return the cover for the album", func() {
+				So(err, ShouldBeNil)
+				So(out.Bytes(), ShouldMatchMD5, "e859a71cd1b1aaeb1ad437d85b306668")
+			})
+		})
+
 		Reset(func() {
 			mockMediaFileRepo.SetData("[]", 0)
 			mockMediaFileRepo.SetError(false)
diff --git a/scanner/itunes_scanner.go b/scanner/itunes_scanner.go
index 09f20184d..55ba52a31 100644
--- a/scanner/itunes_scanner.go
+++ b/scanner/itunes_scanner.go
@@ -298,6 +298,7 @@ func (s *ItunesScanner) collectAlbums(t *itl.Track, mf *domain.MediaFile, ar *do
 
 	if mf.HasCoverArt {
 		al.CoverArtId = mf.Id
+		al.CoverArtPath = mf.Path
 	}
 
 	if al.PlayDate.IsZero() || t.PlayDateUTC.After(al.PlayDate) {