anchor.diff:    Ranger.OverlayLayer _loadingOverlay;
     Ranger.SpriteImage _overlaySpinner;
   
  -  // Center Zone = scroll ring
  +  // Center Zone = auto scroll ring
     double centerZoneRadius = 0.0;  // computed below
  -  SingleRangeZone _centerZone;
  +
     StreamSubscription _centerZoneSubscription;
  -
  +  bool autoScrollEnabled = true;
  +  
     Vector2 shipHudPosition = new Vector2.zero();
     Vector2 zoneEdgePosition = new Vector2.zero();
     Vector2 scrollDirection = new Vector2.zero();
  -
  -  static const double DampingMax = 0.2;
  -  static const double DampingMin = 0.1;
  -  double damping = DampingMax;
  -  double dampingFalloff = 0.05;
  -  bool _dampingEnabled = true;
  +  Vector2 hudOrigin = new Vector2.zero();
  +
  +  AutoScroll autoScroll;
     
     HudLayer();
   
  
positive.code:     key.setPosition(0.0, -270.0);
      key.uniformScale = 3.0;
      _help.addChild(key, 10, 111);
  
      _setViewportAABBox();
  
      _listTag = _loadImage("resources/list.svg", 32, 32,
          hWdith - (hWdith * .7), hHeight - (hHeight * .1), false);
  
      _configOverlay();
  
      _configureZones();
      
      scheduleUpdate();
    }
    
    @override
    void onExit() {
      super.onExit();
      Ranger.Application app = Ranger.Application.instance;
      app.animations.stop(_listSprite, Ranger.TweenAnimation.ROTATE);
      app.animations.stop(_messageText, Ranger.TweenAnimation.TRANSLATE_Y);
    }
  
    void toggleHelp() {
      _help.visible = !_help.visible;
    }
    
    bool get dampingEnabled => _dampingEnabled;
    set dampingEnabled(bool b) {
      _dampingEnabled = b;
      
      if (dampingEnabled)
        _messageText.text = "Scroll damping turned on.";
      else
        _messageText.text = "Scroll damping turned off.";
  
negative.code:     animateMessage();
    }
    
    Ranger.Vector2P getHudOriginToGameSpace() {
      GameManager gm = GameManager.instance;
      Ranger.Vector2P worldP = convertToWorldSpace(hudOrigin);
      Ranger.Vector2P gameP = gm.zoomControl.convertWorldToNodeSpace(worldP.v);
      worldP.moveToPool();
      return gameP;
    }
    
    Ranger.Vector2P getHudDelta(Vector2 prevShipPosition, Vector2 currentShipPosition) {
      GameManager gm = GameManager.instance;
  
      Ranger.Vector2P pw1 = gm.zoomControl.convertToWorldSpace(prevShipPosition);
      Ranger.Vector2P hud1P = convertWorldToNodeSpace(pw1.v);
  
      Ranger.Vector2P pw2 = gm.zoomControl.convertToWorldSpace(currentShipPosition);
      Ranger.Vector2P hud2P = convertWorldToNodeSpace(pw2.v);
  
      pw1.moveToPool();
      pw2.moveToPool();
      
      hud1P.v.sub(hud2P.v);
      
      hud2P.moveToPool();
      
      return hud1P;
    }
    
    int _loadImage(String resource, int width, int height, double px, double py, [bool simulateLoadingDelay = false]) {
      Ranger.Application app = Ranger.Application.instance;
      Resources resources = GameManager.instance.resources;
  