diff --git a/modules/base/pymod/export_logger.cc b/modules/base/pymod/export_logger.cc
index 446d041166e3695c7a63578ff223ef966e78f2fb..3b8b4b6615495c03bc809aaa013bc11d505b10ed 100644
--- a/modules/base/pymod/export_logger.cc
+++ b/modules/base/pymod/export_logger.cc
@@ -132,7 +132,16 @@ object log_verbose(tuple args, dict kwargs)
   LOG_VERBOSE(args_to_string(args, kwargs));
   return object();  
 }
-
+object log_debug(tuple args, dict kwargs) 
+{
+  LOG_DEBUG(args_to_string(args, kwargs));
+  return object();  
+}
+object log_trace(tuple args, dict kwargs) 
+{
+  LOG_TRACE(args_to_string(args, kwargs));
+  return object();  
+}
 
 void reset_sinks()
 {
@@ -177,6 +186,8 @@ void export_Logger()
   def("LogInfo", raw_function(log_info, 1));
   def("LogScript", raw_function(log_script, 1));
   def("LogVerbose", raw_function(log_verbose, 1));
+  def("LogDebug", raw_function(log_debug, 1));
+  def("LogTrace", raw_function(log_trace, 1));
   
   // this relatively ugly construct is required to work around a problem with
   // the "ost" command-line interpreter. If we don't remove all the sinks from
diff --git a/modules/gfx/src/shader.cc b/modules/gfx/src/shader.cc
index f567fdceb8d772e10e4feb00ada86e9fd719f143..2a5e91ce25fa41c121ae12ecca5a6a2f08a82e68 100644
--- a/modules/gfx/src/shader.cc
+++ b/modules/gfx/src/shader.cc
@@ -85,13 +85,13 @@ bool Shader::Compile(const std::string& shader_name,
   GLint sh_compiled;
   glGetShaderiv(shader_id, GL_COMPILE_STATUS, &sh_compiled);
   if(sh_compiled==GL_TRUE) {
-    LOG_VERBOSE("shader [" << shader_name << "] successfully compiled (" << shader_id << ")");
+    LOG_DEBUG("shader [" << shader_name << "] successfully compiled (" << shader_id << ")");
   } else {
     GLint sh_log_length;
     glGetShaderiv(shader_id, GL_INFO_LOG_LENGTH, &sh_log_length);
     std::vector<GLchar> sh_log(sh_log_length+1);
     glGetShaderInfoLog(shader_id, sh_log_length, NULL, &sh_log[0]);
-    LOG_ERROR("shader [" << shader_name << "] compilation failed:" << std::endl << String(&sh_log[0]));
+    LOG_WARNING("shader [" << shader_name << "] compilation failed:" << std::endl << String(&sh_log[0]));
     return false;
   }
   return true;
@@ -105,14 +105,14 @@ void Shader::Link(const std::string& pr_name, const std::string& vs_code, const
 
   GLuint shader_id;
   if(Compile(pr_name+" vs",vs_code,GL_VERTEX_SHADER,shader_id)) {
-    LOG_VERBOSE("attaching compiled vertex shader id " << shader_id << " to " << shader_pr);
+    LOG_DEBUG("attaching compiled vertex shader id " << shader_id << " to " << shader_pr);
     glAttachShader(shader_pr,shader_id);
   } else {
     LOG_WARNING("skipping [" << pr_name << "] due to error in vertex shader code");
     return;
   }
   if(Compile(pr_name+" fs",fs_code,GL_FRAGMENT_SHADER,shader_id)) {
-    LOG_VERBOSE("attaching compiled fragment shader id " << shader_id << " to " << shader_pr);
+    LOG_DEBUG("attaching compiled fragment shader id " << shader_id << " to " << shader_pr);
     glAttachShader(shader_pr,shader_id);
   } else {
     LOG_WARNING("skipping [" << pr_name << "] due to error in fragment shader code");
@@ -129,7 +129,7 @@ void Shader::Link(const std::string& pr_name, const std::string& vs_code, const
     glGetProgramiv(shader_pr, GL_INFO_LOG_LENGTH, &pr_log_length);
     std::vector<GLchar> pr_log(pr_log_length+1);
     glGetProgramInfoLog(shader_pr, pr_log_length, NULL, &pr_log[0]);
-    LOG_ERROR("shader [" << pr_name << "] linking failed:" << std::endl << String(&pr_log[0]));
+    LOG_WARNING("shader [" << pr_name << "] linking failed:" << std::endl << String(&pr_log[0]));
     return;
   }
   shader_program_map_[pr_name]=shader_pr;
@@ -186,7 +186,7 @@ void Shader::Setup()
     bf::path shader_file(shader_dir / shader_name);
 
     if(!bf::exists(shader_file)){
-      LOG_ERROR("shader file not found: [" << shader_file.string() << "]");
+      LOG_WARNING("shader file not found: [" << shader_file.string() << "]");
       shader_code_map[shader_name]=std::string();
       continue;
     }
@@ -297,7 +297,7 @@ void Shader::Activate(const String& name)
   if(!name.empty()) {
     std::map<String, GLuint>::iterator it = shader_program_map_.find(name);
     if(it!=shader_program_map_.end()) {
-      LOG_VERBOSE("switching to shader [" << name << "]");
+      LOG_TRACE("switching to shader [" << name << "]");
       glUseProgram(it->second);
       current_program_=it->second;
       current_name_=name;
@@ -306,11 +306,11 @@ void Shader::Activate(const String& name)
       return;
 
     } else {
-      LOG_WARNING("shader program [" << name << "] not present");
+      LOG_TRACE("shader program [" << name << "] not present");
       return;
     }
   }
-  LOG_VERBOSE("switching to fixed pipeline");
+  LOG_TRACE("switching to fixed pipeline");
   glUseProgram(0);
   current_program_=0;
   current_name_="";
diff --git a/modules/gui/pymod/init_spacenav.py b/modules/gui/pymod/init_spacenav.py
index d7006e9061be2626162ab9a3dd192e7e3a8f52c7..847ec5d4b983057a715c85882924daabb87cc6cb 100644
--- a/modules/gui/pymod/init_spacenav.py
+++ b/modules/gui/pymod/init_spacenav.py
@@ -1,4 +1,4 @@
-import traceback
+import math,traceback
 
 from PyQt4 import QtCore
 
@@ -16,19 +16,30 @@ class SpacenavControl(QtCore.QObject):
     self.rot = True
     self.speed = 480.0
     
-  def Changed(self, tx,ty,tz,rx,ry,rz): 
-    transf = gfx.Scene().GetTransform()
+  def Changed(self, tx,ty,tz,rx,ry,rz):
+    scene=gfx.Scene()
+    tf = scene.transform
+    def d(r):
+      if r==0.0:
+        return 0.0
+      rr=r/abs(r)*max(0.0,abs(r)-0.9)
+      return rr/abs(rr)*(math.pow(1.01,abs(rr))-1.0)*40.0/self.speed if abs(rr)>0.0 else 0.0
     if(self.trans):
-      transf.ApplyXAxisTranslation(tx/self.speed)
-      transf.ApplyYAxisTranslation(ty/self.speed)
+      tf.ApplyXAxisTranslation(d(tx))
+      tf.ApplyYAxisTranslation(d(ty))
+      # adjust translation speed to distance from viewpoint
+      currz=tf.trans[2];
+      delta=currz*math.pow(1.01,d(tz))-currz;
+      tf.ApplyZAxisTranslation(delta);
+      # adjust near and far clipping planes together with z trans
+      scene.SetNearFar(scene.near-delta,scene.far-delta);
     if(self.rot):
-      transf.ApplyXAxisRotation(rx/self.speed)
-      transf.ApplyYAxisRotation(ry/self.speed)
-      transf.ApplyZAxisRotation(rz/self.speed)
-    if(self.trans or self.rot):
-      transf.ApplyZAxisTranslation(-tz/self.speed)
-    gfx.Scene().SetTransform(transf)
-    gfx.Scene().RequestRedraw()
+      tf.ApplyXAxisRotation(d(rx))
+      tf.ApplyYAxisRotation(d(ry))
+      tf.ApplyZAxisRotation(d(rz))
+
+    scene.transform=tf
+    scene.RequestRedraw()
 
   def Toggle(self, button):
     if button == 0:
@@ -45,7 +56,7 @@ class SpacenavControl(QtCore.QObject):
       self.speed /= 0.8
       ost.LogVerbose("SpaceNav: speed reduced to "+str(self.speed))
     else:
-      ost.LogDebug("SpaceNav: unmapped button press ["+str(button)+"]")
+      ost.LogVerbose("SpaceNav: unmapped button press ["+str(button)+"]")
 
       
 def _InitSpaceNav(app):