Index: trunk/src/gl/gl_device.cc
===================================================================
--- trunk/src/gl/gl_device.cc	(revision 41)
+++ trunk/src/gl/gl_device.cc	(revision 42)
@@ -7,4 +7,5 @@
 #include "nv/gl/gl_window.hh"
 #include "nv/gl/gl_program.hh"
+#include "nv/gl/gl_vertex_buffer.hh"
 #include "nv/logging.hh"
 #include "nv/lib/sdl12.hh"
@@ -50,4 +51,8 @@
 }
 
+vertex_buffer* gl_device::create_vertex_buffer( buffer_hint hint, int size, void* source /*= nullptr */ )
+{
+	return new gl_vertex_buffer( hint, size, source );
+}
 
 gl_device::~gl_device()
@@ -55,2 +60,3 @@
 	SDL_Quit();
 }
+
Index: trunk/src/gl/gl_enum.cc
===================================================================
--- trunk/src/gl/gl_enum.cc	(revision 41)
+++ trunk/src/gl/gl_enum.cc	(revision 42)
@@ -123,4 +123,15 @@
 }
 
+unsigned int nv::buffer_hint_to_enum( buffer_hint hint )
+{
+	switch( hint )
+	{
+	case STATIC_DRAW   : return GL_STATIC_DRAW;
+	case STREAM_DRAW   : return GL_STREAM_DRAW;
+	case DYNAMIC_DRAW  : return GL_DYNAMIC_DRAW;
+	default : return 0; // TODO: throw!
+	}
+}
+
 unsigned int nv::type_to_gl_enum( type type )
 {
Index: trunk/src/gl/gl_vertex_buffer.cc
===================================================================
--- trunk/src/gl/gl_vertex_buffer.cc	(revision 42)
+++ trunk/src/gl/gl_vertex_buffer.cc	(revision 42)
@@ -0,0 +1,41 @@
+// Copyright (C) 2012-2013 Kornel Kisielewicz
+// This file is part of NV Libraries.
+// For conditions of distribution and use, see copyright notice in nv.hh
+
+#include "nv/gl/gl_vertex_buffer.hh"
+
+#include "nv/lib/gl.hh"
+#include "nv/gl/gl_enum.hh"
+
+using namespace nv;
+
+gl_vertex_buffer::gl_vertex_buffer( buffer_hint hint, int size, void* data ) 
+	: vertex_buffer( hint, size ), m_name()
+{
+	if (data)
+	{
+		assign( data );
+	}
+}
+
+void gl_vertex_buffer::assign( void* data )
+{
+	glBindBuffer( GL_ARRAY_BUFFER, m_name.get_value() );
+	glBufferData( GL_ARRAY_BUFFER, m_size, data, buffer_hint_to_enum( m_hint ) );
+	glBindBuffer( GL_ARRAY_BUFFER, 0);
+}
+
+void gl_vertex_buffer::bind()
+{
+	glBindBuffer( GL_ARRAY_BUFFER, m_name.get_value() );
+}
+
+void gl_vertex_buffer::unbind()
+{
+	glBindBuffer( GL_ARRAY_BUFFER, 0 );
+}
+
+bool gl_vertex_buffer::is_valid() const
+{
+	return m_name.is_valid();
+}
