diff --git a/include/poly.h b/include/poly.h
index 7fa226c..59802b1 100755
--- a/include/poly.h
+++ b/include/poly.h
@@ -15,6 +15,7 @@
 		int size;
 		Vec* position;
 		Vec* rotation;
+		Vec* normal;
 		Color* color;
 	public:
 		Poly();
diff --git a/sources/main.cpp b/sources/main.cpp
index 81e9249..c18caf1 100755
--- a/sources/main.cpp
+++ b/sources/main.cpp
@@ -187,10 +187,21 @@
 		return 1;
 	}
 
-	Vec viewer_zmove_pos = Vec(0.0f, 0.0f, 0.1f);
-	Vec viewer_zmove_neg = Vec(0.0f, 0.0f, -0.1f);
-	Vec viewer_xmove_pos = Vec(0.1f, 0.0f, 0.0f);
-	Vec viewer_xmove_neg = Vec(-0.1f, 0.0f, 0.0f);
+	// current viewport position
+	Vec viewer_pos = Vec(0.0f, 0.0f, -50.0f);
+
+	// viewport movement delta
+	Vec viewer_zmove_pos = Vec(0.0f, 0.0f, -0.3f);
+	Vec viewer_zmove_neg = Vec(0.0f, 0.0f, 0.5f);
+	Vec viewer_xmove_pos = Vec(0.3f, 0.0f, 0.0f);
+	Vec viewer_xmove_neg = Vec(-0.3f, 0.0f, 0.0f);
+
+	// current viewport rotation
+	Vec viewer_rot = Vec(0.0f, 0.0f, 0.0f);
+
+	// viewport rotation delta
+	Vec viewer_zrot = Vec (0.0f, 0.0f, 2.0f);
+	Vec viewer_xrot = Vec (2.0f, 0.0f, 0.0f);
 
 	Color black  (0,0,0);
 	Color blue   (0,0,1);
@@ -323,7 +334,7 @@
 	glEnable (GL_DEPTH_TEST);
 
 	//enable light
-	glEnable(GL_LIGHTING);
+	//glEnable(GL_LIGHTING);
 
 	//light info
 	Vec l0_dir(0.0f, 0.0f, 0.0f);
@@ -346,11 +357,8 @@
 	///////////////////////////////////////////////////////////////////////////
 	// Mainloop:
 
-	float deltay = 0.0f;
-	float deltaz = 0.0f;
 	float deltacolor = 0.0f;
 
-	Vec viewer = Vec(0.0f, 0.0f, -50.0f);
 
 
 	while (!done) {
@@ -365,28 +373,36 @@
 				WINDOW_X/WINDOW_Y,  // width/height ratio
 				1.0f,               // near clipping plane
 				1000.0f);           // far clipping plane
+		
 
-		// Place the viewer 50 units backward:
+
 		glMatrixMode(GL_MODELVIEW);
+	
+		//initial viewer position
 		glLoadIdentity();
-		glTranslatef(viewer.x(), viewer.y(), viewer.z());
-		viewer.vardump(" ");
 
-		// Draw a rotating triangle:
-		glRotatef(deltay, 0.0f, 1.0f, 0.0f); // Rotation around the Y axis
-		glRotatef(deltaz, 1.0f, 0.0f, 0.0f);
+		//rotate viewer
+		glRotatef(viewer_rot.z(), 0.0f, 0.0f, 1.0f);
+		glRotatef(viewer_rot.x(), 1.0f, 0.0f, 0.0f);
 
+		//move viewer
+		glTranslatef(viewer_pos.x(), viewer_pos.y(), viewer_pos.z());
+
+		//draw cube
 		cube->draw();
-		cube->rotate(Vec(0.0f, 0.01f, 0.01f));
+		cube->rotate(Vec(1.0f, 1.0f, 1.0f));
 
 
 		//myModel->draw();
 
+
 		//light0.draw();
 		//light0.trace();
 		//light1.draw();
 		//light1.trace();
 
+		// camera position
+
 		////////////////
 		// Check events:
 		SDL_Event event;
@@ -442,17 +458,17 @@
 			glClearColor(0.0f, 0.0f, 0.5f, 1.0f);
 			}*/
 
-		//scene rotation
-		if (keystate[SDLK_LEFT]) deltay -= 2.0f;		
-		if (keystate[SDLK_RIGHT]) deltay += 2.0f;
-		if (keystate[SDLK_UP]) deltaz -= 2.0f;
-		if (keystate[SDLK_DOWN]) deltaz += 2.0f;
+		// rotate viewer
+		if (keystate[SDLK_LEFT]) viewer_rot.add(viewer_zrot);
+		if (keystate[SDLK_RIGHT]) viewer_rot.sub(viewer_zrot);
+		if (keystate[SDLK_UP]) viewer_rot.add(viewer_xrot);
+		if (keystate[SDLK_DOWN]) viewer_rot.sub(viewer_xrot);
 		
 		// move viewer
-		if (keystate[SDLK_w]) viewer.add(viewer_zmove_neg);
-		if (keystate[SDLK_s]) viewer.add(viewer_zmove_pos);
-		if (keystate[SDLK_a]) viewer.add(viewer_xmove_pos);
-		if (keystate[SDLK_d]) viewer.add(viewer_xmove_neg);
+		if (keystate[SDLK_w]) viewer_pos.add(viewer_zmove_neg);
+		if (keystate[SDLK_s]) viewer_pos.add(viewer_zmove_pos);
+		if (keystate[SDLK_a]) viewer_pos.add(viewer_xmove_pos);
+		if (keystate[SDLK_d]) viewer_pos.add(viewer_xmove_neg);
 
 		if (keystate[SDLK_SPACE]) {
 			deltacolor += 0.01f;
diff --git a/sources/poly.cpp b/sources/poly.cpp
index cad63e3..18da677 100755
--- a/sources/poly.cpp
+++ b/sources/poly.cpp
@@ -14,6 +14,7 @@
 	position = new Vec(0,0,0);
 	rotation = new Vec(0,0,0);
 	color = new Color(1,0,0);
+	normal = new Vec(0,0,0);
 	setCenter(Vec(0,0,0));
 }
 
@@ -31,12 +32,21 @@
 	}
 
 	setCenter(calcCenter());
+		
+	//normal
+	Vec cur =  rotate_xyz(*initpoints.at(1) - *position);
+	Vec prev = rotate_xyz(*initpoints.at(0) - *position);
+	Vec next = rotate_xyz(*initpoints.at(2) - *position);
+	prev = prev - cur; 
+	next = next - cur; 
+	normal = prev.cross(next).normalize().clone();
 }
 
 Poly::~Poly() {
 	delete position;
 	delete rotation;
 	delete color;
+	delete normal;
 }
 
 /*
@@ -121,22 +131,40 @@
 void Poly::draw() {
 	unsigned int vcount = initpoints.size();
 
+	//save camera position
+	glPushMatrix();
+
+	//center poly
+	glTranslatef(-position->x(), -position->y(), -position->z());
+
+	//rotate poly
+	glRotatef(rotation->x(), 1.0f, 0.0f, 0.0f);
+	glRotatef(rotation->y(), 0.0f, 1.0f, 0.0f);
+	glRotatef(rotation->z(), 0.0f, 0.0f, 1.0f);
+	
 	glBegin (GL_POLYGON);
 
 	for ( std::vector<Vec*>::size_type i = 0; i < vcount; i++ ) {
-		Vec cur =  rotate_xyz(*initpoints.at(i) - *position);
-		//normal
-		Vec prev = rotate_xyz(*initpoints.at((i-1+vcount)%vcount) - *position);
-		Vec next = rotate_xyz(*initpoints.at((i+1) % vcount) - *position);
-		prev = prev - cur; 
-		next = next - cur; 
-		glNormal3fv(prev.cross(next).normalize().c);
+	  /* old version
+	  Vec cur =  rotate_xyz(*initpoints.at(i) - *position);
 
-		color->drawColor();
-		glVertex3fv((*position + cur).c);
+	  //normal
+	  Vec prev = rotate_xyz(*initpoints.at((i-1+vcount)%vcount) - *position);
+	  Vec next = rotate_xyz(*initpoints.at((i+1) % vcount) - *position);
+	  prev = prev - cur; 
+	  next = next - cur; 
+	  */
+
+	  glNormal3fv(normal->c);
+	  color->drawColor();
+	  //glVertex3fv((*position + cur).c);	  
+	  glVertex3fv((*initpoints.at(i) - *position).c);
 	}
 
 	glEnd();
+
+	//restore camera position
+	glPopMatrix();
 }
 
 int Poly::numPoints() {