anchor.diff:  class _QueuePageState extends State<QueuePage> with SingleTickerProviderStateMixin {
     // Keep a local copy of the queue so we can re-order without waiting for communication with background service
     // Directly reflecting AudioService.queueStream in the UI leads to flicker when finishing a drag and drop
  -  List<MediaItem> queue;
  +  QueueState localState;
   
     @override
     void initState() {
       super.initState();
  -    AudioService.queueStream.listen((newQueue) {
  +    _queueStateStream.listen((newState) {
         setState(() {
  -        queue = newQueue;
  +        localState = newState;
         });
       });
  -    queue = AudioService.queue;
  +    localState = QueueState(AudioService.queue, AudioService.currentMediaItem);
  +    // TODO autoscroll to current song?
     }
   
     @override
  
positive.code:   }
  }
  
  Widget _songWidget(MediaItem mediaItem) {
    final dto.Song song = mediaItem.toSong();
    return ListTile(
      key: Key(mediaItem.id),
      leading: ListThumbnail(song.artwork),
      title: Text(song.formatTitle(), overflow: TextOverflow.ellipsis),
      subtitle: Text(song.formatArtist(), overflow: TextOverflow.ellipsis),
      trailing: Icon(Icons.more_vert),
      dense: true,
    );
  
negative.code: import 'package:polaris/foreground/ui/utils/format.dart';
  import 'package:polaris/foreground/ui/strings.dart';
  import 'package:polaris/shared/media_item.dart';
  import 'package:rxdart/rxdart.dart';
  
  final getIt = GetIt.instance;
  
  class QueueState {
    final List<MediaItem> queue;
    final MediaItem mediaItem;
  
    QueueState(this.queue, this.mediaItem);
  }
  
  Stream<QueueState> get _queueStateStream => Rx.combineLatest2<List<MediaItem>, MediaItem, QueueState>(
      AudioService.queueStream, AudioService.currentMediaItemStream, (queue, mediaItem) => QueueState(queue, mediaItem));
  
  class QueuePage extends StatefulWidget {
    @override
  