Program: 97003
Project: 97003
Buggy source:
/** 
 * Starts the game. Initiates the game life-cycle and starts the main game-loop.
 */
public void start(){
  running=true;
  Display.create();
  Display.show();
  init();
  final double frameTime=1.0 / targetUPS;
  double currentTime;
  double previousTime;
  double elapsed;
  double lag=0;
  double lastUPSUpdate=0;
  double lastFPSUpdate=0;
  int updatesProcessed=0;
  int framesProcessed=0;
  previousTime=TimeUtils.currentSeconds();
  while (true) {
    if (Display.isCloseRequested() || !isRunning())     break;
    if (Display.wasResized()) {
      GL3Context.viewport(0,0,Display.getWidth(),Display.getHeight());
      resize();
    }
    currentTime=TimeUtils.currentSeconds();
    elapsed=currentTime - previousTime;
    lag+=elapsed;
    while (lag > frameTime) {
      Keyboard.startEventFrame();
      Mouse.startEventFrame();
      update((float)elapsed);
      GameTimer.updateTimers((float)elapsed);
      Keyboard.clearEventFrame();
      Mouse.clearEventFrame();
      updatesProcessed++;
      lag-=frameTime;
      if (currentTime - lastUPSUpdate >= 1000) {
        ups=updatesProcessed;
        updatesProcessed=0;
        lastUPSUpdate=currentTime;
      }
    }
    float lagOffset=(float)(lag / frameTime);
    GL3Context.clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    Texture.setActiveUnit(0);
    render(lagOffset,batcher);
    framesProcessed++;
    if (currentTime - lastFPSUpdate >= 1000) {
      fps=framesProcessed;
      framesProcessed=0;
      lastFPSUpdate=currentTime;
    }
    Display.update();
    previousTime=currentTime;
  }
  batcher.dispose();
  dispose();
  Display.destroy();
}

Fixed version (ground truth):
/** 
 * Starts the game. Initiates the game life-cycle and starts the main game-loop.
 */
public void start(){
  running=true;
  Display.create();
  Display.show();
  System.out.println(glGetString(GL_VERSION));
  init();
  final double frameTime=1.0 / targetUPS;
  double currentTime;
  double previousTime;
  double elapsed;
  double lag=0;
  double lastUPSUpdate=0;
  double lastFPSUpdate=0;
  int updatesProcessed=0;
  int framesProcessed=0;
  previousTime=TimeUtils.currentSeconds();
  while (true) {
    if (Display.isCloseRequested() || !isRunning())     break;
    if (Display.wasResized()) {
      GL3Context.viewport(0,0,Display.getWidth(),Display.getHeight());
      resize();
    }
    currentTime=TimeUtils.currentSeconds();
    elapsed=currentTime - previousTime;
    lag+=elapsed;
    while (lag > frameTime) {
      Keyboard.startEventFrame();
      Mouse.startEventFrame();
      update((float)elapsed);
      GameTimer.updateTimers((float)elapsed);
      Keyboard.clearEventFrame();
      Mouse.clearEventFrame();
      updatesProcessed++;
      lag-=frameTime;
      if (currentTime - lastUPSUpdate >= 1000) {
        ups=updatesProcessed;
        updatesProcessed=0;
        lastUPSUpdate=currentTime;
      }
    }
    float lagOffset=(float)(lag / frameTime);
    GL3Context.clear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
    Texture.setActiveUnit(0);
    render(lagOffset,batcher);
    framesProcessed++;
    if (currentTime - lastFPSUpdate >= 1000) {
      fps=framesProcessed;
      framesProcessed=0;
      lastFPSUpdate=currentTime;
    }
    Display.update();
    previousTime=currentTime;
  }
  batcher.dispose();
  dispose();
  Display.destroy();
}