 			Utils3D.projectVectors(_matrix, input, output, uvt);
 		}
 		
+		public function getTranslation(output : Vector4 = null) : Vector4
+		{
+			output ||= new Vector4();
+			_matrix.copyColumnTo(3, output._vector);
+			
+			output.changed.execute(output, null);
+			
+			return output;
+		}
+		
+		public function setTranslation(x : Number, y : Number, z : Number) : Matrix4x4
+		{
+			var position : Vector4	= getTranslation(TMP_VECTOR4);
+			
+			if (!isNaN(x))
+				position.x = x;
+			if (!isNaN(y))
+				position.y = y;
+			if (!isNaN(z))
+				position.z = z;
+			
+			_matrix.copyColumnFrom(3, position._vector);
+			
+			if (!_locked)
+				_changed.execute(this, null);
+			
+			return this;
+		}
+		
 		public function getRotation(output : Vector4 = null) : Vector4
 		{
 			var components 	: Vector.<Vector3D>	= _matrix.decompose();
-
+			
 			output ||= new Vector4();
 			output._vector = components[1];
 			
+			output.changed.execute(output, null);
+			
 			return output;
 		}
 		

			
			if (!_locked)
				_changed.execute(this, null);

			return this;
		}

		public function getTranslation(output : Vector4 = null) : Vector4
		{
			output ||= new Vector4();
			_matrix.copyColumnTo(3, output._vector);
			
			return output;
		}
		
		public function setTranslation(x : Number, y : Number, z : Number) : Matrix4x4
		{
			var position : Vector4	= getTranslation(TMP_VECTOR4);
			
			if (!isNaN(x))
				position.x = x;
			if (!isNaN(y))
				position.y = y;
			if (!isNaN(z))
				position.z = z;
			
			_matrix.copyColumnFrom(3, position._vector);
			
			if (!_locked)
				_changed.execute(this, null);
			
			return this;
		}

			
			output ||= new Vector4();
			output._vector = components[2];
			
			output.changed.execute(output, null);
			
			return output;
		}
