diff --git a/VirtualRobot/MathTools.h b/VirtualRobot/MathTools.h
index 780f96bbcf0e9b41f4f7e7cde972e97242ab6ff5..f60e84319985ea2a57abc6d81a0f8364887179be 100644
--- a/VirtualRobot/MathTools.h
+++ b/VirtualRobot/MathTools.h
@@ -341,10 +341,26 @@ namespace MathTools
 		{
 			this->id1 = id1; this->id2 = id2; this->id3 = id3;
 		}
+        void setColor(unsigned int idColor1, unsigned int idColor2, unsigned int idColor3) {
+            this->idColor1 = idColor1; this->idColor2 = idColor2; this->idColor3 = idColor3;
+        }
+        void setMaterial(unsigned int idMaterial) {
+            this->idMaterial = idMaterial;
+        }
+
 		// id == position in vertex array
 		unsigned int id1;
 		unsigned int id2;
 		unsigned int id3;
+
+        // idColor == position in color array
+        unsigned int idColor1;
+        unsigned int idColor2;
+        unsigned int idColor3;
+
+        // idMaterial == position in material array
+        unsigned int idMaterial;
+
 		Eigen::Vector3f normal;
 	};
 	struct TriangleFace6D
diff --git a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.cpp b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.cpp
index 553eee8de58c6489bb18e67bd22e94ee75a48104..da7c53c1fca8fab07e0be32ac7338322ece573e0 100644
--- a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.cpp
+++ b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.cpp
@@ -736,7 +736,17 @@ namespace VirtualRobot {
         return pGrid;
     }
 
-    SoSeparator* CoinVisualizationFactory::CreatePolygonVisualization( const std::vector<Eigen::Vector3f> &points, VisualizationFactory::Color colorInner /*= VisualizationFactory::Color::Blue()*/, VisualizationFactory::Color colorLine /*= VisualizationFactory::Color::Black()*/, float lineSize /*= 4.0f*/ )
+    SoSeparator* CoinVisualizationFactory::CreatePolygonVisualization( const std::vector<Eigen::Vector3f> &points, VisualizationFactory::Color colorInner, VisualizationFactory::Color colorLine, float lineSize)
+    {
+        VisualizationFactory::PhongMaterial mat;
+        mat.diffuse = colorInner;
+        mat.ambient = colorInner;
+        mat.transparency = colorInner.transparency;
+
+        return CreatePolygonVisualization(points, mat, colorLine, lineSize);
+    }
+
+    SoSeparator* CoinVisualizationFactory::CreatePolygonVisualization( const std::vector<Eigen::Vector3f> &points, VisualizationFactory::PhongMaterial mat, VisualizationFactory::Color colorLine, float lineSize)
     {
         SoSeparator* visu = new SoSeparator;
         if (points.size()==0)
@@ -747,14 +757,14 @@ namespace VirtualRobot {
         u->units = SoUnits::MILLIMETERS;
         visu->addChild(u);
 
-		if (!colorInner.isNone())
-		{
-			SoMaterial *m = new SoMaterial;
-			m->diffuseColor.setValue(colorInner.r, colorInner.g, colorInner.b);
-			m->ambientColor.setValue(colorInner.r, colorInner.g, colorInner.b);
-			m->transparency.setValue(colorInner.transparency);
-			visu->addChild(m);
-		}
+        SoMaterial *m = new SoMaterial;
+        m->diffuseColor.setValue(mat.diffuse.r, mat.diffuse.g, mat.diffuse.b);
+        m->ambientColor.setValue(mat.ambient.r, mat.ambient.g, mat.ambient.b);
+        m->emissiveColor.setValue(mat.emission.r, mat.emission.g, mat.emission.b);
+//        m->shininess.setValue(mat.shininess, mat.shininess, mat.shininess);
+        m->specularColor.setValue(mat.specular.r, mat.specular.g, mat.specular.b);
+        m->transparency.setValue(mat.transparency);
+        visu->addChild(m);
 
         SoCoordinate3* coordinate3 = new SoCoordinate3;
         SoCoordinate3* coordinate3b = new SoCoordinate3;
@@ -993,7 +1003,18 @@ namespace VirtualRobot {
             v.push_back(v1);
             v.push_back(v2);
             v.push_back(v3);
-            SoSeparator* s = CreatePolygonVisualization(v,color,lineColor,lineSize);
+//            SoSeparator* s = CreatePolygonVisualization(v,color,lineColor,lineSize);
+
+            VisualizationFactory::Color triColor = (model->colors.size() == 0)? color : model->colors[model->faces[i].idColor1];
+
+            SoSeparator* s;
+            if (model->materials.size() == 0) {
+                s = CreatePolygonVisualization(v,triColor,lineColor,lineSize);
+            } else {
+                VisualizationFactory::PhongMaterial mat = model->materials[model->faces[i].idMaterial];
+                s = CreatePolygonVisualization(v, mat, lineColor,lineSize);
+            }
+
             res->addChild(s);
             if (showNormals)
             {
diff --git a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h
index 9bfc25ba56227d329fdb1123bf8e4c91db357bb9..b4009c28613144aad8b7be558f51162ec3625b96 100644
--- a/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h
+++ b/VirtualRobot/Visualization/CoinVisualization/CoinVisualizationFactory.h
@@ -104,6 +104,7 @@ public:
 
 	static SoSeparator* CreateConvexHull2DVisualization(const MathTools::ConvexHull2DPtr ch, MathTools::Plane &p, VisualizationFactory::Color colorInner = VisualizationFactory::Color::Blue(), VisualizationFactory::Color colorLine = VisualizationFactory::Color::Black(), float lineSize = 5.0f, const Eigen::Vector3f &offset =Eigen::Vector3f::Zero() );
 	static SoSeparator* CreatePolygonVisualization(const std::vector<Eigen::Vector3f> &points, VisualizationFactory::Color colorInner = VisualizationFactory::Color::Blue(), VisualizationFactory::Color colorLine = VisualizationFactory::Color::Black(), float lineSize = 4.0f);
+    static SoSeparator* CreatePolygonVisualization(const std::vector<Eigen::Vector3f> &points, VisualizationFactory::PhongMaterial mat, VisualizationFactory::Color colorLine = VisualizationFactory::Color::Black(), float lineSize = 4.0f);
     static SoSeparator* CreatePlaneVisualization(const Eigen::Vector3f &position, const Eigen::Vector3f &normal, float extend, float transparency, bool grid=true,  float colorR = 0.5f, float colorG = 0.5f, float colorB = 0.5f, std::string textureFile = std::string());
 	static SoSeparator* CreateCoordSystemVisualization(float scaling = 1.0f, std::string *text = NULL, float axisLength = 100.0f, float axisSize = 3.0f, int nrOfBlocks = 10);
 	static SoSeparator* CreateBoundingBox(SoNode* ivModel, bool wireFrame=false);
diff --git a/VirtualRobot/Visualization/TriMeshModel.cpp b/VirtualRobot/Visualization/TriMeshModel.cpp
index 6afc7881f8883d538e8b50d248d403c99c2e5252..4f382be731b17838c98fa73f2e56f2461411dd8e 100644
--- a/VirtualRobot/Visualization/TriMeshModel.cpp
+++ b/VirtualRobot/Visualization/TriMeshModel.cpp
@@ -14,7 +14,6 @@
 #include <iomanip>
 namespace VirtualRobot {
 
-
 /**
  * This method adds the vertices \p vertex1,
  * \p vertex2 and \p vertex3 to TriMeshModel::vertices and creates a new
@@ -30,12 +29,16 @@ void TriMeshModel::addTriangleWithFace(Eigen::Vector3f& vertex1, Eigen::Vector3f
 	addTriangleWithFace (vertex1,vertex2,vertex3,normal);
 }
 
-void TriMeshModel::addTriangleWithFace( Eigen::Vector3f& vertex1, Eigen::Vector3f& vertex2, Eigen::Vector3f& vertex3, Eigen::Vector3f& normal )
+void TriMeshModel::addTriangleWithFace( Eigen::Vector3f& vertex1, Eigen::Vector3f& vertex2, Eigen::Vector3f& vertex3, Eigen::Vector3f& normal, VisualizationFactory::Color color1, VisualizationFactory::Color color2, VisualizationFactory::Color color3 )
 {
 	this->addVertex(vertex1);
 	this->addVertex(vertex2);
 	this->addVertex(vertex3);
 
+    this->addColor(color1);
+    this->addColor(color2);
+    this->addColor(color3);
+
 	if (normal.norm()<1e-10)
 		normal = TriMeshModel::CreateNormal(vertex1, vertex2, vertex3);
 	else
@@ -47,12 +50,23 @@ void TriMeshModel::addTriangleWithFace( Eigen::Vector3f& vertex1, Eigen::Vector3
 	face.id2 = this->vertices.size()-2;
 	face.id3 = this->vertices.size()-1;
 
+    face.idColor1 = this->colors.size() - 3;
+    face.idColor2 = this->colors.size() - 2;
+    face.idColor3 = this->colors.size() - 1;
+
 	face.normal = normal;
 
 	this->addFace(face);
 }
 
-
+void TriMeshModel::addTriangleWithFace(Eigen::Vector3f& vertex1, Eigen::Vector3f& vertex2, Eigen::Vector3f& vertex3, Eigen::Vector4f& vertexColor1, Eigen::Vector4f& vertexColor2, Eigen::Vector4f& vertexColor3)
+{
+    Eigen::Vector3f normal = TriMeshModel::CreateNormal(vertex1, vertex2, vertex3);
+    VisualizationFactory::Color color1(vertexColor1(0), vertexColor1(1), vertexColor1(2), vertexColor1(4));
+    VisualizationFactory::Color color2(vertexColor2(0), vertexColor2(1), vertexColor2(2), vertexColor2(4));
+    VisualizationFactory::Color color3(vertexColor3(0), vertexColor3(1), vertexColor3(2), vertexColor3(4));
+    addTriangleWithFace(vertex1, vertex2, vertex3, normal, color1, color2, color3);
+}
 
 
 /**
@@ -100,6 +114,27 @@ void TriMeshModel::addVertex(const Eigen::Vector3f& vertex)
 	boundingBox.addPoint(vertex);
 }
 
+/**
+ * This method adds a color to the internal data structure TriMeshModel::colors
+ */
+void TriMeshModel::addColor(const VisualizationFactory::Color& color) {
+    colors.push_back(color);
+}
+
+/**
+ * This method converts and adds a color to the internal data structure TriMeshModel::colors
+ */
+void TriMeshModel::addColor(const Eigen::Vector4f& color) {
+    addColor(VisualizationFactory::Color(color(0), color(1), color(2), color(3)));
+}
+
+/**
+ * This method converts and adds a color to the internal data structure TriMeshModel::materials
+ */
+void TriMeshModel::addMaterial(const VisualizationFactory::PhongMaterial& material) {
+    materials.push_back(material);
+}
+
 
 /**
  * This method clears the internal data structures TriMeshModel::faces and
@@ -108,7 +143,9 @@ void TriMeshModel::addVertex(const Eigen::Vector3f& vertex)
 void TriMeshModel::clear()
 {
 	vertices.clear();
+    colors.clear();
 	faces.clear();
+    materials.clear();
 	boundingBox.clear();
 }
 
diff --git a/VirtualRobot/Visualization/TriMeshModel.h b/VirtualRobot/Visualization/TriMeshModel.h
index e6cb80afe037cd89ce3aecd1f1c65757e1f7a53e..e6da807b9d0d64ae7ef1c613c8730fd99d343f70 100644
--- a/VirtualRobot/Visualization/TriMeshModel.h
+++ b/VirtualRobot/Visualization/TriMeshModel.h
@@ -24,6 +24,7 @@
 #define _VirtualRobot_TriMeshModel_h_
 
 #include "../VirtualRobotImportExport.h"
+#include "../Visualization/VisualizationFactory.h"
 #include "../MathTools.h"
 #include "../BoundingBox.h"
 #include <Eigen/Core>
@@ -38,10 +39,17 @@ public:
 	EIGEN_MAKE_ALIGNED_OPERATOR_NEW
 
 	void addTriangleWithFace(Eigen::Vector3f& vertex1, Eigen::Vector3f& vertex2, Eigen::Vector3f& vertex3);
-	void addTriangleWithFace(Eigen::Vector3f& vertex1, Eigen::Vector3f& vertex2, Eigen::Vector3f& vertex3, Eigen::Vector3f& normal);
+    void addTriangleWithFace(Eigen::Vector3f& vertex1, Eigen::Vector3f& vertex2, Eigen::Vector3f& vertex3, Eigen::Vector3f& normal,
+                             VisualizationFactory::Color color1 = VisualizationFactory::Color::Gray(),
+                             VisualizationFactory::Color color2 = VisualizationFactory::Color::Gray(),
+                             VisualizationFactory::Color color3 = VisualizationFactory::Color::Gray());
+    void addTriangleWithFace(Eigen::Vector3f& vertex1, Eigen::Vector3f& vertex2, Eigen::Vector3f& vertex3, Eigen::Vector4f& vertexColor1, Eigen::Vector4f& vertexColor2, Eigen::Vector4f& vertexColor3);
 	static Eigen::Vector3f CreateNormal(Eigen::Vector3f& vertex1, Eigen::Vector3f& vertex2, Eigen::Vector3f& vertex3);
 	void addFace(const MathTools::TriangleFace& face);
 	void addVertex(const Eigen::Vector3f& vertex);
+    void addColor(const VisualizationFactory::Color& color);
+    void addColor(const Eigen::Vector4f& color);
+    void addMaterial(const VisualizationFactory::PhongMaterial& material);
 	void clear();
 	void flipVertexOrientations();
 
@@ -56,7 +64,9 @@ public:
     TriMeshModelPtr clone (Eigen::Vector3f &scaleFactor);
 
 	std::vector<Eigen::Vector3f> vertices;
+    std::vector<VisualizationFactory::Color> colors;
 	std::vector<MathTools::TriangleFace> faces;
+    std::vector<VisualizationFactory::PhongMaterial> materials;
 	BoundingBox boundingBox;
 };
 } // namespace VirtualRobot
diff --git a/VirtualRobot/Visualization/VisualizationFactory.h b/VirtualRobot/Visualization/VisualizationFactory.h
index 9d9a93e401588741396800c40a0c619c358a342e..7788432d527821fa4aaa60737ba6d69c38f74d3a 100644
--- a/VirtualRobot/Visualization/VisualizationFactory.h
+++ b/VirtualRobot/Visualization/VisualizationFactory.h
@@ -43,7 +43,7 @@ public:
 	struct Color
 	{
 		Color(){transparency=0.0f;r=g=b=0.5f;}
-		Color(float r, float g, float b, float transparency):r(r),g(g),b(b),transparency(transparency){}
+        Color(float r, float g, float b, float transparency = 0.0f):r(r),g(g),b(b),transparency(transparency){}
 		float r,g,b;
 		float transparency;
 		bool isNone() const {return transparency>=1.0f;}
@@ -55,6 +55,21 @@ public:
 		static Color None(){return Color(0.0f,0.0f,0.0f,1.0f);}
 	};
 
+    struct PhongMaterial
+    {
+        PhongMaterial(){};
+        Color emission;
+        Color ambient;
+        Color diffuse;
+        Color specular;
+        float shininess;
+        Color reflective;
+        float reflectivity;
+        Color transparent;
+        float transparency;
+        float refractionIndex;
+    };
+
 	VisualizationFactory() {;}
 	virtual ~VisualizationFactory() {;}