diff --git a/api/graphql/generated.go b/api/graphql/generated.go
index 00e9292..314438c 100644
--- a/api/graphql/generated.go
+++ b/api/graphql/generated.go
@@ -120,7 +120,7 @@ type ComplexityRoot struct {
 
 	Query struct {
 		Album      func(childComplexity int, id int) int
-		MyAlbums   func(childComplexity int, filter *models.Filter) int
+		MyAlbums   func(childComplexity int, filter *models.Filter, onlyRoot *bool, showEmpty *bool) int
 		MyPhotos   func(childComplexity int, filter *models.Filter) int
 		MyUser     func(childComplexity int) int
 		Photo      func(childComplexity int, id int) int
@@ -191,7 +191,7 @@ type QueryResolver interface {
 	SiteInfo(ctx context.Context) (*models.SiteInfo, error)
 	User(ctx context.Context, filter *models.Filter) ([]*models.User, error)
 	MyUser(ctx context.Context) (*models.User, error)
-	MyAlbums(ctx context.Context, filter *models.Filter) ([]*models.Album, error)
+	MyAlbums(ctx context.Context, filter *models.Filter, onlyRoot *bool, showEmpty *bool) ([]*models.Album, error)
 	Album(ctx context.Context, id int) (*models.Album, error)
 	MyPhotos(ctx context.Context, filter *models.Filter) ([]*models.Photo, error)
 	Photo(ctx context.Context, id int) (*models.Photo, error)
@@ -637,7 +637,7 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in
 			return 0, false
 		}
 
-		return e.complexity.Query.MyAlbums(childComplexity, args["filter"].(*models.Filter)), true
+		return e.complexity.Query.MyAlbums(childComplexity, args["filter"].(*models.Filter), args["onlyRoot"].(*bool), args["showEmpty"].(*bool)), true
 
 	case "Query.myPhotos":
 		if e.complexity.Query.MyPhotos == nil {
@@ -892,8 +892,14 @@ type Query {
   "Information about the currently logged in user"
   myUser: User!
 
-  "List of albums owned by the logged in user"
-  myAlbums(filter: Filter): [Album!]!
+  "List of albums owned by the logged in user."
+  myAlbums(
+    filter: Filter
+    "Return only albums from the root directory of the user"
+    onlyRoot: Boolean
+    "Return also albums with no photos directly in them"
+    showEmpty: Boolean
+  ): [Album!]!
   "Get album by id, user must own the album or be admin"
   album(id: Int!): Album!
 
@@ -1399,6 +1405,22 @@ func (ec *executionContext) field_Query_myAlbums_args(ctx context.Context, rawAr
 		}
 	}
 	args["filter"] = arg0
+	var arg1 *bool
+	if tmp, ok := rawArgs["onlyRoot"]; ok {
+		arg1, err = ec.unmarshalOBoolean2ᚖbool(ctx, tmp)
+		if err != nil {
+			return nil, err
+		}
+	}
+	args["onlyRoot"] = arg1
+	var arg2 *bool
+	if tmp, ok := rawArgs["showEmpty"]; ok {
+		arg2, err = ec.unmarshalOBoolean2ᚖbool(ctx, tmp)
+		if err != nil {
+			return nil, err
+		}
+	}
+	args["showEmpty"] = arg2
 	return args, nil
 }
 
@@ -3537,7 +3559,7 @@ func (ec *executionContext) _Query_myAlbums(ctx context.Context, field graphql.C
 	ctx = ec.Tracer.StartFieldResolverExecution(ctx, rctx)
 	resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) {
 		ctx = rctx // use context from middleware stack in children
-		return ec.resolvers.Query().MyAlbums(rctx, args["filter"].(*models.Filter))
+		return ec.resolvers.Query().MyAlbums(rctx, args["filter"].(*models.Filter), args["onlyRoot"].(*bool), args["showEmpty"].(*bool))
 	})
 	if err != nil {
 		ec.Error(ctx, err)
diff --git a/api/graphql/resolvers/album.go b/api/graphql/resolvers/album.go
index 9cf7752..2c75317 100644
--- a/api/graphql/resolvers/album.go
+++ b/api/graphql/resolvers/album.go
@@ -9,7 +9,7 @@ import (
 	"github.com/viktorstrate/photoview/api/graphql/models"
 )
 
-func (r *queryResolver) MyAlbums(ctx context.Context, filter *models.Filter) ([]*models.Album, error) {
+func (r *queryResolver) MyAlbums(ctx context.Context, filter *models.Filter, onlyRoot *bool, showEmpty *bool) ([]*models.Album, error) {
 	user := auth.UserFromContext(ctx)
 	if user == nil {
 		return nil, auth.ErrUnauthorized
@@ -20,13 +20,27 @@ func (r *queryResolver) MyAlbums(ctx context.Context, filter *models.Filter) ([]
 		return nil, err
 	}
 
-	rows, err := r.Database.Query(`
-		SELECT * FROM album WHERE owner_id = ? AND parent_album = (
-			SELECT album_id FROM album WHERE parent_album IS NULL
-		)
-	`+filterSQL, user.UserID)
-	if err != nil {
-		return nil, err
+	var rows *sql.Rows
+
+	filterEmpty := " AND EXISTS (SELECT * FROM photo WHERE album_id = album.album_id) "
+	if showEmpty != nil && *showEmpty == true {
+		filterEmpty = ""
+	}
+
+	if onlyRoot == nil || *onlyRoot == false {
+		rows, err = r.Database.Query("SELECT * FROM album WHERE owner_id = ?"+filterEmpty+filterSQL, user.UserID)
+		if err != nil {
+			return nil, err
+		}
+	} else {
+		rows, err = r.Database.Query(`
+			SELECT * FROM album WHERE owner_id = ? AND parent_album = (
+				SELECT album_id FROM album WHERE parent_album IS NULL
+			)
+		`+filterEmpty+filterSQL, user.UserID)
+		if err != nil {
+			return nil, err
+		}
 	}
 
 	albums, err := models.NewAlbumsFromRows(rows)
diff --git a/api/graphql/schema.graphql b/api/graphql/schema.graphql
index 065262f..54c15e9 100644
--- a/api/graphql/schema.graphql
+++ b/api/graphql/schema.graphql
@@ -22,8 +22,14 @@ type Query {
   "Information about the currently logged in user"
   myUser: User!
 
-  "List of albums owned by the logged in user"
-  myAlbums(filter: Filter): [Album!]!
+  "List of albums owned by the logged in user."
+  myAlbums(
+    filter: Filter
+    "Return only albums from the root directory of the user"
+    onlyRoot: Boolean
+    "Return also albums with no photos directly in them"
+    showEmpty: Boolean
+  ): [Album!]!
   "Get album by id, user must own the album or be admin"
   album(id: Int!): Album!
 
diff --git a/ui/package.json b/ui/package.json
index 39273a9..d05fd36 100644
--- a/ui/package.json
+++ b/ui/package.json
@@ -20,7 +20,7 @@
     "parcel-bundler": "^1.12.4",
     "prettier": "^1.19.1",
     "prop-types": "^15.7.2",
-    "react": "^16.9.0",
+    "react": "^16.12.0",
     "react-apollo": "^3.0.1",
     "react-dom": "^16.9.0",
     "react-lazyload": "^2.6.5",
diff --git a/ui/src/Pages/AllAlbumsPage/AlbumsPage.js b/ui/src/Pages/AllAlbumsPage/AlbumsPage.js
index 19cf778..a0b4ff2 100644
--- a/ui/src/Pages/AllAlbumsPage/AlbumsPage.js
+++ b/ui/src/Pages/AllAlbumsPage/AlbumsPage.js
@@ -6,7 +6,7 @@ import { Query } from 'react-apollo'
 
 const getAlbumsQuery = gql`
   query getMyAlbums {
-    myAlbums(filter: { order_by: "title" }) {
+    myAlbums(filter: { order_by: "title" }, onlyRoot: true, showEmpty: true) {
       id
       title
       thumbnail {
