diff --git a/modules/gfx/pymod/export_scene.cc b/modules/gfx/pymod/export_scene.cc
index 706767f8b2bfabffd6827e06c4aada663d986dc3..480b530a65b5a10bcc7698846c54444e4aff8b24 100644
--- a/modules/gfx/pymod/export_scene.cc
+++ b/modules/gfx/pymod/export_scene.cc
@@ -147,6 +147,9 @@ void export_Scene()
     .def("SetStereoIOD",&Scene::SetStereoIOD)
     .def("GetStereoIOD",&Scene::GetStereoIOD)
     .add_property("stereo_iod",&Scene::GetStereoIOD,&Scene::SetStereoIOD)
+    .def("SetStereoDistance",&Scene::SetStereoDistance)
+    .def("GetStereoDistance",&Scene::GetStereoDistance)
+    .add_property("stereo_distance",&Scene::GetStereoDistance,&Scene::SetStereoDistance)
     .def("SetStereoAlg",&Scene::SetStereoAlg)
     .def("GetStereoAlg",&Scene::GetStereoAlg)
     .add_property("stereo_alg",&Scene::GetStereoAlg,&Scene::SetStereoAlg)
diff --git a/modules/gfx/src/scene.cc b/modules/gfx/src/scene.cc
index 1574d5f509b871524a7b6e76674f18561316a059..eb9ffe8401cad5560b59e4d34e3ed330d18b4ec7 100644
--- a/modules/gfx/src/scene.cc
+++ b/modules/gfx/src/scene.cc
@@ -127,7 +127,8 @@ Scene::Scene():
   stereo_alg_(0),
   stereo_inverted_(false),
   stereo_eye_(0),
-  stereo_eye_dist_(40.0),
+  stereo_iod_(40.0),
+  stereo_distance_(100.0),
   scene_left_tex_(),
   scene_right_tex_()
 {
@@ -1311,19 +1312,23 @@ void Scene::SetStereoView(int m)
 
 void Scene::SetStereoIOD(float d)
 {
-  stereo_eye_dist_=d;
+  stereo_iod_=d;
   if(stereo_mode_>0) {
     RequestRedraw();
   }
 }
 
-void Scene::SetStereoAlg(unsigned int a)
+void Scene::SetStereoDistance(float d)
 {
-  if(a==0 || a==1) {
-    stereo_alg_=a;
-  } else {
-    stereo_alg_=0;
+  stereo_distance_=d;
+  if(stereo_mode_>0) {
+    RequestRedraw();
   }
+}
+
+void Scene::SetStereoAlg(unsigned int a)
+{
+  stereo_alg_=a;
   if(stereo_mode_>0) {
     RequestRedraw();
   }
@@ -1833,12 +1838,15 @@ void Scene::stereo_projection(int view)
   
   if(view!=0) {
     Real ff=(view<0 ? 1.0 : -1.0);
-    Real dist=-transform_.GetTrans()[2];
-    if(stereo_alg_==1) {
+    if(stereo_alg_==2 || stereo_alg_==3 || stereo_alg_==4) {
       // physically precise stereo with skew, does
       // not handle z translation well
       // the 100.0 comes from visual matching with mode 0 at a reasonable distance
-      Real iod2=100.0/stereo_eye_dist_;
+      Real dist = -transform_.GetTrans()[2];
+      if(stereo_alg_==3) dist=znear_;
+      else if(stereo_alg_==4) dist=stereo_distance_;
+
+      Real iod2=100.0/stereo_iod_;
       geom::Mat4 skew=geom::Transpose(geom::Mat4(1.0,0.0,ff*iod2/dist,ff*iod2,
                                                  0.0,1.0,0.0,0.0,
                                                  0.0,0.0,1.0,0.0,
@@ -1846,8 +1854,9 @@ void Scene::stereo_projection(int view)
       glMultMatrix(skew.Data());
     } else {
       // default, dino style stereo, less physically precise but visually more pleasing
+      Real dist = stereo_alg_==1 ? znear_ : -transform_.GetTrans()[2];
       glTranslated(0.0,0.0,-dist);
-      glRotated(180.0/M_PI*atan(ff/stereo_eye_dist_),0.0,1.0,0.0);
+      glRotated(180.0/M_PI*atan(ff/stereo_iod_),0.0,1.0,0.0);
       glTranslated(0.0,0.0,dist);
     }
   }
diff --git a/modules/gfx/src/scene.hh b/modules/gfx/src/scene.hh
index 5a93998485fbbe8428074f71149e2e4bbc349445..d07ac83607c59e50aa51e75edda28db3f1b0afe6 100644
--- a/modules/gfx/src/scene.hh
+++ b/modules/gfx/src/scene.hh
@@ -200,7 +200,12 @@ class DLLEXPORT_OST_GFX Scene {
   /// \brief set stereo eye distance
   void SetStereoIOD(float);
   /// \brief return current stereo eye distance
-  float GetStereoIOD() const {return stereo_eye_dist_;}
+  float GetStereoIOD() const {return stereo_distance_;}
+
+  /// \brief set stereo distance
+  void SetStereoDistance(float);
+  /// \brief return current stereo distance
+  float GetStereoDistance() const {return stereo_distance_;}
   
   /// \brief set stereo algorithm
   /// one of 0 or 1
@@ -474,7 +479,7 @@ private:
   unsigned int stereo_alg_;
   bool stereo_inverted_;
   unsigned int stereo_eye_;
-  float stereo_eye_dist_;
+  float stereo_iod_,stereo_distance_;
   unsigned int scene_left_tex_;
   unsigned int scene_right_tex_;