Index: trunk/tools/japicc/modules/Internals/APIDump.pm
===================================================================
--- trunk/tools/japicc/modules/Internals/APIDump.pm	(revision 11682)
+++ trunk/tools/japicc/modules/Internals/APIDump.pm	(revision 12872)
@@ -135,7 +135,8 @@
         
         my $ClassName = getFilename($ClassPath);
-        if($ClassName=~/\$\d/) {
+        if($ClassName=~/\$\d/ or $ClassName eq "module-info") {
             next;
         }
+        
         $ClassPath = cutPrefix($ClassPath, $ExtractPath); # javap decompiler accepts relative paths only
         
@@ -220,7 +221,7 @@
 }
 
-sub simpleDecl($)
+sub simpleDecl($$)
 {
-    my $Line = $_[0];
+    my ($Line, $LVer) = @_;
     
     my %B = ( "<"=>0, ">"=>0 );
@@ -287,5 +288,5 @@
     {
         if($Line=~s/([A-Za-z\d\?]+) extends \Q$R\E/$1/) {
-            $Tmpl{$1} = $R;
+            $Tmpl{$1} = registerType($R, $LVer);
         }
     }
@@ -317,5 +318,5 @@
     close(IN);
     
-    my (%TypeAttr, $CurrentMethod, $CurrentPackage, $CurrentClass) = ();
+    my (%TypeAttr, $CurrentMethod, $CurrentPackage, $CurrentClass, $CurrentClass_Short) = ();
     my ($InParamTable, $InVarTypeTable, $InExceptionTable, $InCode) = (0, 0, 0, 0);
     
@@ -488,5 +489,5 @@
           # <KEYIN extends java.lang.Object ...
             if($LINE=~/<[A-Z\d\?]+ /i) {
-                ($LINE, $TmplP) = simpleDecl($LINE);
+                ($LINE, $TmplP) = simpleDecl($LINE, $LVer);
             }
         }
@@ -628,5 +629,5 @@
             }
             $MethodAttr{"Class"} = registerType($TypeAttr{"Name"}, $LVer);
-            if($MethodAttr{"ShortName"}=~/\A(|(.+)\.)\Q$CurrentClass\E\Z/)
+            if($MethodAttr{"ShortName"}=~/\A(|(.+)\.)(\Q$CurrentClass\E|\Q$CurrentClass_Short\E)\Z/)
             {
                 if($2)
@@ -688,9 +689,15 @@
             and $LINE_N=~/(Signature|descriptor):\s*(.+?)\s*\Z/i)
             { # create run-time unique name ( java/io/PrintStream.println (Ljava/lang/String;)V )
+                my $SignParams = $2;
+                
+                # Generic classes
+                my $ShortClass = $CurrentClass;
+                $ShortClass=~s/<.*>//g;
+                
                 if($MethodAttr{"Constructor"}) {
-                    $CurrentMethod = $CurrentClass.".\"<init>\":".$2;
+                    $CurrentMethod = $ShortClass.".\"<init>\":".$SignParams;
                 }
                 else {
-                    $CurrentMethod = $CurrentClass.".".$MethodAttr{"ShortName"}.":".$2;
+                    $CurrentMethod = $ShortClass.".".$MethodAttr{"ShortName"}.":".$SignParams;
                 }
                 if(my $PackageName = getSFormat($CurrentPackage)) {
@@ -832,8 +839,15 @@
                 $CurrentPackage = "";
             }
+            
             if($CurrentClass=~s/#/./g)
             { # javax.swing.text.GlyphView.GlyphPainter <=> GlyphView$GlyphPainter
                 $TypeAttr{"Name"}=~s/#/./g;
             }
+            
+            $CurrentClass_Short = $CurrentClass;
+            if(index($CurrentClass_Short, "<")!=-1) {
+                $CurrentClass_Short=~s/<.+>//g;
+            }
+            
             if($LINE=~/(\A|\s+)(public|protected|private)\s+/) {
                 $TypeAttr{"Access"} = $2;
@@ -885,4 +899,8 @@
                 $TypeAttr{"Static"} = 1;
             }
+            
+            if($TmplP) {
+                $TypeAttr{"GenericParam"} = $TmplP;
+            }
         }
         elsif(index($LINE, "Deprecated: true")!=-1
@@ -919,4 +937,8 @@
     chdir($In::Opt{"OrigDir"});
     
+    if(my $Err = $?>>8) {
+        exitStatus("Error", "failed to run javap");
+    }
+    
     if(not $NonEmpty) {
         exitStatus("Error", "internal error in parser");
@@ -961,4 +983,12 @@
             $TypeInfo{$LVer}{$Tid}{"BaseType"} = $BaseTypeId;
             $TypeInfo{$LVer}{$Tid}{"Type"} = "array";
+        }
+    }
+    elsif($TName=~/(.+)\.\.\.\Z/)
+    {
+        if(my $BaseTypeId = registerType($1, $LVer))
+        {
+            $TypeInfo{$LVer}{$Tid}{"BaseType"} = $BaseTypeId;
+            $TypeInfo{$LVer}{$Tid}{"Type"} = "variable-arity";
         }
     }
Index: trunk/tools/japicc/modules/Internals/Basic.pm
===================================================================
--- trunk/tools/japicc/modules/Internals/Basic.pm	(revision 11682)
+++ trunk/tools/japicc/modules/Internals/Basic.pm	(revision 12872)
@@ -26,5 +26,5 @@
 my %Cache;
 
-my $MD5_LEN = 8;
+my $MD5_LEN = 12;
 
 sub getOSgroup()
Index: trunk/tools/japicc/modules/Internals/Css/Report.css
===================================================================
--- trunk/tools/japicc/modules/Internals/Css/Report.css	(revision 11682)
+++ trunk/tools/japicc/modules/Internals/Css/Report.css	(revision 12872)
@@ -44,5 +44,5 @@
 }
 span.ext {
-    font-weight:100;
+    font-weight:normal;
 }
 span.jar {
@@ -89,5 +89,5 @@
 span.attr {
     color:Black;
-    font-weight:100;
+    font-weight:normal;
 }
 span.deprecated {
@@ -142,5 +142,5 @@
 table.summary th {
     background-color:#eeeeee;
-    font-weight:100;
+    font-weight:normal;
     text-align:left;
     font-size:0.94em;
@@ -177,5 +177,5 @@
 }
 span.ttype {
-    font-weight:100;
+    font-weight:normal;
 }
 span.nowrap {
@@ -188,34 +188,34 @@
 .passed {
     background-color:#CCFFCC;
-    font-weight:100;
+    font-weight:normal;
 }
 .warning {
     background-color:#F4F4AF;
-    font-weight:100;
+    font-weight:normal;
 }
 .failed {
     background-color:#FFCCCC;
-    font-weight:100;
+    font-weight:normal;
 }
 .new {
     background-color:#C6DEFF;
-    font-weight:100;
+    font-weight:normal;
 }
 
 .compatible {
     background-color:#CCFFCC;
-    font-weight:100;
+    font-weight:normal;
 }
 .almost_compatible {
     background-color:#FFDAA3;
-    font-weight:100;
+    font-weight:normal;
 }
 .incompatible {
     background-color:#FFCCCC;
-    font-weight:100;
+    font-weight:normal;
 }
 .gray {
     background-color:#DCDCDC;
-    font-weight:100;
+    font-weight:normal;
 }
 
Index: trunk/tools/japicc/modules/Internals/Filter.pm
===================================================================
--- trunk/tools/japicc/modules/Internals/Filter.pm	(revision 11682)
+++ trunk/tools/japicc/modules/Internals/Filter.pm	(revision 12872)
@@ -286,4 +286,11 @@
     }
     
+    if(my $Check = $In::Opt{"CheckPackages"})
+    {
+        if($Package!~/$Check/) {
+            return 1;
+        }
+    }
+    
     return 0;
 }
Index: trunk/tools/japicc/modules/Internals/RegTests.pm
===================================================================
--- trunk/tools/japicc/modules/Internals/RegTests.pm	(revision 11682)
+++ trunk/tools/japicc/modules/Internals/RegTests.pm	(revision 12872)
@@ -80,21 +80,4 @@
     writeFile($Path_v2."/BaseAbstractClass.java", $BaseAbstractClass);
     
-    # Removed_Annotation
-    writeFile($Path_v1."/RemovedAnnotation.java",
-    "package $PackageName;
-    public \@interface RemovedAnnotation {
-    }");
-    
-    # Beta Annotation
-    writeFile($Path_v1."/Beta.java",
-    "package $PackageName;
-    public \@interface Beta {
-    }");
-    
-    writeFile($Path_v2."/Beta.java",
-    "package $PackageName;
-    public \@interface Beta {
-    }");
-    
     # BaseClass
     my $BaseClass = "package $PackageName;
@@ -142,45 +125,334 @@
     writeFile($Path_v2."/BaseConstantInterface.java", $BaseConstantInterface);
     
-    # Removed_Method (Beta method)
-    writeFile($Path_v1."/RemovedBetaMethod.java",
-    "package $PackageName;
-    public class RemovedBetaMethod
-    {
+    if(cmpVersions($In::Opt{"CompilerVer"}, "1.5")>=0)
+    {
+        # GenericClass1
+        writeFile($Path_v1."/GenericClass1.java",
+        "package $PackageName;
+        public class GenericClass1<T> {
+            public Integer method(T param) { return 0; }
+        }");
+        writeFile($Path_v2."/GenericClass1.java",
+        "package $PackageName;
+        public class GenericClass1<T> {
+            public Integer method(T param) { return 0; }
+        }");
+        
+        # GenericClass2
+        writeFile($Path_v1."/GenericClass2.java",
+        "package $PackageName;
+        public class GenericClass2<T> {
+            public void method() { }
+        }");
+        writeFile($Path_v2."/GenericClass2.java",
+        "package $PackageName;
+        public class GenericClass2<T> {
+            public void method() { }
+        }");
+        
+        # Class became generic
+        writeFile($Path_v1."/ClassBecameGeneric.java",
+        "package $PackageName;
+        public abstract class ClassBecameGeneric {
+            public ClassBecameGeneric() {}
+            public abstract ClassBecameGeneric doSomething();
+        }");
+        writeFile($Path_v2."/ClassBecameGeneric.java",
+        "package $PackageName;
+        public abstract class ClassBecameGeneric<T> {
+            public ClassBecameGeneric() {}
+            public abstract T doSomething();
+        }");
+        
+        writeFile($TestsPath."/Test_ClassBecameGeneric.java",
+        "import $PackageName.*;
+        class GenerifyingClassDerived extends ClassBecameGeneric {
+            public ClassBecameGeneric doSomething() { return new GenerifyingClassDerived(); }
+            public static void main(String[] args) { }
+        }
+        public class Test_ClassBecameGeneric
+        {
+            public static void main(String[] args) {
+                GenerifyingClassDerived X = new GenerifyingClassDerived();
+                ClassBecameGeneric Res = X.doSomething();
+            }
+        }");
+        
+        # Class became raw
+        writeFile($Path_v1."/ClassBecameRaw.java",
+        "package $PackageName;
+        public class ClassBecameRaw<T extends String> {
+            public void method(T param) { }
+        }");
+        writeFile($Path_v2."/ClassBecameRaw.java",
+        "package $PackageName;
+        public class ClassBecameRaw {
+            public void method(String param) { }
+        }");
+        
+        writeFile($TestsPath."/Test_ClassBecameRaw.java",
+        "import $PackageName.*;
+        public class Test_ClassBecameRaw
+        {
+            public static void main(String[] args) {
+                ClassBecameRaw<String> X = new ClassBecameRaw<String>();
+                X.method(\"XXX\");
+            }
+        }");
+        
+        # Interface became generic
+        writeFile($Path_v1."/InterfaceBecameGeneric.java",
+        "package $PackageName;
+        public interface InterfaceBecameGeneric {
+            public void method();
+        }");
+        writeFile($Path_v2."/InterfaceBecameGeneric.java",
+        "package $PackageName;
+        public interface InterfaceBecameGeneric<T> {
+            public void method();
+        }");
+        
+        # Interface became raw
+        writeFile($Path_v1."/InterfaceBecameRaw.java",
+        "package $PackageName;
+        public interface InterfaceBecameRaw<T> {
+            public void method();
+        }");
+        writeFile($Path_v2."/InterfaceBecameRaw.java",
+        "package $PackageName;
+        public interface InterfaceBecameRaw {
+            public void method();
+        }");
+        
+        writeFile($TestsPath."/Test_InterfaceBecameRaw.java",
+        "import $PackageName.*;
+        class InterfaceBecameRawDerived implements InterfaceBecameRaw<String> {
+            public void method() { }
+            public static void main(String[] args) { }
+        }
+        public class Test_InterfaceBecameRaw
+        {
+            public static void main(String[] args) {
+                InterfaceBecameRawDerived X = new InterfaceBecameRawDerived();
+                X.method();
+            }
+        }");
+        
+        # Changed generic super-class
+        writeFile($Path_v1."/GenericSuperClassChanged.java",
+        "package $PackageName;
+        public class GenericSuperClassChanged extends GenericClass1<String> {
+            public Integer method() { return 0; }
+        }");
+        writeFile($Path_v2."/GenericSuperClassChanged.java",
+        "package $PackageName;
+        public class GenericSuperClassChanged extends GenericClass1<Integer> {
+            public Integer method() { return 0; }
+        }");
+        
+        # Extending class with generic parameters
+        writeFile($Path_v1."/ExtendingClassWithGeneric.java",
+        "package $PackageName;
+        public class ExtendingClassWithGeneric {
+            public void method() { }
+        }");
+        writeFile($Path_v2."/ExtendingClassWithGeneric.java",
+        "package $PackageName;
+        public class ExtendingClassWithGeneric extends GenericClass2<String>
+        {
+        }");
+        
+        # Renamed generic parameter
+        writeFile($Path_v1."/RenamedGenericParameter.java",
+        "package $PackageName;
+        public class RenamedGenericParameter<A extends String> {
+            public void method(A param) { }
+        }");
+        writeFile($Path_v2."/RenamedGenericParameter.java",
+        "package $PackageName;
+        public class RenamedGenericParameter<B extends String> {
+            public void method(B param) { }
+        }");
+        
+        # Changed field type by introducing of a generic parameter
+        writeFile($Path_v1."/ChangedFieldTypeByGenericParam.java",
+        "package $PackageName;
+        public class ChangedFieldTypeByGenericParam {
+            public ChangedFieldTypeByGenericParam(String param) { f=param; }
+            public void method() { }
+            public String f;
+        }");
+        writeFile($Path_v2."/ChangedFieldTypeByGenericParam.java",
+        "package $PackageName;
+        public class ChangedFieldTypeByGenericParam<T> {
+            public ChangedFieldTypeByGenericParam(T param) { f=param; }
+            public void method() { }
+            public T f;
+        }");
+        
+        writeFile($Path_v1."/TestGeneric.java",
+        "package $PackageName;
+        public class TestGeneric {
+            public ChangedFieldTypeByGenericParam get1() { return new ChangedFieldTypeByGenericParam(\"XXX\"); }
+            public ChangedFieldTypeByGenericParam get2() { return new ChangedFieldTypeByGenericParam(\"XXX\"); }
+        }");
+        writeFile($Path_v2."/TestGeneric.java",
+        "package $PackageName;
+        public class TestGeneric {
+            public ChangedFieldTypeByGenericParam<String>  get1() { return new ChangedFieldTypeByGenericParam<String>(\"XXX\"); }
+            public ChangedFieldTypeByGenericParam<Integer> get2() { return new ChangedFieldTypeByGenericParam<Integer>(0); }
+        }");
+        
+        writeFile($TestsPath."/Test_ChangedFieldTypeByGenericParam.java",
+        "import $PackageName.*;
+        public class Test_ChangedFieldTypeByGenericParam
+        {
+            public static void main(String[] args)
+            {
+                TestGeneric X = new TestGeneric();
+                ChangedFieldTypeByGenericParam Res1 = X.get1();
+                ChangedFieldTypeByGenericParam Res2 = X.get2();
+                Res1.f = Res2.f;
+            }
+        }");
+        
+        # Changed constructor after generifying
+        writeFile($Path_v1."/ChangedCtorAfterGenerifying.java",
+        "package $PackageName;
+        public class ChangedCtorAfterGenerifying {
+            public ChangedCtorAfterGenerifying(String param) { }
+            public String f;
+        }");
+        writeFile($Path_v2."/ChangedCtorAfterGenerifying.java",
+        "package $PackageName;
+        public class ChangedCtorAfterGenerifying<T> {
+            public ChangedCtorAfterGenerifying(T param) { }
+            public T f;
+        }");
+        
+        writeFile($TestsPath."/Test_ChangedCtorAfterGenerifying.java",
+        "import $PackageName.*;
+        public class Test_ChangedCtorAfterGenerifying
+        {
+            public static void main(String[] args) {
+                ChangedCtorAfterGenerifying X = new ChangedCtorAfterGenerifying(\"XXX\");
+            }
+        }");
+        
+        # Array to variable arity
+        writeFile($Path_v1."/ArrayToVariableArity.java",
+        "package $PackageName;
+        public class ArrayToVariableArity {
+            public void method(Integer x, String[] y) { }
+        }");
+        writeFile($Path_v2."/ArrayToVariableArity.java",
+        "package $PackageName;
+        public class ArrayToVariableArity {
+            public void method(Integer x, String... y) { }
+        }");
+        
+        writeFile($TestsPath."/Test_ArrayToVariableArity.java",
+        "import $PackageName.*;
+        public class Test_ArrayToVariableArity
+        {
+            public static void main(String[] args) {
+                ArrayToVariableArity X = new ArrayToVariableArity();
+                X.method(0, new String[]{\"a\", \"b\"});
+            }
+        }");
+        
+        # Variable arity to array
+        writeFile($Path_v1."/VariableArityToArray.java",
+        "package $PackageName;
+        public class VariableArityToArray {
+            public void method(Integer x, String... y) { }
+        }");
+        writeFile($Path_v2."/VariableArityToArray.java",
+        "package $PackageName;
+        public class VariableArityToArray {
+            public void method(Integer x, String[] y) { }
+        }");
+        
+        writeFile($TestsPath."/Test_VariableArityToArray.java",
+        "import $PackageName.*;
+        public class Test_VariableArityToArray
+        {
+            public static void main(String[] args) {
+                VariableArityToArray X = new VariableArityToArray();
+                X.method(0, \"a\", \"b\");
+            }
+        }");
+        
+        # Removed_Annotation
+        writeFile($Path_v1."/RemovedAnnotation.java",
+        "package $PackageName;
+        public \@interface RemovedAnnotation {
+        }");
+        
+        writeFile($TestsPath."/Test_RemovedAnnotation.java",
+        "import $PackageName.*;
+        public class Test_RemovedAnnotation {
+            public static void main(String[] args) {
+                testMethod();
+            }
+            
+            \@RemovedAnnotation
+            static void testMethod() {
+            }
+        }");
+        
+        # Beta Annotation
+        writeFile($Path_v1."/Beta.java",
+        "package $PackageName;
+        public \@interface Beta {
+        }");
+        
+        writeFile($Path_v2."/Beta.java",
+        "package $PackageName;
+        public \@interface Beta {
+        }");
+        
+        # Removed_Method (Beta method)
+        writeFile($Path_v1."/RemovedBetaMethod.java",
+        "package $PackageName;
+        public class RemovedBetaMethod
+        {
+            \@Beta
+            public Integer someMethod() {
+                return 0;
+            }
+        }");
+        writeFile($Path_v2."/RemovedBetaMethod.java",
+        "package $PackageName;
+        public class RemovedBetaMethod {
+        }");
+        
+        # Removed_Method (from Beta class)
+        writeFile($Path_v1."/RemovedMethodFromBetaClass.java",
+        "package $PackageName;
         \@Beta
-        public Integer someMethod() {
-            return 0;
-        }
-    }");
-    writeFile($Path_v2."/RemovedBetaMethod.java",
-    "package $PackageName;
-    public class RemovedBetaMethod {
-    }");
-    
-    # Removed_Method (from Beta class)
-    writeFile($Path_v1."/RemovedMethodFromBetaClass.java",
-    "package $PackageName;
-    \@Beta
-    public class RemovedMethodFromBetaClass
-    {
-        public Integer someMethod() {
-            return 0;
-        }
-    }");
-    writeFile($Path_v2."/RemovedMethodFromBetaClass.java",
-    "package $PackageName;
-    \@Beta
-    public class RemovedMethodFromBetaClass {
-    }");
-    
-    # Removed_Class (Beta)
-    writeFile($Path_v1."/RemovedBetaClass.java",
-    "package $PackageName;
-    \@Beta
-    public class RemovedBetaClass
-    {
-        public Integer someMethod() {
-            return 0;
-        }
-    }");
+        public class RemovedMethodFromBetaClass
+        {
+            public Integer someMethod() {
+                return 0;
+            }
+        }");
+        writeFile($Path_v2."/RemovedMethodFromBetaClass.java",
+        "package $PackageName;
+        \@Beta
+        public class RemovedMethodFromBetaClass {
+        }");
+        
+        # Removed_Class (Beta)
+        writeFile($Path_v1."/RemovedBetaClass.java",
+        "package $PackageName;
+        \@Beta
+        public class RemovedBetaClass
+        {
+            public Integer someMethod() {
+                return 0;
+            }
+        }");
+    }
     
     # Abstract_Method_Added_Checked_Exception
@@ -276,11 +548,41 @@
     "package $PackageName;
     public class ChangedMethodReturnFromVoid {
-        public void changedMethod(Integer param1, String[] param2) { }
+        public void changedMethod(Integer param1) { }
     }");
     writeFile($Path_v2."/ChangedMethodReturnFromVoid.java",
     "package $PackageName;
     public class ChangedMethodReturnFromVoid {
-        public Integer changedMethod(Integer param1, String[] param2){
+        public Integer changedMethod(Integer param1){
             return param1;
+        }
+    }");
+    
+    writeFile($TestsPath."/Test_ChangedMethodReturnFromVoid.java",
+    "import $PackageName.*;
+    public class Test_ChangedMethodReturnFromVoid {
+        public static void main(String[] args) {
+            ChangedMethodReturnFromVoid X = new ChangedMethodReturnFromVoid();
+            X.changedMethod(1);
+        }
+    }");
+    
+    # Changed_Method_Return
+    writeFile($Path_v1."/ChangedMethodReturn.java",
+    "package $PackageName;
+    public class ChangedMethodReturn {
+        public Integer changedMethod(Integer param) { return 0; }
+    }");
+    writeFile($Path_v2."/ChangedMethodReturn.java",
+    "package $PackageName;
+    public class ChangedMethodReturn {
+        public String changedMethod(Integer param) { return \"XXX\"; }
+    }");
+    
+    writeFile($TestsPath."/Test_ChangedMethodReturn.java",
+    "import $PackageName.*;
+    public class Test_ChangedMethodReturn {
+        public static void main(String[] args) {
+            ChangedMethodReturn X = new ChangedMethodReturn();
+            Integer Res = X.changedMethod(0);
         }
     }");
@@ -362,16 +664,4 @@
     }");
     
-    writeFile($TestsPath."/Test_RemovedAnnotation.java",
-    "import $PackageName.*;
-    public class Test_RemovedAnnotation {
-        public static void main(String[] args) {
-            testMethod();
-        }
-        
-        \@RemovedAnnotation
-        static void testMethod() {
-        }
-    }");
-    
     # Removed_Constant_Field (Interface)
     writeFile($Path_v1."/InterfaceRemovedConstantField.java",
@@ -437,4 +727,13 @@
     }");
     
+    writeFile($TestsPath."/Test_ChangedFieldType.java",
+    "import $PackageName.*;
+    public class Test_ChangedFieldType {
+        public static void main(String[] args) {
+            ChangedFieldType X = new ChangedFieldType();
+            String R = X.fieldName;
+        }
+    }");
+    
     # Changed_Field_Access
     writeFile($Path_v1."/ChangedFieldAccess.java",
@@ -473,4 +772,13 @@
     public class NonConstantFieldBecameStatic {
         public static String fieldName;
+    }");
+    
+    writeFile($TestsPath."/Test_NonConstantFieldBecameStatic.java",
+    "import $PackageName.*;
+    public class Test_NonConstantFieldBecameStatic {
+        public static void main(String[] args) {
+            NonConstantFieldBecameStatic X = new NonConstantFieldBecameStatic();
+            String R = X.fieldName;
+        }
     }");
     
@@ -535,4 +843,15 @@
     public class RemovedMethod {
         public Integer field = 100;
+    }");
+    
+    # Removed protected method from final class
+    writeFile($Path_v1."/RemovedProtectedMethodFromFinalClass.java",
+    "package $PackageName;
+    public final class RemovedProtectedMethodFromFinalClass {
+        protected void removedMethod(Integer param) { }
+    }");
+    writeFile($Path_v2."/RemovedProtectedMethodFromFinalClass.java",
+    "package $PackageName;
+    public final class RemovedProtectedMethodFromFinalClass {
     }");
     
@@ -586,4 +905,32 @@
     }");
     
+    # Interface_Removed_Abstract_Method (Last)
+    writeFile($Path_v1."/InterfaceRemovedLastAbstractMethod.java",
+    "package $PackageName;
+    public interface InterfaceRemovedLastAbstractMethod {
+        public void removedMethod(Integer param);
+    }");
+    writeFile($Path_v2."/InterfaceRemovedLastAbstractMethod.java",
+    "package $PackageName;
+    public interface InterfaceRemovedLastAbstractMethod {
+    }");
+    
+    writeFile($TestsPath."/Test_InterfaceRemovedLastAbstractMethod.java",
+    "import $PackageName.*;
+    class InterfaceRemovedLastAbstractMethodDerived implements InterfaceRemovedLastAbstractMethod
+    {
+        public void removedMethod(Integer param) { }
+        public static void main(String[] args) { }
+    };
+    
+    public class Test_InterfaceRemovedLastAbstractMethod
+    {
+        public static void main(String[] args)
+        {
+            InterfaceRemovedLastAbstractMethod Obj = new InterfaceRemovedLastAbstractMethodDerived();
+            Obj.removedMethod(0);
+        }
+    }");
+    
     # Interface_Added_Abstract_Method
     writeFile($Path_v1."/InterfaceAddedAbstractMethod.java",
@@ -627,4 +974,5 @@
     "import $PackageName.*;
     class Class_MethodBecameNonDefault implements MethodBecameNonDefault {
+        public static void main(String[] args) { }
     };
     
@@ -638,16 +986,4 @@
     }");
     
-    # Variable_Arity_To_Array
-    writeFile($Path_v1."/VariableArityToArray.java",
-    "package $PackageName;
-    public class VariableArityToArray {
-        public void someMethod(Integer x, String... y) { };
-    }");
-    writeFile($Path_v2."/VariableArityToArray.java",
-    "package $PackageName;
-    public class VariableArityToArray {
-        public void someMethod(Integer x, String[] y) { };
-    }");
-    
     # Class_Became_Interface
     writeFile($Path_v1."/ClassBecameInterface.java",
@@ -879,5 +1215,5 @@
     writeFile($TestsPath."/Test_RemovedFieldClass.java",
     "import $PackageName.*;
-    public class Test_RemovedFieldClass extends RemovedFieldClass
+    public class Test_RemovedFieldClass
     {
         public static void main(String[] args)
@@ -1047,5 +1383,5 @@
             return param1;
         };
-        public abstract Integer removedMethod(Integer param);
+        public abstract void removedMethod(Integer param);
     }");
     writeFile($Path_v2."/ClassRemovedAbstractMethod.java",
@@ -1057,4 +1393,21 @@
     }");
     
+    writeFile($TestsPath."/Test_ClassRemovedAbstractMethod.java",
+    "import $PackageName.*;
+    class ClassRemovedAbstractMethodDerived extends ClassRemovedAbstractMethod
+    {
+        public void removedMethod(Integer param) { }
+        public static void main(String[] args) { }
+    };
+    
+    public class Test_ClassRemovedAbstractMethod
+    {
+        public static void main(String[] args)
+        {
+            ClassRemovedAbstractMethod Obj = new ClassRemovedAbstractMethodDerived();
+            Obj.removedMethod(0);
+        }
+    }");
+    
     # Class_Method_Became_Abstract
     writeFile($Path_v1."/ClassMethodBecameAbstract.java",
@@ -1130,5 +1483,5 @@
     
     # Static_Method_Became_Final
-    writeFile($Path_v1."/StaticMethodBecameFinal.java",
+    writeFile($Path_v2."/StaticMethodBecameFinal.java",
     "package $PackageName;
     public class StaticMethodBecameFinal {
@@ -1137,5 +1490,5 @@
         };
     }");
-    writeFile($Path_v2."/StaticMethodBecameFinal.java",
+    writeFile($Path_v1."/StaticMethodBecameFinal.java",
     "package $PackageName;
     public class StaticMethodBecameFinal {
@@ -1143,4 +1496,14 @@
             return param;
         };
+    }");
+    
+    writeFile($TestsPath."/Test_StaticMethodBecameFinal.java",
+    "import $PackageName.*;
+    public class Test_StaticMethodBecameFinal
+    {
+        public static void main(String[] args)
+        {
+            Integer R = StaticMethodBecameFinal.someMethod(0);
+        }
     }");
     
@@ -1315,4 +1678,8 @@
             return 0;
         }
+        public Integer someMethod(InterfaceRemovedLastAbstractMethod param) {
+            return 0;
+        }
+        
     }");
     writeFile($Path_v2."/Use.java",
@@ -1340,4 +1707,7 @@
         public Integer someMethod(AbstractClassAddedSuperInterfaceWithImplementedMethods param) {
             return param.method2(100);
+        }
+        public Integer someMethod(InterfaceRemovedLastAbstractMethod param) {
+            return 0;
         }
     }");
@@ -1403,4 +1773,6 @@
     my ($TestsPath, $PackageName, $Path_v1, $Path_v2) = @_;
     
+    printMsg("INFO", "Running tests ...");
+    
     # compile with old version of package
     my $JavacCmd = getCmdPath("javac");
@@ -1447,5 +1819,7 @@
     }
     
-    writeFile("$TestsPath/Journal.txt", $TEST_REPORT);
+    my $Journal = $TestsPath."/Journal.txt";
+    writeFile($Journal, $TEST_REPORT);
+    printMsg("INFO", "See journal with test results: $Journal");
 }
 
Index: trunk/tools/japicc/modules/Internals/SysFiles.pm
===================================================================
--- trunk/tools/japicc/modules/Internals/SysFiles.pm	(revision 11682)
+++ trunk/tools/japicc/modules/Internals/SysFiles.pm	(revision 12872)
@@ -195,6 +195,8 @@
             if(my $Ver = `$JavacCmd -version 2>&1`)
             {
-                if($Ver=~/javac\s+(.+)/) {
+                if($Ver=~/javac\s+(.+)/)
+                {
                     printMsg("INFO", "Using Java ".$1);
+                    $In::Opt{"CompilerVer"} = $1;
                 }
             }
Index: trunk/tools/japicc/modules/Internals/TypeAttr.pm
===================================================================
--- trunk/tools/japicc/modules/Internals/TypeAttr.pm	(revision 11682)
+++ trunk/tools/japicc/modules/Internals/TypeAttr.pm	(revision 12872)
@@ -95,3 +95,10 @@
 }
 
+sub getGeneric($)
+{
+    my $Name = $_[0];
+    $Name=~s/<.*>//g;
+    return $Name;
+}
+
 return 1;
Index: trunk/tools/japicc/modules/Internals/Utils.pm
===================================================================
--- trunk/tools/japicc/modules/Internals/Utils.pm	(revision 11682)
+++ trunk/tools/japicc/modules/Internals/Utils.pm	(revision 12872)
@@ -64,5 +64,7 @@
     
     # Linux
-    return POSIX::sysconf(POSIX::_SC_ARG_MAX);
+    # return POSIX::sysconf(POSIX::_SC_ARG_MAX);
+    # javap failed on rt.jar (GC triggered before VM initialization completed)
+    return 10000;
 }
 
Index: trunk/tools/japicc/modules/RulesBin.xml
===================================================================
--- trunk/tools/japicc/modules/RulesBin.xml	(revision 11682)
+++ trunk/tools/japicc/modules/RulesBin.xml	(revision 12872)
@@ -52,5 +52,41 @@
     </change>
     <effect>
-        This method has been removed because the return type is part of the method signature.
+        This method has been removed because the return type is part of the method signature. A client program may be interrupted by **NoSuchMethodError** exception.
+    </effect>
+</rule>
+
+<rule>
+    <id>
+        Changed_Method_Return
+    </id>
+    <severity>
+        High
+    </severity>
+    <kind>
+        Methods
+    </kind>
+    <change>
+        Return value type has been changed from @old_value to @new_value.
+    </change>
+    <effect>
+        This method has been removed because the return type is part of the method signature. A client program may be interrupted by **NoSuchMethodError** exception.
+    </effect>
+</rule>
+
+<rule>
+    <id>
+        Static_Method_Became_Final
+    </id>
+    <severity>
+        Safe
+    </severity>
+    <kind>
+        Methods
+    </kind>
+    <change>
+        Method became final.
+    </change>
+    <effect>
+        No effect.
     </effect>
 </rule>
@@ -301,9 +337,33 @@
     </id>
     <severity>
-        Low
-    </severity>
-    <kind>
-        Methods
-    </kind>
+        Safe
+    </severity>
+    <kind>
+        Methods
+    </kind>
+    <change>
+        Type of parameter @param_name has been changed from @old_value to @new_value.
+    </change>
+    <effect>
+        No effect.
+    </effect>
+</rule>
+
+<rule>
+    <id>
+        Array_To_Variable_Arity
+    </id>
+    <severity>
+        Safe
+    </severity>
+    <kind>
+        Methods
+    </kind>
+    <change>
+        Type of parameter @param_name has been changed from @old_value to @new_value.
+    </change>
+    <effect>
+        No effect.
+    </effect>
 </rule>
 
@@ -803,5 +863,5 @@
     </id>
     <severity>
-        Medium
+        Low
     </severity>
     <kind>
@@ -1161,4 +1221,76 @@
 <rule>
     <id>
+        Interface_Became_Generic
+    </id>
+    <severity>
+        Safe
+    </severity>
+    <kind>
+        Types
+    </kind>
+    <change>
+        This interface became **generic** (@new_value).
+    </change>
+    <effect>
+        No effect.
+    </effect>
+</rule>
+
+<rule>
+    <id>
+        Interface_Became_Raw
+    </id>
+    <severity>
+        Low
+    </severity>
+    <kind>
+        Types
+    </kind>
+    <change>
+        This interface became **raw**.
+    </change>
+    <effect>
+        No effect.
+    </effect>
+</rule>
+
+<rule>
+    <id>
+        Class_Became_Generic
+    </id>
+    <severity>
+        Safe
+    </severity>
+    <kind>
+        Types
+    </kind>
+    <change>
+        This class became **generic** (@new_value).
+    </change>
+    <effect>
+        No effect.
+    </effect>
+</rule>
+
+<rule>
+    <id>
+        Class_Became_Raw
+    </id>
+    <severity>
+        Low
+    </severity>
+    <kind>
+        Types
+    </kind>
+    <change>
+        This class became **raw**.
+    </change>
+    <effect>
+        No effect.
+    </effect>
+</rule>
+
+<rule>
+    <id>
         Class_Became_Final
     </id>
Index: trunk/tools/japicc/modules/RulesSrc.xml
===================================================================
--- trunk/tools/japicc/modules/RulesSrc.xml	(revision 11682)
+++ trunk/tools/japicc/modules/RulesSrc.xml	(revision 12872)
@@ -40,4 +40,22 @@
 <rule>
     <id>
+        Changed_Method_Return
+    </id>
+    <severity>
+        Medium
+    </severity>
+    <kind>
+        Methods
+    </kind>
+    <change>
+        Return value type has been changed from @old_value to @new_value.
+    </change>
+    <effect>
+        Recompilation of a client program may be terminated with the message: incompatible types: @new_value cannot be converted to @old_value.
+    </effect>
+</rule>
+
+<rule>
+    <id>
         Static_Method_Became_Final
     </id>
@@ -262,4 +280,40 @@
 <rule>
     <id>
+        Variable_Arity_To_Array
+    </id>
+    <severity>
+        Medium
+    </severity>
+    <kind>
+        Methods
+    </kind>
+    <change>
+        Type of parameter @param_name has been changed from @old_value to @new_value.
+    </change>
+    <effect>
+        Recompilation of a client program may be terminated with the message: method @method_short in class @type_name cannot be applied to given types.
+    </effect>
+</rule>
+
+<rule>
+    <id>
+        Array_To_Variable_Arity
+    </id>
+    <severity>
+        Safe
+    </severity>
+    <kind>
+        Methods
+    </kind>
+    <change>
+        Type of parameter @param_name has been changed from @old_value to @new_value.
+    </change>
+    <effect>
+        No effect.
+    </effect>
+</rule>
+
+<rule>
+    <id>
         NonAbstract_Class_Added_Abstract_Method
     </id>
@@ -715,5 +769,5 @@
     </id>
     <severity>
-        Medium
+        Low
     </severity>
     <kind>
@@ -947,4 +1001,40 @@
 <rule>
     <id>
+        Field_Became_NonFinal
+    </id>
+    <severity>
+        Safe
+    </severity>
+    <kind>
+        Fields
+    </kind>
+    <change>
+        Field @target became non-final.
+    </change>
+    <effect>
+        No effect.
+    </effect>
+</rule>
+
+<rule>
+    <id>
+        NonConstant_Field_Became_Static
+    </id>
+    <severity>
+        Safe
+    </severity>
+    <kind>
+        Fields
+    </kind>
+    <change>
+        Field @target became static.
+    </change>
+    <effect>
+        No effect.
+    </effect>
+</rule>
+
+<rule>
+    <id>
         NonConstant_Field_Became_NonStatic
     </id>
@@ -1019,4 +1109,76 @@
 <rule>
     <id>
+        Interface_Became_Generic
+    </id>
+    <severity>
+        Safe
+    </severity>
+    <kind>
+        Types
+    </kind>
+    <change>
+        This interface became **generic** (@new_value).
+    </change>
+    <effect>
+        No effect.
+    </effect>
+</rule>
+
+<rule>
+    <id>
+        Interface_Became_Raw
+    </id>
+    <severity>
+        Medium
+    </severity>
+    <kind>
+        Types
+    </kind>
+    <change>
+        This interface became **raw**.
+    </change>
+    <effect>
+        Recompilation of a client program may be terminated with the message: type @new_value does not take parameters.
+    </effect>
+</rule>
+
+<rule>
+    <id>
+        Class_Became_Generic
+    </id>
+    <severity>
+        Safe
+    </severity>
+    <kind>
+        Types
+    </kind>
+    <change>
+        This class became **generic** (@new_value).
+    </change>
+    <effect>
+        No effect.
+    </effect>
+</rule>
+
+<rule>
+    <id>
+        Class_Became_Raw
+    </id>
+    <severity>
+        Medium
+    </severity>
+    <kind>
+        Types
+    </kind>
+    <change>
+        This class became **raw**.
+    </change>
+    <effect>
+        Recompilation of a client program may be terminated with the message: type @new_value does not take parameters.
+    </effect>
+</rule>
+
+<rule>
+    <id>
         Class_Became_Final
     </id>
