anchor.diff:          physics: AlwaysScrollableScrollPhysics(parent: BouncingScrollPhysics()),
           slivers: slivers,
         ),
  +    );
  +  }
  +}
  +
  +class DiscData {
  +  final int discNumber;
  +  final List<dto.Song> songs;
  +  DiscData(this.discNumber, this.songs) : assert(songs != null);
  +}
  +
  +class Disc extends StatelessWidget {
  +  final DiscData discData;
  +  final int discCount;
  +  final String albumArtwork;
  +
  +  Disc(this.discData, {this.discCount, this.albumArtwork, Key key})
  +      : assert(discData != null),
  +        assert(discCount != null),
  +        super(key: key);
  +
  +  @override
  +  Widget build(BuildContext context) {
  +    var children = <Widget>[];
  +
  +    if (discCount > 1) {
  +      final discNumberLabel = discData.discNumber?.toString() ?? '?';
  +      final isFirstDisc = discData.discNumber == 1;
  +      children.add(
  +        Padding(
  +          padding: EdgeInsets.fromLTRB(16, isFirstDisc ? 8 : 24, 16, 0),
  +          child: Column(
  +            crossAxisAlignment: CrossAxisAlignment.stretch,
  +            children: [
  +              Text(
  +                'Disc $discNumberLabel',
  +                style: Theme.of(context).textTheme.bodyText2,
  +              ),
  +              Divider(),
  +            ],
  +          ),
  +        ),
  +      );
  +    }
  +
  +    children.addAll(discData.songs.map((song) => Song(song, albumArtwork)));
  +
  +    return Column(
  +      crossAxisAlignment: CrossAxisAlignment.stretch,
  +      children: children,
       );
     }
   }
  
positive.code:     // TODO loading spinner
      // TODO handle zero songs
      // TODO animate in
      // TODO multi-disc albums
  
      // Header
      slivers.add(SliverList(
        delegate: SliverChildListDelegate([
          Padding(
            padding: const EdgeInsets.all(16.0),
            child: DefaultTextStyle(
                style: Theme.of(context).textTheme.headline5, child: Text(widget.album.album ?? unknownAlbum)),
          ),
          Padding(
            padding: const EdgeInsets.fromLTRB(16.0, 0, 16.0, 16.0),
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.start,
              children: [
                DefaultTextStyle(
                    style: Theme.of(context).textTheme.bodyText2, child: Text(widget.album.artist ?? unknownArtist)),
                DefaultTextStyle(
                    style: Theme.of(context).textTheme.caption, child: Text(widget.album.year?.toString() ?? '')),
              ],
            ),
          ),
  
negative.code: 
      // Content
      if (_songs != null) {
        final discs = _splitIntoDiscs(_songs);
        for (var disc in discs) {
          slivers.add(SliverList(
            delegate: SliverChildListDelegate([
              Disc(
                disc,
                discCount: discs.length,
                albumArtwork: widget.album.artwork,
              )
            ]),
          ));
        }
      }
  
      return Scaffold(
  