public void run()
	{
		//The K contacts nearest to the lookup key are added to the shortList
		Collection<Contact> nearestContacts = node.getRouteTable().select(key, K);
		shortList.addAll(nearestContacts);

		if (shortList.isEmpty())
		{
			set(new TreeSet<Contact>());
			return;
		}
		
		//References to the node closest to target key (at the previous and at the current step)
		Contact oldClosestNode = null;
		Contact closestNode = shortList.first();
		
		//printShortList();
		
		while (!(oldClosestNode == closestNode))
		{
			doQueryRound(ALPHA,shortList.size());
			steps++;
			//printShortList();
			
			oldClosestNode = closestNode;
			try
			{
				closestNode = shortList.first();
			
				//If the closest node is not changed, query each of the k 
				//closest nodes that it has not already queried.
				if (oldClosestNode == closestNode)
				{
					doQueryRound(K,K);
					int oldSize = 0;
				    int size = markedList.size();
				    
				    //printShortList();
				    
					while(size < K && size != oldSize)
					{
						doQueryRound(K - size, K);
						oldSize = size;
						size = markedList.size();
					}
				}
			}
			catch(NoSuchElementException nsee)
			{
				System.err.println("No more contacts to probe!");
			}
		}
		
		//Build the response collection
		Collection<Contact> result = new TreeSet<Contact>(comparator);
		int i=0;
		Contact c = null;
		while (i<K && markedList.size()>0)
		{
			c = markedList.first();
			markedList.remove(c);
			result.add(c);
			i++;
		}
		
		set(result);
	}