public void pieceMovedEvent(LOCATION from, LOCATION to) {
    // Handle 'from' position
    List<BoardFigure> list = figureMap.get(from);
    // Defensive programming - check that the framework user
    // has kept the invariant that there must be list
    // of all possible from fields.
    if (list == null) {
      throw new RuntimeException("BoardDrawing invariant not establised:"+
                                 " The FigureFactory has not defined a list"+
                                 " of BoardFigures for location "+from);
    }
    // we always moves the 'last' figure in the list of
    // figures on this location, as the following
    // repositioning will ensure all figures look
    // nice on the board.
    int index = list.size()-1;
    // get last figure
    BoardFigure f = list.get(index);
    // ... and remove it.
    list.remove(f);
    
    // next adjust the position of ALL pieces on
    // this location. handles that the user has
    // taken a piece 'in the middle' of e.g. backgammon
    // stack of pieces
    int posIndex = 0; 
    for ( BoardFigure ff : list ) {
      adjustFigurePosition(ff, from, posIndex++);
    }

    // next do the exact same with the to position
    List<BoardFigure> listTo = figureMap.get(to);

    // may be null if the appl developer has not generated
    // lists for empty locations.
    if ( listTo == null ) {
      listTo = new ArrayList<BoardFigure>();
      figureMap.put(to, listTo);
    }
    // and add the moved figure to it.
    listTo.add(f);
    
    // and adjust all pieces...
    posIndex = 0; 
    for ( BoardFigure ft : listTo ) {
      adjustFigurePosition(ft, to, posIndex++);
    }
  }