 
 			return this;				
 		}
+		
+		public function flipNormals(flipTangents : Boolean = true) : Geometry
+		{
+			var numStreams : uint = this.numVertexStreams;
+			
+			for (var streamId : uint = 0; streamId < numStreams; ++streamId)
+			{
+				var vertexStream	: IVertexStream		= getVertexStream(streamId);
+				var normalsStream 	: VertexStream 		= vertexStream.getStreamByComponent(VertexComponent.NORMAL);
+				var tangentsStream 	: VertexStream 		= vertexStream.getStreamByComponent(VertexComponent.NORMAL);
+				
+				if (normalsStream != null)
+					invertVertexStreamComponent(normalsStream, VertexComponent.NORMAL);
+				
+				if (tangentsStream != null)
+					invertVertexStreamComponent(tangentsStream, VertexComponent.TANGENT);
+			}
+			
+			return this;
+		}
+		
+		private function invertVertexStreamComponent(vertexStream : VertexStream, component : VertexComponent) : void
+		{
+			var componentOffset	: uint				= vertexStream.format.getOffsetForComponent(component);
+			var vertexSize		: uint				= vertexStream.format.size;
+			var numVertices		: uint				= vertexStream.length;
+			var data			: Vector.<Number>	= vertexStream.lock();
+			
+			for (var i : uint = 0; i < numVertices; ++i)
+			{
+				var offset 	: uint		= i * vertexSize + componentOffset;
+				
+				data[offset] = -data[offset];
+				data[uint(offset + 1)] = -data[uint(offset + 1)];
+				data[uint(offset + 2)] = -data[uint(offset + 2)];
+			}
+			
+			vertexStream.unlock();
+		}
 	}
 }

		 * @param replace Whether to replace existing normals or tangents data.
		 * 
		 */
		public function computeTangentSpace(streamUsage : uint, replace : Boolean = false) : void
		{
			var indices			: Vector.<uint>	= _indexStream._data;
			var numTriangles	: int			= _indexStream.length / 3;

					
					if (mag != 0.)
					{
						normals[uint(i * 3)] /= mag;
						normals[uint(i * 3 + 1)] /= mag;
						normals[uint(i * 3 + 2)] /= mag;
					}
				}
				
