diff --git a/modules/gfx/src/glwin_base.hh b/modules/gfx/src/glwin_base.hh
index 1e9029ec77430d95d5d4b2c0238f2757c6930602..69ce405252c271a4ba32f57467a5e0b0df484e58 100644
--- a/modules/gfx/src/glwin_base.hh
+++ b/modules/gfx/src/glwin_base.hh
@@ -36,6 +36,8 @@ public:
   virtual void DoRefresh() = 0;
 
   virtual void StatusMessage(const String& m) = 0;
+
+  virtual void SetStereo(bool s) = 0;
 };
 
 }}
diff --git a/modules/gfx/src/scene.cc b/modules/gfx/src/scene.cc
index 1b7304b5c9537d5a7d16e0152b684d76faad3393..0b62cbeb49b1038bf144b567a1899aefab166945 100644
--- a/modules/gfx/src/scene.cc
+++ b/modules/gfx/src/scene.cc
@@ -447,6 +447,8 @@ void Scene::RenderGL()
 
   if(stereo_==2 || stereo_==3) {
     render_interlaced_stereo();
+  } else if (stereo_==1) {
+    this->render_quad_buffered_stereo();
   } else {
     this->render_scene_with_glow();
   }
@@ -1047,13 +1049,14 @@ void Scene::SetFogOffsets(float no, float fo)
 void Scene::Stereo(unsigned int m)
 {
   if(m==1) {
-    // unsupported quad-buffer stereo
-    LOGN_ERROR("quad buffer stereo not supported");
-    stereo_=0;
+    stereo_=m;
+    if(win_) win_->SetStereo(true);
   } else if(m==2 || m==3) {
     stereo_=m;
+    if(win_) win_->SetStereo(false);
   } else {
     stereo_=0;
+    if(win_) win_->SetStereo(false);
   }
   RequestRedraw();
 }
@@ -1728,6 +1731,18 @@ void Scene::render_interlaced_stereo()
   glPopAttrib();
 }
 
-
+void Scene::render_quad_buffered_stereo()
+{
+  glDrawBuffer(GL_BACK);
+  glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
+  glDrawBuffer(GL_BACK_LEFT);
+  glClear(GL_DEPTH_BUFFER_BIT);
+  stereo_projection(stereo_==1 ? 1: 2);
+  this->render_scene_with_glow();
+  glDrawBuffer(GL_BACK_RIGHT);
+  glClear(GL_DEPTH_BUFFER_BIT);
+  stereo_projection(stereo_==1 ? 2 : 1);
+  this->render_scene_with_glow();
+}
 
 }} // ns
diff --git a/modules/gfx/src/scene.hh b/modules/gfx/src/scene.hh
index 655d207d991a56559ce7c9fd55524aa3d0301c93..c373f3e816a927d16b23d4eb83e7cbef19b3a435 100644
--- a/modules/gfx/src/scene.hh
+++ b/modules/gfx/src/scene.hh
@@ -405,6 +405,7 @@ private:
   void prep_blur();
   void stereo_projection(unsigned int view);
   void render_interlaced_stereo();
+  void render_quad_buffered_stereo();
   void render_scene_with_glow();
   bool IsNameAvailable(String name);
 };
diff --git a/modules/gui/src/gl_canvas.cc b/modules/gui/src/gl_canvas.cc
index cd563cc1fde6255c352a9e3cb96f215dd5dffda2..ebcbd0d38dd57ce21890229eda10f2b7da21bfb6 100644
--- a/modules/gui/src/gl_canvas.cc
+++ b/modules/gui/src/gl_canvas.cc
@@ -71,6 +71,12 @@ void GLCanvas::StatusMessage(const String& m)
   glwin_->StatusMessage(m);
 }
 
+void GLCanvas::SetStereo(bool s)
+{
+  QGLFormat f=this->format();
+  f.setStereo(s);
+  this->setFormat(f);
+}
 
 void GLCanvas::OnTransform(gfx::InputCommand com, int indx, 
                            gfx::TransformTarget trg, Real val)
diff --git a/modules/gui/src/gl_canvas.hh b/modules/gui/src/gl_canvas.hh
index 1b7f51f910460a0c15c4cb258b7ffa77904aaf8a..87137dcc1d10ca9d968221829dff29aba112ff9a 100644
--- a/modules/gui/src/gl_canvas.hh
+++ b/modules/gui/src/gl_canvas.hh
@@ -53,6 +53,7 @@ public:
   // gfx::GLWinBase interface
   virtual void DoRefresh();
   virtual void StatusMessage(const String& m);
+  virtual void SetStereo(bool s);
 
   // central point for sending input to the gfx layer
   void OnTransform(gfx::InputCommand, int indx,