diff --git a/modules/gfx/pymod/export_scene.cc b/modules/gfx/pymod/export_scene.cc
index cd7a902a292b4cc2dafe1172ed5d479081ad99f5..97a555d6f6f6505d4a01d36e4961fbcdb3d6095c 100644
--- a/modules/gfx/pymod/export_scene.cc
+++ b/modules/gfx/pymod/export_scene.cc
@@ -118,6 +118,7 @@ void export_Scene()
     .def("SetShadow",&Scene::SetShadow)
     .def("SetShadowQuality",&Scene::SetShadowQuality)
     .def("SetDepthDarkening",&Scene::SetDepthDarkening)
+    .def("SetDepthDarkeningFactor",&Scene::SetDepthDarkeningFactor)
     .def("SetAmbientOcclusion",&Scene::SetAmbientOcclusion)
     .def("SetAmbientOcclusionFactor",&Scene::SetAmbientOcclusionFactor)
     .def("AttachObserver",&Scene::AttachObserver)
diff --git a/modules/gfx/src/impl/scene_fx.cc b/modules/gfx/src/impl/scene_fx.cc
index 4c70d8417291f903256d69b6f85bfd3355aae205..a4da9955ab033a5522c127208e8490e4aac5069a 100644
--- a/modules/gfx/src/impl/scene_fx.cc
+++ b/modules/gfx/src/impl/scene_fx.cc
@@ -25,16 +25,20 @@ SceneFX::SceneFX():
   shadow_flag(false),
   shadow_quality(1),
   depth_dark_flag(false),
+  depth_dark_factor(1.0),
   amb_occl_flag(false),
   amb_occl_factor(1.0),
   scene_tex_id_(),
   depth_tex_id_(),
   shadow_tex_id_(),
+  shadow_tex_mat_(),
   occl_tex_id_(),
   dark_tex_id_(),
   norm_tex_id_(),
   kernel_tex_id_(),
   kernel_size_(0),
+  kernel2_tex_id_(),
+  kernel2_size_(0),
   scene_tex2_id_(),
   norm_tex2_id_(),
   scene_fb_(),
@@ -56,6 +60,7 @@ void SceneFX::Setup()
   glGenTextures(1,&dark_tex_id_);
   glGenTextures(1,&norm_tex_id_);
   glGenTextures(1,&kernel_tex_id_);
+  glGenTextures(1,&kernel2_tex_id_);
 
   glGenFramebuffers(1,&scene_fb_);
   glGenRenderbuffers(1,&depth_rb_);
@@ -103,24 +108,51 @@ void SceneFX::Setup()
   glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
   glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
   glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP);
-  
+
   std::vector<GLfloat> tmp;
   for(int u=-20;u<=20;++u) {
     for(int v=-20;v<=20;++v) {
       if(UniformRandom()<0.1) {
-	// norm to 1
-	float x = static_cast<float>(u+20)*0.025;
-	float y = static_cast<float>(v+20)*0.025;
-	tmp.push_back(x);
-	tmp.push_back(y);
-	tmp.push_back(0.0);
-	tmp.push_back(0.0);
+        // norm to 1
+        float x = static_cast<float>(u+20)*0.025;
+        float y = static_cast<float>(v+20)*0.025;
+        tmp.push_back(x);
+        tmp.push_back(y);
+        tmp.push_back(0.0);
+        tmp.push_back(0.0);
       }
     }
   }
 
   kernel_size_=tmp.size()/4;
   glTexImage1D(GL_TEXTURE_1D,0,4,kernel_size_,0,GL_RGBA, GL_FLOAT, &tmp[0]);
+
+  glBindTexture(GL_TEXTURE_1D, kernel2_tex_id_);
+  glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
+  glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
+  glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+  
+  // depth darkening kernel
+  tmp.clear();
+  for(int u=-5;u<=5;++u) {
+    for(int v=-5;v<=5;++v) {
+      if(UniformRandom()<0.5) {
+        // norm to -1 ... 1
+        float x = static_cast<float>(u)*0.2;
+        float y = static_cast<float>(v)*0.2;
+        // gaussian kernel with sigma
+        float v = exp((-x*x-y*y)*0.5);
+        // norml to 0 ... 1
+        tmp.push_back(x*0.5+0.5);
+        tmp.push_back(y*0.5+0.5);
+        tmp.push_back(v);
+        tmp.push_back(0.0);
+      }
+    }
+  }
+
+  kernel2_size_=tmp.size()/4;
+  glTexImage1D(GL_TEXTURE_1D,0,4,kernel2_size_,0,GL_RGBA, GL_FLOAT, &tmp[0]);
 }
 
 void SceneFX::Resize(unsigned int w, unsigned int h)
@@ -163,11 +195,18 @@ void SceneFX::Preprocess()
 
 void SceneFX::Postprocess()
 {
-  Viewport vp=Scene::Instance().GetViewport();
-
   if(use_fb_) {
     glBindFramebuffer(GL_FRAMEBUFFER, 0);
-  } else {
+  }
+
+  if(!shadow_flag && !amb_occl_flag && !depth_dark_flag) {
+    // no postprocessing is needed
+    return;
+  }
+
+  Viewport vp=Scene::Instance().GetViewport();
+
+  if(!use_fb_) {
     // grab color buffer
     glBindTexture(GL_TEXTURE_2D, scene_tex_id_);
     glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, vp.x, vp.y, vp.width, vp.height, 0);
@@ -194,10 +233,9 @@ void SceneFX::Postprocess()
     prep_amb_occlusion();
   }
   if(depth_dark_flag) {
-    //prep_depth_darkening();
+    prep_depth_darkening();
   }
 
-
   Shader::Instance().PushProgram();
   glEnable(GL_TEXTURE_2D);
   glEnable(GL_TEXTURE_1D);
@@ -207,14 +245,18 @@ void SceneFX::Postprocess()
   glBindTexture(GL_TEXTURE_2D,depth_tex_id_);
   glActiveTexture(GL_TEXTURE0);
   glBindTexture(GL_TEXTURE_2D,scene_tex_id_);
-  glUniform1i(glGetUniformLocation(cpr,"scene"),0);
-  glUniform1i(glGetUniformLocation(cpr,"depth"),1);
+  glUniform1i(glGetUniformLocation(cpr,"scene_map"),0);
+  glUniform1i(glGetUniformLocation(cpr,"depth_map"),1);
   glUniform2f(glGetUniformLocation(cpr,"scalef"),
 	      1.0f/static_cast<float>(vp.width),
 	      1.0f/static_cast<float>(vp.height));
   glUniform2f(glGetUniformLocation(cpr,"zmorph"),
 	      Scene::Instance().GetFar()-Scene::Instance().GetNear(),
 	      Scene::Instance().GetNear());
+  glUniform2f(glGetUniformLocation(cpr,"i_vp"),1.0/static_cast<float>(vp.width),1.0/static_cast<float>(vp.height));
+  double pm[16];
+  glGetDoublev(GL_PROJECTION_MATRIX,pm);
+  glUniform4f(glGetUniformLocation(cpr,"abcd"),pm[0],pm[5],pm[10],pm[14]);
 
   if(shadow_flag) {
     glActiveTexture(GL_TEXTURE2);
@@ -224,6 +266,13 @@ void SceneFX::Postprocess()
     glUniform1f(glGetUniformLocation(cpr,"shadow_depth_bias"),0.008);
     glUniform1f(glGetUniformLocation(cpr,"shadow_epsilon"),0.002);
     glUniform1f(glGetUniformLocation(cpr,"shadow_multiplier"),0.4);
+    glActiveTexture(GL_TEXTURE0);
+    glMatrixMode(GL_TEXTURE);
+    glPushMatrix();
+    // make explicit object instead of temporary to avoid potential crash with Data()
+    geom::Mat4 ttmp=Transpose(shadow_tex_mat_);
+    glLoadMatrix(ttmp.Data());
+    glMatrixMode(GL_MODELVIEW);
   } else {
     glUniform1i(glGetUniformLocation(cpr,"shadow_flag"),0);
   }
@@ -236,8 +285,25 @@ void SceneFX::Postprocess()
   } else {
     glUniform1i(glGetUniformLocation(cpr,"occl_flag"),0);
   }
+  if(depth_dark_flag) {
+    glActiveTexture(GL_TEXTURE4);
+    glBindTexture(GL_TEXTURE_2D,dark_tex_id_);
+    glUniform1i(glGetUniformLocation(cpr,"dark_flag"),1);
+    glUniform1i(glGetUniformLocation(cpr,"dark_map"),4);
+    glUniform1f(glGetUniformLocation(cpr,"dark_mult"),depth_dark_factor);
+  } else {
+    glUniform1i(glGetUniformLocation(cpr,"dark_flag"),0);
+  }
 
   draw_screen_quad(vp.width,vp.height);
+
+  if(shadow_flag) {
+    glMatrixMode(GL_TEXTURE);
+    glPopMatrix();
+    glMatrixMode(GL_MODELVIEW);
+  }
+
+  glDisable(GL_TEXTURE_1D);
   glDisable(GL_TEXTURE_2D);
   Shader::Instance().PopProgram();
 }
@@ -262,12 +328,12 @@ void SceneFX::prep_shadow_map()
   glDisable(GL_FOG);
   glDisable(GL_COLOR_MATERIAL);
   glDisable(GL_NORMALIZE);
-  glColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_FALSE);
+  //glColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_FALSE);
 
   // render scene with only depth components
   // seen from the light's perspective
   glViewport(0,0,smap_size,smap_size);
-  glClear(GL_DEPTH_BUFFER_BIT);
+  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
 
   glMatrixMode(GL_PROJECTION);
   glPushMatrix();
@@ -284,7 +350,7 @@ void SceneFX::prep_shadow_map()
   glMultMatrix(ltrans.GetTransposedMatrix().Data());
 
   // only render non-transparent objects for the shadow map
-  Scene::Instance().GetRootNode()->RenderGL(DEPTH_RENDER_PASS);
+  Scene::Instance().GetRootNode()->RenderGL(STANDARD_RENDER_PASS);
 
   // now get the shadow map
   glActiveTexture(GL_TEXTURE2);
@@ -298,21 +364,25 @@ void SceneFX::prep_shadow_map()
   glMatrixMode(GL_MODELVIEW);
 
   glPopAttrib();
-  glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE);
+  //glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE);
 
   // set up appropriate texture matrix
   geom::Mat4 bias(0.5,0.0,0.0,0.5,
                   0.0,0.5,0.0,0.5,
                   0.0,0.0,0.5,0.5,
                   0.0,0.0,0.0,1.0);
-  
-  geom::Mat4 texm = bias*pmat*ltrans.GetMatrix();
-
-  glMatrixMode(GL_TEXTURE);
-  // make explicit object instead of temporary to avoid potential crash with Data()
-  geom::Mat4 ttmp=Transpose(texm);
-  glLoadMatrix(ttmp.Data());
-  glMatrixMode(GL_MODELVIEW);
+  float glpmat2[16];
+  glGetv(GL_PROJECTION_MATRIX, glpmat2);
+  geom::Mat4 pmat2(Transpose(geom::Mat4(glpmat2)));
+  float glmmat2[16];
+  glGetv(GL_MODELVIEW_MATRIX, glmmat2);
+  geom::Mat4 mmat2(Transpose(geom::Mat4(glmmat2)));
+
+  geom::Mat4 lmat2;
+  lmat2.PasteRotation(Scene::Instance().GetLightRot());
+
+  shadow_tex_mat_ = bias*pmat*ltrans.GetMatrix();
+  //shadow_tex_mat_ = bias*pmat*lmat2*geom::Invert(pmat2);
 }
 
 void SceneFX::prep_amb_occlusion()
@@ -355,22 +425,25 @@ void SceneFX::prep_depth_darkening()
 {
   Viewport vp=Scene::Instance().GetViewport();
 
-  // kernel is static for now, inside the convolution shader
   Shader::Instance().PushProgram();
   Shader::Instance().Activate("convolute1");
   GLuint cpr=Shader::Instance().GetCurrentProgram();
   // assign tex units
   glActiveTexture(GL_TEXTURE1);
   glBindTexture(GL_TEXTURE_2D,depth_tex_id_);
+  glActiveTexture(GL_TEXTURE2);
+  glBindTexture(GL_TEXTURE_1D,kernel2_tex_id_);
   glUniform1i(glGetUniformLocation(cpr,"data"),1);
-  glUniform1i(glGetUniformLocation(cpr,"vp_width"),vp.width/2);
-  glUniform1i(glGetUniformLocation(cpr,"vp_height"),vp.height/2);
+  glUniform1i(glGetUniformLocation(cpr,"kernel"),2);
+  glUniform1f(glGetUniformLocation(cpr,"step"),1.0/static_cast<float>(kernel2_size_));
+  glUniform2f(glGetUniformLocation(cpr,"i_vp"),1.0/static_cast<float>(vp.width),1.0/static_cast<float>(vp.height));
 
   // set up viewport filling quad to run the fragment shader
   draw_screen_quad(vp.width/2,vp.height/2);
 
+  glActiveTexture(GL_TEXTURE4);
   glBindTexture(GL_TEXTURE_2D, dark_tex_id_);
-  glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 0,0,vp.width/2, vp.height/2, 0);
+  glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 0,0,vp.width/2, vp.height/2, 0);
 
   Shader::Instance().PopProgram();
 }
@@ -422,32 +495,13 @@ void SceneFX::draw_screen_quad(unsigned int w, unsigned int h)
 // this debug code draws the given texture across the complete screen
 void SceneFX::draw_debug_tex(unsigned int w, unsigned int h, GLuint texid)
 {
-  glPushAttrib(GL_ALL_ATTRIB_BITS);
   Shader::Instance().PushProgram();
-  
   Shader::Instance().Activate("");
-  glViewport(0,0,w,h);
-  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
-  glMatrixMode(GL_PROJECTION);
-  glLoadIdentity();
-  glOrtho(0,1,0,1,-1,1);
-  glMatrixMode(GL_MODELVIEW);
-  glLoadIdentity();
-  glColor3f(1.0,0.0,1.0);
-  glEnable(GL_TEXTURE_2D);
   glActiveTexture(GL_TEXTURE0);
   glBindTexture(GL_TEXTURE_2D, texid);
-  glBegin(GL_QUADS);
-  glTexCoord2f(0.0,0.0);
-  glVertex2f(0.01,0.01);
-  glTexCoord2f(0.0,1.0);
-  glVertex2f(0.01,0.99);
-  glTexCoord2f(1.0,1.0);
-  glVertex2f(0.99,0.99);
-  glTexCoord2f(1.0,0.0);
-  glVertex2f(0.99,0.01);
-  glEnd();
-  glPopAttrib();
+
+  draw_screen_quad(w,h);
+
   Shader::Instance().PopProgram();
 }
 
diff --git a/modules/gfx/src/impl/scene_fx.hh b/modules/gfx/src/impl/scene_fx.hh
index 884ae425a9bdefed8053b012c7bcb3610e145012..c71ba6bd7154b828c5a8ddf6e5300e9371ca83ab 100644
--- a/modules/gfx/src/impl/scene_fx.hh
+++ b/modules/gfx/src/impl/scene_fx.hh
@@ -20,6 +20,7 @@
 #define OST_SCENE_FX_HH
 
 #include <ost/gfx/gl_helper.hh>
+#include <ost/geom/geom.hh>
 
 /*
   low level code for scene shading effects
@@ -49,6 +50,7 @@ public:
   bool shadow_flag;
   int shadow_quality;
   bool depth_dark_flag;
+  float depth_dark_factor;
   bool amb_occl_flag;
   float amb_occl_factor;
 
@@ -66,11 +68,14 @@ private:
   GLuint scene_tex_id_;
   GLuint depth_tex_id_;
   GLuint shadow_tex_id_;
+  geom::Mat4 shadow_tex_mat_;
   GLuint occl_tex_id_;
   GLuint dark_tex_id_;
   GLuint norm_tex_id_;
   GLuint kernel_tex_id_;
   uint kernel_size_;
+  GLuint kernel2_tex_id_;
+  uint kernel2_size_;
 
   GLuint scene_tex2_id_;
   GLuint norm_tex2_id_;
diff --git a/modules/gfx/src/scene.cc b/modules/gfx/src/scene.cc
index 028b78fbd2c7cbdb76c036c1d4c1ddd268360ac2..4b70553e266c74cbf07b2db49f9ed330c5b3b4c6 100644
--- a/modules/gfx/src/scene.cc
+++ b/modules/gfx/src/scene.cc
@@ -112,6 +112,8 @@ Scene::Scene():
   auto_autoslab_(true),
   offscreen_flag_(false),
   main_offscreen_buffer_(0),
+  old_vp_(),
+  def_shading_mode_("default"),
   selection_mode_(1),
   test_flag_(false),
   tmp_tex_(),
@@ -191,6 +193,15 @@ void Scene::SetDepthDarkening(bool f)
 #endif
 }
 
+void Scene::SetDepthDarkeningFactor(float f)
+{
+#if OST_SHADER_SUPPORT_ENABLED
+  impl::SceneFX::Instance().depth_dark_factor=f;
+  // the redraw routine will deal with the Shader
+  RequestRedraw();
+#endif
+}
+
 void Scene::SetAmbientOcclusion(bool f)
 {
 #if OST_SHADER_SUPPORT_ENABLED
@@ -212,6 +223,9 @@ void Scene::SetAmbientOcclusionFactor(float f)
 void Scene::SetShadingMode(const std::string& smode)
 {
 #if OST_SHADER_SUPPORT_ENABLED
+  // this here is required - in case SetShadingMode is called
+  // before GL is initialized (e.g. during batch mode rendering)
+  def_shading_mode_=smode;
   if(smode=="fallback") {
     Shader::Instance().Activate("");
   } else if(smode=="basic") {
@@ -332,7 +346,7 @@ void Scene::InitGL()
 #if OST_SHADER_SUPPORT_ENABLED
   LOGN_DEBUG("scene: shader setup");
   Shader::Instance().Setup();
-  SetShadingMode("default");
+  SetShadingMode(def_shading_mode_);
   LOGN_DEBUG("scene: scenefx setup");
   impl::SceneFX::Instance().Setup();
 #endif
diff --git a/modules/gfx/src/scene.hh b/modules/gfx/src/scene.hh
index bedf2774fef15c02ae88c7cd39e269ea838a22e7..29fd72a5069c78febdb913f1ab83b78d3cd31efc 100644
--- a/modules/gfx/src/scene.hh
+++ b/modules/gfx/src/scene.hh
@@ -112,6 +112,7 @@ class DLLEXPORT_OST_GFX Scene {
   void SetShadowQuality(int q);
 
   void SetDepthDarkening(bool f);
+  void SetDepthDarkeningFactor(float f);
 
   void SetAmbientOcclusion(bool f);
   void SetAmbientOcclusionFactor(float f);
@@ -415,6 +416,7 @@ private:
   bool offscreen_flag_; // a simple indicator whether in offscreen mode or not
   OffscreenBuffer* main_offscreen_buffer_; // not null if a main offscreen buffer is present
   uint old_vp_[2]; // used by the offline rendering code
+  std::string def_shading_mode_;
 
   uint selection_mode_;
 
diff --git a/modules/gfx/src/shader/amboccl_fs.glsl b/modules/gfx/src/shader/amboccl_fs.glsl
index b1a8be162a5d25181a828f3a16623d1e1474bb1f..01f7a7217d49fd121e86ea7cefbf305414e872ed 100644
--- a/modules/gfx/src/shader/amboccl_fs.glsl
+++ b/modules/gfx/src/shader/amboccl_fs.glsl
@@ -8,8 +8,10 @@ uniform vec4 abcd;
 vec3 unproject(in vec3 scr)
 { 
   vec3 tmp=vec3(scr.x*i_vp.x*2.0-1.0,scr.y*i_vp.y*2.0-1.0,scr.z);
-  float iw = 1.0/(tmp.z/abcd.w+abcd.z/abcd.w);
-  return iw*vec3(tmp.x/abcd.x,tmp.y/abcd.y,-1.0);
+  //float iw = 1.0/(tmp.z/abcd.w+abcd.z/abcd.w);
+  //return iw*vec3(tmp.x/abcd.x,tmp.y/abcd.y,-1.0);
+  vec4 tmp2 = gl_ProjectionMatrixInverse*vec4(tmp,1.0);
+  return tmp2.xyz/tmp2.w;
 }
 
 float ao(in vec2 tab, in vec3 pos_p, in vec3 norm_p, in vec3 t_pos_p)
@@ -22,7 +24,7 @@ float ao(in vec2 tab, in vec3 pos_p, in vec3 norm_p, in vec3 t_pos_p)
   vec3 t_pos_q = unproject(pos_q);
 
   vec3 diff=t_pos_q-t_pos_p;
-  float fac=1.0+dot(diff,diff)/25.0;
+  float fac=1.0+dot(diff,diff)/5.0;
   return max(0.0,dot(normalize(norm_p),normalize(diff)))/fac;
 }
 
@@ -40,8 +42,7 @@ void main()
   float i;
   float sum=0.0;
   for(i=0.0;i<1.0;i+=step) {
-    vec2 nn=texture1D(kernel,i).xy;
-    nn=(nn-0.5)*40.0;
+    vec2 nn=texture1D(kernel,i).xy*40.0-20.0;
     sum+=ao(nn,pos_p,norm_p,t_pos_p);
   }
   sum*=step;
diff --git a/modules/gfx/src/shader/convolute1_fs.glsl b/modules/gfx/src/shader/convolute1_fs.glsl
index 67cc0cdb1d5094c8118e0a5d442b051986fc65ba..3e1564ecd4662ab159ab0006eec6d1e5d2f0c1c1 100644
--- a/modules/gfx/src/shader/convolute1_fs.glsl
+++ b/modules/gfx/src/shader/convolute1_fs.glsl
@@ -1,62 +1,25 @@
 uniform sampler2D data;
 uniform sampler1D kernel;
-uniform int kernel_size;
-uniform int vp_width;
-uniform int vp_height;
+uniform float step;
+uniform vec2 i_vp;
 
 void main()
 {
-  vec3 kernel_data[13];
-  vec3 kmod=vec3(1.0/(float)vp_width,1.0/(float)vp_height,1.0);
-  kernel_data[0]=kmod*vec3(-2,0,0.02);
-  kernel_data[1]=kmod*vec3(-1,-1,0.141421);
-  kernel_data[2]=kmod*vec3(-1,0,0.37606);
-  kernel_data[3]=kmod*vec3(-1,1,0.141421);
-  kernel_data[4]=kmod*vec3(0,-2,0.02);
-  kernel_data[5]=kmod*vec3(0,-1,0.37606);
-  kernel_data[6]=kmod*vec3(0,0,1);
-  kernel_data[7]=kmod*vec3(0,1,0.37606);
-  kernel_data[8]=kmod*vec3(0,2,0.02);
-  kernel_data[9]=kmod*vec3(1,-1,0.141421);
-  kernel_data[10]=kmod*vec3(1,0,0.37606);
-  kernel_data[11]=kmod*vec3(1,1,0.141421);
-  kernel_data[12]=kmod*vec3(2,0,0.02);
-
+  float i;
   float sum=0.0;
   float sum2=0.0;
-  int i;
-  for (i=0;i<13;i=i+1) {
-    sum+=kernel_data[i].z*texture2D(data,gl_TexCoord[0].xy+kernel_data[i].xy).r;
-    sum2+=kernel_data[i].z;
+  for (i=0.0;i<1.0;i=i+step) {
+    vec3 kvalue = texture1D(kernel,i).xyz;
+    kvalue.xy=(kvalue.xy-0.5)*10.0*i_vp;
+    sum+=kvalue.z*texture2D(data,gl_TexCoord[0].xy+kvalue.xy).r;
+    sum2+=kvalue.z;
   }
   sum=sum/sum2;
   float delta=5.0*(sum-texture2D(data,gl_TexCoord[0].xy).r);
   if(delta<0.0) {
-    gl_FragColor.rgb=vec3(1+delta,1+delta,1+delta);
-  } else {
-    gl_FragColor.rgb=vec3(1,1,1);
-  }
-  gl_FragColor.a=1.0;
-
-
-/*
-  float sum=0.0;
-  float sum2=0.0;
-  float isize=1.0/(float)(kernel_size);
-  for (i=0;i<kernel_size;i=i+1) {
-    float ii=(float(i)+0.5)*isize;
-    vec3 kernel_value=texture1D(kernel,ii).xyz;
-    vec2 offset = kernel_value.xy*2.0-1.0;
-    sum+=kernel_value.z*texture2D(data,gl_TexCoord[0].xy+offset).r;
-    sum2+=kernel_value.z;
-  }
-  sum=sum/sum2;
-  float delta=(sum-texture2D(data,gl_TexCoord[0].xy).r);
-  if(delta<0.0) {
-    gl_FragColor.rgb=vec3(1+delta,1+delta,1+delta);
+    gl_FragColor.rgb=vec3(1.0+delta,1.0+delta,1.0+delta);
   } else {
-    gl_FragColor.rgb=vec3(1,1,1);
+    gl_FragColor.rgb=vec3(1.0,1.0,1.0);
   }
   gl_FragColor.a=1.0;
-*/
 }
diff --git a/modules/gfx/src/shader/scenefx_fs.glsl b/modules/gfx/src/shader/scenefx_fs.glsl
index ce63193f1cc7e48dbce6a74363bffaf97eb8335b..bed4469eded2d9271a2da51def4dff176d2e8f7c 100644
--- a/modules/gfx/src/shader/scenefx_fs.glsl
+++ b/modules/gfx/src/shader/scenefx_fs.glsl
@@ -1,5 +1,5 @@
-uniform sampler2D scene;
-uniform sampler2D depth;
+uniform sampler2D scene_map;
+uniform sampler2D depth_map;
 uniform vec2 scalef;
 uniform vec2 zmorph;
 uniform bool shadow_flag;
@@ -10,6 +10,18 @@ uniform float shadow_multiplier;
 uniform bool occl_flag;
 uniform sampler2D occl_map;
 uniform float occl_mult;
+uniform bool dark_flag;
+uniform sampler2D dark_map;
+uniform float dark_mult;
+uniform vec2 i_vp;
+uniform vec4 abcd;
+
+vec3 unproject(in vec3 scr)
+{ 
+  vec3 tmp=vec3(scr.x*i_vp.x*2.0-1.0,scr.y*i_vp.y*2.0-1.0,scr.z);
+  float iw = 1.0/(tmp.z/abcd.w+abcd.z/abcd.w);
+  return iw*vec3(tmp.x/abcd.x,tmp.y/abcd.y,-1.0);
+}
 
 float CalcShadowFactor(in vec4 coord, in vec2 o)
 {
@@ -20,10 +32,17 @@ float CalcShadowFactor(in vec4 coord, in vec2 o)
 
 void main()
 {
+  vec4 scene_color=texture2D(scene_map,gl_TexCoord[0].xy);
+  gl_FragColor.a = scene_color.a;
+
   float shadow_factor=1.0;
   if(shadow_flag) {
-    // TODO: calculate appropriate coord from glTexCoord[1].xy and the depth map
-    vec4 coord;
+    float depth = texture2D(depth_map,gl_TexCoord[0].xy).r;
+    vec4 tcoord = gl_ModelViewProjectionMatrixInverse*vec4(gl_FragCoord.xy*i_vp*2.0-1.0,depth,1.0);
+    vec4 coord = gl_TextureMatrix[0]*tcoord;
+    //vec4 coord = gl_TextureMatrix[0]*vec4(gl_FragCoord.xy*i_vp*2.0-1.0,depth,1.0);
+    coord/=coord.w;
+
     shadow_factor = 0.0;
     shadow_factor += 0.18*CalcShadowFactor(coord, vec2(-0.7, -0.7));
     shadow_factor += 0.18*CalcShadowFactor(coord, vec2(0.7, -0.7));
@@ -36,8 +55,11 @@ void main()
   if(occl_flag) {
     occl_factor=max(0.0,1.0-occl_mult*texture2D(occl_map,gl_TexCoord[0].xy).r);
   }
+
+  float dark_factor=1.0;
+  if(dark_flag) {
+    dark_factor=max(0.0,1.0-dark_mult*(1.0-texture2D(dark_map,gl_TexCoord[0].xy).r));
+  }
     
-  vec4 scene_color=texture2D(scene,gl_TexCoord[0].xy);
-  gl_FragColor.rgb = shadow_factor*occl_factor*scene_color.rgb;
-  gl_FragColor.a = scene_color.a;
+  gl_FragColor.rgb = shadow_factor*occl_factor*dark_factor*scene_color.rgb;
 }
diff --git a/modules/gfx/src/shader/scenefx_vs.glsl b/modules/gfx/src/shader/scenefx_vs.glsl
index 59aa7bb4e40cb464102a85b54b902f36376398df..6732327afc56aaee4a7fc353ed0c2e26d58c6f5b 100644
--- a/modules/gfx/src/shader/scenefx_vs.glsl
+++ b/modules/gfx/src/shader/scenefx_vs.glsl
@@ -3,6 +3,5 @@ void main()
   gl_Position = ftransform();
   // relative screen coordinates
   gl_TexCoord[0] = gl_MultiTexCoord0;
-  gl_TexCoord[1] = gl_Vertex;
 }
 
diff --git a/modules/mol/base/pymod/wrap_mol.cc b/modules/mol/base/pymod/wrap_mol.cc
index 82a449f681fbe98866c42acb0b8581fefd66d331..202636aff4ae7cf9b0716ca437407a6e46a746d7 100644
--- a/modules/mol/base/pymod/wrap_mol.cc
+++ b/modules/mol/base/pymod/wrap_mol.cc
@@ -63,6 +63,7 @@ BOOST_PYTHON_MODULE(_mol)
   export_QueryViewWrapper();
 
   class_<Transform>("Transform", init<>())
+    .def(init<const Transform&>()) // shouldn't this be there automatically ?
     .def("GetMatrix",&Transform::GetMatrix)
     .def("GetTransposedMatrix",&Transform::GetTransposedMatrix)
     .def("SetTrans",&Transform::SetTrans)