diff --git a/cmath3d/TriangleMesh.h b/cmath3d/TriangleMesh.h
index 7aa390972040f3077171215ec08f17a3d0805fea..4f1165ef41f8e16ee44039e15a77ecfeaa3a97cc 100644
--- a/cmath3d/TriangleMesh.h
+++ b/cmath3d/TriangleMesh.h
@@ -105,6 +105,7 @@ class ActiveMesh
 
 	//the following functions are all defined in graphics.cpp
 	void displayMesh(void);
+	void displayMeshEdges(void);
 	void displayVertexAndNeigs(void);
 	void displayQuadricSurface(void);
 	void displayTEST(void);
diff --git a/src/graphics.cpp b/src/graphics.cpp
index 5fd0ecde6ddef776a9756e812d01a05a532d669a..e5dbc8d3673d9e57b94f64e762768a3e1d172c15 100644
--- a/src/graphics.cpp
+++ b/src/graphics.cpp
@@ -51,6 +51,7 @@ bool showFrame=false;
 bool showBox=true;
 
 bool showWholeMesh=true;
+bool showWholeMeshEdges=false;
 bool showVertexSurface=false;
 bool showQuadricSurface=false;
 bool showTEST=false;
@@ -150,7 +151,6 @@ void displayAxes(void)
 	glVertex3f(params.sceneCentre.x,params.sceneCentre.y,params.sceneCentre.z);
 	glVertex3f(params.sceneCentre.x,params.sceneCentre.y,params.sceneCentre.z+params.sceneSize.z/4.f);
 	glEnd();
-	glLineWidth(1);
 }
 
 
@@ -338,12 +338,31 @@ void ActiveMesh::displayQuadricSurface(void)
 
 void ActiveMesh::displayMesh(void)
 {
-	glColor3f(0.6f,0.6f,0.6f);
+	const float gray=0.6f;
+	glColor4f(gray,gray,gray,1.0f);
+	glLineWidth(1);
+
+	long unsigned int* id=ID.data();
+	for (unsigned int i=0; i < ID.size(); i+=3)
+	{
+		glBegin(GL_TRIANGLES);
+		glNormal3f(norm[i/3].x,norm[i/3].y,norm[i/3].z);
+		glVertex3f(Pos[*id].x,Pos[*id].y,Pos[*id].z); ++id;
+		glVertex3f(Pos[*id].x,Pos[*id].y,Pos[*id].z); ++id;
+		glVertex3f(Pos[*id].x,Pos[*id].y,Pos[*id].z); ++id;
+		glEnd();
+	}
+}
+
+void ActiveMesh::displayMeshEdges(void)
+{
+	const float gray=0.8f;
+	glColor4f(gray,gray,gray,1.0f);
+	glLineWidth(3);
 
 	long unsigned int* id=ID.data();
 	for (unsigned int i=0; i < ID.size(); i+=3)
 	{
-		//glBegin(GL_TRIANGLES);
 		glBegin(GL_LINE_LOOP);
 		glNormal3f(norm[i/3].x,norm[i/3].y,norm[i/3].z);
 		glVertex3f(Pos[*id].x,Pos[*id].y,Pos[*id].z); ++id;
@@ -356,7 +375,7 @@ void ActiveMesh::displayMesh(void)
 
 void display(void)
 {
-	glClear(GL_COLOR_BUFFER_BIT);
+	glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
 	glLoadIdentity();
 	glTranslatef(params.sceneCentre.x,params.sceneCentre.y,params.sceneCentre.z);
 	glScalef(zoom,zoom,zoom);
@@ -372,14 +391,16 @@ void display(void)
 	glEnable(GL_FOG);
 	if (showBox) displayBox();
 	if (showFrame) displayFrame();
-	if (showAxes) displayAxes();
 	glDisable(GL_FOG);
 
 	if (showWholeMesh) mesh.displayMesh();
+	if (showWholeMeshEdges) mesh.displayMeshEdges();
 	if (showVertexSurface) mesh.displayVertexAndNeigs();
 	if (showQuadricSurface) mesh.displayQuadricSurface();
 	if (showTEST) mesh.displayTEST();
 
+	if (showAxes) displayAxes();
+
 	glFlush();
 	glutSwapBuffers();
 }
@@ -435,6 +456,7 @@ void printKeysHelp(void)
 	std::cout << "'h': displays this help\n";
 	std::cout << "'d': displays enabled features,displays status\n";
 	std::cout << "'m': toggle display of the mesh\n";
+	std::cout << "'e': toggle display of the mesh wireframe (triangle edges)'\n";
 	std::cout << "'v': toggle display of the vertex supporting region\n";
 	std::cout << "'V': chooses another vertex\n";
 	std::cout << "'s': toggle display of the fitted quadratic surface \n";
@@ -532,6 +554,10 @@ void keyboard(unsigned char key, int mx, int my)
 				showWholeMesh^=true;
 				glutPostRedisplay();
 				break;
+			case 'e':
+				showWholeMeshEdges^=true;
+				glutPostRedisplay();
+				break;
 			case 'v':
 				showVertexSurface^=true;
 				glutPostRedisplay();
@@ -565,11 +591,24 @@ void keyboard(unsigned char key, int mx, int my)
 
 			//some testing controls
 			case 'x':
-				//glEnable(GL_FOG);
+				glPolygonMode(GL_FRONT,GL_LINE);
 				glutPostRedisplay();
 				break;
 			case 'X':
-				//glDisable(GL_FOG);
+				glPolygonMode(GL_FRONT,GL_FILL);
+				glutPostRedisplay();
+				/*
+				GLfloat ranges[10];
+				glGetFloatv(GL_DEPTH_RANGE,ranges);
+				std::cout << "near=" << ranges[0] << ", far=" << ranges[1] << "\n";
+				*/
+				break;
+			case 'c':
+				glDisable(GL_DEPTH_TEST);
+				glutPostRedisplay();
+				break;
+			case 'C':
+				glEnable(GL_DEPTH_TEST);
 				glutPostRedisplay();
 				break;
 
@@ -694,8 +733,7 @@ void initializeGL(void)
 
     glutInit(&Argc, Argv);
 
-    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA);
-    //glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
+    glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH);
     glutInitWindowSize(800, 800); 
     glutInitWindowPosition(600, 100);
     glutCreateWindow(Argv[0]);
@@ -714,9 +752,21 @@ void initializeGL(void)
     glEnable(GL_BLEND);
     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
 
+	 //filter rendered points (should look nicer)
     glEnable(GL_POINT_SMOOTH);
-    //glEnable(GL_CULL_FACE);
-	 //glEnable(GL_DEPTH_TEST);
+
+	 //default displaying mode for triangles
+	 //frontfaces are just lines, backfaces are opaque
+	 glPolygonMode(GL_FRONT,GL_LINE);
+	 glPolygonMode(GL_BACK, GL_FILL);
+
+	 //but, well, do not draw backfaces at all
+    glEnable(GL_CULL_FACE);
+	 glCullFace(GL_BACK);
+
+	 //enable z-buffer;
+	 //otherwise it would depend on the order of primitives drawing
+	 glEnable(GL_DEPTH_TEST);
 
 	 //set up the fog (is enabled/disabled before/after drawing frames):
 	 GLfloat fogColor[4]={0.4f*params.sceneBorderColour.r,
@@ -731,6 +781,8 @@ void initializeGL(void)
 	 //
 	 glFogf(GL_FOG_START,params.sceneOffset.z);
 	 glFogf(GL_FOG_END,params.sceneOffset.z+params.sceneSize.z);
+
+	 //some OpenGL info, for fun...
 	 std::cout << "Vendor  : " << glGetString(GL_VENDOR) << "\n";
 	 std::cout << "Renderer: " << glGetString(GL_RENDERER) << "\n";
 	 std::cout << "Version : " << glGetString(GL_VERSION) << "\n";