 		
 		public function setRotation(x : Number, y : Number, z : Number) : Matrix4x4
 		{
-			var components 	: Vector.<Vector3D>	= _matrix.decompose();
+			if (_invalidComponents)
+				updateComponents();
+			
+			_rotation._vector.setTo(x, y, z);
+			
+			_matrix.recompose(new <Vector3D>[
+				_translation._vector,
+				_rotation._vector,
+				_scale._vector
+			]);
+			
+			if (!_locked)
+				_changed.execute(this);
+			
+			return this;
+		}
+		
+		public function getRotationQuaternion(output : Vector4 = null) : Vector4
+		{
+			var components 	: Vector.<Vector3D>	= _matrix.decompose(Orientation3D.QUATERNION);
 			var rotation	: Vector3D			= components[1];
 			
-			if (!isNaN(x))
-				rotation.x = x;
-			if (!isNaN(y))
-				rotation.y = y;
-			if (!isNaN(z))
-				rotation.z = z;
-			
-			_matrix.recompose(components);
-			
-			if (!_locked)
-				_changed.execute(this);
-			
-			return this;
+			output ||= new Vector4();
+			output._vector = components[1];
+			
+			return output;
 		}
 		
 		public function getScale(output : Vector4 = null) : Vector4

									 y	: Number = 1.,
									 z	: Number = 1.) : Matrix4x4
		{
			_matrix.prependScale(x, y, z);
			
			if (!_locked)

		
		public function prepend(m : Matrix4x4) : Matrix4x4
		{
			_invalidComponents = COMPONENT_ALL;
			_matrix.prepend(m._matrix);
			
			if (!_locked)
