diff --git a/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
new file mode 100644
index 0000000000..d22e24a14f
--- /dev/null
+++ b/OpenSim/Region/Framework/Scenes/Animation/ScenePresenceAnimator.cs
@@ -0,0 +1,388 @@
+/*
+ * Copyright (c) Contributors, http://opensimulator.org/
+ * See CONTRIBUTORS.TXT for a full list of copyright holders.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *     * Redistributions of source code must retain the above copyright
+ *       notice, this list of conditions and the following disclaimer.
+ *     * Redistributions in binary form must reproduce the above copyright
+ *       notice, this list of conditions and the following disclaimer in the
+ *       documentation and/or other materials provided with the distribution.
+ *     * Neither the name of the OpenSimulator Project nor the
+ *       names of its contributors may be used to endorse or promote products
+ *       derived from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY
+ * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
+ * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+ * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+using System;
+using OpenMetaverse;
+using OpenSim.Framework;
+using OpenSim.Region.Framework.Interfaces;
+using OpenSim.Region.Framework.Scenes;
+using OpenSim.Region.Physics.Manager;
+
+namespace OpenSim.Region.Framework.Scenes.Animation
+{
+    /// 
+    /// Handle all animation duties for a scene presence
+    /// 
+    public class ScenePresenceAnimator
+    {        
+        public AnimationSet Animations
+        {
+            get { return m_animations;  }
+        }
+        protected AnimationSet m_animations = new AnimationSet();
+
+        /// 
+        /// The current movement animation
+        /// 
+        public string CurrentMovementAnimation
+        {
+            get { return m_movementAnimation; }
+        }
+        protected string m_movementAnimation = "DEFAULT";        
+
+        private int m_animTickFall;
+        private int m_animTickJump;                          
+        
+        /// 
+        /// The scene presence that this animator applies to
+        /// 
+        protected ScenePresence m_scenePresence;        
+        
+        public ScenePresenceAnimator(ScenePresence sp)
+        {
+            m_scenePresence = sp;            
+        }
+        
+        public void AddAnimation(UUID animID, UUID objectID)
+        {
+            if (m_scenePresence.IsChildAgent)
+                return;
+
+            if (m_animations.Add(animID, m_scenePresence.ControllingClient.NextAnimationSequenceNumber, objectID))
+                SendAnimPack();
+        }
+
+        // Called from scripts
+        public void AddAnimation(string name, UUID objectID)
+        {
+            if (m_scenePresence.IsChildAgent)
+                return;
+
+            UUID animID = m_scenePresence.ControllingClient.GetDefaultAnimation(name);
+            if (animID == UUID.Zero)
+                return;
+
+            AddAnimation(animID, objectID);
+        }
+
+        public void RemoveAnimation(UUID animID)
+        {
+            if (m_scenePresence.IsChildAgent)
+                return;
+
+            if (m_animations.Remove(animID))
+                SendAnimPack();
+        }
+
+        // Called from scripts
+        public void RemoveAnimation(string name)
+        {
+            if (m_scenePresence.IsChildAgent)
+                return;
+
+            UUID animID = m_scenePresence.ControllingClient.GetDefaultAnimation(name);
+            if (animID == UUID.Zero)
+                return;
+
+            RemoveAnimation(animID);
+        }        
+
+        public void ResetAnimations()
+        {
+            m_animations.Clear();            
+        }
+        
+        /// 
+        /// The movement animation is reserved for "main" animations
+        /// that are mutually exclusive, e.g. flying and sitting.
+        /// 
+        public void TrySetMovementAnimation(string anim)
+        {
+            //m_log.DebugFormat("Updating movement animation to {0}", anim);
+
+            if (!m_scenePresence.IsChildAgent)
+            {
+                if (m_animations.TrySetDefaultAnimation(
+                    anim, m_scenePresence.ControllingClient.NextAnimationSequenceNumber, UUID.Zero))
+                {
+                    // 16384 is CHANGED_ANIMATION
+                    m_scenePresence.SendScriptEventToAttachments("changed", new Object[] { 16384 });                    
+                    SendAnimPack();
+                }
+            }
+        }
+
+        /// 
+        /// This method determines the proper movement related animation
+        /// 
+        public string GetMovementAnimation()
+        {
+            const float FALL_DELAY = 0.33f;
+            const float PREJUMP_DELAY = 0.25f;
+
+            #region Inputs
+
+            AgentManager.ControlFlags controlFlags = (AgentManager.ControlFlags)m_scenePresence.AgentControlFlags;
+            PhysicsActor actor = m_scenePresence.PhysicsActor;
+
+            // Create forward and left vectors from the current avatar rotation
+            Matrix4 rotMatrix = Matrix4.CreateFromQuaternion(m_scenePresence.Rotation);
+            Vector3 fwd = Vector3.Transform(Vector3.UnitX, rotMatrix);
+            Vector3 left = Vector3.Transform(Vector3.UnitY, rotMatrix);
+
+            // Check control flags
+            bool heldForward = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_AT_POS;
+            bool heldBack = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG;
+            bool heldLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS;
+            bool heldRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG;
+            //bool heldTurnLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT;
+            //bool heldTurnRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT;
+            bool heldUp = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) == AgentManager.ControlFlags.AGENT_CONTROL_UP_POS;
+            bool heldDown = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG;
+            //bool flying = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) == AgentManager.ControlFlags.AGENT_CONTROL_FLY;
+            //bool mouselook = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) == AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK;
+
+            // Direction in which the avatar is trying to move
+            Vector3 move = Vector3.Zero;
+            if (heldForward) { move.X += fwd.X; move.Y += fwd.Y; }
+            if (heldBack) { move.X -= fwd.X; move.Y -= fwd.Y; }
+            if (heldLeft) { move.X += left.X; move.Y += left.Y; }
+            if (heldRight) { move.X -= left.X; move.Y -= left.Y; }
+            if (heldUp) { move.Z += 1; }
+            if (heldDown) { move.Z -= 1; }
+
+            // Is the avatar trying to move?
+//            bool moving = (move != Vector3.Zero);
+            bool jumping = m_animTickJump != 0;
+
+            #endregion Inputs
+
+            #region Flying
+
+            if (actor != null && actor.Flying)
+            {
+                m_animTickFall = 0;
+                m_animTickJump = 0;
+
+                if (move.X != 0f || move.Y != 0f)
+                {
+                    return (m_scenePresence.Scene.m_useFlySlow ? "FLYSLOW" : "FLY");
+                }
+                else if (move.Z > 0f)
+                {
+                    return "HOVER_UP";
+                }
+                else if (move.Z < 0f)
+                {
+                    if (actor != null && actor.IsColliding)
+                        return "LAND";
+                    else
+                        return "HOVER_DOWN";
+                }
+                else
+                {
+                    return "HOVER";
+                }
+            }
+
+            #endregion Flying
+
+            #region Falling/Floating/Landing
+
+            if (actor == null || !actor.IsColliding)
+            {
+                float fallElapsed = (float)(Environment.TickCount - m_animTickFall) / 1000f;
+                float fallVelocity = (actor != null) ? actor.Velocity.Z : 0.0f;
+
+                if (m_animTickFall == 0 || (fallElapsed > FALL_DELAY && fallVelocity >= 0.0f))
+                {
+                    // Just started falling
+                    m_animTickFall = Environment.TickCount;
+                }
+                else if (!jumping && fallElapsed > FALL_DELAY)
+                {
+                    // Falling long enough to trigger the animation
+                    return "FALLDOWN";
+                }
+
+                return m_movementAnimation;
+            }
+
+            #endregion Falling/Floating/Landing
+
+            #region Ground Movement
+
+            if (m_movementAnimation == "FALLDOWN")
+            {
+                m_animTickFall = Environment.TickCount;
+
+                // TODO: SOFT_LAND support
+                return "LAND";
+            }
+            else if (m_movementAnimation == "LAND")
+            {
+                float landElapsed = (float)(Environment.TickCount - m_animTickFall) / 1000f;
+
+                if (landElapsed <= FALL_DELAY)
+                    return "LAND";
+            }
+
+            m_animTickFall = 0;
+
+            if (move.Z > 0f)
+            {
+                // Jumping
+                if (!jumping)
+                {
+                    // Begin prejump
+                    m_animTickJump = Environment.TickCount;
+                    return "PREJUMP";
+                }
+                else if (Environment.TickCount - m_animTickJump > PREJUMP_DELAY * 1000.0f)
+                {
+                    // Start actual jump
+                    if (m_animTickJump == -1)
+                    {
+                        // Already jumping! End the current jump
+                        m_animTickJump = 0;
+                        return "JUMP";
+                    }
+
+                    m_animTickJump = -1;
+                    return "JUMP";
+                }
+            }
+            else
+            {
+                // Not jumping
+                m_animTickJump = 0;
+
+                if (move.X != 0f || move.Y != 0f)
+                {
+                    // Walking / crouchwalking / running
+                    if (move.Z < 0f)
+                        return "CROUCHWALK";
+                    else if (m_scenePresence.SetAlwaysRun)
+                        return "RUN";
+                    else
+                        return "WALK";
+                }
+                else
+                {
+                    // Not walking
+                    if (move.Z < 0f)
+                        return "CROUCH";
+                    else
+                        return "STAND";
+                }
+            }
+
+            #endregion Ground Movement
+
+            return m_movementAnimation;
+        }        
+
+        /// 
+        /// Update the movement animation of this avatar according to its current state
+        /// 
+        public void UpdateMovementAnimations()
+        {
+            m_movementAnimation = GetMovementAnimation();
+
+            if (m_movementAnimation == "PREJUMP" && !m_scenePresence.Scene.m_usePreJump)
+            {
+                // This was the previous behavior before PREJUMP
+                TrySetMovementAnimation("JUMP");
+            }
+            else
+            {
+                TrySetMovementAnimation(m_movementAnimation);
+            }
+        }
+
+        public UUID[] GetAnimationArray()
+        {
+            UUID[] animIDs;
+            int[] sequenceNums;
+            UUID[] objectIDs;
+            m_animations.GetArrays(out animIDs, out sequenceNums, out objectIDs);
+            return animIDs;
+        }        
+
+        /// 
+        ///
+        /// 
+        /// 
+        /// 
+        /// 
+        public void SendAnimPack(UUID[] animations, int[] seqs, UUID[] objectIDs)
+        {
+            if (m_scenePresence.IsChildAgent)
+                return;
+
+            m_scenePresence.Scene.ForEachClient(
+                delegate(IClientAPI client) 
+                { 
+                    client.SendAnimations(animations, seqs, m_scenePresence.ControllingClient.AgentId, objectIDs); 
+                });
+        }
+
+        public void SendAnimPackToClient(IClientAPI client)
+        {
+            if (m_scenePresence.IsChildAgent)
+                return;
+            
+            UUID[] animIDs;
+            int[] sequenceNums;
+            UUID[] objectIDs;
+
+            m_animations.GetArrays(out animIDs, out sequenceNums, out objectIDs);
+
+            m_scenePresence.ControllingClient.SendAnimations(
+                animIDs, sequenceNums, m_scenePresence.ControllingClient.AgentId, objectIDs);
+        }
+
+        /// 
+        /// Send animation information about this avatar to all clients.
+        /// 
+        public void SendAnimPack()
+        {
+            //m_log.Debug("Sending animation pack to all");
+            
+            if (m_scenePresence.IsChildAgent)
+                return;
+
+            UUID[] animIDs;
+            int[] sequenceNums;
+            UUID[] objectIDs;
+
+            m_animations.GetArrays(out animIDs, out sequenceNums, out objectIDs);
+
+            SendAnimPack(animIDs, sequenceNums, objectIDs);
+        }        
+    }
+}
\ No newline at end of file
diff --git a/OpenSim/Region/Framework/Scenes/AnimationSet.cs b/OpenSim/Region/Framework/Scenes/AnimationSet.cs
index 740d168c09..3e6781ef51 100644
--- a/OpenSim/Region/Framework/Scenes/AnimationSet.cs
+++ b/OpenSim/Region/Framework/Scenes/AnimationSet.cs
@@ -39,13 +39,14 @@ namespace OpenSim.Region.Framework.Scenes
     {
         public static AvatarAnimations Animations = new AvatarAnimations();
 
-        private Animation m_defaultAnimation = new Animation();
-        private List m_animations = new List();
+        private OpenSim.Framework.Animation m_defaultAnimation = new OpenSim.Framework.Animation();
+        private List m_animations = new List();
 
-        public Animation DefaultAnimation 
+        public OpenSim.Framework.Animation DefaultAnimation 
         {
             get { return m_defaultAnimation; } 
         }
+        
         public AnimationSet()
         {
             ResetDefaultAnimation();
@@ -71,7 +72,7 @@ namespace OpenSim.Region.Framework.Scenes
             {
                 if (!HasAnimation(animID))
                 {
-                    m_animations.Add(new Animation(animID, sequenceNum, objectID));
+                    m_animations.Add(new OpenSim.Framework.Animation(animID, sequenceNum, objectID));
                     return true;
                 }
             }
@@ -115,7 +116,7 @@ namespace OpenSim.Region.Framework.Scenes
         {
             if (m_defaultAnimation.AnimID != animID)
             {
-                m_defaultAnimation = new Animation(animID, sequenceNum, objectID);
+                m_defaultAnimation = new OpenSim.Framework.Animation(animID, sequenceNum, objectID);
                 return true;
             }
             return false;
@@ -159,13 +160,13 @@ namespace OpenSim.Region.Framework.Scenes
             }
         }
 
-        public Animation[] ToArray()
+        public OpenSim.Framework.Animation[] ToArray()
         {
-            Animation[] theArray = new Animation[m_animations.Count];
+            OpenSim.Framework.Animation[] theArray = new OpenSim.Framework.Animation[m_animations.Count];
             uint i = 0;
             try
             {
-                foreach (Animation anim in m_animations)
+                foreach (OpenSim.Framework.Animation anim in m_animations)
                     theArray[i++] = anim;
             }
             catch 
@@ -175,9 +176,9 @@ namespace OpenSim.Region.Framework.Scenes
             return theArray;
         }
 
-        public void FromArray(Animation[] theArray)
+        public void FromArray(OpenSim.Framework.Animation[] theArray)
         {
-            foreach (Animation anim in theArray)
+            foreach (OpenSim.Framework.Animation anim in theArray)
                 m_animations.Add(anim);
         }
     }
diff --git a/OpenSim/Region/Framework/Scenes/Hypergrid/HGSceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/Hypergrid/HGSceneCommunicationService.cs
index d7e62a8af5..0f9c190265 100644
--- a/OpenSim/Region/Framework/Scenes/Hypergrid/HGSceneCommunicationService.cs
+++ b/OpenSim/Region/Framework/Scenes/Hypergrid/HGSceneCommunicationService.cs
@@ -82,7 +82,7 @@ namespace OpenSim.Region.Framework.Scenes.Hypergrid
             IEventQueue eq = avatar.Scene.RequestModuleInterface();
 
             // Reset animations; the viewer does that in teleports.
-            avatar.ResetAnimations();
+            avatar.Animator.ResetAnimations();
 
             if (regionHandle == m_regionInfo.RegionHandle)
             {
diff --git a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
index 4a2db5eda0..76c6caba33 100644
--- a/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneCommunicationService.cs
@@ -801,7 +801,7 @@ namespace OpenSim.Region.Framework.Scenes
             IEventQueue eq = avatar.Scene.RequestModuleInterface();
 
             // Reset animations; the viewer does that in teleports.
-            avatar.ResetAnimations();
+            avatar.Animator.ResetAnimations();
 
             if (regionHandle == m_regionInfo.RegionHandle)
             {
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 08c144af5e..33c1932803 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -35,6 +35,7 @@ using OpenSim.Framework;
 using OpenSim.Framework.Client;
 using OpenSim.Framework.Communications.Cache;
 using OpenSim.Region.Framework.Interfaces;
+using OpenSim.Region.Framework.Scenes.Animation;
 using OpenSim.Region.Framework.Scenes.Types;
 using OpenSim.Region.Physics.Manager;
 using GridRegion = OpenSim.Services.Interfaces.GridRegion;
@@ -79,6 +80,7 @@ namespace OpenSim.Region.Framework.Scenes
 //        private static readonly byte[] DEFAULT_TEXTURE = AvatarAppearance.GetDefaultTexture().GetBytes();
         private static readonly Array DIR_CONTROL_FLAGS = Enum.GetValues(typeof(Dir_ControlFlags));
         private static readonly Vector3 HEAD_ADJUSTMENT = new Vector3(0f, 0f, 0.3f);
+        
         /// 
         /// Experimentally determined "fudge factor" to make sit-target positions
         /// the same as in SecondLife. Fudge factor was tested for 36 different
@@ -93,7 +95,15 @@ namespace OpenSim.Region.Framework.Scenes
 
         private ISceneViewer m_sceneViewer;
 
-        private AnimationSet m_animations = new AnimationSet();
+        /// 
+        /// The animator for this avatar
+        /// 
+        public ScenePresenceAnimator Animator
+        {
+            get { return m_animator; }
+        }
+        protected ScenePresenceAnimator m_animator;
+
         private Dictionary scriptedcontrols = new Dictionary();
         private ScriptControlled IgnoredControls = ScriptControlled.CONTROL_ZERO;
         private ScriptControlled LastCommands = ScriptControlled.CONTROL_ZERO;
@@ -134,12 +144,7 @@ namespace OpenSim.Region.Framework.Scenes
         private int m_perfMonMS;
 
         private bool m_setAlwaysRun;
-
-        private string m_movementAnimation = "DEFAULT";
-        private int m_animTickFall;
-        private int m_animTickJump;
-        private bool m_useFlySlow;
-        private bool m_usePreJump;
+        
         private bool m_forceFly;
         private bool m_flyDisabled;
 
@@ -227,7 +232,6 @@ namespace OpenSim.Region.Framework.Scenes
             DIR_CONTROL_FLAG_DOWN = AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG,
             DIR_CONTROL_FLAG_DOWN_NUDGE = AgentManager.ControlFlags.AGENT_CONTROL_NUDGE_UP_NEG
         }
-
         
         /// 
         /// Position at which a significant movement was made
@@ -238,7 +242,10 @@ namespace OpenSim.Region.Framework.Scenes
         string m_callbackURI;
         ulong m_rootRegionHandle;
 
-        private IScriptModule[] m_scriptEngines;
+        /// 
+        /// Script engines present in the scene
+        /// 
+        private IScriptModule[] m_scriptEngines;         
 
         #region Properties
 
@@ -586,11 +593,6 @@ namespace OpenSim.Region.Framework.Scenes
             }
         }
 
-        public AnimationSet Animations
-        {
-            get { return m_animations;  }
-        }
-
         private bool m_inTransit;
         private bool m_mouseLook;
         private bool m_leftButtonDown;
@@ -625,6 +627,7 @@ namespace OpenSim.Region.Framework.Scenes
 
         private ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo)
         {
+            m_animator = new ScenePresenceAnimator(this);
             m_sendCourseLocationsMethod = SendCoarseLocationsDefault;
             CreateSceneViewer();
             m_rootRegionHandle = reginfo.RegionHandle;
@@ -637,15 +640,12 @@ namespace OpenSim.Region.Framework.Scenes
             m_regionInfo = reginfo;
             m_localId = m_scene.AllocateLocalId();
 
-            m_useFlySlow = m_scene.m_useFlySlow;
-            m_usePreJump = m_scene.m_usePreJump;
-
             IGroupsModule gm = m_scene.RequestModuleInterface();
             if (gm != null)
                 m_grouptitle = gm.GetGroupTitle(m_uuid);
 
             m_scriptEngines = m_scene.RequestModuleInterfaces();
-
+            
             AbsolutePosition = posLastSignificantMove = m_CameraCenter =
                 m_lastCameraCenter = m_controllingClient.StartPos;
 
@@ -656,7 +656,8 @@ namespace OpenSim.Region.Framework.Scenes
 
             AdjustKnownSeeds();
 
-            TrySetMovementAnimation("STAND"); // TODO: I think, this won't send anything, as we are still a child here...
+            // TODO: I think, this won't send anything, as we are still a child here...
+            Animator.TrySetMovementAnimation("STAND"); 
 
             // we created a new ScenePresence (a new child agent) in a fresh region.
             // Request info about all the (root) agents in this region
@@ -665,7 +666,6 @@ namespace OpenSim.Region.Framework.Scenes
 
             RegisterToEvents();
             SetDirectionVectors();
-
         }
 
         public ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo, byte[] visualParams,
@@ -674,6 +674,7 @@ namespace OpenSim.Region.Framework.Scenes
         {
             CreateSceneViewer();
             m_appearance = new AvatarAppearance(m_uuid, wearables, visualParams);
+            
         }
 
         public ScenePresence(IClientAPI client, Scene world, RegionInfo reginfo, AvatarAppearance appearance)
@@ -857,7 +858,7 @@ namespace OpenSim.Region.Framework.Scenes
             // Don't send an animation pack here, since on a region crossing this will sometimes cause a flying 
             // avatar to return to the standing position in mid-air.  On login it looks like this is being sent
             // elsewhere anyway
-            //SendAnimPack();
+            // Animator.SendAnimPack();
 
             m_scene.SwapRootAgentCount(false);
             
@@ -879,7 +880,7 @@ namespace OpenSim.Region.Framework.Scenes
                 ScenePresence presence = animAgents[i];
 
                 if (presence != this)
-                    presence.SendAnimPackToClient(ControllingClient);
+                    presence.Animator.SendAnimPackToClient(ControllingClient);
             }
 
             m_scene.EventManager.TriggerOnMakeRootAgent(this);
@@ -894,7 +895,7 @@ namespace OpenSim.Region.Framework.Scenes
         /// 
         public void MakeChildAgent()
         {
-            m_animations.Clear();
+            Animator.ResetAnimations();
 
 //            m_log.DebugFormat(
 //                 "[SCENEPRESENCE]: Downgrading root agent {0}, {1} to a child agent in {2}",
@@ -995,7 +996,7 @@ namespace OpenSim.Region.Framework.Scenes
                 AbsolutePosition = AbsolutePosition + new Vector3(0f, 0f, (1.56f / 6f));
             }
 
-            TrySetMovementAnimation("LAND");
+            Animator.TrySetMovementAnimation("LAND");
             SendFullUpdateToAllClients();
         }
 
@@ -1247,7 +1248,7 @@ namespace OpenSim.Region.Framework.Scenes
                 // TODO: This doesn't prevent the user from walking yet.
                 // Setting parent ID would fix this, if we knew what value
                 // to use.  Or we could add a m_isSitting variable.
-                TrySetMovementAnimation("SIT_GROUND_CONSTRAINED");
+                Animator.TrySetMovementAnimation("SIT_GROUND_CONSTRAINED");
             }
 
             // In the future, these values might need to go global.
@@ -1453,7 +1454,7 @@ namespace OpenSim.Region.Framework.Scenes
                     AddNewMovement(agent_control_v3, q);
 
                     if (update_movementflag)
-                        UpdateMovementAnimations();
+                        Animator.UpdateMovementAnimations();
                 }
             }
 
@@ -1561,7 +1562,7 @@ namespace OpenSim.Region.Framework.Scenes
             }
         }
         /// 
-        /// Perform the logic necessary to stand the client up.  This method also executes
+        /// Perform the logic necessary to stand the avatar up.  This method also executes
         /// the stand animation.
         /// 
         public void StandUp()
@@ -1611,7 +1612,7 @@ namespace OpenSim.Region.Framework.Scenes
                 }
             }
 
-            TrySetMovementAnimation("STAND");
+            Animator.TrySetMovementAnimation("STAND");
         }
 
         private SceneObjectPart FindNextAvailableSitTarget(UUID targetID)
@@ -1850,7 +1851,7 @@ namespace OpenSim.Region.Framework.Scenes
             Velocity = Vector3.Zero;
             RemoveFromPhysicalScene();
 
-            TrySetMovementAnimation(sitAnimation);
+            Animator.TrySetMovementAnimation(sitAnimation);
             SendFullUpdateToAllClients();
             // This may seem stupid, but Our Full updates don't send avatar rotation :P
             // So we're also sending a terse update (which has avatar rotation)
@@ -1870,6 +1871,7 @@ namespace OpenSim.Region.Framework.Scenes
                 PhysicsActor.SetAlwaysRun = pSetAlwaysRun;
             }
         }
+        
         public BinBVHAnimation GenerateRandomAnimation()
         {
             int rnditerations = 3;
@@ -1917,7 +1919,6 @@ namespace OpenSim.Region.Framework.Scenes
                 }
             }
 
-
             AssetBase Animasset = new AssetBase(UUID.Random(), "Random Animation", (sbyte)AssetType.Animation);
             Animasset.Data = anim.ToBytes();
             Animasset.Temporary = true;
@@ -1925,297 +1926,19 @@ namespace OpenSim.Region.Framework.Scenes
             Animasset.Description = "dance";
             //BinBVHAnimation bbvhanim = new BinBVHAnimation(Animasset.Data);
 
-
             m_scene.AssetService.Store(Animasset);
-            AddAnimation(Animasset.FullID, UUID);
+            Animator.AddAnimation(Animasset.FullID, UUID);
             return anim;
         }
-        public void AddAnimation(UUID animID, UUID objectID)
-        {
-            if (m_isChildAgent)
-                return;
-
-            if (m_animations.Add(animID, m_controllingClient.NextAnimationSequenceNumber, objectID))
-                SendAnimPack();
-        }
-
-        // Called from scripts
-        public void AddAnimation(string name, UUID objectID)
-        {
-            if (m_isChildAgent)
-                return;
-
-            UUID animID = m_controllingClient.GetDefaultAnimation(name);
-            if (animID == UUID.Zero)
-                return;
-
-            AddAnimation(animID, objectID);
-        }
-
-        public void RemoveAnimation(UUID animID)
-        {
-            if (m_isChildAgent)
-                return;
-
-            if (m_animations.Remove(animID))
-                SendAnimPack();
-        }
-
-        // Called from scripts
-        public void RemoveAnimation(string name)
-        {
-            if (m_isChildAgent)
-                return;
-
-            UUID animID = m_controllingClient.GetDefaultAnimation(name);
-            if (animID == UUID.Zero)
-                return;
-
-            RemoveAnimation(animID);
-        }
-
-        public UUID[] GetAnimationArray()
-        {
-            UUID[] animIDs;
-            int[] sequenceNums;
-            UUID[] objectIDs;
-            m_animations.GetArrays(out animIDs, out sequenceNums, out objectIDs);
-            return animIDs;
-        }
 
         public void HandleStartAnim(IClientAPI remoteClient, UUID animID)
         {
-            AddAnimation(animID, UUID.Zero);
+            Animator.AddAnimation(animID, UUID.Zero);
         }
 
         public void HandleStopAnim(IClientAPI remoteClient, UUID animID)
         {
-            RemoveAnimation(animID);
-        }
-
-        /// 
-        /// The movement animation is reserved for "main" animations
-        /// that are mutually exclusive, e.g. flying and sitting.
-        /// 
-        protected void TrySetMovementAnimation(string anim)
-        {
-            //m_log.DebugFormat("Updating movement animation to {0}", anim);
-
-            if (!m_isChildAgent)
-            {
-                if (m_animations.TrySetDefaultAnimation(anim, m_controllingClient.NextAnimationSequenceNumber, UUID.Zero))
-                {
-                    if (m_scriptEngines != null)
-                    {
-                        lock (m_attachments)
-                        {
-                            foreach (SceneObjectGroup grp in m_attachments)
-                            {
-                                // 16384 is CHANGED_ANIMATION
-                                //
-                                // Send this to all attachment root prims
-                                //
-                                foreach (IScriptModule m in m_scriptEngines)
-                                {
-                                    if (m == null) // No script engine loaded
-                                        continue;
-
-                                    m.PostObjectEvent(grp.RootPart.UUID, "changed", new Object[] { 16384 });
-                                }
-                            }
-                        }
-                    }
-                    SendAnimPack();
-                }
-            }
-        }
-
-        /// 
-        /// This method determines the proper movement related animation
-        /// 
-        public string GetMovementAnimation()
-        {
-            const float FALL_DELAY = 0.33f;
-            const float PREJUMP_DELAY = 0.25f;
-
-            #region Inputs
-
-            AgentManager.ControlFlags controlFlags = (AgentManager.ControlFlags)m_AgentControlFlags;
-            PhysicsActor actor = m_physicsActor;
-
-            // Create forward and left vectors from the current avatar rotation
-            Matrix4 rotMatrix = Matrix4.CreateFromQuaternion(m_bodyRot);
-            Vector3 fwd = Vector3.Transform(Vector3.UnitX, rotMatrix);
-            Vector3 left = Vector3.Transform(Vector3.UnitY, rotMatrix);
-
-            // Check control flags
-            bool heldForward = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_AT_POS;
-            bool heldBack = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_AT_NEG;
-            bool heldLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_POS;
-            bool heldRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_LEFT_NEG;
-            //bool heldTurnLeft = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_LEFT;
-            //bool heldTurnRight = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT) == AgentManager.ControlFlags.AGENT_CONTROL_TURN_RIGHT;
-            bool heldUp = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_POS) == AgentManager.ControlFlags.AGENT_CONTROL_UP_POS;
-            bool heldDown = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG) == AgentManager.ControlFlags.AGENT_CONTROL_UP_NEG;
-            //bool flying = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_FLY) == AgentManager.ControlFlags.AGENT_CONTROL_FLY;
-            //bool mouselook = (controlFlags & AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK) == AgentManager.ControlFlags.AGENT_CONTROL_MOUSELOOK;
-
-            // Direction in which the avatar is trying to move
-            Vector3 move = Vector3.Zero;
-            if (heldForward) { move.X += fwd.X; move.Y += fwd.Y; }
-            if (heldBack) { move.X -= fwd.X; move.Y -= fwd.Y; }
-            if (heldLeft) { move.X += left.X; move.Y += left.Y; }
-            if (heldRight) { move.X -= left.X; move.Y -= left.Y; }
-            if (heldUp) { move.Z += 1; }
-            if (heldDown) { move.Z -= 1; }
-
-            // Is the avatar trying to move?
-//            bool moving = (move != Vector3.Zero);
-            bool jumping = m_animTickJump != 0;
-
-            #endregion Inputs
-
-            #region Flying
-
-            if (actor != null && actor.Flying)
-            {
-                m_animTickFall = 0;
-                m_animTickJump = 0;
-
-                if (move.X != 0f || move.Y != 0f)
-                {
-                    return (m_useFlySlow ? "FLYSLOW" : "FLY");
-                }
-                else if (move.Z > 0f)
-                {
-                    return "HOVER_UP";
-                }
-                else if (move.Z < 0f)
-                {
-                    if (actor != null && actor.IsColliding)
-                        return "LAND";
-                    else
-                        return "HOVER_DOWN";
-                }
-                else
-                {
-                    return "HOVER";
-                }
-            }
-
-            #endregion Flying
-
-            #region Falling/Floating/Landing
-
-            if (actor == null || !actor.IsColliding)
-            {
-                float fallElapsed = (float)(Environment.TickCount - m_animTickFall) / 1000f;
-                float fallVelocity = (actor != null) ? actor.Velocity.Z : 0.0f;
-
-                if (m_animTickFall == 0 || (fallElapsed > FALL_DELAY && fallVelocity >= 0.0f))
-                {
-                    // Just started falling
-                    m_animTickFall = Environment.TickCount;
-                }
-                else if (!jumping && fallElapsed > FALL_DELAY)
-                {
-                    // Falling long enough to trigger the animation
-                    return "FALLDOWN";
-                }
-
-                return m_movementAnimation;
-            }
-
-            #endregion Falling/Floating/Landing
-
-            #region Ground Movement
-
-            if (m_movementAnimation == "FALLDOWN")
-            {
-                m_animTickFall = Environment.TickCount;
-
-                // TODO: SOFT_LAND support
-                return "LAND";
-            }
-            else if (m_movementAnimation == "LAND")
-            {
-                float landElapsed = (float)(Environment.TickCount - m_animTickFall) / 1000f;
-
-                if (landElapsed <= FALL_DELAY)
-                    return "LAND";
-            }
-
-            m_animTickFall = 0;
-
-            if (move.Z > 0f)
-            {
-                // Jumping
-                if (!jumping)
-                {
-                    // Begin prejump
-                    m_animTickJump = Environment.TickCount;
-                    return "PREJUMP";
-                }
-                else if (Environment.TickCount - m_animTickJump > PREJUMP_DELAY * 1000.0f)
-                {
-                    // Start actual jump
-                    if (m_animTickJump == -1)
-                    {
-                        // Already jumping! End the current jump
-                        m_animTickJump = 0;
-                        return "JUMP";
-                    }
-
-                    m_animTickJump = -1;
-                    return "JUMP";
-                }
-            }
-            else
-            {
-                // Not jumping
-                m_animTickJump = 0;
-
-                if (move.X != 0f || move.Y != 0f)
-                {
-                    // Walking / crouchwalking / running
-                    if (move.Z < 0f)
-                        return "CROUCHWALK";
-                    else if (m_setAlwaysRun)
-                        return "RUN";
-                    else
-                        return "WALK";
-                }
-                else
-                {
-                    // Not walking
-                    if (move.Z < 0f)
-                        return "CROUCH";
-                    else
-                        return "STAND";
-                }
-            }
-
-            #endregion Ground Movement
-
-            return m_movementAnimation;
-        }
-
-        /// 
-        /// Update the movement animation of this avatar according to its current state
-        /// 
-        protected void UpdateMovementAnimations()
-        {
-            m_movementAnimation = GetMovementAnimation();
-
-            if (m_movementAnimation == "PREJUMP" && !m_usePreJump)
-            {
-                // This was the previous behavior before PREJUMP
-                TrySetMovementAnimation("JUMP");
-            }
-            else
-            {
-                TrySetMovementAnimation(m_movementAnimation);
-            }
+            Animator.RemoveAnimation(animID);
         }
 
         /// 
@@ -2289,8 +2012,8 @@ namespace OpenSim.Region.Framework.Scenes
                         direc.Z *= 3.0f;
 
                         // TODO: PreJump and jump happen too quickly.  Many times prejump gets ignored.
-                        TrySetMovementAnimation("PREJUMP");
-                        TrySetMovementAnimation("JUMP");
+                        Animator.TrySetMovementAnimation("PREJUMP");
+                        Animator.TrySetMovementAnimation("JUMP");
                     }
                 }
             }
@@ -2504,7 +2227,7 @@ namespace OpenSim.Region.Framework.Scenes
                     {
                         avatar.SendFullUpdateToOtherClient(this);
                         avatar.SendAppearanceToOtherAgent(this);
-                        avatar.SendAnimPackToClient(ControllingClient);
+                        avatar.Animator.SendAnimPackToClient(ControllingClient);
                     }
                 }
             }
@@ -2512,7 +2235,7 @@ namespace OpenSim.Region.Framework.Scenes
             m_scene.StatsReporter.AddAgentUpdates(avatars.Length);
             m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS);
 
-            //SendAnimPack();
+            //Animator.SendAnimPack();
         }
 
         public void SendFullUpdateToAllClients()
@@ -2529,7 +2252,7 @@ namespace OpenSim.Region.Framework.Scenes
             m_scene.StatsReporter.AddAgentUpdates(avatars.Count);
             m_scene.StatsReporter.AddAgentTime(Environment.TickCount - m_perfMonMS);
 
-            SendAnimPack();
+            Animator.SendAnimPack();
         }
 
         /// 
@@ -2646,7 +2369,7 @@ namespace OpenSim.Region.Framework.Scenes
             SendAppearanceToAllOtherAgents();
             if (!m_startAnimationSet)
             {
-                UpdateMovementAnimations();
+                Animator.UpdateMovementAnimations();
                 m_startAnimationSet = true;
             }
 
@@ -2674,54 +2397,6 @@ namespace OpenSim.Region.Framework.Scenes
             set { m_appearance = value; }
         }
 
-        /// 
-        ///
-        /// 
-        /// 
-        /// 
-        /// 
-        public void SendAnimPack(UUID[] animations, int[] seqs, UUID[] objectIDs)
-        {
-            if (m_isChildAgent)
-                return;
-
-            m_scene.ForEachClient(
-                delegate(IClientAPI client) { client.SendAnimations(animations, seqs, m_controllingClient.AgentId, objectIDs); });
-        }
-
-        public void SendAnimPackToClient(IClientAPI client)
-        {
-            if (m_isChildAgent)
-                return;
-            UUID[] animIDs;
-            int[] sequenceNums;
-            UUID[] objectIDs;
-
-            m_animations.GetArrays(out animIDs, out sequenceNums, out objectIDs);
-
-            client.SendAnimations(animIDs, sequenceNums, m_controllingClient.AgentId, objectIDs);
-        }
-
-        /// 
-        /// Send animation information about this avatar to all clients.
-        /// 
-        public void SendAnimPack()
-        {
-            //m_log.Debug("Sending animation pack to all");
-            
-            if (m_isChildAgent)
-                return;
-
-            UUID[] animIDs;
-            int[] sequenceNums;
-            UUID[] objectIDs;
-
-            m_animations.GetArrays(out animIDs, out sequenceNums, out objectIDs);
-
-            SendAnimPack(animIDs, sequenceNums, objectIDs);
-        }
-
-
         #endregion
 
         #region Significant Movement Method
@@ -2919,13 +2594,9 @@ namespace OpenSim.Region.Framework.Scenes
         public void Reset()
         {
             // Put the child agent back at the center
-            AbsolutePosition = new Vector3(((float)Constants.RegionSize * 0.5f), ((float)Constants.RegionSize * 0.5f), 70);
-            ResetAnimations();
-        }
-
-        public void ResetAnimations()
-        {
-            m_animations.Clear();
+            AbsolutePosition 
+                = new Vector3(((float)Constants.RegionSize * 0.5f), ((float)Constants.RegionSize * 0.5f), 70);
+            Animator.ResetAnimations();
         }
 
         /// 
@@ -3149,7 +2820,7 @@ namespace OpenSim.Region.Framework.Scenes
             // Animations
             try
             {
-                cAgent.Anims = m_animations.ToArray();
+                cAgent.Anims = Animator.Animations.ToArray();
             }
             catch { }
 
@@ -3228,15 +2899,13 @@ namespace OpenSim.Region.Framework.Scenes
             // Animations
             try
             {
-                m_animations.Clear();
-                m_animations.FromArray(cAgent.Anims);
+                Animator.ResetAnimations();
+                Animator.Animations.FromArray(cAgent.Anims);
             }
             catch {  }
 
             //cAgent.GroupID = ??
             //Groups???
-
-
         }
 
         public bool CopyAgent(out IAgentData agent)
@@ -3318,7 +2987,7 @@ namespace OpenSim.Region.Framework.Scenes
             //if ((Math.Abs(Velocity.X) > 0.1e-9f) || (Math.Abs(Velocity.Y) > 0.1e-9f))
             // The Physics Scene will send updates every 500 ms grep: m_physicsActor.SubscribeEvents(
             // as of this comment the interval is set in AddToPhysicalScene
-            UpdateMovementAnimations();
+            Animator.UpdateMovementAnimations();
 
             CollisionEventUpdate collisionData = (CollisionEventUpdate)e;
             Dictionary coldata = collisionData.m_objCollisionList;
@@ -3327,7 +2996,7 @@ namespace OpenSim.Region.Framework.Scenes
 
             if (coldata.Count != 0)
             {
-                switch (m_movementAnimation)
+                switch (Animator.CurrentMovementAnimation)
                 {
                     case "STAND":
                     case "WALK":
@@ -3415,6 +3084,7 @@ namespace OpenSim.Region.Framework.Scenes
                 }
                 m_attachments.Clear();
             }
+            
             lock (m_knownChildRegions)
             {
                 m_knownChildRegions.Clear();
@@ -3425,6 +3095,7 @@ namespace OpenSim.Region.Framework.Scenes
                 m_reprioritization_timer.Enabled = false;
                 m_reprioritization_timer.Elapsed -= new ElapsedEventHandler(Reprioritize);
             }
+            
             // I don't get it but mono crashes when you try to dispose of this timer,
             // unsetting the elapsed callback should be enough to allow for cleanup however.
             //m_reprioritizationTimer.Dispose();
@@ -3497,6 +3168,35 @@ namespace OpenSim.Region.Framework.Scenes
             return true;
         }
 
+        /// 
+        /// Send a script event to this scene presence's attachments
+        /// 
+        /// The name of the event
+        /// The arguments for the event
+        public void SendScriptEventToAttachments(string eventName, Object[] args)
+        {
+            if (m_scriptEngines != null)
+            {
+                lock (m_attachments)
+                {
+                    foreach (SceneObjectGroup grp in m_attachments)
+                    {
+                        // 16384 is CHANGED_ANIMATION
+                        //
+                        // Send this to all attachment root prims
+                        //
+                        foreach (IScriptModule m in m_scriptEngines)
+                        {
+                            if (m == null) // No script engine loaded
+                                continue;
+
+                            m.PostObjectEvent(grp.RootPart.UUID, "changed", new Object[] { 16384 });
+                        }
+                    }
+                }
+            }            
+        }        
+
         public bool CrossAttachmentsIntoNewRegion(ulong regionHandle, bool silent)
         {
             lock (m_attachments)
@@ -3939,4 +3639,4 @@ namespace OpenSim.Region.Framework.Scenes
             }
         }
     }
-}
+}
\ No newline at end of file
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 0ea62d77c1..ff5dd9870c 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -3093,11 +3093,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
                 if (presence != null)
                 {
                     // Do NOT try to parse UUID, animations cannot be triggered by ID
-                    UUID animID=InventoryKey(anim, (int)AssetType.Animation);
+                    UUID animID = InventoryKey(anim, (int)AssetType.Animation);
                     if (animID == UUID.Zero)
-                        presence.AddAnimation(anim, m_host.UUID);
+                        presence.Animator.AddAnimation(anim, m_host.UUID);
                     else
-                        presence.AddAnimation(animID, m_host.UUID);
+                        presence.Animator.AddAnimation(animID, m_host.UUID);
                 }
             }
         }
@@ -3137,9 +3137,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
                 if (presence != null)
                 {
                     if (animID == UUID.Zero)
-                        presence.RemoveAnimation(anim);
+                        presence.Animator.RemoveAnimation(anim);
                     else
-                        presence.RemoveAnimation(animID);
+                        presence.Animator.RemoveAnimation(animID);
                 }
             }
         }
@@ -3983,12 +3983,13 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
 
                 if (presence != null)
                 {
-                    AnimationSet currentAnims = presence.Animations;
+                    AnimationSet currentAnims = presence.Animator.Animations;
                     string currentAnimationState = String.Empty;
                     if (animationstateNames.TryGetValue(currentAnims.DefaultAnimation.AnimID, out currentAnimationState))
                         return currentAnimationState;
                 }
             }
+            
             return String.Empty;
         }
 
@@ -5322,7 +5323,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
                 flags |= ScriptBaseClass.AGENT_TYPING;
             }
 
-            string agentMovementAnimation = agent.GetMovementAnimation();
+            string agentMovementAnimation = agent.Animator.GetMovementAnimation();
 
             if (agentMovementAnimation == "CROUCH")
             {
@@ -5354,7 +5355,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
                  flags |= ScriptBaseClass.AGENT_SITTING;
              }
 
-             if (agent.Animations.DefaultAnimation.AnimID == AnimationSet.Animations.AnimsUUID["SIT_GROUND_CONSTRAINED"])
+             if (agent.Animator.Animations.DefaultAnimation.AnimID 
+                == AnimationSet.Animations.AnimsUUID["SIT_GROUND_CONSTRAINED"])
              {
                  flags |= ScriptBaseClass.AGENT_SITTING;
              }
@@ -7144,7 +7146,7 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
             if (av == null || av.IsChildAgent) // only if in the region
                 return l;
             UUID[] anims;
-            anims = av.GetAnimationArray();
+            anims = av.Animator.GetAnimationArray();
             foreach (UUID foo in anims)
                 l.Add(foo.ToString());
             return l;
@@ -7272,7 +7274,8 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
                 {
                     LSL_Vector lower;
                     LSL_Vector upper;
-                    if (presence.Animations.DefaultAnimation.AnimID == AnimationSet.Animations.AnimsUUID["SIT_GROUND_CONSTRAINED"])
+                    if (presence.Animator.Animations.DefaultAnimation.AnimID 
+                        == AnimationSet.Animations.AnimsUUID["SIT_GROUND_CONSTRAINED"])
                     {
                         // This is for ground sitting avatars
                         float height = presence.Appearance.AvatarHeight / 2.66666667f;
diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
index 3ffcff0806..7fdbac8d86 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/OSSL_Api.cs
@@ -741,9 +741,9 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
                         }
                     }
                     if (animID == UUID.Zero)
-                        target.AddAnimation(animation, m_host.UUID);
+                        target.Animator.AddAnimation(animation, m_host.UUID);
                     else
-                        target.AddAnimation(animID, m_host.UUID);
+                        target.Animator.AddAnimation(animID, m_host.UUID);
                 }
             }
         }
@@ -773,10 +773,11 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
                             }
                         }
                     }
+                    
                     if (animID == UUID.Zero)
-                        target.RemoveAnimation(animation);
+                        target.Animator.RemoveAnimation(animation);
                     else
-                        target.RemoveAnimation(animID);
+                        target.Animator.RemoveAnimation(animID);
                 }
             }
         }