     // described in the comment for linearEaser above.
     mx_internal var transformEffectSubclass:Boolean = false;
     
-    // FIXME (chaase): Is weak Dictionary sufficient to hold these values and then
-    // dispense with them appropriately? What if we get interrupted before we
-    // clear the map?
-    /**
-     * @private
-     * 
-     * Stores the single instance for the current transform effect on a given target.
-     * There can be only one instance per target at any given time, so we store
-     * that instance in the map and insert new effect values into it before playing
-     * it, rather than creating new instances for each new effect. The instance
-     * is cleared out when the effect is played because we cannot add new information
-     * to the effect after it has already been started.
-     */
-    static protected var transformInstancePerTarget:Dictionary = new Dictionary(true);
-
     // FIXME (chaase): consider putting the three per-target maps into one 
     // single structure
     /**
      * @private
      * These maps hold information about whether values have already been applied
-     * to a target as a part of the 
-     */
-    static protected var appliedStartValuesPerTarget:Dictionary = new Dictionary(true);
-    /**
-     * @private
-     */
-    static protected var appliedEndValuesPerTarget:Dictionary = new Dictionary(true);
-    
+     * to a target as a part of the transition start or end process
+     */
+    static private var appliedStartValuesPerTarget:Dictionary = new Dictionary(true);
+    /**
+     * @private
+     */
+    static private var appliedEndValuesPerTarget:Dictionary = new Dictionary(true);
+
+    /**
+     * The sharedObjectDepot holds shared transform effect instances on a 
+     * per-toplevel-Parallel basis. That is, transform effects running in
+     * parallel will share a common effect instance with other effects
+     * grouped in the same Parallel tree. Effects running individually, or
+     * running inside a Sequence, will not share instances. We manage this
+     * by having a map-of-maps inside our sharedObjectDepot. The top-level
+     * map manages the per-toplevel-Parallel maps (maps keyd from particular
+     * Parallel effects), whose entries are maps that are keyed off of
+     * instance targets. The reason for the separate utility class is to
+     * simplify managing the map-of-maps; the depot uses a reference counter
+     * so that we know, when removing the shared-instance map entries, whether
+     * we can remove the top level map for a particular Paralle effect.
+     */
+    static private var sharedObjectDepot:SharedObjectDepot
+         = new SharedObjectDepot();
+             
     /**
      * @private
      * Helper structures to hold values used in applyValues()

    //
    //--------------------------------------------------------------------------

    /**
     *  @private
     *  

    override protected function initInstance(instance:IEffectInstance):void
    {
        var i:int;
        var adjustedDuration:Number = duration;
        var target:Object = instance.target;
        
        var transformInstance:AnimateTransformInstance =
