diff --git a/src/gl/data/gl_vertexbuffer.cpp b/src/gl/data/gl_vertexbuffer.cpp
index a1d553e15..01c7ee3b9 100644
--- a/src/gl/data/gl_vertexbuffer.cpp
+++ b/src/gl/data/gl_vertexbuffer.cpp
@@ -114,9 +114,9 @@ FFlatVertexBuffer::FFlatVertexBuffer()
 
 	glBindVertexArray(vao_id);
 	glBindBuffer(GL_ARRAY_BUFFER, vbo_id);
-	glVertexPointer(3,GL_FLOAT, sizeof(FFlatVertex), &VTO->x);
+	glVertexAttribPointer(VATTR_VERTEX, 3,GL_FLOAT, false, sizeof(FFlatVertex), &VTO->x);
 	glVertexAttribPointer(VATTR_TEXCOORD, 2,GL_FLOAT, false, sizeof(FFlatVertex), &VTO->u);
-	glEnableClientState(GL_VERTEX_ARRAY);
+	glEnableVertexAttribArray(VATTR_VERTEX);
 	glEnableVertexAttribArray(VATTR_TEXCOORD);
 	glBindVertexArray(0);
 }
diff --git a/src/gl/models/gl_models.cpp b/src/gl/models/gl_models.cpp
index e779cb0c9..3d2d0db05 100644
--- a/src/gl/models/gl_models.cpp
+++ b/src/gl/models/gl_models.cpp
@@ -116,7 +116,7 @@ FModelVertexBuffer::FModelVertexBuffer()
 	glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo_id);
 	glBufferData(GL_ELEMENT_ARRAY_BUFFER,ibo_shadowdata.Size() * sizeof(unsigned int), &ibo_shadowdata[0], GL_STATIC_DRAW);
 
-	glEnableClientState(GL_VERTEX_ARRAY);
+	glEnableVertexAttribArray(VATTR_VERTEX);
 	glEnableVertexAttribArray(VATTR_TEXCOORD);
 	glEnableVertexAttribArray(VATTR_VERTEX2);
 	glBindVertexArray(0);
@@ -140,7 +140,7 @@ FModelVertexBuffer::~FModelVertexBuffer()
 
 unsigned int FModelVertexBuffer::SetupFrame(unsigned int frame1, unsigned int frame2, float factor)
 {
-	glVertexPointer(3, GL_FLOAT, sizeof(FModelVertex), &VMO[frame1].x);
+	glVertexAttribPointer(VATTR_VERTEX, 3, GL_FLOAT, false, sizeof(FModelVertex), &VMO[frame1].x);
 	glVertexAttribPointer(VATTR_TEXCOORD, 2, GL_FLOAT, false, sizeof(FModelVertex), &VMO[frame1].u);
 	glVertexAttribPointer(VATTR_VERTEX2, 3, GL_FLOAT, false, sizeof(FModelVertex), &VMO[frame2].x);
 	return frame1;
diff --git a/src/gl/scene/gl_skydome.cpp b/src/gl/scene/gl_skydome.cpp
index 0b902bba0..a2c0cf981 100644
--- a/src/gl/scene/gl_skydome.cpp
+++ b/src/gl/scene/gl_skydome.cpp
@@ -80,10 +80,10 @@ FSkyVertexBuffer::FSkyVertexBuffer()
 
 	glBindVertexArray(vao_id);
 	glBindBuffer(GL_ARRAY_BUFFER, vbo_id);
-	glVertexPointer(3, GL_FLOAT, sizeof(FSkyVertex), &VSO->x);
+	glVertexAttribPointer(VATTR_VERTEX, 3, GL_FLOAT, false, sizeof(FSkyVertex), &VSO->x);
 	glVertexAttribPointer(VATTR_TEXCOORD, 2, GL_FLOAT, false, sizeof(FSkyVertex), &VSO->u);
 	glVertexAttribPointer(VATTR_COLOR, 4, GL_UNSIGNED_BYTE, true, sizeof(FSkyVertex), &VSO->color);
-	glEnableClientState(GL_VERTEX_ARRAY);
+	glEnableVertexAttribArray(VATTR_VERTEX);
 	glEnableVertexAttribArray(VATTR_TEXCOORD);
 	glEnableVertexAttribArray(VATTR_COLOR);
 	glBindVertexArray(0);
diff --git a/src/gl/shaders/gl_shader.cpp b/src/gl/shaders/gl_shader.cpp
index 86f4ec928..2ce815500 100644
--- a/src/gl/shaders/gl_shader.cpp
+++ b/src/gl/shaders/gl_shader.cpp
@@ -158,6 +158,7 @@ bool FShader::Load(const char * name, const char * vert_prog_lump, const char *
 	glAttachShader(hShader, hVertProg);
 	glAttachShader(hShader, hFragProg);
 
+	glBindAttribLocation(hShader, VATTR_VERTEX, "aPosition");
 	glBindAttribLocation(hShader, VATTR_TEXCOORD, "aTexCoord");
 	glBindAttribLocation(hShader, VATTR_COLOR, "aColor");
 	glBindAttribLocation(hShader, VATTR_VERTEX2, "aVertex2");
diff --git a/wadsrc/static/shaders/glsl/main.vp b/wadsrc/static/shaders/glsl/main.vp
index 7c62f77f8..eab0e1ab2 100644
--- a/wadsrc/static/shaders/glsl/main.vp
+++ b/wadsrc/static/shaders/glsl/main.vp
@@ -1,4 +1,5 @@
 
+in vec4 aPosition;
 in vec2 aTexCoord;
 in vec4 aColor;
 #ifndef SIMPLE	// we do not need these for simple shaders
@@ -24,13 +25,13 @@ void main()
 	if (gl_MultiTexCoord0.x >= 100000.0)
 	{
 		int fakeVI = int(aTexCoord.y)*5;
-		vert = gl_Vertex + vec4(fakeVB[fakeVI], fakeVB[fakeVI+1], fakeVB[fakeVI+2], 0.0);
+		vert = aPosition + vec4(fakeVB[fakeVI], fakeVB[fakeVI+1], fakeVB[fakeVI+2], 0.0);
 		tc = vec4(fakeVB[fakeVI+3], fakeVB[fakeVI+4], 0.0, 0.0);
 	}
 	else
 #endif
 	{
-		vert = gl_Vertex;
+		vert = aPosition;
 		tc = vec4(aTexCoord, 0.0, 0.0);
 	}