diff --git a/include/model.h b/include/model.h
index 064e288..2fc9b44 100755
--- a/include/model.h
+++ b/include/model.h
@@ -19,6 +19,7 @@
 		Model(std::vector<Poly*> & _faces);
 		~Model();
 		void setCenter(Vec& c);
+		void setCenter(Vec* c);
 		Vec calcCenter();
 		void rotate(Vec rot);
 		void draw();
@@ -29,5 +30,6 @@
 		float getDelta();
 		void showNormals();
 		void hideNormals();
+		Model* clone();
 };
 #endif
diff --git a/include/poly.h b/include/poly.h
index 600a530..33a24e5 100755
--- a/include/poly.h
+++ b/include/poly.h
@@ -25,6 +25,7 @@
 		Poly(std::vector<Vec*> & _points, Color _color);
 		~Poly();
 		void setCenter(Vec c);
+		void setCenter(Vec* c);
 		Vec getInitRotation(Vec& v);
 		Vec calcCenter();
 		void setPosition(Vec newcenter);
@@ -38,10 +39,12 @@
 		void vardump(std::string whitespace);
 		void addPoint(Vec* p);
 		void setColor(Color c);
+		void setColor(Color* c);
 		Color* getColor();
 		void setDelta(float d);
 		void showNormals();
 		void hideNormals();
 		void calcNormal();
+		Poly* clone();
 };
 #endif
diff --git a/include/vec.h b/include/vec.h
index 2dadadc..42a0fea 100755
--- a/include/vec.h
+++ b/include/vec.h
@@ -20,6 +20,8 @@
 		float* getCoords();
 		Vec operator+(Vec* v);
 		Vec operator+(Vec c);
+		void add(Vec a);
+		void sub(Vec a);
 		void add(Vec& a);
 		void sub(Vec& a);
 		Vec operator-(Vec& v);
diff --git a/obj/sample2.obj b/obj/sample2.obj
new file mode 100755
index 0000000..461ce81
--- /dev/null
+++ b/obj/sample2.obj
@@ -0,0 +1,11 @@
+v 0 0 0
+v 5 5 3
+v 10 0 0
+v 0 0 10
+v 5 5 7
+v 10 0 10
+f 4 6 5
+f 3 1 2
+f 1 3 6 4
+f 2 5 6 3
+f 2 1 4 5
diff --git a/sources/main.cpp b/sources/main.cpp
index a9a5cfa..3496f91 100755
--- a/sources/main.cpp
+++ b/sources/main.cpp
@@ -212,7 +212,11 @@
 	Color white  (1,1,1);
 	Color green  (0,1,0);
 	Color cyan   (0,1,1);
+	Color grey   (0.5f,0.5f,0.5f);
 
+	std::vector<Model*> models;
+
+	/* begin cube */
 	Vec* ulh  = new Vec(0 ,0 ,0 );
 	Vec* ulv  = new Vec(0 ,0 ,10);
 	Vec* urv  = new Vec(10,0 ,10);
@@ -223,7 +227,7 @@
 	Vec* orv  = new Vec(10,10,10);
 	Vec* orh  = new Vec(10,10,0 );
 
-	Vec cen (5,5,5);
+	Vec cen (5,0,5);
 	
 	Model* cube = new Model();
 
@@ -272,20 +276,46 @@
 	cube->addFace(new Poly(front, white));
 	
 	cube->setCenter(cen);
+	//cube->setDelta(PI/2.0);
 
-	cube->showNormals();
+	//cube->showNormals();
+	
+	/* end cube */
 
+	//models.push_back(cube);
+
+	/* begin import */
+	char* modelfile = "obj/sample2.obj";
 	//char* modelfile = "obj/sample.obj";
-	char* modelfile = "obj/untitled.obj";
+	//char* modelfile = "obj/untitled.obj";
 	//char* modelfile = "obj/teapot.obj";
 	Model* myModel = importModel(modelfile);
 	printf("imported %s : %d faces\n", modelfile, myModel->numFaces());
-	Vec myCen = Vec(0,0,0);
+	Vec myCen = Vec(5,-10,5);
 	myModel->setCenter(myCen);
-	myModel->setDelta(PI);
+	//myModel->showNormals();
+	myModel->setDelta(PI/2.0);
 
 	//myModel->vardump("");
 	
+	/* end import */
+	
+	//models.push_back(myModel);
+	
+	/* stage */
+	Model* stage = new Model();
+	Vec* lr = new Vec(-1000000.0f, 0.0f, -1000000.0f);
+	Vec* lf = new Vec(-1000000.0f, 0.0f, 1000000.0f);
+	Vec* rr = new Vec(1000000.0f, 0.0f, -1000000.0f);
+	Vec* rf = new Vec(1000000.0f, 0.0f, 1000000.0f);
+	Poly* sp = new Poly();
+	sp->addPoint(lr);
+	sp->addPoint(lf);
+	sp->addPoint(rf);
+	sp->addPoint(rr);
+	sp->setColor(grey);
+	stage->addFace(sp);
+	
 	// Prepare configuration:
 	int bitsPerColor = 8;
 	if (WINDOW_COLORDEPTH == 16) {
@@ -340,7 +370,7 @@
 
 	glEnable(GL_COLOR_MATERIAL);
 
-	//glShadeModel(GL_SMOOTH);
+	glShadeModel(GL_SMOOTH);
   
 	///////////////////////////////////////////////////////////////////////////
 	///////////////////////////////////////////////////////////////////////////
@@ -351,6 +381,23 @@
 	float deltacolor = 0.0f;
 	int react_keyevent = 0;
 
+	float viewerMovingSpeed = 1.0f;
+
+	std::vector<Model*>::size_type modelCounter = 0;
+
+	Model* t;
+	for ( int i = 0; i < 50; i++ ) {
+		t = cube->clone();
+		t->rotate(Vec(i*5.0f, 0.0f, 0.0f));
+		t->setCenter(new Vec(200.0f*cos(((float)i)*PI/50.0f), 0.0f, 200.0f*sin(((float)i)*PI/50.0f)));
+		models.push_back(t);
+	}
+	for ( int i = 1; i < 50; i++ ) {
+		t = cube->clone();
+		t->rotate(Vec(i*-5.0f, 0.0f, 0.0f));
+		t->setCenter(new Vec(200.0f*cos(((float)-i)*PI/50.0f), 0.0f, 200.0f*sin(((float)-i)*PI/50.0f)));
+		models.push_back(t);
+	}
 
 	while (!done) {
 		/////////////////////
@@ -371,6 +418,7 @@
 	
 		//initial viewer position
 		glLoadIdentity();
+
 		
 		//move viewer
 		glTranslatef(viewer_pos.x(), viewer_pos.y(), viewer_pos.z());
@@ -380,12 +428,28 @@
 		glRotatef(viewer_rot.y(), 0.0f, 1.0f, 0.0f);
 		glRotatef(viewer_rot.x(), 1.0f, 0.0f, 0.0f);
 
-		//draw cube
-		cube->draw();
-		cube->rotate(Vec(0.1f, 0.5f, 1.0f));
+		/* draw x- axis */
+		//glBegin(GL_LINES); black.drawColor(); glVertex3f(-1000000.0f, 0.0f, 0.0f); glVertex3f(1000000.0f, 0.0f, 0.0f); glEnd();
+		/* draw y- axis */
+		//glBegin(GL_LINES); black.drawColor(); glVertex3f(0.0f, -1000000.0f, 0.0f); glVertex3f(0.0f, 1000000.0f, 0.0f); glEnd();
+		/* draw z- axis */
+		//glBegin(GL_LINES); black.drawColor(); glVertex3f(0.0f, 0.0f, -1000000.0f); glVertex3f(0.0f, 0.0f, 1000000.0f); glEnd();
 
+		stage->draw();
+
+		for ( modelCounter = 0; modelCounter < models.size(); modelCounter++ ) {
+			models.at(modelCounter)->draw();
+			models.at(modelCounter)->rotate(Vec(1.5f, 0.0f, 0.0f));
+		}
+
+		cube->draw();
 		myModel->draw();
-		myModel->rotate(Vec(0.2f, 0.3f, 1.2f));
+
+		//draw cube
+		//cube->draw();
+		//cube->rotate(Vec(0.1f, 0.5f, 1.0f));
+		//myModel->draw();
+		//myModel->rotate(Vec(0.2f, 0.3f, 1.2f));
 
 
 		////////////////
@@ -457,17 +521,24 @@
 			glClearColor(0.0f, 0.0f, 0.5f, 1.0f);
 			}*/
 
+		// speed
+		if ( keystate[SDLK_LSHIFT] || keystate[SDLK_RSHIFT] ) {
+			viewerMovingSpeed = 10.0f;
+		} else {
+			viewerMovingSpeed = 1.0f;
+		}
+
 		// rotate viewer
-		if (keystate[SDLK_LEFT]) viewer_rot.add(viewer_yrot);
-		if (keystate[SDLK_RIGHT]) viewer_rot.sub(viewer_yrot);
-		if (keystate[SDLK_UP]) viewer_rot.add(viewer_xrot);
-		if (keystate[SDLK_DOWN]) viewer_rot.sub(viewer_xrot);
+		if (keystate[SDLK_LEFT]) viewer_rot.add(viewer_yrot*viewerMovingSpeed);
+		if (keystate[SDLK_RIGHT]) viewer_rot.sub(viewer_yrot*viewerMovingSpeed);
+		if (keystate[SDLK_UP]) viewer_rot.add(viewer_xrot*viewerMovingSpeed);
+		if (keystate[SDLK_DOWN]) viewer_rot.sub(viewer_xrot*viewerMovingSpeed);
 		
 		// move viewer
-		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_w]) viewer_pos.add(viewer_zmove_neg*viewerMovingSpeed);
+		if (keystate[SDLK_s]) viewer_pos.add(viewer_zmove_pos*viewerMovingSpeed);
+		if (keystate[SDLK_a]) viewer_pos.add(viewer_xmove_pos*viewerMovingSpeed);
+		if (keystate[SDLK_d]) viewer_pos.add(viewer_xmove_neg*viewerMovingSpeed);
 
 		if (keystate[SDLK_SPACE]) {
 			deltacolor += 0.01f;
diff --git a/sources/model.cpp b/sources/model.cpp
index 1156db4..8af3e08 100755
--- a/sources/model.cpp
+++ b/sources/model.cpp
@@ -22,11 +22,19 @@
 	delete rotation;
 }
 
+void Model::setCenter(Vec* c) {
+	position = c->clone();
+
+	for (std::vector<Poly*>::size_type i = 0 ; i < faces.size(); i++ ) {
+		faces.at(i)->setCenter(position);
+	}
+}
+
 void Model::setCenter(Vec& c) {  
 	position = c.clone();
 
 	for (std::vector<Poly*>::size_type i = 0 ; i < faces.size(); i++ ) {
-	  faces.at(i)->setCenter(c);
+		faces.at(i)->setCenter(c);
 	}
 }
 
@@ -45,7 +53,7 @@
 }
 
 void Model::rotate(Vec rot) {
-	rotation->add(rot);
+	rotation->add((Vec)rot);
 
 	for (std::vector<Poly*>::size_type i = 0 ; i < faces.size(); i++ ) {
 		faces.at(i)->rotate(rot);
@@ -99,3 +107,16 @@
 		faces.at(i)->hideNormals();
 	}
 }
+
+Model* Model::clone() {
+	Model* nm = new Model();
+
+	for (std::vector<Poly*>::size_type i = 0 ; i < faces.size(); i++ ) {
+		nm->addFace(faces.at(i)->clone());
+	}
+
+	nm->setCenter(position);
+	nm->setDelta(delta);
+
+	return nm;
+}
diff --git a/sources/poly.cpp b/sources/poly.cpp
index 32576a9..d25e6fa 100755
--- a/sources/poly.cpp
+++ b/sources/poly.cpp
@@ -62,6 +62,10 @@
 	position = c.clone();
 }
 
+void Poly::setCenter(Vec* c) {
+	position = c->clone();
+}
+
 /*
 * initial rotation relative to rotation center
 */
@@ -96,13 +100,13 @@
 	position = newcenter.clone();
 
 	for ( std::vector<Vec*>::size_type i = 0; i < initpoints.size(); i++ ) {
-		initpoints.at(i)->add(diff);
+		initpoints.at(i)->add((Vec)diff);
 	}
 }
 
 //additional rotation in arcs
 void Poly::rotate(Vec rot) {
-	rotation->add(rot);
+	rotation->add((Vec)rot);
 }
 
 Vec Poly::rotate_x(Vec& c) {
@@ -154,8 +158,8 @@
 		/* draw face normal */
 		glBegin(GL_LINES);
 			nc.drawColor();
-			glVertex3fv((calcCenter()-*position).c);
-			glVertex3fv((calcCenter()+(*normal * 3.0f)-*position).c);
+			glVertex3fv(calcCenter().c);
+			glVertex3fv((calcCenter()+(*normal * 3.0f)).c);
 		glEnd();
 
 		/* draw vertex normals */
@@ -164,8 +168,8 @@
 				/* face normal */
 				glBegin(GL_LINES);
 					nc.drawColor();
-					glVertex3fv((*initpoints.at(i)-*position).c);
-					glVertex3fv((*initpoints.at(i)+(*normal * 1.5f)-*position).c);
+					glVertex3fv((*initpoints.at(i)).c);
+					glVertex3fv((*initpoints.at(i)+(*normal * 1.5f)).c);
 				glEnd();
 			} else {
 				/* vertex normal (delta) */
@@ -181,10 +185,12 @@
 					}
 				}
 
+				n = n.normalize();
+
 				glBegin(GL_LINES);
 					nc.drawColor();
-					glVertex3fv((*initpoints.at(i)-*position).c);
-					glVertex3fv((*initpoints.at(i)+(*normal * 1.5f)-*position).c);
+					glVertex3fv((*initpoints.at(i)).c);
+					glVertex3fv((*initpoints.at(i)+(n * 1.5f)).c);
 				glEnd();
 			}
 		}
@@ -211,11 +217,13 @@
 				}
 			}
 
+			n = n.normalize();
+
 			glNormal3fv(n.c);
 		}
 
 		color->drawColor();
-		glVertex3fv((*initpoints.at(i) - *position).c);
+		glVertex3fv((*initpoints.at(i)).c);
 	}
 
 	glEnd();
@@ -254,6 +262,10 @@
 	color = c.clone();
 }
 
+void Poly::setColor(Color* c) {
+	color = c->clone();
+}
+
 Color* Poly::getColor() {
 	return color;
 }
@@ -269,3 +281,23 @@
 void Poly::hideNormals() {
 	drawNormals = false;
 }
+
+Poly* Poly::clone() {
+	Poly* np = new Poly();
+
+	for (std::vector<Vec*>::size_type i = 0 ; i < initpoints.size(); i++ ) {
+		np->addPoint(initpoints.at(i)->clone());
+	}
+
+	if ( drawNormals ) {
+		np->showNormals();
+	} else {
+		np->hideNormals();
+	}
+
+	np->setDelta(delta);
+	np->setCenter(position);
+	np->setColor(color);
+
+	return np;
+}
diff --git a/sources/vec.cpp b/sources/vec.cpp
index 182f9c1..ad7f930 100755
--- a/sources/vec.cpp
+++ b/sources/vec.cpp
@@ -43,6 +43,17 @@
 	return Vec(x() + v.x(), y() + v.y(), z() + v.z());
 }
 
+void Vec::add(Vec a) {
+	c[0] += a.x();
+	c[1] += a.y();
+	c[2] += a.z();
+}
+
+void Vec::sub(Vec a) {
+	c[0] -= a.x();
+	c[1] -= a.y();
+	c[2] -= a.z();
+}
 
 void Vec::add(Vec& a) {
 	c[0] += a.x();