         // be an editable input control.
         if (isEditableTarget(event.target))
             return;
-        
-        // 1. Was the space bar hit? 
+		
+		var touchMode:Boolean = (getStyle("interactionMode") == InteractionMode.TOUCH);
+        
+        // 1. Was the space bar hit? or was the enter key hit and we're in 5-way mode
         // Hitting the space bar means the current caret item, 
         // that is the item currently in focus, is being 
-        // selected. 
-        if (event.keyCode == Keyboard.SPACE)
-        {
-            setSelectedIndex(caretIndex, true); 
-            event.preventDefault();
-            return; 
-        }
-        
-        // FIXME (rfrishbe): hack for 5-way
-        if (getStyle("interactionMode") == InteractionMode.TOUCH && event.keyCode == Keyboard.ENTER)
-        {
-            setSelectedIndex(caretIndex, true); 
+        // selected or de-selected. 
+        if (event.keyCode == Keyboard.SPACE ||
+			(touchMode && event.keyCode == Keyboard.ENTER))
+        {
+			if (allowMultipleSelection)
+            {
+                // Need to set "changeCaret" to false below so that we 
+                // don't change the caret to an item in the selectedIndices
+                // if we are currently deselecting an item
+				setSelectedIndices(calculateSelectedIndices(caretIndex, event.shiftKey, event.ctrlKey), true, false);
+            }
+			else
+            {
+                // check to see if we're de-selecting the current item
+                if (caretIndex == selectedIndex && (event.ctrlKey || touchMode))
+                {
+                    // Unselect it, but don't change the caret
+                    setSelectedIndex(NO_SELECTION, true, false);
+                }
+                else
+                {
+                    // select the current item
+                    setSelectedIndex(caretIndex, true, false);
+                }
+            	
+            }
             event.preventDefault();
             return; 
         }

     * 
     *  @param dispatchChangeEvent if true, the component will dispatch a "change" event if the
     *  value has changed. Otherwise, it will dispatch a "valueCommit" event. 
     */
    mx_internal function setSelectedIndices(value:Vector.<int>, dispatchChangeEvent:Boolean = false):void
    {
        // TODO (jszeto) Do a deep compare of the vectors
        if (_proposedSelectedIndices == value || 


            dispatchEvent(new FlexEvent(FlexEvent.VALUE_COMMIT));
            
            if (currentChangeCaretOnSelection)
            {
                e = new IndexChangeEvent(IndexChangeEvent.CARET_CHANGE); 
                e.oldIndex = oldCaretIndex; 
                e.newIndex = caretIndex;
                dispatchEvent(e);
            }
        }
        
        return retVal; 
