 		public function concat(indexStream : IndexStream,
 							   firstIndex	: uint	= 0,
 							   count		: uint	= 0,
-							   offset		: uint 	= 0) : IndexStream
+							   indexOffset	: uint 	= 0) : IndexStream
 		{
 			checkReadUsage(indexStream);
 			checkWriteUsage(this);
+
+			pushBytes(indexStream._data, firstIndex, count, indexOffset);
+			indexStream._data.position = 0;
+			
+			return this;
+		}
+
+		public function pushBytes(bytes			: ByteArray,
+								  firstIndex	: uint	= 0,
+								  count			: uint	= 0,
+								  indexOffset	: uint	= 0) : IndexStream
+		{
+			count ||= bytes.length >>> 1;
 			
 			_data.position = _data.length;
-			_data.writeBytes(indexStream._data);
-			_data.position = 0;
-
+			
+			if (indexOffset == 0)
+				_data.writeBytes(bytes, firstIndex << 1, count << 1);
+			else
+			{
+				bytes.position = firstIndex << 1;
+				for (var i : uint = 0; i < count; ++i)
+					_data.writeShort(bytes.readUnsignedShort() + indexOffset);
+			}
+
+			_data.position = 0;
+			bytes.position = (firstIndex + count) << 1;
+			
 			invalidate();
 			
 			return this;
 		}
-
-		public function push(indices 	: Vector.<uint>,
-							 firstIndex	: uint	= 0,
-							 count		: uint	= 0,
-							 offset		: uint 	= 0) : void
+		
+		public function pushVector(indices 		: Vector.<uint>,
+								   firstIndex	: uint	= 0,
+								   count		: uint	= 0,
+								   offset		: uint 	= 0) : IndexStream
 		{
 			checkWriteUsage(this);
 			

			invalidate();
		}

		public function deleteTriangleByIndex(index : uint) : void
		{
			checkWriteUsage(this);
			
			_data.position = 0;
			_data.writeBytes(_data, index * 12, 12);
			_data.position = 0;
			
			invalidate();

			_data.position = 0;

			invalidate();
			
			return this;
		}
		
		public function pushTriangle(index1 : uint, index2 : uint, index3 : uint) : IndexStream
		{
			return setTriangle(length * 3, index1, index2, index3);
		}
		
		public function setTriangle(triangleIndex	: uint,
									index1 			: uint,
									index2 			: uint,
									index3 			: uint) : IndexStream
		{
			_data.position = triangleIndex << 1;
			_data.writeShort(index1);
			_data.writeShort(index2);
			_data.writeShort(index3);
			_data.position = 0;
			
			invalidate();
			
			return this;
		}

		public function disposeLocalData(waitForUpload : Boolean = true) : void
