diff --git a/CMakeLists.txt b/CMakeLists.txt
index e65ba23237b81453d88e1b85698992d6ca26588f..03496411dcccee60289cb1a4b407abc9a6f0040e 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -33,6 +33,8 @@ option(ENABLE_GUI "whether the graphical user interface should be enabled"
        ON)
 option(ENABLE_GFX "whether graphics support should be enabled"
       ON)
+option(USE_MESA "use software rendered Mesa instead of hardware GL"
+      OFF)
 option(ENABLE_IMG "whether the image processing module should be compiled"
        ON)
 option(ENABLE_INFO "whether openstructure should be compiled with support for the info library"
@@ -187,7 +189,13 @@ if (ENABLE_INFO)
 endif()
 
 if (ENABLE_GFX)
-  find_package(OpenGL REQUIRED)
+  if(USE_MESA)
+    find_package(Mesa REQUIRED)
+    set(_USE_MESA ON)
+  else()
+    find_package(OpenGL REQUIRED)
+    set(_USE_MESA OFF)
+  endif()
 endif()
 
 if (ENABLE_IMG OR ENABLE_GFX)
@@ -283,6 +291,7 @@ message(STATUS
         "   Info support                    (-DENABLE_INFO) : ${_INFO}\n"
         "   Graphical interface              (-DENABLE_GUI) : ${_UI}\n"
         "   OpenGL support                   (-DENABLE_GFX) : ${_OPENGL}\n"
+        "   OpenGL via Mesa                  (-DUSE_MESA)   : ${_USE_MESA}\n"
         "   Image Processing support         (-DENABLE_IMG) : ${_IMG}\n"
         "   Shader support                   (-DUSE_SHADER) : ${_SHADER}\n"
         "   Numpy support                     (-DUSE_NUMPY) : ${_NUMPY}\n"
diff --git a/modules/config/CMakeLists.txt b/modules/config/CMakeLists.txt
index 1e637d14470c6aa77af76cdd6c58e5ad5561c180..a95554b40456f3339bbbea2a7ef6833e829b5592 100644
--- a/modules/config/CMakeLists.txt
+++ b/modules/config/CMakeLists.txt
@@ -16,6 +16,12 @@ else()
   set(shader_support 0)
 endif()
 
+if (USE_MESA)
+  set(mesa_support 1)
+else()
+  set(mesa_support 0)
+endif()
+
 if (USE_NUMPY)
   set(numpy_support 1)
 else()
diff --git a/modules/config/config.hh.in b/modules/config/config.hh.in
index c2242500ee2e528294c5beb77a5c650f9adfe288..3268ebab4144946b5d78fcd83f2b0f3d816a4832 100644
--- a/modules/config/config.hh.in
+++ b/modules/config/config.hh.in
@@ -24,6 +24,7 @@
 */
 
 #define OST_SHADER_SUPPORT_ENABLED @shader_support@
+#define OST_MESA_SUPPORT_ENABLED @mesa_support@
 #define OST_PROFILING_ENABLED @profiling_enabled@
 #define OST_ANIMATIONS_ENABLED @animations_enabled@
 #define OST_IMG_ENABLED @img_enabled@
diff --git a/modules/gfx/src/CMakeLists.txt b/modules/gfx/src/CMakeLists.txt
index 9309a6af7ebec7fed643e303a732bf1b0c53b4ab..6028b64f857c2fd6c25e9ef12b485cf40ae1182c 100644
--- a/modules/gfx/src/CMakeLists.txt
+++ b/modules/gfx/src/CMakeLists.txt
@@ -180,8 +180,13 @@ else()
 endif()
 
 if (UNIX AND NOT APPLE)
-  list(APPEND OST_GFX_SOURCES impl/glx_offscreen_buffer.cc)
-  list(APPEND OST_GFX_IMPL_HEADERS glx_offscreen_buffer.hh)
+  if(USE_MESA)
+    list(APPEND OST_GFX_SOURCES impl/mesa_offscreen_buffer.cc)
+    list(APPEND OST_GFX_IMPL_HEADERS mesa_offscreen_buffer.hh)
+  else()
+    list(APPEND OST_GFX_SOURCES impl/glx_offscreen_buffer.cc)
+    list(APPEND OST_GFX_IMPL_HEADERS glx_offscreen_buffer.hh)
+  endif()
 endif()
 
 if (APPLE)
@@ -200,13 +205,15 @@ if (USE_SHADER)
   list(APPEND OST_GFX_SOURCES impl/scene_fx.cc)
   list(APPEND OST_GFX_IMPL_HEADERS scene_fx.hh)
   if (NOT APPLE)
-    set(OST_GLEW_HEADERS
-       glew.h
-       glxew.h
-       wglew.h IN_DIR GL
-    )
-    list(APPEND OST_GFX_SOURCES GL/glew.c)
-    include_directories("${STAGE_DIR}/include/ost/gfx")
+    if (NOT USE_MESA)
+      set(OST_GLEW_HEADERS
+         glew.h
+         glxew.h
+         wglew.h IN_DIR GL
+      )
+      list(APPEND OST_GFX_SOURCES GL/glew.c)
+      include_directories("${STAGE_DIR}/include/ost/gfx")
+    endif()
   endif()  
 endif()
 
@@ -226,6 +233,9 @@ module(NAME gfx SOURCES ${OST_GFX_SOURCES} ${OST_GFX_MAP_SOURCES}
 include_directories(${PNG_INCLUDE_DIR} ${OPENGL_INCLUDE_DIR})
 
 # link against OpenGL and PNG libraries
+if(USE_MESA)
+  link_directories(${OPENGL_LIBRARY_DIR})
+endif()
 target_link_libraries(ost_gfx ${OPENGL_LIBRARIES} ${PNG_LIBRARIES})
 
 if (USE_SHADER)
diff --git a/modules/gfx/src/glext_include.hh b/modules/gfx/src/glext_include.hh
index 8188b1265d3c14a6002aca910e1aa183acc06027..183f6112cbd9bfb91bf57323faf759cad3e3918f 100644
--- a/modules/gfx/src/glext_include.hh
+++ b/modules/gfx/src/glext_include.hh
@@ -29,6 +29,12 @@
 #include <ost/config.hh>
 
 #if OST_SHADER_SUPPORT_ENABLED
+#ifdef OST_MESA_SUPPORT_ENABLED
+#  define OST_GL_VERSION_2_0 1
+#  define GL_GLEXT_PROTOTYPES 1
+#  include <GL/gl.h>
+#  include <GL/glext.h>
+#else
 #  if OST_MODULE==OST_GFX
 #    define GLEW_BUILD
 #  endif
@@ -39,6 +45,7 @@
 #    include <ost/gfx/GL/wglew.h>
 #  endif
 #endif
+#endif
 
 #include <ost/gfx/gl_include.hh>
 
@@ -53,3 +60,4 @@
 #endif
 #endif
 #endif
+
diff --git a/modules/gfx/src/offscreen_buffer.hh b/modules/gfx/src/offscreen_buffer.hh
index 2714cdbe06c6f778f0b67ccdc665de1bb0e63895..7b716c2f6610bf4e98d01450e3abd347a43d48ac 100644
--- a/modules/gfx/src/offscreen_buffer.hh
+++ b/modules/gfx/src/offscreen_buffer.hh
@@ -59,7 +59,11 @@ public:
 */
 
 #if defined(__linux__)
+#if OST_MESA_SUPPORT_ENABLED
+#include "impl/mesa_offscreen_buffer.hh"
+#else
 #include "impl/glx_offscreen_buffer.hh"
+#endif
 #elif defined(__APPLE__)
 #include "impl/cgl_offscreen_buffer.hh"
 #elif defined(_MSC_VER)
diff --git a/modules/gfx/src/shader.cc b/modules/gfx/src/shader.cc
index b09c41a700c8d2d0f6cbc3408fa293d5239033ae..c3b8b1d79ae42f3a58aeda6f1c8606a5bd8dc389 100644
--- a/modules/gfx/src/shader.cc
+++ b/modules/gfx/src/shader.cc
@@ -59,12 +59,14 @@ Shader::Shader():
 void Shader::PreGLInit() 
 {
 #if !defined(__APPLE__)
+#if !defined(OST_MESA_SUPPORT_ENABLED)
   GLenum err = glewInit();
   if (GLEW_OK != err) {
     LOG_ERROR("glew failure: " << glewGetErrorString(err));
     assert(false);
   }
 #endif
+#endif
 }
 
 bool Shader::Compile(std::string shader_name, std::string shader_code,