 		}				
 		
 		/**
-		 * Pushes a window onto the managed window stack 
+		 * Pushes an existing window onto the managed window stack. 
 		 * 
 		 *  @param win Window:MDIWindow to push onto managed windows stack 
 		 * */
 		public function manage(window:MDIWindow):void
 		{	
-			if(window != null)
+			if(window != null && windowList.indexOf(window) < 0)
+			{
 				windowList.push(window);
+			}
 		}
 		
 		/**

					case MDIManagerEvent.WINDOW_ADD:
						// get the effect here because this doesn't pass thru windowEventProxy()
						mgrEvent.effect = this.effects.getWindowAddEffect(mgrEvent.window, this);
						mgrEvent.effect.play();
					break;
					
					case MDIManagerEvent.WINDOW_MINIMIZE:						
						mgrEvent.effect.addEventListener(EffectEvent.EFFECT_END, onMinimizeEffectEnd);
						mgrEvent.effect.play();
					break;
					
					case MDIManagerEvent.WINDOW_RESTORE:
						removeTileInstance(mgrEvent.window);
						mgrEvent.effect.play();
					break;
					
					case MDIManagerEvent.WINDOW_MAXIMIZE:
						removeTileInstance(mgrEvent.window);
						maximizeWindow(mgrEvent.window);
					break;
					
					case MDIManagerEvent.WINDOW_CLOSE:
						removeTileInstance(mgrEvent.window);
						mgrEvent.effect.addEventListener(EffectEvent.EFFECT_END, onCloseEffectEnd);
						mgrEvent.effect.play();
					break;
					
					case MDIManagerEvent.WINDOW_FOCUS_START:
						mgrEvent.window.hasFocus = true;
						mgrEvent.window.validateNow();
						container.setChildIndex(mgrEvent.window, container.numChildren - 1);
						mgrEvent.effect.play();
					break;
					
					case MDIManagerEvent.WINDOW_FOCUS_END:
						mgrEvent.window.hasFocus = false;
						mgrEvent.window.validateNow();
						mgrEvent.effect.play();
					break;
		
					case MDIManagerEvent.WINDOW_DRAG_START:
						mgrEvent.effect.play();
					break;
		
					case MDIManagerEvent.WINDOW_DRAG:
						mgrEvent.effect.play();
					break;
		
					case MDIManagerEvent.WINDOW_DRAG_END:
						mgrEvent.effect.play();
					break;
					
					case MDIManagerEvent.WINDOW_RESIZE_START:
						mgrEvent.effect.play();
					break;
					
					case MDIManagerEvent.WINDOW_RESIZE:
						mgrEvent.effect.play();
					break;
					
					case MDIManagerEvent.WINDOW_RESIZE_END:
						mgrEvent.effect.play();
					break;
					
					case MDIManagerEvent.CASCADE:
						// get the effect here because this doesn't pass thru windowEventProxy()
						mgrEvent.effect = this.effects.getCascadeEffect(mgrEvent.effectItems, this);
						mgrEvent.effect.play();
					break;
					
					case MDIManagerEvent.TILE:
						// get the effect here because this doesn't pass thru windowEventProxy()
						mgrEvent.effect = this.effects.getTileEffect(mgrEvent.effectItems, this);
						mgrEvent.effect.play();
					break;
				}
			}			
		}
		
		private function onMinimizeEffectEnd(event:EffectEvent):void

	[Event(name="tile", type="flexlib.mdi.events.MDIManagerEvent")]
	
	/**
	 *  Dispatched when an effect begins.
	 *
	 *  @eventType mx.events.EffectEvent.EFFECT_START
	 */
	[Event(name="effectStart", type="mx.events.EffectEvent")]
	
	/**
	 *  Dispatched when an effect ends.
	 *
	 *  @eventType mx.events.EffectEvent.EFFECT_END
	 */
	[Event(name="effectEnd", type="mx.events.EffectEvent")]
	
	/**
	 * Class responsible for applying effects and default behaviors to MDIWindow instances such as
	 * tiling, cascading, minimizing, maximizing, etc.
	 */
	public class MDIManager extends EventDispatcher
	{
		/**
		 * Temporary storage location for use in dispatching MDIEffectEvents.
		 * 
		 * @private
		 */
		private var mgrEventCollection:ArrayCollection = new ArrayCollection();
		
		private static var globalMDIManager:MDIManager;
		public static function get global():MDIManager
