diff --git a/src/modules/RevealedCutModule.cpp b/src/modules/RevealedCutModule.cpp
index a2cbc28ee23a8069f34ff56db871f804952b8eb0..69d530a7f72f6660ef56f6c245eee8ff8badf882 100644
--- a/src/modules/RevealedCutModule.cpp
+++ b/src/modules/RevealedCutModule.cpp
@@ -37,6 +37,7 @@ RevealedCutModule::RevealedCutModule(): ShapeModule(), RevealedModule() {
     m_name="cut";
     m_cutWin=NULL;
     m_updateOnce=false;
+	m_shapeGeom = Reveal::GEOM_BOX;
 
     Reveal::getInstance()->getGeom(Reveal::GEOM_BOX)->registerModule(this);
 
@@ -58,6 +59,7 @@ RevealedCutModule::RevealedCutModule(): ShapeModule(), RevealedModule() {
     addAttribute(new Attribute("window", 
                                Attribute::STRING_ATTRIBUTE,
                                windowCallback, this, 1));
+
     addAttribute(new Attribute("selection_position", 
                                Attribute::INT_ATTRIBUTE,
                                selPosCallback, this, 2));
@@ -72,8 +74,12 @@ RevealedCutModule::RevealedCutModule(): ShapeModule(), RevealedModule() {
     addTransformationAttributes();
     addRevealedAttributes();
     addRevealedOutputAttributes();
-    m_inside=9;
     m_localInsideAxes=true;
+	m_insideDensityAlpha=0;
+	m_insideGradientAlpha=0;
+	m_insideTextureAlpha=1.0;
+	m_insideVisible=true;
+    m_insideTextureBlend=false;
 
     Reveal::getInstance()->addUpdateObserver(this);
 }
@@ -86,16 +92,15 @@ RevealedCutModule::~RevealedCutModule() {
 void RevealedCutModule::refreshWindows() {
     CutWindowsManager* winsMan = CutWindowsManager::getInstance();
     winsMan->updateWindowsList();
-
-    vector<string> names;
-    names.push_back("none");
-    vector<CutWindow*>& wins = winsMan->editWindowList();
-    vector<CutWindow*>::iterator itWin = wins.begin();
-    for(; itWin!=wins.end(); ++itWin) {
-        names.push_back(((*itWin)->getName()).c_str());
-    }
-    m_attributesMap["window"]->editStringValuesChoices().assign(1,names);
-    m_attributesMap["window"]->initStrings(vector<string>(1, names[0]));
+	m_windowNames.clear();
+	m_windowNames.push_back("none");
+	vector<CutWindow*>& wins = winsMan->editWindowList();
+	vector<CutWindow*>::iterator itWin = wins.begin();
+	for(; itWin!=wins.end(); ++itWin) {
+		m_windowNames.push_back(((*itWin)->getName()).c_str());
+	}
+	m_attributesMap["window"]->editStringValuesChoices().assign(1,m_windowNames);
+	m_attributesMap["window"]->initStrings(vector<string>(1, m_windowNames[0]));
 }
 
 void RevealedCutModule::setWindow(const std::string& winName) {
@@ -113,6 +118,7 @@ void RevealedCutModule::setWindow(const std::string& winName) {
         m_winW=m_cutWin->getWidth();
         m_winH=m_cutWin->getHeight();
         recomputePixels();
+		m_initTex=false;
     }
 }
 
@@ -199,14 +205,24 @@ void RevealedCutModule::draw(const int& contextID,
             glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
             glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
             glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
-            glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, 
-                         m_nbPixPerRow, m_cutWin->getHeight(), 
-                         m_layersNb, 0,
-                         GL_RGBA, GL_UNSIGNED_BYTE,
-                         m_cutWin->grabImage());
+			if(!m_initTex) {
+				glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA8, 
+							 m_nbPixPerRow, m_cutWin->getHeight(), 
+							 m_layersNb, 0,
+							 GL_BGRA, GL_UNSIGNED_BYTE,
+							 m_cutWin->grabImage());
+				m_initTex=true;
+			}
+			else {
+				glTexSubImage3D(GL_TEXTURE_3D, 0, 0, 0, 0,
+							 m_nbPixPerRow, m_cutWin->getHeight(), m_layersNb, 
+							 GL_BGRA, GL_UNSIGNED_BYTE,
+							 m_cutWin->grabImage());
+			}
             m_updateOnceDone=true;
         }
 
+		/*
         glUniform1i(uniforms[Reveal::COORDSTEX], 4);
         glActiveTexture(GL_TEXTURE4);
         glBindTexture(GL_TEXTURE_2D, m_coordsIDMap[contextID]);
@@ -220,7 +236,7 @@ void RevealedCutModule::draw(const int& contextID,
                          0, GL_RG, GL_FLOAT,
                          m_coordImage);
             m_coordsUpMap[contextID]=false;
-        }
+        }*/
     }
 }
 
@@ -341,7 +357,7 @@ void CutWindowsManager::updateWindowsList() {
 
 #ifdef LINUX
     Window *list = getWinList(m_disp, &len);
-    for(int i=0;i<(int)len;i++) {
+    for(int i=0; i<(int)len; i++) {
         char* name = getWinName(m_disp, list[i]);
         CutWindow* newWin=NULL;
         if(prevWins.find(string(name))!=prevWins.end()) {
@@ -361,13 +377,14 @@ void CutWindowsManager::updateWindowsList() {
 
 #ifdef LINUX
 char* CutWindowsManager::getWinName(Display* disp, Window win) {
-    Atom prop = XInternAtom(disp,"WM_NAME",false);
+    Atom prop = XInternAtom(disp,"_NET_WM_NAME",false);
+	Atom utf8Atom = XInternAtom(disp,"UTF8_STRING",false);
     Atom type;
     int form;
     unsigned long remain, len;
     unsigned char *list;
 
-    if (XGetWindowProperty(disp,win,prop,0,1024,false,XA_STRING,
+    if (XGetWindowProperty(disp,win,prop,0,65536,false,utf8Atom,
             &type,&form,&len,&remain,&list) != Success) {
         cout<<"Error getting window name"<<endl;
         return NULL;
diff --git a/src/modules/RevealedCutModule.hpp b/src/modules/RevealedCutModule.hpp
index 86dafd430e73aee9297e7cdae7ad4d19ae12a681..79994c3020295d78c87fbb1fa3bccb62d13250e3 100644
--- a/src/modules/RevealedCutModule.hpp
+++ b/src/modules/RevealedCutModule.hpp
@@ -87,6 +87,8 @@ class RevealedCutModule : public ShapeModule, public RevealedModule {
         std::vector<int> m_destIndices;
         bool m_updateOnce;
         bool m_updateOnceDone;
+		std::vector<std::string> m_windowNames;
+		bool m_initTex;
 };
 
 class CutWindow {
diff --git a/src/shaders/render43.fs b/src/shaders/render43.fs
index 2efd3ea30f90d0ac951bd66e35f499e6a39fb472..197e2123b91b58f0b78743fa510a937c45b8947f 100644
--- a/src/shaders/render43.fs
+++ b/src/shaders/render43.fs
@@ -247,116 +247,126 @@ void main(void) {
 
 		switch(shapeGeom) {
 			case PATH : {
-							//use min/max/size of current segment
-							pixelPos = (subShapeInvMat*vec4(pixelPos,1.0)).xyz;
-							if(length(vec2(pixelPos.x, pixelPos.y))<=0.5 && (pixelPos.z>-0.5 && pixelPos.z<0.5)) {
-								float xx = (pixelPos.x)*(pixelPos.x);
-								float yy = (pixelPos.y)*(pixelPos.y);
-								float ax = sqrt(0.25-yy);
-								diffMin.x = pixelPos.x+ax;
-								diffMax.x = ax-pixelPos.x;
-								float ay = sqrt(0.25-xx);
-								diffMin.y = pixelPos.y+ay;
-								diffMax.y = ay-pixelPos.y;
-								diffMin.z = pixelPos.z+0.5;
-								diffMax.z = 0.5-pixelPos.z;
-								rendered=1;
-							}
-						} break;
+				//use min/max/size of current segment
+				pixelPos = (subShapeInvMat*vec4(pixelPos,1.0)).xyz;
+				if(length(vec2(pixelPos.x, pixelPos.y))<=0.5 && (pixelPos.z>-0.5 && pixelPos.z<0.5)) {
+					float xx = (pixelPos.x)*(pixelPos.x);
+					float yy = (pixelPos.y)*(pixelPos.y);
+					float ax = sqrt(0.25-yy);
+					diffMin.x = pixelPos.x+ax;
+					diffMax.x = ax-pixelPos.x;
+					float ay = sqrt(0.25-xx);
+					diffMin.y = pixelPos.y+ay;
+					diffMax.y = ay-pixelPos.y;
+					diffMin.z = pixelPos.z+0.5;
+					diffMax.z = 0.5-pixelPos.z;
+					rendered=1;
+				}
+			} break;
 			case CONE : {
-							if(pixelPos.y<0.5 && pixelPos.y>-0.5) {
-								float xx = (pixelPos.x)*(pixelPos.x);
-								float yy = (pixelPos.y-0.5)*(pixelPos.y-0.5);
-								float zz = (pixelPos.z)*(pixelPos.z);
-								if((xx+zz)/yy<0.25){
-									float ax = sqrt(0.25*yy-zz);
-									diffMin.x = pixelPos.x+ax;
-									diffMax.x = ax-pixelPos.x;
-									float ay = sqrt((yy+xx)/0.25);
-									diffMin.y = pixelPos.y+0.5;
-									diffMax.y = 0.5-pixelPos.y;
-									float az = sqrt(0.25*yy-xx);
-									diffMin.z = pixelPos.z+az;
-									diffMax.z = az-pixelPos.z;
-									rendered=1;
-								}
-							}
-						} break;
+				if(pixelPos.y<0.5 && pixelPos.y>-0.5) {
+					float xx = (pixelPos.x)*(pixelPos.x);
+					float yy = (pixelPos.y-0.5)*(pixelPos.y-0.5);
+					float zz = (pixelPos.z)*(pixelPos.z);
+					if((xx+zz)/yy<0.25){
+						float ax = sqrt(0.25*yy-zz);
+						diffMin.x = pixelPos.x+ax;
+						diffMax.x = ax-pixelPos.x;
+						float ay = sqrt((yy+xx)/0.25);
+						diffMin.y = pixelPos.y+0.5;
+						diffMax.y = 0.5-pixelPos.y;
+						float az = sqrt(0.25*yy-xx);
+						diffMin.z = pixelPos.z+az;
+						diffMax.z = az-pixelPos.z;
+						rendered=1;
+					}
+				}
+			} break;
 			case TUBE : {
-							if(length(vec2(pixelPos.x, pixelPos.z))<=0.5 && (pixelPos.y>-0.5 && pixelPos.y<0.5)) {
-								float xx = (pixelPos.x)*(pixelPos.x);
-								float zz = (pixelPos.z)*(pixelPos.z);
-								float ax = sqrt(0.25-zz);
-								diffMin.x = pixelPos.x+ax;
-								diffMax.x = ax-pixelPos.x;
-								float az = sqrt(0.25-xx);
-								diffMin.z = pixelPos.z+az;
-								diffMax.z = az-pixelPos.z;
-								diffMin.y = pixelPos.y+0.5;
-								diffMax.y = 0.5-pixelPos.y;
-								rendered=1;
-							}
-						} break;
+				if(length(vec2(pixelPos.x, pixelPos.z))<=0.5 && (pixelPos.y>-0.5 && pixelPos.y<0.5)) {
+					float xx = (pixelPos.x)*(pixelPos.x);
+					float zz = (pixelPos.z)*(pixelPos.z);
+					float ax = sqrt(0.25-zz);
+					diffMin.x = pixelPos.x+ax;
+					diffMax.x = ax-pixelPos.x;
+					float az = sqrt(0.25-xx);
+					diffMin.z = pixelPos.z+az;
+					diffMax.z = az-pixelPos.z;
+					diffMin.y = pixelPos.y+0.5;
+					diffMax.y = 0.5-pixelPos.y;
+					rendered=1;
+				}
+			} break;
 			case SPHERE : {
-							  if(length(pixelPos)<=0.5) {
-								  float xx = (pixelPos.x)*(pixelPos.x);
-								  float yy = (pixelPos.y)*(pixelPos.y);
-								  float zz = (pixelPos.z)*(pixelPos.z);
-								  float ax = sqrt(0.25-yy-zz);
-								  diffMin.x = pixelPos.x+ax;
-								  diffMax.x = ax-pixelPos.x;
-								  float ay = sqrt(0.25-xx-zz);
-								  diffMin.y = pixelPos.y+ay;
-								  diffMax.y = ay-pixelPos.y;
-								  float az = sqrt(0.25-xx-yy);
-								  diffMin.z = pixelPos.z+az;
-								  diffMax.z = az-pixelPos.z;
-								  rendered=1;
-							  }
-						  } break;
+				if(length(pixelPos)<=0.5) {
+					float xx = (pixelPos.x)*(pixelPos.x);
+					float yy = (pixelPos.y)*(pixelPos.y);
+					float zz = (pixelPos.z)*(pixelPos.z);
+					float ax = sqrt(0.25-yy-zz);
+					diffMin.x = pixelPos.x+ax;
+					diffMax.x = ax-pixelPos.x;
+					float ay = sqrt(0.25-xx-zz);
+					diffMin.y = pixelPos.y+ay;
+					diffMax.y = ay-pixelPos.y;
+					float az = sqrt(0.25-xx-yy);
+					diffMin.z = pixelPos.z+az;
+					diffMax.z = az-pixelPos.z;
+					rendered=1;
+				}
+			} break;
 			case BOX : {
-						   diffMin = pixelPos - vec3(-0.5, -0.5, -0.5);
-						   diffMax = vec3(0.5, 0.5, 0.5) - pixelPos;
-						   if(diffMin.x>0 && diffMax.x>0 && diffMin.y>0 && diffMax.y>0 && diffMin.z>0 && diffMax.z>0){
-							   rendered=1;
-						   }
-					   } break;
+				diffMin = pixelPos - vec3(-0.5, -0.5, -0.5);
+				diffMax = vec3(0.5, 0.5, 0.5) - pixelPos;
+				if(diffMin.x>0 && diffMax.x>0 && diffMin.y>0 && diffMax.y>0 
+						&& diffMin.z>0 && diffMax.z>0){
+					rendered=1;
+				}
+			} break;
 			case FRAME : {
-							 diffMin = pixelPos - vec3(-0.5, -0.5, -0.5);
-							 diffMax = vec3(0.5, 0.5, 0.5) - pixelPos;
-							 if(diffMin.x>0 && diffMax.x>0 && diffMin.y>0 && diffMax.y>0 && diffMin.z>0 && diffMax.z>0){
-								 rendered=1;
-							 }
-						 } break;
+				diffMin = pixelPos - vec3(-0.5, -0.5, -0.5);
+				diffMax = vec3(0.5, 0.5, 0.5) - pixelPos;
+				if(diffMin.x>0 && diffMax.x>0 && diffMin.y>0 && diffMax.y>0 
+						&& diffMin.z>0 && diffMax.z>0){
+					rendered=1;
+				}
+			} break;
 			case MODEL : {
-							 ivec2 selSize = textureSize(selectTex, 0);
-							 vec4 sel = texelFetch(selectTex,
-									 ivec2(coordX*float(selSize.x), coordY*float(selSize.y)), 0);
-							 //get front surfaces before depth map
-							 if(pixZ<=cutZ+thickness/1000.0) {
-								 if(sel.z==0) {
-									 if(sel.x==shapeID) {
-										 rendered=1;
-									 }
-									 else if((int(shapeIDBit)&int(sel.w))>0) {
-										 diffMin = pixelPos - vec3(-0.5, -0.5, -0.5);
-										 diffMax = vec3(0.5, 0.5, 0.5) - pixelPos;
-										 if(diffMin.x>0 && diffMax.x>0 && diffMin.y>0 && diffMax.y>0 && diffMin.z>0 && diffMax.z>0){
-											 rendered=1;
-										 }
-									 }
-								 }
-								 if(surface>0 && (pixZ>cutZ || (sel.z>0 && (int(shapeIDBit)&int(sel.w))>0))) {
-									 rendered=2;
-								 }
-							 }
-						 } break;
+				ivec2 selSize = textureSize(selectTex, 0);
+				vec4 sel = texelFetch(selectTex,
+				ivec2(coordX*float(selSize.x), coordY*float(selSize.y)), 0);
+				//get front surfaces before depth map
+				if(pixZ<=cutZ+thickness/1000.0) {
+					if(sel.z==0) {
+						if(sel.x==shapeID) {
+							rendered=1;
+						}
+						else if((int(shapeIDBit)&int(sel.w))>0) {
+							diffMin = pixelPos - vec3(-0.5, -0.5, -0.5);
+							diffMax = vec3(0.5, 0.5, 0.5) - pixelPos;
+							if(diffMin.x>0 && diffMax.x>0 && diffMin.y>0 
+									&& diffMax.y>0 && diffMin.z>0 
+									&& diffMax.z>0){
+								rendered=1;
+							}
+						}
+					}
+					if(surface>0 
+							&& (pixZ>cutZ || (sel.z>0 
+									&& (int(shapeIDBit)&int(sel.w))>0))) {
+						rendered=2;
+					}
+				}
+			} break;
 		}
 		if(rendered>0) {
 			ratioWithinBox = (pixelPos)+0.5;
 			//test if on the surface
-			if(diffMin.x*modelScale.x<thickness || diffMax.x*modelScale.x<thickness || diffMin.y*modelScale.y<thickness ||
-					diffMax.y*modelScale.y<thickness || diffMin.z*modelScale.z<thickness || diffMax.z*modelScale.z<thickness) {
+			if(diffMin.x*modelScale.x<thickness 
+					|| diffMax.x*modelScale.x<thickness 
+					|| diffMin.y*modelScale.y<thickness 
+					|| diffMax.y*modelScale.y<thickness 
+					|| diffMin.z*modelScale.z<thickness 
+					|| diffMax.z*modelScale.z<thickness) {
 				rendered=2;
 			}
 			//extend ratiowithinbox to multiplesubshapes
@@ -527,15 +537,24 @@ void main(void) {
 					pixRatio.y = clamp(pixRatio.y, 0.0, 1.0);
 					//compute offset in voxel output
 					int voxOff = outOffset+revVoxels;
-					voxOff+=5*(int(pixRatio.x*voxelOutSize) + int((1.0-pixRatio.y)*voxelOutSize)*voxelOutSize);
+					voxOff+=5*(int(pixRatio.x*voxelOutSize) 
+							+ int((1.0-pixRatio.y)*voxelOutSize)*voxelOutSize);
 					//accumulate points
-					imageAtomicAdd(outputTex, ivec2(mod(voxOff,outCols), floor((voxOff)/outCols)), 1);
+					imageAtomicAdd(outputTex, ivec2(mod(voxOff,outCols), 
+							floor((voxOff)/outCols)), 1);
 					//accumulate coords
-					imageAtomicAdd(outputTex, ivec2(mod(voxOff+1,outCols), floor((voxOff+1)/outCols)), clamp(int(outRatioWithinBox.x*1000.0),0,1000));
-					imageAtomicAdd(outputTex, ivec2(mod(voxOff+2,outCols),floor((voxOff+2)/outCols)), clamp(int(outRatioWithinBox.y*1000.0),0,1000));
-					imageAtomicAdd(outputTex, ivec2(mod(voxOff+3,outCols), floor((voxOff+3)/outCols)), clamp(int(outRatioWithinBox.z*1000.0),0,1000));
+					imageAtomicAdd(outputTex, ivec2(mod(voxOff+1,outCols), 
+							floor((voxOff+1)/outCols)),
+							clamp(int(outRatioWithinBox.x*1000.0),0,1000));
+					imageAtomicAdd(outputTex, ivec2(mod(voxOff+2,outCols), 
+							floor((voxOff+2)/outCols)), 
+							clamp(int(outRatioWithinBox.y*1000.0),0,1000));
+					imageAtomicAdd(outputTex, ivec2(mod(voxOff+3,outCols), 
+							floor((voxOff+3)/outCols)), 
+							clamp(int(outRatioWithinBox.z*1000.0),0,1000));
 					//accumulate lum
-					imageAtomicAdd(outputTex, ivec2(mod(voxOff+4,outCols), floor((voxOff+4)/outCols)),
+					imageAtomicAdd(outputTex, ivec2(mod(voxOff+4,outCols), 
+							floor((voxOff+4)/outCols)),
 							clamp(int(hsv.z*1000.0),0,1000));
 				}
 			}
@@ -546,7 +565,9 @@ void main(void) {
 			finalColor = surfaceColor;
 
 			if(revSurface>0 && sli.x>=1.0 && depthID<=depthOutNb) {
-				imageAtomicMax(outputTex, ivec2(mod(outOffset+revSurface,outCols), floor((outOffset+revSurface)/outCols)), 1);
+				imageAtomicMax(outputTex, 
+						ivec2(mod(outOffset+revSurface,outCols), 
+							floor((outOffset+revSurface)/outCols)), 1);
 			}
 		}
 	}