 			
 			_selection.length = 0;
 			for each (var node : ISceneNode in selection)
-				_selection.push(node.parent);
-		}
-		
-		private function parseNodeType() : void
-		{
-			var nodeType 	: String 				= getToken(true).toLowerCase();
-			var numNodes	: int					= _selection.length;
-			var selection	: Vector.<ISceneNode>	= _selection.slice();
-			
-			if (nodeType == "*")
-				selectChildren();
+			{
+				if (node.parent)
+					_selection.push(node.parent);
+				else
+					_selection.push(node);
+			}
+		}
+		
+		private function parseNodeType(nodeType : String) : void
+		{
+			if (nodeType == '*' || nodeType == '.')
+			{
+				// nothing
+			}
+			else if (nodeType == '..')
+			{
+				selectParents();
+			}
 			else
 			{
-				_selection.length = 0;
-				for (var i : int = numNodes - 1; i >= 0; --i)
-				{
-					var node : ISceneNode = selection[i];
-					
-					if (node is Group)
-					{
-						var group : Group	= node as Group;
-						var numChildren : int = group.numChildren;
-						
-						for (var j : int = 0; j < numChildren; ++j)
-						{
-							var child 		: ISceneNode 	= group.getChildAt(j);
-							var childType 	: String 		= getQualifiedClassName(child).split('::')[1];
-							
-							if (childType.toLowerCase() == nodeType)
-								_selection.push(child);
-						}
-					}
-				}
+				selectChildren(nodeType);
 			}
 			
 			// apply predicates

			if (doNext)
				nextToken(token);
			
//			trace(token);

			return token;
		}
		

			}
			
			// parse
			while (token)
			{
				switch (token)
				{
					case '//' :
						nextToken(token);
						selectDescendants();
						break ;
					case '/' :
						nextToken(token);
						selectChildren();
						break ;
					default :
						nextToken(token);
						parseNodeType(token);
						break ;
				}
				
				token = getToken();
			}
		}
		
