diff --git a/src/TriangleMesh.cpp b/src/TriangleMesh.cpp
index 0cc768f79cb5a226c3bcd5227ef53cd02c65fc9f..a82653ef2bcf8d7398354022ad4545fe93a05fe6 100644
--- a/src/TriangleMesh.cpp
+++ b/src/TriangleMesh.cpp
@@ -1410,6 +1410,10 @@ void ActiveMesh::ScaleMesh(const Vector3F& scale)
 			filoMesh.fPoints[i].y*=scale.y;
 			filoMesh.fPoints[i].z*=scale.z;
 		}
+		for (unsigned int i=0; i< filoMesh.segFromRadius.size(); i++)
+		{
+			 filoMesh.segFromRadius[i] *= 80.f;
+		}
 	}
 }
 
@@ -1456,13 +1460,14 @@ void ActiveMesh::InitDots_body(const i3d::Image3d<i3d::GRAY16>& mask)
 
 	i3d::Image3d<float> perlinInner,perlinOutside;
 	perlinInner.CopyMetaData(mask);
-	DoPerlin3D(perlinInner,5.0,0.8*1.5,0.7*1.5,6);
+//	DoPerlin3D(perlinInner,5.0,0.8*1.5,0.7*1.5,6);
+	DoPerlin3D(perlinInner,1.0,0.8*1.3,0.7*1.5,6);
 #ifdef SAVE_INTERMEDIATE_IMAGES
 	//perlinInner.SaveImage("2_PerlinAlone_Inner.ics");
 #endif
 
 	perlinOutside.CopyMetaData(mask);
-	DoPerlin3D(perlinOutside,1.8,0.8*1.5,0.7*1.5,6);
+	DoPerlin3D(perlinOutside,1.4,0.8*1.1,0.7*1.5,6);
 #ifdef SAVE_INTERMEDIATE_IMAGES
 	//perlinOutside.SaveImage("2_PerlinAlone_Outside.ics");
 #endif
@@ -1482,9 +1487,17 @@ void ActiveMesh::InitDots_body(const i3d::Image3d<i3d::GRAY16>& mask)
 		if (*p > 0.f)
 		{
 			//close to the surface?
-			if (*p < 0.3f || *er == 0) *p=2000.f + 5000.f*(*pO); //corona
-			else                       *p=600.f  + 600.f*(*pI);  //inside
-			if (*er == 0) *p=2000.f; //std::max(*p,2000.f);                //corona
+			if (*p < 0.2f || *er == 0) 
+				 *p=1000.f + 5000.f*(*pO); //corona
+			else if (*p < 0.4f)
+			{
+				 float factor = (*p - 0.2f)/(0.2f);
+				 *p=(300.f  + 600.f*(*pI))*factor +  (1000.f + 5000.f*(*pO))*(1.0f-factor);
+			}
+			else
+				 *p=300.f  + 600.f*(*pI);  //inside
+
+			if (*er == 0) *p=1500.f; //corona
 
 			if (*p < 0.f) *p=0.f;
 		}
@@ -1551,8 +1564,8 @@ void ActiveMesh::InitDots_filo(const i3d::Image3d<i3d::GRAY16>& mask,const unsig
 		const float length=(tP-fP).Len(); //full segment has length = 0.005
 
 		//stepping along the axis
-		const int S=(int)ceil(5.f*length/0.005); //"fraction factor"
-		//std::cout << "S=" << S << ", length=" << length << "\n";
+		const int S=(int)ceil(5.f*length/0.005); //"fraction factor"\
+
 		for (int s=0; s < S; ++s)
 		{
 			//ratios "from" and "to"
@@ -1570,19 +1583,39 @@ void ActiveMesh::InitDots_filo(const i3d::Image3d<i3d::GRAY16>& mask,const unsig
 			         p+=tS*tP;
 
 			//insert fl. dots
-			r*=4000.f;
+			float dotsCount=400000.f*r;
+
+			// prevent data overflow (5 - multiplicity of addition)
+			int upper_limit = std::numeric_limits<i3d::GRAY16>::max() / (5 * TEXTURE_QUANTIZATION);
+			int qM=(dotsCount > upper_limit)? upper_limit : (int)dotsCount;
+
+			// establish 4 vectors  - all orthogonal to the direction of filopodium
+			Vector3F mainDirection = tP-fP;
+			Vector3F vector1(-mainDirection.y, mainDirection.x, 0.0f);
+			Vector3F vector2(-vector1.x, -vector1.y, -vector1.z);
+
+			Vector3F vector3;
+			Mul(mainDirection, vector1, vector3);
 
-			//std::cout << s << ": r=" << r << ", r*r=" << r*r << "\n";
+			Vector3F vector4;
+			Mul(mainDirection, vector2, vector4);
+
+			// make them as small as the size of the radius in the given position
+			vector1 *= r / vector1.Len();
+			vector2 *= r / vector2.Len();
+			vector3 *= r / vector3.Len();
+			vector4 *= r / vector4.Len();
 
-			//float dotsCount=10.f*r*r;
-			float dotsCount=100.f*r;
-			int qM=(dotsCount > 1300.f)? 1300 : (int)dotsCount;
 
 			for (int q=0; q < qM; ++q)
 			{
 				dots_filo.push_back(p);
-				dots_filo.push_back(p+Vector3F(0.0f,0.0f,+0.1f));
-				dots_filo.push_back(p+Vector3F(0.0f,0.0f,-0.1f));
+				//dots_filo.push_back(p+Vector3F(0.0f,0.0f,+100*r));
+				//dots_filo.push_back(p+Vector3F(0.0f,0.0f,-100*r));
+				dots_filo.push_back(p+vector1);
+				dots_filo.push_back(p+vector2);
+				dots_filo.push_back(p+vector3);
+				dots_filo.push_back(p+vector4);
 			}
 		}
 	}
@@ -1897,10 +1930,6 @@ void ActiveMesh::PhaseII(const i3d::Image3d<i3d::GRAY16>& texture,
 	// convolution with real confocal PSF
 	i3d::Convolution<double>(fimg, psf, blurred_texture);
 
-	// DEPRECATED - remove:
-	// i3d::GaussIIR(intermediate,3.f,3.f,2.5f);
-	// i3d::GaussIIR(intermediate,2.f,2.f,2.f);
-
 #ifdef SAVE_INTERMEDIATE_IMAGES
 	blurred_texture.SaveImage("4_texture_blurred.ics");
 #endif
@@ -1930,6 +1959,10 @@ void ActiveMesh::PhaseIII(i3d::Image3d<float>& blurred,
 	float* p=blurred.GetFirstVoxelAddr();
 	for (size_t i=0; i<blurred.GetImageSize(); i++, p++)
 	{
+		// shift the signal (simulates non-ideal black background)
+		// ?reflection of medium?
+		*p+=10.0f;
+
 		// PHOTON NOISE 
 		// uncertainty in the number of incoming photons
 		// from statistics: shot noise = sqrt(signal) 
@@ -1938,16 +1971,16 @@ void ActiveMesh::PhaseIII(i3d::Image3d<float>& blurred,
 		// for Poisson distribution E(X) = D(X)
 		const float noiseVar = noiseMean; 
 
-		*p+=30.f*((float)GetRandomPoisson(noiseMean) - noiseVar);
+		*p+=40.f*((float)GetRandomPoisson(noiseMean) - noiseVar);
 
-		// DARK CURRENT NOISE
+		// DARK CURRENT
 		// constants are parameters of Andor iXon camera provided from vendor:
 		*p+=(float)GetRandomPoisson(0.06f);
 
 		// READOUT NOISE
 		// variance up to 25.f (old camera on ILBIT)
 		// variance about 1.f (for the new camera on ILBIT)
-		*p+=GetRandomGauss(560.f,15.f);
+		*p+=GetRandomGauss(450.f,10.f);
 	}
 #ifdef SAVE_INTERMEDIATE_IMAGES
 	blurred.SaveImage("6_texture_finalized.ics");