 														   destination	: BitmapData,
 														   time			: Number) : void
 		{
-			//FIXME : find why updates are shifted
-			if (1)//_update)
+			if (_update)
 			{
-				_distance	< _minDistance	&& (_distance = _minDistance);
-				_distance	> _maxDistance	&& (_distance = _maxDistance);
-				_phi	 	<= 0.1			&& (_phi = 0.1);
-				_phi		> Math.PI - 0.1	&& (_phi = Math.PI - 0.1);
+				if (_distance < _minDistance)
+					_distance = _minDistance;
+				if (_distance > _maxDistance)
+					_distance = _maxDistance;
+				if (_phi <= EPSILON)
+					_phi = EPSILON;
+				if (_phi > Math.PI - EPSILON)
+					_phi = Math.PI - EPSILON;
 				
 				_position.set(
 					_distance * Math.cos(_theta) * Math.sin(_phi) + _lookAt.x,

			// compute position
			if (e.buttonDown)
			{
				_theta	+= (_mousePosition.x - e.stageX) / 100;
				_phi	+= (_mousePosition.y - e.stageY) / 100;
				
				_update = true;
			}

	import flash.events.IEventDispatcher;
	import flash.events.MouseEvent;
	import flash.geom.Point;
	import flash.ui.Mouse;
	import flash.ui.MouseCursor;
	
	public class ArcBallController extends EnterFrameController
	{
		private static const TMP_MATRIX : Matrix4x4 = new Matrix4x4();
		private static const EPSILON	: Number	= 0.001;
		
		protected var _mousePosition	: Point		= new Point();
		
