Index: org.axdt.axdoc.model/model/AXDoc.ecore
===================================================================
--- org.axdt.axdoc.model/model/AXDoc.ecore	(revision 87f02d16be3ad1849f47a8a1e5c588a5924d4677)
+++ org.axdt.axdoc.model/model/AXDoc.ecore	(revision 85b4650e22de85722d0e932da31e0104e8a88327)
@@ -43,5 +43,5 @@
       <eParameters name="part" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
     </eOperations>
-    <eOperations name="getOrCreatePackage" eType="#//AXPackage"/>
+    <eOperations name="getOrCreateReference" eType="#//AXPackage"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="reference" eType="#//AXPackage"/>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="level" eType="#//AXLevel"
@@ -74,4 +74,6 @@
     <eStructuralFeatures xsi:type="ecore:EReference" name="parent" eType="#//AXIndexNode"
         transient="true" eOpposite="#//AXIndexNode/entries"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="reference" eType="#//AXNode"
+        transient="true"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="AXIndexNode" abstract="true">
@@ -89,4 +91,5 @@
       <eParameters name="type" eType="#//AXEntryType"/>
     </eOperations>
+    <eOperations name="getOrCreateReference" eType="#//AXNode"/>
     <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" lowerBound="1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="entries" upperBound="-1"
Index: org.axdt.axdoc.model/src/org/axdt/axdoc/model/AXDocPackage.java
===================================================================
--- org.axdt.axdoc.model/src/org/axdt/axdoc/model/AXDocPackage.java	(revision 79dd6994d81bd77cd232a3d55e8531b73adf71aa)
+++ org.axdt.axdoc.model/src/org/axdt/axdoc/model/AXDocPackage.java	(revision 85b4650e22de85722d0e932da31e0104e8a88327)
@@ -665,4 +665,13 @@
 
 	/**
+	 * The feature id for the '<em><b>Reference</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int AX_ENTRY__REFERENCE = AX_INDEX_NODE_FEATURE_COUNT + 2;
+
+	/**
 	 * The number of structural features of the '<em>AX Entry</em>' class.
 	 * <!-- begin-user-doc -->
@@ -671,5 +680,5 @@
 	 * @ordered
 	 */
-	int AX_ENTRY_FEATURE_COUNT = AX_INDEX_NODE_FEATURE_COUNT + 2;
+	int AX_ENTRY_FEATURE_COUNT = AX_INDEX_NODE_FEATURE_COUNT + 3;
 
 	/**
@@ -970,4 +979,15 @@
 	 */
 	EReference getAXEntry_Parent();
+
+	/**
+	 * Returns the meta object for the reference '{@link org.axdt.axdoc.model.AXEntry#getReference <em>Reference</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the reference '<em>Reference</em>'.
+	 * @see org.axdt.axdoc.model.AXEntry#getReference()
+	 * @see #getAXEntry()
+	 * @generated
+	 */
+	EReference getAXEntry_Reference();
 
 	/**
@@ -1313,4 +1333,12 @@
 
 		/**
+		 * The meta object literal for the '<em><b>Reference</b></em>' reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference AX_ENTRY__REFERENCE = eINSTANCE.getAXEntry_Reference();
+
+		/**
 		 * The meta object literal for the '{@link org.axdt.axdoc.model.impl.AXIndexNodeImpl <em>AX Index Node</em>}' class.
 		 * <!-- begin-user-doc -->
Index: org.axdt.axdoc.model/src/org/axdt/axdoc/model/AXEntry.java
===================================================================
--- org.axdt.axdoc.model/src/org/axdt/axdoc/model/AXEntry.java	(revision 79dd6994d81bd77cd232a3d55e8531b73adf71aa)
+++ org.axdt.axdoc.model/src/org/axdt/axdoc/model/AXEntry.java	(revision 85b4650e22de85722d0e932da31e0104e8a88327)
@@ -17,4 +17,5 @@
  *   <li>{@link org.axdt.axdoc.model.AXEntry#getType <em>Type</em>}</li>
  *   <li>{@link org.axdt.axdoc.model.AXEntry#getParent <em>Parent</em>}</li>
+ *   <li>{@link org.axdt.axdoc.model.AXEntry#getReference <em>Reference</em>}</li>
  * </ul>
  * </p>
@@ -82,3 +83,29 @@
 	void setParent(AXIndexNode value);
 
+	/**
+	 * Returns the value of the '<em><b>Reference</b></em>' reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Reference</em>' reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Reference</em>' reference.
+	 * @see #setReference(AXNode)
+	 * @see org.axdt.axdoc.model.AXDocPackage#getAXEntry_Reference()
+	 * @model transient="true"
+	 * @generated
+	 */
+	AXNode getReference();
+
+	/**
+	 * Sets the value of the '{@link org.axdt.axdoc.model.AXEntry#getReference <em>Reference</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Reference</em>' reference.
+	 * @see #getReference()
+	 * @generated
+	 */
+	void setReference(AXNode value);
+
 } // AXEntry
Index: org.axdt.axdoc.model/src/org/axdt/axdoc/model/AXIndex.java
===================================================================
--- org.axdt.axdoc.model/src/org/axdt/axdoc/model/AXIndex.java	(revision 87f02d16be3ad1849f47a8a1e5c588a5924d4677)
+++ org.axdt.axdoc.model/src/org/axdt/axdoc/model/AXIndex.java	(revision 85b4650e22de85722d0e932da31e0104e8a88327)
@@ -153,5 +153,5 @@
 	 * @generated
 	 */
-	AXPackage getOrCreatePackage();
+	AXPackage getOrCreateReference();
 
 } // AXIndex
Index: org.axdt.axdoc.model/src/org/axdt/axdoc/model/AXIndexNode.java
===================================================================
--- org.axdt.axdoc.model/src/org/axdt/axdoc/model/AXIndexNode.java	(revision 79dd6994d81bd77cd232a3d55e8531b73adf71aa)
+++ org.axdt.axdoc.model/src/org/axdt/axdoc/model/AXIndexNode.java	(revision 85b4650e22de85722d0e932da31e0104e8a88327)
@@ -144,3 +144,11 @@
 	AXEntry createEntry(String part, AXEntryType type);
 
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @model kind="operation"
+	 * @generated
+	 */
+	AXNode getOrCreateReference();
+
 } // AXIndexNode
Index: org.axdt.axdoc.model/src/org/axdt/axdoc/model/impl/AXDocPackageImpl.java
===================================================================
--- org.axdt.axdoc.model/src/org/axdt/axdoc/model/impl/AXDocPackageImpl.java	(revision 87f02d16be3ad1849f47a8a1e5c588a5924d4677)
+++ org.axdt.axdoc.model/src/org/axdt/axdoc/model/impl/AXDocPackageImpl.java	(revision 85b4650e22de85722d0e932da31e0104e8a88327)
@@ -423,4 +423,13 @@
 	 * @generated
 	 */
+	public EReference getAXEntry_Reference() {
+		return (EReference) axEntryEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	public EClass getAXIndexNode() {
 		return axIndexNodeEClass;
@@ -572,4 +581,5 @@
 		createEAttribute(axEntryEClass, AX_ENTRY__TYPE);
 		createEReference(axEntryEClass, AX_ENTRY__PARENT);
+		createEReference(axEntryEClass, AX_ENTRY__REFERENCE);
 
 		axIndexNodeEClass = createEClass(AX_INDEX_NODE);
@@ -713,6 +723,6 @@
 				IS_ORDERED);
 
-		addEOperation(axIndexEClass, this.getAXPackage(), "getOrCreatePackage",
-				0, 1, IS_UNIQUE, IS_ORDERED);
+		addEOperation(axIndexEClass, this.getAXPackage(),
+				"getOrCreateReference", 0, 1, IS_UNIQUE, IS_ORDERED);
 
 		initEClass(axRootEClass, AXRoot.class, "AXRoot", !IS_ABSTRACT,
@@ -751,4 +761,8 @@
 				!IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED,
 				IS_ORDERED);
+		initEReference(getAXEntry_Reference(), this.getAXNode(), null,
+				"reference", null, 0, 1, AXEntry.class, IS_TRANSIENT,
+				!IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES,
+				!IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
 
 		initEClass(axIndexNodeEClass, AXIndexNode.class, "AXIndexNode",
@@ -799,4 +813,7 @@
 				IS_ORDERED);
 
+		addEOperation(axIndexNodeEClass, this.getAXNode(),
+				"getOrCreateReference", 0, 1, IS_UNIQUE, IS_ORDERED);
+
 		// Initialize enums and add enum literals
 		initEEnum(axLevelEEnum, AXLevel.class, "AXLevel");
Index: org.axdt.axdoc.model/src/org/axdt/axdoc/model/impl/AXEntryImpl.java
===================================================================
--- org.axdt.axdoc.model/src/org/axdt/axdoc/model/impl/AXEntryImpl.java	(revision 79dd6994d81bd77cd232a3d55e8531b73adf71aa)
+++ org.axdt.axdoc.model/src/org/axdt/axdoc/model/impl/AXEntryImpl.java	(revision 85b4650e22de85722d0e932da31e0104e8a88327)
@@ -9,4 +9,5 @@
 import java.util.Collection;
 
+import org.axdt.axdoc.model.AXDocFactory;
 import org.axdt.axdoc.model.AXDocPackage;
 import org.axdt.axdoc.model.AXEntry;
@@ -14,5 +15,10 @@
 import org.axdt.axdoc.model.AXIndex;
 import org.axdt.axdoc.model.AXIndexNode;
+import org.axdt.axdoc.model.AXMember;
+import org.axdt.axdoc.model.AXMemberHolder;
+import org.axdt.axdoc.model.AXNode;
+import org.axdt.axdoc.model.AXPackage;
 import org.axdt.axdoc.model.AXRoot;
+import org.axdt.axdoc.model.AXType;
 import org.eclipse.emf.common.notify.Notification;
 import org.eclipse.emf.common.notify.NotificationChain;
@@ -32,4 +38,5 @@
  *   <li>{@link org.axdt.axdoc.model.impl.AXEntryImpl#getType <em>Type</em>}</li>
  *   <li>{@link org.axdt.axdoc.model.impl.AXEntryImpl#getParent <em>Parent</em>}</li>
+ *   <li>{@link org.axdt.axdoc.model.impl.AXEntryImpl#getReference <em>Reference</em>}</li>
  * </ul>
  * </p>
@@ -57,4 +64,14 @@
 	 */
 	protected AXEntryType type = TYPE_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getReference() <em>Reference</em>}' reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getReference()
+	 * @generated
+	 * @ordered
+	 */
+	protected AXNode reference;
 
 	/**
@@ -153,4 +170,45 @@
 	 * @generated
 	 */
+	public AXNode getReference() {
+		if (reference != null && reference.eIsProxy()) {
+			InternalEObject oldReference = (InternalEObject) reference;
+			reference = (AXNode) eResolveProxy(oldReference);
+			if (reference != oldReference) {
+				if (eNotificationRequired())
+					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
+							AXDocPackage.AX_ENTRY__REFERENCE, oldReference,
+							reference));
+			}
+		}
+		return reference;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public AXNode basicGetReference() {
+		return reference;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setReference(AXNode newReference) {
+		AXNode oldReference = reference;
+		reference = newReference;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET,
+					AXDocPackage.AX_ENTRY__REFERENCE, oldReference, reference));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	@SuppressWarnings("unchecked")
 	@Override
@@ -226,4 +284,8 @@
 		case AXDocPackage.AX_ENTRY__PARENT:
 			return getParent();
+		case AXDocPackage.AX_ENTRY__REFERENCE:
+			if (resolve)
+				return getReference();
+			return basicGetReference();
 		}
 		return eDynamicGet(featureID, resolve, coreType);
@@ -252,4 +314,7 @@
 			setParent((AXIndexNode) newValue);
 			return;
+		case AXDocPackage.AX_ENTRY__REFERENCE:
+			setReference((AXNode) newValue);
+			return;
 		}
 		eDynamicSet(featureID, newValue);
@@ -275,4 +340,7 @@
 		case AXDocPackage.AX_ENTRY__PARENT:
 			setParent((AXIndexNode) null);
+			return;
+		case AXDocPackage.AX_ENTRY__REFERENCE:
+			setReference((AXNode) null);
 			return;
 		}
@@ -301,4 +369,6 @@
 		case AXDocPackage.AX_ENTRY__PARENT:
 			return getParent() != null;
+		case AXDocPackage.AX_ENTRY__REFERENCE:
+			return reference != null;
 		}
 		return eDynamicIsSet(featureID);
@@ -366,3 +436,72 @@
 		return id;
 	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 */
+	public AXNode getOrCreateReference() {
+		AXNode node = getReference();
+		// if transient reference is not yet set ..
+		if (node == null && getName() != null && getType() != null) {
+			// lets try to find it first
+			AXIndexNode parent = getParent();
+			// we need a parent !
+			if (parent == null) return null;
+			// lets work down the index tree and create all needed references
+			AXNode parentRef = parent.getOrCreateReference();
+			// parent ref does not exist and cannot be created
+			if (parentRef == null) return null;
+			if (getType().isMember()) {
+				// should never happen
+				if (!(parentRef instanceof AXMemberHolder)) return null;
+				AXMemberHolder holder = (AXMemberHolder) parentRef;
+				AXMember result = null;
+				for (AXMember member:holder.getMembers()) {
+					if (getName().equals(member.getName())) {
+						result = member;
+						break;
+					}
+				}
+				// none found type. lets create one
+				if (result == null) {
+					// none found type. lets create one
+					result = AXDocFactory.eINSTANCE.createAXMember();
+					result.setName(getName());
+					if (getType().equals(AXEntryType.METHOD))
+						result.setFunction(true);
+					else if (getType().equals(AXEntryType.CONSTRUCTOR))
+						result.setConst(true);
+					else if (getType().equals(AXEntryType.PROPERTY))
+						result.setVar(true);
+					holder.getMembers().add(result);
+				}
+				node = result;
+			} else if (getType().isType()) {
+				// we need a package to add types
+				// XXX: think about private classes in source indexes
+				if (!(parentRef instanceof AXPackage)) return null;
+				AXPackage pack = (AXPackage) parentRef;
+				AXType result = null;
+				for (AXType type:pack.getTypes()) {
+					if (getName().equals(type.getName())) {
+						result = type;
+						break;
+					}
+				}
+				if (result == null) {
+					// none found type. lets create one
+					result = AXDocFactory.eINSTANCE.createAXType();
+					result.setName(getName());
+					if (getType().equals(AXEntryType.INTERFACE)) {
+						result.setInterface(true);
+					}
+					pack.getTypes().add(result);
+				}
+				node = result;
+			}
+			setReference(node);
+		}
+		return node;
+	}
 } //AXEntryImpl
Index: org.axdt.axdoc.model/src/org/axdt/axdoc/model/impl/AXIndexImpl.java
===================================================================
--- org.axdt.axdoc.model/src/org/axdt/axdoc/model/impl/AXIndexImpl.java	(revision 87f02d16be3ad1849f47a8a1e5c588a5924d4677)
+++ org.axdt.axdoc.model/src/org/axdt/axdoc/model/impl/AXIndexImpl.java	(revision 85b4650e22de85722d0e932da31e0104e8a88327)
@@ -513,7 +513,7 @@
 	 * <!-- end-user-doc -->
 	 */
-	public AXPackage getOrCreatePackage() {
+	public AXPackage getOrCreateReference() {
 		AXPackage pack = getReference();
-		if (pack == null) {
+		if (pack == null && eResource() != null) {
 			pack = AXDocFactory.eINSTANCE.createAXPackage();
 			pack.setName(getName());
Index: org.axdt.axdoc.model/src/org/axdt/axdoc/model/impl/AXIndexNodeImpl.java
===================================================================
--- org.axdt.axdoc.model/src/org/axdt/axdoc/model/impl/AXIndexNodeImpl.java	(revision 79dd6994d81bd77cd232a3d55e8531b73adf71aa)
+++ org.axdt.axdoc.model/src/org/axdt/axdoc/model/impl/AXIndexNodeImpl.java	(revision 85b4650e22de85722d0e932da31e0104e8a88327)
@@ -14,4 +14,5 @@
 import org.axdt.axdoc.model.AXEntryType;
 import org.axdt.axdoc.model.AXIndexNode;
+import org.axdt.axdoc.model.AXNode;
 import org.axdt.axdoc.model.AXRoot;
 import org.eclipse.emf.common.notify.Notification;
@@ -251,4 +252,10 @@
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
+	 */
+	public abstract AXNode getOrCreateReference();
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
 	 * @generated
 	 */
Index: org.axdt.axdoc.test/src/org/axdt/axdoc/model/AXEntryTest.java
===================================================================
--- org.axdt.axdoc.test/src/org/axdt/axdoc/model/AXEntryTest.java	(revision 79dd6994d81bd77cd232a3d55e8531b73adf71aa)
+++ org.axdt.axdoc.test/src/org/axdt/axdoc/model/AXEntryTest.java	(revision 85b4650e22de85722d0e932da31e0104e8a88327)
@@ -8,4 +8,6 @@
 
 import junit.textui.TestRunner;
+
+import org.axdt.axdoc.model.util.AXUtil;
 
 /**
@@ -88,3 +90,33 @@
 		assertSame(root, getFixture().getRoot());
 	}
+
+	@Override
+	public void testGetOrCreateReference() {
+		// if null not enough info provided
+		assertNull(getFixture().getOrCreateReference());
+		getFixture().setName("Array");
+		// still needs entry type
+		assertNull(getFixture().getOrCreateReference());
+		getFixture().setType(AXEntryType.CLASS);
+		// still need package
+		assertNull(getFixture().getOrCreateReference());
+		AXRoot root = AXUtil.createRoot("test", "file:/tmp/axdoc.entryTest/asdoc", "file:/tmp/axdoc.entryTest/resources");
+		root.getEntries().add(getFixture());
+		AXNode ref = getFixture().getOrCreateReference();
+		assertNotNull(ref);
+		assertTrue(ref instanceof AXType);
+		AXType type = (AXType) ref;
+		assertFalse(type.isInterface());
+		assertEquals("Array", type.getName());
+		assertSame(type, getFixture().getOrCreateReference());
+		
+		AXEntry entry = getFixture().createEntry("toString", AXEntryType.METHOD);
+		ref = entry.getOrCreateReference();
+		assertNotNull(ref);
+		assertTrue(ref instanceof AXMember);
+		AXMember member = (AXMember) ref;
+		assertTrue(member.isFunction());
+		assertEquals("toString", member.getName());
+		assertSame(member, entry.getOrCreateReference());
+	}
 } //AXEntryTest
Index: org.axdt.axdoc.test/src/org/axdt/axdoc/model/AXIndexNodeTest.java
===================================================================
--- org.axdt.axdoc.test/src/org/axdt/axdoc/model/AXIndexNodeTest.java	(revision 79dd6994d81bd77cd232a3d55e8531b73adf71aa)
+++ org.axdt.axdoc.test/src/org/axdt/axdoc/model/AXIndexNodeTest.java	(revision 85b4650e22de85722d0e932da31e0104e8a88327)
@@ -30,4 +30,5 @@
  *   <li>{@link org.axdt.axdoc.model.AXIndexNode#localEntry(java.lang.String, boolean) <em>Local Entry</em>}</li>
  *   <li>{@link org.axdt.axdoc.model.AXIndexNode#createEntry(java.lang.String, org.axdt.axdoc.model.AXEntryType) <em>Create Entry</em>}</li>
+ *   <li>{@link org.axdt.axdoc.model.AXIndexNode#getOrCreateReference() <em>Get Or Create Reference</em>}</li>
  * </ul>
  * </p>
@@ -185,3 +186,13 @@
 	}
 
+	/**
+	 * Tests the '{@link org.axdt.axdoc.model.AXIndexNode#getOrCreateReference() <em>Get Or Create Reference</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.axdt.axdoc.model.AXIndexNode#getOrCreateReference()
+	 */
+	public void testGetOrCreateReference() {
+		// should be tested in  concrete implementations
+	}
+
 } //AXIndexNodeTest
Index: org.axdt.axdoc.test/src/org/axdt/axdoc/model/AXIndexTest.java
===================================================================
--- org.axdt.axdoc.test/src/org/axdt/axdoc/model/AXIndexTest.java	(revision 87f02d16be3ad1849f47a8a1e5c588a5924d4677)
+++ org.axdt.axdoc.test/src/org/axdt/axdoc/model/AXIndexTest.java	(revision 85b4650e22de85722d0e932da31e0104e8a88327)
@@ -8,4 +8,7 @@
 
 import junit.textui.TestRunner;
+
+import org.axdt.axdoc.model.util.AXUtil;
+import org.eclipse.emf.ecore.resource.Resource;
 
 /**
@@ -18,5 +21,5 @@
  *   <li>{@link org.axdt.axdoc.model.AXIndex#localIndex(java.lang.String) <em>Local Index</em>}</li>
  *   <li>{@link org.axdt.axdoc.model.AXIndex#createIndex(java.lang.String) <em>Create Index</em>}</li>
- *   <li>{@link org.axdt.axdoc.model.AXIndex#getOrCreatePackage() <em>Get Or Create Package</em>}</li>
+ *   <li>{@link org.axdt.axdoc.model.AXIndex#getOrCreateReference() <em>Get Or Create Reference</em>}</li>
  * </ul>
  * </p>
@@ -184,10 +187,24 @@
 
 	/**
-	 * Tests the '{@link org.axdt.axdoc.model.AXIndex#getOrCreatePackage() <em>Get Or Create Package</em>}' operation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see org.axdt.axdoc.model.AXIndex#getOrCreatePackage()
-	 */
-	public void testGetOrCreatePackage() {
-	}
+	 * Tests the '{@link org.axdt.axdoc.model.AXIndex#getOrCreateReference() <em>Get Or Create Reference</em>}' operation.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.axdt.axdoc.model.AXIndex#getOrCreateReference()
+	 */
+	public void testGetOrCreateReference() {
+		getFixture().setName("org");
+		AXPackage reference = getFixture().getOrCreateReference();
+		// needs resource set
+		assertNull(reference);
+		Resource resource = AXUtil.getResource("test");
+		resource.getContents().add(getFixture());
+		reference = getFixture().getOrCreateReference();
+		assertNotNull(reference);
+		assertEquals("org", reference.getName());
+		assertEquals(0, reference.getTypes().size());
+		assertEquals(0, reference.getMembers().size());
+		// watch out asdoc is a list !
+		assertEquals(0, reference.getAsdoc().size());
+	}
+
 } //AXIndexTest
Index: org.axdt.axdoc.test/src/org/axdt/axdoc/model/util/AXDocUtilTest.java
===================================================================
--- org.axdt.axdoc.test/src/org/axdt/axdoc/model/util/AXDocUtilTest.java	(revision 79dd6994d81bd77cd232a3d55e8531b73adf71aa)
+++ org.axdt.axdoc.test/src/org/axdt/axdoc/model/util/AXDocUtilTest.java	(revision 85b4650e22de85722d0e932da31e0104e8a88327)
@@ -9,5 +9,4 @@
 import org.axdt.axdoc.model.AXPackage;
 import org.axdt.axdoc.model.AXRoot;
-import org.axdt.axdoc.model.util.AXUtil;
 import org.eclipse.emf.ecore.resource.Resource;
 
Index: org.axdt.axdoc.test/src/org/axdt/axdoc/util/Index0rTest.java
===================================================================
--- org.axdt.axdoc.test/src/org/axdt/axdoc/util/Index0rTest.java	(revision 87f02d16be3ad1849f47a8a1e5c588a5924d4677)
+++ org.axdt.axdoc.test/src/org/axdt/axdoc/util/Index0rTest.java	(revision 85b4650e22de85722d0e932da31e0104e8a88327)
@@ -1,3 +1,5 @@
 package org.axdt.axdoc.util;
+
+import junit.framework.TestCase;
 
 import org.axdt.axdoc.TestConstants;
@@ -7,7 +9,5 @@
 import org.axdt.axdoc.model.AXRoot;
 import org.axdt.axdoc.model.AXRootType;
-import org.axdt.axdoc.util.Index0r;
-
-import junit.framework.TestCase;
+import org.eclipse.emf.common.util.URI;
 
 public class Index0rTest extends TestCase implements TestConstants {
@@ -22,8 +22,16 @@
 		assertEquals(2,"::test".split("::").length);
 		assertEquals("test::".length()-2,"test::".indexOf("::"));
-		Index0r index = new Index0r(){};
+
+		// platform urls are only supported with active workspace
+		final URI customBaseUrl = URI.createURI("file:/tmp/axdttest/"+Long.toHexString(System.currentTimeMillis()));
+		Index0r index = new Index0r(){
+			@Override
+			protected URI createBaseUri() {
+				return customBaseUrl;
+			}
+		};
 		String pathUrl = dataFolder.concat("/asdoc/");
 		AXRoot root = index.addRoot("langref", pathUrl, AXRootType.ASDOC);
-		assertEquals("platform:/meta/org.axdt.axdoc/"+Integer.toHexString(pathUrl.hashCode())+"/root-index.axdoc", root.eResource().getURI().toString());
+		assertEquals(customBaseUrl+"/"+Integer.toHexString(pathUrl.hashCode())+"/root-index.axdoc", root.eResource().getURI().toString());
 		index.initialize(root, AXLevel.PACKAGE);
 		assertNotNull(root);
Index: org.axdt.axdoc/META-INF/MANIFEST.MF
===================================================================
--- org.axdt.axdoc/META-INF/MANIFEST.MF	(revision 87f02d16be3ad1849f47a8a1e5c588a5924d4677)
+++ org.axdt.axdoc/META-INF/MANIFEST.MF	(revision 85b4650e22de85722d0e932da31e0104e8a88327)
@@ -10,5 +10,6 @@
  org.axdt.common,
  org.eclipse.core.resources,
- org.axdt.axdoc.model
+ org.axdt.axdoc.model,
+ org.eclipse.debug.core
 Eclipse-LazyStart: true
 Bundle-Activator: org.axdt.axdoc.AXDocPlugin
Index: org.axdt.axdoc/plugin.xml
===================================================================
--- org.axdt.axdoc/plugin.xml	(revision 87f02d16be3ad1849f47a8a1e5c588a5924d4677)
+++ org.axdt.axdoc/plugin.xml	(revision 85b4650e22de85722d0e932da31e0104e8a88327)
@@ -7,7 +7,13 @@
             class="org.axdt.axdoc.preferences.AXDocPreferencePage"
             category="org.axdt.as3.preferences"
-            id="org.axdt.axdoc.prefernces"
+            id="org.axdt.axdoc.preferences"
             name="AXDoc">
       </page>
    </extension>
+  <extension
+         point="org.eclipse.core.runtime.preferences">
+      <initializer
+            class="org.axdt.axdoc.preferences.AXDocPreferences">
+      </initializer>
+  </extension>
 </plugin>
Index: org.axdt.axdoc/src/org/axdt/axdoc/AXDocPlugin.java
===================================================================
--- org.axdt.axdoc/src/org/axdt/axdoc/AXDocPlugin.java	(revision 87f02d16be3ad1849f47a8a1e5c588a5924d4677)
+++ org.axdt.axdoc/src/org/axdt/axdoc/AXDocPlugin.java	(revision 85b4650e22de85722d0e932da31e0104e8a88327)
@@ -4,9 +4,4 @@
 import java.net.URL;
 
-import org.axdt.axdoc.model.AXLevel;
-import org.axdt.axdoc.model.AXRoot;
-import org.axdt.axdoc.model.AXRootType;
-import org.axdt.axdoc.preferences.AXDocPreferences;
-import org.axdt.axdoc.util.Index0r;
 import org.eclipse.core.runtime.FileLocator;
 import org.eclipse.core.runtime.Path;
@@ -54,17 +49,4 @@
 		super.start(context);
 		plugin = this;
-		try {
-			initializeIndex0r();
-		} catch (Exception e) {
-			log("could not initialize indexer", e);
-		}
-	}
-
-	protected void initializeIndex0r() {
-		Index0r result = Index0r.getInstance();
-		// load configured indexes
-		String pathString = AXDocPreferences.getLangRefPathString();
-		AXRoot root = result.addRoot("langref", pathString, AXRootType.ASDOC);
-		result.initialize(root, AXLevel.PACKAGE);
 	}
 
Index: org.axdt.axdoc/src/org/axdt/axdoc/preferences/AXDocPreferencePage.java
===================================================================
--- org.axdt.axdoc/src/org/axdt/axdoc/preferences/AXDocPreferencePage.java	(revision 87f02d16be3ad1849f47a8a1e5c588a5924d4677)
+++ org.axdt.axdoc/src/org/axdt/axdoc/preferences/AXDocPreferencePage.java	(revision 85b4650e22de85722d0e932da31e0104e8a88327)
@@ -1,4 +1,5 @@
 package org.axdt.axdoc.preferences;
 
+import org.axdt.axdoc.util.Index0r;
 import org.axdt.preferences.AbstractPreferencePage;
 
@@ -7,3 +8,10 @@
 		super(AXDocPreferences.getInstance());
 	}
+	
+	@Override
+	protected void performApply() {
+		super.performApply();
+		// if changed reparse
+		AXDocPreferences.checkAXDocPaths(Index0r.getInstance());
+	}
 }
Index: org.axdt.axdoc/src/org/axdt/axdoc/preferences/AXDocPreferences.java
===================================================================
--- org.axdt.axdoc/src/org/axdt/axdoc/preferences/AXDocPreferences.java	(revision 87f02d16be3ad1849f47a8a1e5c588a5924d4677)
+++ org.axdt.axdoc/src/org/axdt/axdoc/preferences/AXDocPreferences.java	(revision 85b4650e22de85722d0e932da31e0104e8a88327)
@@ -2,4 +2,9 @@
 
 import org.axdt.axdoc.AXDocPlugin;
+import org.axdt.axdoc.model.AXLevel;
+import org.axdt.axdoc.model.AXRoot;
+import org.axdt.axdoc.model.AXRootType;
+import org.axdt.axdoc.preferences.DocTableFieldEditor.DocItem;
+import org.axdt.axdoc.util.Index0r;
 import org.axdt.preferences.AbstractPreferences;
 import org.eclipse.jface.preference.IPreferenceStore;
@@ -16,5 +21,5 @@
 
 	public AXDocPreferences() {
-		super("Preferences for ActionScript 3 language support");
+		super("Preferences for asdoc support");
 		instance = this;
 	}
@@ -27,5 +32,5 @@
 	@Override
 	public void initializeFieldSpecs() {
-		add(LANGREF_PATH, "&Langref path", "file:/home/mb0/workspace/axdt/org.axdt.axdoc.test/data/asdoc");
+		add(new DocTableField(LANGREF_PATH, "Asdoc uris", "file:/home/mb0/workspace/axdt/org.axdt.axdoc.test/data/asdoc"));
 	}
 
@@ -34,3 +39,18 @@
 		return store.getString(LANGREF_PATH);
 	}
+	public static void checkAXDocPaths(Index0r index0r) {
+		String string = getLangRefPathString();
+		Object[] values = DocTableFieldEditor.deserializeValue(string);
+		for (Object value:values) {
+			if (value instanceof DocItem) {
+				DocItem item = (DocItem) value;
+				AXRoot root = index0r.addRoot(item.name, item.url, AXRootType.ASDOC);
+				index0r.initialize(root, AXLevel.TYPE);
+			}
+		}
+	}
+	@Override
+	public void initializeDefaultPreferences() {
+		super.initializeDefaultPreferences();
+	}
 }
Index: org.axdt.axdoc/src/org/axdt/axdoc/preferences/DocTableField.java
===================================================================
--- org.axdt.axdoc/src/org/axdt/axdoc/preferences/DocTableField.java	(revision 85b4650e22de85722d0e932da31e0104e8a88327)
+++ org.axdt.axdoc/src/org/axdt/axdoc/preferences/DocTableField.java	(revision 85b4650e22de85722d0e932da31e0104e8a88327)
@@ -0,0 +1,17 @@
+package org.axdt.axdoc.preferences;
+
+import org.axdt.preferences.fields.StringField;
+import org.eclipse.jface.preference.FieldEditor;
+import org.eclipse.swt.widgets.Composite;
+
+public class DocTableField extends StringField {
+
+	public DocTableField(String key, String desc, String defValue) {
+		super(key, desc, defValue);
+	}
+
+	@Override
+	public FieldEditor createFieldEditor(Composite comp) {
+		return new DocTableFieldEditor(key, desc, comp);
+	}
+}
Index: org.axdt.axdoc/src/org/axdt/axdoc/preferences/DocTableFieldEditor.java
===================================================================
--- org.axdt.axdoc/src/org/axdt/axdoc/preferences/DocTableFieldEditor.java	(revision 85b4650e22de85722d0e932da31e0104e8a88327)
+++ org.axdt.axdoc/src/org/axdt/axdoc/preferences/DocTableFieldEditor.java	(revision 85b4650e22de85722d0e932da31e0104e8a88327)
@@ -0,0 +1,376 @@
+package org.axdt.axdoc.preferences;
+
+import java.io.File;
+import java.net.URI;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.regex.Pattern;
+
+import org.axdt.axdoc.AXDocPlugin;
+import org.eclipse.core.runtime.IStatus;
+import org.eclipse.core.runtime.Status;
+import org.eclipse.jface.dialogs.StatusDialog;
+import org.eclipse.jface.layout.TableColumnLayout;
+import org.eclipse.jface.preference.FieldEditor;
+import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.CellLabelProvider;
+import org.eclipse.jface.viewers.ColumnLabelProvider;
+import org.eclipse.jface.viewers.ColumnLayoutData;
+import org.eclipse.jface.viewers.ColumnWeightData;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.TableViewerColumn;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.custom.SashForm;
+import org.eclipse.swt.events.ControlAdapter;
+import org.eclipse.swt.events.ControlEvent;
+import org.eclipse.swt.events.ModifyEvent;
+import org.eclipse.swt.events.ModifyListener;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
+import org.eclipse.swt.layout.GridData;
+import org.eclipse.swt.layout.GridLayout;
+import org.eclipse.swt.widgets.Button;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
+import org.eclipse.swt.widgets.Label;
+import org.eclipse.swt.widgets.Layout;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.Text;
+import org.eclipse.swt.widgets.Widget;
+
+public class DocTableFieldEditor extends FieldEditor {
+
+	private Composite baseComp;
+	private TableViewer tableViewer;
+
+	public DocTableFieldEditor(String name, String labelText, Composite comp) {
+		super(name, labelText, comp);
+	}
+
+	@Override
+	protected void adjustForNumColumns(int numColumns) {
+		GridData layoutData = (GridData) baseComp.getLayoutData();
+		layoutData.horizontalSpan = numColumns;
+	}
+	
+	protected Composite createBaseComposite(Composite parent, int numColumns) {
+		Composite result = new Composite(parent,SWT.NONE);
+		GridData gd = new GridData(GridData.FILL_BOTH);
+		gd.horizontalSpan = numColumns;
+		result.setLayoutData(gd);
+		result.setLayout(new GridLayout(1,false));
+		return result;
+	}
+	protected Label createLabel(Composite parent) {
+		Label labelControl = getLabelControl(parent);
+		labelControl.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		return labelControl;
+	}
+	
+	protected SashForm createSashForm(Composite parent) {
+		final SashForm splitComp = new SashForm(parent,SWT.NONE);
+		splitComp.setLayoutData(new GridData(GridData.FILL_BOTH));
+		splitComp.addControlListener(new ControlAdapter() {
+			@Override
+			public void controlResized(ControlEvent e) {
+				int width = splitComp.getBounds().width;
+				double percent = (width -100.0) / width;
+				int weight = (int)Math.round(percent*100);
+				splitComp.setWeights(new int[] {weight, 100 - weight});				
+			}
+		});
+		return splitComp;
+	}
+	
+	protected TableViewer createTableViewer(Composite parent) {
+		Composite tableComp = new Composite(parent,SWT.NONE);
+		tableComp.setLayout(new TableColumnLayout());
+		
+		TableViewer tableViewer = new TableViewer(tableComp, SWT.MULTI|SWT.BORDER|SWT.FULL_SELECTION);
+		tableViewer.setContentProvider(new ArrayContentProvider());
+		tableViewer.getTable().setHeaderVisible(true);
+		tableViewer.getTable().setLinesVisible(true);
+		
+		createTableViwerColumn(tableViewer,"Name",new ColumnLabelProvider(){
+			@Override
+			public String getText(Object element) {
+				if (element instanceof DocItem) {
+					DocItem item = (DocItem) element;
+					return item.name;
+				}
+				return super.getText(element);
+			}
+		}, new ColumnWeightData(1,50,true));
+		
+		createTableViwerColumn(tableViewer,"Url",new ColumnLabelProvider(){
+			@Override
+			public String getText(Object element) {
+				if (element instanceof DocItem) {
+					DocItem item = (DocItem) element;
+					return item.url;
+				}
+				return super.getText(element);
+			}
+		}, new ColumnWeightData(5,250,true));
+		return tableViewer;
+	}
+	
+	private void createTableViwerColumn(TableViewer tableViewer2, String string, CellLabelProvider labelProvider, ColumnLayoutData layoutData) {
+		TableViewerColumn viewerNameColumn = new TableViewerColumn(tableViewer2, SWT.NONE);
+		viewerNameColumn.getColumn().setText(string);
+		viewerNameColumn.setLabelProvider(labelProvider);
+		Layout layout = tableViewer2.getControl().getParent().getLayout();
+		if (layout instanceof TableColumnLayout) {
+			((TableColumnLayout) layout).setColumnData(viewerNameColumn.getColumn(), layoutData);
+		}
+	}
+
+	protected Button createButton(Composite parent, String label, SelectionListener listener) {
+		Button button = new Button(parent, SWT.PUSH);
+		button.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+		button.setText(label);
+		button.addSelectionListener(listener);
+		return button;
+	}
+	protected Composite createButtons(Composite parent) {
+		Composite buttonsComp = new Composite(parent,SWT.NONE);
+		buttonsComp.setLayout(new GridLayout(1,true));
+		
+		createButton(buttonsComp, "Add", new SelectionAdapter(){
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				DocItem item = new DocItem("New","");
+				boolean doAdd = doEdit(item);
+				if (doAdd) {
+					Object[] input = (Object[]) tableViewer.getInput();
+					List<Object> list = new ArrayList<Object>();
+					list.addAll(Arrays.asList(input));
+					list.add(item);
+					tableViewer.setInput(list.toArray());
+				}
+			}
+		});
+		createButton(buttonsComp,"Remove",new SelectionAdapter(){
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				IStructuredSelection selection = (IStructuredSelection) tableViewer.getSelection();
+				Object firstElement = selection.getFirstElement();
+				Object[] input = (Object[]) tableViewer.getInput();
+				List<Object> list = new ArrayList<Object>();
+				list.addAll(Arrays.asList(input));
+				list.remove(firstElement);
+				tableViewer.setInput(list.toArray());
+			}
+		});
+		createButton(buttonsComp,"Edit",new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				IStructuredSelection selection = (IStructuredSelection) tableViewer.getSelection();
+				Object firstElement = selection.getFirstElement();
+				if (firstElement instanceof DocItem) {
+					doEdit((DocItem)firstElement);
+					tableViewer.refresh();
+				}
+			}
+		});
+		return buttonsComp;
+	}
+	protected boolean doEdit(DocItem item) {
+		EditDialog dialog = new EditDialog(tableViewer.getControl().getShell(),item.name,item.url);
+		dialog.open();
+		IStatus status = dialog.getStatus();
+		if (status.getCode() == IStatus.OK) {
+			item.name = dialog.getNameText();
+			item.url = dialog.getUrlText();
+			return true;
+		}
+		return false;
+	}
+
+	@Override
+	protected void doFillIntoGrid(Composite parent, int numColumns) {
+		baseComp = createBaseComposite(parent, numColumns);
+		createLabel(baseComp);
+		SashForm sashForm = createSashForm(baseComp);
+		tableViewer = createTableViewer(sashForm);
+		createButtons(sashForm);
+	}
+
+	@Override
+	protected void doLoad() {
+		if (tableViewer != null) {
+			String value = getPreferenceStore().getString(getPreferenceName());
+			Object[] objects = deserializeValue(value);
+			tableViewer.setInput(objects);
+		}
+	}
+
+	@Override
+	protected void doLoadDefault() {
+		if (tableViewer != null) {
+			String value = getPreferenceStore().getDefaultString(getPreferenceName());
+			Object[] objects = deserializeValue(value);
+			tableViewer.setInput(objects);
+		}
+	}
+
+	protected static Object[] deserializeValue(String value) {
+		if (value == null) return new Object[0];
+		List<Object> list = new ArrayList<Object>();
+		value = value.trim();
+		if (value.length() == 0) return new Object[0];
+		if (Pattern.matches("('[^']*')([,;]('[^']*'))*", value)) {
+			// rows
+			for (String part:value.split(";")) {
+				// items
+				String[] items = part.split(",");
+				if (items.length == 0) continue;
+				String item = items[0].substring(1, items[0].length()-1);
+				if (items.length == 1) {
+					list.add(new DocItem("New",item));
+				} else if (items.length == 2) {
+					String url = items[1].substring(1, items[1].length()-1);
+					list.add(new DocItem(item,url));
+				}
+			}
+		} else {
+			// try to reconstruct from old schema
+			for (String part:value.split(" ;,")) {
+				list.add(new DocItem("New",part));
+			}
+		}
+		return list.toArray();
+	}
+	
+	protected static String serializeValue(Object[] items) {
+		StringBuilder value = new StringBuilder();
+		for (Object item:items){
+			if (value.length()!=0)
+				value.append(";");
+			value.append(item.toString());
+		}
+		return value.toString();
+	}
+
+	@Override
+	protected void doStore() {
+		Object[] items = (Object[])tableViewer.getInput();
+		getPreferenceStore().setValue(getPreferenceName(), serializeValue(items));
+	}
+
+	@Override
+	public int getNumberOfControls() {
+		return 1;
+	}
+	public static class DocItem {
+		protected String url;
+		protected String name;
+
+		public DocItem(String name, String url) {
+			this.name = name;
+			this.url = url;
+		}
+		@Override
+		public String toString() {
+			StringBuilder builder = new StringBuilder();
+			builder.append('\'').append(name).append('\'');
+			builder.append(',');
+			builder.append('\'').append(url).append('\'');
+			return builder.toString();
+		}
+	}
+	public static class EditDialog extends StatusDialog {
+
+		private Text nameText;
+		private Text urlText;
+		private String name;
+		private String url;
+
+		public EditDialog(Shell parent, String initialName, String initialUrl) {
+			super(parent);
+			this.name = initialName;
+			this.url = initialUrl;
+		}
+		public String getUrlText() {
+			return url;
+		}
+		public String getNameText() {
+			return name;
+		}
+		@Override
+		protected Control createDialogArea(Composite ancestor) {
+			Composite parent= new Composite(ancestor, SWT.NONE);
+			parent.setLayout(new GridLayout(2,false));
+			
+			ModifyListener listener= new ModifyListener() {
+				public void modifyText(ModifyEvent e) {
+					doTextChanged(e.widget);
+				}
+			};
+			
+			Label description = createLabel(parent, "Please add a name and a valid url to an asdoc folder.");
+			GridData gd = new GridData(GridData.FILL_HORIZONTAL);
+			gd.horizontalSpan = 2;
+			description.setLayoutData(gd);
+			
+			createLabel(parent, "Name");
+			nameText = createText(parent, name);
+			nameText.addModifyListener(listener);
+			
+			createLabel(parent, "Url");
+			urlText = createText(parent, url);
+			urlText.addModifyListener(listener);
+			
+			return parent;
+		}
+		protected void doTextChanged(Widget widget) {
+			updateStatus(checkValid());
+		}
+		public IStatus checkValid() {
+			if (nameText == null || urlText == null)
+				return EditDialogStatus.INVALID_STATUS;
+			name = nameText.getText().trim();
+			url = urlText.getText().trim();
+			if (name == null || url == null)
+				return EditDialogStatus.INVALID_STATUS;
+			if (name.length() == 0)
+				return EditDialogStatus.getInvalidStatus("name must be set");
+			if (url.length() == 0)
+				return EditDialogStatus.getInvalidStatus("url must be set");
+			File file = new File(URI.create(url));
+			if (!file.exists())
+				return EditDialogStatus.getInvalidStatus("url must exist");
+			if (!file.isDirectory())
+				return EditDialogStatus.getInvalidStatus("url must point to a directory");
+			return EditDialogStatus.OK_STATUS;
+		}
+		private Label createLabel(Composite parent, String string) {
+			Label label = new Label(parent, SWT.NONE);
+			label.setText(string);
+			label.setLayoutData(new GridData());
+			return label;
+		}
+		private Text createText(Composite parent, String string) {
+			Text text= new Text(parent, SWT.BORDER);
+			text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
+			text.setText(string);
+			return text;
+		}
+	}
+	public static class EditDialogStatus extends Status {
+		public static final IStatus INVALID_STATUS = getInvalidStatus("Error");
+		public EditDialogStatus(int severity, String pluginId,
+				int code, String message, Throwable exception) {
+			super(severity, pluginId, code, message, exception);
+		}
+		public static IStatus getInvalidStatus(String message) {
+			return getInvalidStatus(message, null);
+		}
+		public static IStatus getInvalidStatus(String message, Throwable exception) {
+			return new EditDialogStatus(ERROR, AXDocPlugin.PLUGIN_ID, ERROR, message, exception);
+		}
+	}
+}
Index: org.axdt.axdoc/src/org/axdt/axdoc/util/AXDocParser.java
===================================================================
--- org.axdt.axdoc/src/org/axdt/axdoc/util/AXDocParser.java	(revision 87f02d16be3ad1849f47a8a1e5c588a5924d4677)
+++ org.axdt.axdoc/src/org/axdt/axdoc/util/AXDocParser.java	(revision 85b4650e22de85722d0e932da31e0104e8a88327)
@@ -12,8 +12,7 @@
 import org.axdt.axdoc.model.AXEntryType;
 import org.axdt.axdoc.model.AXIndex;
+import org.axdt.axdoc.model.AXIndexNode;
 import org.axdt.axdoc.model.AXLevel;
-import org.axdt.axdoc.model.AXPackage;
 import org.axdt.axdoc.model.AXRoot;
-import org.axdt.axdoc.model.AXType;
 import org.axdt.axdoc.model.util.AXUtil;
 import org.w3c.dom.DOMException;
@@ -118,9 +117,9 @@
 		root.setLevel(AXLevel.PACKAGE);
 	}
-	public void setDoc(AXIndex packageIndex, Node docNode) {
+	public void setDoc(AXIndexNode node, Node docNode) {
 		if (docNode == null || docNode.getTextContent() == null) return;
 		String docContent = docNode.getTextContent().replaceAll("\\W+"," ").trim();
 		if (docContent.trim().equals("")) return;
-		packageIndex.getOrCreatePackage().getAsdoc().add(docContent); 
+		node.getOrCreateReference().getAsdoc().add(docContent); 
 	}
 	public void parseTypeLevel(AXIndex index) {
@@ -205,16 +204,12 @@
 					}
 					AXEntry typeIndex = index.createEntry(typeName, entryType);
-					AXType typeNode = AXUtil.createType(typeName);
-					// we need to access the package reference and add it there
-					// TODO a shortcut to create axnodes from existing indexnode info would be appropriate 
 					// load type doc summary
 					if (loadSummary) {
 						// remember package detail is ia/a/i
-						Node parent = typeNode.isInterface() ? item.getParentNode() : item;
-						//setDoc(typeNode, parent.getParentNode().getNextSibling());
+						Node parent = AXEntryType.INTERFACE.equals(typeIndex.getType()) ? item.getParentNode() : item;
+						setDoc(typeIndex, parent.getParentNode().getNextSibling());
 					}
-					((AXPackage)index.getReference()).getTypes().add(typeNode);
 					index.getEntries().add(typeIndex);
-					log(3,"[DDD] found type ", typeNode);
+					log(3,"[DDD] found type ", typeIndex);
 				}
 			}
@@ -265,7 +260,8 @@
 		}
 	}
-	private void parseTypeMemberInfo(AXEntry result, Node detail) throws DOMException, XPathExpressionException {
+	private void parseTypeMemberInfo(AXEntry typeIndex, Node detail) throws DOMException, XPathExpressionException {
 		String headerType = parseTypeMemberHeader(detail);
 		if ("Example".equals(headerType)) return;
+		// TODO handle events
 		if ("Event".equals(headerType)) return;
 		Node child = detail.getFirstChild();
@@ -273,8 +269,6 @@
 		String childCode = child.getTextContent().trim();
 		log(3,"[DDD] found detail: "+ childCode);
-		AXEntry memberIndex = result.createEntry(childCode, AXEntryType.METHOD);
-		//AXUtil.createMember(childCode);
-		//((AXType)result.getReference()).getMembers().add(memberNode);
-		result.getEntries().add(memberIndex);
+		AXEntry memberIndex = typeIndex.createEntry(childCode, AXEntryType.METHOD);
+		typeIndex.getEntries().add(memberIndex);
 		child = child.getNextSibling();
 		boolean isGetterSetter = child.getNodeType() == Node.TEXT_NODE;
Index: org.axdt.axdoc/src/org/axdt/axdoc/util/Index0r.java
===================================================================
--- org.axdt.axdoc/src/org/axdt/axdoc/util/Index0r.java	(revision 87f02d16be3ad1849f47a8a1e5c588a5924d4677)
+++ org.axdt.axdoc/src/org/axdt/axdoc/util/Index0r.java	(revision 85b4650e22de85722d0e932da31e0104e8a88327)
@@ -14,4 +14,5 @@
 import org.axdt.axdoc.model.AXRootType;
 import org.axdt.axdoc.model.util.AXUtil;
+import org.axdt.axdoc.preferences.AXDocPreferences;
 import org.eclipse.core.runtime.Path;
 import org.eclipse.emf.common.CommonPlugin;
@@ -27,6 +28,8 @@
 	
 	public static Index0r getInstance() {
-		if (instance == null)
+		if (instance == null) {
 			instance = new Index0r();
+			AXDocPreferences.checkAXDocPaths(instance);
+		}
 		return instance;
 	}
@@ -39,5 +42,8 @@
 		roots = new HashMap<String, AXRoot>();
 		docParser = new AXDocParser();
-		baseURI = CommonPlugin.resolve(URI.createURI("platform:/meta/"+AXDocPlugin.PLUGIN_ID));
+		baseURI = createBaseUri();
+	}
+	protected URI createBaseUri() {
+		return CommonPlugin.resolve(URI.createURI("platform:/meta/"+AXDocPlugin.PLUGIN_ID));
 	}
 	public AXIndexNode[] find(String qname) {
@@ -112,4 +118,7 @@
 		return root;
 	}
+	public AXRoot[] getRoots() {
+		return roots.values().toArray(new AXRoot[roots.size()]);
+	}
 	public void initialize(AXRoot root, AXLevel level) {
 		if (root.getRootType() == AXRootType.ASDOC) {
Index: org.axdt.common/src/org/axdt/common/AxdtPlugin.java
===================================================================
--- org.axdt.common/src/org/axdt/common/AxdtPlugin.java	(revision 87f02d16be3ad1849f47a8a1e5c588a5924d4677)
+++ org.axdt.common/src/org/axdt/common/AxdtPlugin.java	(revision 85b4650e22de85722d0e932da31e0104e8a88327)
@@ -3,5 +3,4 @@
 import java.net.URL;
 
-import org.axdt.common.preferences.AxdtPreferences;
 import org.eclipse.core.runtime.FileLocator;
 import org.eclipse.core.runtime.Path;
Index: org.axdt.help/.gitignore
===================================================================
--- org.axdt.help/.gitignore	(revision 85b4650e22de85722d0e932da31e0104e8a88327)
+++ org.axdt.help/.gitignore	(revision 85b4650e22de85722d0e932da31e0104e8a88327)
@@ -0,0 +1,2 @@
+*
+!.gitignore
