public boolean changeOK(Moveable me, Moveable fOld, Moveable fNew, Moveable bNew) {

    // fOld: front veh on old lane;
    // fNew,bNew: front,back vehicle on new lane;

    double gapFront = fNew.position() - me.position() - me.length();
    if (gapFront <= gapMin) {
      return false;
    }
    double gapBack = me.position() - bNew.position() - bNew.length();
    if (gapBack <= gapMin) {
      return false;
    }

    // safety criterion (a>-bsave);
    double bNew_acc = bNew.model().calcAcc(bNew, me);
    if (bNew_acc < -bsave) {
      return false;
    }
    double my_acc = me.model().calcAcc(me, fNew);
    if (my_acc < -bsaveSelf) {
      return false;
    }

    // incentive criterion (always model of BACK vehicle used!!)
    // works also for on-ramp: on-ramp has 1 lane with index 0
    // === LEFT on main road -> strong desired to change =
    // large positive biasRight for lcModel of ramp vehicles

    double my_adv =
        my_acc - me.model().calcAcc(me, fOld) + ((me.lane() == LEFT) ? 1 : -1) * biasRight;

    double others_disadv = bNew.model().calcAcc(bNew, fNew) - bNew_acc;

    if (others_disadv < 0) {
      others_disadv = 0;
    }
    return my_adv - p * others_disadv > db ? true : false;
  }