diff --git a/tools/droiddoc/src/AnnotationInstanceInfo.java b/tools/droiddoc/src/AnnotationInstanceInfo.java
index 07d4aa3..c4abc7e 100644
--- a/tools/droiddoc/src/AnnotationInstanceInfo.java
+++ b/tools/droiddoc/src/AnnotationInstanceInfo.java
@@ -35,6 +35,7 @@
         return mElementValues;
     }
 
+    @Override
     public String toString()
     {
         StringBuilder str = new StringBuilder();
diff --git a/tools/droiddoc/src/AttrTagInfo.java b/tools/droiddoc/src/AttrTagInfo.java
index abc5452..7f1b4d9 100644
--- a/tools/droiddoc/src/AttrTagInfo.java
+++ b/tools/droiddoc/src/AttrTagInfo.java
@@ -98,7 +98,8 @@
     public FieldInfo reference() {
         return REF_COMMAND.equals(mCommand) ? mRefField : null;
     }
-    
+
+    @Override
     public String name() {
         return NAME_COMMAND.equals(mCommand) ? mAttrName : null;
     }
@@ -107,6 +108,7 @@
         return DESCRIPTION_COMMAND.equals(mCommand) ? mDescrComment : null;
     }
 
+    @Override
     public void makeHDF(HDF data, String base)
     {
         super.makeHDF(data, base);
diff --git a/tools/droiddoc/src/ClassInfo.java b/tools/droiddoc/src/ClassInfo.java
index 5c61941..32078f9 100644
--- a/tools/droiddoc/src/ClassInfo.java
+++ b/tools/droiddoc/src/ClassInfo.java
@@ -101,7 +101,7 @@
         mSelfFields = null;
         mSelfAttributes = null;
         mDeprecatedKnown = false;
-        
+
         Arrays.sort(mEnumConstants, FieldInfo.comparator);
         Arrays.sort(mInnerClasses, ClassInfo.comparator);
     }
@@ -111,16 +111,16 @@
         // objects
         selfAttributes();
     }
-    
+
     public void init3(TypeInfo[] types, ClassInfo[] realInnerClasses){
       mTypeParameters = types;
       mRealInnerClasses = realInnerClasses;
     }
-    
+
     public ClassInfo[] getRealInnerClasses(){
       return mRealInnerClasses;
     }
-    
+
     public TypeInfo[] getTypeParameters(){
       return mTypeParameters;
     }
@@ -146,6 +146,7 @@
         }
     }
 
+    @Override
     public ContainerInfo parent()
     {
         return this;
@@ -351,7 +352,7 @@
     {
         return comment().briefTags();
     }
-    
+
     public boolean isDeprecated() {
         boolean deprecated = false;
         if (!mDeprecatedKnown) {
@@ -551,7 +552,7 @@
     public MethodInfo[] allSelfMethods() {
         return mAllSelfMethods;
     }
-    
+
     public void addMethod(MethodInfo method) {
         MethodInfo[] methods = new MethodInfo[mAllSelfMethods.length + 1];
         int i = 0;
@@ -596,7 +597,7 @@
                     }
                 }
             }
-            
+
             //constructors too
            for (MethodInfo m: constructors()) {
               for (AttrTagInfo tag: m.comment().attrTags()) {
@@ -1136,7 +1137,7 @@
         if (kind != null) {
             data.setValue(base + ".kind", kind);
         }
-        
+
         // xml attributes
         i=0;
         for (AttributeInfo attr: cl.selfAttributes()) {
@@ -1170,6 +1171,7 @@
         }
     }
 
+    @Override
     public boolean isHidden()
     {
         int val = mHidden;
@@ -1301,7 +1303,7 @@
                 return f;
             }
         }
-        
+
         // then look at our enum constants (these are really fields, maybe
         // they should be mixed into fields().  not sure)
         for (FieldInfo f: enumConstants()) {
@@ -1346,11 +1348,11 @@
             return false;
         }
     }
-    
+
     public void setNonWrittenConstructors(MethodInfo[] nonWritten) {
         mNonWrittenConstructors = nonWritten;
     }
-    
+
     public MethodInfo[] getNonWrittenConstructors() {
         return mNonWrittenConstructors;
     }
@@ -1377,23 +1379,24 @@
         }
         return null;
     }
-    
+
     public void setHiddenMethods(MethodInfo[] mInfo){
         mHiddenMethods = mInfo;
     }
     public MethodInfo[] getHiddenMethods(){
         return mHiddenMethods;
     }
+    @Override
     public String toString(){
         return this.qualifiedName();
     }
-    
+
     public void setReasonIncluded(String reason) {
         mReasonIncluded = reason;
     }
-    
+
     public String getReasonIncluded() {
-        return mReasonIncluded; 
+        return mReasonIncluded;
     }
 
     private ClassDoc mClass;
diff --git a/tools/droiddoc/src/Comment.java b/tools/droiddoc/src/Comment.java
index 3f1bf6c..f9b9dc2 100644
--- a/tools/droiddoc/src/Comment.java
+++ b/tools/droiddoc/src/Comment.java
@@ -206,7 +206,7 @@
         for (int i=0; i<N; i++) {
             if (mInlineTagsList.get(i).name().equals("@more")) {
                 more = i;
-            } 
+            }
         }
           if (more >= 0) {
             for (int i=0; i<more; i++) {
@@ -225,7 +225,7 @@
                     }
                 }
                 mBriefTagsList.add(t);
-                
+
             }
         }
     }
@@ -312,7 +312,7 @@
             return b;
         }
     }
-    
+
     public boolean isDocOnly() {
         if (mDocOnly >= 0) {
             return mDocOnly != 0;
@@ -391,5 +391,5 @@
     ArrayList<TagInfo> mUndeprecateTagsList = new ArrayList<TagInfo>();
     ArrayList<AttrTagInfo> mAttrTagsList = new ArrayList<AttrTagInfo>();
 
-    
+
 }
diff --git a/tools/droiddoc/src/Converter.java b/tools/droiddoc/src/Converter.java
index 4014f7f..ee911f4 100644
--- a/tools/droiddoc/src/Converter.java
+++ b/tools/droiddoc/src/Converter.java
@@ -238,6 +238,7 @@
     }
     private static Cache mClasses = new Cache()
     {
+        @Override
         protected Object make(Object o)
         {
             ClassDoc c = (ClassDoc)o;
@@ -268,19 +269,21 @@
             }
             return cl;
         }
+        @Override
         protected void made(Object o, Object r)
         {
             if (mClassesNeedingInit == null) {
                 initClass((ClassDoc)o, (ClassInfo)r);
                 ((ClassInfo)r).init2();
             }
-        } 
+        }
+        @Override
         ClassInfo[] all()
         {
             return (ClassInfo[])mCache.values().toArray(new ClassInfo[mCache.size()]);
         }
     };
-    
+
     private static MethodInfo[] getHiddenMethods(MethodDoc[] methods){
       if (methods == null) return null;
       ArrayList<MethodInfo> out = new ArrayList<MethodInfo>();
@@ -342,7 +345,7 @@
         }
         return out.toArray(new MethodInfo[out.size()]);
     }
-    
+
     private static MethodInfo[] convertNonWrittenConstructors(ConstructorDoc[] methods)
     {
         if (methods == null) return null;
@@ -367,6 +370,7 @@
     }
     private static Cache mMethods = new Cache()
     {
+        @Override
         protected Object make(Object o)
         {
             if (o instanceof AnnotationTypeElementDoc) {
@@ -374,7 +378,7 @@
                 MethodInfo result = new MethodInfo(
                                 m.getRawCommentText(),
                                 Converter.convertTypes(m.typeParameters()),
-                                m.name(), m.signature(), 
+                                m.name(), m.signature(),
                                 Converter.obtainClass(m.containingClass()),
                                 Converter.obtainClass(m.containingClass()),
                                 m.isPublic(), m.isProtected(),
@@ -399,7 +403,7 @@
                 MethodInfo result = new MethodInfo(
                                 m.getRawCommentText(),
                                 Converter.convertTypes(m.typeParameters()),
-                                m.name(), m.signature(), 
+                                m.name(), m.signature(),
                                 Converter.obtainClass(m.containingClass()),
                                 Converter.obtainClass(m.containingClass()),
                                 m.isPublic(), m.isProtected(),
@@ -424,7 +428,7 @@
                 MethodInfo result = new MethodInfo(
                                 m.getRawCommentText(),
                                 Converter.convertTypes(m.typeParameters()),
-                                m.name(), m.signature(), 
+                                m.name(), m.signature(),
                                 Converter.obtainClass(m.containingClass()),
                                 Converter.obtainClass(m.containingClass()),
                                 m.isPublic(), m.isProtected(),
@@ -472,6 +476,7 @@
     }
     private static Cache mFields = new Cache()
     {
+        @Override
         protected Object make(Object o)
         {
             FieldDoc f = (FieldDoc)o;
@@ -496,6 +501,7 @@
     }
     private static Cache mPackagees = new Cache()
     {
+        @Override
         protected Object make(Object o)
         {
             PackageDoc p = (PackageDoc)o;
@@ -510,7 +516,8 @@
     }
     private static Cache mTypes = new Cache()
     {
-       protected Object make(Object o)
+       @Override
+    protected Object make(Object o)
        {
            Type t = (Type)o;
            String simpleTypeName;
@@ -524,6 +531,7 @@
                    Converter.obtainClass(t.asClassDoc()));
            return ti;
        }
+        @Override
         protected void made(Object o, Object r)
         {
             Type t = (Type)o;
@@ -545,8 +553,9 @@
                              Converter.convertTypes(t.asWildcardType().extendsBounds()));
             }
         }
+        @Override
         protected Object keyFor(Object o)
-        {  
+        {
             Type t = (Type)o;
             String keyString = o.getClass().getName() + "/" + o.toString() + "/";
             if (t.asParameterizedType() != null){
@@ -584,13 +593,13 @@
             }else{
               keyString += "NoWildCardType//";
             }
-            
-            
-            
+
+
+
             return keyString;
         }
     };
-    
+
 
 
     private static MemberInfo obtainMember(MemberDoc o)
@@ -599,6 +608,7 @@
     }
     private static Cache mMembers = new Cache()
     {
+        @Override
         protected Object make(Object o)
         {
             if (o instanceof MethodDoc) {
@@ -633,6 +643,7 @@
     }
     private static Cache mAnnotationInstances = new Cache()
     {
+        @Override
         protected Object make(Object o)
         {
             AnnotationDesc a = (AnnotationDesc)o;
diff --git a/tools/droiddoc/src/DroidDoc.java b/tools/droiddoc/src/DroidDoc.java
index 39f9393..ef64e36 100644
--- a/tools/droiddoc/src/DroidDoc.java
+++ b/tools/droiddoc/src/DroidDoc.java
@@ -40,7 +40,7 @@
     private static final int TYPE_WIDGET = 1;
     private static final int TYPE_LAYOUT = 2;
     private static final int TYPE_LAYOUT_PARAM = 3;
-    
+
     public static final int SHOW_PUBLIC = 0x00000001;
     public static final int SHOW_PROTECTED = 0x00000003;
     public static final int SHOW_PACKAGE = 0x00000007;
@@ -84,7 +84,7 @@
         }
         return false;
     }
-    
+
     public static boolean start(RootDoc r)
     {
         String keepListFile = null;
@@ -792,7 +792,7 @@
         data.setValue("package.since", pkg.getSince());
         data.setValue("package.descr", "...description...");
 
-        makeClassListHDF(data, "package.interfaces", 
+        makeClassListHDF(data, "package.interfaces",
                          ClassInfo.sortByName(pkg.interfaces()));
         makeClassListHDF(data, "package.classes",
                          ClassInfo.sortByName(pkg.ordinaryClasses()));
@@ -886,7 +886,7 @@
         HDF data = makeHDF();
 
         Collections.sort(keywords);
-        
+
         int i=0;
         for (KeywordEntry entry: keywords) {
             String base = "keywords." + entry.firstChar() + "." + i;
@@ -1074,7 +1074,7 @@
             if (methodName.equals("getRawCommentText")) {
                 return filterComment((String) method.invoke(target, args));
             }
-            
+
             // escape "&" in disjunctive types.
             if (proxy instanceof Type && methodName.equals("toString")) {
                 return ((String) method.invoke(target, args))
@@ -1129,7 +1129,7 @@
             throw new RuntimeException("invalid scope for object " + scoped);
         }
     }
-    
+
     /**
      * Collect the values used by the Dev tools and write them in files packaged with the SDK
      * @param output the ouput directory for the files.
@@ -1139,16 +1139,16 @@
         ArrayList<String> broadcastActions = new ArrayList<String>();
         ArrayList<String> serviceActions = new ArrayList<String>();
         ArrayList<String> categories = new ArrayList<String>();
-        
+
         ArrayList<ClassInfo> layouts = new ArrayList<ClassInfo>();
         ArrayList<ClassInfo> widgets = new ArrayList<ClassInfo>();
         ArrayList<ClassInfo> layoutParams = new ArrayList<ClassInfo>();
-        
+
         ClassInfo[] classes = Converter.allClasses();
 
         // Go through all the fields of all the classes, looking SDK stuff.
         for (ClassInfo clazz : classes) {
-            
+
             // first check constant fields for the SdkConstant annotation.
             FieldInfo[] fields = clazz.allSelfFields();
             for (FieldInfo field : fields) {
@@ -1177,7 +1177,7 @@
                     }
                 }
             }
-            
+
             // Now check the class for @Widget or if its in the android.widget package
             // (unless the class is hidden or abstract, or non public)
             if (clazz.isHidden() == false && clazz.isPublic() && clazz.isAbstract() == false) {
@@ -1196,7 +1196,7 @@
                         }
                     }
                 }
-                
+
                 if (annotated == false) {
                     // lets check if this is inside android.widget
                     PackageInfo pckg = clazz.containingPackage();
@@ -1236,7 +1236,7 @@
 
         Collections.sort(categories);
         writeValues(output + "/categories.txt", categories);
-        
+
         // before writing the list of classes, we do some checks, to make sure the layout params
         // are enclosed by a layout class (and not one that has been declared as a widget)
         for (int i = 0 ; i < layoutParams.size();) {
@@ -1248,10 +1248,10 @@
                 i++;
             }
         }
-        
+
         writeClasses(output + "/widgets.txt", widgets, layouts, layoutParams);
     }
-    
+
     /**
      * Writes a list of values into a text files.
      * @param pathname the absolute os path of the output file.
@@ -1263,7 +1263,7 @@
         try {
             fw = new FileWriter(pathname, false);
             bw = new BufferedWriter(fw);
-            
+
             for (String value : values) {
                 bw.append(value).append('\n');
             }
@@ -1297,7 +1297,7 @@
         try {
             fw = new FileWriter(pathname, false);
             bw = new BufferedWriter(fw);
-            
+
             // write the 3 types of classes.
             for (ClassInfo clazz : widgets) {
                 writeClass(bw, clazz, 'W');
@@ -1340,7 +1340,7 @@
         }
         writer.append('\n');
     }
-    
+
     /**
      * Checks the inheritance of {@link ClassInfo} objects. This method return
      * <ul>
@@ -1348,7 +1348,7 @@
      * <li>{@link #TYPE_WIDGET}: if the class extends <code>android.view.View</code></li>
      * <li>{@link #TYPE_LAYOUT_PARAM}: if the class extends <code>android.view.ViewGroup$LayoutParams</code></li>
      * <li>{@link #TYPE_NONE}: in all other cases</li>
-     * </ul> 
+     * </ul>
      * @param clazz the {@link ClassInfo} to check.
      */
     private static int checkInheritance(ClassInfo clazz) {
@@ -1359,12 +1359,12 @@
         } else if ("android.view.ViewGroup.LayoutParams".equals(clazz.qualifiedName())) {
             return TYPE_LAYOUT_PARAM;
         }
-        
+
         ClassInfo parent = clazz.superclass();
         if (parent != null) {
             return checkInheritance(parent);
         }
-        
+
         return TYPE_NONE;
     }
 }
diff --git a/tools/droiddoc/src/Errors.java b/tools/droiddoc/src/Errors.java
index 95439f1..77852f8 100644
--- a/tools/droiddoc/src/Errors.java
+++ b/tools/droiddoc/src/Errors.java
@@ -41,6 +41,7 @@
             return this.msg.compareTo(that.msg);
         }
 
+        @Override
         public String toString() {
             String whereText = this.pos == null ? "unknown: " : this.pos.toString() + ':';
             return whereText + this.msg;
diff --git a/tools/droiddoc/src/FieldInfo.java b/tools/droiddoc/src/FieldInfo.java
index 1c975e4..d9371e8 100644
--- a/tools/droiddoc/src/FieldInfo.java
+++ b/tools/droiddoc/src/FieldInfo.java
@@ -26,7 +26,7 @@
             return a.name().compareTo(b.name());
         }
     };
-    
+
     public FieldInfo(String name, ClassInfo containingClass, ClassInfo realContainingClass,
                         boolean isPublic, boolean isProtected,
                         boolean isPackagePrivate, boolean isPrivate,
@@ -92,7 +92,7 @@
     {
         return constantLiteralValue(mConstantValue);
     }
-    
+
     public boolean isDeprecated() {
         boolean deprecated = false;
         if (!mDeprecatedKnown) {
@@ -124,7 +124,7 @@
             if (val instanceof Boolean
                     || val instanceof Byte
                     || val instanceof Short
-                    || val instanceof Integer) 
+                    || val instanceof Integer)
             {
                 str = val.toString();
             }
@@ -291,6 +291,7 @@
         }
     }
 
+    @Override
     public boolean isExecutable()
     {
         return false;
diff --git a/tools/droiddoc/src/MemberInfo.java b/tools/droiddoc/src/MemberInfo.java
index 2a2572a..05da583 100644
--- a/tools/droiddoc/src/MemberInfo.java
+++ b/tools/droiddoc/src/MemberInfo.java
@@ -115,6 +115,7 @@
         return mIsSynthetic;
     }
 
+    @Override
     public ContainerInfo parent()
     {
         return mContainingClass;
@@ -130,7 +131,7 @@
     {
         return mKind;
     }
-    
+
     public AnnotationInstanceInfo[] annotations()
     {
         return mAnnotations;
diff --git a/tools/droiddoc/src/MethodInfo.java b/tools/droiddoc/src/MethodInfo.java
index bded88b..3211038 100644
--- a/tools/droiddoc/src/MethodInfo.java
+++ b/tools/droiddoc/src/MethodInfo.java
@@ -25,9 +25,9 @@
             return a.name().compareTo(b.name());
         }
     };
-    
+
     private class InlineTags implements InheritedTags
-    { 
+    {
         public TagInfo[] tags()
         {
             return comment().tags();
@@ -42,7 +42,7 @@
             }
         }
     }
-    
+
     private static void addInterfaces(ClassInfo[] ifaces, ArrayList<ClassInfo> queue)
     {
         for (ClassInfo i: ifaces) {
@@ -79,7 +79,7 @@
         }
         return null;
     }
-    
+
     private static void addRealInterfaces(ClassInfo[] ifaces, ArrayList<ClassInfo> queue)
     {
         for (ClassInfo i: ifaces) {
@@ -92,7 +92,7 @@
             addInterfaces(i.realInterfaces(), queue);
         }
     }
-    
+
     public MethodInfo findRealOverriddenMethod(String name, String signature, HashSet notStrippable) {
         if (mReturnType == null) {
         // ctor
@@ -103,7 +103,7 @@
         }
 
         ArrayList<ClassInfo> queue = new ArrayList<ClassInfo>();
-        if (containingClass().realSuperclass() != null && 
+        if (containingClass().realSuperclass() != null &&
             containingClass().realSuperclass().isAbstract()) {
             queue.add(containingClass());
         }
@@ -121,7 +121,7 @@
         }
         return null;
     }
-    
+
     public MethodInfo findSuperclassImplementation(HashSet notStrippable) {
         if (mReturnType == null) {
             // ctor
@@ -138,7 +138,7 @@
         }
 
         ArrayList<ClassInfo> queue = new ArrayList<ClassInfo>();
-        if (containingClass().realSuperclass() != null && 
+        if (containingClass().realSuperclass() != null &&
                 containingClass().realSuperclass().isAbstract()) {
             queue.add(containingClass());
         }
@@ -154,7 +154,7 @@
         }
         return null;
     }
-    
+
     public ClassInfo findRealOverriddenClass(String name, String signature) {
         if (mReturnType == null) {
         // ctor
@@ -165,7 +165,7 @@
         }
 
         ArrayList<ClassInfo> queue = new ArrayList<ClassInfo>();
-        if (containingClass().realSuperclass() != null && 
+        if (containingClass().realSuperclass() != null &&
             containingClass().realSuperclass().isAbstract()) {
             queue.add(containingClass());
         }
@@ -199,7 +199,7 @@
             }
         }
     }
-    
+
     private class ReturnTags implements InheritedTags {
         public TagInfo[] tags() {
             return comment().returnTags();
@@ -213,7 +213,7 @@
             }
         }
     }
-    
+
     public boolean isDeprecated() {
         boolean deprecated = false;
         if (!mDeprecatedKnown) {
@@ -237,7 +237,7 @@
         }
         return mIsDeprecated;
     }
-    
+
     public TypeInfo[] getTypeParameters(){
         return mTypeParameters;
     }
@@ -274,7 +274,7 @@
 
         // The underlying MethodDoc for an interface's declared methods winds up being marked
         // non-abstract.  Correct that here by looking at the immediate-parent class, and marking
-        // this method abstract if it is an unimplemented interface method. 
+        // this method abstract if it is an unimplemented interface method.
         if (containingClass.isInterface()) {
             isAbstract = true;
         }
@@ -448,7 +448,7 @@
                             + tag.parameterName() + "'");
                 }
             }
-             
+
             // get our parent's tags to fill in the blanks
             MethodInfo overridden = this.findOverriddenMethod(name(), signature());
             if (overridden != null) {
@@ -508,7 +508,7 @@
     {
         return mParameters;
     }
-    
+
 
     public boolean matchesParams(String[] params, String[] dimensions)
     {
@@ -589,6 +589,7 @@
         return result;
     }
 
+    @Override
     public boolean isExecutable()
     {
         return true;
@@ -617,21 +618,23 @@
     {
         return mDefaultAnnotationElementValue;
     }
-    
+
     public void setVarargs(boolean set){
         mIsVarargs = set;
     }
     public boolean isVarArgs(){
       return mIsVarargs;
     }
+
+    @Override
     public String toString(){
       return this.name();
     }
-    
+
     public void setReason(String reason) {
         mReasonOpened = reason;
     }
-    
+
     public String getReason() {
         return mReasonOpened;
     }
diff --git a/tools/droiddoc/src/PackageInfo.java b/tools/droiddoc/src/PackageInfo.java
index 18c636e..17ad1b7 100644
--- a/tools/droiddoc/src/PackageInfo.java
+++ b/tools/droiddoc/src/PackageInfo.java
@@ -57,11 +57,13 @@
         return s;
     }
 
+    @Override
     public ContainerInfo parent()
     {
         return null;
     }
 
+    @Override
     public boolean isHidden()
     {
         return comment().isHidden();
diff --git a/tools/droiddoc/src/ParamTagInfo.java b/tools/droiddoc/src/ParamTagInfo.java
index c21ecd5..d6f2b6b 100644
--- a/tools/droiddoc/src/ParamTagInfo.java
+++ b/tools/droiddoc/src/ParamTagInfo.java
@@ -76,6 +76,7 @@
         return mParameterName;
     }
 
+    @Override
     public void makeHDF(HDF data, String base)
     {
         data.setValue(base + ".name", parameterName());
diff --git a/tools/droiddoc/src/SampleTagInfo.java b/tools/droiddoc/src/SampleTagInfo.java
index c80083b..c7ad1cc 100644
--- a/tools/droiddoc/src/SampleTagInfo.java
+++ b/tools/droiddoc/src/SampleTagInfo.java
@@ -36,7 +36,7 @@
  * Both tags accept either a filename and an id or just a filename.  If no id
  * is provided, the entire file is copied.  If an id is provided, the lines
  * in the given file between the first two lines containing BEGIN_INCLUDE(id)
- * and END_INCLUDE(id), for the given id, are copied.  The id may be only 
+ * and END_INCLUDE(id), for the given id, are copied.  The id may be only
  * letters, numbers and underscore (_).
  *
  * Four examples:
@@ -274,6 +274,7 @@
         return result.substring(0);
     }
 
+    @Override
     public void makeHDF(HDF data, String base)
     {
         data.setValue(base + ".name", name());
diff --git a/tools/droiddoc/src/SeeTagInfo.java b/tools/droiddoc/src/SeeTagInfo.java
index 94863b5..8420ed3 100644
--- a/tools/droiddoc/src/SeeTagInfo.java
+++ b/tools/droiddoc/src/SeeTagInfo.java
@@ -45,6 +45,7 @@
         return linkReference().label;
     }
 
+    @Override
     public void makeHDF(HDF data, String base)
     {
         LinkReference linkRef = linkReference();
diff --git a/tools/droiddoc/src/SourcePositionInfo.java b/tools/droiddoc/src/SourcePositionInfo.java
index 6244803..ac605ec 100644
--- a/tools/droiddoc/src/SourcePositionInfo.java
+++ b/tools/droiddoc/src/SourcePositionInfo.java
@@ -76,6 +76,7 @@
         return new SourcePositionInfo(that.file, line, 0);
     }
 
+    @Override
     public String toString()
     {
         return file + ':' + line;
diff --git a/tools/droiddoc/src/TypeInfo.java b/tools/droiddoc/src/TypeInfo.java
index 5196c13..45e9db9 100644
--- a/tools/droiddoc/src/TypeInfo.java
+++ b/tools/droiddoc/src/TypeInfo.java
@@ -249,6 +249,7 @@
         }
     }
 
+    @Override
     public String toString(){
       String returnString = "";
       returnString += "Primitive?: " + mIsPrimitive + " TypeVariable?: " +
