Index: Away3DLite/src/away3dlite/loaders/Collada.as
===================================================================
--- Away3DLite/src/away3dlite/loaders/Collada.as	(revision 2282)
+++ Away3DLite/src/away3dlite/loaders/Collada.as	(working copy)
@@ -164,11 +164,12 @@
 				i1 = _faceData.v1*3;
 				i2 = _faceData.v2*3;
 				mesh._vertices.push(vertices[i0], vertices[i0+1], vertices[i0+2]);
-				buildSkinVertices(_geometryData, _faceData.v0, mesh._vertices);
+
+				buildSkinVertices(_geometryData, _faceData.v0, mesh._vertices, mesh);
 				mesh._vertices.push(vertices[i1], vertices[i1+1], vertices[i1+2]);
-				buildSkinVertices(_geometryData, _faceData.v1, mesh._vertices);
+				buildSkinVertices(_geometryData, _faceData.v1, mesh._vertices, mesh);
 				mesh._vertices.push(vertices[i2], vertices[i2+1], vertices[i2+2]);
-				buildSkinVertices(_geometryData, _faceData.v2, mesh._vertices);
+				buildSkinVertices(_geometryData, _faceData.v2, mesh._vertices, mesh);
 				
 				//set uvData
 				i0 = _faceData.uv0*3;
@@ -210,18 +211,18 @@
 			mesh.type = ".Collada";
 		}
 		
-		private function buildSkinVertices(geometryData:GeometryData, i:int, vertices:Vector.<Number>):void
+ 		private function buildSkinVertices(geometryData:GeometryData, i:int, vertices:Vector.<Number>, mesh:Mesh):void
 		{
 			if (!geometryData.skinVertices.length)
 				return;
 			
 			var skinController:SkinController;
-			var skinVertex:SkinVertex = geometryData.skinVertices[i].clone();
-			
-			skinVertex.updateVertices(vertices.length - 3, vertices);
-			
-			for each (skinController in geometryData.skinControllers)
-				skinController.skinVertices.push(skinVertex);
+			var skinVertex:SkinVertex = geometryData.skinVertices[i].clone();  
+
+			if (skinVertex.updateVertices(vertices.length - 3, vertices, mesh)) { 
+			    for each (skinController in geometryData.skinControllers) 
+				    skinController.skinVertices.push(skinVertex);
+            }
 		}
 		
 		private function buildAnimations():void
@@ -1407,4 +1408,4 @@
             }
         }
     }
-}
\ No newline at end of file
+}
Index: Away3DLite/src/away3dlite/animators/bones/SkinVertex.as
===================================================================
--- Away3DLite/src/away3dlite/animators/bones/SkinVertex.as	(revision 2282)
+++ Away3DLite/src/away3dlite/animators/bones/SkinVertex.as	(working copy)
@@ -2,45 +2,80 @@
 {
 	import flash.geom.*;
 	
+    import away3dlite.core.base.*;
+    import flash.utils.*; 
+	
     public class SkinVertex
     {
     	private var _i:int;
     	private var _position:Vector3D = new Vector3D();
         private var _output:Vector3D;
-        private var _startIndex:int;
+        private var _startIndices:Vector.<int> = new Vector.<int>();
         private var _vertices:Vector.<Number>;
 		private var _baseVertex:Vector3D;
 		
         public var weights:Vector.<Number> = new Vector.<Number>();
+        public var controllers:Vector.<SkinController> = new Vector.<SkinController>();
         
-        public var controllers:Vector.<SkinController> = new Vector.<SkinController>();
+        private static var _instances:Vector.<SkinVertex> = new Vector.<SkinVertex>();
+        private var _mesh:Mesh;
+         
 		
         public function SkinVertex()
         {
         }
+
+        public function get baseVertex():Vector3D 
+        {
+            return _baseVertex;
+        }
+
+        public function get mesh():Mesh 
+        {
+            return _mesh;
+        }
 		
-		public function updateVertices(startIndex:int, vertices:Vector.<Number>):void
+		public function updateVertices(startIndex:int, vertices:Vector.<Number>, mesh:Mesh = null):Boolean
 		{
-			_startIndex = startIndex;
+            _baseVertex = new Vector3D(vertices[startIndex], vertices[startIndex + 1], vertices[startIndex + 2]);
+
+            // remove duplicate vertices based on position
+            if (mesh) {
+                for each(var sv:SkinVertex in _instances) {
+                    if (sv._mesh == mesh && sv.baseVertex.equals(_baseVertex)) {
+                        sv._startIndices.push(startIndex);
+                        return false;
+                    }
+                }
+                _mesh = mesh;
+            }
+            _startIndices.push(startIndex);
 			_vertices = vertices;
-            _baseVertex = new Vector3D(_vertices[_startIndex], _vertices[_startIndex + 1], _vertices[_startIndex + 2]);
+            _instances.push(this);
+            return true;
 		}
 		
         public function update():void
         {
+            if (_mesh && !_mesh.visible) return;
+            
         	//reset values
             _output = new Vector3D();
             
             _i = weights.length;
+    
             while (_i--) {
-            	_position = controllers[_i].transformMatrix3D.transformVector(_baseVertex);
-				_position.scaleBy(weights[_i]);
-				_output = _output.add(_position);
+                _position = controllers[_i].transformMatrix3D.transformVector(_baseVertex);
+                _position.scaleBy(weights[_i]);
+                _output = _output.add(_position);
             }
-            
-            _vertices[int(_startIndex)] = _output.x;
-            _vertices[int(_startIndex + 1)] = _output.y;
-            _vertices[int(_startIndex + 2)] = _output.z;
+           
+           var _startIndex:int;
+           for each (_startIndex in _startIndices) { 
+               _vertices[_startIndex] = _output.x;
+               _vertices[_startIndex + 1] = _output.y;
+               _vertices[_startIndex + 2] = _output.z;
+           }
         }
         
         public function clone():SkinVertex
