Program: 99115
Project: 99115
Buggy source:
private void drawTerrain(Terrain terrain){
  Matrix4 tmm1=new Matrix4();
  tmm1.setTranslation(terrain.localTranslation);
  Matrix4 tmm=Matrix4.multiply(modelViewMatrix,tmm1);
  Matrix3 nm=new Matrix3();
  Matrix3.createNormalMatrix(nm,tmm);
  ArrayList<Light> ls=new ArrayList<Light>();
  ls.addAll(lights);
  ShaderProgram shaderProgram=Shader.DIFFUSE.getProgram(5);
  int program=shaderProgram.getProgramID();
  GLES20.glUseProgram(program);
  setLightUniform(program,ls);
  float[] tm=new float[16];
  projectionMatrix.copyTo(tm);
  GLES20.glUniformMatrix4fv(GLES20.glGetUniformLocation(program,"String_Node_Str"),1,false,tm,0);
  float[] tm1=new float[16];
  tmm.copyTo(tm1);
  GLES20.glUniformMatrix4fv(GLES20.glGetUniformLocation(program,"String_Node_Str"),1,false,tm1,0);
  float[] tm2=new float[9];
  nm.copyTo(tm2);
  GLES20.glUniformMatrix3fv(GLES20.glGetUniformLocation(program,"String_Node_Str"),1,false,tm2,0);
  GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
  GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,terrain.getBaseTexture().getTextureBuffer());
  GLES20.glUniform1i(GLES20.glGetUniformLocation(program,"String_Node_Str"),0);
  GLES20.glActiveTexture(GLES20.GL_TEXTURE1);
  GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,terrain.getNormalmap().getTextureBuffer());
  GLES20.glUniform1i(GLES20.glGetUniformLocation(program,"String_Node_Str"),1);
  GLES20.glActiveTexture(GLES20.GL_TEXTURE2);
  GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,terrain.getHeightmap().getTextureBuffer());
  GLES20.glUniform1i(GLES20.glGetUniformLocation(program,"String_Node_Str"),2);
  GLES20.glUniform3f(GLES20.glGetUniformLocation(program,"String_Node_Str"),terrain.getTerrainMaxHeight(),Plane.getInstance().getSegment(),terrain.getTerrainScale());
  int vh=GLES20.glGetAttribLocation(program,"String_Node_Str");
  GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER,Terrain.getTerrainBuffer(0));
  GLES20.glEnableVertexAttribArray(vh);
  GLES20.glVertexAttribPointer(vh,2,GLES20.GL_FLOAT,false,0,0);
  GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER,Terrain.getTerrainBuffer(1));
  GLES20.glDrawElements(GLES20.GL_TRIANGLES,Plane.getInstance().getIndicesCount(),GLES20.GL_UNSIGNED_INT,0);
  GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER,0);
  GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER,0);
  GLES20.glDisableVertexAttribArray(vh);
  GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,0);
}

Fixed version (ground truth):
private void drawTerrain(Terrain terrain){
  Matrix4 tmm1=new Matrix4();
  tmm1.setTranslation(terrain.getWorldMatrix().getTranslation());
  Matrix4 tmm=Matrix4.multiply(modelViewMatrix,tmm1);
  Matrix3 nm=new Matrix3();
  Matrix3.createNormalMatrix(nm,tmm);
  ArrayList<Light> ls=new ArrayList<Light>();
  ls.addAll(lights);
  ShaderProgram shaderProgram=Shader.DIFFUSE.getProgram(5);
  int program=shaderProgram.getProgramID();
  GLES20.glUseProgram(program);
  setLightUniform(program,ls);
  float[] tm=new float[16];
  projectionMatrix.copyTo(tm);
  GLES20.glUniformMatrix4fv(GLES20.glGetUniformLocation(program,"String_Node_Str"),1,false,tm,0);
  float[] tm1=new float[16];
  tmm.copyTo(tm1);
  GLES20.glUniformMatrix4fv(GLES20.glGetUniformLocation(program,"String_Node_Str"),1,false,tm1,0);
  float[] tm2=new float[9];
  nm.copyTo(tm2);
  GLES20.glUniformMatrix3fv(GLES20.glGetUniformLocation(program,"String_Node_Str"),1,false,tm2,0);
  GLES20.glActiveTexture(GLES20.GL_TEXTURE0);
  GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,terrain.getBaseTexture().getTextureBuffer());
  GLES20.glUniform1i(GLES20.glGetUniformLocation(program,"String_Node_Str"),0);
  GLES20.glActiveTexture(GLES20.GL_TEXTURE1);
  GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,terrain.getNormalmap().getTextureBuffer());
  GLES20.glUniform1i(GLES20.glGetUniformLocation(program,"String_Node_Str"),1);
  GLES20.glActiveTexture(GLES20.GL_TEXTURE2);
  GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,terrain.getHeightmap().getTextureBuffer());
  GLES20.glUniform1i(GLES20.glGetUniformLocation(program,"String_Node_Str"),2);
  GLES20.glUniform3f(GLES20.glGetUniformLocation(program,"String_Node_Str"),terrain.getTerrainMaxHeight(),Plane.getInstance().getSegment(),terrain.getTerrainScale());
  int vh=GLES20.glGetAttribLocation(program,"String_Node_Str");
  GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER,Terrain.getTerrainBuffer(0));
  GLES20.glEnableVertexAttribArray(vh);
  GLES20.glVertexAttribPointer(vh,2,GLES20.GL_FLOAT,false,0,0);
  GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER,Terrain.getTerrainBuffer(1));
  GLES20.glDrawElements(GLES20.GL_TRIANGLES,Plane.getInstance().getIndicesCount(),GLES20.GL_UNSIGNED_INT,0);
  GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER,0);
  GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER,0);
  GLES20.glDisableVertexAttribArray(vh);
  GLES20.glBindTexture(GLES20.GL_TEXTURE_2D,0);
}