diff --git a/.gitignore b/.gitignore
index 2443c87..473372b 100644
--- a/.gitignore
+++ b/.gitignore
@@ -8,3 +8,4 @@
 sampleData/*/*Output*
 output
 tmp/
+archive
diff --git a/readme.txt b/readme.txt
index e0dbfee..ea8efa0 100644
--- a/readme.txt
+++ b/readme.txt
@@ -10,6 +10,3 @@
 * chmod a+x *sh
 * ./run_uwc_devel.sh
 
-For more info, please see:
-
-https://studio.plugins.atlassian.com/wiki/display/UWC/Universal+Wiki+Converter
diff --git a/src/com/atlassian/uwc/converters/dokuwiki/HierarchyLinkConverterTest.java b/src/com/atlassian/uwc/converters/dokuwiki/HierarchyLinkConverterTest.java
index 53b39a8..ba485d4 100644
--- a/src/com/atlassian/uwc/converters/dokuwiki/HierarchyLinkConverterTest.java
+++ b/src/com/atlassian/uwc/converters/dokuwiki/HierarchyLinkConverterTest.java
@@ -137,6 +137,7 @@
 				"[[ns:tada]]\n" +
 				"[[ns:tada:subchild]]\n" +
 				"[[ns:tada:other:subchild]]\n" +
+				"[[ns:tada:Other:subchild]]\n" +
 				"[[ns:tada:other:sub:subsubchild]]\n");
 		String spacekey = "otherspace";
 		page.setSpacekey(spacekey);//default spacekey is 'food'
@@ -146,6 +147,7 @@
 				"[lala:Tada]\n" +
 				"[lala:Subchild]\n" +
 				"[foo:Subchild]\n" +
+				"[foo:Subchild]\n" +
 				"[foo:Subsubchild]\n"; //this one uses the mapping (drink points to food)
 		assertNotNull(actual);
 		assertEquals(expected, actual);
diff --git a/src/com/atlassian/uwc/converters/dokuwiki/SpaceConverter.java b/src/com/atlassian/uwc/converters/dokuwiki/SpaceConverter.java
index 1d22fed..f3b306d 100644
--- a/src/com/atlassian/uwc/converters/dokuwiki/SpaceConverter.java
+++ b/src/com/atlassian/uwc/converters/dokuwiki/SpaceConverter.java
@@ -43,7 +43,7 @@
 			//remove deepest portion of the path
 			tmppath = removeDeepest(tmppath);
 		}
-		
+		log.debug("spacekey set to: " + page.getSpacekey());
 	}
 	
 	static Pattern filetype = Pattern.compile("[.]\\w+$");
diff --git a/src/com/atlassian/uwc/hierarchies/ContentHierarchyTest.java b/src/com/atlassian/uwc/hierarchies/ContentHierarchyTest.java
index 71564f6..9095c8f 100644
--- a/src/com/atlassian/uwc/hierarchies/ContentHierarchyTest.java
+++ b/src/com/atlassian/uwc/hierarchies/ContentHierarchyTest.java
@@ -4,9 +4,8 @@
 import java.io.File;
 import java.io.FileReader;
 import java.io.IOException;
-import java.io.UnsupportedEncodingException;
+import java.util.Collection;
 import java.util.Properties;
-import java.util.Set;
 import java.util.Vector;
 
 import junit.framework.TestCase;
@@ -49,13 +48,13 @@
 		assertNull(actual.getParent());
 		assertNotNull(actual.getChildren());
 
-		Set<HierarchyNode> children1 = actual.getChildren();
+		Collection<HierarchyNode> children1 = actual.getChildren();
 		assertEquals(1, children1.size());
 		Vector<HierarchyNode> nodes1 = new Vector<HierarchyNode>();
 		nodes1.addAll(children1);
 		assertTrue((nodes1.get(0)).getName().equals("Plants"));
 
-		Set<HierarchyNode> children2 = (nodes1.get(0)).getChildren();
+		Collection<HierarchyNode> children2 = (nodes1.get(0)).getChildren();
 		assertEquals(2, children2.size());
 		Vector<HierarchyNode> nodes2 = new Vector<HierarchyNode>();
 		nodes2.addAll(children2);
@@ -74,7 +73,7 @@
 			treenode = nodes2.get(1);
 		}
 		
-		Set<HierarchyNode> treechildren = treenode.getChildren();
+		Collection<HierarchyNode> treechildren = treenode.getChildren();
 		assertEquals(2, treechildren.size());
 		Vector<HierarchyNode> trees = new Vector<HierarchyNode>();
 		trees.addAll(treechildren);
@@ -83,7 +82,7 @@
 		assertTrue((trees.get(1)).getName().equals("Chestnut") ||
 				(trees.get(1)).getName().equals("Pine"));
 		
-		Set<HierarchyNode> flowerchildren = flowernode.getChildren();
+		Collection<HierarchyNode> flowerchildren = flowernode.getChildren();
 		assertEquals(3, flowerchildren.size());
 		Vector<HierarchyNode> flowers = new Vector<HierarchyNode>();
 		flowers.addAll(flowerchildren);
@@ -128,19 +127,19 @@
 		assertNull(actual.getParent());
 		assertNotNull(actual.getChildren());
 
-		Set<HierarchyNode> home = actual.getChildren();
+		Collection<HierarchyNode> home = actual.getChildren();
 		assertEquals(1, home.size());
 		Vector<HierarchyNode> nodes0 = new Vector<HierarchyNode>();
 		nodes0.addAll(home);
 		assertTrue((nodes0.get(0)).getName().equals("Home"));
 		
-		Set<HierarchyNode> children1 = nodes0.get(0).getChildren();
+		Collection<HierarchyNode> children1 = nodes0.get(0).getChildren();
 		assertEquals(1, children1.size());
 		Vector<HierarchyNode> nodes1 = new Vector<HierarchyNode>();
 		nodes1.addAll(children1);
 		assertTrue((nodes1.get(0)).getName().equals("Plants"));
 
-		Set<HierarchyNode> children2 = (nodes1.get(0)).getChildren();
+		Collection<HierarchyNode> children2 = (nodes1.get(0)).getChildren();
 		assertEquals(2, children2.size());
 		Vector<HierarchyNode> nodes2 = new Vector<HierarchyNode>();
 		nodes2.addAll(children2);
@@ -159,7 +158,7 @@
 			treenode = nodes2.get(1);
 		}
 		
-		Set<HierarchyNode> treechildren = treenode.getChildren();
+		Collection<HierarchyNode> treechildren = treenode.getChildren();
 		assertEquals(2, treechildren.size());
 		Vector<HierarchyNode> trees = new Vector<HierarchyNode>();
 		trees.addAll(treechildren);
@@ -168,7 +167,7 @@
 		assertTrue((trees.get(1)).getName().equals("Chestnut") ||
 				(trees.get(1)).getName().equals("Pine"));
 		
-		Set<HierarchyNode> flowerchildren = flowernode.getChildren();
+		Collection<HierarchyNode> flowerchildren = flowernode.getChildren();
 		assertEquals(3, flowerchildren.size());
 		Vector<HierarchyNode> flowers = new Vector<HierarchyNode>();
 		flowers.addAll(flowerchildren);
@@ -208,13 +207,13 @@
 		assertNull(actual.getParent());
 		assertNotNull(actual.getChildren());
 
-		Set<HierarchyNode> children1 = actual.getChildren();
+		Collection<HierarchyNode> children1 = actual.getChildren();
 		assertEquals(1, children1.size());
 		Vector<HierarchyNode> nodes1 = new Vector<HierarchyNode>();
 		nodes1.addAll(children1);
 		assertTrue((nodes1.get(0)).getName().equals("Plants"));
 
-		Set<HierarchyNode> children2 = (nodes1.get(0)).getChildren();
+		Collection<HierarchyNode> children2 = (nodes1.get(0)).getChildren();
 		assertEquals(3, children2.size());
 		Vector<HierarchyNode> nodes2 = new Vector<HierarchyNode>();
 		nodes2.addAll(children2);
@@ -232,7 +231,7 @@
 			if (node.getName().equals("Plants_Nuts")) nutnode = node;
 		}
 		
-		Set<HierarchyNode> treechildren = treenode.getChildren();
+		Collection<HierarchyNode> treechildren = treenode.getChildren();
 		assertEquals(2, treechildren.size());
 		Vector<HierarchyNode> trees = new Vector<HierarchyNode>();
 		trees.addAll(treechildren);
@@ -241,7 +240,7 @@
 		assertTrue((trees.get(1)).getName().equals("Plants_Trees_Chestnut") ||
 				(trees.get(1)).getName().equals("Plants_Trees_Pine"));
 		
-		Set<HierarchyNode> flowerchildren = flowernode.getChildren();
+		Collection<HierarchyNode> flowerchildren = flowernode.getChildren();
 		assertEquals(3, flowerchildren.size());
 		Vector<HierarchyNode> flowers = new Vector<HierarchyNode>();
 		flowers.addAll(flowerchildren);
@@ -255,7 +254,7 @@
 				(flowers.get(2)).getName().equals("Plants_Flowers_Daisy") ||
 				(flowers.get(2)).getName().equals("Plants_Flowers_Orchid"));
 		
-		Set<HierarchyNode> nutchildren = nutnode.getChildren();
+		Collection<HierarchyNode> nutchildren = nutnode.getChildren();
 		assertEquals(2, nutchildren.size());
 		Vector<HierarchyNode> nuts = new Vector<HierarchyNode>();
 		nuts.addAll(nutchildren);
@@ -296,13 +295,13 @@
 		assertNull(actual.getParent());
 		assertNotNull(actual.getChildren());
 
-		Set<HierarchyNode> children1 = actual.getChildren();
+		Collection<HierarchyNode> children1 = actual.getChildren();
 		assertEquals(1, children1.size());
 		Vector<HierarchyNode> nodes1 = new Vector<HierarchyNode>();
 		nodes1.addAll(children1);
 		assertTrue((nodes1.get(0)).getName().equals("Plants"));
 
-		Set<HierarchyNode> children2 = (nodes1.get(0)).getChildren();
+		Collection<HierarchyNode> children2 = (nodes1.get(0)).getChildren();
 		assertEquals(3, children2.size());
 		Vector<HierarchyNode> nodes2 = new Vector<HierarchyNode>();
 		nodes2.addAll(children2);
@@ -320,7 +319,7 @@
 			if (node.getName().equals("Nuts")) nutnode = node;
 		}
 		
-		Set<HierarchyNode> treechildren = treenode.getChildren();
+		Collection<HierarchyNode> treechildren = treenode.getChildren();
 		assertEquals(2, treechildren.size());
 		Vector<HierarchyNode> trees = new Vector<HierarchyNode>();
 		trees.addAll(treechildren);
@@ -329,7 +328,7 @@
 		assertTrue((trees.get(1)).getName().equals("Chestnut") ||
 				(trees.get(1)).getName().equals("Pine"));
 		
-		Set<HierarchyNode> flowerchildren = flowernode.getChildren();
+		Collection<HierarchyNode> flowerchildren = flowernode.getChildren();
 		assertEquals(3, flowerchildren.size());
 		Vector<HierarchyNode> flowers = new Vector<HierarchyNode>();
 		flowers.addAll(flowerchildren);
@@ -343,7 +342,7 @@
 				(flowers.get(2)).getName().equals("Daisy") ||
 				(flowers.get(2)).getName().equals("Orchid"));
 		
-		Set<HierarchyNode> nutchildren = nutnode.getChildren();
+		Collection<HierarchyNode> nutchildren = nutnode.getChildren();
 		assertEquals(2, nutchildren.size());
 		Vector<HierarchyNode> nuts = new Vector<HierarchyNode>();
 		nuts.addAll(nutchildren);
@@ -376,13 +375,13 @@
 		assertNull(actual.getParent());
 		assertNotNull(actual.getChildren());
 
-		Set<HierarchyNode> children1 = actual.getChildren();
+		Collection<HierarchyNode> children1 = actual.getChildren();
 		assertEquals(1, children1.size());
 		Vector<HierarchyNode> nodes1 = new Vector<HierarchyNode>();
 		nodes1.addAll(children1);
 		assertTrue((nodes1.get(0)).getName().equals("Plants"));
 
-		Set<HierarchyNode> children2 = (nodes1.get(0)).getChildren();
+		Collection<HierarchyNode> children2 = (nodes1.get(0)).getChildren();
 		assertEquals(2, children2.size());
 		Vector<HierarchyNode> nodes2 = new Vector<HierarchyNode>();
 		nodes2.addAll(children2);
@@ -397,7 +396,7 @@
 			if (node.getName().equals("Plants Nuts")) nutnode = node;
 		}
 		
-		Set<HierarchyNode> flowerchildren = flowernode.getChildren();
+		Collection<HierarchyNode> flowerchildren = flowernode.getChildren();
 		assertEquals(2, flowerchildren.size());
 		Vector<HierarchyNode> flowers = new Vector<HierarchyNode>();
 		flowers.addAll(flowerchildren);
@@ -406,7 +405,7 @@
 		assertTrue((flowers.get(1)).getName().equals("Plants Flowers Rose") ||
 				(flowers.get(1)).getName().equals("Plants Flowers Orchid"));
 		
-		Set<HierarchyNode> nutchildren = nutnode.getChildren();
+		Collection<HierarchyNode> nutchildren = nutnode.getChildren();
 		assertEquals(1, nutchildren.size());
 		Vector<HierarchyNode> nuts = new Vector<HierarchyNode>();
 		nuts.addAll(nutchildren);
@@ -447,13 +446,13 @@
 		assertNull(actual.getParent());
 		assertNotNull(actual.getChildren());
 
-		Set<HierarchyNode> children1 = actual.getChildren();
+		Collection<HierarchyNode> children1 = actual.getChildren();
 		assertEquals(1, children1.size());
 		Vector<HierarchyNode> nodes1 = new Vector<HierarchyNode>();
 		nodes1.addAll(children1);
 		assertTrue((nodes1.get(0)).getName().equals("Plants"));
 
-		Set<HierarchyNode> children2 = (nodes1.get(0)).getChildren();
+		Collection<HierarchyNode> children2 = (nodes1.get(0)).getChildren();
 		assertEquals(1, children2.size());
 		Vector<HierarchyNode> nodes2 = new Vector<HierarchyNode>();
 		nodes2.addAll(children2);
@@ -461,7 +460,7 @@
 
 		HierarchyNode treenode = nodes2.get(0); 
 		
-		Set<HierarchyNode> treechildren = treenode.getChildren();
+		Collection<HierarchyNode> treechildren = treenode.getChildren();
 		assertEquals(5, treechildren.size());
 		Vector<HierarchyNode> trees = new Vector<HierarchyNode>();
 		trees.addAll(treechildren);
@@ -518,19 +517,19 @@
 		assertNull(actual.getParent());
 		assertNotNull(actual.getChildren());
 
-		Set<HierarchyNode> home = actual.getChildren();
+		Collection<HierarchyNode> home = actual.getChildren();
 		assertEquals(1, home.size());
 		Vector<HierarchyNode> nodes0 = new Vector<HierarchyNode>();
 		nodes0.addAll(home);
 		assertTrue((nodes0.get(0)).getName().equals("Home"));
 		
-		Set<HierarchyNode> children1 = nodes0.get(0).getChildren();
+		Collection<HierarchyNode> children1 = nodes0.get(0).getChildren();
 		assertEquals(1, children1.size());
 		Vector<HierarchyNode> nodes1 = new Vector<HierarchyNode>();
 		nodes1.addAll(children1);
 		assertTrue((nodes1.get(0)).getName().equals("Plants"));
 
-		Set<HierarchyNode> children2 = (nodes1.get(0)).getChildren();
+		Collection<HierarchyNode> children2 = (nodes1.get(0)).getChildren();
 		assertEquals(1, children2.size());
 		Vector<HierarchyNode> nodes2 = new Vector<HierarchyNode>();
 		nodes2.addAll(children2);
@@ -538,7 +537,7 @@
 
 		HierarchyNode treenode = nodes2.get(0); 
 		
-		Set<HierarchyNode> treechildren = treenode.getChildren();
+		Collection<HierarchyNode> treechildren = treenode.getChildren();
 		assertEquals(5, treechildren.size());
 		Vector<HierarchyNode> trees = new Vector<HierarchyNode>();
 		trees.addAll(treechildren);
@@ -593,7 +592,7 @@
 		assertNull(actual.getParent());
 		assertNotNull(actual.getChildren());
 
-		Set<HierarchyNode> children1 = actual.getChildren();
+		Collection<HierarchyNode> children1 = actual.getChildren();
 		assertEquals(1, children1.size());
 		Vector<HierarchyNode> nodes1 = new Vector<HierarchyNode>();
 		nodes1.addAll(children1);
@@ -631,13 +630,13 @@
 		assertNull(actual.getParent());
 		assertNotNull(actual.getChildren());
 
-		Set<HierarchyNode> children1 = actual.getChildren();
+		Collection<HierarchyNode> children1 = actual.getChildren();
 		assertEquals(1, children1.size());
 		Vector<HierarchyNode> nodes1 = new Vector<HierarchyNode>();
 		nodes1.addAll(children1);
 		assertTrue((nodes1.get(0)).getName().equals("Plants"));
 
-		Set<HierarchyNode> children2 = (nodes1.get(0)).getChildren();
+		Collection<HierarchyNode> children2 = (nodes1.get(0)).getChildren();
 		assertEquals(1, children2.size());
 		Vector<HierarchyNode> nodes2 = new Vector<HierarchyNode>();
 		nodes2.addAll(children2);
@@ -645,7 +644,7 @@
 
 		HierarchyNode treenode = nodes2.get(0); 
 		
-		Set<HierarchyNode> treechildren = treenode.getChildren();
+		Collection<HierarchyNode> treechildren = treenode.getChildren();
 		assertEquals(5, treechildren.size());
 		Vector<HierarchyNode> trees = new Vector<HierarchyNode>();
 		trees.addAll(treechildren);
@@ -808,13 +807,13 @@
 		assertNull(actual.getParent());
 		assertNotNull(actual.getChildren());
 
-		Set<HierarchyNode> children1 = actual.getChildren();
+		Collection<HierarchyNode> children1 = actual.getChildren();
 		assertEquals(1, children1.size());
 		Vector<HierarchyNode> nodes1 = new Vector<HierarchyNode>();
 		nodes1.addAll(children1);
 		assertTrue((nodes1.get(0)).getName().equals("TestPage"));
 
-		Set<HierarchyNode> children2 = (nodes1.get(0)).getChildren();
+		Collection<HierarchyNode> children2 = (nodes1.get(0)).getChildren();
 		assertEquals(3, children2.size());
 		Vector<HierarchyNode> nodes2 = new Vector<HierarchyNode>();
 		nodes2.addAll(children2);
@@ -824,7 +823,7 @@
 
 		HierarchyNode parent0node = nodes2.get(2); 
 		
-		Set<HierarchyNode> p0children = parent0node.getChildren();
+		Collection<HierarchyNode> p0children = parent0node.getChildren();
 		assertEquals(2, p0children.size());
 		Vector<HierarchyNode> p0 = new Vector<HierarchyNode>();
 		p0.addAll(p0children);
diff --git a/src/com/atlassian/uwc/hierarchies/DocDirectoryHierarchyTest.java b/src/com/atlassian/uwc/hierarchies/DocDirectoryHierarchyTest.java
index adb7d14..bb09e8d 100644
--- a/src/com/atlassian/uwc/hierarchies/DocDirectoryHierarchyTest.java
+++ b/src/com/atlassian/uwc/hierarchies/DocDirectoryHierarchyTest.java
@@ -1,8 +1,8 @@
 package com.atlassian.uwc.hierarchies;
 
 import java.io.File;
+import java.util.Collection;
 import java.util.Properties;
-import java.util.Set;
 import java.util.Vector;
 
 import junit.framework.TestCase;
@@ -10,7 +10,6 @@
 import org.apache.log4j.Logger;
 import org.apache.log4j.PropertyConfigurator;
 
-import com.atlassian.uwc.filters.NoSvnFilter;
 import com.atlassian.uwc.ui.Page;
 
 public class DocDirectoryHierarchyTest extends TestCase {
@@ -49,7 +48,7 @@
 		assertNull(actual.getParent());
 		assertNotNull(actual.getChildren());
 		
-		Set<HierarchyNode> children1 = actual.getChildren();
+		Collection<HierarchyNode> children1 = actual.getChildren();
 		assertEquals(1, children1.size());
 		Vector<HierarchyNode> nodes1 = new Vector<HierarchyNode>();
 		nodes1.addAll(children1);
@@ -60,7 +59,7 @@
 		File file = (File) object;
 		assertTrue("test.txt".equals(file.getName()));
 		
-		Set<HierarchyNode> children2 = nodes1.get(0).getChildren();
+		Collection<HierarchyNode> children2 = nodes1.get(0).getChildren();
 		assertEquals(3, children2.size());
 		Vector<HierarchyNode> nodes2 = new Vector<HierarchyNode>();
 		nodes2.addAll(children2);
@@ -76,7 +75,7 @@
 				assertTrue("test1.txt".equals(filea.getName())||
 						"test2.txt".equals(filea.getName())
 						);
-				Set<HierarchyNode> children3 = node.getChildren();
+				Collection<HierarchyNode> children3 = node.getChildren();
 				assertEquals(1, children3.size());
 				Vector<HierarchyNode> nodes3 = new Vector<HierarchyNode>();
 				nodes3.addAll(children3);
@@ -123,7 +122,7 @@
 		assertNull(actual.getParent());
 		assertNotNull(actual.getChildren());
 		
-		Set<HierarchyNode> children1 = actual.getChildren();
+		Collection<HierarchyNode> children1 = actual.getChildren();
 		assertEquals(1, children1.size());
 		Vector<HierarchyNode> nodes1 = new Vector<HierarchyNode>();
 		nodes1.addAll(children1);
@@ -152,7 +151,7 @@
 		assertNull(actual.getParent());
 		assertNotNull(actual.getChildren());
 		
-		Set<HierarchyNode> children1 = actual.getChildren();
+		Collection<HierarchyNode> children1 = actual.getChildren();
 		assertEquals(1, children1.size());
 		Vector<HierarchyNode> nodes1 = new Vector<HierarchyNode>();
 		nodes1.addAll(children1);
@@ -183,7 +182,7 @@
 		assertNull(actual.getParent());
 		assertNotNull(actual.getChildren());
 		
-		Set<HierarchyNode> children1 = actual.getChildren();
+		Collection<HierarchyNode> children1 = actual.getChildren();
 		assertEquals(1, children1.size());
 		Vector<HierarchyNode> nodes1 = new Vector<HierarchyNode>();
 		nodes1.addAll(children1);
@@ -194,7 +193,7 @@
 		File file = (File) object;
 		assertTrue("test.txt".equals(file.getName()));
 		
-		Set<HierarchyNode> children2 = nodes1.get(0).getChildren();
+		Collection<HierarchyNode> children2 = nodes1.get(0).getChildren();
 		assertEquals(2, children2.size());
 		Vector<HierarchyNode> nodes2 = new Vector<HierarchyNode>();
 		nodes2.addAll(children2);
diff --git a/src/com/atlassian/uwc/hierarchies/DokuwikiHierarchy.java b/src/com/atlassian/uwc/hierarchies/DokuwikiHierarchy.java
index be3f380..7479af6 100644
--- a/src/com/atlassian/uwc/hierarchies/DokuwikiHierarchy.java
+++ b/src/com/atlassian/uwc/hierarchies/DokuwikiHierarchy.java
@@ -19,7 +19,8 @@
 	int newpagescount = 0;
 	
 	public HierarchyNode buildHierarchy(Collection<Page> pages) {
-		getRootNode().setChildrenComparator(dokuComparator());
+//		getRootNode().setChildrenComparator(dokuComparator());
+		getRootNode().childrenAsList(true);
 		log.debug("Number of hierarchy pages: " + pages.size());
 		//run the filepath hierarchy first -
 		HierarchyNode node = super.buildHierarchy(pages);
@@ -65,78 +66,12 @@
 	}
 
 
-	protected Comparator<HierarchyNode> dokuComparator() {
-		return new Comparator<HierarchyNode>() {
-			@Override
-			public int compare(HierarchyNode o1, HierarchyNode o2) {
-				//Step 1: IF OBJ ARE SAME RETURN 0
-				if (o1.equals(o2)) {
-					log.debug("COMPARATOR: (1 - same object) equivalent obj: " + o1.getName() + " and " + o2.getName());
-					return 0;
-				}
-				//Step 2: HANDLE NULL NAMES
-				String name1 = o1.getName();
-				String name2 = o2.getName();
-				if (name1 == null && name2 == null) return 0;
-				if (name1 == null) return -1;
-				if (name2 == null) return 1;
-				//Step 3: EQUALIVALENT NAMES, check path and spacekey
-				if (equalize(name1).equals(equalize(name2))) { 
-					//check child nodes (null pages might still have children)
-					String tree1 = o1.toString();
-					String tree2 = o2.toString();
-					if (!tree1.equalsIgnoreCase(tree2)) return tree1.compareTo(tree2);
-					//check page data: spacekey and path
-					if (o1.getPage() != null) {
-						//check spacekeys
-						String key1 = o1.getPage().getSpacekey();
-						String key2 = (o2.getPage() != null)?o2.getPage().getSpacekey():null;
-						int compareToKey;
-						if (key1 == null && key2 == null) compareToKey = 0;
-						else if (key1 == null) return -1;
-						else if (key2 == null) return 1;
-						else compareToKey = key1.compareTo(key2);
-						if (compareToKey == 0) {
-							//check pagepath
-							String pagepath1 = o1.getPage().getPath();
-							String pagepath2 = (o2.getPage() != null)?o2.getPage().getPath():null;
-							if (pagepath1 == null && pagepath2 == null) {
-								log.debug("COMPARATOR: (2 - no paths) equivalent obj: " + o1.getName() + " and " + o2.getName());
-								return 0;
-							}
-							if (pagepath1 == null) return -1;
-							if (pagepath2 == null) return 1;
-							if (pagepath1.compareTo(pagepath2) != 0) return pagepath1.compareTo(pagepath2);
-							//check page content
-							String orig1 = o1.getPage().getOriginalText();
-							String orig2 = (o2.getPage() != null)?o2.getPage().getOriginalText():null;
-							if (orig1.compareTo(orig2) != 0) {
-								String newname = name2+" B";
-								o2.setName(newname); //XXX This isn't perfect. Just intended to add some level uniqueness, and hopefully not a lot of these will occur
-								o2.getPage().setName(newname);
-								log.debug("Found conflicting nodes with different content. Renaming one of them to: " + newname);
-								return orig1.compareTo(orig2);
-							}
-						}
-						if (compareToKey == 0) 
-							log.debug("COMPARATOR: (3 - same key, children, path, content) equivalent obj: " + o1.getName() + " and " + o2.getName());
-						return compareToKey;
-					}
-					else if (o2.getPage() != null) return 1;
-					log.debug("COMPARATOR: (4 - no page data) equivalent obj: " + o1.getName() + " and " + o2.getName());
-					return 0; 
-				}
-				//Step 4: NOT EQUIVALENT NAME -- FIXME not working for 'Agile Principles, Patterns And Practices In C#'
-				return equalize(name1).compareTo(equalize(name2)); //names aren't equal
-			}
-		};
-	}
 
 
 	private HierarchyNode handleSpacekeyBranchWithProp(HierarchyNode node) {
 		String spacekey = getProperties().getProperty("spacekey");
 		if (spacekey != null && !"".equals(spacekey)) { 
-			Set<HierarchyNode> top = node.getChildren();
+			Collection<HierarchyNode> top = node.getChildren();
 			for (Iterator iter = top.iterator(); iter.hasNext();) {
 				HierarchyNode topnode = (HierarchyNode) iter.next();
 				if (topnode.getName().toLowerCase().equals(spacekey.toLowerCase())) {
@@ -150,7 +85,7 @@
 	}
 
 	private HierarchyNode handleSpacekeyBranchWithPage(HierarchyNode root) {
-		Set<HierarchyNode> top = root.getChildren();
+		Collection<HierarchyNode> top = root.getChildren();
 		Vector<HierarchyNode> ordered = new Vector<HierarchyNode>(top);
 		for (HierarchyNode topnode : ordered) {
 			root = handleSpacekeyBranchTop(root, topnode);
@@ -165,27 +100,8 @@
 		else if (node.getPage().getSpacekey() != null) {
 			String spacekey = node.getPage().getSpacekey();
 			node = setAncestorsBySpacekey(root, node, spacekey);
-//			if (node.getParent() == null) {
-//				Set<HierarchyNode> top = root.getChildren();
-//				Vector<HierarchyNode> ordered = new Vector<HierarchyNode>(top);
-//				for (HierarchyNode topnode : ordered) {
-//					if (topnode.getPage() == null) {
-//						log.debug("NULL! (Skipping) topnode.getName() = " + topnode.getName());
-//						continue;
-//					}
-//					if (spacekey.equals(topnode.getPage().getSpacekey())) {
-//						Set<HierarchyNode> children = topnode.getChildren();
-//						log.debug("Moving topnode: " + topnode.getPage().getName());
-//						topnode.setParent(null); //since we have to use iter.remove instead of node.removeChild(topnode)
-//						for (HierarchyNode child : children) {
-//							root.addChild(child);
-//						}
-//						break;
-//					}
-//				}
-//			}
 		}
-		Set<HierarchyNode> nextSet = node.getChildren();
+		Collection<HierarchyNode> nextSet = node.getChildren();
 		Vector<HierarchyNode> ordered = new Vector<HierarchyNode>(nextSet);
 		for (HierarchyNode next : ordered) {
 			root = handleSpacekeyBranchTop(root, next);
@@ -278,7 +194,10 @@
 			newparentpage.setConvertedText(parent.getPage().getConvertedText());
 		newparent.setPage(newparentpage);
 		HierarchyNode gparent = parent.getParent();
-		parent.removeChild(node);
+		if (!parent.removeChild(node)) {
+//			log.debug("tree for parent: " + parent.getName());
+//			printTree(parent);
+		}
 		newparent.addChild(node);
 		gparent.addChild(newparent);
 		if (gparent.getName() == null) return;
@@ -286,7 +205,7 @@
 	}
 
 	private void setTopNodeBranch(HierarchyNode root, Iterator topiter, HierarchyNode nexttopnode) {
-		Set<HierarchyNode> children = nexttopnode.getChildren();
+		Collection<HierarchyNode> children = nexttopnode.getChildren();
 		topiter.remove(); //Only allowed way to remove from an iterator. 
 		nexttopnode.setParent(null); //since we have to use iter.remove instead of node.removeChild(topnode)
 		for (HierarchyNode child : children) {
@@ -295,7 +214,7 @@
 	}
 
 	private HierarchyNode handleHomePages(HierarchyNode node, boolean top) {
-		Set<HierarchyNode> children = node.getChildren();
+		Collection<HierarchyNode> children = node.getChildren();
 		for (Iterator iter = children.iterator(); iter.hasNext();) { 
 			HierarchyNode child = (HierarchyNode) iter.next();
 			String name = child.getName();
@@ -321,7 +240,7 @@
 
 	private HierarchyNode fixCollisions(HierarchyNode node) {
 		
-		Set<HierarchyNode> children = node.getChildren();
+		Collection<HierarchyNode> children = node.getChildren();
 		Vector<HierarchyNode> childrenV = new Vector<HierarchyNode>(children);
 		for (int i = 0; i < childrenV.size(); i++) {
 			HierarchyNode child = (HierarchyNode) childrenV.get(i);
@@ -347,16 +266,17 @@
 		return node;
 	}
 	
+	private static int numericCollisionCounter = 2;
 	private HierarchyNode mergeBrokenNodes(HierarchyNode node) {
 		
-		Set<HierarchyNode> children = node.getChildren();
+		Collection<HierarchyNode> children = node.getChildren();
 		Vector<HierarchyNode> childrenV = new Vector<HierarchyNode>(children);
 		for (int i = 0; i < childrenV.size(); i++) {
 			HierarchyNode child = (HierarchyNode) childrenV.get(i);
 			log.debug("Merging child: '"  + child.getName()+"'");
 			HierarchyNode parent = child.getParent();
 			if (child.getPage() != null && child.getPage().getFile() != null) { 
-				Set<HierarchyNode> siblingsSet = parent.getChildren();
+				Collection<HierarchyNode> siblingsSet = parent.getChildren();
 				Vector<HierarchyNode> siblings = new Vector<HierarchyNode>();
 				for (HierarchyNode s : siblingsSet) {
 					if (!s.equals(child)) {
@@ -372,6 +292,12 @@
 							mergeTwoNodes(child, sibling, parent);
 						}
 					}
+					else if (child.getName().equalsIgnoreCase(sibling.getName())) {
+						String newname = sibling.getName() + " " + numericCollisionCounter++;
+						log.debug("Found conflicting node. Changing name to: '"+ newname + "'");
+						sibling.setName(newname);
+						sibling.getPage().setName(newname);
+					}
 				}
 			}
 //			log.debug("***v");
@@ -389,9 +315,12 @@
 //			log.debug("adding child: " + gchild.getName());
 			first.addChild(gchild);
 		}
-		if (parent != null) parent.removeChild(second);
-//		log.debug("parent tree -  1 depth");
-//		printTreeOneLevel(parent);
+		if (parent != null) {
+			if (!parent.removeChild(second)) {
+//				log.debug("parent tree");
+//				printTree(parent);
+			}
+		}
 //		log.debug("child tree");
 //		printTreeOneLevel(first);
 	}
@@ -413,6 +342,7 @@
 			log.debug("first node name: " + first.getName() + " and full file path: " + first.getPage().getFile().getAbsolutePath());
 			log.debug("filename of first node: " + filename + " and equalized: " + equalize(filename));
 			log.debug("second node name: " + second.getName() + " and equalized: " + equalize(second.getName()));
+			log.debug("first spacekey " + first.getPage().getSpacekey() + " ... second spacekey " + ((second.getPage()!=null)?second.getPage().getSpacekey():"null"));
 		}
 		return samenode;
 	}
@@ -426,7 +356,7 @@
 		log.debug("Attempting to identify meta name for parent title.");
 		HierarchyNode gparent = child.getParent().getParent();
 		if (gparent == null) return basename;
-		Set<HierarchyNode> siblingsSet = gparent.getChildren();
+		Collection<HierarchyNode> siblingsSet = gparent.getChildren();
 		Vector<HierarchyNode> siblings = new Vector<HierarchyNode>(siblingsSet);
 		for (int i = 0; i < siblings.size(); i++) {
 			HierarchyNode sibling = (HierarchyNode) siblings.get(i);
@@ -472,7 +402,7 @@
 	}
 
 	private HierarchyNode attachAllImages(HierarchyNode node, Vector<File> attdirs, boolean top) {
-		Set<HierarchyNode> children = node.getChildren();
+		Collection<HierarchyNode> children = node.getChildren();
 		for (Iterator iter = children.iterator(); iter.hasNext();) { 
 			HierarchyNode child = (HierarchyNode) iter.next();
 			String name = getOrigChildName(child);
@@ -575,7 +505,7 @@
 	HierarchyTitleConverter titleConverter = new HierarchyTitleConverter();
 	//nodes without pages probably will need this
 	private HierarchyNode fixTitles(HierarchyNode node) { 
-		Set<HierarchyNode> children = node.getChildren();
+		Collection<HierarchyNode> children = node.getChildren();
 		for (Iterator iter = children.iterator(); iter.hasNext();) { 
 			HierarchyNode child = (HierarchyNode) iter.next();
 			if (child.getPage() == null)
@@ -610,7 +540,7 @@
 	}
 
 	public void combineHomepages() {
-		Set<HierarchyNode> children = currentParent.getChildren();
+		Collection<HierarchyNode> children = currentParent.getChildren();
 		Vector<HierarchyNode> all = new Vector<HierarchyNode>(children);
 		HierarchyNode first = null, second = null;
 		for (int i = 0; i < all.size()-1 && all.size() > 1; i++) {
@@ -675,7 +605,7 @@
 		printTree(node.getChildren(), "");
 	}
 
-	private void printTree(Set<HierarchyNode> children, String delim) {
+	private void printTree(Collection<HierarchyNode> children, String delim) {
 		for (HierarchyNode child : children) {
 			String newdelim = delim + " .";
 			String childdata = child.getName();
@@ -687,7 +617,7 @@
 	}
 	
 	private void printTreeOneLevel(HierarchyNode node) {
-		Set<HierarchyNode> children = node.getChildren();
+		Collection<HierarchyNode> children = node.getChildren();
 		for (HierarchyNode child : children) {
 			log.debug("PRINTTREE: " + child.getName());
 		}
diff --git a/src/com/atlassian/uwc/hierarchies/DokuwikiHierarchyTest.java b/src/com/atlassian/uwc/hierarchies/DokuwikiHierarchyTest.java
index d53f184..e46f49c 100644
--- a/src/com/atlassian/uwc/hierarchies/DokuwikiHierarchyTest.java
+++ b/src/com/atlassian/uwc/hierarchies/DokuwikiHierarchyTest.java
@@ -56,7 +56,7 @@
 		assertNull(root.getParent());
 		assertNotNull(root.getChildren());
 		
-		Set<HierarchyNode> top = root.getChildren();
+		Collection<HierarchyNode> top = root.getChildren();
 		assertEquals(5, top.size());
 		Vector<HierarchyNode> nodes0 = new Vector<HierarchyNode>();
 		nodes0.addAll(top);
@@ -142,7 +142,7 @@
 		assertNull(root.getParent());
 		assertNotNull(root.getChildren());
 		
-		Set<HierarchyNode> top = root.getChildren();
+		Collection<HierarchyNode> top = root.getChildren();
 		assertEquals(5, top.size());
 		Vector<HierarchyNode> nodes0 = new Vector<HierarchyNode>();
 		nodes0.addAll(top);
@@ -188,7 +188,7 @@
 		assertNull(root.getParent());
 		assertNotNull(root.getChildren());
 		
-		Set<HierarchyNode> top = root.getChildren();
+		Collection<HierarchyNode> top = root.getChildren();
 		assertEquals(5, top.size());
 		Vector<HierarchyNode> nodes0 = new Vector<HierarchyNode>();
 		nodes0.addAll(top);
@@ -257,7 +257,7 @@
 		assertNull(root.getParent());
 		assertNotNull(root.getChildren());
 		
-		Set<HierarchyNode> top = root.getChildren();
+		Collection<HierarchyNode> top = root.getChildren();
 		assertEquals(3, top.size());
 		Vector<HierarchyNode> nodes0 = new Vector<HierarchyNode>();
 		nodes0.addAll(top);
@@ -336,7 +336,7 @@
 //		assertNull(root.getParent());
 //		assertNotNull(root.getChildren());
 //		
-//		Set<HierarchyNode> top = root.getChildren();
+//		Collection<HierarchyNode> top = root.getChildren();
 //		assertEquals(6, top.size());
 //		Vector<HierarchyNode> nodes0 = new Vector<HierarchyNode>();
 //		nodes0.addAll(top);
@@ -426,7 +426,7 @@
 		assertNull(root.getParent());
 		assertNotNull(root.getChildren());
 		
-		Set<HierarchyNode> top = root.getChildren();
+		Collection<HierarchyNode> top = root.getChildren();
 		assertEquals(5, top.size());
 		Vector<HierarchyNode> nodes0 = new Vector<HierarchyNode>();
 		nodes0.addAll(top);
@@ -479,7 +479,7 @@
 		assertNull(root.getParent());
 		assertNotNull(root.getChildren());
 		
-		Set<HierarchyNode> top = root.getChildren();
+		Collection<HierarchyNode> top = root.getChildren();
 		assertEquals(2, top.size());
 		Vector<HierarchyNode> nodes0 = new Vector<HierarchyNode>();
 		nodes0.addAll(top);
@@ -558,7 +558,7 @@
 		assertNull(root.getParent());
 		assertNotNull(root.getChildren());
 		
-		Set<HierarchyNode> top = root.getChildren();
+		Collection<HierarchyNode> top = root.getChildren();
 		assertEquals(2, top.size());
 		Vector<HierarchyNode> nodes0 = new Vector<HierarchyNode>();
 		nodes0.addAll(top);
diff --git a/src/com/atlassian/uwc/hierarchies/FilenameHierarchyTest.java b/src/com/atlassian/uwc/hierarchies/FilenameHierarchyTest.java
index 859b438..86cc4e8 100644
--- a/src/com/atlassian/uwc/hierarchies/FilenameHierarchyTest.java
+++ b/src/com/atlassian/uwc/hierarchies/FilenameHierarchyTest.java
@@ -1,9 +1,8 @@
 package com.atlassian.uwc.hierarchies;
 
 import java.io.File;
-import java.util.Comparator;
+import java.util.Collection;
 import java.util.Properties;
-import java.util.Set;
 import java.util.Vector;
 
 import junit.framework.TestCase;
@@ -39,7 +38,7 @@
 		HierarchyNode actual = tester.buildHierarchy(pages);
 		assertNotNull(actual);
 		
-		Set<HierarchyNode> nodes = actual.getChildren();
+		Collection<HierarchyNode> nodes = actual.getChildren();
 		assertNotNull(nodes);
 		assertEquals(1, nodes.size());
 		for (HierarchyNode root : nodes) {
@@ -62,7 +61,7 @@
 		HierarchyNode actual = tester.buildHierarchy(pages);
 		assertNotNull(actual);
 		
-		Set<HierarchyNode> nodes = actual.getChildren();
+		Collection<HierarchyNode> nodes = actual.getChildren();
 		assertNotNull(nodes);
 		assertEquals(1, nodes.size());
 		for (HierarchyNode root : nodes) {
@@ -89,7 +88,7 @@
 		HierarchyNode actual = tester.buildHierarchy(pages);
 		assertNotNull(actual);
 		
-		Set<HierarchyNode> nodes = actual.getChildren();
+		Collection<HierarchyNode> nodes = actual.getChildren();
 		assertNotNull(nodes);
 		assertEquals(1, nodes.size());
 		for (HierarchyNode root : nodes) {
@@ -122,7 +121,7 @@
 		HierarchyNode actual = tester.buildHierarchy(pages);
 		assertNotNull(actual);
 		
-		Set<HierarchyNode> nodes = actual.getChildren();
+		Collection<HierarchyNode> nodes = actual.getChildren();
 		assertNotNull(nodes);
 		assertEquals(1, nodes.size());
 		for (HierarchyNode root : nodes) {
@@ -244,7 +243,7 @@
 		pages.add(page);
 	}
 	
-	private Vector<HierarchyNode> asVector(Set<HierarchyNode> children) {
+	private Vector<HierarchyNode> asVector(Collection<HierarchyNode> children) {
 		Vector<HierarchyNode> nodes = new Vector<HierarchyNode>();
 		nodes.addAll(children);
 		return nodes;
diff --git a/src/com/atlassian/uwc/hierarchies/FilepathHierarchy.java b/src/com/atlassian/uwc/hierarchies/FilepathHierarchy.java
index 6102e31..95a840e 100644
--- a/src/com/atlassian/uwc/hierarchies/FilepathHierarchy.java
+++ b/src/com/atlassian/uwc/hierarchies/FilepathHierarchy.java
@@ -173,7 +173,7 @@
 		log.debug("...... checking parent '" + parent.getName() + "' has relationship with '" + childname + "'");
 		boolean relationship = false;
 		
-		Set<HierarchyNode> children = parent.getChildren();
+		Collection<HierarchyNode> children = parent.getChildren();
 		if (children == null || children.isEmpty()) {
 			log.debug("...... -> parent has no children");
 			return false;
@@ -226,7 +226,7 @@
 	 */
 	protected HierarchyNode getChildNode(HierarchyNode parent, String childname) {
 		log.debug("...... Getting child node with name: " + childname);
-		Set<HierarchyNode> children = parent.getChildren();
+		Collection<HierarchyNode> children = (Collection<HierarchyNode>) parent.getChildren();
 		if (children == null || children.isEmpty()) {
 			log.debug("...... -> parent has no children. Returning null.");
 			return null;
diff --git a/src/com/atlassian/uwc/hierarchies/FilepathHierarchyTest.java b/src/com/atlassian/uwc/hierarchies/FilepathHierarchyTest.java
index 7214176..9ef0f54 100644
--- a/src/com/atlassian/uwc/hierarchies/FilepathHierarchyTest.java
+++ b/src/com/atlassian/uwc/hierarchies/FilepathHierarchyTest.java
@@ -5,7 +5,6 @@
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Properties;
-import java.util.Set;
 import java.util.Vector;
 
 import junit.framework.TestCase;
@@ -13,7 +12,6 @@
 import org.apache.log4j.Logger;
 import org.apache.log4j.PropertyConfigurator;
 
-import com.atlassian.uwc.converters.jotspot.TitleConverter;
 import com.atlassian.uwc.filters.NoSvnFilter;
 import com.atlassian.uwc.ui.Page;
 
@@ -80,7 +78,7 @@
 		assertNull(actual.getParent());
 		assertNotNull(actual.getChildren());
 		
-		Set<HierarchyNode> level1ChildSet = actual.getChildren();
+		Collection<HierarchyNode> level1ChildSet = actual.getChildren();
 		assertEquals(2, level1ChildSet.size());
 		Vector<HierarchyNode> level1Children = new Vector<HierarchyNode>();
 		level1Children.addAll(level1ChildSet);
@@ -127,7 +125,7 @@
 		assertNull(actual.getParent());
 		assertNotNull(actual.getChildren());
 		
-		Set<HierarchyNode> level1ChildSet = actual.getChildren();
+		Collection<HierarchyNode> level1ChildSet = actual.getChildren();
 		assertEquals(2, level1ChildSet.size());
 		Vector<HierarchyNode> level1Children = new Vector<HierarchyNode>();
 		level1Children.addAll(level1ChildSet);
@@ -175,7 +173,7 @@
 		assertNull(actual.getParent());
 		assertNotNull(actual.getChildren());
 		
-		Set<HierarchyNode> level1ChildSet = actual.getChildren();
+		Collection<HierarchyNode> level1ChildSet = actual.getChildren();
 		assertEquals(2, level1ChildSet.size());
 		Vector<HierarchyNode> level1Children = new Vector<HierarchyNode>();
 		level1Children.addAll(level1ChildSet);
@@ -600,7 +598,7 @@
 		HierarchyNode root = tester.buildHierarchy(pages);
 		assertNotNull(root);
 		assertEquals(6, root.countDescendants());
-		Set<HierarchyNode> level1 = root.getChildren();
+		Collection<HierarchyNode> level1 = root.getChildren();
 		assertNotNull(level1);
 		assertEquals(2, level1.size());
 		for (HierarchyNode lvl1Node : level1) {
@@ -611,7 +609,7 @@
 			else if ("Drink.txt".equals(lvl1Node.getName())) fail("Still have Drink node");
 			else if ("Comestibles".equals(lvl1Node.getName())) {
 				assertEquals(3, lvl1Node.countDescendants());
-				Set<HierarchyNode> level2 = lvl1Node.getChildren();
+				Collection<HierarchyNode> level2 = lvl1Node.getChildren();
 				assertNotNull(level2);
 				assertEquals(2, level2.size());
 				for (HierarchyNode lvl2Node : level2) {
@@ -622,7 +620,7 @@
 			}
 			else if ("Liquid".equals(lvl1Node.getName())) {
 				assertEquals(2, lvl1Node.countDescendants());
-				Set<HierarchyNode> level2 = lvl1Node.getChildren();
+				Collection<HierarchyNode> level2 = lvl1Node.getChildren();
 				assertNotNull(level2);
 				assertEquals(1, level2.size());
 				for (HierarchyNode lvl2Node : level2) {
@@ -648,19 +646,19 @@
 		HierarchyNode root = tester.buildHierarchy(pages);
 		assertNotNull(root);
 		assertEquals(6, root.countDescendants());
-		Set<HierarchyNode> level1 = root.getChildren();
+		Collection<HierarchyNode> level1 = root.getChildren();
 		assertNotNull(level1);
 		assertEquals(1, level1.size());
 		for (HierarchyNode lvl1Node : level1) {
 			assertNotNull(lvl1Node);
 			if (lvl1Node.getName().endsWith("_subpages")) fail("Still have subpages dir node.");
 			assertEquals(5, lvl1Node.countDescendants());
-			Set<HierarchyNode> level2 = lvl1Node.getChildren();
+			Collection<HierarchyNode> level2 = lvl1Node.getChildren();
 			assertNotNull(level2);
 			assertEquals(1, level2.size());
 			for (HierarchyNode lvl2Node : level2) {
 					if (lvl2Node.getName().endsWith("_subpages")) fail("Still have subpages dir node.");
-					Set<HierarchyNode> level3 = lvl2Node.getChildren();
+					Collection<HierarchyNode> level3 = lvl2Node.getChildren();
 					assertNotNull(level3);
 					assertEquals(3, level3.size());
 			}
@@ -701,7 +699,7 @@
 		assertNull(actual.getParent());
 		assertNotNull(actual.getChildren());
 
-		Set<HierarchyNode> level1ChildSet = actual.getChildren();
+		Collection<HierarchyNode> level1ChildSet = actual.getChildren();
 		assertEquals(1, level1ChildSet.size());
 		assertEquals("sampleData.txt", level1ChildSet.iterator().next().getName());
 		
@@ -771,7 +769,7 @@
 		HierarchyNode rootnode = tester.buildHierarchy(pages);
 
 		assertNull(rootnode.getPage());
-		Set<HierarchyNode> actualrootnodeSet = rootnode.getChildren();
+		Collection<HierarchyNode> actualrootnodeSet = rootnode.getChildren();
 		HierarchyNode actualRootNode = null;
 		for (HierarchyNode next : actualrootnodeSet) {
 			actualRootNode = next;
@@ -781,7 +779,7 @@
 		assertNotNull(actualRoot);
 		assertEquals("Root", actualRoot.getName());
 		
-		Set<HierarchyNode> children = actualRootNode.getChildren();
+		Collection<HierarchyNode> children = actualRootNode.getChildren();
 		for (HierarchyNode childnode : children) {
 			Page childpage = childnode.getPage();
 			assertNotNull(childpage);
diff --git a/src/com/atlassian/uwc/hierarchies/HierarchyNode.java b/src/com/atlassian/uwc/hierarchies/HierarchyNode.java
index 3c2161f..154b81a 100644
--- a/src/com/atlassian/uwc/hierarchies/HierarchyNode.java
+++ b/src/com/atlassian/uwc/hierarchies/HierarchyNode.java
@@ -1,10 +1,13 @@
 package com.atlassian.uwc.hierarchies;
 
+import java.util.Collection;
 import java.util.Comparator;
 import java.util.HashSet;
 import java.util.Iterator;
+import java.util.List;
 import java.util.Set;
 import java.util.TreeSet;
+import java.util.Vector;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -21,8 +24,9 @@
     private String name;
     private Page page;
     private HierarchyNode parent;
-    private Set<HierarchyNode> children;
+    private Collection<HierarchyNode> children;
     private static Comparator childrenComparator;
+    private static boolean childrenAsList = false;
 
     Logger log = Logger.getLogger(this.getClass());
     
@@ -66,20 +70,21 @@
      *
      * @param child The child to be removed. Must not be <code>null</code>.
      */
-    public void removeChild(HierarchyNode child) {
+    public boolean removeChild(HierarchyNode child) {
         if (child == null) {
             throw new IllegalArgumentException("The parameter must not be null!");
         }
-        if (children != null && children.contains(child)) {
-            children.remove(child);
+        if (getChildren().remove(child)) {
             log.debug("Removed: '" + child.getName() + "' from " + this.getName());
             if (children.size() == 0) {
                 children = null;
             }
             child.setParent(null);
+            return true;
         }
         else {
         	log.debug("Unable to remove this child: " + child.getName());
+        	return false;
         }
     }
     
@@ -101,9 +106,12 @@
      * @return A set of child nodes, or an empty set if
      *         this node has no children.
      */
-    public Set<HierarchyNode> getChildren() {
+    public Collection<HierarchyNode> getChildren() {
     	if (this.children == null) {
-    		if (childrenComparator == null)
+    		if (childrenAsList) {
+    			this.children = new Vector<HierarchyNode>();
+    		}
+    		else if (childrenComparator == null)
     			this.children = new HashSet<HierarchyNode>();
     		else //if you want to be able to control the child sort order
     			this.children = new TreeSet<HierarchyNode>(childrenComparator);
@@ -120,7 +128,7 @@
         return children == null ? null : children.iterator();
     }
 
-    public void setChildren(Set<HierarchyNode> children) {
+    public void setChildren(Collection<HierarchyNode> children) {
         this.children = children;
     }
     
@@ -226,14 +234,14 @@
         return i;
     }
     
-    public String toString() {
-    	return treeAsString(this);
-    }
-    private String treeAsString(HierarchyNode node) {
+//    public String toString() {
+//    	return treeAsString(this);
+//    }
+    public String treeAsString(HierarchyNode node) {
 		return treeAsString(node.getChildren(), "");
 	}
 
-	private String treeAsString(Set<HierarchyNode> children, String delim) {
+	private String treeAsString(Collection<HierarchyNode> children, String delim) {
 		String msg = "";
 		for (HierarchyNode child : children) {
 			String newdelim = delim + " .";
@@ -242,4 +250,8 @@
 		}
 		return msg;
 	}
+	
+	public static void childrenAsList(boolean aslist) {
+		childrenAsList = aslist;
+	}
 }
diff --git a/src/com/atlassian/uwc/hierarchies/SmfHierarchy.java b/src/com/atlassian/uwc/hierarchies/SmfHierarchy.java
index 14fb305..d6c0058 100644
--- a/src/com/atlassian/uwc/hierarchies/SmfHierarchy.java
+++ b/src/com/atlassian/uwc/hierarchies/SmfHierarchy.java
@@ -10,7 +10,6 @@
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.Properties;
-import java.util.Set;
 import java.util.Vector;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
@@ -215,7 +214,7 @@
 				Boolean.parseBoolean(this.getProperties().getProperty(PROPKEY_COMMENTS))) {
 			Vector<HierarchyNode> topicNodes = getTopicNodes(root);
 			for (HierarchyNode topic : topicNodes) {
-				Set<HierarchyNode> children = topic.getChildren();
+				Collection<HierarchyNode> children = topic.getChildren();
 				for (Iterator iter = children.iterator(); iter.hasNext();) {
 					HierarchyNode reply = (HierarchyNode) iter.next();
 					String comment = createComment(reply.getName());
diff --git a/src/com/atlassian/uwc/ui/ConverterEngine.java b/src/com/atlassian/uwc/ui/ConverterEngine.java
index e545a73..ac7c1d6 100644
--- a/src/com/atlassian/uwc/ui/ConverterEngine.java
+++ b/src/com/atlassian/uwc/ui/ConverterEngine.java
@@ -2145,11 +2145,12 @@
 		if (!(page instanceof VersionPage) && page.getFile() != null) {
 			log.debug("Original Filepath: " + page.getFile().getAbsolutePath());
 		}
+		String tmpspacekey = (page.getSpacekey()!=null)?page.getSpacekey():confSettings.spaceKey;
 		if (page.isBlog()) {
-			log.debug("Attempting to send blog: " + page.getName() + " to space: " + confSettings.spaceKey);
+			log.debug("Attempting to send blog: " + page.getName() + " to space: " + tmpspacekey);
 			id = sendBlog(broker, pageTable, confSettings);
 		} else { 
-			log.debug("Attempting to send page: " + page.getName() + " to space: " + confSettings.spaceKey);
+			log.debug("Attempting to send page: " + page.getName() + " to space: " + tmpspacekey);
 			id = sendPage(broker, pageTable, confSettings);
 		}
 		if (id == null) return null;
@@ -2545,22 +2546,22 @@
 	 * @param fileName
 	 * @return
 	 */    
-	protected boolean alreadyAttached(String fileName) {
-		if (this.attachedFiles == null || this.attachedFiles.isEmpty())
-			return false;
-		Iterator <String>it=attachedFiles.iterator();
-		while (it.hasNext())
-		{
-			String item=it.next();
-			int index=item.lastIndexOf(fileName);
-			if (index < 0)
-				continue;
-			if (item.length() - index == fileName.length())
-				return true;		
-		}
-		return false;
-
-	}
+//	protected boolean alreadyAttached(String fileName) {
+//		if (this.attachedFiles == null || this.attachedFiles.isEmpty())
+//			return false;
+//		Iterator <String>it=attachedFiles.iterator();
+//		while (it.hasNext())
+//		{
+//			String item=it.next();
+//			int index=item.lastIndexOf(fileName);
+//			if (index < 0)
+//				continue;
+//			if (item.length() - index == fileName.length())
+//				return true;		
+//		}
+//		return false;
+//
+//	}
 
 	protected boolean orphanAlreadyAttached(File file) {
 		if (this.attachedPaths == null) return false;
