diff --git a/modules/gfx/pymod/export_scene.cc b/modules/gfx/pymod/export_scene.cc
index 59098ea93c962890101edd9598b2618e9fb9aba0..89a5738cee543684eaf5d0d51cafd2913a7eaa26 100644
--- a/modules/gfx/pymod/export_scene.cc
+++ b/modules/gfx/pymod/export_scene.cc
@@ -135,6 +135,8 @@ void export_Scene()
     .add_property("bg",
                   &Scene::GetBackground, 
                   scene_set_bg1)
+    .add_property("bg_stereo_mode",&Scene::GetBackgroundStereoMode,&Scene::SetBackgroundStereoMode)
+    .add_property("bg_stereo_offset",&Scene::GetBackgroundStereoOffset,&Scene::SetBackgroundStereoOffset)
     .def("GetProjection",&Scene::GetProjection)
     .add_property("projection",&Scene::GetProjection)
     .def("GetInvertedProjection",&Scene::GetInvertedProjection)
diff --git a/modules/gfx/src/scene.cc b/modules/gfx/src/scene.cc
index 57faf873cc5ca163c9ccb1ded63c6a0be1c55c6b..ad80008a5b631d769381f24a3f3e329947824666 100644
--- a/modules/gfx/src/scene.cc
+++ b/modules/gfx/src/scene.cc
@@ -138,6 +138,8 @@ Scene::Scene():
   scene_right_tex_(),
   bg_mode_(0),
   update_bg_(false),
+  bg_stereo_mode_(false),
+  bg_stereo_offset_(20.0),
   bg_grad_(),
   bg_bm_(),
   bg_tex_(),
@@ -649,6 +651,20 @@ void Scene::SetBackground(const Bitmap& bm)
   RequestRedraw();
 }
 
+void Scene::SetBackgroundStereoMode(bool m)
+{
+  if(bg_stereo_mode_==m) return;
+  bg_stereo_mode_=m;
+  RequestRedraw();
+}
+
+void Scene::SetBackgroundStereoOffset(float o)
+{
+  if(bg_stereo_offset_==o) return;
+  bg_stereo_offset_=o;
+  RequestRedraw();
+}
+
 Color Scene::GetBackground() const
 {
   return background_;
@@ -2075,6 +2091,26 @@ namespace {
         glEnd();
       }
 
+      void DrawStereoTex(GLuint tex_id, int w, int h, float x_offset) {
+        glEnable(GL_TEXTURE_2D);
+#if OST_SHADER_SUPPORT_ENABLED
+        if(OST_GL_VERSION_2_0) {
+          glActiveTexture(GL_TEXTURE0);
+        }
+#endif
+        glBindTexture(GL_TEXTURE_2D, tex_id);
+        glColor3f(0.0,0.0,0.0);
+        glBegin(GL_QUADS);
+        float fracw = 0.5*static_cast<float>(vp_width_)/static_cast<float>(w);
+        float frach = 0.5*static_cast<float>(vp_height_)/static_cast<float>(h);
+        float xo = -x_offset/static_cast<float>(vp_width_);
+        glTexCoord2f(-fracw+xo,-frach); glVertex3i(0,0,1);
+        glTexCoord2f(-fracw+xo,frach); glVertex3i(0,vp_height_,1);
+        glTexCoord2f(fracw+xo,frach); glVertex3i(vp_width_,vp_height_,1);
+        glTexCoord2f(fracw+xo,-frach); glVertex3i(vp_width_,0,1);
+        glEnd();
+     }
+
       ~ViewportRenderer() {
         glBindTexture(GL_TEXTURE_2D, 0);
         glDisable(GL_TEXTURE_2D);
@@ -2094,7 +2130,20 @@ namespace {
 #endif
       }
   };
-}
+
+  double unproj_x() {
+    GLdouble gl_mmat[]={1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1};
+    GLdouble gl_pmat[16];
+    glGetDoublev(GL_PROJECTION_MATRIX,gl_pmat);
+    GLint gl_vp[]={0,0,1,1};
+
+    double res[3];
+    gluUnProject(0.5,0.5,1.0,
+                 gl_mmat,gl_pmat,gl_vp,
+                 &res[0],&res[1],&res[2]);
+    return res[0];
+  }
+} // anon ns
 
 void Scene::render_bg()
 {
@@ -2106,9 +2155,16 @@ void Scene::render_bg()
     update_bg_=false;
   }
 
+  //double zfar_x_offset=unproj_x();
+  float zfar_x_offset=static_cast<float>(stereo_eye_)*bg_stereo_offset_;
   {
+    // this goes to orthogonal display mode
     ViewportRenderer vpr(vp_width_,vp_height_);
-    vpr.DrawTex(bg_tex_);
+    if(bg_stereo_mode_) {
+      vpr.DrawStereoTex(bg_tex_,bg_bm_.width,bg_bm_.height, zfar_x_offset);
+    } else {
+      vpr.DrawTex(bg_tex_);
+    }
     // dtor takes care of the rest
   }
 
diff --git a/modules/gfx/src/scene.hh b/modules/gfx/src/scene.hh
index 4b9483666a18a62929e87b0c3bf3213f4b702a66..0980ce561c69b1d31097458d6cb40ff6c2a91868 100644
--- a/modules/gfx/src/scene.hh
+++ b/modules/gfx/src/scene.hh
@@ -350,6 +350,15 @@ class DLLEXPORT_OST_GFX Scene {
   /// \brief get background color
   Color GetBackground() const;
 
+  /// \brief use bg bitmap for stereo mode
+  /// this tiles the background bitmap at the far plane
+  void SetBackgroundStereoMode(bool);
+  bool GetBackgroundStereoMode() const {return bg_stereo_mode_;}
+
+  /// background tile left/right offset
+  void SetBackgroundStereoOffset(float);
+  float GetBackgroundStereoOffset() const {return bg_stereo_offset_;}
+
   /// \brief center rotation on the given point
   void SetCenter(const geom::Vec3& cen);
   
@@ -594,12 +603,14 @@ private:
   unsigned int stereo_mode_;
   unsigned int stereo_alg_;
   bool stereo_inverted_;
-  unsigned int stereo_eye_;
+  int stereo_eye_;
   Real stereo_iod_,stereo_distance_;
   unsigned int scene_left_tex_;
   unsigned int scene_right_tex_;
   unsigned int bg_mode_;
   bool update_bg_;
+  bool bg_stereo_mode_;
+  float bg_stereo_offset_;
   Gradient bg_grad_;
   Bitmap bg_bm_;
   unsigned int bg_tex_;