Index: GTP/trunk/Lib/Geom/shared/GTGeometry/include/GeoSubMesh.h
===================================================================
--- GTP/trunk/Lib/Geom/shared/GTGeometry/include/GeoSubMesh.h	(revision 826)
+++ GTP/trunk/Lib/Geom/shared/GTGeometry/include/GeoSubMesh.h	(revision 891)
@@ -9,5 +9,6 @@
 #include "GeoSerializable.h"
 
-namespace Geometry {
+namespace Geometry
+{
 
 	/// SubMesh interface
Index: GTP/trunk/Lib/Geom/shared/GTGeometry/include/GeoMeshSimplifier.h
===================================================================
--- GTP/trunk/Lib/Geom/shared/GTGeometry/include/GeoMeshSimplifier.h	(revision 774)
+++ GTP/trunk/Lib/Geom/shared/GTGeometry/include/GeoMeshSimplifier.h	(revision 891)
@@ -65,21 +65,23 @@
 	};
 
-	/// Implementation of a simplification algorithm based on images.
-	/** This class implements a simplification algorithm based on an image evaluation technique. */
-	class ImageBasedSimplifier : public MeshSimplifier
+	/// Implementation of a simplification algorithm based on viewpoint.
+	/** This class implements a simplification algorithm based on a viewpoint evaluation technique. */
+	class ViewPointDrivenSimplifier : public MeshSimplifier
 	{
+	private:
+
 	public:
 		/// Class constructor. Will call Simplifier class constructor.
-		ImageBasedSimplifier (const Geometry::Mesh 	*,
+		ViewPointDrivenSimplifier (const Geometry::Mesh 	*,
 													Geometry::TIPOFUNC		upb=0);
 
 		/// Class destructor.
-		virtual ~ImageBasedSimplifier (void);
+		virtual ~ViewPointDrivenSimplifier (void);
 
 		/// Copy constructor
-		//ImageBasedSimplifier(const ImageBasedSimplifier&);
+		//ViewPointDrivenSimplifier(const ViewPointDrivenSimplifier&);
 
 		/// Assignment operator
-		//ImageBasedSimplifier& operator =(const ImageBasedSimplifier&);
+		//ViewPointDrivenSimplifier& operator =(const ViewPointDrivenSimplifier&);
 
 		/// Starts the simplification process. Receives as a parameter the LOD factor in a range of [0,1]. Implements the Simplifier::Simplify method to perform an image based simplification.
Index: GTP/trunk/Lib/Geom/shared/GTGeometry/include/GeoMesh.h
===================================================================
--- GTP/trunk/Lib/Geom/shared/GTGeometry/include/GeoMesh.h	(revision 774)
+++ GTP/trunk/Lib/Geom/shared/GTGeometry/include/GeoMesh.h	(revision 891)
@@ -46,5 +46,4 @@
 		SubMesh *mSubMesh;        ///< Array of subMesehs
 		size_t   mSubMeshCount;   ///< Total count of subMeshes
-		MeshType mType;           ///< Type of mesh
 
 		//OSCAR
Index: GTP/trunk/Lib/Geom/shared/GTGeometry/src/GeoLodStripsLibrary.cpp
===================================================================
--- GTP/trunk/Lib/Geom/shared/GTGeometry/src/GeoLodStripsLibrary.cpp	(revision 829)
+++ GTP/trunk/Lib/Geom/shared/GTGeometry/src/GeoLodStripsLibrary.cpp	(revision 891)
@@ -540,8 +540,10 @@
 
 			//	If the strips is not the first.
+			/*
 			if (strip != 0)
 			{
 				indexBegin++;
 			}
+			*/
 
 			//	If is the final strip
@@ -557,5 +559,5 @@
 
 				//	Remove degenerated
-				indexEnd--;
+				//indexEnd--;
 			}
 			
Index: GTP/trunk/Lib/Geom/shared/GTGeometry/src/GeoMeshSimplifier.cpp
===================================================================
--- GTP/trunk/Lib/Geom/shared/GTGeometry/src/GeoMeshSimplifier.cpp	(revision 774)
+++ GTP/trunk/Lib/Geom/shared/GTGeometry/src/GeoMeshSimplifier.cpp	(revision 891)
@@ -42,5 +42,5 @@
 }
 
-ImageBasedSimplifier::ImageBasedSimplifier (const Geometry::Mesh 	*m,
+GeometryBasedSimplifier::GeometryBasedSimplifier (const Geometry::Mesh 	*m,
 																						Geometry::TIPOFUNC		upb)
 																						:MeshSimplifier(m,upb)
@@ -48,10 +48,10 @@
 }
 
-ImageBasedSimplifier::~ImageBasedSimplifier()
+GeometryBasedSimplifier::~GeometryBasedSimplifier()
 {
 }
 
 // Starts the simplification process. Receives as a parameter the LOD factor in a range of [0,1]. Implements the Simplifier::Simplify method to perform an image based simplification.
-void ImageBasedSimplifier::Simplify (Geometry::Real paramlod)
+void GeometryBasedSimplifier::Simplify (Geometry::Real paramlod)
 {
 	SimplificationMethod *m_qslim	=	new SimplificationMethod(objmesh);
@@ -65,5 +65,5 @@
 
 // Starts the simplification process. Receives as a parameter the number of vertices of the resulting mesh. Implements the Simplifier::Simplify method to perform an image based simplification.
-void ImageBasedSimplifier::Simplify (Geometry::uint32 numvertices)
+void GeometryBasedSimplifier::Simplify (Geometry::uint32 numvertices)
 {
 	SimplificationMethod *m_qslim	=	new SimplificationMethod(objmesh);
Index: GTP/trunk/Lib/Geom/shared/GTGeometry/src/SimplificationMethod.cpp
===================================================================
--- GTP/trunk/Lib/Geom/shared/GTGeometry/src/SimplificationMethod.cpp	(revision 774)
+++ GTP/trunk/Lib/Geom/shared/GTGeometry/src/SimplificationMethod.cpp	(revision 891)
@@ -963,5 +963,5 @@
 	*mesh=new Geometry::Mesh();
 	(*mesh)->mVertexBuffer	=	new	Geometry::VertexBuffer();
-	(*mesh)->mType=objmesh->mType;
+	//(*mesh)->mType=objmesh->mType;
 
 	(*mesh)->mSubMeshCount = objmesh->mSubMeshCount;
Index: GTP/trunk/Lib/Geom/shared/GTGeometry/src/GeoLodStripsConstructor.cpp
===================================================================
--- GTP/trunk/Lib/Geom/shared/GTGeometry/src/GeoLodStripsConstructor.cpp	(revision 841)
+++ GTP/trunk/Lib/Geom/shared/GTGeometry/src/GeoLodStripsConstructor.cpp	(revision 891)
@@ -1065,4 +1065,5 @@
 					Index	*aux	=	this->geoMesh->mSubMesh[i].mStrip[j];
 
+					/*
 					if (j != 0)
 					{
@@ -1072,4 +1073,5 @@
 						indice_acum++;
 					}
+					*/
 
 					if (j+1 < this->geoMesh->mSubMesh[i].mStripCount)
@@ -1087,5 +1089,6 @@
 						}
 
-						tira.pop_back();
+						//tira.pop_back();
+
 						this->cStrips.push_back(tira);
 					}
Index: GTP/trunk/Lib/Geom/shared/GTGeometry/src/GeoMesh.cpp
===================================================================
--- GTP/trunk/Lib/Geom/shared/GTGeometry/src/GeoMesh.cpp	(revision 826)
+++ GTP/trunk/Lib/Geom/shared/GTGeometry/src/GeoMesh.cpp	(revision 891)
@@ -6,5 +6,5 @@
 //----------------------------------------------------------------------------
 Mesh::Mesh():
-	mVertexBuffer(0), mSubMeshCount(0), mSubMesh(0), mType(GEO_TRIANGLE_LIST)
+	mVertexBuffer(0), mSubMeshCount(0), mSubMesh(0)
 {
 }
@@ -21,5 +21,4 @@
 	// constructor copia
 	mVertexBuffer=new VertexBuffer();
-	mType=objmesh.mType;
 	mSubMeshCount=objmesh.mSubMeshCount;
 	mSubMesh = new Geometry::SubMesh[objmesh.mSubMeshCount];
@@ -121,5 +120,4 @@
 	bool copiados	=	false; // indica si los vértices compartidos han sido copiados
 	mVertexBuffer	=	new VertexBuffer();
-	mType					=	objmesh.mType;
 	mSubMeshCount	=	objmesh.mSubMeshCount;
 	mSubMesh			=	new Geometry::SubMesh[objmesh.mSubMeshCount];
@@ -321,5 +319,4 @@
 	
 	mesh->mVertexBuffer=new VertexBuffer();
-	mesh->mType=this->mType;
 	mesh->mSubMeshCount = this->mSubMeshCount;
 	// Reserva memoria para los submeshes
Index: GTP/trunk/Lib/Geom/shared/GTGeometry/src/GeoMeshStripifier.cpp
===================================================================
--- GTP/trunk/Lib/Geom/shared/GTGeometry/src/GeoMeshStripifier.cpp	(revision 826)
+++ GTP/trunk/Lib/Geom/shared/GTGeometry/src/GeoMeshStripifier.cpp	(revision 891)
@@ -73,4 +73,5 @@
 	size_t						index_count;
 	size_t						strip_count;
+	size_t						strip_index_count;
 	SubMesh						*geosubmesh;
 	primitive_vector	PrimitivesVector;
@@ -82,159 +83,132 @@
 	for (int	submesh	=	0;	submesh < mGeoMesh->mSubMeshCount;	submesh++)
 	{
-		//	If is not the Leaveas submesh.
-		if (submesh != mSubMeshLeaves)
+		//	Gets the submesh.
+		geosubmesh	=	&mGeoMesh->mSubMesh[submesh];
+
+		//	Free index vector.
+		Indices.clear();
+
+		//	Progress bar increment.
+		increment	=	20	/	mGeoMesh->mSubMeshCount;
+		increment	=	increment	/	geosubmesh->mIndexCount;
+		update		=	0.0;
+
+		//	For each index.
+		for (int	index	=	0;	index	<	geosubmesh->mIndexCount;	index++)
 		{
-
-			//	Gets the submesh.
-			geosubmesh	=	&mGeoMesh->mSubMesh[submesh];
-
-			//	Free index vector.
-			Indices.clear();
-
-			//	Progress bar increment.
-			increment	=	20	/	mGeoMesh->mSubMeshCount;
-			increment	=	increment	/	geosubmesh->mIndexCount;
-			update		=	0.0;
-
-			//	For each index.
-			for (int	index	=	0;	index	<	geosubmesh->mIndexCount;	index++)
-			{
-				//	Update progress bar.
-				if (mUPB)
+			//	Update progress bar.
+			if (mUPB)
+			{
+				update	=	update + increment;
+
+				if (update > 0.9)
 				{
-					update	=	update + increment;
-
-					if (update > 0.9)
-					{
-						mUPB(1.0);
-
-						update	=	0;
-					}
+					mUPB(1.0);
+
+					update	=	0;
 				}
-
-				//	Add an index.
-				Indices.push_back(geosubmesh->mIndex[index]);
-			}
-
-			// we want to time the tri_stripper object destruction as well.
-			tri_stripper TriStripper(Indices);
-
-			//	Sets the progress bar function for stripper algorithm.
-			TriStripper.SetProgressFunc(mUPB,60/mGeoMesh->mSubMeshCount);
-
-			TriStripper.SetMinStripSize(2);
-			TriStripper.SetCacheSize(32);
-			//TriStripper.SetBackwardSearch(false);
-
-			TriStripper.Strip(&PrimitivesVector);
-
-			//	Free submesh indices.
-			delete	[]	geosubmesh->mIndex;
-
-			//	Initialize index count.
-			geosubmesh->mIndexCount	=	0;
-
-			//	Initialize strip count.
-			strip_count	=	0;
-
-			//	For each strip or triangle list.
-			for (size_t i = 0; i < PrimitivesVector.size(); ++i)
-			{
-				if (PrimitivesVector[i].Type == TRIANGLE_STRIP)
+			}
+
+			//	Add an index.
+			Indices.push_back(geosubmesh->mIndex[index]);
+		}
+
+		// we want to time the tri_stripper object destruction as well.
+		tri_stripper TriStripper(Indices);
+
+		//	Sets the progress bar function for stripper algorithm.
+		TriStripper.SetProgressFunc(mUPB,60/mGeoMesh->mSubMeshCount);
+
+		TriStripper.SetMinStripSize(2);
+		TriStripper.SetCacheSize(32);
+		//TriStripper.SetBackwardSearch(false);
+
+		TriStripper.Strip(&PrimitivesVector);
+
+		//	Free submesh indices.
+		delete	[]	geosubmesh->mIndex;
+
+		//	Initialize index count.
+		geosubmesh->mIndexCount	=	0;
+
+		//	Initialize strip count.
+		strip_count	=	0;
+
+		//	For each strip or triangle list.
+		for (size_t strip = 0; strip < PrimitivesVector.size(); ++strip)
+		{
+			if (PrimitivesVector[strip].Type == TRIANGLE_STRIP)
+			{
+				strip_count++;
+
+				//	Gets the index count.
+				strip_index_count	=	PrimitivesVector[strip].Indices.size();
+
+				//	Adds indices of the current strip to total index count.
+				geosubmesh->mIndexCount	+=	strip_index_count;
+			}
+			else
+			{
+				strip_count += PrimitivesVector[strip].Indices.size() / 3;
+
+				geosubmesh->mIndexCount	+=	PrimitivesVector[strip].Indices.size();
+			}
+
+		}
+
+		//	Reserve memory for strips list.
+		geosubmesh->mStrip			=	new	Index*[strip_count];
+		geosubmesh->mStripCount	=	strip_count;
+
+		//	Reserve memory for indices.
+		geosubmesh->mIndex	=	new	Index[geosubmesh->mIndexCount];
+
+		//	Initialize index count.
+		index_count	=	0;
+
+		//	For each strip.
+		for (size_t	strip	=	0; strip < PrimitivesVector.size();	strip++)
+		{
+			if (PrimitivesVector[strip].Type == TRIANGLE_STRIP)
+			{
+				//	Asigns the beginning of the strip.
+				geosubmesh->mStrip[strip]	=	&geosubmesh->mIndex[index_count];
+
+				//	Gets the index count of the current strip.
+				strip_index_count	=	PrimitivesVector[strip].Indices.size();
+
+	
+				//	Fill up the index array.
+				for (	size_t	index	=	0;
+						index < PrimitivesVector[strip].Indices.size();
+						index++)
 				{
-					strip_count++;
-					geosubmesh->mIndexCount	+=	PrimitivesVector[i].Indices.size();
-
-					//	Degenerate triangles.
-					geosubmesh->mIndexCount	+=	2;
+					geosubmesh->mIndex[index + index_count]	=	PrimitivesVector[strip].Indices[index];
 				}
-				else
-				{
-					strip_count += PrimitivesVector[i].Indices.size()/3;
-
-					geosubmesh->mIndexCount	+=	PrimitivesVector[i].Indices.size();
-
-					//	Degenerate triangles.
-					geosubmesh->mIndexCount	+=	2*(PrimitivesVector[i].Indices.size()/3);
-				}
-
-			}
-
-			//	Reserve memory for strips list.
-			geosubmesh->mStrip			=	new	Index*[strip_count];
-			geosubmesh->mStripCount	=	strip_count;
-
-			//	Adjust the index count.
-			geosubmesh->mIndexCount	-=	2;
-
-			//	Reserve memory for indices.
-			geosubmesh->mIndex	=	new	Index[geosubmesh->mIndexCount];
-
-			//	Initialize index count.
-			index_count	=	0;
-
-			//	For each strip.
-			for (size_t	strip	=	0; strip < PrimitivesVector.size();	strip++)
-			{
-				if (PrimitivesVector[strip].Type == TRIANGLE_STRIP)
+
+				//	Adds the current strip size to index count.
+				index_count	+=	PrimitivesVector[strip].Indices.size();
+			}
+			else
+			{
+				//	For each index.
+				for (	size_t	itri	=	0;
+						itri	<	PrimitivesVector[strip].Indices.size() / 3;
+						itri ++)
 				{
 					//	Asigns the beginning of the strip.
-					geosubmesh->mStrip[strip]	=	&geosubmesh->mIndex[index_count];
-
-					//	If is not the first strip.
-					if (strip	!= 0)
-					{
-						geosubmesh->mIndex[index_count++]	= PrimitivesVector[strip].Indices[0];
-					}
-
-					//	Fill up the index array.
-					for (	size_t	index	=	0;
-							index < PrimitivesVector[strip].Indices.size();
-							index++)
-					{
-						geosubmesh->mIndex[index + index_count]	=	PrimitivesVector[strip].Indices[index];
-					}
-
-					//	Adds the current strip size to index count.
-					index_count	+=	PrimitivesVector[strip].Indices.size();
-
-					if ((strip + 1) != strip_count)
-					{
-						//	Degenerate triangle.
-						geosubmesh->mIndex[index_count++]	=	geosubmesh->mIndex[index_count - 1];
-					}
+					geosubmesh->mStrip[strip + itri]	=	&geosubmesh->mIndex[index_count];
+
+					//	Triangle indeces.
+					geosubmesh->mIndex[index_count++]	=	PrimitivesVector[strip].Indices[itri*3+0];
+					geosubmesh->mIndex[index_count++]	=	PrimitivesVector[strip].Indices[itri*3+1];
+					geosubmesh->mIndex[index_count++] =	PrimitivesVector[strip].Indices[itri*3+2];
+
 				}
-				else
-				{
-					//	For each index.
-					for (	size_t	itri	=	0;
-							itri	<	PrimitivesVector[strip].Indices.size() / 3;
-							itri ++)
-					{
-						//	Asigns the beginning of the strip.
-						geosubmesh->mStrip[strip + itri]	=	&geosubmesh->mIndex[index_count];
-
-						//	Degenerate triangle.
-						geosubmesh->mIndex[index_count++]	=	PrimitivesVector[strip].Indices[itri*3+0];
-
-						//	Triangle indeces.
-						geosubmesh->mIndex[index_count++]	=	PrimitivesVector[strip].Indices[itri*3+0];
-						geosubmesh->mIndex[index_count++]	=	PrimitivesVector[strip].Indices[itri*3+1];
-						geosubmesh->mIndex[index_count++] =	PrimitivesVector[strip].Indices[itri*3+2];
-
-						//	If is not the last strip.
-						if ((strip + itri + 1) != strip_count)
-						{
-							geosubmesh->mIndex[index_count++]	=	geosubmesh->mIndex[index_count - 1];
-						}
-					}
-
-				}
-			}
-
-			//	Sets the actual submesh type to triangle strips.
-			geosubmesh->mType	=	GEO_TRIANGLE_STRIPS;
-
+			}
 		}
+		
+		//	Sets the actual submesh type to triangle strips.
+		geosubmesh->mType	=	GEO_TRIANGLE_STRIPS;
 	}
 
@@ -245,5 +219,4 @@
 	}
 
-
 	//	All wright.
 	return	1;
Index: GTP/trunk/Lib/Geom/shared/GeoTool/include/GeoMeshLoader.h
===================================================================
--- GTP/trunk/Lib/Geom/shared/GeoTool/include/GeoMeshLoader.h	(revision 826)
+++ GTP/trunk/Lib/Geom/shared/GeoTool/include/GeoMeshLoader.h	(revision 891)
@@ -166,5 +166,8 @@
 
 			//	Writes the strips list.
-			SubMesh* GeoMeshLoader::BuildStripsGeoSubMesh(SubMesh* geoSubMesh);
+			SubMesh* GeoMeshLoader::BuildStripsGeoSubMesh(SubMesh	*geoSubMesh);
+
+			//	Remove degenerate triangles of a submesh given.
+			SubMesh	*	removeDegenerateTriangles(SubMesh	*geoSubMesh);
 			
 		public:
Index: GTP/trunk/Lib/Geom/shared/GeoTool/src/GeoMeshLoader.cpp
===================================================================
--- GTP/trunk/Lib/Geom/shared/GeoTool/src/GeoMeshLoader.cpp	(revision 826)
+++ GTP/trunk/Lib/Geom/shared/GeoTool/src/GeoMeshLoader.cpp	(revision 891)
@@ -858,4 +858,110 @@
 	}
 
+	//	Remove degenerate triangles of a submesh given.
+	geoSubMesh	=	removeDegenerateTriangles(geoSubMesh);
+
+	return	geoSubMesh;
+}
+
+//	Remove degenerate triangles of a submesh given.
+SubMesh	*	GeoMeshLoader::removeDegenerateTriangles(SubMesh	*geoSubMesh)
+{
+	Index		*indices;
+	Index		*index;
+	Index		*indexBegin;
+	Index		*indexEnd;
+	Index		*new_strip_starts;
+	size_t	new_index_count;
+	size_t	current_index;
+
+	//	Stores the new starts of strips.
+	new_strip_starts	=	new	Index[geoSubMesh->mStripCount];
+	
+	//	Calculate the new index count.
+	new_index_count	=	geoSubMesh->mIndexCount	
+		-
+		(2 * geoSubMesh->mStripCount)
+		+
+		2;
+
+	//	Auxiliar index array.
+	indices	=	new	Index[new_index_count];
+
+	//	Initialize the current index;
+	current_index	=	0;
+	
+	//	For each one of the strips.
+	for (int strip = 0; strip < geoSubMesh->mStripCount; strip++)
+	{
+		//	Stars of strip without degenerate triangles.
+		new_strip_starts[strip]	=	current_index;
+		
+		//	First index of the strip.
+		indexBegin	=	geoSubMesh->mStrip[strip];
+
+		//	If is the final strip
+		if (strip	== (geoSubMesh->mStripCount - 1))
+		{
+			//	The end of the index array.
+			indexEnd	= &geoSubMesh->mIndex[geoSubMesh->mIndexCount];
+		}
+		else
+		{
+			//	The beginning of the next strip.
+			indexEnd	= geoSubMesh->mStrip[strip + 1];
+		}
+
+		int i;
+		i	= 0;
+
+		//	If is not the first strip.
+		if (strip != 0)
+		{
+			indexBegin++;
+		}
+
+		//	If is not the last strip.
+		if (strip	!= (geoSubMesh->mStripCount - 1))
+		{
+			indexEnd--;
+		}
+
+		//	For each index of the strip.
+		for (index = indexBegin; index < indexEnd; index++)
+		{
+			indices[current_index++]	=	indexBegin[i];
+
+			//	Increments i.
+			i++;
+		}
+
+	}
+
+	//	Free Index memory.
+	delete	[]geoSubMesh->mIndex;
+
+	//	Update index count.
+	geoSubMesh->mIndexCount	=	new_index_count;
+
+	geoSubMesh->mIndex	=	new	Index[new_index_count];
+
+	//	Store new index array without degenerate triangles.
+	for (size_t	i	=	0;	i	<	geoSubMesh->mIndexCount; i++)
+	{
+		geoSubMesh->mIndex[i]	=	indices[i];
+	}
+
+	//	Free auxiliar index array;
+	delete	[]indices;
+
+	//	Update start of the strip.
+	for (int	strip	=	0; strip < geoSubMesh->mStripCount; strip++)
+	{
+		geoSubMesh->mStrip[strip]	=	&geoSubMesh->mIndex[new_strip_starts[strip]];
+	}
+
+	//	Free auxiliar strip starts.
+	delete	[]new_strip_starts;
+	
 	return	geoSubMesh;
 }
Index: GTP/trunk/Lib/Geom/shared/GeoTool/src/GeoMeshViewUI.cpp
===================================================================
--- GTP/trunk/Lib/Geom/shared/GeoTool/src/GeoMeshViewUI.cpp	(revision 842)
+++ GTP/trunk/Lib/Geom/shared/GeoTool/src/GeoMeshViewUI.cpp	(revision 891)
@@ -17,10 +17,4 @@
 	//	Loads a mesh file.
 	openMeshFile();
-	
-	//	Debug.
-	cout	<<	"Vertex Count SubMesh 0:	"
-				<<	mGeoMesh->mSubMesh[0].mVertexBuffer->mVertexCount
-				<<	endl;
-	//----------------------------------------------------------
 	
 	//	Deactive Lod strip visualization.
@@ -854,4 +848,5 @@
 inline void GeoMeshViewUI::cb_mButtonProcess_i(fltk::Button*, void*)
 {
+	bool	error;
 	Mesh	*mesh_aux;
 	
@@ -860,4 +855,7 @@
 	mProcessBar->position(0);
 
+	//	Initialize error flag.
+	error	=	false;
+	
 	//	If there is a mesh object.
 	if (mGeoMesh != NULL)
@@ -877,6 +875,16 @@
 			case	EDGE_COLLAPSE:
 
+				//	Check submeshes for triangles strips.
+				for (int i = 0; i < mGeoMesh->mSubMeshCount; i++)
+				{
+					//	If current submesh is in triangle strips.
+					if (mGeoMesh->mSubMesh[i].mType == GEO_TRIANGLE_STRIPS)
+					{
+						error	=	true;
+					}
+				}
+				
 				//	if the mesh is stripified.
-				if (mGeoMesh->mType == GEO_TRIANGLE_STRIPS)
+				if (error)
 				{
 					fltk::alert("Can't simplify a mesh in triagle strips.");
@@ -903,6 +911,16 @@
 			case	LODSTRIPS_AUTO:
 
+				//	Check submeshes for triangles strips.
+				for (int i = 0; i < mGeoMesh->mSubMeshCount; i++)
+				{
+					//	If current submesh is in triangle strips.
+					if (mGeoMesh->mSubMesh[i].mType == GEO_TRIANGLE_STRIPS)
+					{
+						error	=	true;
+					}
+				}
+				
 				//	if the mesh is stripified.
-				if (mGeoMesh->mType == GEO_TRIANGLE_STRIPS)
+				if (error)
 				{
 					fltk::alert("Can't simplify a mesh in triagle strips.");
@@ -1617,5 +1635,5 @@
 			geoSubMesh	=	&geoMesh->mSubMesh[submesh];
 
-			switch (geoMesh->mType)
+			switch (geoSubMesh->mType)
 			{
 				case	GEO_TRIANGLE_LIST:
@@ -1643,15 +1661,16 @@
 	strip_count	=	0;
 	
-	if (geoMesh->mType == GEO_TRIANGLE_STRIPS)
-	{
-		//	For each submesh.
-		for (int submesh	=	0; submesh < geoMesh->mSubMeshCount; submesh++)
+	//	For each submesh.
+	for (int submesh	=	0; submesh < geoMesh->mSubMeshCount; submesh++)
+	{
+		//	Gets the actual submesh.
+		geoSubMesh	=	&geoMesh->mSubMesh[submesh];
+
+		if (geoSubMesh->mType == GEO_TRIANGLE_STRIPS)
 		{
-			//	Gets the actual submesh.
-			geoSubMesh	=	&geoMesh->mSubMesh[submesh];
-
 			strip_count	+=	geoSubMesh->mStripCount;
 		}	
 	}
+
 	return	strip_count;
 }
@@ -1699,5 +1718,5 @@
 	simplificacionState	=	QSLIM;
 
-	mMeshSimplifier = new ImageBasedSimplifier(mGeoMesh,	progress_function);
+	mMeshSimplifier = new GeometryBasedSimplifier(mGeoMesh,	progress_function);
 
 	mMeshSimplifier->setMeshLeaves(idMeshLeaves);
@@ -1765,8 +1784,22 @@
 void	GeoMeshViewUI::simplifyLeavesCollapse()
 {
-	uint32						vi;
-
+	bool		error;
+	uint32	vi;
+
+	//	Initialize	error flag.
+	error	=	false;
+	
+	//	Check submeshes for triangles strips.
+	for (int i = 0; i < mGeoMesh->mSubMeshCount; i++)
+	{
+		//	If current submesh is in triangle strips.
+		if (mGeoMesh->mSubMesh[i].mType == GEO_TRIANGLE_STRIPS)
+		{
+			error	=	true;
+		}
+	}
+				
 	//	if the mesh is stripified.
-	if (mGeoMesh->mType == GEO_TRIANGLE_STRIPS)
+	if (error)
 	{
 		fltk::alert("Can't simplify a tree in triagle strips.");
@@ -1842,9 +1875,23 @@
 void	GeoMeshViewUI::stripify()
 {	
+	bool							error;
 	char							char_value[10];
 	CustomStripifier	*geoStripifier;
 
+	//	Initialize error flag.
+	error	=	false;
+
+	//	Check submeshes for triangles strips.
+	for (int i = 0; i < mGeoMesh->mSubMeshCount; i++)
+	{
+		//	If current submesh is in triangle strips.
+		if (mGeoMesh->mSubMesh[i].mType == GEO_TRIANGLE_STRIPS)
+		{
+			error	=	true;
+		}
+	}
+				
 	//	if the mesh is stripified.
-	if (mGeoMesh->mType == GEO_TRIANGLE_STRIPS)
+	if (error)
 	{
 		fltk::alert("The mesh is already in strips.");
Index: GTP/trunk/Lib/Geom/shared/GeoTool/src/GeoMeshSaver.cpp
===================================================================
--- GTP/trunk/Lib/Geom/shared/GeoTool/src/GeoMeshSaver.cpp	(revision 826)
+++ GTP/trunk/Lib/Geom/shared/GeoTool/src/GeoMeshSaver.cpp	(revision 891)
@@ -194,4 +194,7 @@
 	unsigned	long	indexCount;
 	String					materialName;
+	Index						*index;
+	Index						*indexBegin;
+	Index						*indexEnd;
 	
 	//	Debug.
@@ -219,4 +222,10 @@
 	indexCount	=	geoSubMesh->mIndexCount;
 
+	//	If the submesh is in triangle strips.
+	if (geoSubMesh->mType == GEO_TRIANGLE_STRIPS)
+	{
+		indexCount	+=	2 * geoSubMesh->mStripCount - 2;
+	}
+	
 	writeInts(indexCount, 1);
 
@@ -229,8 +238,61 @@
 				<<	endl;
 
-	//	Write the index array.
-	for (int i = 0; i < geoSubMesh->mIndexCount; i++)
-	{
-		writeInts(geoSubMesh->mIndex[i], 1);
+	//	If the submesh is in triangle strips.
+	if (geoSubMesh->mType == GEO_TRIANGLE_STRIPS)
+	{
+		//	Debug.
+		cout	<<	"Write triangle strips"
+					<<	endl;
+		
+		//	For each one of the strips.
+		for (int strip = 0; strip < geoSubMesh->mStripCount; strip++)
+		{
+			//	First index of the strip.
+			indexBegin	=	geoSubMesh->mStrip[strip];
+
+			//	If is the final strip
+			if (strip	== (geoSubMesh->mStripCount - 1))
+			{
+				//	The end of the index array.
+				indexEnd	= &geoSubMesh->mIndex[geoSubMesh->mIndexCount];
+			}
+			else
+			{
+				//	The beginning of the next strip.
+				indexEnd	= geoSubMesh->mStrip[strip + 1];
+			}
+
+			int i;
+			i	= 0;
+
+			if (strip != 0)
+			{
+				writeInts(indexBegin[i], 1);
+			}
+			
+			//	For each index of the strip.
+			for (index = indexBegin; index < indexEnd; index++)
+			{
+				writeInts(indexBegin[i], 1);
+				
+				//	Increments i.
+				i++;
+			}
+
+			if (strip	!= (geoSubMesh->mStripCount - 1))
+			{
+				writeInts(indexBegin[i - 1], 1);
+			}
+
+		}
+	}
+	//	If the submesh is in triangle list.
+	else
+	{
+		//	Write the index array.
+		for (int i = 0; i < geoSubMesh->mIndexCount; i++)
+		{
+			writeInts(geoSubMesh->mIndex[i], 1);
+		}
 	}
 
