diff -x CVS -Naur xjavadoc-cvs/javacc/Java1.5x.jjt xjavadoc-03112005/javacc/Java1.5x.jjt
--- xjavadoc-cvs/javacc/Java1.5x.jjt	2005-08-19 07:43:07.000000000 +0200
+++ xjavadoc-03112005/javacc/Java1.5x.jjt	2005-10-25 09:09:14.000000000 +0200
@@ -1810,19 +1810,41 @@
    PrimitiveType()
 }
 
-void ReferenceType():
-{}
+String ReferenceType():
+{
+	Token primitive;
+	StringBuffer sb = new StringBuffer(); 
+	String clazz = "";
+}
 {
-   PrimitiveType() ( LOOKAHEAD(2) "[" "]" )+
+   (primitive=PrimitiveType() {
+   		sb.append(primitive.image);
+   }
+   ( LOOKAHEAD(2) "[" "]" 
+   	{
+   		sb.append("[]");
+   	}
+   )+
   |
-   ( ClassOrInterfaceType() ) ( LOOKAHEAD(2) "[" "]" )*
+   ( clazz = ClassOrInterfaceType()
+   	{ sb.append(clazz); }
+   ) 
+   ( LOOKAHEAD(2) "[" "]"
+   	{
+   		sb.append("[]");
+	} 
+   )*
+   )
+   {
+	   return sb.toString();
+   }
 }
 
 String ClassOrInterfaceType():
 {
-    //todo - include generics
     StringBuffer sb = new StringBuffer();
     Token t = null;
+    String generics = "";
 }
 {
   t=<IDENTIFIER>
@@ -1830,39 +1852,73 @@
     sb.append(t.image);
   }
 
-  [ LOOKAHEAD(2) TypeArguments() ]
+  [ LOOKAHEAD(2) generics = TypeArguments() 
+  {
+  	sb.append(generics);
+  }
+  ] 
 
   ( LOOKAHEAD(2)
     "." t=<IDENTIFIER>
     {
       sb.append(".").append(t.image);
     }
-    [ LOOKAHEAD(2) TypeArguments() ] )*
+    [ LOOKAHEAD(2) generics = TypeArguments() ] 
+     {
+	     sb.append(generics);
+     }
+		       
+    )*
 
    {
     return sb.length() > 0 ? sb.toString() : null;
    }
 }
 
-void TypeArguments():
-{}
+String TypeArguments():
 {
-   "<" TypeArgument() ( "," TypeArgument() )* ">"
+	String ret = "";
+	StringBuffer sb = new StringBuffer();
+}
+{
+   "<" ret = TypeArgument() {
+		   		sb.append("<").append(ret);
+   			    }
+   ( "," ret = TypeArgument()
+   	{
+   		sb.append(ret);
+   	}
+   )* ">" 
+   {
+   	sb.append(">");
+   }
+   { 
+	return sb.toString();
+   }
+   
 }
 
-void TypeArgument():
-{}
+String TypeArgument():
 {
-   (ReferenceType() [ WildcardBounds() ])
+	String ret = "";
+}
+{
+   (ret = ReferenceType() [ WildcardBounds() ])
+   {
+   	return ret;
+   }
  |
    ("?" [ WildcardBounds() ])
-
+   {
+	   return ret;
+   }
 }
 
 void WildcardBounds():
-{}
 {
-   "extends" ReferenceType()
+}
+{
+   "extends" ReferenceType() 
  |
    "super" ReferenceType()
 }
diff -x CVS -Naur xjavadoc-cvs/src/xjavadoc/SourceClass.java xjavadoc-03112005/src/xjavadoc/SourceClass.java
--- xjavadoc-cvs/src/xjavadoc/SourceClass.java	2004-10-02 01:07:21.000000000 +0200
+++ xjavadoc-03112005/src/xjavadoc/SourceClass.java	2005-12-05 12:54:32.000000000 +0100
@@ -10,7 +10,7 @@
 
 import java.util.*;
 import java.io.*;
-
+import java.util.regex.*;
 /**
  * This class represents a class for which the source code is available
  *XJavaDocFil
@@ -463,7 +463,7 @@
 			_qualifiedClasses.put( unqualifiedClassName, result );
 		}
 
-		return result;
+		return result ;
 	}
 
 	public void reset()
@@ -476,16 +476,23 @@
 		_qualifiedClasses.clear();
 	}
 
-	private final String unqualifiedNameInImportedClasses( final String unqualifiedClassName )
+	private final String unqualifiedNameInImportedClasses( String unqualifiedClassName )
 	{
 		if( !hasImportedClasses() )
 		{
 			return null;
 		}
-
+		
+		// Look out for the generics !!
+		// Remove them before searching
+		String[] results = removeGenerics(unqualifiedClassName);
+		unqualifiedClassName = results[0];
+		String generics = results[1];
+		
 		final String suffix = "." + unqualifiedClassName;
 		String candidate = null;
 
+		//System.out.println("unqualifiedNameInImportedClasses: suffix [" + suffix + "]");
 		for( Iterator i = getImportedClasses().iterator(); i.hasNext();  )
 		{
 			XClass clazz = ( XClass ) i.next();
@@ -505,10 +512,10 @@
 				}
 			}
 		}
-		return candidate;
+		return candidate == null ? candidate : candidate + generics;
 	}
 
-	private final XClass unqualifiedNameInImportedClassesInnerClasses( final String unqualifiedClassName )
+	private final XClass unqualifiedNameInImportedClassesInnerClasses( String unqualifiedClassName )
 	{
 		if( !hasImportedClasses() )
 		{
@@ -516,7 +523,6 @@
 		}
 
 		XClass candidate = null;
-
 		for( Iterator i = getImportedClasses().iterator(); i.hasNext();  )
 		{
 			XClass clazz = ( XClass ) i.next();
@@ -550,7 +556,7 @@
 	 * @param unqualifiedClassName  Describe what the parameter does
 	 * @return                      Describe the return value
 	 */
-	private final String unqualifiedNameInInnerClasses( final String unqualifiedClassName )
+	private final String unqualifiedNameInInnerClasses( String unqualifiedClassName )
 	{
 		if( !hasInnerClasses() )
 		{
@@ -560,7 +566,10 @@
 		final String innerClassName = getQualifiedName() + '.' + unqualifiedClassName;
 
 		String candidate = null;
-
+		String[] results = removeGenerics(unqualifiedClassName);
+		unqualifiedClassName = results[0];
+		String generics = results[1];
+		
 		for( Iterator i = getInnerClasses().iterator(); i.hasNext();  )
 		{
 			XClass innerClass = ( XClass ) i.next();
@@ -572,7 +581,7 @@
 				break;
 			}
 		}
-		return candidate;
+		return candidate == null ? candidate : candidate + generics;
 	}
 
 	/**
@@ -603,10 +612,13 @@
 	 * @param unqualifiedClassName  Name of the class to resolve
 	 * @return                      The qualified name of the inner class.
 	 */
-	private final String unqualifiedNameInInnerClassesOfSuperClass( final String unqualifiedClassName )
+	private final String unqualifiedNameInInnerClassesOfSuperClass( String unqualifiedClassName )
 	{
-        XClass clazz = getXJavaDoc().getXClass(getQualifiedName());
-        XClass superClazz = clazz.getSuperclass();
+		XClass clazz = getXJavaDoc().getXClass(getQualifiedName());
+		XClass superClazz = clazz.getSuperclass();
+		String[] results = removeGenerics(unqualifiedClassName);
+		unqualifiedClassName = results[0];
+		String generics = results[1];
         while (superClazz != null && ! superClazz.getQualifiedName().equals("java.lang.Object")) {
 		    String innerClassName = superClazz.getQualifiedName() + '.' + unqualifiedClassName;
             for( Iterator i = superClazz.getInnerClasses().iterator(); i.hasNext();  )
@@ -615,7 +627,7 @@
                 String qualifiedClassName = innerClass.getQualifiedName();
                 if( innerClassName.equals( qualifiedClassName ) )
                 {
-                    return qualifiedClassName;
+                    return qualifiedClassName + generics;
                 }
             }
             superClazz = superClazz.getSuperclass();
@@ -629,16 +641,18 @@
 	 * @param unqualifiedClassName  Describe what the parameter does
 	 * @return                      Describe the return value
 	 */
-	private final String unqualifiedNameInImportedPackages( final String unqualifiedClassName )
+	private final String unqualifiedNameInImportedPackages( String unqualifiedClassName )
 	{
 		if( !hasImportedPackages() )
 		{
 			return null;
 		}
-
-		final String suffix = "." + unqualifiedClassName;
+		String[] results = removeGenerics(unqualifiedClassName);
+		unqualifiedClassName = results[0];
+		String generics = results[1];
+		
+		final String suffix = "." + unqualifiedClassName ;
 		String candidate = null;
-
 		for( Iterator i = getImportedPackages().iterator(); i.hasNext();  )
 		{
 			String importedPackageName = ( ( XPackage ) i.next() ).getName();
@@ -657,7 +671,7 @@
 				}
 			}
 		}
-		return candidate;
+		return candidate == null ? candidate : candidate + generics;
 	}
 
 	/**
@@ -667,13 +681,16 @@
 	 * @param unqualifiedClassName
 	 * @return fully qualified class name, or null
 	 */
-	private final String unqualifiedNameInJavaDotLang( final String unqualifiedClassName )
+	private final String unqualifiedNameInJavaDotLang( String unqualifiedClassName )
 	{
+		String[] results = removeGenerics(unqualifiedClassName);
+		unqualifiedClassName = results[0];
+		String generics = results[1];
+		
 		String qualifiedClassName = "java.lang." + unqualifiedClassName;
-
 		if( getXJavaDoc().classExists( qualifiedClassName ) )
 		{
-			return qualifiedClassName;
+			return qualifiedClassName + generics;
 		}
 		else
 		{
@@ -687,10 +704,13 @@
 	 * @param unqualifiedClassName  Describe what the parameter does
 	 * @return                      Describe the return value
 	 */
-	private final String unqualifiedNameInTheSamePackage( final String unqualifiedClassName )
+	private final String unqualifiedNameInTheSamePackage( String unqualifiedClassName )
 	{
 		String qualifiedClassName;
-
+		String[] results = removeGenerics(unqualifiedClassName);
+		unqualifiedClassName = results[0];
+		String generics = results[1];
+		
 		if( getContainingPackage().getName().equals( "" ) )
 		{
 			qualifiedClassName = unqualifiedClassName;
@@ -702,7 +722,7 @@
 
 		if( getXJavaDoc().classExists( qualifiedClassName ) )
 		{
-			return qualifiedClassName;
+			return qualifiedClassName + generics;
 		}
 		else
 		{
@@ -711,13 +731,17 @@
 
 	}
 
-	private final String unqualifiedNameInTheSameClassAsAnInnerClass( final String unqualifiedClassName )
+	private final String unqualifiedNameInTheSameClassAsAnInnerClass( String unqualifiedClassName )
 	{
+		String[] results = removeGenerics(unqualifiedClassName);
+		unqualifiedClassName = results[0];
+		String generics = results[1];
+		
 		//containing class=com.p.A, inner-reference=B ->com.p.A.B
 		String qualifiedClassName = getQualifiedName() + '.' + unqualifiedClassName;
 
 		if( getXJavaDoc().classExists( qualifiedClassName ) )
-			return qualifiedClassName;
+			return qualifiedClassName + generics;
 
 		//containing class=com.p.A, inner-reference=A.B ->com.p.A.B
 		if( getContainingPackage().getName().equals( "" ) )
@@ -730,7 +754,7 @@
 		}
 
 		if( getXJavaDoc().classExists( qualifiedClassName ) )
-			return qualifiedClassName;
+			return qualifiedClassName + generics;
 
 		return null;
 	}
@@ -771,4 +795,20 @@
 			System.err.println( "Error parsing " + cls + ':' + e.getMessage() );
 		}
 	}
+	
+	/**
+	 * Remove the generics annotation if there is one from the
+	 * unqualifiedClassName and return it as first element of the String array.
+	 * Return the generics as 2snd element of the String array if there is one.
+	 * If there is none, return an empty string.
+	 */
+	private String[] removeGenerics(String unqualifiedClassName) {
+		int index;
+		String generics = "";
+		if ((index = unqualifiedClassName.indexOf("<")) != -1) {
+			generics = unqualifiedClassName.substring(index);
+			unqualifiedClassName = unqualifiedClassName.substring(0, index);
+		}
+		return new String[] { unqualifiedClassName, generics };
+	}
 }
