Upgrade Proguard to 5.1.

Downloaded from:
http://sourceforge.net/projects/proguard/files/proguard/5.1/

Bug: 17550647
Change-Id: I2b4eab16eb7821fc232b294ab7f433aae08f71e1
diff --git a/NOTICE b/NOTICE
index d5e3c8d..5a78fed 100644
--- a/NOTICE
+++ b/NOTICE
@@ -2,28 +2,29 @@
 
 ProGuard is free. You can use it freely for processing your
 applications, commercial or not. Your code obviously remains yours
-after having been processed, and its license can remain the same.
+after having been processed, and its license can remain unchanged.
 
-ProGuard itself is copyrighted, but its distribution license provides
-you with some rights for modifying and redistributing its code and its
-documentation. More specifically, ProGuard is distributed under the
-terms of the GNU General Public License (GPL), version 2, as published
-by the Free Software Foundation (FSF). In short, this means that you
-may freely redistribute the program, modified or as is, on the
-condition that you make the complete source code available as well. If
-you develop a program that is linked with ProGuard, the program as a
-whole has to be distributed at no charge under the GPL. I am granting
-a special exception to the latter clause (in wording suggested by the
-FSF), for combinations with the following stand-alone applications:
-Apache Ant, Apache Maven, the Eclipse ProGuardDT GUI, the EclipseME
-JME IDE, the Sun NetBeans Java IDE, the Sun JME Wireless Toolkit, and
-the Javaground Tools.
+The ProGuard code itself is copyrighted, but its distribution license
+provides you with some rights for modifying and redistributing its
+code and its documentation. More specifically, ProGuard is distributed
+under the terms of the GNU General Public License (GPL), version 2, as
+published by the Free Software Foundation (FSF). In short, this means
+that you may freely redistribute the program, modified or as is, on
+the condition that you make the complete source code available as
+well. If you develop a program that is linked with ProGuard, the
+program as a whole has to be distributed at no charge under the GPL. I
+am granting a special exception to the latter clause (in wording
+suggested by the FSF, for combinations with the following stand-alone
+applications: Apache Ant, Apache Maven, the Google Android SDK, the
+Eclipse ProGuardDT GUI, the EclipseME JME IDE, the Oracle NetBeans
+Java IDE, the Oracle JME Wireless Toolkit, the Simple Build Tool for
+Scala, and the Sanaware Tools.
 
-The ProGuard user documentation represents an important part of this
-work. It may only be redistributed without changes, along with the
-unmodified version of the code.
+The ProGuard user documentation is copyrighted as well. It may only be
+redistributed without changes, along with the unmodified version of
+the code.
 
-Copyright © 2002-2009 Eric Lafortune.
+Copyright © 2002-2014 Eric Lafortune @ Saikoa.
 
 		    GNU GENERAL PUBLIC LICENSE
 		       Version 2, June 1991
@@ -365,3 +366,37 @@
 consider it more useful to permit linking proprietary applications with the
 library.  If this is what you want to do, use the GNU Library General
 Public License instead of this License.
+
+Special Exception to the GNU General Public License
+
+Copyright © 2002-2014 Eric Lafortune
+
+This program is free software; you can redistribute it and/or modify it under
+the terms of the GNU General Public License as published by the Free Software
+Foundation; either version 2 of the License, or (at your option) any later
+version.
+
+This program is distributed in the hope that it will be useful, but WITHOUT
+ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
+FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with
+this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+Place, Suite 330, Boston, MA 02111-1307 USA
+
+In addition, as a special exception, Eric Lafortune gives permission to link
+the code of this program with the following stand-alone applications:
+- Apache Ant,
+- Apache Maven,
+- the Google Android SDK,
+- the Eclipse ProGuardDT GUI,
+- the EclipseME JME IDE,
+- the Oracle NetBeans Java IDE,
+- the Oracle JME Wireless Toolkit,
+- the Simple Build Tool for Scala (and its scripts), and
+- the Sanaware Tools.
+and distribute linked combinations including the two. You must obey the GNU
+General Public License in all respects for all of the code used other than
+these programs. If you modify this file, you may extend this exception to your
+version of the file, but you are not obligated to do so. If you do not wish to
+do so, delete this exception statement from your version.
diff --git a/README b/README
index 2be6777..933f85a 100644
--- a/README
+++ b/README
@@ -15,7 +15,7 @@
 
 
 Example
-=======
+-------
 
 If you want to give ProGuard a spin right away, try processing the ProGuard
 jar itself:
@@ -30,4 +30,4 @@
 
 http://proguard.sourceforge.net/
 
-Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
diff --git a/bin/proguard.bat b/bin/proguard.bat
index 793e719..daf2c1a 100644
--- a/bin/proguard.bat
+++ b/bin/proguard.bat
@@ -8,7 +8,7 @@
 REM       "\"C:/My Directory/My File.txt\""
 
 IF EXIST "%PROGUARD_HOME%" GOTO home
-SET PROGUARD_HOME=..
+SET PROGUARD_HOME=%~dp0\..
 :home
 
 java -jar "%PROGUARD_HOME%\lib\proguard.jar" %*
diff --git a/bin/proguard.sh b/bin/proguard.sh
index 3fb9444..bd7e0b6 100755
--- a/bin/proguard.sh
+++ b/bin/proguard.sh
@@ -7,6 +7,20 @@
 #       you'll have to add escaped quotes around them, e.g.
 #       "\"/My Directory/My File.txt\""
 
-PROGUARD_HOME=`dirname "$0"`/..
+# Account for possibly missing/basic readlink.
+# POSIX conformant (dash/ksh/zsh/bash).
+PROGUARD=`readlink -f "$0" 2>/dev/null`
+if test "$PROGUARD" = ''
+then
+  PROGUARD=`readlink "$0" 2>/dev/null`
+  if test "$PROGUARD" = ''
+  then
+    PROGUARD="$0"
+  fi
+fi
 
-java -Xmx512M  -jar "$PROGUARD_HOME/lib/proguard.jar" "$@"
+PROGUARD_HOME=`dirname "$PROGUARD"`/..
+
+# BEGIN android-changed Added -Xmx512M for Mac builds
+java -Xmx512M -jar "$PROGUARD_HOME/lib/proguard.jar" "$@"
+# END android-changed
diff --git a/bin/proguardgui.bat b/bin/proguardgui.bat
index 4575aaa..c328f5b 100644
--- a/bin/proguardgui.bat
+++ b/bin/proguardgui.bat
@@ -8,7 +8,7 @@
 REM       "\"C:/My Directory/My File.txt\""
 
 IF EXIST "%PROGUARD_HOME%" GOTO home
-SET PROGUARD_HOME=..
+SET PROGUARD_HOME=%~dp0\..
 :home
 
 java -jar "%PROGUARD_HOME%\lib\proguardgui.jar" %*
diff --git a/bin/proguardgui.sh b/bin/proguardgui.sh
index 2544f29..aba7f62 100755
--- a/bin/proguardgui.sh
+++ b/bin/proguardgui.sh
@@ -7,7 +7,19 @@
 #       you'll have to add escaped quotes around them, e.g.
 #       "\"/My Directory/My File.txt\""
 
-PROGUARD_HOME=`dirname "$0"`/..
+# Account for possibly missing/basic readlink.
+# POSIX conformant (dash/ksh/zsh/bash).
+PROGUARD=`readlink -f "$0" 2>/dev/null`
+if test "$PROGUARD" = ''
+then
+  PROGUARD=`readlink "$0" 2>/dev/null`
+  if test "$PROGUARD" = ''
+  then
+    PROGUARD="$0"
+  fi
+fi
+
+PROGUARD_HOME=`dirname "$PROGUARD"`/..
 
 # On Linux, Java 1.6.0_24 and higher hang when starting the GUI:
 #   http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7027598
diff --git a/bin/retrace.bat b/bin/retrace.bat
index 7201fb6..ae16dde 100644
--- a/bin/retrace.bat
+++ b/bin/retrace.bat
@@ -8,7 +8,7 @@
 REM       "\"C:/My Directory/My File.txt\""
 
 IF EXIST "%PROGUARD_HOME%" GOTO home
-SET PROGUARD_HOME=..
+SET PROGUARD_HOME=%~dp0\..
 :home
 
 java -jar "%PROGUARD_HOME%\lib\retrace.jar" %*
diff --git a/bin/retrace.sh b/bin/retrace.sh
index 83a4d5e..2f274de 100755
--- a/bin/retrace.sh
+++ b/bin/retrace.sh
@@ -7,6 +7,18 @@
 #       you'll have to add escaped quotes around them, e.g.
 #       "\"/My Directory/My File.txt\""
 
-PROGUARD_HOME=`dirname "$0"`/..
+# Account for possibly missing/basic readlink.
+# POSIX conformant (dash/ksh/zsh/bash).
+PROGUARD=`readlink -f "$0" 2>/dev/null`
+if test "$PROGUARD" = ''
+then
+  PROGUARD=`readlink "$0" 2>/dev/null`
+  if test "$PROGUARD" = ''
+  then
+    PROGUARD="$0"
+  fi
+fi
+
+PROGUARD_HOME=`dirname "$PROGUARD"`/..
 
 java -jar "$PROGUARD_HOME/lib/retrace.jar" "$@"
diff --git a/build/README b/build/README
index 36a235b..89d3904 100644
--- a/build/README
+++ b/build/README
@@ -37,4 +37,4 @@
 
 http://proguard.sourceforge.net/
 
-Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
diff --git a/build/build.sh b/build/build.sh
index adb2ee7..ad51c04 100755
--- a/build/build.sh
+++ b/build/build.sh
@@ -30,10 +30,11 @@
 
 ANT_JAR=$ANT_HOME/lib/ant.jar
 GRADLE_PATH=\
-$GRADLE_HOME/lib/plugins/gradle-plugins-1.3.jar:\
-$GRADLE_HOME/lib/gradle-base-services-1.3.jar:\
-$GRADLE_HOME/lib/gradle-core-1.3.jar:\
-$GRADLE_HOME/lib/groovy-all-1.8.6.jar
+$GRADLE_HOME/lib/plugins/gradle-plugins-2.1.jar:\
+$GRADLE_HOME/lib/gradle-base-services-2.1.jar:\
+$GRADLE_HOME/lib/gradle-base-services-groovy-2.1.jar:\
+$GRADLE_HOME/lib/gradle-core-2.1.jar:\
+$GRADLE_HOME/lib/groovy-all-2.3.6.jar
 WTK_JAR=$WTK_HOME/wtklib/kenv.zip
 
 PROGUARD_JAR=$LIB/proguard.jar
diff --git a/build/build.xml b/build/build.xml
index 7c67c68..0dc4bf4 100644
--- a/build/build.xml
+++ b/build/build.xml
@@ -9,10 +9,11 @@
   <property name = "classes" value = "classes"/>
   <property name = "lib"     value = "lib"/>
 
-  <property name = "gradle.jar1" value = "${gradle.home}/lib/plugins/gradle-plugins-1.3.jar"/>
-  <property name = "gradle.jar2" value = "${gradle.home}/lib/gradle-base-services-1.3.jar"/>
-  <property name = "gradle.jar3" value = "${gradle.home}/lib/gradle-core-1.3.jar"/>
-  <property name = "gradle.jar4" value = "${gradle.home}/lib/groovy-all-1.8.6.jar"/>
+  <property name = "gradle.jar1" value = "${gradle.home}/lib/plugins/gradle-plugins-2.1.jar"/>
+  <property name = "gradle.jar2" value = "${gradle.home}/lib/gradle-base-services-2.1.jar"/>
+  <property name = "gradle.jar3" value = "${gradle.home}/lib/gradle-base-services-groovy-2.1.jar"/>
+  <property name = "gradle.jar4" value = "${gradle.home}/lib/gradle-core-2.1.jar"/>
+  <property name = "gradle.jar5" value = "${gradle.home}/lib/groovy-all-2.3.6.jar"/>
   <property name = "wtk.jar"     value = "${wtk.home}/wtklib/kenv.zip"/>
 
   <target name = "all"     depends = "basic,options"/>
@@ -128,6 +129,7 @@
             <available file="${gradle.jar2}"/>
             <available file="${gradle.jar3}"/>
             <available file="${gradle.jar4}"/>
+            <available file="${gradle.jar5}"/>
           </and>
         </not>
       </condition>
@@ -145,6 +147,7 @@
         <path location="${gradle.jar2}"/>
         <path location="${gradle.jar3}"/>
         <path location="${gradle.jar4}"/>
+        <path location="${gradle.jar5}"/>
       </classpath>
     </javac>
 
diff --git a/build/makefile b/build/makefile
index 264a2ac..d5b1d7f 100644
--- a/build/makefile
+++ b/build/makefile
@@ -10,10 +10,11 @@
 LIB     = $(PROGUARD_HOME)/lib
 
 ANT_JAR     = $(ANT_HOME)/lib/ant.jar
-GRADLE_JARS = $(GRADLE_HOME)/lib/plugins/gradle-plugins-1.3.jar \
-              $(GRADLE_HOME)/lib/gradle-base-services-1.3.jar \
-              $(GRADLE_HOME)/lib/gradle-core-1.3.jar \
-              $(GRADLE_HOME)/lib/groovy-all-1.8.6.jar
+GRADLE_JARS = $(GRADLE_HOME)/lib/plugins/gradle-plugins-2.1.jar \
+              $(GRADLE_HOME)/lib/gradle-base-services-2.1.jar \
+              $(GRADLE_HOME)/lib/gradle-base-services-groovy-2.1.jar \
+              $(GRADLE_HOME)/lib/gradle-core-2.1.jar \
+              $(GRADLE_HOME)/lib/groovy-all-2.3.6.jar
 WTK_JAR     = $(WTK_HOME)/wtklib/kenv.zip
 
 NOTHING:=
diff --git a/build/maven/ant/pom.xml b/build/maven/ant/pom.xml
index ab3bc52..5ef9bfa 100644
--- a/build/maven/ant/pom.xml
+++ b/build/maven/ant/pom.xml
@@ -7,7 +7,7 @@
     <parent>
         <groupId>net.sf.proguard</groupId>
         <artifactId>proguard-parent</artifactId>
-        <version>4.10</version>
+        <version>5.1</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>proguard-anttask</artifactId>
diff --git a/build/maven/base/pom.xml b/build/maven/base/pom.xml
index e61471d..4a04b78 100644
--- a/build/maven/base/pom.xml
+++ b/build/maven/base/pom.xml
@@ -7,7 +7,7 @@
     <parent>
         <groupId>net.sf.proguard</groupId>
         <artifactId>proguard-parent</artifactId>
-        <version>4.10</version>
+        <version>5.1</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>proguard-base</artifactId>
diff --git a/build/maven/gradle/pom.xml b/build/maven/gradle/pom.xml
index 86fa2fc..c43e2b6 100644
--- a/build/maven/gradle/pom.xml
+++ b/build/maven/gradle/pom.xml
@@ -7,7 +7,7 @@
     <parent>
         <groupId>net.sf.proguard</groupId>
         <artifactId>proguard-parent</artifactId>
-        <version>4.10</version>
+        <version>5.1</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>proguard-gradle</artifactId>
@@ -60,19 +60,25 @@
         <dependency>
             <groupId>org.gradle</groupId>
             <artifactId>gradle-core</artifactId>
-            <version>1.3</version>
+            <version>2.1</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.gradle</groupId>
             <artifactId>gradle-base-services</artifactId>
-            <version>1.3</version>
+            <version>2.1</version>
+            <scope>provided</scope>
+        </dependency>
+        <dependency>
+            <groupId>org.gradle</groupId>
+            <artifactId>gradle-base-services-groovy</artifactId>
+            <version>2.1</version>
             <scope>provided</scope>
         </dependency>
         <dependency>
             <groupId>org.codehaus.groovy</groupId>
             <artifactId>groovy-all</artifactId>
-            <version>2.0.6</version>
+            <version>2.3.6</version>
             <scope>provided</scope>
         </dependency>
     </dependencies>
diff --git a/build/maven/gui/pom.xml b/build/maven/gui/pom.xml
index 94d0100..f6add25 100644
--- a/build/maven/gui/pom.xml
+++ b/build/maven/gui/pom.xml
@@ -7,7 +7,7 @@
     <parent>
         <groupId>net.sf.proguard</groupId>
         <artifactId>proguard-parent</artifactId>
-        <version>4.10</version>
+        <version>5.1</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>proguard-gui</artifactId>
diff --git a/build/maven/pom.xml b/build/maven/pom.xml
index 8f894ce..08073af 100644
--- a/build/maven/pom.xml
+++ b/build/maven/pom.xml
@@ -7,7 +7,7 @@
 
     <groupId>net.sf.proguard</groupId>
     <artifactId>proguard-parent</artifactId>
-    <version>4.10</version>
+    <version>5.1</version>
     <packaging>pom</packaging>
     <name>[${project.groupId}] ${project.artifactId}</name>
     <description>ProGuard is a free Java class file shrinker, optimizer, obfuscator, and preverifier.</description>
diff --git a/build/maven/retrace/pom.xml b/build/maven/retrace/pom.xml
index 382f9ee..e0994d4 100644
--- a/build/maven/retrace/pom.xml
+++ b/build/maven/retrace/pom.xml
@@ -7,7 +7,7 @@
     <parent>
         <groupId>net.sf.proguard</groupId>
         <artifactId>proguard-parent</artifactId>
-        <version>4.10</version>
+        <version>5.1</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>proguard-retrace</artifactId>
diff --git a/build/maven/wtk/pom.xml b/build/maven/wtk/pom.xml
index fe00533..4c6db2b 100644
--- a/build/maven/wtk/pom.xml
+++ b/build/maven/wtk/pom.xml
@@ -7,7 +7,7 @@
     <parent>
         <groupId>net.sf.proguard</groupId>
         <artifactId>proguard-parent</artifactId>
-        <version>4.10</version>
+        <version>5.1</version>
         <relativePath>../pom.xml</relativePath>
     </parent>
     <artifactId>proguard-wtk-plugin</artifactId>
diff --git a/docs/FAQ.html b/docs/FAQ.html
index 7727289..62ebf7b 100644
--- a/docs/FAQ.html
+++ b/docs/FAQ.html
@@ -5,19 +5,21 @@
 <meta http-equiv="content-style-type" content="text/css">
 <link rel="stylesheet" type="text/css" href="style.css">
 <title>ProGuard FAQ</title>
+</head>
+<body>
+
 <script type="text/javascript" language="JavaScript">
 <!--
 if (window.self==window.top)
-  window.top.location.replace("index.html#"+window.location.pathname+window.location.hash);
-else {
-  var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
-  if (window.top.location.hash!=hash)
-    window.top.location.hash=hash;
-}
+  document.write('<a class="largebutton" target="_top" href="index.html#FAQ.html">ProGuard index</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/dexguard">DexGuard</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/">Saikoa</a> <a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>')
 //-->
 </script>
-</head>
-<body>
+<noscript>
+<a class="largebutton" target="_top"  href="index.html#FAQ.html">ProGuard index</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/dexguard">DexGuard</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/">Saikoa</a>
+<a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>
+</noscript>
 
 <h2>Frequently Asked Questions</h2>
 
@@ -31,8 +33,7 @@
     support?</a></li>
 <li><a href="#commercial">Can I use <b>ProGuard</b> to process my commercial
     application?</a></li>
-<li><a href="#jdk1.4">Does <b>ProGuard</b> work with Java 2? Java 5? Java
-    6? Java 7?</a></li>
+<li><a href="#jdk1.4">Does <b>ProGuard</b> work with Java 2, 5, ..., 8?</a></li>
 <li><a href="#jme">Does <b>ProGuard</b> work with Java Micro Edition?</a></li>
 <li><a href="#android">Does <b>ProGuard</b> work for Google Android
     code?</a></li>
@@ -137,14 +138,14 @@
 doesn't affect the programs that you process. Your code remains yours, and
 its license can remain the same.
 
-<h3><a name="jdk1.4">Does <b>ProGuard</b> work with Java 2? Java 5? Java 6? Java 7?</a></h3>
+<h3><a name="jdk1.4">Does <b>ProGuard</b> work with Java 2, 5, ..., 8?</a></h3>
 
-Yes, <b>ProGuard</b> supports all JDKs from 1.1 up to and including 7.0. Java 2
-introduced some small differences in the class file format. Java 5 added
+Yes, <b>ProGuard</b> supports all JDKs from 1.1 up to and including 8.0. Java
+2 introduced some small differences in the class file format. Java 5 added
 attributes for generics and for annotations. Java 6 introduced optional
 preverification attributes. Java 7 made preverification obligatory and
-introduced support for dynamic languages. <b>ProGuard</b> handles all versions
-correctly.
+introduced support for dynamic languages. Java 8 added more attributes and
+default methods. <b>ProGuard</b> handles all versions correctly.
 
 <h3><a name="jme">Does <b>ProGuard</b> work with Java Micro Edition?</a></h3>
 
@@ -270,12 +271,15 @@
 names is presented for each obfuscated method name that has an ambiguous
 reverse mapping. Please refer to the <a href="manual/index.html">ProGuard User
 Manual</a> for more details.
+<p>
+Erik Andr&eacute; at Badoo has written a
+<a href="https://techblog.badoo.com/blog/2014/10/08/deobfuscating-hprof-memory-dumps/"
+target="other">tool to de-obfuscate HPROF memory dumps</a>.
 
 <hr />
-<noscript><div><a target="_top" href="index.html" class="button">Show menu</a></div></noscript>
 <address>
-Copyright &copy; 2002-2013
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2014
+<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a> @ <a target="top" href="http://www.saikoa.com/">Saikoa</a>.
 </address>
 </body>
 </html>
diff --git a/docs/GPL_exception.html b/docs/GPL_exception.html
index d610af8..8cbe0cd 100644
--- a/docs/GPL_exception.html
+++ b/docs/GPL_exception.html
@@ -7,7 +7,7 @@
 <H1>Special Exception to the GNU General Public License</H1>
 
 <P>
-Copyright &copy; 2002-2013 Eric Lafortune
+Copyright &copy; 2002-2014 Eric Lafortune
 </P>
 
 <P>
@@ -40,11 +40,8 @@
 <li>the EclipseME JME IDE,</li>
 <li>the Oracle NetBeans Java IDE,</li>
 <li>the Oracle JME Wireless Toolkit,</li>
-<li>the Intel TXE SDK,</li>
-<li>the Simple Build Tool for Scala (and its scripts),</li>
-<li>the NeoMAD Tools by Neomades,</li>
-<li>the Javaground Tools, and</li>
-<li>the Sanaware Tools,</li>
+<li>the Simple Build Tool for Scala (and its scripts), and</li>
+<li>the Sanaware Tools.</li>
 </ul>
 and distribute linked combinations including the two. You must obey the GNU
 General Public License in all respects for all of the code used other than
diff --git a/docs/acknowledgements.html b/docs/acknowledgements.html
index 14fdc74..9f7d3b8 100644
--- a/docs/acknowledgements.html
+++ b/docs/acknowledgements.html
@@ -5,19 +5,21 @@
 <meta http-equiv="content-style-type" content="text/css">
 <link rel="stylesheet" type="text/css" href="style.css">
 <title>ProGuard Acknowledgements</title>
+</head>
+<body>
+
 <script type="text/javascript" language="JavaScript">
 <!--
 if (window.self==window.top)
-  window.top.location.replace("index.html#"+window.location.pathname+window.location.hash);
-else {
-  var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
-  if (window.top.location.hash!=hash)
-    window.top.location.hash=hash;
-}
+  document.write('<a class="largebutton" target="_top" href="index.html#acknowledgements.html">ProGuard index</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/dexguard">DexGuard</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/">Saikoa</a> <a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>')
 //-->
 </script>
-</head>
-<body>
+<noscript>
+<a class="largebutton" target="_top"  href="index.html#acknowledgements.html">ProGuard index</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/dexguard">DexGuard</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/">Saikoa</a>
+<a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>
+</noscript>
 
 <h2>Acknowledgements</h2>
 
@@ -49,7 +51,7 @@
 S&ouml;derstedt, Clemens Eisserer, Clark Bassett, Eduard Welch, Dawid Weiss,
 Andrew Wilson, Sean Owen, Niels Gron, Ishan Mehta, Steven Adams, Xavier Kral,
 Stefan Martin, Toby Reyelts, Bernhard Eder, Manfred Moser, Marco Bl&uuml;mel,
-David Reiss,
+David Reiss, Roy Williams,
 and many more. Thanks! Your feedback has been invaluable.
 <p>
 
@@ -59,6 +61,10 @@
 <a href="http://www.saikoa.com/dexguard" target="_top">DexGuard</a>.
 <p>
 
+<a href="http://www.sky.com/" rel="nofollow" target="other">British Sky</a>
+has kindly sponsored the optimization of <i>enum</i> types.
+<p>
+
 <a href="http://sourceforge.net/projects/proguard/"
 target="other">SourceForge</a> is providing the resources for hosting this
 project and many other projects.
@@ -72,16 +78,11 @@
 The code and these web pages were written using Oracle/Sun's JDKs, Linux,
 IntelliJ IDEA, GNU emacs, bash, sed, awk, and a whole host of other tools that
 continue to make programming interesting.
-<p>
-
-And finally, I'm a great fan of Sanaware's <a
-href="http://www.javadocking.com/" target="other">Java Docking Library</a>.
 
 <hr />
-<noscript><div><a target="_top" href="index.html" class="button">Show menu</a></div></noscript>
 <address>
-Copyright &copy; 2002-2013
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2014
+<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a> @ <a target="top" href="http://www.saikoa.com/">Saikoa</a>.
 </address>
 
 </body>
diff --git a/docs/alternatives.html b/docs/alternatives.html
index 7aeffad..f4f78b6 100644
--- a/docs/alternatives.html
+++ b/docs/alternatives.html
@@ -5,19 +5,21 @@
 <meta http-equiv="content-style-type" content="text/css">
 <link rel="stylesheet" type="text/css" href="style.css">
 <title>ProGuard Alternatives</title>
+</head>
+<body>
+
 <script type="text/javascript" language="JavaScript">
 <!--
 if (window.self==window.top)
-  window.top.location.replace("index.html#"+window.location.pathname+window.location.hash);
-else {
-  var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
-  if (window.top.location.hash!=hash)
-    window.top.location.hash=hash;
-}
+  document.write('<a class="largebutton" target="_top" href="index.html#alternatives.html">ProGuard index</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/dexguard">DexGuard</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/">Saikoa</a> <a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>')
 //-->
 </script>
-</head>
-<body>
+<noscript>
+<a class="largebutton" target="_top"  href="index.html#alternatives.html">ProGuard index</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/dexguard">DexGuard</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/">Saikoa</a>
+<a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>
+</noscript>
 
 <h2>Alternatives</h2>
 
@@ -185,16 +187,6 @@
 </tr>
 
 <tr>
-<td><a target="other" rel="nofollow" href="http://www.garret.ru/~knizhnik/">Konstantin Knizhnik</a></td>
-<td><a target="other" href="http://www.garret.ru/~knizhnik/javago/ReadMe.htm">JavaGO</a></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td align="center"><br /></td>
-<td>Free</td>
-</tr>
-
-<tr>
 <td><a target="other" rel="nofollow" href="http://www.sable.mcgill.ca/">Sable</a></td>
 <td><a target="other" href="http://www.sable.mcgill.ca/JBCO/">JBCO</a></td>
 <td align="center"><br /></td>
@@ -315,16 +307,6 @@
 </tr>
 
 <tr>
-<td><a target="other" rel="nofollow" href="http://www.leesw.com/">LeeSoftware</a></td>
-<td><a target="other" href="http://www.leesw.com/">Smokescreen Obfuscator</a></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
-<td align="center"><br /></td>
-<td>Commercial</td>
-</tr>
-
-<tr>
 <td><a target="other" rel="nofollow" href="http://www.innaworks.com/">Innaworks</a></td>
 <td><a target="other" href="http://www.innaworks.com/mBooster">mBooster</a></td>
 <td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
@@ -376,7 +358,7 @@
 
 <tr>
 <td><a target="other" rel="nofollow" href="http://www.bisguard.com/">BIS Guard &amp; Co.</a></td>
-<td><a target="other" href="http://www.bisguard.com/java.html">Java Antidecompiler</a></td>
+<td><a target="other" href="http://www.bisguard.com/">Java Antidecompiler</a></td>
 <td align="center"><br /></td>
 <td align="center"><br /></td>
 <td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
@@ -426,7 +408,7 @@
 
 <tr>
 <td><a target="other" rel="nofollow" href="http://www.arxan.com/">Arxan</a></td>
-<td><a target="other" href="http://www.arxan.com/products/guardit-for-java/">GuardIT</a></td>
+<td><a target="other" href="http://www.arxan.com/products/desktop/guardit-for-java/">GuardIT</a></td>
 <td align="center"><br /></td>
 <td align="center"><br /></td>
 <td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
@@ -505,6 +487,16 @@
 </tr>
 
 <tr class="disappeared">
+<td><a target="other" rel="nofollow" href="http://www.garret.ru/~knizhnik/">Konstantin Knizhnik</a></td>
+<td><a target="other" rel="nofollow" href="http://www.garret.ru/~knizhnik/javago/ReadMe.htm">JavaGO</a></td>
+<td align="center"><br /></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
+<td align="center"><br /></td>
+<td align="center"><br /></td>
+<td>()disappeared?</td>
+</tr>
+
+<tr class="disappeared">
 <td><a target="other" rel="nofollow" href="http://donquixote.cafebabe.jp/">Haruaki Tamada</a></td>
 <td><a target="other" rel="nofollow" href="http://donquixote.cafebabe.jp/">DonQuixote</a></td>
 <td align="center"><br /></td>
@@ -685,6 +677,16 @@
 </tr>
 
 <tr class="disappeared">
+<td><a target="other" rel="nofollow" href="http://www.leesw.com/">LeeSoftware</a></td>
+<td><a target="other" rel="nofollow" href="http://www.leesw.com/">Smokescreen Obfuscator</a></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
+<td align="center"><br /></td>
+<td align="center"><img src="checkmark.gif" width="11" height="11" alt="x" /></td>
+<td align="center"><br /></td>
+<td>Commercial (disappeared?)</td>
+</tr>
+
+<tr class="disappeared">
 <td><a target="other" rel="nofollow" href="http://www.jproof.com/">JProof</a></td>
 <td><a target="other" rel="nofollow" href="http://www.jproof.com/">JProof</a></td>
 <td align="center"><br /></td>
@@ -749,10 +751,9 @@
 All trademarks are property of their respective holders.
 
 <hr />
-<noscript><div><a target="_top" href="index.html" class="button">Show menu</a></div></noscript>
 <address>
-Copyright &copy; 2002-2013
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2014
+<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a> @ <a target="top" href="http://www.saikoa.com/">Saikoa</a>.
 </address>
 
 </body>
diff --git a/docs/downloads.html b/docs/downloads.html
index 2baa929..37e865a 100644
--- a/docs/downloads.html
+++ b/docs/downloads.html
@@ -6,19 +6,21 @@
 <meta http-equiv="content-style-type" content="text/css">
 <link rel="stylesheet" type="text/css" href="style.css">
 <title>ProGuard Downloads</title>
+</head>
+<body>
+
 <script type="text/javascript" language="JavaScript">
 <!--
 if (window.self==window.top)
-  window.top.location.replace("index.html#"+window.location.pathname+window.location.hash);
-else {
-  var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
-  if (window.top.location.hash!=hash)
-    window.top.location.hash=hash;
-}
+  document.write('<a class="largebutton" target="_top" href="index.html#downloads.html">ProGuard index</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/dexguard">DexGuard</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/">Saikoa</a> <a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>')
 //-->
 </script>
-</head>
-<body>
+<noscript>
+<a class="largebutton" target="_top"  href="index.html#downloads.html">ProGuard index</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/dexguard">DexGuard</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/">Saikoa</a>
+<a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>
+</noscript>
 
 <h2>Downloads</h2>
 
@@ -72,6 +74,58 @@
 <a href="http://search.maven.org/#search|ga|1|a:%22proguard-retrace%22"
 target="other">proguard-retrace</a>.
 
+<h3><div>Oct 2014</div> Version 5.1</h3>
+<ul>
+<li>Fixed processing of various kinds of closures in Java 8.
+<li>Fixed shrinking of generic signatures in classes and methods.
+<li>Fixed shrinking of debug information about generic local variable types.
+<li>Fixed optimization of default implementations in interfaces.
+<li>Fixed optimization of variable initializations.
+<li>Fixed obfuscation of internal class names in strings.
+<li>Updated documentation and examples.
+</ul>
+
+<h3><div>Aug 2014</div> Version 5.0</h3>
+<ul>
+<li>Added support for Java 8.
+<li>Added <code>-keep</code> modifier <code>includedescriptorclasses</code>.
+<li>Added automatic suggestions for keeping attributes.
+<li>Clearing preverification information when <code>-dontpreverify</code> is
+    specified.
+<li>Extended optimization support for conservative optimization with java
+    system property <code>optimize.conservatively</code>.
+<li>Fixed occasional preverification problem.
+<li>Fixed shrinking of generic class signatures.
+<li>Fixed shrinking of generic variable signatures.
+<li>Fixed analysis of unused parameters for bootstrap methods in library
+    classes.
+<li>Fixed inlining problem of non-returning subroutines.
+<li>Fixed possible IllegalArgumentException and ArrayIndexOutOfBoundsException
+    in enum simplification.
+<li>Fixed unnecessary notes about dynamic class instantiations with constant
+    class names.
+<li>Fixed preverification of unnecessary casts of null values.
+<li>Fixed lazy resolution of output jars in Gradle task.
+<li>Fixed processing of synthetic code with alternative initializer invocations.
+<li>Improved handling of symbolic links in shell scripts.
+<li>Improved default path in Windows bat files.
+<li>Updated documentation and examples.
+</ul>
+
+<h3><div>Dec 2013</div> Version 4.11</h3>
+<ul>
+<li>Added simplification of basic enum types.
+<li>Added reading and writing of apk and aar archives.
+<li>Fixed criteria for class merging.
+<li>Fixed simplification of variable initializations.
+<li>Fixed simplification of redundant boolean variables.
+<li>Fixed optimization of unused stack entries in exception handlers.
+<li>Fixed correction of access flags after class merging, method inlining, and
+    class repackaging.
+<li>Refined criterion for method inlining.
+<li>Updated documentation and examples.
+</ul>
+
 <h3><div>Jul 2013</div> Version 4.10</h3>
 <ul>
 <li>Made Gradle task resolve files lazily.
@@ -691,10 +745,9 @@
 </ul>
 
 <hr />
-<noscript><div><a target="_top" href="index.html" class="button">Show menu</a></div></noscript>
 <address>
-Copyright &copy; 2002-2013
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2014
+<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a> @ <a target="top" href="http://www.saikoa.com/">Saikoa</a>.
 </address>
 
 </body>
diff --git a/docs/feedback.html b/docs/feedback.html
index dd9c509..8a2fad4 100644
--- a/docs/feedback.html
+++ b/docs/feedback.html
@@ -6,19 +6,21 @@
 <meta http-equiv="content-style-type" content="text/css">
 <link rel="stylesheet" type="text/css" href="style.css">
 <title>ProGuard Feedback</title>
+</head>
+<body>
+
 <script type="text/javascript" language="JavaScript">
 <!--
 if (window.self==window.top)
-  window.top.location.replace("index.html#"+window.location.pathname+window.location.hash);
-else {
-  var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
-  if (window.top.location.hash!=hash)
-    window.top.location.hash=hash;
-}
+  document.write('<a class="largebutton" target="_top" href="index.html#feedback.html">ProGuard index</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/dexguard">DexGuard</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/">Saikoa</a> <a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>')
 //-->
 </script>
-</head>
-<body>
+<noscript>
+<a class="largebutton" target="_top"  href="index.html#feedback.html">ProGuard index</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/dexguard">DexGuard</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/">Saikoa</a>
+<a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>
+</noscript>
 
 <h2>Feedback</h2>
 
@@ -77,8 +79,8 @@
 document.write("lafortune");
 document.write("&#64;");
 document.write("users.sourceforge.net");
-document.write("</a>");
-document.write(" <em>or</em> at ");
+document.write("<\/a>");
+document.write(" <em>or<\/em> at ");
 document.write("<a href=\"ma");
 document.write("ilto:");
 document.write("eric");
@@ -87,7 +89,7 @@
 document.write("eric");
 document.write("&#64;");
 document.write("graphics.cornell.edu");
-document.write("</a>");
+document.write("<\/a>");
 //-->
 </script>
 <noscript>
@@ -108,10 +110,9 @@
 projects.
 
 <hr />
-<noscript><div><a target="_top" href="index.html" class="button">Show menu</a></div></noscript>
 <address>
-Copyright &copy; 2002-2013
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2014
+<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a> @ <a target="top" href="http://www.saikoa.com/">Saikoa</a>.
 </address>
 
 </body>
diff --git a/docs/index.html b/docs/index.html
index ba40d16..40c85d7 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -88,8 +88,8 @@
 
 <hr />
 <address>
-Copyright &copy; 2002-2013
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2014
+<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a> @ <a target="top" href="http://www.saikoa.com/">Saikoa</a>.
 </address>
 </body>
 </noframes>
diff --git a/docs/license.html b/docs/license.html
index d1077b8..81eb962 100644
--- a/docs/license.html
+++ b/docs/license.html
@@ -5,30 +5,32 @@
 <meta http-equiv="content-style-type" content="text/css">
 <link rel="stylesheet" type="text/css" href="style.css">
 <title>ProGuard License</title>
+</head>
+<body>
+
 <script type="text/javascript" language="JavaScript">
 <!--
 if (window.self==window.top)
-  window.top.location.replace("index.html#"+window.location.pathname+window.location.hash);
-else {
-  var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
-  if (window.top.location.hash!=hash)
-    window.top.location.hash=hash;
-}
+  document.write('<a class="largebutton" target="_top" href="index.html#license.html">ProGuard index</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/dexguard">DexGuard</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/">Saikoa</a> <a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>')
 //-->
 </script>
-</head>
-<body>
+<noscript>
+<a class="largebutton" target="_top"  href="index.html#license.html">ProGuard index</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/dexguard">DexGuard</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/">Saikoa</a>
+<a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>
+</noscript>
 
 <h2>License</h2>
 
 <b>ProGuard</b> is free. You can use it freely for processing your
 applications, commercial or not. Your code obviously remains yours after
-having been processed, and its license can remain the same.
+having been processed, and its license can remain unchanged.
 <p>
 
-<b>ProGuard</b> itself is copyrighted, but its distribution license provides
-you with some rights for modifying and redistributing its code and its
-documentation. More specifically, <b>ProGuard</b> is distributed under the
+The <b>ProGuard code</b> itself is copyrighted, but its distribution license
+provides you with some rights for modifying and redistributing its code and
+its documentation. More specifically, <b>ProGuard</b> is distributed under the
 terms of the <a href="GPL.html">GNU General Public License</a> (GPL), version
 2, as published by the <a href="http://www.fsf.org/" target="other">Free
 Software Foundation</a> (FSF). In short, this means that you may freely
@@ -42,20 +44,17 @@
 target="other">FSF</a>), for combinations with the following stand-alone
 applications: Apache Ant, Apache Maven, the Google Android SDK, the Eclipse
 ProGuardDT GUI, the EclipseME JME IDE, the Oracle NetBeans Java IDE, the
-Oracle JME Wireless Toolkit, the Intel TXE SDK, the Simple Build Tool for
-Scala, the NeoMAD Tools by Neomades, the Javaground Tools, and the Sanaware
+Oracle JME Wireless Toolkit, the Simple Build Tool for Scala, and the Sanaware
 Tools.
 
 <p>
-The <b>ProGuard user documentation</b> represents an important part of this
-work. It may only be redistributed without changes, along with the unmodified
-version of the code.
+The <b>ProGuard user documentation</b> is copyrighted as well. It may only be
+redistributed without changes, along with the unmodified version of the code.
 
 <hr />
-<noscript><div><a target="_top" href="index.html" class="button">Show menu</a></div></noscript>
 <address>
-Copyright &copy; 2002-2013
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2014
+<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a> @ <a target="top" href="http://www.saikoa.com/">Saikoa</a>.
 </address>
 </body>
 </html>
diff --git a/docs/main.html b/docs/main.html
index 988d87c..742c11b 100644
--- a/docs/main.html
+++ b/docs/main.html
@@ -8,18 +8,21 @@
 <meta name="keywords" content="java obfuscator, optimizer, shrinker, preverfier">
 <link rel="stylesheet" type="text/css" href="style.css">
 <title>ProGuard Main</title>
+</head>
+<body>
+
 <script type="text/javascript" language="JavaScript">
 <!--
 if (window.self==window.top)
-  window.top.location.replace("index.html#"+window.location.pathname+window.location.hash);
-else {
-  if (window.top.location.hash!="")
-    window.top.location.hash="";
-}
+  document.write('<a class="largebutton" target="_top" href="index.html#main.html">ProGuard index</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/dexguard">DexGuard</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/">Saikoa</a> <a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>')
 //-->
 </script>
-</head>
-<body>
+<noscript>
+<a class="largebutton" target="_top"  href="index.html#main.html">ProGuard index</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/dexguard">DexGuard</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/">Saikoa</a>
+<a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>
+</noscript>
 
 <h2>Main</h2>
 
@@ -65,9 +68,9 @@
 <img align="left" src="android_shades.png" width="64" height="64" /></a>
 <b>ProGuard</b> now has a sibling optimizer and obfuscator for Android:
 <a href="http://www.saikoa.com/dexguard" target="_top"><b>DexGuard</b></a>. It
-focuses on code protection, with additional features like string encryption
-and class encryption. It directly targets Dalvik bytecode and streamlines the
-Android build process.
+focuses on code protection, with additional features like string encryption,
+class encryption, and dex splitting. It directly targets Dalvik bytecode and
+streamlines the Android build process.
 </p>
 The following sections provide more detailed information:
 <ul>
@@ -95,10 +98,9 @@
 </ul>
 
 <hr />
-<noscript><div><a target="_top" href="index.html" class="button">Show menu</a></div></noscript>
 <address>
-Copyright &copy; 2002-2013
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2014
+<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a> @ <a target="top" href="http://www.saikoa.com/">Saikoa</a>.
 </address>
 </body>
 </html>
diff --git a/docs/manual/ant.html b/docs/manual/ant.html
index 0837bbb..5db88df 100644
--- a/docs/manual/ant.html
+++ b/docs/manual/ant.html
@@ -5,24 +5,26 @@
 <meta http-equiv="content-style-type" content="text/css">
 <link rel="stylesheet" type="text/css" href="style.css">
 <title>Ant Task</title>
+</head>
+<body>
+
 <script type="text/javascript" language="JavaScript">
 <!--
 if (window.self==window.top)
-  window.top.location.replace("../index.html#"+window.location.pathname+window.location.hash);
-else {
-  var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
-  if (window.top.location.hash!=hash)
-    window.top.location.hash=hash;
-}
+  document.write('<a class="largebutton" target="_top" href="../index.html#manual/ant.html">ProGuard index</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/dexguard">DexGuard</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/">Saikoa</a> <a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>')
 //-->
 </script>
-</head>
-<body>
+<noscript>
+<a class="largebutton" target="_top"  href="../index.html#manual/ant.html">ProGuard index</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/dexguard">DexGuard</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/">Saikoa</a>
+<a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>
+</noscript>
 
 <h2>Ant Task</h2>
 
 <b>ProGuard</b> can be run as a task in the Java-based build tool Ant (version
-1.6.0 or higher).
+1.8 or higher).
 <p>
 
 Before you can use the <code>proguard</code> task, you have to tell Ant about
@@ -320,25 +322,27 @@
 <dt><a href="usage.html#injars"><code><b>&lt;injar</b></code></a>
     <a href="#classpath"><i>class_path</i></a>
     <code><b>/&gt;</b></code></dt>
-<dd>Specifies the program jars (or wars, ears, zips, or directories).</dd>
+<dd>Specifies the program jars (or aars, wars, ears, zips, apks, or
+    directories).</dd>
 
 <dt><a href="usage.html#outjars"><code><b>&lt;outjar</b></code></a>
     <a href="#classpath"><i>class_path</i></a>
     <code><b>/&gt;</b></code></dt>
-<dd>Specifies the names of the output jars (or wars, ears, zips, or
+<dd>Specifies the names of the output jars (or aars, wars, ears, zips, apks, or
     directories).</dd>
 
 <dt><a href="usage.html#libraryjars"><code><b>&lt;libraryjar</b></code></a>
     <a href="#classpath"><i>class_path</i></a>
     <code><b>/&gt;</b></code></dt>
-<dd>Specifies the library jars (or wars, ears, zips, or directories).</dd>
+<dd>Specifies the library jars (or aars, wars, ears, zips, apks, or
+    directories).</dd>
 
 <dt><a href="usage.html#keepdirectories"><code><b>&lt;keepdirectory name = </b></code></a>"<i>directory_name</i>"
     <code><b>/&gt;</b></code><br/>
     <a href="usage.html#keepdirectories"><code><b>&lt;keepdirectories filter = </b></code></a>"<a href="usage.html#filefilters"><i>directory_filter</i></a>"
     <code><b>/&gt;</b></code></dt>
-<dd>Keep the specified directories in the output jars (or wars, ears, zips, or
-    directories).</dd>
+<dd>Keep the specified directories in the output jars (or aars, wars, ears,
+    zips, apks, or directories).</dd>
 
 <dt><a href="usage.html#keep"><code><b>&lt;keep</b></code></a>
     <a href="#keepmodifier"><i>modifiers</i></a>
@@ -481,13 +485,13 @@
 <dl>
 
 <dt><code><b>path</b></code> = "<i>path</i>"</dt>
-<dd>The names of the jars (or wars, ears, zips, or directories), separated by
-    the path separator.</dd>
+<dd>The names of the jars (or aars, wars, ears, zips, apks, or directories),
+    separated by the path separator.</dd>
 
 <dt><code><b>location</b></code> = "<i>name</i>" (or <code><b>file</b></code>
     = "<i>name</i>", or <code><b>dir</b></code> = "<i>name</i>", or
     <code><b>name</b></code> = "<i>name</i>")</dt>
-<dd>Alternatively, the name of a single jar (or war, ear, zip, or
+<dd>Alternatively, the name of a single jar (or aar, war, ear, zip, or
     directory).</dd>
 
 <dt><code><b>refid</b></code> = "<i>ref_id</i>"</dt>
@@ -505,10 +509,18 @@
 <dd>An optional filter for all class file names and resource file names that
     are encountered.</dd>
 
+<dt><code><b>apkfilter</b></code> =
+    "<a href="usage.html#filefilters"><i>file_filter</i></a>"</dt>
+<dd>An optional filter for all apk names that are encountered.</dd>
+
 <dt><code><b>jarfilter</b></code> =
     "<a href="usage.html#filefilters"><i>file_filter</i></a>"</dt>
 <dd>An optional filter for all jar names that are encountered.</dd>
 
+<dt><code><b>aarfilter</b></code> =
+    "<a href="usage.html#filefilters"><i>file_filter</i></a>"</dt>
+<dd>An optional filter for all aar names that are encountered.</dd>
+
 <dt><code><b>warfilter</b></code> =
     "<a href="usage.html#filefilters"><i>file_filter</i></a>"</dt>
 <dd>An optional filter for all war names that are encountered.</dd>
@@ -529,6 +541,12 @@
 
 <dl>
 
+<dt><a href="usage.html#includedescriptorclasses"><code><b>includedescriptorclasses</b></code></a>
+    = "<i>boolean</i>"
+    (default = false)</dt>
+<dd>Specifies whether the classes of the fields and methods specified in the
+    keep tag must be kept as well.</dd>
+
 <dt><a href="usage.html#allowshrinking"><code><b>allowshrinking</b></code></a>
     = "<i>boolean</i>"
     (default = false)</dt>
@@ -635,10 +653,9 @@
 </dl>
 
 <hr />
-<noscript><div><a target="_top" href="../index.html" class="button">Show menu</a></div></noscript>
 <address>
-Copyright &copy; 2002-2013
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2014
+<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a> @ <a target="top" href="http://www.saikoa.com/">Saikoa</a>.
 </address>
 </body>
 </html>
diff --git a/docs/manual/attributes.html b/docs/manual/attributes.html
new file mode 100644
index 0000000..08265e7
--- /dev/null
+++ b/docs/manual/attributes.html
@@ -0,0 +1,217 @@
+<!doctype html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="content-type" content="text/html; charset=iso-8859-1">
+<meta http-equiv="content-style-type" content="text/css">
+<link rel="stylesheet" type="text/css" href="style.css">
+<title>Attributes</title>
+</head>
+<body>
+
+<script type="text/javascript" language="JavaScript">
+<!--
+if (window.self==window.top)
+  document.write('<a class="largebutton" target="_top" href="../index.html#manual/attributes.html">ProGuard index</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/dexguard">DexGuard</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/">Saikoa</a> <a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>')
+//-->
+</script>
+<noscript>
+<a class="largebutton" target="_top"  href="../index.html#manual/attributes.html">ProGuard index</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/dexguard">DexGuard</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/">Saikoa</a>
+<a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>
+</noscript>
+
+<h2>Attributes</h2>
+
+Class files essentially define classes, their fields, and their methods. A lot
+of essential and non-essential data are attached to these classes, fields, and
+methods as <i>attributes</i>. For instance, attributes can contain bytecode,
+source file names, line number tables, etc.
+<p>
+
+ProGuard's obfuscation step removes attributes that are generally not
+necessary for executing the code. With
+the <a href="usage.html#keepattributes"><code>-keepattributes</code></a>
+option, you can specify a filter for attributes that you do want to keep, for
+instance, if your code accesses them through reflection or if you want to
+preserve some compilation or debugging information. The filter works like
+any <a href="usage.html#filters">filter</a> in ProGuard.
+<p>
+
+The following wildcards are supported:
+
+<table cellspacing="10">
+<tr><td valign="top"><code><b>?</b></code></td>
+    <td>matches any single character in an attribute name.</td></tr>
+<tr><td valign="top"><code><b>*</b></code></td>
+    <td>matches any part of an attribute name.</td></tr>
+</table>
+
+An attribute name that is preceded by an exclamation mark '<b>!</b>' is
+<i>excluded</i> from further attempts to match with <i>subsequent</i>
+attribute names in the filter. Make sure to specify filters correctly, since
+they are not checked for potential typos.
+<p>
+
+For example, the following setting preserves the optional attributes that are
+typically necessary when processing code that is intended to be used as a
+library:
+<pre>
+-keepattributes Exceptions,InnerClasses,Signature,Deprecated,
+                SourceFile,LineNumberTable,*Annotation*,EnclosingMethod
+</pre>
+<p>
+
+The Java bytecode specifications currently specify the following list of
+attributes.
+
+<h3>Optional attributes</h3>
+
+ProGuard's obfuscation step by default discards the following optional
+attributes. You can keep them with
+the <a href="usage.html#keepattributes"><code>-keepattributes</code></a>
+option.
+
+<dl>
+<dt><code><b>SourceFile</b></code></dt>
+<dd>Specifies the name of the source file from which the class file was
+    compiled. If present, this name is reported in stack traces.</dd>
+
+<dt><div>(J++ extension)</div>
+    <code><b>SourceDir</b></code></dt>
+<dd>Specifies the name of the source directory from which the class file was
+    compiled.</dd>
+
+<dt><code><b>InnerClasses</b></code></dt>
+<dd>Specifies the relationship between a class and its inner classes and outer
+    classes. Other than this and the naming convention with a '$' separator
+    between the names of inner classes and outer classes, inner classes are
+    just like ordinary classes. Compilers may need this information to find
+    classes referenced in a compiled library. Code may access this information
+    by reflection, for instance to derive the simple name of the class.</dd>
+
+<dt><div>(Java 5 or higher)</div>
+    <code><b>EnclosingMethod</b></code></dt>
+<dd>Specifies the method in which the class was defined. Compilers may need
+    this information to find classes referenced in a compiled library. Code
+    may access this information by reflection, for instance to derive the
+    simple name of the class.</dd>
+
+<dt><code><b>Deprecated</b></code></dt>
+<dd>Indicates that the class, field, or method is deprecated.</dd>
+
+<dt><code><b>Synthetic</b></code></dt>
+<dd>Indicates that the class, field, or method was generated by the
+    compiler.</dd>
+
+<dt><div>(Java 5 or higher)</div>
+    <code><b>Signature</b></code></dt>
+<dd>Specifies the generic signature of the class, field, or method. Compilers
+    may need this information to properly compile classes that use generic
+    types from compiled libraries. Code may access this signature by
+    reflection.</dd>
+
+<dt><div>(Java 8 or higher)</div>
+    <code><b>MethodParameters</b></code></dt>
+<dd>Specifies the names and access flags of the parameters of the method. Code
+    may access this information by reflection.</dd>
+
+<dt><code><b>Exceptions</b></code></dt>
+<dd>Specifies the exceptions that a method may throw. Compilers may use this
+    information to enforce catching them.</dd>
+
+<dt><code><b>LineNumberTable</b></code></dt>
+<dd>Specifies the line numbers of the method. If present, these line numbers
+    are reported in stack traces.</dd>
+
+<dt><code><b>LocalVariableTable</b></code></dt>
+<dd>Specifies the names and types of local variables of the method. If present,
+    some IDEs may use this information for helping with auto-completion.</dd>
+
+<dt><div>(Java 5 or higher)</div>
+    <code><b>LocalVariableTypeTable</b></code></dt>
+<dd>Specifies the names and generic types of local variables of the method. If
+    present, some IDEs may use this information for helping with
+    auto-completion.</dd>
+
+<dt><div>(Java 5 or higher)</div>
+    <code><b>RuntimeVisibleAnnotations</b></code></dt>
+<dd>Specifies the annotations that are visible at run-time, for classes,
+    fields, and methods. Compilers and annotation processors may use these
+    annotations. Code may access them by reflection.</dd>
+
+<dt><div>(Java 5 or higher)</div>
+    <code><b>RuntimeInvisibleAnnotations</b></code></dt>
+<dd>Specifies the annotations that are visible at compile-time, for classes,
+    fields, and methods. Compilers and annotation processors may use these
+    annotations.</dd>
+
+<dt><div>(Java 5 or higher)</div>
+    <code><b>RuntimeVisibleParameterAnnotations</b></code></dt>
+<dd>Specifies the annotations that are visible at run-time, for method
+    parameters. Compilers and annotation processors may use these
+    annotations. Code may access them by reflection.</dd>
+
+<dt><div>(Java 5 or higher)</div>
+    <code><b>RuntimeInvisibleParameterAnnotations</b></code></dt>
+<dd>Specifies the annotations that are visible at compile-time, for method
+    parameters. Compilers and annotation processors may use these
+    annotations.</dd>
+
+<dt><div>(Java 8 or higher)</div>
+    <code><b>RuntimeVisibleTypeAnnotations</b></code></dt>
+<dd>Specifies the annotations that are visible at run-time, for generic types,
+    instructions, etc. Compilers and annotation processors may use these
+    annotations. Code may access them by reflection.</dd>
+
+<dt><div>(Java 8 or higher)</div>
+    <code><b>RuntimeInvisibleTypeAnnotations</b></code></dt>
+<dd>Specifies the annotations that are visible at compile-time, for generic
+    types, instructions, etc. Compilers and annotation processors may use
+    these annotations.</dd>
+
+<dt><div>(Java 5 or higher)</div>
+    <code><b>AnnotationDefault</b></code></dt>
+<dd>Specifies a default value for an annotation.</dd>
+
+</dl>
+<p>
+
+<h3>Essential attributes</h3>
+
+ProGuard automatically keeps the following essential attributes, processing
+them as necessary. We're listing them for the sake of completeness.
+
+<dl>
+<dt><code><b>ConstantValue</b></code></dt>
+<dd>Specifies a constant integer, float, class, string, etc.</dd>
+
+<dt><code><b>Code</b></code></dt>
+<dd>Specifies the actual bytecode of a method.</dd>
+
+<dt><div>(Java Micro Edition)</div>
+    <code><b>StackMap</b></code></dt>
+<dd>Provides preverification information. The Java Virtual Machine can use
+    this information to speed up the verification step when loading a
+    class.</dd>
+
+<dt><div>(Java 6 or higher)</div>
+    <code><b>StackMapTable</b></code></dt>
+<dd>Provides preverification information. The Java Virtual Machine can use
+    this information to speed up the verification step when loading a
+    class.</dd>
+
+<dt><div>(Java 7 or higher)</div>
+    <code><b>BootstrapMethods</b></code></dt>
+<dd>Specifies the methods to bootstrap dynamic method invocations.</dd>
+
+</dl>
+<p>
+
+<hr />
+<address>
+Copyright &copy; 2002-2014
+<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a> @ <a target="top" href="http://www.saikoa.com/">Saikoa</a>.
+</address>
+</body>
+</html>
diff --git a/docs/manual/examples.html b/docs/manual/examples.html
index 804ae17..dec9613 100644
--- a/docs/manual/examples.html
+++ b/docs/manual/examples.html
@@ -5,19 +5,21 @@
 <meta http-equiv="content-style-type" content="text/css">
 <link rel="stylesheet" type="text/css" href="style.css">
 <title>ProGuard Examples</title>
+</head>
+<body>
+
 <script type="text/javascript" language="JavaScript">
 <!--
 if (window.self==window.top)
-  window.top.location.replace("../index.html#"+window.location.pathname+window.location.hash);
-else {
-  var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
-  if (window.top.location.hash!=hash)
-    window.top.location.hash=hash;
-}
+  document.write('<a class="largebutton" target="_top" href="../index.html#manual/examples.html">ProGuard index</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/dexguard">DexGuard</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/">Saikoa</a> <a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>')
 //-->
 </script>
-</head>
-<body>
+<noscript>
+<a class="largebutton" target="_top"  href="../index.html#manual/examples.html">ProGuard index</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/dexguard">DexGuard</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/">Saikoa</a>
+<a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>
+</noscript>
 
 <h2>Examples</h2>
 
@@ -268,13 +270,16 @@
 
 <h3><a name="androidapplication">A complete Android application</a></h3>
 
-<img class="float" src="attention.gif" width="64" height="64" alt="attention" />
-The Ant and Eclipse build processes of the Android SDK already integrate
-ProGuard by default, with all the proper settings. You only need to enable
-ProGuard (for release builds), by uncommenting the line
-"<code>proguard.config=.....</code>" in the file
-<code>project.properties</code> (created or updated by Android SDK revision 17
-or higher). Notes:
+<img class="float" src="attention.gif" width="64" height="64" alt="attention"
+/> The standard build processes of the Android SDK (with Ant, Gradle, Android
+Studio, and Eclipse) already integrate ProGuard with all the proper settings.
+You only need to enable ProGuard by uncommenting the line
+"<code>proguard.config=.....</code>" in the
+file <code>project.properties</code> (created or updated by Android SDK
+revision 17 or higher) or by adapting your <code>build.gradle</code> file. You
+then <em>don't</em> need any of the configuration below.
+<p>
+Notes:
 <ul>
 <li>In case of problems, you may want to check if the configuration files that
     are listed on this line (<code>proguard-project.txt</code>,...) contain
@@ -296,9 +301,10 @@
 href="http://developer.android.com/guide/developing/tools/proguard.html">Developer
 Guide</a> in the Android SDK.
 <p>
-If you're constructing a build process from scratch: these options shrink,
-optimize, and obfuscate all public activities, services, broadcast receivers,
-and content providers from the compiled classes and external libraries:
+If you're constructing a build process <em>from scratch</em>: these options
+shrink, optimize, and obfuscate all public activities, services, broadcast
+receivers, and content providers from the compiled classes and external
+libraries:
 <pre>
 -injars      bin/classes
 -injars      libs
@@ -338,7 +344,7 @@
 }
 
 -keepclassmembers class * implements android.os.Parcelable {
-    static android.os.Parcelable$Creator CREATOR;
+    static ** CREATOR;
 }
 
 -keepclassmembers class **.R$* {
@@ -434,11 +440,11 @@
     java.lang.Class class$(java.lang.String, boolean);
 }
 
--keepclasseswithmembernames class * {
+-keepclasseswithmembernames,includedescriptorclasses class * {
     native &lt;methods&gt;;
 }
 
--keepclassmembers enum * {
+-keepclassmembers,allowoptimization enum * {
     public static **[] values();
     public static ** valueOf(java.lang.String);
 }
@@ -745,15 +751,19 @@
 still be linked to the native library. The following additional option will
 ensure that:
 <pre>
--keepclasseswithmembernames class * {
+-keepclasseswithmembernames,includedescriptorclasses class * {
     native &lt;methods&gt;;
 }
 </pre>
 <p>
-Note the use of <a
-href="usage.html#keepclasseswithmembernames"><code>-keepclasseswithmembernames</code></a>.
+Note the use of
+<a href="usage.html#keepclasseswithmembernames"><code>-keepclasseswithmembernames</code></a>.
 We don't want to preserve all classes or all native methods; we just want to
-keep the relevant names from being obfuscated.
+keep the relevant names from being obfuscated. The modifier
+<a href="usage.html#includedescriptorclasses">includedescriptorclasses</a>
+additionally makes sure that the return types and parameter types aren't
+renamed either, so the entire signatures remain compatible with the native
+libraries.
 <p>
 ProGuard doesn't look at your native code, so it won't automatically preserve
 the classes or class members that are invoked by the native code. These are
@@ -787,7 +797,7 @@
 generation). You have to specify these explicitly, to make sure they aren't
 removed or obfuscated:
 <pre>
--keepclassmembers enum * {
+-keepclassmembers,allowoptimization enum * {
     public static **[] values();
     public static ** valueOf(java.lang.String);
 }
@@ -857,9 +867,9 @@
     is then computed from a list of features the serializable class. Changing
     the class ever so slightly may change the computed serial version UID. The
     list of features is specified in the section on <a
-    href="http://java.sun.com/javase/6/docs/platform/serialization/spec/class.html#4100">Stream
+    href="http://docs.oracle.com/javase/8/docs/platform/serialization/spec/class.html#a4100">Stream
     Unique Identifiers</a> of Sun's <a
-    href="http://java.sun.com/javase/6/docs/platform/serialization/spec/serialTOC.html">Java
+    href="http://docs.oracle.com/javase/8/docs/platform/serialization/spec/serialTOC.html">Java
     Object Serialization Specification</a>. The following directives should at
     least partially ensure compatibility with the original classes:
 
@@ -887,6 +897,26 @@
     computing the UID. A fast but sub-optimal alternative would be simply
     keeping all interfaces with "<code>-keep interface *</code>".</li>
 
+<li>In the rare event that you are serializing lambda expressions in Java 8 or
+    higher, you need to preserve some methods and adapt the hard-coded names
+    of the classes in which they occur:
+
+<pre>
+-keepclassmembers class * {
+    private static synthetic java.lang.Object $deserializeLambda$(java.lang.invoke.SerializedLambda);
+}
+
+-keepclassmembernames class * {
+    private static synthetic *** lambda$*(...);
+}
+
+-adaptclassstrings com.example.Test
+</pre>
+<p>
+
+    This should satisfy the reflection in the deserialization code of the
+    Java run-time.
+
 </ul>
 <p>
 
@@ -1582,10 +1612,9 @@
 illustrate some of the possibilities.
 
 <hr />
-<noscript><div><a target="_top" href="../index.html" class="button">Show menu</a></div></noscript>
 <address>
-Copyright &copy; 2002-2013
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2014
+<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a> @ <a target="top" href="http://www.saikoa.com/">Saikoa</a>.
 </address>
 </body>
 </html>
diff --git a/docs/manual/gradle.html b/docs/manual/gradle.html
index 3e0e500..35ab845 100644
--- a/docs/manual/gradle.html
+++ b/docs/manual/gradle.html
@@ -5,25 +5,26 @@
 <meta http-equiv="content-style-type" content="text/css">
 <link rel="stylesheet" type="text/css" href="style.css">
 <title>Gradle Task</title>
-<script type="text/javascript" language="JavaScript">
-<!--
-if (window.self==window.top) {
-  history.go(-1);
-  window.top.location.replace("../index.html#"+window.location.pathname+window.location.hash);
-} else {
-  var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
-  if (window.top.location.hash!=hash)
-    window.top.location.hash=hash;
-}
-//-->
-</script>
 </head>
 <body>
 
+<script type="text/javascript" language="JavaScript">
+<!--
+if (window.self==window.top)
+  document.write('<a class="largebutton" target="_top" href="../index.html#manual/gradle.html">ProGuard index</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/dexguard">DexGuard</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/">Saikoa</a> <a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>')
+//-->
+</script>
+<noscript>
+<a class="largebutton" target="_top"  href="../index.html#manual/gradle.html">ProGuard index</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/dexguard">DexGuard</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/">Saikoa</a>
+<a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>
+</noscript>
+
 <h2>Gradle Task</h2>
 
 <b>ProGuard</b> can be run as a task in the Java-based build tool Gradle
-(version 1.3 or higher).
+(version 2.1 or higher).
 <p>
 
 Before you can use the <code>proguard</code> task, you have to make sure
@@ -37,7 +38,7 @@
         flatDir dirs: '/usr/local/java/proguard/lib'
     }
     dependencies {
-        classpath ':proguard'
+        classpath ':proguard:'
     }
 }
 </pre>
@@ -85,19 +86,21 @@
 
 <dt><a href="usage.html#injars"><code><b>injars</b></code></a>
     <a href="#classpath"><i>class_path</i></a></dt>
-<dd>Specifies the program jars (or wars, ears, zips, or directories). The files
-    are resolved and read lazily, during the execution phase.</dd>
+<dd>Specifies the program jars (or aars, wars, ears, zips, apks, or
+    directories). The files are resolved and read lazily, during the execution
+    phase.</dd>
 
 <dt><a href="usage.html#outjars"><code><b>outjars</b></code></a>
     <a href="#classpath"><i>class_path</i></a></dt>
-<dd>Specifies the names of the output jars (or wars, ears, zips, or
+<dd>Specifies the names of the output jars (or aars, wars, ears, zips, apks, or
     directories). The files are resolved and written lazily, during the
     execution phase.</dd>
 
 <dt><a href="usage.html#libraryjars"><code><b>libraryjars</b></code></a>
     <a href="#classpath"><i>class_path</i></a></dt>
-<dd>Specifies the library jars (or wars, ears, zips, or directories). The files
-    are resolved and read lazily, during the execution phase.</dd>
+<dd>Specifies the library jars (or aars, wars, ears, zips, apks, or
+    directories). The files are resolved and read lazily, during the execution
+    phase.</dd>
 
 <dt><a href="usage.html#skipnonpubliclibraryclasses"><code><b>skipnonpubliclibraryclasses</b></code></a></dt>
 <dd>Ignore non-public library classes.</dd>
@@ -107,8 +110,8 @@
 
 <dt><a href="usage.html#keepdirectories"><code><b>keepdirectories</b></code></a>
     ['<a href="usage.html#filefilters"><i>directory_filter</i></a>']</dt>
-<dd>Keep the specified directories in the output jars (or wars, ears, zips,
-    or directories).</dd>
+<dd>Keep the specified directories in the output jars (or aars, wars, ears,
+    zips, apks, or directories).</dd>
 
 <dt><a href="usage.html#target"><code><b>target</b></code></a>
     '<i>version</i>'</dt>
@@ -317,10 +320,18 @@
 <dd>An optional filter for all class file names and resource file names that
     are encountered.</dd>
 
+<dt><code><b>apkfilter:</b></code>
+    '<a href="usage.html#filefilters"><i>file_filter</i></a>'</dt>
+<dd>An optional filter for all apk names that are encountered.</dd>
+
 <dt><code><b>jarfilter:</b></code>
     '<a href="usage.html#filefilters"><i>file_filter</i></a>'</dt>
 <dd>An optional filter for all jar names that are encountered.</dd>
 
+<dt><code><b>aarfilter:</b></code>
+    '<a href="usage.html#filefilters"><i>file_filter</i></a>'</dt>
+<dd>An optional filter for all aar names that are encountered.</dd>
+
 <dt><code><b>warfilter:</b></code>
     '<a href="usage.html#filefilters"><i>file_filter</i></a>'</dt>
 <dd>An optional filter for all war names that are encountered.</dd>
@@ -357,6 +368,12 @@
 
 <dl>
 
+<dt><a href="usage.html#includedescriptorclasses"><code><b>includedescriptorclasses:</b></code></a>
+    <i>boolean</i>
+    (default = false)</dt>
+<dd>Specifies whether the classes of the fields and methods specified in the
+    keep tag must be kept as well.</dd>
+
 <dt><a href="usage.html#allowshrinking"><code><b>allowshrinking:</b></code></a>
     <i>boolean</i>
     (default = false)</dt>
@@ -448,7 +465,7 @@
 constraints, so the settings match all classes.
 <p>
 
-<h3><a name="cl">Gradle-style Class Member Specifications</h3>
+<h3><a name="classmemberspecification">Gradle-style Class Member Specifications</a></h3>
 
 The closure of a Gradle-style class specification can specify class members
 with these settings:
@@ -536,10 +553,9 @@
 <p>
 
 <hr />
-<noscript><div><a target="_top" href="../index.html" class="button">Show menu</a></div></noscript>
 <address>
-Copyright &copy; 2002-2013
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2014
+<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a> @ <a target="top" href="http://www.saikoa.com/">Saikoa</a>.
 </address>
 </body>
 </html>
diff --git a/docs/manual/gui.html b/docs/manual/gui.html
index 6677aaf..176295e 100644
--- a/docs/manual/gui.html
+++ b/docs/manual/gui.html
@@ -5,19 +5,21 @@
 <meta http-equiv="content-style-type" content="text/css">
 <link rel="stylesheet" type="text/css" href="style.css">
 <title>ProGuard GUI</title>
+</head>
+<body>
+
 <script type="text/javascript" language="JavaScript">
 <!--
 if (window.self==window.top)
-  window.top.location.replace("../index.html#"+window.location.pathname+window.location.hash);
-else {
-  var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
-  if (window.top.location.hash!=hash)
-    window.top.location.hash=hash;
-}
+  document.write('<a class="largebutton" target="_top" href="../index.html#manual/gui.html">ProGuard index</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/dexguard">DexGuard</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/">Saikoa</a> <a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>')
 //-->
 </script>
-</head>
-<body>
+<noscript>
+<a class="largebutton" target="_top"  href="../index.html#manual/gui.html">ProGuard index</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/dexguard">DexGuard</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/">Saikoa</a>
+<a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>
+</noscript>
 
 <h2>Graphical User Interface</h2>
 
@@ -90,8 +92,8 @@
 <h2><a name="inputoutput">The Input/Output Tab</a></h2>
 
 The <i>Input/Output</i> tab contains two lists, respectively to specify the
-program jars (or wars, ears, zips, or directories), and the library jars (or
-wars, ears, zips, or directories).
+program jars (or aars, wars, ears, zips, apks, or directories), and the
+library jars (or aars, wars, ears, zips, apks, or directories).
 
 <ul>
 <li>The list of program jars contains input entries and output entries. Input
@@ -140,11 +142,12 @@
 </table>
 <p>
 
-Filters allow to filter files based on their names. One can specify filters
-for class file names and resource file names, for jar file names, for war file
-names, for ear file names, and for zip file names. Multiple entries in the
-program list only make sense when combined with filters; each output file is
-written to the first entry with a matching filter.
+Filters allow to filter files based on their names. You can specify filters
+for class file names and resource file names, for jar file names, for aar file
+names, for war file names, for ear file names, for zip file names, and for
+apk file names. Multiple entries in the program list only make sense when
+combined with filters; each output file is written to the first entry with a
+matching filter.
 <p>
 
 Input entries that are currently not readable are colored red.
@@ -472,10 +475,9 @@
 </table>
 
 <hr />
-<noscript><div><a target="_top" href="../index.html" class="button">Show menu</a></div></noscript>
 <address>
-Copyright &copy; 2002-2013
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2014
+<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a> @ <a target="top" href="http://www.saikoa.com/">Saikoa</a>.
 </address>
 </body>
 </html>
diff --git a/docs/manual/index.html b/docs/manual/index.html
index 643a216..da93361 100644
--- a/docs/manual/index.html
+++ b/docs/manual/index.html
@@ -5,17 +5,6 @@
 <meta http-equiv="content-style-type" content="text/css">
 <link rel="stylesheet" type="text/css" href="style.css">
 <title>ProGuard Manual</title>
-<script type="text/javascript" language="JavaScript">
-<!--
-if (window.self==window.top)
-  window.top.location.replace("../index.html#"+window.location.pathname+window.location.hash);
-else {
-  var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
-  if (window.top.location.hash!=hash)
-    window.top.location.hash=hash;
-}
-//-->
-</script>
 </head>
 <body>
 
@@ -45,8 +34,8 @@
 <hr />
 <noscript><div><a target="_top" href="../index.html" class="button">Show menu</a></div></noscript>
 <address>
-Copyright &copy; 2002-2013
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2014
+<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a> @ <a target="top" href="http://www.saikoa.com/">Saikoa</a>.
 </address>
 </body>
 </html>
diff --git a/docs/manual/introduction.html b/docs/manual/introduction.html
index 3f18114..3b1fc29 100644
--- a/docs/manual/introduction.html
+++ b/docs/manual/introduction.html
@@ -5,19 +5,21 @@
 <meta http-equiv="content-style-type" content="text/css">
 <link rel="stylesheet" type="text/css" href="style.css">
 <title>ProGuard Introduction</title>
+</head>
+<body>
+
 <script type="text/javascript" language="JavaScript">
 <!--
 if (window.self==window.top)
-  window.top.location.replace("../index.html#"+window.location.pathname+window.location.hash);
-else {
-  var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
-  if (window.top.location.hash!=hash)
-    window.top.location.hash=hash;
-}
+  document.write('<a class="largebutton" target="_top" href="../index.html#manual/introduction.html">ProGuard index</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/dexguard">DexGuard</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/">Saikoa</a> <a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>')
 //-->
 </script>
-</head>
-<body>
+<noscript>
+<a class="largebutton" target="_top"  href="../index.html#manual/introduction.html">ProGuard index</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/dexguard">DexGuard</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/">Saikoa</a>
+<a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>
+</noscript>
 
 <h2>Introduction</h2>
 
@@ -72,15 +74,15 @@
 </table>
 <p>
 
-ProGuard first reads the <b>input jars</b> (or wars, ears, zips, or
-directories). It then subsequently shrinks, optimizes, obfuscates, and
+ProGuard first reads the <b>input jars</b> (or aars, wars, ears, zips, apks,
+or directories). It then subsequently shrinks, optimizes, obfuscates, and
 preverifies them. You can optionally let ProGuard perform multiple
 optimization passes. ProGuard writes the processed results to one or
-more <b>output jars</b> (or wars, ears, zips, or directories). The input may
-contain resource files, whose names and contents can optionally be updated to
-reflect the obfuscated class names.
+more <b>output jars</b> (or aars, wars, ears, zips, apks, or directories). The
+input may contain resource files, whose names and contents can optionally be
+updated to reflect the obfuscated class names.
 <p>
-ProGuard requires the <b>library jars</b> (or wars, ears, zips, or
+ProGuard requires the <b>library jars</b> (or aars, wars, ears, zips, apks, or
 directories) of the input jars to be specified. These are essentially the
 libraries that you would need for compiling the code. ProGuard uses them to
 reconstruct the class dependencies that are necessary for proper processing.
@@ -163,10 +165,9 @@
 about the internals of the code.
 
 <hr />
-<noscript><div><a target="_top" href="../index.html" class="button">Show menu</a></div></noscript>
 <address>
-Copyright &copy; 2002-2013
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2014
+<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a> @ <a target="top" href="http://www.saikoa.com/">Saikoa</a>.
 </address>
 </body>
 </html>
diff --git a/docs/manual/limitations.html b/docs/manual/limitations.html
index 6b69410..883d6e6 100644
--- a/docs/manual/limitations.html
+++ b/docs/manual/limitations.html
@@ -5,19 +5,21 @@
 <meta http-equiv="content-style-type" content="text/css">
 <link rel="stylesheet" type="text/css" href="style.css">
 <title>ProGuard Limitations</title>
+</head>
+<body>
+
 <script type="text/javascript" language="JavaScript">
 <!--
 if (window.self==window.top)
-  window.top.location.replace("../index.html#"+window.location.pathname+window.location.hash);
-else {
-  var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
-  if (window.top.location.hash!=hash)
-    window.top.location.hash=hash;
-}
+  document.write('<a class="largebutton" target="_top" href="../index.html#manual/limitations.html">ProGuard index</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/dexguard">DexGuard</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/">Saikoa</a> <a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>')
 //-->
 </script>
-</head>
-<body>
+<noscript>
+<a class="largebutton" target="_top"  href="../index.html#manual/limitations.html">ProGuard index</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/dexguard">DexGuard</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/">Saikoa</a>
+<a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>
+</noscript>
 
 <h2>Limitations</h2>
 
@@ -60,10 +62,9 @@
 </ul>
 
 <hr />
-<noscript><div><a target="_top" href="../index.html" class="button">Show menu</a></div></noscript>
 <address>
-Copyright &copy; 2002-2013
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2014
+<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a> @ <a target="top" href="http://www.saikoa.com/">Saikoa</a>.
 </address>
 </body>
 </html>
diff --git a/docs/manual/optimizations.html b/docs/manual/optimizations.html
index e4c96b6..4bb18c3 100644
--- a/docs/manual/optimizations.html
+++ b/docs/manual/optimizations.html
@@ -5,19 +5,21 @@
 <meta http-equiv="content-style-type" content="text/css">
 <link rel="stylesheet" type="text/css" href="style.css">
 <title>Optimizations</title>
+</head>
+<body>
+
 <script type="text/javascript" language="JavaScript">
 <!--
 if (window.self==window.top)
-  window.top.location.replace("../index.html#"+window.location.pathname+window.location.hash);
-else {
-  var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
-  if (window.top.location.hash!=hash)
-    window.top.location.hash=hash;
-}
+  document.write('<a class="largebutton" target="_top" href="../index.html#manual/optimizations.html">ProGuard index</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/dexguard">DexGuard</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/">Saikoa</a> <a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>')
 //-->
 </script>
-</head>
-<body>
+<noscript>
+<a class="largebutton" target="_top"  href="../index.html#manual/optimizations.html">ProGuard index</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/dexguard">DexGuard</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/">Saikoa</a>
+<a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>
+</noscript>
 
 <h2>Optimizations</h2>
 
@@ -66,6 +68,9 @@
 <dt><code><b>class/marking/final</b></code></dt>
 <dd>Marks classes as final, whenever possible.</dd>
 
+<dt><code><b>class/unboxing/enum</b></code></dt>
+<dd>Simplifies enum types to integer constants, whenever possible.</dd>
+
 <dt><code><b>class/merging/vertical</b></code></dt>
 <dd>Merges classes vertically in the class hierarchy, whenever possible.</dd>
 
@@ -189,10 +194,9 @@
 </dl>
 
 <hr />
-<noscript><div><a target="_top" href="../index.html" class="button">Show menu</a></div></noscript>
 <address>
-Copyright &copy; 2002-2013
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2014
+<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a> @ <a target="top" href="http://www.saikoa.com/">Saikoa</a>.
 </address>
 </body>
 </html>
diff --git a/docs/manual/refcard.html b/docs/manual/refcard.html
index d9301bd..87ffe09 100644
--- a/docs/manual/refcard.html
+++ b/docs/manual/refcard.html
@@ -5,19 +5,21 @@
 <meta http-equiv="content-style-type" content="text/css">
 <link rel="stylesheet" type="text/css" href="style.css">
 <title>ProGuard Reference Card</title>
+</head>
+<body>
+
 <script type="text/javascript" language="JavaScript">
 <!--
 if (window.self==window.top)
-  window.top.location.replace("../index.html#"+window.location.pathname+window.location.hash);
-else {
-  var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
-  if (window.top.location.hash!=hash)
-    window.top.location.hash=hash;
-}
+  document.write('<a class="largebutton" target="_top" href="../index.html#manual/refcard.html">ProGuard index</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/dexguard">DexGuard</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/">Saikoa</a> <a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>')
 //-->
 </script>
-</head>
-<body>
+<noscript>
+<a class="largebutton" target="_top"  href="../index.html#manual/refcard.html">ProGuard index</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/dexguard">DexGuard</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/">Saikoa</a>
+<a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>
+</noscript>
 
 <h1>ProGuard Reference Card</h1>
 
@@ -427,18 +429,23 @@
 <table cellspacing="10">
 
 <tr>
+<td valign="top"><a href="usage.html#includedescriptorclasses"><code><b>includedescriptorclasses</b></code></a></td>
+<td>Also keep any classes in the descriptors of specified fields and methods.
+</tr>
+
 <td valign="top"><a href="usage.html#allowshrinking"><code><b>allowshrinking</b></code></a></td>
-<td>The entry points specified in the keep tag may be shrunk.</td>
+<td>Allow the specified entry points to be removed in the shrinking step.</td>
 </tr>
 
 <tr>
 <td valign="top"><a href="usage.html#allowoptimization"><code><b>allowoptimization</b></code></a></td>
-<td>The entry points specified in the keep tag may be optimized.</td>
+<td>Allow the specified entry points to be modified in the optimization
+    step.</td>
 </tr>
 
 <tr>
 <td valign="top"><a href="usage.html#allowobfuscation"><code><b>allowobfuscation</b></code></a></td>
-<td>The entry points specified in the keep tag may be obfuscated.</td>
+<td>Allow the specified entry points to be renamed in the obfuscation step.</td>
 </tr>
 
 </table>
@@ -477,10 +484,9 @@
 </ul>
 
 <hr />
-<noscript><div><a target="_top" href="../index.html" class="button">Show menu</a></div></noscript>
 <address>
-Copyright &copy; 2002-2013
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2014
+<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a> @ <a target="top" href="http://www.saikoa.com/">Saikoa</a>.
 </address>
 </body>
 </html>
diff --git a/docs/manual/retrace/examples.html b/docs/manual/retrace/examples.html
index 2137e3a..4eef0ff 100644
--- a/docs/manual/retrace/examples.html
+++ b/docs/manual/retrace/examples.html
@@ -5,19 +5,21 @@
 <meta http-equiv="content-style-type" content="text/css">
 <link rel="stylesheet" type="text/css" href="../style.css">
 <title>ReTrace Examples</title>
+</head>
+<body>
+
 <script type="text/javascript" language="JavaScript">
 <!--
 if (window.self==window.top)
-  window.top.location.replace("../../index.html#"+window.location.pathname+window.location.hash);
-else {
-  var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
-  if (window.top.location.hash!=hash)
-    window.top.location.hash=hash;
-}
+  document.write('<a class="largebutton" target="_top" href="../../index.html#manual/retrace/examples.html">ProGuard index</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/dexguard">DexGuard</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/">Saikoa</a> <a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>')
 //-->
 </script>
-</head>
-<body>
+<noscript>
+<a class="largebutton" target="_top"  href="../../index.html#manual/retrace/examples.html">ProGuard index</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/dexguard">DexGuard</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/">Saikoa</a>
+<a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>
+</noscript>
 
 <h2>Examples</h2>
 
@@ -335,10 +337,9 @@
 </pre>
 
 <hr />
-<noscript><div><a target="_top" href="../../index.html" class="button">Show menu</a></div></noscript>
 <address>
-Copyright &copy; 2002-2013
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2014
+<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a> @ <a target="top" href="http://www.saikoa.com/">Saikoa</a>.
 </address>
 </body>
 </html>
diff --git a/docs/manual/retrace/index.html b/docs/manual/retrace/index.html
index 47209df..26ce11f 100644
--- a/docs/manual/retrace/index.html
+++ b/docs/manual/retrace/index.html
@@ -5,17 +5,6 @@
 <meta http-equiv="content-style-type" content="text/css">
 <link rel="stylesheet" type="text/css" href="../style.css">
 <title>ReTrace Manual</title>
-<script type="text/javascript" language="JavaScript">
-<!--
-if (window.self==window.top)
-  window.top.location.replace("../../index.html#"+window.location.pathname+window.location.hash);
-else {
-  var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
-  if (window.top.location.hash!=hash)
-    window.top.location.hash=hash;
-}
-//-->
-</script>
 </head>
 <body>
 
@@ -30,8 +19,8 @@
 <hr />
 <noscript><div><a target="_top" href="../../index.html" class="button">Show menu</a></div></noscript>
 <address>
-Copyright &copy; 2002-2013
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2014
+<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a> @ <a target="top" href="http://www.saikoa.com/">Saikoa</a>.
 </address>
 </body>
 </html>
diff --git a/docs/manual/retrace/introduction.html b/docs/manual/retrace/introduction.html
index 381ad1f..9c514a7 100644
--- a/docs/manual/retrace/introduction.html
+++ b/docs/manual/retrace/introduction.html
@@ -5,19 +5,21 @@
 <meta http-equiv="content-style-type" content="text/css">
 <link rel="stylesheet" type="text/css" href="../style.css">
 <title>ReTrace Introduction</title>
+</head>
+<body>
+
 <script type="text/javascript" language="JavaScript">
 <!--
 if (window.self==window.top)
-  window.top.location.replace("../../index.html#"+window.location.pathname+window.location.hash);
-else {
-  var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
-  if (window.top.location.hash!=hash)
-    window.top.location.hash=hash;
-}
+  document.write('<a class="largebutton" target="_top" href="../../index.html#manual/retrace/introduction.html">ProGuard index</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/dexguard">DexGuard</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/">Saikoa</a> <a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>')
 //-->
 </script>
-</head>
-<body>
+<noscript>
+<a class="largebutton" target="_top"  href="../../index.html#manual/retrace/introduction.html">ProGuard index</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/dexguard">DexGuard</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/">Saikoa</a>
+<a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>
+</noscript>
 
 <h2>Introduction</h2>
 
@@ -69,10 +71,9 @@
 original class names and class member names to their obfuscated names.
 
 <hr />
-<noscript><div><a target="_top" href="../../index.html" class="button">Show menu</a></div></noscript>
 <address>
-Copyright &copy; 2002-2013
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2014
+<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a> @ <a target="top" href="http://www.saikoa.com/">Saikoa</a>.
 </address>
 </body>
 </html>
diff --git a/docs/manual/retrace/usage.html b/docs/manual/retrace/usage.html
index 6e7f6a8..6964277 100644
--- a/docs/manual/retrace/usage.html
+++ b/docs/manual/retrace/usage.html
@@ -5,19 +5,21 @@
 <meta http-equiv="content-style-type" content="text/css">
 <link rel="stylesheet" type="text/css" href="../style.css">
 <title>ReTrace Usage</title>
+</head>
+<body>
+
 <script type="text/javascript" language="JavaScript">
 <!--
 if (window.self==window.top)
-  window.top.location.replace("../../index.html#"+window.location.pathname+window.location.hash);
-else {
-  var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
-  if (window.top.location.hash!=hash)
-    window.top.location.hash=hash;
-}
+  document.write('<a class="largebutton" target="_top" href="../../index.html#manual/retrace/usage.html">ProGuard index</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/dexguard">DexGuard</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/">Saikoa</a> <a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>')
 //-->
 </script>
-</head>
-<body>
+<noscript>
+<a class="largebutton" target="_top"  href="../../index.html#manual/retrace/usage.html">ProGuard index</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/dexguard">DexGuard</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/">Saikoa</a>
+<a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>
+</noscript>
 
 <h2>Usage</h2>
 
@@ -60,7 +62,7 @@
     de-obfuscate more general types of input than just stack traces. The
     default is suitable for stack traces produced by most JVMs:
     <pre>
-    (?:.*?\bat\s+%c.%m\s*\(.*?(?::%l)?\)\s*)|(?:(?:.*?[:"]\s+)?%c(?::.*)?)
+    (?:.*?\bat\s+%c\.%m\s*\(.*?(?::%l)?\)\s*)|(?:(?:.*?[:"]\s+)?%c(?::.*)?)
     </pre>
     The regular expression is a Java regular expression (cfr. the documentation
     of <code>java.util.regex.Pattern</code>), with a few additional wildcards:
@@ -118,10 +120,9 @@
 will be left unchanged.
 
 <hr />
-<noscript><div><a target="_top" href="../../index.html" class="button">Show menu</a></div></noscript>
 <address>
-Copyright &copy; 2002-2013
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2014
+<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a> @ <a target="top" href="http://www.saikoa.com/">Saikoa</a>.
 </address>
 </body>
 </html>
diff --git a/docs/manual/style.css b/docs/manual/style.css
index 8dae87d..6a59990 100644
--- a/docs/manual/style.css
+++ b/docs/manual/style.css
@@ -69,6 +69,16 @@
   float: right;
 }
 
+a.largebutton {
+  font-weight: bold;
+  color: #000000;
+  margin: 0px;
+  padding: 10px;
+  background: #D0D0D0;
+  text-decoration: none;
+  border: 1px outset #FFFFFF;
+}
+
 /* Settings for variable width code. */
 
 p.code
diff --git a/docs/manual/troubleshooting.html b/docs/manual/troubleshooting.html
index 964a25e..90ed2ab 100644
--- a/docs/manual/troubleshooting.html
+++ b/docs/manual/troubleshooting.html
@@ -5,19 +5,21 @@
 <meta http-equiv="content-style-type" content="text/css">
 <link rel="stylesheet" type="text/css" href="style.css">
 <title>ProGuard Troubleshooting</title>
+</head>
+<body>
+
 <script type="text/javascript" language="JavaScript">
 <!--
 if (window.self==window.top)
-  window.top.location.replace("../index.html#"+window.location.pathname+window.location.hash);
-else {
-  var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
-  if (window.top.location.hash!=hash)
-    window.top.location.hash=hash;
-}
+  document.write('<a class="largebutton" target="_top" href="../index.html#manual/troubleshooting.html">ProGuard index</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/dexguard">DexGuard</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/">Saikoa</a> <a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>')
 //-->
 </script>
-</head>
-<body>
+<noscript>
+<a class="largebutton" target="_top"  href="../index.html#manual/troubleshooting.html">ProGuard index</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/dexguard">DexGuard</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/">Saikoa</a>
+<a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>
+</noscript>
 
 <h2>Troubleshooting</h2>
 
@@ -29,9 +31,12 @@
 <li><a href="#dynamicalclass">Note: can't find dynamically referenced class ...</a></li>
 <li><a href="#dynamicalclasscast">Note: ... calls '(...)Class.forName(variable).newInstance()'</a></li>
 <li><a href="#dynamicalclassmember">Note: ... accesses a field/method '...' dynamically</a></li>
+<li><a href="#attributes">Note: ... calls 'Class.get...', 'Field.get...', or 'Method.get...'</a></li>
 <li><a href="#unknownclass">Note: the configuration refers to the unknown class  '...'</a></li>
 <li><a href="#descriptorclass">Note: the configuration keeps the entry point '...', but not the descriptor class '...'</a></li>
+<li><a href="#libraryclass">Note: the configuration explicitly specifies '...' to keep library class '...'</a></li>
 <li><a href="#classmembers">Note: the configuration doesn't specify which class members to keep for class '...'</a></li>
+<li><a href="#nosideeffects">Note: the configuration specifies that none of the methods of class '...' have any side effects</a></li>
 <li><a href="#duplicateclass">Note: duplicate definition of program/library class</a></li>
 <li><a href="#duplicatezipentry">Warning: can't write resource ... Duplicate zip entry</a></li>
 <li><a href="#unresolvedclass">Warning: can't find superclass or interface</a></li>
@@ -96,6 +101,7 @@
 <li><a href="#securityexception">SecurityException: SHA1 digest error</a></li>
 <li><a href="#classcastexception">ClassCastException: class not an enum</a></li><li><a href="#classcastexception">IllegalArgumentException: class not an enum type</a></li>
 <li><a href="#arraystoreexception">ArrayStoreException: sun.reflect.annotation.EnumConstantNotPresentExceptionProxy</a></li>
+<li><a href="#illegalargumentexception">IllegalArgumentException: methods with same signature but incompatible return types</a></li>
 <li><a href="#compilererror">CompilerError: duplicate addition</a></li>
 <li><a href="#classformaterror1">ClassFormatError: repetitive field name/signature</a></li>
 <li><a href="#classformaterror2">ClassFormatError: Invalid index in LocalVariableTable in class file</a></li>
@@ -117,25 +123,38 @@
 
 <dt><a name="dynamicalclasscast"><b>Note: ... calls '(...)Class.forName(variable).newInstance()'</b></a></dt>
 
-<dd>ProGuard lists all class casts of dynamically created class instances,
-    like "<code>(MyClass)Class.forName(variable).newInstance()</code>".
-    Depending on your application, you may need to keep the mentioned classes
-    with an option like "<code>-keep class MyClass</code>", or their
-    implementations with an option like "<code>-keep class * implements
-    MyClass</code>". You can switch off these notes by specifying the
+<dd>Your code uses reflection to dynamically create class instances, with a
+    construct like
+    "<code>(MyClass)Class.forName(variable).newInstance()</code>". Depending
+    on your application, you may need to keep the mentioned classes with an
+    option like "<code>-keep class MyClass</code>", or their implementations
+    with an option like "<code>-keep class * implements MyClass</code>". You
+    can switch off these notes by specifying the
     <a href="usage.html#dontnote"><code>-dontnote</code></a> option.</dd>
 
 <dt><a name="dynamicalclassmember"><b>Note: ... accesses a field/method '...' dynamically</b></a></dt>
 
-<dd>ProGuard lists a number of constructs like
-    "<code>.getField("myField")</code>". Depending on your application, you
-    may need to figure out where the mentioned class members are defined and
-    keep them with an option like "<code>-keep class MyClass { MyFieldType
+<dd>Your code uses reflection to find a fields or a method, with a construct
+    like "<code>.getField("myField")</code>". Depending on your application,
+    you may need to figure out where the mentioned class members are defined
+    and keep them with an option like "<code>-keep class MyClass { MyFieldType
     myField; }</code>". Otherwise, ProGuard might remove or obfuscate the
     class members, since it can't know which ones they are exactly. It does
     list possible candidates, for your information. You can switch off these
-    notes by specifying the <a
-    href="usage.html#dontnote"><code>-dontnote</code></a> option.</dd>
+    notes by specifying
+    the <a href="usage.html#dontnote"><code>-dontnote</code></a> option.</dd>
+
+<dt><a name="attributes"><b>Note: ... calls 'Class.get...'</b>, <b>'Field.get...'</b>, or <b>'Method.get...'</b></a></dt>
+<dd>Your code uses reflection to access metadata from the code, with an
+    invocation like "<code>class.getAnnotations()</code>". You then generally
+    need to preserve optional <a href="attributes.html">class file
+    attributes</a>, which ProGuard removes by default. The attributes contain
+    information about annotations, enclosing classes, enclosing methods, etc.
+    In a summary in the log, ProGuard provides a suggested configuration,
+    like <a href="usage.html#keepattributes"><code>-keepattributes
+    *Annotation*</code></a>. If you're sure the attributes are not necessary,
+    you can switch off these notes by specifying
+    the <a href="usage.html#dontnote"><code>-dontnote</code></a> option.</dd>
 
 <dt><a name="unknownclass"><b>Note: the configuration refers to the unknown class  '...'</b></a></dt>
 
@@ -152,13 +171,25 @@
     You may then want to keep the class too. Otherwise, ProGuard will
     obfuscate its name, thus changing the method's signature. The method might
     then become unfindable as an entry point, e.g. if it is part of a public
-    API. You can switch off these notes by specifying the <a
-    href="usage.html#dontnote"><code>-dontnote</code></a> option.</dd>
+    API. You can automatically keep such descriptor classes with
+    the <code>-keep</code> option modifier
+    <a href="usage.html#includedescriptorclasses"><code>includedescriptorclasses</code></a>
+    (<code>-keep,includedescriptorclasses</code> ...). You can switch off
+    these notes by specifying
+    the <a href="usage.html#dontnote"><code>-dontnote</code></a> option.</dd>
+
+<dt><a name="libraryclass"><b>Note: the configuration explicitly specifies '...' to keep library class '...'</b></a></dt>
+
+<dd>Your configuration contains a <code>-keep</code> option to preserve the
+    given library class. However, you don't need to keep any library classes.
+    ProGuard always leaves underlying libraries unchanged. You can switch off
+    these notes by specifying the
+    <a href="usage.html#dontnote"><code>-dontnote</code></a> option.</dd>
 
 <dt><a name="classmembers"><b>Note: the configuration doesn't specify which class members to keep for class '...'</b></a></dt>
 
-<dd>Your configuration contains
-    a <a href="usage.html#keepclassmembers"><code>-keepclassmembers</code></a>/<a href="usage.html#keepclasseswithmembers">-keepclasseswithmembers</code></a>
+<dd>Your configuration contains a
+    <a href="usage.html#keepclassmembers"><code>-keepclassmembers</code></a>/<a href="usage.html#keepclasseswithmembers"><code>-keepclasseswithmembers</code></a>
     option to preserve fields or methods in the given class, but it doesn't
     specify which fields or methods. This way, the option simply won't have
     any effect. You probably want to specify one or more fields or methods, as
@@ -170,6 +201,19 @@
     options</a> can help. You can switch off these notes by specifying
     the <a href="usage.html#dontnote"><code>-dontnote</code></a> option.</dd>
 
+<dt><a name="nosideeffects"><b>Note: the configuration specifies that none of the methods of class '...' have any side effects</b></a></dt>
+
+<dd>Your configuration contains an option
+    <a href="usage.html#assumenosideeffects"><code>-assumenosideeffects</code></a>
+    to indicate that the specified methods don't have any side effects.
+    However, the configuration tries to match <i>all</i> methods, by using a
+    wildcard like "<code>*;</code>". This includes methods
+    from <code>java.lang.Object</code>, such as <code>wait()</code> and
+    <code>notify()</code>. Removing invocations of those methods will most
+    likely break your application. You should list the methods without side
+    effects more conservatively. You can switch off these notes by specifying
+    the <a href="usage.html#dontnote"><code>-dontnote</code></a> option.</dd>
+
 <dt><a name="duplicateclass"><b>Note: duplicate definition of program/library class</b></a></dt>
 
 <dd>Your program jars or library jars contain multiple definitions of the
@@ -277,7 +321,15 @@
     referring to <code>java.awt</code>. This is a bit shady, since Android
     doesn't have this package at all, but if your application works anyway,
     you can let ProGuard accept it with "<code>-dontwarn java.awt.**</code>",
-    for instance.</dd>
+    for instance.
+    <p>
+    If the missing class is an Android run-time class, you should make sure
+    that you are building against an Android run-time that is sufficiently
+    recent. You may need to change the build target in your
+    <code>project.properties</code> file or <code>build.gradle</code> file to
+    that recent version. You can still specify a different
+    <code>minSdkVersion</code> and a different <code>targetSdkVersion</code>
+    in your <code>AndroidManifest.xml</code> file.</dd>
 
 <dt><a name="superclass"><b>Error: Can't find any super classes of ... (not even immediate super class ...)</b><br/><b>Error: Can't find common super class of ... and ...</b></a></dt>
 
@@ -478,12 +530,22 @@
 <dl>
 <dt><a name="outofmemoryerror"><b>OutOfMemoryError</b></a></dt>
 
-<dd>You can try increasing the heap size of the Java virtual machine (with the
-    usual <code>-Xms</code> and <code>-Xmx</code> options). You can also
-    reduce the amount of memory that ProGuard needs by removing unnecessary
-    library jars from your configuration, or by filtering out unused library
-    packages and classes. Remember that only classes or interfaces that are
-    extended or implemented by classes in your input jars are required.</dd>
+<dd>You can try increasing the heap size of the Java virtual machine, with the
+    usual <code>-Xmx</code> option:
+    <ul>
+    <li>In Java, specify the option as an argument to the JVM: <code>java
+        -Xmx1024m</code> ...
+    <li>In Ant, set the environment variable <code>ANT_OPTS=-Xmx1024m</code>
+    <li>In Gradle, set the environment variable
+        <code>GRADLE_OPTS=-Xmx1024m</code>
+    <li>In Maven, set the environment variable
+        <code>MAVEN_OPTS=-Xmx1024m</code>
+    <li>In Eclipse, add the line  <code>-Xmx1024m</code> to the file
+        <code>eclipse.ini</code> inside your Eclipse install.
+    </ul>
+    You can also reduce the amount of memory that ProGuard needs by removing
+    unnecessary library jars from your configuration, or by filtering out
+    unused library packages and classes.</dd>
 
 <dt><a name="stackoverflowerror"><b>StackOverflowError</b></a></dt>
 
@@ -799,6 +861,17 @@
     should make sure you're preserving the special methods of the enumeration
     type, as shown in the examples.</dd>
 
+<dt><a name="illegalargumentexception"><b>IllegalArgumentException: methods with same signature but incompatible return types</b></a></dt>
+
+<dd>You are probably running some code that has been obfuscated
+    with the <a
+    href="usage.html#overloadaggressively"><code>-overloadaggressively</code></a>
+    option. The class <code>java.lang.reflect.Proxy</code> can't handle
+    classes that contain methods with the same names and signatures, but
+    different return types. Its method <code>newProxyInstance</code> then
+    throws this exception. You can avoid the problem by not using the
+    option.</dd>
+
 <dt><a name="compilererror"><b>CompilerError: duplicate addition</b></a></dt>
 
 <dd>You are probably compiling or running some code that has been obfuscated
@@ -852,10 +925,9 @@
 </dl>
 
 <hr />
-<noscript><div><a target="_top" href="../index.html" class="button">Show menu</a></div></noscript>
 <address>
-Copyright &copy; 2002-2013
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2014
+<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a> @ <a target="top" href="http://www.saikoa.com/">Saikoa</a>.
 </address>
 </body>
 </html>
diff --git a/docs/manual/usage.html b/docs/manual/usage.html
index 7d3a5bb..3bf94ef 100644
--- a/docs/manual/usage.html
+++ b/docs/manual/usage.html
@@ -5,19 +5,21 @@
 <meta http-equiv="content-style-type" content="text/css">
 <link rel="stylesheet" type="text/css" href="style.css">
 <title>ProGuard Usage</title>
+</head>
+<body>
+
 <script type="text/javascript" language="JavaScript">
 <!--
 if (window.self==window.top)
-  window.top.location.replace("../index.html#"+window.location.pathname+window.location.hash);
-else {
-  var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
-  if (window.top.location.hash!=hash)
-    window.top.location.hash=hash;
-}
+  document.write('<a class="largebutton" target="_top" href="../index.html#manual/usage.html">ProGuard index</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/dexguard">DexGuard</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/">Saikoa</a> <a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>')
 //-->
 </script>
-</head>
-<body>
+<noscript>
+<a class="largebutton" target="_top"  href="../index.html#manual/usage.html">ProGuard index</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/dexguard">DexGuard</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/">Saikoa</a>
+<a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>
+</noscript>
 
 <h2>Usage</h2>
 
@@ -95,8 +97,8 @@
 <dt><a name="injars"><code><b>-injars</b></code></a>
     <a href="#classpath"><i>class_path</i></a></dt>
 
-<dd>Specifies the input jars (or wars, ears, zips, or directories) of the
-    application to be processed. The class files in these jars will be
+<dd>Specifies the input jars (or aars, wars, ears, zips, apks, or directories)
+    of the application to be processed. The class files in these jars will be
     processed and written to the output jars. By default, any non-class files
     will be copied without changes. Please be aware of any temporary files
     (e.g. created by IDEs), especially if you are reading your input files
@@ -108,8 +110,8 @@
 <dt><a name="outjars"><code><b>-outjars</b></code></a>
     <a href="#classpath"><i>class_path</i></a></dt>
 
-<dd>Specifies the names of the output jars (or wars, ears, zips, or
-    directories). The processed input of the preceding <code>-injars</code>
+<dd>Specifies the names of the output jars (or aars, wars, ears, zips, apks,
+    or directories). The processed input of the preceding <code>-injars</code>
     options will be written to the named jars. This allows you to collect the
     contents of groups of input jars into corresponding groups of output jars.
     In addition, the output entries can be filtered, as explained in
@@ -125,15 +127,16 @@
 <dt><a name="libraryjars"><code><b>-libraryjars</b></code></a>
     <a href="#classpath"><i>class_path</i></a></dt>
 
-<dd>Specifies the library jars (or wars, ears, zips, or directories) of the
-    application to be processed. The files in these jars will not be included
-    in the output jars. The specified library jars should at least contain the
-    class files that are <i>extended</i> by application class files. Library
-    class files that are only <i>called</i> needn't be present, although their
-    presence can improve the results of the optimization step. The entries in
-    the class path can be filtered, as explained in the <a
-    href="#filefilters">filters</a> section. For better readability, class path
-    entries can be specified using multiple <code>-libraryjars</code> options.
+<dd>Specifies the library jars (or aars, wars, ears, zips, apks, or
+    directories) of the application to be processed. The files in these jars
+    will not be included in the output jars. The specified library jars should
+    at least contain the class files that are <i>extended</i> by application
+    class files. Library class files that are only <i>called</i> needn't be
+    present, although their presence can improve the results of the
+    optimization step. The entries in the class path can be filtered, as
+    explained in the <a href="#filefilters">filters</a> section. For better
+    readability, class path entries can be specified using
+    multiple <code>-libraryjars</code> options.
     <p>
     Please note that the boot path and the class path set for running ProGuard
     are not considered when looking for library classes. This means that you
@@ -176,26 +179,34 @@
 <dt><a name="keepdirectories"><code><b>-keepdirectories</b></code></a>
     [<i><a href="#filefilters">directory_filter</a></i>]</dt>
 
-<dd>Specifies the directories to be kept in the output jars (or wars, ears,
-    zips, or directories). By default, directory entries are removed. This
-    reduces the jar size, but it may break your program if the code tries to
-    find them with constructs like
-    "<code>mypackage.MyClass.class.getResource("")</code>". You'll then want to
-    keep the directory corresponding to the package, "<code>-keepdirectories
-    mypackage</code>". If the option is specified without a filter, all
-    directories are kept. With a filter, only matching directories are
-    kept.</dd>
+<dd>Specifies the directories to be kept in the output jars (or aars, wars,
+    ears, zips, apks, or directories). By default, directory entries are
+    removed. This reduces the jar size, but it may break your program if the
+    code tries to find them with constructs like
+    "<code>mypackage.MyClass.class.getResource("")</code>". You'll then want
+    to keep the directory corresponding to the package,
+    "<code>-keepdirectories mypackage</code>". If the option is specified
+    without a filter, all directories are kept. With a filter, only matching
+    directories are kept. For instance,
+    "<code>-keepdirectories mydirectory</code>" matches the specified
+    directory, "<code>-keepdirectories mydirectory/*</code>" matches its
+    immediate subdirectories, and
+    "<code>-keepdirectories mydirectory/**</code>" matches all of its
+    subdirectories.</dd>
 
 <dt><a name="target"><code><b>-target</b></code></a> <i>version</i></dt>
 
 <dd>Specifies the version number to be set in the processed class files. The
     version number can be one of <code>1.0</code>, <code>1.1</code>,
     <code>1.2</code>, <code>1.3</code>, <code>1.4</code>, <code>1.5</code> (or
-    just <code>5</code>), <code>1.6</code> (or just <code>6</code>), or
-     <code>1.7</code> (or just <code>7</code>). By default, the version numbers
-    of the class files are left unchanged. For example, you may want to
+    just <code>5</code>), <code>1.6</code> (or just <code>6</code>),
+    <code>1.7</code> (or just <code>7</code>), or <code>1.8</code> (or
+    just <code>8</code>). By default, the version numbers of the class files
+    are left unchanged. For example, you may want to
     <a href="examples.html#upgrade">upgrade class files to Java 6</a>, by
-    changing their version numbers and having them preverified.</dd>
+    changing their version numbers and having them preverified. You probably
+    shouldn't downgrade the version numbers of class files, since the code
+    may contain constructs that are not supported in older versions.</dd>
 
 <dt><a name="forceprocessing"><code><b>-forceprocessing</b></code></a></dt>
 
@@ -380,9 +391,9 @@
     optimization step. For instance, when inlining a public getter, it may be
     necessary to make the accessed field public too. Although Java's binary
     compatibility specifications formally do not require this (cfr. <a href=
-    "http://java.sun.com/docs/books/jls/second_edition/html/j.title.doc.html"
-    >The Java Language Specification, Second Edition</a>, <a href=
-    "http://java.sun.com/docs/books/jls/second_edition/html/binaryComp.doc.html#47259"
+    "http://docs.oracle.com/javase/specs/jls/se5.0/html/j3TOC.html"
+    >The Java Language Specification, Third Edition</a>, <a href=
+    "http://docs.oracle.com/javase/specs/jls/se5.0/html/binaryComp.html#13.4.6"
     >Section 13.4.6</a>), some virtual machines would have problems with the
     processed code otherwise. Only applicable when optimizing (and when
     obfuscating with the <a
@@ -399,14 +410,14 @@
     classes don't implement all interface methods. This can reduce the size of
     the output by reducing the total number of classes. Note that Java's
     binary compatibility specifications allow such constructs (cfr. <a href=
-    "http://java.sun.com/docs/books/jls/second_edition/html/j.title.doc.html"
-    >The Java Language Specification, Second Edition</a>, <a href=
-    "http://java.sun.com/docs/books/jls/second_edition/html/binaryComp.doc.html#45347"
+    "http://docs.oracle.com/javase/specs/jls/se5.0/html/j3TOC.html"
+    >The Java Language Specification, Third Edition</a>, <a href=
+    "http://docs.oracle.com/javase/specs/jls/se5.0/html/binaryComp.html#13.5.3"
     >Section 13.5.3</a>), even if they are not allowed in the Java language
     (cfr. <a href=
-    "http://java.sun.com/docs/books/jls/second_edition/html/j.title.doc.html"
-    >The Java Language Specification, Second Edition</a>, <a href=
-    "http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.html#34031"
+    "http://docs.oracle.com/javase/specs/jls/se5.0/html/j3TOC.html"
+    >The Java Language Specification, Third Edition</a>, <a href=
+    "http://docs.oracle.com/javase/specs/jls/se5.0/html/classes.html#8.1.4"
     >Section 8.1.4</a>). Only applicable when optimizing.
     <p>
     <i>Counter-indication:</i> setting this option can reduce the performance
@@ -500,26 +511,27 @@
 
 <dd>Specifies to apply aggressive overloading while obfuscating. Multiple
     fields and methods can then get the same names, as long as their arguments
-    and return types are different (not just their arguments). This option can
-    make the processed code even smaller (and less comprehensible). Only
-    applicable when obfuscating.
+    and return types are different, as required by Java bytecode (not just
+    their arguments, as required by the Java language). This option can make
+    the processed code even smaller (and less comprehensible). Only applicable
+    when obfuscating.
     <p>
     <i>Counter-indication:</i> the resulting class files fall within the Java
     bytecode specification (cfr. <a href=
-    "http://java.sun.com/docs/books/vmspec/2nd-edition/html/VMSpecTOC.doc.html"
+    "http://docs.oracle.com/javase/specs/jvms/se5.0/html/VMSpecTOC.doc.html"
     >The Java Virtual Machine Specification, Second Edition</a>, first
     paragraphs of <a href=
-    "http://java.sun.com/docs/books/vmspec/2nd-edition/html/ClassFile.doc.html#2877"
+    "http://docs.oracle.com/javase/specs/jvms/se5.0/html/ClassFile.doc.html#2877"
     >Section 4.5</a> and <a href=
-    "http://java.sun.com/docs/books/vmspec/2nd-edition/html/ClassFile.doc.html#1513"
+    "http://docs.oracle.com/javase/specs/jvms/se5.0/html/ClassFile.doc.html#1513"
     >Section 4.6</a>), even though this kind of overloading is not allowed in
     the Java language (cfr. <a href=
-    "http://java.sun.com/docs/books/jls/second_edition/html/j.title.doc.html"
-    >The Java Language Specification, Second Edition</a>, <a href=
-    "http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.html#40898"
+    "http://docs.oracle.com/javase/specs/jls/se5.0/html/j3TOC.html"
+    >The Java Language Specification, Third Edition</a>, <a href=
+    "http://docs.oracle.com/javase/specs/jls/se5.0/html/classes.html#8.3"
     >Section 8.3</a> and <a href=
-    "http://java.sun.com/docs/books/jls/second_edition/html/classes.doc.html#227768"
-    >Section 8.4.7</a>). Still, some tools have problems with it. Notably:
+    "http://docs.oracle.com/javase/specs/jls/se5.0/html/classes.html#8.4.5"
+    >Section 8.4.5</a>). Still, some tools have problems with it. Notably:
     <ul>
     <li>Sun's JDK 1.2.2 <code>javac</code> compiler produces an exception when
         compiling with such a library (cfr. <a href=
@@ -529,6 +541,8 @@
         primitive fields.</li>
     <li>Sun's JRE 1.5 <code>pack200</code> tool reportedly has problems with
         overloaded class members.</li>
+    <li>The class <code>java.lang.reflect.Proxy</code> can't handle overloaded
+        methods.</li>
     <li>Google's Dalvik VM can't handle overloaded static fields.</li>
     </ul></dd>
 
@@ -591,7 +605,7 @@
 
 <dd>Specifies to repackage all class files that are renamed, by moving them
     into the single given package. Without argument or with an empty string
-    (''), the package is removed completely. This option option overrides the
+    (''), the package is removed completely. This option overrides the
     <a
     href="#flattenpackagehierarchy"><code>-flattenpackagehierarchy</code></a>
     option. It is another example of further <a
@@ -606,31 +620,21 @@
     this option.</dd>
 
 <dt><a name="keepattributes"><code><b>-keepattributes</b></code></a>
-    [<i><a href="#filters">attribute_filter</a></i>]</dt>
+    [<i><a href="attributes.html">attribute_filter</a></i>]</dt>
 
 <dd>Specifies any optional attributes to be preserved. The attributes can be
     specified with one or more <code>-keepattributes</code> directives. The
-    optional filter is a comma-separated list of attribute names. Attribute
-    names can contain <b>?</b>, <b>*</b>, and <b>**</b> wildcards, and they
-    can be preceded by the <b>!</b> negator. Typical optional attributes are
-    <code>Exceptions</code>, <code>Signature</code>, <code>Deprecated</code>,
-    <code>SourceFile</code>, <code>SourceDir</code>,
-    <code>LineNumberTable</code>, <code>LocalVariableTable</code>,
-    <code>LocalVariableTypeTable</code>, <code>Synthetic</code>,
-    <code>EnclosingMethod</code>, <code>RuntimeVisibleAnnotations</code>,
-    <code>RuntimeInvisibleAnnotations</code>,
-    <code>RuntimeVisibleParameterAnnotations</code>,
-    <code>RuntimeInvisibleParameterAnnotations</code>, and
-    <code>AnnotationDefault</code>. The <code>InnerClasses</code> attribute
-    name can be specified as well, referring to the source name part of this
-    attribute. For example, you should at least keep the
-    <code>Exceptions</code>, <code>InnerClasses</code>, and
-    <code>Signature</code> attributes
-    when <a href="examples.html#library">processing a library</a>. You should
-    also keep the <code>SourceFile</code> and
-    <code>LineNumberTable</code> attributes
-    for <a href="examples.html#stacktrace">producing useful obfuscated stack
-    traces</a>. Finally, you may want
+    optional filter is a comma-separated list
+    of <a href="attributes.html">attribute names</a> that Java virtual
+    machines and ProGuard support. Attribute names can
+    contain <b>?</b>, <b>*</b>, and <b>**</b> wildcards, and they can be
+    preceded by the <b>!</b> negator. For example, you should at least keep
+    the <code>Exceptions</code>, <code>InnerClasses</code>, and
+    <code>Signature</code> attributes when
+    <a href="examples.html#library">processing a library</a>. You should also
+    keep the <code>SourceFile</code> and <code>LineNumberTable</code>
+    attributes for <a href="examples.html#stacktrace">producing useful
+    obfuscated stack traces</a>. Finally, you may want
     to <a href="examples.html#annotations">keep annotations</a> if your code
     depends on them. Only applicable when obfuscating.</dd>
 
@@ -689,7 +693,13 @@
     by setting the environment variable <code>LANG</code> or the Java system
     property <code>file.encoding</code>. For an example,
     see <a href="examples.html#resourcefiles">processing resource files</a>.
-    Only applicable when obfuscating.</dd>
+    Only applicable when obfuscating.
+    <p>
+    <i>Caveat:</i> You probably only want to apply this option to text files,
+    since parsing and adapting binary files as text files can cause unexpected
+    problems. Therefore, make sure that you specify a sufficiently narrow
+    filter.</dd>
+
 
 </dl>
 <p>
@@ -732,7 +742,7 @@
     [<i><a href="#filters">class_filter</a></i>]</dt>
 
 <dd>Specifies not to print notes about potential mistakes or omissions in the
-    configuration, like typos in class names, or like missing options that
+    configuration, such as typos in class names or missing options that
     might be useful. The optional filter is a regular expression; ProGuard
     doesn't print notes about classes with matching names.</dd>
 
@@ -787,7 +797,9 @@
 Each input entry can be:
 <ul>
 <li>A class file or resource file,</li>
+<li>An apk file, containing any of the above,</li>
 <li>A jar file, containing any of the above,</li>
+<li>An aar file, containing any of the above,</li>
 <li>A war file, containing any of the above,</li>
 <li>An ear file, containing any of the above,</li>
 <li>A zip file, containing any of the above,</li>
@@ -795,15 +807,18 @@
 </ul>
 <p>
 The paths of directly specified class files and resource files is ignored, so
-class files should generally be part of a jar file, a war file, an ear file, a
-zip file, or a directory. In addition, the paths of class files should not have
-any additional directory prefixes inside the archives or directories.
+class files should generally be part of a jar file, an aar file, a war file,
+an ear file, a zip file, or a directory. In addition, the paths of class files
+should not have any additional directory prefixes inside the archives or
+directories.
 
 <p>
 Each output entry can be:
 <ul>
-<li>A jar file, in which all processed class files and resource files will be
+<li>An apk file, in which all class files and resource files will be
     collected.</li>
+<li>A jar file, in which any and all of the above will be collected,</li>
+<li>An aar file, in which any and all of the above will be collected,</li>
 <li>A war file, in which any and all of the above will be collected,</li>
 <li>An ear file, in which any and all of the above will be collected,</li>
 <li>A zip file, in which any and all of the above will be collected,</li>
@@ -824,10 +839,12 @@
 <p>
 In addition, ProGuard provides the possibility to filter the class path
 entries and their contents, based on their full relative file names. Each
-class path entry can be followed by up to 5 types of <a
+class path entry can be followed by up to 7 types of <a
 href="#filefilters">file filters</a> between parentheses, separated by
 semi-colons:
 <ul>
+<li>A filter for all aar names that are encountered,</li>
+<li>A filter for all apk names that are encountered,</li>
 <li>A filter for all zip names that are encountered,</li>
 <li>A filter for all ear names that are encountered,</li>
 <li>A filter for all war names that are encountered,</li>
@@ -836,11 +853,11 @@
     encountered.</li>
 </ul>
 <p>
-If fewer than 5 filters are specified, they are assumed to be the latter
+If fewer than 7 filters are specified, they are assumed to be the latter
 filters. Any empty filters are ignored. More formally, a filtered class path
 entry looks like this:
 <pre>
-<i>classpathentry</i><b>(</b>[[[[<i>zipfilter</i><b>;</b>]<i>earfilter</i><b>;</b>]<i>warfilter</i><b>;</b>]<i>jarfilter</i><b>;</b>]<i>filefilter</i><b>)</b>
+<i>classpathentry</i><b>(</b>[[[[[[<i>aarfilter</i><b>;</b>]<i>apkfilter</i><b>;</b>]<i>zipfilter</i><b>;</b>]<i>earfilter</i><b>;</b>]<i>warfilter</i><b>;</b>]<i>jarfilter</i><b>;</b>]<i>filefilter</i><b>)</b>
 </pre>
 <p>
 Square brackets "[]" mean that their contents are optional.
@@ -933,7 +950,7 @@
 
 ProGuard offers options with filters for many different aspects of the
 configuration: names of files, directories, classes, packages, attributes,
-optimizations, etc. 
+optimizations, etc.
 <p>
 A filter is a list of comma-separated names that can contain wildcards. Only
 names that match an item on the list pass the filter. The supported wildcards
@@ -1024,6 +1041,15 @@
 <h2><a name="keepoptionmodifiers">Keep Option Modifiers</a></h2>
 
 <dl>
+<dt><a name="includedescriptorclasses"><code><b>includedescriptorclasses</b></code></a></dt>
+
+<dd>Specifies that any classes in the type descriptors of the methods and
+    fields that the <a href="#keep">-keep</a> option keeps should be kept as
+    well. This is typically useful when <a href="examples.html#native">keeping
+    native method names</a>, to make sure that the parameter types of native
+    methods aren't renamed either. Their signatures then remain completely
+    unchanged and compatible with the native libraries.</dd>
+
 <dt><a name="allowshrinking"><code><b>allowshrinking</b></code></a></dt>
 
 <dd>Specifies that the entry points specified in the <a href="#keep">-keep</a>
@@ -1237,10 +1263,9 @@
 </ul>
 
 <hr />
-<noscript><div><a target="_top" href="../index.html" class="button">Show menu</a></div></noscript>
 <address>
-Copyright &copy; 2002-2013
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2014
+<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a> @ <a target="top" href="http://www.saikoa.com/">Saikoa</a>.
 </address>
 </body>
 </html>
diff --git a/docs/manual/wtk.html b/docs/manual/wtk.html
index a7ea0b8..09630f1 100644
--- a/docs/manual/wtk.html
+++ b/docs/manual/wtk.html
@@ -5,19 +5,21 @@
 <meta http-equiv="content-style-type" content="text/css">
 <link rel="stylesheet" type="text/css" href="style.css">
 <title>ProGuard JME Wireless Toolkit Integration</title>
+</head>
+<body>
+
 <script type="text/javascript" language="JavaScript">
 <!--
 if (window.self==window.top)
-  window.top.location.replace("../index.html#"+window.location.pathname+window.location.hash);
-else {
-  var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
-  if (window.top.location.hash!=hash)
-    window.top.location.hash=hash;
-}
+  document.write('<a class="largebutton" target="_top" href="../index.html#manual/wtk.html">ProGuard index</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/dexguard">DexGuard</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/">Saikoa</a> <a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>')
 //-->
 </script>
-</head>
-<body>
+<noscript>
+<a class="largebutton" target="_top"  href="../index.html#manual/wtk.html">ProGuard index</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/dexguard">DexGuard</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/">Saikoa</a>
+<a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>
+</noscript>
 
 <h2>JME Wireless Toolkit Integration</h2>
 
@@ -61,10 +63,9 @@
 that's inside the <code>proguard.jar</code>.
 
 <hr />
-<noscript><div><a target="_top" href="../index.html" class="button">Show menu</a></div></noscript>
 <address>
-Copyright &copy; 2002-2013
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2014
+<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a> @ <a target="top" href="http://www.saikoa.com/">Saikoa</a>.
 </address>
 </body>
 </html>
diff --git a/docs/proguard.appdata.xml b/docs/proguard.appdata.xml
new file mode 100644
index 0000000..fe04aa7
--- /dev/null
+++ b/docs/proguard.appdata.xml
@@ -0,0 +1,32 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Copyright 2012-2014 Eric Lafortune <eric@graphics.cornell.edu> -->
+<application>
+  <id type="desktop">proguard.desktop</id>
+  <metadata_license>CC-BY-SA-3.0</metadata_license>
+  <project_license>GPL-2.0</project_license>
+  <name>ProGuard</name>
+  <summary>Java optimizer and obfuscator</summary>
+  <description>
+    <p>
+    ProGuard is a free Java class file shrinker, optimizer, obfuscator, and
+    preverifier. It detects and removes unused classes, fields, methods, and
+    attributes. It optimizes bytecode and removes unused instructions. It
+    renames the remaining classes, fields, and methods using short meaningless
+    names. Finally, it preverifies the processed code for Java 6 or for Java
+    Micro Edition.
+    </p>
+    <p>
+    ProGuard is useful for making code more compact and more efficient, on the
+    desktop, on tablets, on smartphones, and on embedded devices. It also
+    makes code more difficult to reverse engineer.Power Statistics is a
+    program used to view historical and current battery information and will
+    show programs running on your computer using power.
+    </p>
+  </description>
+  <screenshots>
+    <screenshot type="default" width="918" height="671">http://proguard.sourceforge.net/screenshot_gui1.gif</screenshot>
+    <screenshot width="755" height="633">http://proguard.sourceforge.net/screenshot_console.gif</screenshot>
+  </screenshots>
+  <url type="homepage">http://proguard.sourceforge.net/</url>
+  <updatecontact>eric@graphics.cornell.edu</updatecontact>
+</application>
\ No newline at end of file
diff --git a/docs/quality.html b/docs/quality.html
index d9935fc..4c5f9e5 100644
--- a/docs/quality.html
+++ b/docs/quality.html
@@ -5,19 +5,21 @@
 <meta http-equiv="content-style-type" content="text/css">
 <link rel="stylesheet" type="text/css" href="style.css">
 <title>ProGuard Quality</title>
+</head>
+<body>
+
 <script type="text/javascript" language="JavaScript">
 <!--
 if (window.self==window.top)
-  window.top.location.replace("index.html#"+window.location.pathname+window.location.hash);
-else {
-  var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
-  if (window.top.location.hash!=hash)
-    window.top.location.hash=hash;
-}
+  document.write('<a class="largebutton" target="_top" href="index.html#quality.html">ProGuard index</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/dexguard">DexGuard</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/">Saikoa</a> <a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>')
 //-->
 </script>
-</head>
-<body>
+<noscript>
+<a class="largebutton" target="_top"  href="index.html#quality.html">ProGuard index</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/dexguard">DexGuard</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/">Saikoa</a>
+<a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>
+</noscript>
 
 <h2>Quality</h2>
 
@@ -42,15 +44,14 @@
 <p>
 
 In addition, <b>ProGuard</b> is tested against a constantly growing test suite
-(more than 1500 tests at this time of writing). These small programs contain a
+(more than 1800 tests at this time of writing). These small programs contain a
 wide range of common and uncommon constructs, in order to detect any regression
 problems as soon as possible.
 
 <hr />
-<noscript><div><a target="_top" href="index.html" class="button">Show menu</a></div></noscript>
 <address>
-Copyright &copy; 2002-2013
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2014
+<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a> @ <a target="top" href="http://www.saikoa.com/">Saikoa</a>.
 </address>
 </body>
 </html>
diff --git a/docs/results.html b/docs/results.html
index eee8aa6..ff2572b 100644
--- a/docs/results.html
+++ b/docs/results.html
@@ -5,19 +5,21 @@
 <meta http-equiv="content-style-type" content="text/css">
 <link rel="stylesheet" type="text/css" href="style.css">
 <title>ProGuard Results</title>
+</head>
+<body>
+
 <script type="text/javascript" language="JavaScript">
 <!--
 if (window.self==window.top)
-  window.top.location.replace("index.html#"+window.location.pathname+window.location.hash);
-else {
-  var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
-  if (window.top.location.hash!=hash)
-    window.top.location.hash=hash;
-}
+  document.write('<a class="largebutton" target="_top" href="index.html#results.html">ProGuard index</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/dexguard">DexGuard</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/">Saikoa</a> <a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>')
 //-->
 </script>
-</head>
-<body>
+<noscript>
+<a class="largebutton" target="_top"  href="index.html#results.html">ProGuard index</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/dexguard">DexGuard</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/">Saikoa</a>
+<a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>
+</noscript>
 
 <h2>Results</h2>
 
@@ -42,7 +44,7 @@
 </tr>
 
 <tr>
-<td><a target="other" href="http://www.oracle.com/technetwork/java/javame/index,html">Worm</a>, a sample midlet from Oracle's JME</td>
+<td><a target="other" href="http://www.oracle.com/technetwork/java/javame/index.html">Worm</a>, a sample midlet from Oracle's JME</td>
 <td align="center">10.3 K</td>
 <td align="center">9.8 K</td>
 <td align="center">9.6 K</td>
@@ -159,10 +161,9 @@
 library jars and program jars.
 
 <hr />
-<noscript><div><a target="_top" href="index.html" class="button">Show menu</a></div></noscript>
 <address>
-Copyright &copy; 2002-2013
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2014
+<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a> @ <a target="top" href="http://www.saikoa.com/">Saikoa</a>.
 </address>
 
 </body>
diff --git a/docs/screenshots.html b/docs/screenshots.html
index 31c1296..66334fc 100644
--- a/docs/screenshots.html
+++ b/docs/screenshots.html
@@ -5,19 +5,21 @@
 <meta http-equiv="content-style-type" content="text/css">
 <link rel="stylesheet" type="text/css" href="style.css">
 <title>ProGuard Screenshots</title>
+</head>
+<body>
+
 <script type="text/javascript" language="JavaScript">
 <!--
 if (window.self==window.top)
-  window.top.location.replace("index.html#"+window.location.pathname+window.location.hash);
-else {
-  var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
-  if (window.top.location.hash!=hash)
-    window.top.location.hash=hash;
-}
+  document.write('<a class="largebutton" target="_top" href="index.html#screenshots.html">ProGuard index</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/dexguard">DexGuard</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/">Saikoa</a> <a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>')
 //-->
 </script>
-</head>
-<body>
+<noscript>
+<a class="largebutton" target="_top"  href="index.html#screenshots.html">ProGuard index</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/dexguard">DexGuard</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/">Saikoa</a>
+<a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>
+</noscript>
 
 <h2>Screenshots</h2>
 
@@ -58,10 +60,9 @@
 </td></tr></table>
 
 <hr />
-<noscript><div><a target="_top" href="index.html" class="button">Show menu</a></div></noscript>
 <address>
-Copyright &copy; 2002-2013
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2014
+<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a> @ <a target="top" href="http://www.saikoa.com/">Saikoa</a>.
 </address>
 </body>
 </html>
diff --git a/docs/sections.html b/docs/sections.html
index 7a2ab8a..cfe45b1 100644
--- a/docs/sections.html
+++ b/docs/sections.html
@@ -44,14 +44,6 @@
 
 </center>
 
-<script type="text/javascript">
-base = "http://sourceforge.net/apps/piwik/proguard/";
-if (document.location.hostname == "proguard.sourceforge.net")
-  document.write(unescape("%3Cscript src='"+base+"piwik.js' type='text/javascript'%3E%3C/script%3E"));
-</script><script type="text/javascript">
-if (document.location.hostname == "proguard.sourceforge.net")
-  piwik_log('', 1, base+"piwik.php");
-</script>
 
 </body>
 </html>
diff --git a/docs/style.css b/docs/style.css
index 71d69d7..79f4c07 100644
--- a/docs/style.css
+++ b/docs/style.css
@@ -75,6 +75,16 @@
   float: right;
 }
 
+a.largebutton {
+  font-weight: bold;
+  color: #000000;
+  margin: 0px;
+  padding: 10px;
+  background: url("steel.gif");
+  text-decoration: none;
+  border: 1px outset #FFFFFF;
+}
+
 /* Settings for the introductory paragraph. */
 
 p.intro
diff --git a/docs/testimonials.html b/docs/testimonials.html
index f6e2cd7..2d90a41 100644
--- a/docs/testimonials.html
+++ b/docs/testimonials.html
@@ -5,19 +5,21 @@
 <meta http-equiv="content-style-type" content="text/css">
 <link rel="stylesheet" type="text/css" href="style.css">
 <title>ProGuard Testimonials</title>
+</head>
+<body>
+
 <script type="text/javascript" language="JavaScript">
 <!--
 if (window.self==window.top)
-  window.top.location.replace("index.html#"+window.location.pathname+window.location.hash);
-else {
-  var hash="#"+window.location.pathname.replace(window.top.location.pathname.replace("index.html", ""), "");
-  if (window.top.location.hash!=hash)
-    window.top.location.hash=hash;
-}
+  document.write('<a class="largebutton" target="_top" href="index.html#testimonials.html">ProGuard index</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/dexguard">DexGuard</a> <a class="largebutton" target="_top" href="http://www.saikoa.com/">Saikoa</a> <a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>')
 //-->
 </script>
-</head>
-<body>
+<noscript>
+<a class="largebutton" target="_top"  href="index.html#testimonials.html">ProGuard index</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/dexguard">DexGuard</a>
+<a class="largebutton" target="_top"  href="http://www.saikoa.com/">Saikoa</a>
+<a class="largebutton" target="other" href="http://sourceforge.net/projects/proguard/">Sourceforge</a>
+</noscript>
 
 <h2>Testimonials</h2>
 
@@ -123,10 +125,9 @@
 </tr></table></center>
 
 <hr />
-<noscript><div><a target="_top" href="index.html" class="button">Show menu</a></div></noscript>
 <address>
-Copyright &copy; 2002-2013
-<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a>.
+Copyright &copy; 2002-2014
+<a target="other" href="http://www.lafortune.eu/">Eric Lafortune</a> @ <a target="top" href="http://www.saikoa.com/">Saikoa</a>.
 </address>
 
 </body>
diff --git a/docs/title.html b/docs/title.html
index 80e2c42..7dea197 100644
--- a/docs/title.html
+++ b/docs/title.html
@@ -10,7 +10,7 @@
 
 <div class="title">
 <h1><img src="title.gif" width="154" height="29" alt="ProGuard" /></h1>
-<div>Version 4.10</div>
+<div>Version 5.1</div>
 </div>
 
 </body>
diff --git a/examples/android.pro b/examples/android.pro
index 234dad4..10aa805 100644
--- a/examples/android.pro
+++ b/examples/android.pro
@@ -128,14 +128,14 @@
 
 # Preserve all native method names and the names of their classes.
 
--keepclasseswithmembernames class * {
+-keepclasseswithmembernames,includedescriptorclasses class * {
     native <methods>;
 }
 
 # Preserve the special static methods that are required in all enumeration
 # classes.
 
--keepclassmembers class * extends java.lang.Enum {
+-keepclassmembers,allowoptimization enum * {
     public static **[] values();
     public static ** valueOf(java.lang.String);
 }
diff --git a/examples/annotations/examples.pro b/examples/annotations/examples.pro
index 3a47183..d2b212c 100644
--- a/examples/annotations/examples.pro
+++ b/examples/annotations/examples.pro
@@ -32,14 +32,14 @@
 
 # Preserve all native method names and the names of their classes.
 
--keepclasseswithmembernames class * {
+-keepclasseswithmembernames,includedescriptorclasses class * {
     native <methods>;
 }
 
 # Preserve the special static methods that are required in all enumeration
 # classes.
 
--keepclassmembers class * extends java.lang.Enum {
+-keepclassmembers,allowoptimization enum * {
     public static **[] values();
     public static ** valueOf(java.lang.String);
 }
diff --git a/examples/annotations/examples/Applet.java b/examples/annotations/examples/Applet.java
index 8a5874b..e5b7acc 100644
--- a/examples/annotations/examples/Applet.java
+++ b/examples/annotations/examples/Applet.java
@@ -8,7 +8,8 @@
  * You can then process it with:
  *     java -jar ../../../lib/proguard.jar @ ../examples.pro
  *
- * The annotation will preserve the class and its essential methods.
+ * The annotation will preserve the class and its essential methods,
+ * as a result of the specifications in lib/annotations.pro.
  */
 @Keep
 public class Applet extends java.applet.Applet
diff --git a/examples/annotations/examples/Application.java b/examples/annotations/examples/Application.java
index f8d5060..777d286 100644
--- a/examples/annotations/examples/Application.java
+++ b/examples/annotations/examples/Application.java
@@ -8,7 +8,8 @@
  * You can then process it with:
  *     java -jar ../../../lib/proguard.jar @ ../examples.pro
  *
- * The annotation will preserve the class and its main method.
+ * The annotation will preserve the class and its main method,
+ * as a result of the specifications in lib/annotations.pro.
  */
 @KeepApplication
 public class Application
diff --git a/examples/annotations/examples/Bean.java b/examples/annotations/examples/Bean.java
index 0544bf3..aacb501 100644
--- a/examples/annotations/examples/Bean.java
+++ b/examples/annotations/examples/Bean.java
@@ -8,7 +8,8 @@
  * You can then process it with:
  *     java -jar ../../../lib/proguard.jar @ ../examples.pro
  *
- * The annotations will preserve the class and its public getters and setters.
+ * The annotations will preserve the class and its public getters and setters,
+ * as a result of the specifications in lib/annotations.pro.
  */
 @Keep
 @KeepPublicGettersSetters
diff --git a/examples/annotations/examples/NativeCallBack.java b/examples/annotations/examples/NativeCallBack.java
index 2c72f7b..a4e5583 100644
--- a/examples/annotations/examples/NativeCallBack.java
+++ b/examples/annotations/examples/NativeCallBack.java
@@ -8,7 +8,8 @@
  * You can then process it with:
  *     java -jar ../../../lib/proguard.jar @ ../examples.pro
  *
- * The annotation will preserve the class and its main method.
+ * The annotation will preserve the class and its main method,
+ * as a result of the specifications in lib/annotations.pro.
  */
 @KeepApplication
 public class NativeCallBack
@@ -16,8 +17,9 @@
     /**
      * Suppose this is a native method that computes an answer.
      *
-     * The -keep option regular ProGuard configuration will make sure it is
-     * not renamed when processing this code.
+     * The -keep option for native methods in the regular ProGuard
+     * configuration will make sure it is not removed or renamed when
+     * processing this code.
      */
     public native int computeAnswer();
 
@@ -35,6 +37,12 @@
     }
 
 
+    /**
+     * The main entry point of the application.
+     *
+     * The @KeepApplication annotation of this class will make sure it is not
+     * removed or renamed when processing this code.
+     */
     public static void main(String[] args)
     {
         int answer = new NativeCallBack().computeAnswer();
diff --git a/examples/annotations/lib/annotations.jar b/examples/annotations/lib/annotations.jar
index f43f24e..d931505 100644
--- a/examples/annotations/lib/annotations.jar
+++ b/examples/annotations/lib/annotations.jar
Binary files differ
diff --git a/examples/ant/applets.xml b/examples/ant/applets.xml
index 4d0cb38..5666f96 100644
--- a/examples/ant/applets.xml
+++ b/examples/ant/applets.xml
@@ -33,13 +33,13 @@
 
     <!-- Preserve all native method names and the names of their classes. -->
 
-    <keepclasseswithmembernames>
+    <keepclasseswithmembernames includedescriptorclasses="true">
       <method access="native" />
     </keepclasseswithmembernames>
     
     <!-- Preserve the methods that are required in all enumeration classes. -->
     
-    <keepclassmembers extends="java.lang.Enum">
+    <keepclassmembers allowoptimization="true" type="enum">
       <method access="public static"
               type="**[]"
               name="values"
diff --git a/examples/ant/applications2.xml b/examples/ant/applications2.xml
index 681a894..664a9ee 100644
--- a/examples/ant/applications2.xml
+++ b/examples/ant/applications2.xml
@@ -45,7 +45,7 @@
 
     <!-- Preserve the methods that are required in all enumeration classes. -->
 
-    -keepclassmembers class * extends java.lang.Enum {
+    -keepclassmembers,allowoptimization enum * {
         public static **[] values();
         public static ** valueOf(java.lang.String);
     }
diff --git a/examples/ant/applications3.xml b/examples/ant/applications3.xml
index e42eb39..023c2be 100644
--- a/examples/ant/applications3.xml
+++ b/examples/ant/applications3.xml
@@ -43,13 +43,13 @@
 
     <!-- Preserve all native method names and the names of their classes. -->
 
-    <keepclasseswithmembernames>
+    <keepclasseswithmembernames includedescriptorclasses="true">
       <method access="native" />
     </keepclasseswithmembernames>
 
     <!-- Preserve the methods that are required in all enumeration classes. -->
 
-    <keepclassmembers extends="java.lang.Enum">
+    <keepclassmembers allowoptimization="true" type="enum">
       <method access="public static"
               type="**[]"
               name="values"
diff --git a/examples/ant/library.xml b/examples/ant/library.xml
index d87bd16..37ceb1a 100644
--- a/examples/ant/library.xml
+++ b/examples/ant/library.xml
@@ -47,13 +47,13 @@
 
     <!-- Preserve all native method names and the names of their classes. -->
 
-    <keepclasseswithmembernames>
+    <keepclasseswithmembernames includedescriptorclasses="true">
       <method access="native" />
     </keepclasseswithmembernames>
     
     <!-- Preserve the methods that are required in all enumeration classes. -->
     
-    <keepclassmembers extends="java.lang.Enum">
+    <keepclassmembers allowoptimization="true" type="enum">
       <method access="public static"
               type="**[]"
               name="values"
diff --git a/examples/ant/midlets.xml b/examples/ant/midlets.xml
index 223d0da..fe17277 100644
--- a/examples/ant/midlets.xml
+++ b/examples/ant/midlets.xml
@@ -39,7 +39,7 @@
 
     <!-- Preserve all native method names and the names of their classes. -->
 
-    <keepclasseswithmembernames>
+    <keepclasseswithmembernames includedescriptorclasses="true">
       <method access="native" />
     </keepclasseswithmembernames>
     
diff --git a/examples/ant/proguard.xml b/examples/ant/proguard.xml
index 1911a90..18b520b 100644
--- a/examples/ant/proguard.xml
+++ b/examples/ant/proguard.xml
@@ -24,10 +24,11 @@
 
     <libraryjar file="${java.home}/lib/rt.jar" />
     <libraryjar file="/usr/local/java/ant/lib/ant.jar" />
-    <libraryjar file="/usr/local/java/gradle-1.3/lib/plugins/gradle-plugins-1.3.jar" />
-    <libraryjar file="/usr/local/java/gradle-1.3/lib/gradle-base-services-1.3.jar" />
-    <libraryjar file="/usr/local/java/gradle-1.3/lib/gradle-core-1.3.jar" />
-    <libraryjar file="/usr/local/java/gradle-1.3/lib/groovy-all-1.8.6.jar" />
+    <libraryjar file="/usr/local/java/gradle-2.1/lib/plugins/gradle-plugins-2.1.jar" />
+    <libraryjar file="/usr/local/java/gradle-2.1/lib/gradle-base-services-2.1.jar" />
+    <libraryjar file="/usr/local/java/gradle-2.1/lib/gradle-base-services-groovy-2.1.jar" />
+    <libraryjar file="/usr/local/java/gradle-2.1/lib/gradle-core-2.1.jar" />
+    <libraryjar file="/usr/local/java/gradle-2.1/lib/groovy-all-2.3.6.jar" />
     <libraryjar file="/usr/local/java/wtk2.5.2/wtklib/kenv.zip" />
 
     <!-- Adapt the resource file names, based on the corresponding obfuscated
diff --git a/examples/ant/servlets.xml b/examples/ant/servlets.xml
index 51bcaad..33ca6ce 100644
--- a/examples/ant/servlets.xml
+++ b/examples/ant/servlets.xml
@@ -33,13 +33,13 @@
 
     <!-- Preserve all native method names and the names of their classes. -->
 
-    <keepclasseswithmembernames>
+    <keepclasseswithmembernames includedescriptorclasses="true">
       <method access="native" />
     </keepclasseswithmembernames>
     
     <!-- Preserve the methods that are required in all enumeration classes. -->
     
-    <keepclassmembers extends="java.lang.Enum">
+    <keepclassmembers allowoptimization="true" type="enum">
       <method access="public static"
               type="**[]"
               name="values"
diff --git a/examples/applets.pro b/examples/applets.pro
index c5affc1..75256a0 100644
--- a/examples/applets.pro
+++ b/examples/applets.pro
@@ -34,14 +34,14 @@
 
 # Preserve all native method names and the names of their classes.
 
--keepclasseswithmembernames class * {
+-keepclasseswithmembernames,includedescriptorclasses class * {
     native <methods>;
 }
 
 # Preserve the special static methods that are required in all enumeration
 # classes.
 
--keepclassmembers class * extends java.lang.Enum {
+-keepclassmembers,allowoptimization enum * {
     public static **[] values();
     public static ** valueOf(java.lang.String);
 }
diff --git a/examples/applications.pro b/examples/applications.pro
index f718088..5424423 100644
--- a/examples/applications.pro
+++ b/examples/applications.pro
@@ -40,14 +40,14 @@
 
 # Preserve all native method names and the names of their classes.
 
--keepclasseswithmembernames class * {
+-keepclasseswithmembernames,includedescriptorclasses class * {
     native <methods>;
 }
 
 # Preserve the special static methods that are required in all enumeration
 # classes.
 
--keepclassmembers class * extends java.lang.Enum {
+-keepclassmembers,allowoptimization enum * {
     public static **[] values();
     public static ** valueOf(java.lang.String);
 }
diff --git a/examples/gradle/android.gradle b/examples/gradle/android.gradle
index 4e950d5..b4fe719 100644
--- a/examples/gradle/android.gradle
+++ b/examples/gradle/android.gradle
@@ -148,14 +148,14 @@
 
     // Preserve all native method names and the names of their classes.
 
-    keepclasseswithmembernames 'class * { \
+    keepclasseswithmembernames includedescriptorclasses:true, 'class * { \
         native <methods>; \
     }'
 
     // Preserve the special static methods that are required in all enumeration
     // classes.
 
-    keepclassmembers 'class * extends java.lang.Enum { \
+    keepclassmembers allowshrinking:true, 'enum * { \
         public static **[] values(); \
         public static ** valueOf(java.lang.String); \
     }'
diff --git a/examples/gradle/applets.gradle b/examples/gradle/applets.gradle
index 29c8559..aefe651 100644
--- a/examples/gradle/applets.gradle
+++ b/examples/gradle/applets.gradle
@@ -54,14 +54,14 @@
 
     // Preserve all native method names and the names of their classes.
 
-    keepclasseswithmembernames 'class * { \
+    keepclasseswithmembernames includedescriptorclasses:true, 'class * { \
         native <methods>; \
     }'
 
     // Preserve the special static methods that are required in all enumeration
     // classes.
 
-    keepclassmembers 'class * extends java.lang.Enum { \
+    keepclassmembers allowshrinking:true, 'enum * { \
         public static **[] values(); \
         public static ** valueOf(java.lang.String); \
     }'
diff --git a/examples/gradle/applications.gradle b/examples/gradle/applications.gradle
index 73dfdf0..ffadf91 100644
--- a/examples/gradle/applications.gradle
+++ b/examples/gradle/applications.gradle
@@ -60,14 +60,14 @@
 
     // Preserve all native method names and the names of their classes.
 
-    keepclasseswithmembernames 'class * { \
+    keepclasseswithmembernames includedescriptorclasses:true, 'class * { \
         native <methods>; \
     }'
 
     // Preserve the special static methods that are required in all enumeration
     // classes.
 
-    keepclassmembers 'class * extends java.lang.Enum { \
+    keepclassmembers allowshrinking:true, 'enum * { \
         public static **[] values(); \
         public static ** valueOf(java.lang.String); \
     }'
diff --git a/examples/gradle/library.gradle b/examples/gradle/library.gradle
index 2f68962..8bd137c 100644
--- a/examples/gradle/library.gradle
+++ b/examples/gradle/library.gradle
@@ -63,14 +63,14 @@
 
     // Preserve all native method names and the names of their classes.
 
-    keepclasseswithmembernames 'class * { \
+    keepclasseswithmembernames includedescriptorclasses:true, 'class * { \
         native <methods>; \
     }'
 
     // Preserve the special static methods that are required in all enumeration
     // classes.
 
-    keepclassmembers 'class * extends java.lang.Enum { \
+    keepclassmembers allowshrinking:true, 'enum * { \
         public static **[] values(); \
         public static ** valueOf(java.lang.String); \
     }'
diff --git a/examples/gradle/midlets.gradle b/examples/gradle/midlets.gradle
index dffb2c3..1e9fb11 100644
--- a/examples/gradle/midlets.gradle
+++ b/examples/gradle/midlets.gradle
@@ -75,7 +75,7 @@
 
     // Preserve all native method names and the names of their classes.
 
-    keepclasseswithmembernames 'class * { \
+    keepclasseswithmembernames includedescriptorclasses:true, 'class * { \
         native <methods>; \
     }'
 
diff --git a/examples/gradle/proguard.gradle b/examples/gradle/proguard.gradle
index 8974f93..0abb72e 100644
--- a/examples/gradle/proguard.gradle
+++ b/examples/gradle/proguard.gradle
@@ -74,10 +74,11 @@
     // If you want to preserve the Gradle task, you'll have to specify the Gradle
     // jars.
 
-    //libraryjars '/usr/local/java/gradle-1.3/lib/plugins/gradle-plugins-1.3.jar'
-    //libraryjars '/usr/local/java/gradle-1.3/lib/gradle-base-services-1.3.jar'
-    //libraryjars '/usr/local/java/gradle-1.3/lib/gradle-core-1.3.jar'
-    //libraryjars '/usr/local/java/gradle-1.3/lib/groovy-all-1.8.6.jar'
+    //libraryjars '/usr/local/java/gradle-2.1/lib/plugins/gradle-plugins-2.1.jar'
+    //libraryjars '/usr/local/java/gradle-2.1/lib/gradle-base-services-2.1.jar'
+    //libraryjars '/usr/local/java/gradle-2.1/lib/gradle-base-services-groovy-2.1.jar'
+    //libraryjars '/usr/local/java/gradle-2.1/lib/gradle-core-2.1.jar'
+    //libraryjars '/usr/local/java/gradle-2.1/lib/groovy-all-2.3.6.jar'
 
     //keep 'public class proguard.gradle.* { \
     //    public *; \
diff --git a/examples/gradle/proguardall.gradle b/examples/gradle/proguardall.gradle
index 561a455..43c905c 100644
--- a/examples/gradle/proguardall.gradle
+++ b/examples/gradle/proguardall.gradle
@@ -38,10 +38,11 @@
 
     libraryjars "${System.getProperty('java.home')}/lib/rt.jar"
     libraryjars '/usr/local/java/ant/lib/ant.jar'
-    libraryjars '/usr/local/java/gradle-1.3/lib/plugins/gradle-plugins-1.3.jar'
-    libraryjars '/usr/local/java/gradle-1.3/lib/gradle-base-services-1.3.jar'
-    libraryjars '/usr/local/java/gradle-1.3/lib/gradle-core-1.3.jar'
-    libraryjars '/usr/local/java/gradle-1.3/lib/groovy-all-1.8.6.jar'
+    libraryjars '/usr/local/java/gradle-2.1/lib/plugins/gradle-plugins-2.1.jar'
+    libraryjars '/usr/local/java/gradle-2.1/lib/gradle-base-services-2.1.jar'
+    libraryjars '/usr/local/java/gradle-2.1/lib/gradle-base-services-groovy-2.1.jar'
+    libraryjars '/usr/local/java/gradle-2.1/lib/gradle-core-2.1.jar'
+    libraryjars '/usr/local/java/gradle-2.1/lib/groovy-all-2.3.6.jar'
     libraryjars '/usr/local/java/wtk2.5.2/wtklib/kenv.zip'
 
     // Allow methods with the same signature, except for the return type,
diff --git a/examples/gradle/scala.gradle b/examples/gradle/scala.gradle
index 286e5e9..69be1bb 100644
--- a/examples/gradle/scala.gradle
+++ b/examples/gradle/scala.gradle
@@ -116,14 +116,14 @@
 
     // Preserve all native method names and the names of their classes.
 
-    keepclasseswithmembernames 'class * { \
+    keepclasseswithmembernames includedescriptorclasses:true, 'class * { \
         native <methods>; \
     }'
 
     // Preserve the special static methods that are required in all enumeration
     // classes.
 
-    keepclassmembers 'class * extends java.lang.Enum { \
+    keepclassmembers allowshrinking:true, 'enum * { \
         public static **[] values(); \
         public static ** valueOf(java.lang.String); \
     }'
diff --git a/examples/gradle/servlets.gradle b/examples/gradle/servlets.gradle
index c91ed6a..23062ff 100644
--- a/examples/gradle/servlets.gradle
+++ b/examples/gradle/servlets.gradle
@@ -55,14 +55,14 @@
 
     // Preserve all native method names and the names of their classes.
 
-    keepclasseswithmembernames 'class * { \
+    keepclasseswithmembernames includedescriptorclasses:true, 'class * { \
         native <methods>; \
     }'
 
     // Preserve the special static methods that are required in all enumeration
     // classes.
 
-    keepclassmembers 'class * extends java.lang.Enum { \
+    keepclassmembers allowshrinking:true, 'enum * { \
         public static **[] values(); \
         public static ** valueOf(java.lang.String); \
     }'
diff --git a/examples/library.pro b/examples/library.pro
index b812082..4669e79 100644
--- a/examples/library.pro
+++ b/examples/library.pro
@@ -44,14 +44,14 @@
 
 # Preserve all native method names and the names of their classes.
 
--keepclasseswithmembernames class * {
+-keepclasseswithmembernames,includedescriptorclasses class * {
     native <methods>;
 }
 
 # Preserve the special static methods that are required in all enumeration
 # classes.
 
--keepclassmembers class * extends java.lang.Enum {
+-keepclassmembers,allowoptimization enum * {
     public static **[] values();
     public static ** valueOf(java.lang.String);
 }
diff --git a/examples/midlets.pro b/examples/midlets.pro
index 1383980..f2f5f21 100644
--- a/examples/midlets.pro
+++ b/examples/midlets.pro
@@ -55,7 +55,7 @@
 
 # Preserve all native method names and the names of their classes.
 
--keepclasseswithmembernames class * {
+-keepclasseswithmembernames,includedescriptorclasses class * {
     native <methods>;
 }
 
diff --git a/examples/scala.pro b/examples/scala.pro
index 658fc77..3b69c3c 100644
--- a/examples/scala.pro
+++ b/examples/scala.pro
@@ -96,14 +96,14 @@
 
 # Preserve all native method names and the names of their classes.
 
--keepclasseswithmembernames class * {
+-keepclasseswithmembernames,includedescriptorclasses class * {
     native <methods>;
 }
 
 # Preserve the special static methods that are required in all enumeration
 # classes.
 
--keepclassmembers class * extends java.lang.Enum {
+-keepclassmembers,allowoptimization enum * {
     public static **[] values();
     public static ** valueOf(java.lang.String);
 }
diff --git a/examples/servlets.pro b/examples/servlets.pro
index b42b2e4..a3f7875 100644
--- a/examples/servlets.pro
+++ b/examples/servlets.pro
@@ -35,14 +35,14 @@
 
 # Preserve all native method names and the names of their classes.
 
--keepclasseswithmembernames class * {
+-keepclasseswithmembernames,includedescriptorclasses class * {
     native <methods>;
 }
 
 # Preserve the special static methods that are required in all enumeration
 # classes.
 
--keepclassmembers class * extends java.lang.Enum {
+-keepclassmembers,allowoptimization enum * {
     public static **[] values();
     public static ** valueOf(java.lang.String);
 }
diff --git a/lib/proguard.jar b/lib/proguard.jar
index dfb7f29..a948c89 100644
--- a/lib/proguard.jar
+++ b/lib/proguard.jar
Binary files differ
diff --git a/lib/proguardgui.jar b/lib/proguardgui.jar
index 03a5eb5..b876e89 100644
--- a/lib/proguardgui.jar
+++ b/lib/proguardgui.jar
Binary files differ
diff --git a/lib/retrace.jar b/lib/retrace.jar
index 30fa081..c00fbe7 100644
--- a/lib/retrace.jar
+++ b/lib/retrace.jar
Binary files differ
diff --git a/src/proguard/ArgumentWordReader.java b/src/proguard/ArgumentWordReader.java
index efe8e6e..3d04af3 100644
--- a/src/proguard/ArgumentWordReader.java
+++ b/src/proguard/ArgumentWordReader.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/AssumeNoSideEffectsChecker.java b/src/proguard/AssumeNoSideEffectsChecker.java
new file mode 100644
index 0000000..5932b70
--- /dev/null
+++ b/src/proguard/AssumeNoSideEffectsChecker.java
@@ -0,0 +1,98 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ *             of Java bytecode.
+ *
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+package proguard;
+
+import proguard.classfile.util.*;
+
+import java.util.List;
+
+/**
+ * This class checks if the user is specifying to assume no side effects
+ * for a reasonable number of methods in a class: not none and not all.
+ *
+ * @author Eric Lafortune
+ */
+public class AssumeNoSideEffectsChecker
+{
+    private final WarningPrinter notePrinter;
+
+
+    /**
+     * Creates a new KeepClassMemberChecker.
+     */
+    public AssumeNoSideEffectsChecker(WarningPrinter notePrinter)
+    {
+        this.notePrinter = notePrinter;
+    }
+
+
+    /**
+     * Checks if the given class specifications try to assume no side effects
+     * for all methods in a class, printing notes if necessary.
+     */
+    public void checkClassSpecifications(List classSpecifications)
+    {
+        if (classSpecifications != null)
+        {
+            for (int classSpecificationIndex = 0;
+                 classSpecificationIndex < classSpecifications.size();
+                 classSpecificationIndex++)
+            {
+                ClassSpecification classSpecification =
+                    (ClassSpecification)classSpecifications.get(classSpecificationIndex);
+
+                String className = classSpecification.className;
+                if (className == null)
+                {
+                    className = classSpecification.extendsClassName;
+                }
+
+                if (className == null ||
+                    notePrinter.accepts(className))
+                {
+                    List methodSpecifications =
+                        classSpecification.methodSpecifications;
+
+                    if (methodSpecifications != null)
+                    {
+                        for (int methodSpecificationIndex = 0;
+                             methodSpecificationIndex < methodSpecifications.size();
+                             methodSpecificationIndex++)
+                        {
+                            final MemberSpecification methodSpecification =
+                                (MemberSpecification)methodSpecifications.get(methodSpecificationIndex);
+
+                            if (methodSpecification.name       == null &&
+                                methodSpecification.descriptor == null)
+                            {
+                                notePrinter.print(className,
+                                                  "Note: the configuration specifies that none of the methods of class '" +
+                                                  (className == null ?
+                                                       ConfigurationConstants.ANY_CLASS_KEYWORD :
+                                                       ClassUtil.externalClassName(className)) + "' have any side effects");
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/src/proguard/ClassMemberChecker.java b/src/proguard/ClassMemberChecker.java
new file mode 100644
index 0000000..249105e
--- /dev/null
+++ b/src/proguard/ClassMemberChecker.java
@@ -0,0 +1,158 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ *             of Java bytecode.
+ *
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+package proguard;
+
+import proguard.classfile.*;
+import proguard.classfile.util.*;
+import proguard.classfile.visitor.MemberVisitor;
+
+import java.util.List;
+
+/**
+ * This class checks if the user has specified non-existent class members.
+ *
+ * @author Eric Lafortune
+ */
+public class ClassMemberChecker
+extends      SimplifiedVisitor
+implements   MemberVisitor
+{
+    private final ClassPool      programClassPool;
+    private final WarningPrinter notePrinter;
+
+
+    /**
+     * Creates a new ClassMemberChecker.
+     */
+    public ClassMemberChecker(ClassPool      programClassPool,
+                              WarningPrinter notePrinter)
+    {
+        this.programClassPool = programClassPool;
+        this.notePrinter      = notePrinter;
+    }
+
+
+    /**
+     * Checks the classes mentioned in the given class specifications, printing
+     * notes if necessary.
+     */
+    public void checkClassSpecifications(List classSpecifications)
+    {
+        if (classSpecifications != null)
+        {
+            for (int index = 0; index < classSpecifications.size(); index++)
+            {
+                ClassSpecification classSpecification =
+                    (ClassSpecification)classSpecifications.get(index);
+
+                String className = classSpecification.className;
+                if (className != null             &&
+                    !containsWildCards(className) &&
+                    notePrinter.accepts(className))
+                {
+                    Clazz clazz = programClassPool.getClass(className);
+                    if (clazz != null)
+                    {
+                        checkMemberSpecifications(clazz, classSpecification.fieldSpecifications,  true);
+                        checkMemberSpecifications(clazz, classSpecification.methodSpecifications, false);
+                    }
+                }
+            }
+        }
+    }
+
+
+    /**
+     * Checks the class members mentioned in the given class member
+     * specifications, printing notes if necessary.
+     */
+    private void checkMemberSpecifications(Clazz   clazz,
+                                           List    memberSpecifications,
+                                           boolean isField)
+    {
+        if (memberSpecifications != null)
+        {
+            String className = clazz.getName();
+
+            for (int index = 0; index < memberSpecifications.size(); index++)
+            {
+                MemberSpecification memberSpecification =
+                    (MemberSpecification)memberSpecifications.get(index);
+
+                String memberName = memberSpecification.name;
+                String descriptor = memberSpecification.descriptor;
+                if (memberName != null             &&
+                    !containsWildCards(memberName) &&
+                    descriptor != null             &&
+                    !containsWildCards(descriptor))
+                {
+                    if (isField)
+                    {
+                        if (clazz.findField(memberName, descriptor) == null)
+                        {
+                            notePrinter.print(className,
+                                              "Note: the configuration refers to the unknown field '" +
+                                              ClassUtil.externalFullFieldDescription(0, memberName, descriptor) + "' in class '" +
+                                              ClassUtil.externalClassName(className) + "'");
+                        }
+                    }
+                    else
+                    {
+                        if (clazz.findMethod(memberName, descriptor) == null)
+                        {
+                            notePrinter.print(className,
+                                              "Note: the configuration refers to the unknown method '" +
+                                              ClassUtil.externalFullMethodDescription(className, 0, memberName, descriptor) + "' in class '" +
+                                              ClassUtil.externalClassName(className) + "'");
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+
+    private static boolean containsWildCards(String string)
+    {
+        return string != null &&
+            (string.indexOf('!')   >= 0 ||
+             string.indexOf('*')   >= 0 ||
+             string.indexOf('?')   >= 0 ||
+             string.indexOf(',')   >= 0 ||
+             string.indexOf("///") >= 0);
+    }
+
+
+    // Implementations for MemberVisitor.
+
+    public void visitProgramField(ProgramClass programClass, ProgramField programField)
+    {
+        System.out.println("      Maybe you meant the field '" +
+                           ClassUtil.externalFullFieldDescription(0, programField.getName(programClass), programField.getDescriptor(programClass)) + "'?");
+    }
+
+
+    public void visitProgramMethod(ProgramClass programClass, ProgramMethod programMethod)
+    {
+        System.out.println("      Maybe you meant the method '" +
+                           ClassUtil.externalFullMethodDescription(programClass.getName(), 0, programMethod.getName(programClass), programMethod.getDescriptor(programClass)) + "'?");
+    }
+}
\ No newline at end of file
diff --git a/src/proguard/ClassPath.java b/src/proguard/ClassPath.java
index 3d7d119..092a78d 100644
--- a/src/proguard/ClassPath.java
+++ b/src/proguard/ClassPath.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/ClassPathEntry.java b/src/proguard/ClassPathEntry.java
index 7051955..faceb1f 100644
--- a/src/proguard/ClassPathEntry.java
+++ b/src/proguard/ClassPathEntry.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -27,10 +27,11 @@
 
 
 /**
- * This class represents an entry from a class path: a jar, a war, a zip, an
- * ear, or a directory, with a name and a flag to indicates whether the entry is
- * an input entry or an output entry. Optional filters can be specified for the
- * names of the contained resource/classes, jars, wars, ears, and zips.
+ * This class represents an entry from a class path: an apk, a jar, an aar, a
+ * war, a zip, an ear, or a directory, with a name and a flag to indicates
+ * whether the entry is an input entry or an output entry. Optional filters can
+ * be specified for the names of the contained resource/classes, apks, jars,
+ * aars, wars, ears, and zips.
  *
  * @author Eric Lafortune
  */
@@ -39,11 +40,15 @@
     private File    file;
     private boolean output;
     private List    filter;
+    private List    apkFilter;
     private List    jarFilter;
+    private List    aarFilter;
     private List    warFilter;
     private List    earFilter;
     private List    zipFilter;
 
+    private String cachedName;
+
 
     /**
      * Creates a new ClassPathEntry with the given file and output flag.
@@ -60,6 +65,20 @@
      */
     public String getName()
     {
+        if (cachedName == null)
+        {
+            cachedName = getUncachedName();
+        }
+
+        return cachedName;
+    }
+
+
+    /**
+     * Returns the uncached path name of the entry.
+     */
+    private String getUncachedName()
+    {
         try
         {
             return file.getCanonicalPath();
@@ -85,7 +104,8 @@
      */
     public void setFile(File file)
     {
-        this.file = file;
+        this.file       = file;
+        this.cachedName = null;
     }
 
 
@@ -108,6 +128,25 @@
 
 
     /**
+     * Returns whether this data entry is a dex file.
+     */
+    public boolean isDex()
+    {
+        return hasExtension(".dex");
+    }
+
+
+    /**
+     * Returns whether this data entry is an apk file.
+     */
+    public boolean isApk()
+    {
+        return hasExtension(".apk") ||
+               hasExtension(".ap_");
+    }
+
+
+    /**
      * Returns whether this data entry is a jar file.
      */
     public boolean isJar()
@@ -117,6 +156,15 @@
 
 
     /**
+     * Returns whether this data entry is an aar file.
+     */
+    public boolean isAar()
+    {
+        return hasExtension(".aar");
+    }
+
+
+    /**
      * Returns whether this data entry is a war file.
      */
     public boolean isWar()
@@ -167,6 +215,21 @@
 
 
     /**
+     * Returns whether this data entry has any kind of filter.
+     */
+    public boolean isFiltered()
+    {
+        return filter    != null ||
+               apkFilter != null ||
+               jarFilter != null ||
+               aarFilter != null ||
+               warFilter != null ||
+               earFilter != null ||
+               zipFilter != null;
+    }
+
+
+    /**
      * Returns the name filter that is applied to bottom-level files in this entry.
      */
     public List getFilter()
@@ -184,6 +247,23 @@
 
 
     /**
+     * Returns the name filter that is applied to apk files in this entry, if any.
+     */
+    public List getApkFilter()
+    {
+        return apkFilter;
+    }
+
+    /**
+     * Sets the name filter that is applied to apk files in this entry, if any.
+     */
+    public void setApkFilter(List filter)
+    {
+        this.apkFilter = filter == null || filter.size() == 0 ? null : filter;
+    }
+
+
+    /**
      * Returns the name filter that is applied to jar files in this entry, if any.
      */
     public List getJarFilter()
@@ -201,6 +281,23 @@
 
 
     /**
+     * Returns the name filter that is applied to aar files in this entry, if any.
+     */
+    public List getAarFilter()
+    {
+        return aarFilter;
+    }
+
+    /**
+     * Sets the name filter that is applied to aar files in this entry, if any.
+     */
+    public void setAarFilter(List filter)
+    {
+        this.aarFilter = filter == null || filter.size() == 0 ? null : filter;
+    }
+
+
+    /**
      * Returns the name filter that is applied to war files in this entry, if any.
      */
     public List getWarFilter()
@@ -259,12 +356,17 @@
 
         if (filter    != null ||
             jarFilter != null ||
+            aarFilter != null ||
             warFilter != null ||
             earFilter != null ||
             zipFilter != null)
         {
             string +=
                 ConfigurationConstants.OPEN_ARGUMENTS_KEYWORD +
+                (aarFilter != null ? ListUtil.commaSeparatedString(aarFilter, true) : "")  +
+                ConfigurationConstants.SEPARATOR_KEYWORD +
+                (apkFilter != null ? ListUtil.commaSeparatedString(apkFilter, true) : "")  +
+                ConfigurationConstants.SEPARATOR_KEYWORD +
                 (zipFilter != null ? ListUtil.commaSeparatedString(zipFilter, true) : "")  +
                 ConfigurationConstants.SEPARATOR_KEYWORD +
                 (earFilter != null ? ListUtil.commaSeparatedString(earFilter, true) : "")  +
diff --git a/src/proguard/ClassSpecification.java b/src/proguard/ClassSpecification.java
index 485c0b0..c2b6bfd 100644
--- a/src/proguard/ClassSpecification.java
+++ b/src/proguard/ClassSpecification.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/ClassSpecificationVisitorFactory.java b/src/proguard/ClassSpecificationVisitorFactory.java
index dc5d71f..b403dde 100644
--- a/src/proguard/ClassSpecificationVisitorFactory.java
+++ b/src/proguard/ClassSpecificationVisitorFactory.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -39,12 +39,18 @@
      * classes and class members.
      *
      * @param keepClassSpecifications the list of KeepClassSpecification
-     *                                instances, defining of the classes and
+     *                                instances that specify the classes and
      *                                class members to visit.
      * @param classVisitor            the ClassVisitor to be applied to matching
      *                                classes.
      * @param memberVisitor           the MemberVisitor to be applied to matching
      *                                class members.
+     * @param shrinking               a flag that specifies whether the visitors
+     *                                are intended for the shrinking step.
+     * @param optimizing              a flag that specifies whether the visitors
+     *                                are intended for the optimization step.
+     * @param obfuscating             a flag that specifies whether the visitors
+     *                                are intended for the obfuscation step.
      */
     public static ClassPoolVisitor createClassPoolVisitor(List          keepClassSpecifications,
                                                           ClassVisitor  classVisitor,
@@ -82,9 +88,9 @@
      * Constructs a ClassPoolVisitor to efficiently travel to the specified
      * classes and class members.
      *
-     * @param classSpecifications the list of ClassSpecification instances,
-     *                            defining of the classes and class members to
-     *                            visit.
+     * @param classSpecifications the list of ClassSpecification instances
+     *                            that specify the classes and class members
+     *                            to visit.
      * @param classVisitor        the ClassVisitor to be applied to matching
      *                            classes.
      * @param memberVisitor       the MemberVisitor to be applied to matching
@@ -118,17 +124,31 @@
      * Constructs a ClassPoolVisitor to efficiently travel to the specified
      * classes and class members.
      *
-     * @param keepClassSpecification the specifications of the class(es) and class
-     *                          members to visit.
-     * @param classVisitor      the ClassVisitor to be applied to matching
-     *                          classes.
-     * @param memberVisitor     the MemberVisitor to be applied to matching
-     *                          class members.
+     * @param keepClassSpecification the specifications of the class(es) and
+     *                               class members to visit.
+     * @param classVisitor           the ClassVisitor to be applied to
+     *                               matching classes.
+     * @param memberVisitor          the MemberVisitor to be applied to
+     *                               matching class members.
      */
-    private static ClassPoolVisitor createClassPoolVisitor(KeepClassSpecification keepClassSpecification,
-                                                           ClassVisitor      classVisitor,
-                                                           MemberVisitor     memberVisitor)
+    public static ClassPoolVisitor createClassPoolVisitor(KeepClassSpecification keepClassSpecification,
+                                                          ClassVisitor           classVisitor,
+                                                          MemberVisitor          memberVisitor)
     {
+        // If specified, let the class visitor also visit the descriptor
+        // classes.
+        if (keepClassSpecification.markDescriptorClasses &&
+            classVisitor != null)
+        {
+            memberVisitor = memberVisitor == null ?
+                new MemberDescriptorReferencedClassVisitor(classVisitor) :
+                new MultiMemberVisitor(new MemberVisitor[]
+                {
+                    memberVisitor,
+                    new MemberDescriptorReferencedClassVisitor(classVisitor)
+                });
+        }
+
         // Don't  visit the classes if not specified.
         if (!keepClassSpecification.markClasses &&
             !keepClassSpecification.markConditionally)
@@ -172,9 +192,9 @@
      * @param memberVisitor      the MemberVisitor to be applied to matching
      *                           class members.
      */
-    private static ClassPoolVisitor createClassPoolVisitor(ClassSpecification classSpecification,
-                                                           ClassVisitor       classVisitor,
-                                                           MemberVisitor      memberVisitor)
+    public static ClassPoolVisitor createClassPoolVisitor(ClassSpecification classSpecification,
+                                                          ClassVisitor       classVisitor,
+                                                          MemberVisitor      memberVisitor)
     {
         // Combine both visitors.
         ClassVisitor composedClassVisitor =
diff --git a/src/proguard/Configuration.java b/src/proguard/Configuration.java
index 4711260..0b855a5 100644
--- a/src/proguard/Configuration.java
+++ b/src/proguard/Configuration.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/ConfigurationChecker.java b/src/proguard/ConfigurationChecker.java
new file mode 100644
index 0000000..84d4663
--- /dev/null
+++ b/src/proguard/ConfigurationChecker.java
@@ -0,0 +1,224 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ *             of Java bytecode.
+ *
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+package proguard;
+
+import proguard.classfile.util.WarningPrinter;
+
+import java.io.IOException;
+
+/**
+ * This class performs sanity checks on a given configurations.
+ *
+ * @author Eric Lafortune
+ */
+public class ConfigurationChecker
+{
+    private final Configuration configuration;
+
+
+    /**
+     * Creates a new ConfigurationChecker with the given configuration.
+     */
+    public ConfigurationChecker(Configuration configuration)
+    {
+        this.configuration = configuration;
+    }
+
+
+    /**
+     * Checks the given configuration for potential problems.
+     */
+    public void check() throws IOException
+    {
+        ClassPath programJars = configuration.programJars;
+        ClassPath libraryJars = configuration.libraryJars;
+
+        // Check that the input isn't empty.
+        if (programJars == null)
+        {
+            throw new IOException("The input is empty. You have to specify one or more '-injars' options.");
+        }
+
+        // Check that the first jar is an input jar.
+        ClassPathEntry firstEntry = programJars.get(0);
+        if (firstEntry.isOutput())
+        {
+            throw new IOException("The output jar [" + firstEntry.getName() +
+                                  "] must be specified after an input jar, or it will be empty.");
+        }
+
+        // Check that the first of two subsequent the output jars has a filter.
+        for (int index = 0; index < programJars.size() - 1; index++)
+        {
+            ClassPathEntry entry = programJars.get(index);
+            if (entry.isOutput()    &&
+                !entry.isFiltered() &&
+                programJars.get(index + 1).isOutput())
+            {
+                throw new IOException("The output jar [" + entry.getName() +
+                                      "] must have a filter, or all subsequent output jars will be empty.");
+            }
+        }
+
+        // Check for conflicts between input/output entries of the class paths.
+        checkConflicts(programJars, programJars);
+        checkConflicts(programJars, libraryJars);
+        checkConflicts(libraryJars, libraryJars);
+
+        // Print out some general notes if necessary.
+        if ((configuration.note == null ||
+             !configuration.note.isEmpty()))
+        {
+            // Check for potential problems with mixed-case class names on
+            // case-insensitive file systems.
+            if (configuration.obfuscate &&
+                configuration.useMixedCaseClassNames &&
+                configuration.classObfuscationDictionary == null)
+            {
+                String os = System.getProperty("os.name").toLowerCase();
+                if (os.startsWith("windows") ||
+                    os.startsWith("mac os"))
+                {
+                    // Go over all program class path entries.
+                    for (int index = 0; index < programJars.size(); index++)
+                    {
+                        // Is it an output directory?
+                        ClassPathEntry entry = programJars.get(index);
+                        if (entry.isOutput() &&
+                            !entry.isApk() &&
+                            !entry.isJar() &&
+                            !entry.isAar() &&
+                            !entry.isWar() &&
+                            !entry.isEar() &&
+                            !entry.isZip())
+                        {
+                            System.out.println("Note: you're writing the processed class files to a directory [" + entry.getName() + "].");
+                            System.out.println("      This will likely cause problems with obfuscated mixed-case class names.");
+                            System.out.println("      You should consider writing the output to a jar file, or otherwise");
+                            System.out.println("      specify '-dontusemixedcaseclassnames'.");
+
+                            break;
+                        }
+                    }
+                }
+            }
+
+            // Check if -adaptresourcefilecontents has a proper filter.
+            if (configuration.adaptResourceFileContents != null &&
+                (configuration.adaptResourceFileContents.isEmpty() ||
+                 configuration.adaptResourceFileContents.get(0).equals(ConfigurationConstants.ANY_FILE_KEYWORD)))
+            {
+                System.out.println("Note: you're specifying '-adaptresourcefilecontents' for all resource files.");
+                System.out.println("      This will most likely cause problems with binary files.");
+            }
+
+            // Check if all -keepclassmembers options indeed have class members.
+            WarningPrinter keepClassMemberNotePrinter = new WarningPrinter(System.out, configuration.note);
+
+            new KeepClassMemberChecker(keepClassMemberNotePrinter).checkClassSpecifications(configuration.keep);
+
+            // Check if -assumenosideffects options don't specify all methods.
+            WarningPrinter assumeNoSideEffectsNotePrinter = new WarningPrinter(System.out, configuration.note);
+
+            new AssumeNoSideEffectsChecker(assumeNoSideEffectsNotePrinter).checkClassSpecifications(configuration.assumeNoSideEffects);
+
+            // Print out a summary of the notes, if necessary.
+            int keepClassMemberNoteCount = keepClassMemberNotePrinter.getWarningCount();
+            if (keepClassMemberNoteCount > 0)
+            {
+                System.out.println("Note: there were " + keepClassMemberNoteCount +
+                                   " '-keepclassmembers' options that didn't specify class");
+                System.out.println("      members. You should specify at least some class members or consider");
+                System.out.println("      if you just need '-keep'.");
+                System.out.println("      (http://proguard.sourceforge.net/manual/troubleshooting.html#classmembers)");
+            }
+
+            int assumeNoSideEffectsNoteCount = assumeNoSideEffectsNotePrinter.getWarningCount();
+            if (assumeNoSideEffectsNoteCount > 0)
+            {
+                System.out.println("Note: there were " + assumeNoSideEffectsNoteCount +
+                                   " '-assumenosideeffects' options that try to match all");
+                System.out.println("      methods with wildcards. This will likely cause problems with methods like");
+                System.out.println("      'wait()' and 'notify()'. You should specify the methods more precisely.");
+                System.out.println("      (http://proguard.sourceforge.net/manual/troubleshooting.html#nosideeffects)");
+            }
+        }
+    }
+
+
+    /**
+     * Performs some sanity checks on the class paths.
+     */
+    private void checkConflicts(ClassPath classPath1,
+                                ClassPath classPath2)
+    throws IOException
+    {
+        if (classPath1 == null ||
+            classPath2 == null)
+        {
+            return;
+        }
+
+        for (int index1 = 0; index1 < classPath1.size(); index1++)
+        {
+            ClassPathEntry entry1 = classPath1.get(index1);
+
+            for (int index2 = 0; index2 < classPath2.size(); index2++)
+            {
+                if (classPath1 != classPath2 || index1 != index2)
+                {
+                    ClassPathEntry entry2 = classPath2.get(index2);
+
+                    if (entry2.getName().equals(entry1.getName()))
+                    {
+                        if (entry1.isOutput())
+                        {
+                            if (entry2.isOutput())
+                            {
+                                // Output / output.
+                                throw new IOException("The same output jar ["+entry1.getName()+"] is specified twice.");
+                            }
+                            else
+                            {
+                                // Output / input.
+                                throw new IOException("Input jars and output jars must be different ["+entry1.getName()+"].");
+                            }
+                        }
+                        else
+                        {
+                            if (entry2.isOutput())
+                            {
+                                // Input / output.
+                                throw new IOException("Input jars and output jars must be different ["+entry1.getName()+"].");
+                            }
+                            else if (!entry1.isFiltered() ||
+                                     !entry2.isFiltered())
+                            {
+                                // Input / input.
+                                throw new IOException("The same input jar ["+entry1.getName()+"] is specified twice.");
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+}
diff --git a/src/proguard/ConfigurationConstants.java b/src/proguard/ConfigurationConstants.java
index 14c5654..a67eee3 100644
--- a/src/proguard/ConfigurationConstants.java
+++ b/src/proguard/ConfigurationConstants.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -43,6 +43,7 @@
     public static final String KEEP_NAMES_OPTION                     = "-keepnames";
     public static final String KEEP_CLASS_MEMBER_NAMES_OPTION        = "-keepclassmembernames";
     public static final String KEEP_CLASSES_WITH_MEMBER_NAMES_OPTION = "-keepclasseswithmembernames";
+    public static final String INCLUDE_DESCRIPTOR_CLASSES_SUBOPTION  = "includedescriptorclasses";
     public static final String ALLOW_SHRINKING_SUBOPTION             = "allowshrinking";
     public static final String ALLOW_OPTIMIZATION_SUBOPTION          = "allowoptimization";
     public static final String ALLOW_OBFUSCATION_SUBOPTION           = "allowobfuscation";
@@ -95,6 +96,8 @@
     public static final String KEEP_DIRECTORIES_OPTION                           = "-keepdirectories";
     public static final String FORCE_PROCESSING_OPTION                           = "-forceprocessing";
 
+    public static final String ANY_FILE_KEYWORD            = "**";
+
     public static final String ANY_ATTRIBUTE_KEYWORD       = "*";
     public static final String ATTRIBUTE_SEPARATOR_KEYWORD = ",";
 
diff --git a/src/proguard/ConfigurationParser.java b/src/proguard/ConfigurationParser.java
index a38e9ed..72949cf 100644
--- a/src/proguard/ConfigurationParser.java
+++ b/src/proguard/ConfigurationParser.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -20,7 +20,7 @@
  */
 package proguard;
 
-import proguard.classfile.ClassConstants;
+import proguard.classfile.*;
 import proguard.classfile.util.ClassUtil;
 import proguard.util.ListUtil;
 
@@ -236,7 +236,7 @@
 
     private long parseIncludeArgument(long lastModified) throws ParseException, IOException
     {
-        // Read the configuation file name.
+        // Read the configuration file name.
         readNextWord("configuration file name", true, false);
 
         File file = file(nextWord);
@@ -285,7 +285,7 @@
                 ConfigurationConstants.OPEN_ARGUMENTS_KEYWORD.equals(nextWord))
             {
                 // Read all filters in an array.
-                List[] filters = new List[5];
+                List[] filters = new List[7];
 
                 int counter = 0;
                 do
@@ -320,6 +320,18 @@
                             if (counter > 0)
                             {
                                 entry.setZipFilter(filters[--counter]);
+                                if (counter > 0)
+                                {
+                                    // For backward compatibility, the apk
+                                    // filter comes second in the list.
+                                    entry.setApkFilter(filters[--counter]);
+                                    if (counter > 0)
+                                    {
+                                        // For backward compatibility, the aar
+                                        // filter comes first in the list.
+                                        entry.setAarFilter(filters[--counter]);
+                                    }
+                                }
                             }
                         }
                     }
@@ -469,16 +481,17 @@
             keepClassSpecifications = new ArrayList();
         }
 
-        //boolean allowShrinking    = false;
-        boolean allowOptimization = false;
-        boolean allowObfuscation  = false;
+        boolean markDescriptorClasses = false;
+        //boolean allowShrinking        = false;
+        boolean allowOptimization     = false;
+        boolean allowObfuscation      = false;
 
         // Read the keep modifiers.
         while (true)
         {
             readNextWord("keyword '" + ConfigurationConstants.CLASS_KEYWORD +
-                         "', '"      + ClassConstants.EXTERNAL_ACC_INTERFACE +
-                         "', or '"   + ClassConstants.EXTERNAL_ACC_ENUM + "'",
+                         "', '"      + JavaConstants.ACC_INTERFACE +
+                         "', or '"   + JavaConstants.ACC_ENUM + "'",
                          false, true);
 
             if (!ConfigurationConstants.ARGUMENT_SEPARATOR_KEYWORD.equals(nextWord))
@@ -491,21 +504,26 @@
                          "', '"      + ConfigurationConstants.ALLOW_OPTIMIZATION_SUBOPTION +
                          "', or '"   + ConfigurationConstants.ALLOW_OBFUSCATION_SUBOPTION + "'");
 
-            if      (ConfigurationConstants.ALLOW_SHRINKING_SUBOPTION   .startsWith(nextWord))
+            if      (ConfigurationConstants.INCLUDE_DESCRIPTOR_CLASSES_SUBOPTION.startsWith(nextWord))
             {
-                allowShrinking    = true;
+                markDescriptorClasses = true;
             }
-            else if (ConfigurationConstants.ALLOW_OPTIMIZATION_SUBOPTION.startsWith(nextWord))
+            else if (ConfigurationConstants.ALLOW_SHRINKING_SUBOPTION           .startsWith(nextWord))
             {
-                allowOptimization = true;
+                allowShrinking        = true;
             }
-            else if (ConfigurationConstants.ALLOW_OBFUSCATION_SUBOPTION .startsWith(nextWord))
+            else if (ConfigurationConstants.ALLOW_OPTIMIZATION_SUBOPTION        .startsWith(nextWord))
             {
-                allowObfuscation  = true;
+                allowOptimization     = true;
+            }
+            else if (ConfigurationConstants.ALLOW_OBFUSCATION_SUBOPTION         .startsWith(nextWord))
+            {
+                allowObfuscation      = true;
             }
             else
             {
-                throw new ParseException("Expecting keyword '" + ConfigurationConstants.ALLOW_SHRINKING_SUBOPTION +
+                throw new ParseException("Expecting keyword '" + ConfigurationConstants.INCLUDE_DESCRIPTOR_CLASSES_SUBOPTION +
+                                         "', '"                + ConfigurationConstants.ALLOW_SHRINKING_SUBOPTION +
                                          "', '"                + ConfigurationConstants.ALLOW_OPTIMIZATION_SUBOPTION +
                                          "', or '"             + ConfigurationConstants.ALLOW_OBFUSCATION_SUBOPTION +
                                          "' before " + reader.locationDescription());
@@ -519,6 +537,7 @@
         // Create and add the keep configuration.
         keepClassSpecifications.add(new KeepClassSpecification(markClasses,
                                                                markConditionally,
+                                                               markDescriptorClasses,
                                                                allowShrinking,
                                                                allowOptimization,
                                                                allowObfuscation,
@@ -538,8 +557,8 @@
 
         // Read and add the class configuration.
         readNextWord("keyword '" + ConfigurationConstants.CLASS_KEYWORD +
-                     "', '"      + ClassConstants.EXTERNAL_ACC_INTERFACE +
-                     "', or '"   + ClassConstants.EXTERNAL_ACC_ENUM + "'",
+                     "', '"      + JavaConstants.ACC_INTERFACE +
+                     "', or '"   + JavaConstants.ACC_ENUM + "'",
                      false, true);
 
         classSpecifications.add(parseClassSpecificationArguments());
@@ -577,25 +596,25 @@
 
             // Parse the class access modifiers.
             int accessFlag =
-                strippedWord.equals(ClassConstants.EXTERNAL_ACC_PUBLIC)     ? ClassConstants.INTERNAL_ACC_PUBLIC      :
-                strippedWord.equals(ClassConstants.EXTERNAL_ACC_FINAL)      ? ClassConstants.INTERNAL_ACC_FINAL       :
-                strippedWord.equals(ClassConstants.EXTERNAL_ACC_INTERFACE)  ? ClassConstants.INTERNAL_ACC_INTERFACE   :
-                strippedWord.equals(ClassConstants.EXTERNAL_ACC_ABSTRACT)   ? ClassConstants.INTERNAL_ACC_ABSTRACT    :
-                strippedWord.equals(ClassConstants.EXTERNAL_ACC_SYNTHETIC)  ? ClassConstants.INTERNAL_ACC_SYNTHETIC   :
-                strippedWord.equals(ClassConstants.EXTERNAL_ACC_ANNOTATION) ? ClassConstants.INTERNAL_ACC_ANNOTATTION :
-                strippedWord.equals(ClassConstants.EXTERNAL_ACC_ENUM)       ? ClassConstants.INTERNAL_ACC_ENUM        :
-                                                                              unknownAccessFlag();
+                strippedWord.equals(JavaConstants.ACC_PUBLIC)     ? ClassConstants.ACC_PUBLIC      :
+                strippedWord.equals(JavaConstants.ACC_FINAL)      ? ClassConstants.ACC_FINAL       :
+                strippedWord.equals(JavaConstants.ACC_INTERFACE)  ? ClassConstants.ACC_INTERFACE   :
+                strippedWord.equals(JavaConstants.ACC_ABSTRACT)   ? ClassConstants.ACC_ABSTRACT    :
+                strippedWord.equals(JavaConstants.ACC_SYNTHETIC)  ? ClassConstants.ACC_SYNTHETIC   :
+                strippedWord.equals(JavaConstants.ACC_ANNOTATION) ? ClassConstants.ACC_ANNOTATTION :
+                strippedWord.equals(JavaConstants.ACC_ENUM)       ? ClassConstants.ACC_ENUM        :
+                                                                    unknownAccessFlag();
 
             // Is it an annotation modifier?
-            if (accessFlag == ClassConstants.INTERNAL_ACC_ANNOTATTION)
+            if (accessFlag == ClassConstants.ACC_ANNOTATTION)
             {
                 // Already read the next word.
-                readNextWord("annotation type or keyword '" + ClassConstants.EXTERNAL_ACC_INTERFACE + "'",
+                readNextWord("annotation type or keyword '" + JavaConstants.ACC_INTERFACE + "'",
                              false, false);
 
                 // Is the next word actually an annotation type?
-                if (!nextWord.equals(ClassConstants.EXTERNAL_ACC_INTERFACE) &&
-                    !nextWord.equals(ClassConstants.EXTERNAL_ACC_ENUM)      &&
+                if (!nextWord.equals(JavaConstants.ACC_INTERFACE) &&
+                    !nextWord.equals(JavaConstants.ACC_ENUM)      &&
                     !nextWord.equals(ConfigurationConstants.CLASS_KEYWORD))
                 {
                     // Parse the annotation type.
@@ -628,8 +647,8 @@
                                          "' before " + reader.locationDescription());
             }
 
-            if (strippedWord.equals(ClassConstants.EXTERNAL_ACC_INTERFACE) ||
-                strippedWord.equals(ClassConstants.EXTERNAL_ACC_ENUM)      ||
+            if (strippedWord.equals(JavaConstants.ACC_INTERFACE) ||
+                strippedWord.equals(JavaConstants.ACC_ENUM)      ||
                 strippedWord.equals(ConfigurationConstants.CLASS_KEYWORD))
             {
                 // The interface or enum keyword. Stop parsing the class flags.
@@ -637,11 +656,11 @@
             }
 
             // Should we read the next word?
-            if (accessFlag != ClassConstants.INTERNAL_ACC_ANNOTATTION)
+            if (accessFlag != ClassConstants.ACC_ANNOTATTION)
             {
                 readNextWord("keyword '" + ConfigurationConstants.CLASS_KEYWORD +
-                             "', '"      + ClassConstants.EXTERNAL_ACC_INTERFACE +
-                             "', or '"   + ClassConstants.EXTERNAL_ACC_ENUM + "'",
+                             "', '"      + JavaConstants.ACC_INTERFACE +
+                             "', or '"   + JavaConstants.ACC_ENUM + "'",
                              false, true);
             }
         }
@@ -764,21 +783,21 @@
 
             // Parse the class member access modifiers.
             int accessFlag =
-                strippedWord.equals(ClassConstants.EXTERNAL_ACC_PUBLIC)       ? ClassConstants.INTERNAL_ACC_PUBLIC       :
-                strippedWord.equals(ClassConstants.EXTERNAL_ACC_PRIVATE)      ? ClassConstants.INTERNAL_ACC_PRIVATE      :
-                strippedWord.equals(ClassConstants.EXTERNAL_ACC_PROTECTED)    ? ClassConstants.INTERNAL_ACC_PROTECTED    :
-                strippedWord.equals(ClassConstants.EXTERNAL_ACC_STATIC)       ? ClassConstants.INTERNAL_ACC_STATIC       :
-                strippedWord.equals(ClassConstants.EXTERNAL_ACC_FINAL)        ? ClassConstants.INTERNAL_ACC_FINAL        :
-                strippedWord.equals(ClassConstants.EXTERNAL_ACC_SYNCHRONIZED) ? ClassConstants.INTERNAL_ACC_SYNCHRONIZED :
-                strippedWord.equals(ClassConstants.EXTERNAL_ACC_VOLATILE)     ? ClassConstants.INTERNAL_ACC_VOLATILE     :
-                strippedWord.equals(ClassConstants.EXTERNAL_ACC_TRANSIENT)    ? ClassConstants.INTERNAL_ACC_TRANSIENT    :
-                strippedWord.equals(ClassConstants.EXTERNAL_ACC_BRIDGE)       ? ClassConstants.INTERNAL_ACC_BRIDGE       :
-                strippedWord.equals(ClassConstants.EXTERNAL_ACC_VARARGS)      ? ClassConstants.INTERNAL_ACC_VARARGS      :
-                strippedWord.equals(ClassConstants.EXTERNAL_ACC_NATIVE)       ? ClassConstants.INTERNAL_ACC_NATIVE       :
-                strippedWord.equals(ClassConstants.EXTERNAL_ACC_ABSTRACT)     ? ClassConstants.INTERNAL_ACC_ABSTRACT     :
-                strippedWord.equals(ClassConstants.EXTERNAL_ACC_STRICT)       ? ClassConstants.INTERNAL_ACC_STRICT       :
-                strippedWord.equals(ClassConstants.EXTERNAL_ACC_SYNTHETIC)    ? ClassConstants.INTERNAL_ACC_SYNTHETIC    :
-                                                                                0;
+                strippedWord.equals(JavaConstants.ACC_PUBLIC)       ? ClassConstants.ACC_PUBLIC       :
+                strippedWord.equals(JavaConstants.ACC_PRIVATE)      ? ClassConstants.ACC_PRIVATE      :
+                strippedWord.equals(JavaConstants.ACC_PROTECTED)    ? ClassConstants.ACC_PROTECTED    :
+                strippedWord.equals(JavaConstants.ACC_STATIC)       ? ClassConstants.ACC_STATIC       :
+                strippedWord.equals(JavaConstants.ACC_FINAL)        ? ClassConstants.ACC_FINAL        :
+                strippedWord.equals(JavaConstants.ACC_SYNCHRONIZED) ? ClassConstants.ACC_SYNCHRONIZED :
+                strippedWord.equals(JavaConstants.ACC_VOLATILE)     ? ClassConstants.ACC_VOLATILE     :
+                strippedWord.equals(JavaConstants.ACC_TRANSIENT)    ? ClassConstants.ACC_TRANSIENT    :
+                strippedWord.equals(JavaConstants.ACC_BRIDGE)       ? ClassConstants.ACC_BRIDGE       :
+                strippedWord.equals(JavaConstants.ACC_VARARGS)      ? ClassConstants.ACC_VARARGS      :
+                strippedWord.equals(JavaConstants.ACC_NATIVE)       ? ClassConstants.ACC_NATIVE       :
+                strippedWord.equals(JavaConstants.ACC_ABSTRACT)     ? ClassConstants.ACC_ABSTRACT     :
+                strippedWord.equals(JavaConstants.ACC_STRICT)       ? ClassConstants.ACC_STRICT       :
+                strippedWord.equals(JavaConstants.ACC_SYNTHETIC)    ? ClassConstants.ACC_SYNTHETIC    :
+                                                                      0;
             if (accessFlag == 0)
             {
                 // Not a class member access modifier. Stop parsing them.
@@ -882,7 +901,7 @@
             {
                 // This must be a constructor then.
                 // Make sure the type is a proper constructor name.
-                if (!(type.equals(ClassConstants.INTERNAL_METHOD_NAME_INIT) ||
+                if (!(type.equals(ClassConstants.METHOD_NAME_INIT) ||
                       type.equals(externalClassName) ||
                       type.equals(ClassUtil.externalShortClassName(externalClassName))))
                 {
@@ -892,8 +911,8 @@
                 }
 
                 // Assign the fixed constructor type and name.
-                type = ClassConstants.EXTERNAL_TYPE_VOID;
-                name = ClassConstants.INTERNAL_METHOD_NAME_INIT;
+                type = JavaConstants.TYPE_VOID;
+                name = ClassConstants.METHOD_NAME_INIT;
             }
             else
             {
@@ -974,22 +993,22 @@
     /**
      * Reads a comma-separated list of java identifiers or of file names.
      * Examples of invocation arguments:
-     *   ("directory n", true,  true,  false, true,  false, true,  false, false, ...)
-     *   ("optimizatio", true,  false, false, false, false, false, false, false, ...)
-     *   ("package nam", true,  true,  false, false, true,  false, true,  false, ...)
-     *   ("attribute n", true,  true,  false, false, true,  false, false, false, ...)
-     *   ("class name",  true,  true,  false, false, true,  false, true,  false, ...)
-     *   ("resource fi", true,  true,  false, true,  false, false, false, false, ...)
-     *   ("resource fi", true,  true,  false, true,  false, false, false, false, ...)
-     *   ("class name",  true,  true,  false, false, true,  false, true,  false, ...)
-     *   ("class name",  true,  true,  false, false, true,  false, true,  false, ...)
-     *   ("filter",      true,  true,  true,  true,  false, true,  false, false, ...)
-     *   ("annotation ", false, false, false, false, true,  false, false, true,  ...)
-     *   ("class name ", true,  false, false, false, true,  false, false, false, ...)
-     *   ("annotation ", true,  false, false, false, true,  false, false, true,  ...)
-     *   ("class name ", false, false, false, false, true,  false, false, false, ...)
-     *   ("annotation ", true,  false, false, false, true,  false, false, true,  ...)
-     *   ("argument",    true,  true,  true,  false, true,  false, false, false, ...)
+     *   ("directory name", true,  true,  false, true,  false, true,  false, false, ...)
+     *   ("optimization",   true,  false, false, false, false, false, false, false, ...)
+     *   ("package name",   true,  true,  false, false, true,  false, true,  false, ...)
+     *   ("attribute name", true,  true,  false, false, true,  false, false, false, ...)
+     *   ("class name",     true,  true,  false, false, true,  false, true,  false, ...)
+     *   ("resource file",  true,  true,  false, true,  false, false, false, false, ...)
+     *   ("resource file",  true,  true,  false, true,  false, false, false, false, ...)
+     *   ("class name",     true,  true,  false, false, true,  false, true,  false, ...)
+     *   ("class name",     true,  true,  false, false, true,  false, true,  false, ...)
+     *   ("filter",         true,  true,  true,  true,  false, true,  false, false, ...)
+     *   ("annotation ",    false, false, false, false, true,  false, false, true,  ...)
+     *   ("class name ",    true,  false, false, false, true,  false, false, false, ...)
+     *   ("annotation ",    true,  false, false, false, true,  false, false, true,  ...)
+     *   ("class name ",    false, false, false, false, true,  false, false, false, ...)
+     *   ("annotation ",    true,  false, false, false, true,  false, false, true,  ...)
+     *   ("argument",       true,  true,  true,  false, true,  false, false, false, ...)
      */
     private List parseCommaSeparatedList(String  expectedDescription,
                                          boolean readFirstWord,
@@ -1141,9 +1160,7 @@
             int toIndex = word.indexOf(ConfigurationConstants.CLOSE_SYSTEM_PROPERTY, fromIndex+1);
             if (toIndex < 0)
             {
-                throw new ParseException("Expecting closing '" + ConfigurationConstants.CLOSE_SYSTEM_PROPERTY +
-                                         "' after opening '" + ConfigurationConstants.OPEN_SYSTEM_PROPERTY +
-                                         "' in " + reader.locationDescription());
+                break;
             }
 
             String propertyName  = word.substring(fromIndex+1, toIndex);
@@ -1154,9 +1171,9 @@
                                          "' is undefined in " + reader.locationDescription());
             }
 
-            word = word.substring(0, fromIndex) +
-                       propertyValue +
-                       word.substring(toIndex+1);
+            word = word.substring(0, fromIndex) + propertyValue + word.substring(toIndex+1);
+
+            fromIndex += propertyValue.length();
         }
 
         return word;
@@ -1290,7 +1307,7 @@
     {
         if (((requiredSetMemberAccessFlags |
               requiredUnsetMemberAccessFlags) &
-            ~ClassConstants.VALID_INTERNAL_ACC_FIELD) != 0)
+            ~ClassConstants.VALID_ACC_FIELD) != 0)
         {
             throw new ParseException("Invalid method access modifier for field before " +
                                      reader.locationDescription());
@@ -1308,7 +1325,7 @@
     {
         if (((requiredSetMemberAccessFlags |
               requiredUnsetMemberAccessFlags) &
-            ~ClassConstants.VALID_INTERNAL_ACC_METHOD) != 0)
+            ~ClassConstants.VALID_ACC_METHOD) != 0)
         {
             throw new ParseException("Invalid field access modifier for method before " +
                                      reader.locationDescription());
diff --git a/src/proguard/ConfigurationWriter.java b/src/proguard/ConfigurationWriter.java
index 00dfa9e..d87f47e 100644
--- a/src/proguard/ConfigurationWriter.java
+++ b/src/proguard/ConfigurationWriter.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -188,6 +188,10 @@
                 // Append the filters, if any.
                 boolean filtered = false;
 
+                // For backward compatibility, the aar and apk filters come
+                // first.
+                filtered = writeFilter(filtered, entry.getAarFilter());
+                filtered = writeFilter(filtered, entry.getApkFilter());
                 filtered = writeFilter(filtered, entry.getZipFilter());
                 filtered = writeFilter(filtered, entry.getEarFilter());
                 filtered = writeFilter(filtered, entry.getWarFilter());
@@ -340,7 +344,13 @@
         // Compose the option name.
         String optionName = optionNames[keepClassSpecification.markConditionally ? 2 :
                                         keepClassSpecification.markClasses       ? 0 :
-                                                                              1];
+                                                                                   1];
+
+        if (keepClassSpecification.markDescriptorClasses)
+        {
+            optionName += ConfigurationConstants.ARGUMENT_SEPARATOR_KEYWORD +
+                          ConfigurationConstants.INCLUDE_DESCRIPTOR_CLASSES_SUBOPTION;
+        }
 
         if (keepClassSpecification.allowShrinking)
         {
@@ -407,8 +417,8 @@
         // keyword earlier.
         if (((classSpecification.requiredSetAccessFlags |
               classSpecification.requiredUnsetAccessFlags) &
-             (ClassConstants.INTERNAL_ACC_INTERFACE |
-              ClassConstants.INTERNAL_ACC_ENUM)) == 0)
+             (ClassConstants.ACC_INTERFACE |
+              ClassConstants.ACC_ENUM)) == 0)
         {
             writer.print(ConfigurationConstants.CLASS_KEYWORD);
         }
@@ -564,7 +574,7 @@
                 writer.print(descriptor == null ? name == null ?
                     ConfigurationConstants.ANY_METHOD_KEYWORD :
                     ConfigurationConstants.ANY_TYPE_KEYWORD + ' ' + name + ConfigurationConstants.OPEN_ARGUMENTS_KEYWORD + ConfigurationConstants.ANY_ARGUMENTS_KEYWORD + ConfigurationConstants.CLOSE_ARGUMENTS_KEYWORD :
-                    ClassUtil.externalFullMethodDescription(ClassConstants.INTERNAL_METHOD_NAME_INIT,
+                    ClassUtil.externalFullMethodDescription(ClassConstants.METHOD_NAME_INIT,
                                                             0,
                                                             name == null ? ConfigurationConstants.ANY_CLASS_MEMBER_KEYWORD : name,
                                                             descriptor));
diff --git a/src/proguard/DataEntryReaderFactory.java b/src/proguard/DataEntryReaderFactory.java
index 3bf6f56..57f3faa 100644
--- a/src/proguard/DataEntryReaderFactory.java
+++ b/src/proguard/DataEntryReaderFactory.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -48,26 +48,34 @@
                                                         ClassPathEntry  classPathEntry,
                                                         DataEntryReader reader)
     {
+        boolean isApk = classPathEntry.isApk();
         boolean isJar = classPathEntry.isJar();
+        boolean isAar = classPathEntry.isAar();
         boolean isWar = classPathEntry.isWar();
         boolean isEar = classPathEntry.isEar();
         boolean isZip = classPathEntry.isZip();
 
         List filter    = classPathEntry.getFilter();
+        List apkFilter = classPathEntry.getApkFilter();
         List jarFilter = classPathEntry.getJarFilter();
+        List aarFilter = classPathEntry.getAarFilter();
         List warFilter = classPathEntry.getWarFilter();
         List earFilter = classPathEntry.getEarFilter();
         List zipFilter = classPathEntry.getZipFilter();
 
         System.out.println(messagePrefix +
-                           (isJar ? "jar" :
+                           (isApk ? "apk" :
+                            isJar ? "jar" :
+                            isAar ? "aar" :
                             isWar ? "war" :
                             isEar ? "ear" :
                             isZip ? "zip" :
                                     "directory") +
                            " [" + classPathEntry.getName() + "]" +
                            (filter    != null ||
+                            apkFilter != null ||
                             jarFilter != null ||
+                            aarFilter != null ||
                             warFilter != null ||
                             earFilter != null ||
                             zipFilter != null ? " (filtered)" : ""));
@@ -81,20 +89,30 @@
                          reader);
         }
 
-        // Unzip any jars, if necessary.
-        reader = wrapInJarReader(reader, isJar, jarFilter, ".jar");
-        if (!isJar)
+        // Unzip any apks, if necessary.
+        reader = wrapInJarReader(reader, isApk, apkFilter, ".apk");
+        if (!isApk)
         {
-            // Unzip any wars, if necessary.
-            reader = wrapInJarReader(reader, isWar, warFilter, ".war");
-            if (!isWar)
+            // Unzip any jars, if necessary.
+            reader = wrapInJarReader(reader, isJar, jarFilter, ".jar");
+            if (!isJar)
             {
-                // Unzip any ears, if necessary.
-                reader = wrapInJarReader(reader, isEar, earFilter, ".ear");
-                if (!isEar)
+                // Unzip any aars, if necessary.
+                reader = wrapInJarReader(reader, isAar, aarFilter, ".aar");
+                if (!isAar)
                 {
-                    // Unzip any zips, if necessary.
-                    reader = wrapInJarReader(reader, isZip, zipFilter, ".zip");
+                    // Unzip any wars, if necessary.
+                    reader = wrapInJarReader(reader, isWar, warFilter, ".war");
+                    if (!isWar)
+                    {
+                        // Unzip any ears, if necessary.
+                        reader = wrapInJarReader(reader, isEar, earFilter, ".ear");
+                        if (!isEar)
+                        {
+                            // Unzip any zips, if necessary.
+                            reader = wrapInJarReader(reader, isZip, zipFilter, ".zip");
+                        }
+                    }
                 }
             }
         }
diff --git a/src/proguard/DataEntryWriterFactory.java b/src/proguard/DataEntryWriterFactory.java
index ca33a35..d76e596 100644
--- a/src/proguard/DataEntryWriterFactory.java
+++ b/src/proguard/DataEntryWriterFactory.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -27,7 +27,7 @@
 
 /**
  * This class can create DataEntryWriter instances based on class paths. The
- * writers will wrap the output in the proper jars, wars, ears, and zips.
+ * writers will wrap the output in the proper apks, jars, wars, ears, and zips.
  *
  * @author Eric Lafortune
  */
@@ -65,41 +65,53 @@
     private static DataEntryWriter createClassPathEntryWriter(ClassPathEntry  classPathEntry,
                                                               DataEntryWriter alternativeWriter)
     {
+        boolean isApk = classPathEntry.isApk();
         boolean isJar = classPathEntry.isJar();
+        boolean isAar = classPathEntry.isAar();
         boolean isWar = classPathEntry.isWar();
         boolean isEar = classPathEntry.isEar();
         boolean isZip = classPathEntry.isZip();
 
         List filter    = classPathEntry.getFilter();
+        List apkFilter = classPathEntry.getApkFilter();
         List jarFilter = classPathEntry.getJarFilter();
+        List aarFilter = classPathEntry.getAarFilter();
         List warFilter = classPathEntry.getWarFilter();
         List earFilter = classPathEntry.getEarFilter();
         List zipFilter = classPathEntry.getZipFilter();
 
         System.out.println("Preparing output " +
-                           (isJar ? "jar" :
+                           (isApk ? "apk" :
+                            isJar ? "jar" :
+                            isAar ? "aar" :
                             isWar ? "war" :
                             isEar ? "ear" :
                             isZip ? "zip" :
                                     "directory") +
                            " [" + classPathEntry.getName() + "]" +
                            (filter    != null ||
+                            apkFilter != null ||
                             jarFilter != null ||
+                            aarFilter != null ||
                             warFilter != null ||
                             earFilter != null ||
                             zipFilter != null ? " (filtered)" : ""));
 
         DataEntryWriter writer = new DirectoryWriter(classPathEntry.getFile(),
+                                                     isApk ||
                                                      isJar ||
+                                                     isAar ||
                                                      isWar ||
                                                      isEar ||
                                                      isZip);
 
         // Set up the filtered jar writers.
-        writer = wrapInJarWriter(writer, isZip, zipFilter, ".zip", isJar || isWar || isEar);
-        writer = wrapInJarWriter(writer, isEar, earFilter, ".ear", isJar || isWar);
-        writer = wrapInJarWriter(writer, isWar, warFilter, ".war", isJar);
-        writer = wrapInJarWriter(writer, isJar, jarFilter, ".jar", false);
+        writer = wrapInJarWriter(writer, isZip, zipFilter, ".zip", isApk || isJar || isAar || isWar || isEar);
+        writer = wrapInJarWriter(writer, isEar, earFilter, ".ear", isApk || isJar || isAar || isWar);
+        writer = wrapInJarWriter(writer, isWar, warFilter, ".war", isApk || isJar || isAar);
+        writer = wrapInJarWriter(writer, isAar, aarFilter, ".aar", isApk || isJar);
+        writer = wrapInJarWriter(writer, isJar, jarFilter, ".jar", isApk);
+        writer = wrapInJarWriter(writer, isApk, apkFilter, ".apk", false);
 
         // Add a filter, if specified.
         writer = filter != null?
diff --git a/src/proguard/DescriptorKeepChecker.java b/src/proguard/DescriptorKeepChecker.java
index fcd80b2..1b46dce 100644
--- a/src/proguard/DescriptorKeepChecker.java
+++ b/src/proguard/DescriptorKeepChecker.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -27,7 +27,6 @@
 
 import java.util.List;
 
-
 /**
  * This class checks whether classes referenced by class members that are
  * marked to be kept are marked to be kept too.
diff --git a/src/proguard/DuplicateClassPrinter.java b/src/proguard/DuplicateClassPrinter.java
index 7a071ce..b849d7a 100644
--- a/src/proguard/DuplicateClassPrinter.java
+++ b/src/proguard/DuplicateClassPrinter.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/FileWordReader.java b/src/proguard/FileWordReader.java
index 7309843..86d7110 100644
--- a/src/proguard/FileWordReader.java
+++ b/src/proguard/FileWordReader.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/FullyQualifiedClassNameChecker.java b/src/proguard/FullyQualifiedClassNameChecker.java
index eb1865a..6b6a3ad 100644
--- a/src/proguard/FullyQualifiedClassNameChecker.java
+++ b/src/proguard/FullyQualifiedClassNameChecker.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -36,6 +36,9 @@
 extends      SimplifiedVisitor
 implements   ClassVisitor
 {
+    private static final String INVALID_CLASS_EXTENSION = ClassUtil.internalClassName(ClassConstants.CLASS_FILE_EXTENSION);
+
+
     private final ClassPool      programClassPool;
     private final ClassPool      libraryClassPool;
     private final WarningPrinter notePrinter;
@@ -157,10 +160,16 @@
                               "Note: the configuration refers to the unknown class '" +
                               ClassUtil.externalClassName(className) + "'");
 
-            String fullyQualifiedClassName =
-                "**" + ClassConstants.INTERNAL_PACKAGE_SEPARATOR +
-                className.substring(className.lastIndexOf(ClassConstants.INTERNAL_PACKAGE_SEPARATOR)+1);
+            // Strip "/class" or replace the package name by a wildcard.
+            int lastSeparatorIndex =
+                className.lastIndexOf(ClassConstants.PACKAGE_SEPARATOR);
 
+            String fullyQualifiedClassName =
+                className.endsWith(INVALID_CLASS_EXTENSION) ?
+                    className.substring(0, lastSeparatorIndex) :
+                    "**" + ClassConstants.PACKAGE_SEPARATOR + className.substring(lastSeparatorIndex + 1);
+
+            // Suggest matching classes.
             ClassNameFilter classNameFilter =
                 new ClassNameFilter(fullyQualifiedClassName, this);
 
diff --git a/src/proguard/GPL.java b/src/proguard/GPL.java
index 51220b8..5c7ebc7 100644
--- a/src/proguard/GPL.java
+++ b/src/proguard/GPL.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -170,17 +170,12 @@
                packageName.startsWith("org.netbeans")           ||
                packageName.startsWith("com.android")            ||
                packageName.startsWith("com.sun.kvem")           ||
-               packageName.startsWith("com.intel")              ||
                packageName.startsWith("net.certiv.proguarddt")  ||
                packageName.startsWith("groovy")                 ||
                packageName.startsWith("scala")                  ||
                packageName.startsWith("sbt")                    ||
                packageName.startsWith("xsbt")                   ||
-               packageName.startsWith("eclipseme")              ||
-               packageName.startsWith("com.neomades")           ||
-               packageName.startsWith("jg.j2me")                ||
-               packageName.startsWith("jg.common")              ||
-               packageName.startsWith("jg.buildengine");
+               packageName.startsWith("eclipseme");
     }
 
 
diff --git a/src/proguard/GetAnnotationChecker.java b/src/proguard/GetAnnotationChecker.java
new file mode 100644
index 0000000..bf6787d
--- /dev/null
+++ b/src/proguard/GetAnnotationChecker.java
@@ -0,0 +1,80 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ *             of Java bytecode.
+ *
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+package proguard;
+
+import proguard.classfile.*;
+import proguard.classfile.constant.*;
+import proguard.classfile.constant.visitor.ConstantVisitor;
+import proguard.classfile.util.*;
+
+/**
+ * This constant visitor checks whether visited method references try to
+ * access annotations.
+ *
+ * @author Eric Lafortune
+ */
+public class GetAnnotationChecker
+extends      SimplifiedVisitor
+implements   ConstantVisitor
+{
+    private final WarningPrinter notePrinter;
+
+
+    /**
+     * Creates a new GetAnnotationChecker.
+     */
+    public GetAnnotationChecker(WarningPrinter notePrinter)
+    {
+        this.notePrinter = notePrinter;
+    }
+
+
+    // Implementations for ConstantVisitor.
+
+    public void visitAnyConstant(Clazz clazz, Constant constant) {}
+
+
+    public void visitMethodrefConstant(Clazz clazz, MethodrefConstant methodrefConstant)
+    {
+        String className = methodrefConstant.getClassName(clazz);
+
+        if (className.equals(ClassConstants.NAME_JAVA_LANG_CLASS)         ||
+            className.equals(ClassConstants.NAME_JAVA_LANG_REFLECT_FIELD) ||
+            className.equals(ClassConstants.NAME_JAVA_LANG_REFLECT_METHOD))
+        {
+            String methodName = methodrefConstant.getName(clazz);
+
+            if (methodName.equals(ClassConstants.METHOD_NAME_GET_ANNOTATION)           ||
+                methodName.equals(ClassConstants.METHOD_NAME_GET_ANNOTATIONS)          ||
+                methodName.equals(ClassConstants.METHOD_NAME_GET_DECLARED_ANNOTATIONS) ||
+                methodName.equals(ClassConstants.METHOD_NAME_GET_PARAMETER_ANNOTATIONS))
+            {
+                notePrinter.print(clazz.getName(),
+                                  "Note: " +
+                                  ClassUtil.externalClassName(clazz.getName()) +
+                                  " calls '" +
+                                  ClassUtil.externalShortClassName(ClassUtil.externalClassName(className)) +
+                                  "." +
+                                  methodName + "'");
+            }
+        }
+    }
+}
diff --git a/src/proguard/GetEnclosingClassChecker.java b/src/proguard/GetEnclosingClassChecker.java
new file mode 100644
index 0000000..a21bc1a
--- /dev/null
+++ b/src/proguard/GetEnclosingClassChecker.java
@@ -0,0 +1,76 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ *             of Java bytecode.
+ *
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+package proguard;
+
+import proguard.classfile.*;
+import proguard.classfile.constant.*;
+import proguard.classfile.constant.visitor.ConstantVisitor;
+import proguard.classfile.util.*;
+
+/**
+ * This constant visitor checks whether visited method references try to
+ * access enclosing classes.
+ *
+ * @author Eric Lafortune
+ */
+public class GetEnclosingClassChecker
+extends      SimplifiedVisitor
+implements   ConstantVisitor
+{
+    private final WarningPrinter notePrinter;
+
+
+    /**
+     * Creates a new GetEnclosingMethodChecker.
+     */
+    public GetEnclosingClassChecker(WarningPrinter notePrinter)
+    {
+        this.notePrinter = notePrinter;
+    }
+
+
+    // Implementations for ConstantVisitor.
+
+    public void visitAnyConstant(Clazz clazz, Constant constant) {}
+
+
+    public void visitMethodrefConstant(Clazz clazz, MethodrefConstant methodrefConstant)
+    {
+        String className = methodrefConstant.getClassName(clazz);
+
+        if (className.equals(ClassConstants.NAME_JAVA_LANG_CLASS))
+        {
+            String methodName = methodrefConstant.getName(clazz);
+
+            if (methodName.equals(ClassConstants.METHOD_NAME_CLASS_GET_ENCLOSING_CLASS) ||
+                methodName.equals(ClassConstants.METHOD_NAME_CLASS_GET_DECLARING_CLASS))
+            {
+                notePrinter.print(clazz.getName(),
+                                  "Note: " +
+                                  ClassUtil.externalClassName(clazz.getName()) +
+                                  " calls '" +
+                                  ClassUtil.externalShortClassName(ClassUtil.externalClassName(className)) +
+                                  "." +
+                                  methodName + "'");
+            }
+        }
+    }
+}
diff --git a/src/proguard/GetEnclosingMethodChecker.java b/src/proguard/GetEnclosingMethodChecker.java
new file mode 100644
index 0000000..e833042
--- /dev/null
+++ b/src/proguard/GetEnclosingMethodChecker.java
@@ -0,0 +1,76 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ *             of Java bytecode.
+ *
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+package proguard;
+
+import proguard.classfile.*;
+import proguard.classfile.constant.*;
+import proguard.classfile.constant.visitor.ConstantVisitor;
+import proguard.classfile.util.*;
+
+/**
+ * This constant visitor checks whether visited method references try to
+ * access enclosing methods.
+ *
+ * @author Eric Lafortune
+ */
+public class GetEnclosingMethodChecker
+extends      SimplifiedVisitor
+implements   ConstantVisitor
+{
+    private final WarningPrinter notePrinter;
+
+
+    /**
+     * Creates a new GetEnclosingMethodChecker.
+     */
+    public GetEnclosingMethodChecker(WarningPrinter notePrinter)
+    {
+        this.notePrinter = notePrinter;
+    }
+
+
+    // Implementations for ConstantVisitor.
+
+    public void visitAnyConstant(Clazz clazz, Constant constant) {}
+
+
+    public void visitMethodrefConstant(Clazz clazz, MethodrefConstant methodrefConstant)
+    {
+        String className = methodrefConstant.getClassName(clazz);
+
+        if (className.equals(ClassConstants.NAME_JAVA_LANG_CLASS))
+        {
+            String methodName = methodrefConstant.getName(clazz);
+
+            if (methodName.equals(ClassConstants.METHOD_NAME_CLASS_GET_ENCLOSING_CONSTRUCTOR) ||
+                methodName.equals(ClassConstants.METHOD_NAME_CLASS_GET_ENCLOSING_METHOD))
+            {
+                notePrinter.print(clazz.getName(),
+                                  "Note: " +
+                                  ClassUtil.externalClassName(clazz.getName()) +
+                                  " calls '" +
+                                  ClassUtil.externalShortClassName(ClassUtil.externalClassName(className)) +
+                                  "." +
+                                  methodName + "'");
+            }
+        }
+    }
+}
diff --git a/src/proguard/GetSignatureChecker.java b/src/proguard/GetSignatureChecker.java
new file mode 100644
index 0000000..510d833
--- /dev/null
+++ b/src/proguard/GetSignatureChecker.java
@@ -0,0 +1,78 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ *             of Java bytecode.
+ *
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+package proguard;
+
+import proguard.classfile.*;
+import proguard.classfile.constant.*;
+import proguard.classfile.constant.visitor.ConstantVisitor;
+import proguard.classfile.util.*;
+
+/**
+ * This constant visitor checks whether visited method references try to
+ * access signatures.
+ *
+ * @author Eric Lafortune
+ */
+public class GetSignatureChecker
+extends      SimplifiedVisitor
+implements   ConstantVisitor
+{
+    private final WarningPrinter notePrinter;
+
+
+    /**
+     * Creates a new GetSignatureChecker.
+     */
+    public GetSignatureChecker(WarningPrinter notePrinter)
+    {
+        this.notePrinter = notePrinter;
+    }
+
+
+    // Implementations for ConstantVisitor.
+
+    public void visitAnyConstant(Clazz clazz, Constant constant) {}
+
+
+    public void visitMethodrefConstant(Clazz clazz, MethodrefConstant methodrefConstant)
+    {
+        String className = methodrefConstant.getClassName(clazz);
+
+        if (className.equals(ClassConstants.NAME_JAVA_LANG_CLASS)         ||
+            className.equals(ClassConstants.NAME_JAVA_LANG_REFLECT_FIELD) ||
+            className.equals(ClassConstants.NAME_JAVA_LANG_REFLECT_METHOD))
+        {
+            String methodName = methodrefConstant.getName(clazz);
+
+            if (methodName.startsWith(ClassConstants.METHOD_NAME_GET_TYPE_PREFIX) ||
+                methodName.startsWith(ClassConstants.METHOD_NAME_GET_GENERIC_PREFIX))
+            {
+                notePrinter.print(clazz.getName(),
+                                  "Note: " +
+                                  ClassUtil.externalClassName(clazz.getName()) +
+                                  " calls '" +
+                                  ClassUtil.externalShortClassName(ClassUtil.externalClassName(className)) +
+                                  "." +
+                                  methodName + "'");
+            }
+        }
+    }
+}
diff --git a/src/proguard/Initializer.java b/src/proguard/Initializer.java
index 405c06d..6159c7b 100644
--- a/src/proguard/Initializer.java
+++ b/src/proguard/Initializer.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -20,10 +20,10 @@
  */
 package proguard;
 
-import proguard.classfile.ClassPool;
-import proguard.classfile.attribute.annotation.visitor.*;
+import proguard.classfile.*;
+import proguard.classfile.attribute.annotation.visitor.AllElementValueVisitor;
 import proguard.classfile.attribute.visitor.AllAttributeVisitor;
-import proguard.classfile.constant.visitor.*;
+import proguard.classfile.constant.visitor.AllConstantVisitor;
 import proguard.classfile.instruction.visitor.AllInstructionVisitor;
 import proguard.classfile.util.*;
 import proguard.classfile.visitor.*;
@@ -63,13 +63,54 @@
 
         // Perform basic checks on the configuration.
         WarningPrinter fullyQualifiedClassNameNotePrinter = new WarningPrinter(System.out, configuration.note);
-        WarningPrinter keepClassMemberNotePrinter         = new WarningPrinter(System.out, configuration.note);
 
-        new FullyQualifiedClassNameChecker(programClassPool,
-                                           libraryClassPool,
-                                           fullyQualifiedClassNameNotePrinter).checkClassSpecifications(configuration.keep);
+        FullyQualifiedClassNameChecker fullyQualifiedClassNameChecker =
+            new FullyQualifiedClassNameChecker(programClassPool,
+                                               libraryClassPool,
+                                               fullyQualifiedClassNameNotePrinter);
 
-        new KeepClassMemberChecker(keepClassMemberNotePrinter).checkClassSpecifications(configuration.keep);
+        fullyQualifiedClassNameChecker.checkClassSpecifications(configuration.keep);
+        fullyQualifiedClassNameChecker.checkClassSpecifications(configuration.assumeNoSideEffects);
+
+        StringMatcher keepAttributesMatcher = configuration.keepAttributes != null ?
+            new ListParser(new NameParser()).parse(configuration.keepAttributes) :
+            new EmptyStringMatcher();
+
+        WarningPrinter getAnnotationNotePrinter = new WarningPrinter(System.out, configuration.note);
+
+        if (!keepAttributesMatcher.matches(ClassConstants.ATTR_RuntimeVisibleAnnotations))
+        {
+            programClassPool.classesAccept(
+                new AllConstantVisitor(
+                new GetAnnotationChecker(getAnnotationNotePrinter)));
+        }
+
+        WarningPrinter getSignatureNotePrinter = new WarningPrinter(System.out, configuration.note);
+
+        if (!keepAttributesMatcher.matches(ClassConstants.ATTR_Signature))
+        {
+            programClassPool.classesAccept(
+                new AllConstantVisitor(
+                new GetSignatureChecker(getSignatureNotePrinter)));
+        }
+
+        WarningPrinter getEnclosingClassNotePrinter = new WarningPrinter(System.out, configuration.note);
+
+        if (!keepAttributesMatcher.matches(ClassConstants.ATTR_InnerClasses))
+        {
+            programClassPool.classesAccept(
+                new AllConstantVisitor(
+                new GetEnclosingClassChecker(getEnclosingClassNotePrinter)));
+        }
+
+        WarningPrinter getEnclosingMethodNotePrinter = new WarningPrinter(System.out, configuration.note);
+
+        if (!keepAttributesMatcher.matches(ClassConstants.ATTR_EnclosingMethod))
+        {
+            programClassPool.classesAccept(
+                new AllConstantVisitor(
+                new GetEnclosingMethodChecker(getEnclosingMethodNotePrinter)));
+        }
 
         // Construct a reduced library class pool with only those library
         // classes whose hierarchies are referenced by the program classes.
@@ -172,18 +213,11 @@
                                                libraryClassPool))));
         }
 
-        // Check for unkept descriptor classes of kept class members.
-        WarningPrinter descriptorKeepNotePrinter = new WarningPrinter(System.out, configuration.note);
-
-        new DescriptorKeepChecker(programClassPool,
-                                  libraryClassPool,
-                                  descriptorKeepNotePrinter).checkClassSpecifications(configuration.keep);
-
         // Initialize the class references of library class members.
         if (reducedLibraryClassPool != null)
         {
             // Collect the library classes that are referenced by program
-            // classes, directly or indirectly, with or without introspection.
+            // classes, directly or indirectly, with or without reflection.
             programClassPool.classesAccept(
                 new ReferencedClassVisitor(
                 new LibraryClassFilter(
@@ -241,6 +275,30 @@
         programClassPool.classesAccept(new StringSharer());
         libraryClassPool.classesAccept(new StringSharer());
 
+        // Check for any unmatched class members.
+        WarningPrinter classMemberNotePrinter = new WarningPrinter(System.out, configuration.note);
+
+        ClassMemberChecker classMemberChecker =
+            new ClassMemberChecker(programClassPool,
+                                   classMemberNotePrinter);
+
+        classMemberChecker.checkClassSpecifications(configuration.keep);
+        classMemberChecker.checkClassSpecifications(configuration.assumeNoSideEffects);
+
+        // Check for unkept descriptor classes of kept class members.
+        WarningPrinter descriptorKeepNotePrinter = new WarningPrinter(System.out, configuration.note);
+
+        new DescriptorKeepChecker(programClassPool,
+                                  libraryClassPool,
+                                  descriptorKeepNotePrinter).checkClassSpecifications(configuration.keep);
+
+        // Check for keep options that only match library classes.
+        WarningPrinter libraryKeepNotePrinter = new WarningPrinter(System.out, configuration.note);
+
+        new LibraryKeepChecker(programClassPool,
+                               libraryClassPool,
+                               libraryKeepNotePrinter).checkClassSpecifications(configuration.keep);
+
         // Print out a summary of the notes, if necessary.
         int fullyQualifiedNoteCount = fullyQualifiedClassNameNotePrinter.getWarningCount();
         if (fullyQualifiedNoteCount > 0)
@@ -251,15 +309,52 @@
             System.out.println("      (http://proguard.sourceforge.net/manual/troubleshooting.html#unknownclass)");
         }
 
-        // Print out a summary of the notes, if necessary.
-        int keepClassMemberNoteCount = keepClassMemberNotePrinter.getWarningCount();
-        if (keepClassMemberNoteCount > 0)
+        int classMemberNoteCount = classMemberNotePrinter.getWarningCount();
+        if (classMemberNoteCount > 0)
         {
-            System.out.println("Note: there were " + keepClassMemberNoteCount +
-                               " '-keepclassmembers' options that didn't specify class");
-            System.out.println("      members. You should specify at least some class members or consider");
-            System.out.println("      if you just need '-keep'.");
-            System.out.println("      (http://proguard.sourceforge.net/manual/troubleshooting.html#classmembers)");
+            System.out.println("Note: there were " + classMemberNoteCount +
+                               " references to unknown class members.");
+            System.out.println("      You should check your configuration for typos.");
+        }
+
+        int getAnnotationNoteCount = getAnnotationNotePrinter.getWarningCount();
+        if (getAnnotationNoteCount > 0)
+        {
+            System.out.println("Note: there were " + getAnnotationNoteCount +
+                               " classes trying to access annotations using reflection.");
+            System.out.println("      You should consider keeping the annotation attributes");
+            System.out.println("      (using '-keepattributes *Annotation*').");
+            System.out.println("      (http://proguard.sourceforge.net/manual/troubleshooting.html#attributes)");
+        }
+
+        int getSignatureNoteCount = getSignatureNotePrinter.getWarningCount();
+        if (getSignatureNoteCount > 0)
+        {
+            System.out.println("Note: there were " + getSignatureNoteCount +
+                               " classes trying to access generic signatures using reflection.");
+            System.out.println("      You should consider keeping the signature attributes");
+            System.out.println("      (using '-keepattributes Signature').");
+            System.out.println("      (http://proguard.sourceforge.net/manual/troubleshooting.html#attributes)");
+        }
+
+        int getEnclosingClassNoteCount = getEnclosingClassNotePrinter.getWarningCount();
+        if (getEnclosingClassNoteCount > 0)
+        {
+            System.out.println("Note: there were " + getEnclosingClassNoteCount +
+                               " classes trying to access enclosing classes using reflection.");
+            System.out.println("      You should consider keeping the inner classes attributes");
+            System.out.println("      (using '-keepattributes InnerClasses').");
+            System.out.println("      (http://proguard.sourceforge.net/manual/troubleshooting.html#attributes)");
+        }
+
+        int getEnclosingMethodNoteCount = getEnclosingMethodNotePrinter.getWarningCount();
+        if (getEnclosingMethodNoteCount > 0)
+        {
+            System.out.println("Note: there were " + getEnclosingMethodNoteCount +
+                               " classes trying to access enclosing methods using reflection.");
+            System.out.println("      You should consider keeping the enclosing method attributes");
+            System.out.println("      (using '-keepattributes InnerClasses,EnclosingMethod').");
+            System.out.println("      (http://proguard.sourceforge.net/manual/troubleshooting.html#attributes)");
         }
 
         int descriptorNoteCount = descriptorKeepNotePrinter.getWarningCount();
@@ -272,6 +367,15 @@
             System.out.println("      (http://proguard.sourceforge.net/manual/troubleshooting.html#descriptorclass)");
         }
 
+        int libraryNoteCount = libraryKeepNotePrinter.getWarningCount();
+        if (libraryNoteCount > 0)
+        {
+            System.out.println("Note: there were " + libraryNoteCount +
+                               " library classes explicitly being kept.");
+            System.out.println("      You don't need to keep library classes; they are already left unchanged.");
+            System.out.println("      (http://proguard.sourceforge.net/manual/troubleshooting.html#libraryclass)");
+        }
+
         int dynamicClassReferenceNoteCount = dynamicClassReferenceNotePrinter.getWarningCount();
         if (dynamicClassReferenceNoteCount > 0)
         {
@@ -375,7 +479,7 @@
              configuration.warn.isEmpty() ||
              configuration.ignoreWarnings))
         {
-            System.out.println("Note: You're ignoring all warnings!");
+            System.out.println("Note: you're ignoring all warnings!");
         }
 
         // Discard unused library classes.
diff --git a/src/proguard/InputReader.java b/src/proguard/InputReader.java
index 707774e..503ce7e 100644
--- a/src/proguard/InputReader.java
+++ b/src/proguard/InputReader.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -54,18 +54,6 @@
     public void execute(ClassPool programClassPool,
                         ClassPool libraryClassPool) throws IOException
     {
-        // Check if we have at least some input classes.
-        if (configuration.programJars == null)
-        {
-            throw new IOException("The input is empty. You have to specify one or more '-injars' options");
-        }
-
-        // Perform some sanity checks on the class paths.
-        checkInputOutput(configuration.libraryJars,
-                         configuration.programJars);
-        checkInputOutput(configuration.programJars,
-                         configuration.programJars);
-
         WarningPrinter warningPrinter = new WarningPrinter(System.err, configuration.warn);
         WarningPrinter notePrinter    = new WarningPrinter(System.out, configuration.note);
 
@@ -115,7 +103,7 @@
         {
             System.err.println("Note: there were " + noteCount +
                                " duplicate class definitions.");
-            System.out.println("      (http://proguard.sourceforge.net/manual/troubleshooting.html#duplicateclass)");
+            System.err.println("      (http://proguard.sourceforge.net/manual/troubleshooting.html#duplicateclass)");
         }
 
         // Print out a summary of the warnings, if necessary.
@@ -139,38 +127,6 @@
 
 
     /**
-     * Performs some sanity checks on the class paths.
-     */
-    private void checkInputOutput(ClassPath inputClassPath,
-                                  ClassPath outputClassPath)
-    throws IOException
-    {
-        if (inputClassPath == null ||
-            outputClassPath == null)
-        {
-            return;
-        }
-
-        for (int index1 = 0; index1 < inputClassPath.size(); index1++)
-        {
-            ClassPathEntry entry1 = inputClassPath.get(index1);
-            if (!entry1.isOutput())
-            {
-                for (int index2 = 0; index2 < outputClassPath.size(); index2++)
-                {
-                    ClassPathEntry entry2 = outputClassPath.get(index2);
-                    if (entry2.isOutput() &&
-                        entry2.getName().equals(entry1.getName()))
-                    {
-                        throw new IOException("Input jars and output jars must be different ["+entry1.getName()+"]");
-                    }
-                }
-            }
-        }
-    }
-
-
-    /**
      * Reads all input entries from the given class path.
      */
     private void readInput(String          messagePrefix,
diff --git a/src/proguard/KeepClassMemberChecker.java b/src/proguard/KeepClassMemberChecker.java
index 3ea518e..ec976af 100644
--- a/src/proguard/KeepClassMemberChecker.java
+++ b/src/proguard/KeepClassMemberChecker.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -32,8 +32,6 @@
  * @author Eric Lafortune
  */
 public class KeepClassMemberChecker
-extends      SimplifiedVisitor
-implements   ClassVisitor
 {
     private final WarningPrinter notePrinter;
 
@@ -49,8 +47,7 @@
 
     /**
      * Checks if the given class specifications try to keep class members
-     * without actually specifying any, printing notes if necessary. Returns
-     * the number of notes printed.
+     * without actually specifying any, printing notes if necessary.
      */
     public void checkClassSpecifications(List keepClassSpecifications)
     {
@@ -73,7 +70,8 @@
                         className = keepClassSpecification.extendsClassName;
                     }
 
-                    if (notePrinter.accepts(className))
+                    if (className == null ||
+                        notePrinter.accepts(className))
                     {
                         notePrinter.print(className,
                                           "Note: the configuration doesn't specify which class members to keep for class '" +
diff --git a/src/proguard/KeepClassSpecification.java b/src/proguard/KeepClassSpecification.java
index a6215c5..6c46271 100644
--- a/src/proguard/KeepClassSpecification.java
+++ b/src/proguard/KeepClassSpecification.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -29,6 +29,7 @@
 {
     public final boolean markClasses;
     public final boolean markConditionally;
+    public final boolean markDescriptorClasses;
     public final boolean allowShrinking;
     public final boolean allowOptimization;
     public final boolean allowObfuscation;
@@ -36,47 +37,57 @@
 
     /**
      * Creates a new KeepClassSpecification for all possible classes.
-     * @param markClasses        specifies whether to mark the classes.
-     *                           If false, only class members are marked.
-     *                           If true, the classes are marked as well.
-     * @param markConditionally  specifies whether to mark the classes and
-     *                           class members conditionally. If true, classes
-     *                           and class members are marked, on the condition
-     *                           that all specified class members are present.
-     * @param allowShrinking     specifies whether shrinking is allowed.
-     * @param allowOptimization  specifies whether optimization is allowed.
-     * @param allowObfuscation   specifies whether obfuscation is allowed.
+     * @param markClasses           specifies whether to mark the classes.
+     *                              If false, only class members are marked.
+     *                              If true, the classes are marked as well.
+     * @param markConditionally     specifies whether to mark the classes and
+     *                              class members conditionally. If true,
+     *                              classes and class members are marked, on
+     *                              the condition that all specified class
+     *                              members are present.
+     * @param markDescriptorClasses specifies whether to mark the classes in
+     *                              the descriptors of the marked class members.
+     * @param allowShrinking        specifies whether shrinking is allowed.
+     * @param allowOptimization     specifies whether optimization is allowed.
+     * @param allowObfuscation      specifies whether obfuscation is allowed.
      */
     public KeepClassSpecification(boolean markClasses,
                                   boolean markConditionally,
+                                  boolean markDescriptorClasses,
                                   boolean allowShrinking,
                                   boolean allowOptimization,
                                   boolean allowObfuscation)
     {
-        this.markClasses       = markClasses;
-        this.markConditionally = markConditionally;
-        this.allowShrinking    = allowShrinking;
-        this.allowOptimization = allowOptimization;
-        this.allowObfuscation  = allowObfuscation;
+        this.markClasses           = markClasses;
+        this.markConditionally     = markConditionally;
+        this.markDescriptorClasses = markDescriptorClasses;
+        this.allowShrinking        = allowShrinking;
+        this.allowOptimization     = allowOptimization;
+        this.allowObfuscation      = allowObfuscation;
     }
 
 
     /**
      * Creates a new KeepClassSpecification.
-     * @param markClasses        specifies whether to mark the classes.
-     *                           If false, only class members are marked.
-     *                           If true, the classes are marked as well.
-     * @param markConditionally  specifies whether to mark the classes and
-     *                           class members conditionally. If true, classes
-     *                           and class members are marked, on the condition
-     *                           that all specified class members are present.
-     * @param allowShrinking     specifies whether shrinking is allowed.
-     * @param allowOptimization  specifies whether optimization is allowed.
-     * @param allowObfuscation   specifies whether obfuscation is allowed.
-     * @param classSpecification the specification of classes and class members.
+     * @param markClasses           specifies whether to mark the classes.
+     *                              If false, only class members are marked.
+     *                              If true, the classes are marked as well.
+     * @param markConditionally     specifies whether to mark the classes and
+     *                              class members conditionally. If true,
+     *                              classes and class members are marked, on
+     *                              the condition that all specified class
+     *                              members are present.
+     * @param markDescriptorClasses specifies whether to mark the classes in
+     *                              the descriptors of the marked class members.
+     * @param allowShrinking        specifies whether shrinking is allowed.
+     * @param allowOptimization     specifies whether optimization is allowed.
+     * @param allowObfuscation      specifies whether obfuscation is allowed.
+     * @param classSpecification    the specification of classes and class
+     *                              members.
      */
     public KeepClassSpecification(boolean            markClasses,
                                   boolean            markConditionally,
+                                  boolean            markDescriptorClasses,
                                   boolean            allowShrinking,
                                   boolean            allowOptimization,
                                   boolean            allowObfuscation,
@@ -84,11 +95,12 @@
     {
         super(classSpecification);
 
-        this.markClasses       = markClasses;
-        this.markConditionally = markConditionally;
-        this.allowShrinking    = allowShrinking;
-        this.allowOptimization = allowOptimization;
-        this.allowObfuscation  = allowObfuscation;
+        this.markClasses           = markClasses;
+        this.markConditionally     = markConditionally;
+        this.markDescriptorClasses = markDescriptorClasses;
+        this.allowShrinking        = allowShrinking;
+        this.allowOptimization     = allowOptimization;
+        this.allowObfuscation      = allowObfuscation;
     }
 
 
@@ -104,22 +116,24 @@
 
         KeepClassSpecification other = (KeepClassSpecification)object;
         return
-            this.markClasses       == other.markClasses       &&
-            this.markConditionally == other.markConditionally &&
-            this.allowShrinking    == other.allowShrinking    &&
-            this.allowOptimization == other.allowOptimization &&
-            this.allowObfuscation  == other.allowObfuscation  &&
+            this.markClasses           == other.markClasses           &&
+            this.markConditionally     == other.markConditionally     &&
+            this.markDescriptorClasses == other.markDescriptorClasses &&
+            this.allowShrinking        == other.allowShrinking        &&
+            this.allowOptimization     == other.allowOptimization     &&
+            this.allowObfuscation      == other.allowObfuscation      &&
             super.equals(other);
     }
 
     public int hashCode()
     {
         return
-            (markClasses       ? 0 :  1) ^
-            (markConditionally ? 0 :  2) ^
-            (allowShrinking    ? 0 :  4) ^
-            (allowOptimization ? 0 :  8) ^
-            (allowObfuscation  ? 0 : 16) ^
+            (markClasses           ? 0 :  1) ^
+            (markConditionally     ? 0 :  2) ^
+            (markDescriptorClasses ? 0 :  4) ^
+            (allowShrinking        ? 0 :  8) ^
+            (allowOptimization     ? 0 : 16) ^
+            (allowObfuscation      ? 0 : 32) ^
             super.hashCode();
     }
 
diff --git a/src/proguard/LibraryKeepChecker.java b/src/proguard/LibraryKeepChecker.java
new file mode 100644
index 0000000..3209539
--- /dev/null
+++ b/src/proguard/LibraryKeepChecker.java
@@ -0,0 +1,115 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ *             of Java bytecode.
+ *
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+package proguard;
+
+import proguard.classfile.*;
+import proguard.classfile.util.*;
+import proguard.classfile.visitor.*;
+import proguard.optimize.*;
+
+import java.util.List;
+
+/**
+ * This class checks whether some keep rules only keep library classes, no
+ * program classes. That is strange, because library classes never need to
+ * be kept explicitly.
+ *
+ * @author Eric Lafortune
+ */
+public class LibraryKeepChecker
+implements   ClassVisitor
+{
+    private final ClassPool      programClassPool;
+    private final ClassPool      libraryClassPool;
+    private final WarningPrinter notePrinter;
+
+    // Some fields acting as parameters for the class visitor.
+    private String keepName;
+
+
+    /**
+     * Creates a new DescriptorKeepChecker.
+     */
+    public LibraryKeepChecker(ClassPool      programClassPool,
+                              ClassPool      libraryClassPool,
+                              WarningPrinter notePrinter)
+    {
+        this.programClassPool = programClassPool;
+        this.libraryClassPool = libraryClassPool;
+        this.notePrinter      = notePrinter;
+    }
+
+
+    /**
+     * Checks the classes mentioned in the given keep specifications, printing
+     * notes if necessary.
+     */
+    public void checkClassSpecifications(List keepSpecifications)
+    {
+        if (keepSpecifications != null)
+        {
+            // Go over all individual keep specifications.
+            for (int index = 0; index < keepSpecifications.size(); index++)
+            {
+                KeepClassSpecification keepClassSpecification =
+                    (KeepClassSpecification)keepSpecifications.get(index);
+
+                // Is the keep specification more specific than a general
+                // wildcard?
+                keepName = keepClassSpecification.className;
+                if (keepName != null)
+                {
+                    // Doesn't the specification match any program classes?
+                    ClassCounter programClassCounter = new ClassCounter();
+                    programClassPool.accept(
+                        ClassSpecificationVisitorFactory.createClassPoolVisitor(keepClassSpecification,
+                                                                                programClassCounter,
+                                                                                null));
+                    if (programClassCounter.getCount() == 0)
+                    {
+                        // Print out notes about any matched library classes.
+                        libraryClassPool.accept(
+                            ClassSpecificationVisitorFactory.createClassPoolVisitor(keepClassSpecification,
+                                                                                    this,
+                                                                                    null));
+                    }
+                }
+            }
+        }
+    }
+
+
+    // Implementations for ClassVisitor.
+
+    public void visitProgramClass(ProgramClass programClass) {}
+
+
+    public void visitLibraryClass(LibraryClass libraryClass)
+    {
+        String className = libraryClass.getName();
+        notePrinter.print(className,
+                          "Note: the configuration explicitly specifies '" +
+                          ClassUtil.externalClassName(keepName) +
+                          "' to keep library class '" +
+                          ClassUtil.externalClassName(className) +
+                          "'");
+    }
+}
diff --git a/src/proguard/LineWordReader.java b/src/proguard/LineWordReader.java
index 64a228c..b39f2fe 100644
--- a/src/proguard/LineWordReader.java
+++ b/src/proguard/LineWordReader.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/MemberSpecification.java b/src/proguard/MemberSpecification.java
index e771fde..9e4d671 100644
--- a/src/proguard/MemberSpecification.java
+++ b/src/proguard/MemberSpecification.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/OutputWriter.java b/src/proguard/OutputWriter.java
index c4467cf..3feb1c4 100644
--- a/src/proguard/OutputWriter.java
+++ b/src/proguard/OutputWriter.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -55,87 +55,6 @@
     {
         ClassPath programJars = configuration.programJars;
 
-        // Perform a check on the first jar.
-        ClassPathEntry firstEntry = programJars.get(0);
-        if (firstEntry.isOutput())
-        {
-            throw new IOException("The output jar [" + firstEntry.getName() +
-                                  "] must be specified after an input jar, or it will be empty.");
-        }
-
-        // Check if the first of two subsequent the output jars has a filter.
-        for (int index = 0; index < programJars.size() - 1; index++)
-        {
-            ClassPathEntry entry = programJars.get(index);
-            if (entry.isOutput())
-            {
-                if (entry.getFilter()    == null &&
-                    entry.getJarFilter() == null &&
-                    entry.getWarFilter() == null &&
-                    entry.getEarFilter() == null &&
-                    entry.getZipFilter() == null &&
-                    programJars.get(index + 1).isOutput())
-                {
-                    throw new IOException("The output jar [" + entry.getName() +
-                                          "] must have a filter, or all subsequent output jars will be empty.");
-                }
-            }
-        }
-
-        // Check if the output jar names are different from the input jar names.
-        for (int outIndex = 0; outIndex < programJars.size() - 1; outIndex++)
-        {
-            ClassPathEntry entry = programJars.get(outIndex);
-            if (entry.isOutput())
-            {
-                for (int inIndex = 0; inIndex < programJars.size(); inIndex++)
-                {
-                    ClassPathEntry otherEntry = programJars.get(inIndex);
-
-                    if (!otherEntry.isOutput() &&
-                        entry.getFile().equals(otherEntry.getFile()))
-                    {
-                        throw new IOException("The output jar [" + entry.getName() +
-                                              "] must be different from all input jars.");
-                    }
-                }
-            }
-        }
-
-        // Check for potential problems with mixed-case class names on
-        // case-insensitive file systems.
-        if (configuration.obfuscate                          &&
-            configuration.useMixedCaseClassNames             &&
-            configuration.classObfuscationDictionary == null &&
-            (configuration.note == null ||
-             !configuration.note.isEmpty()))
-        {
-            String os = System.getProperty("os.name").toLowerCase();
-            if (os.startsWith("windows") ||
-                os.startsWith("mac os"))
-            {
-                // Go over all program class path entries.
-                for (int index = 0; index < programJars.size(); index++)
-                {
-                    // Is it an output directory?
-                    ClassPathEntry entry = programJars.get(index);
-                    if (entry.isOutput() &&
-                        !entry.isJar() &&
-                        !entry.isWar() &&
-                        !entry.isEar() &&
-                        !entry.isZip())
-                    {
-                        System.out.println("Note: you're writing the processed class files to a directory [" + entry.getName() +"].");
-                        System.out.println("      This will likely cause problems with obfuscated mixed-case class names.");
-                        System.out.println("      You should consider writing the output to a jar file, or otherwise");
-                        System.out.println("      specify '-dontusemixedcaseclassnames'.");
-
-                        break;
-                    }
-                }
-            }
-        }
-
         int firstInputIndex = 0;
         int lastInputIndex  = 0;
 
@@ -200,30 +119,34 @@
 
             DataEntryReader resourceRewriter = resourceCopier;
 
-            // Wrap the resource writer with a filter and a data entry rewriter,
-            // if required.
-            if (configuration.adaptResourceFileContents != null)
+            // Adapt resource file contents and names, if necessary.
+            if (configuration.obfuscate)
             {
-                resourceRewriter =
-                    new NameFilter(configuration.adaptResourceFileContents,
-                    new NameFilter("META-INF/MANIFEST.MF,META-INF/*.SF",
-                        new ManifestRewriter(programClassPool, writer),
-                        new DataEntryRewriter(programClassPool, writer)),
-                    resourceRewriter);
-            }
+                // Wrap the resource writer with a filter and a data entry
+                // rewriter, if required.
+                if (configuration.adaptResourceFileContents != null)
+                {
+                    resourceRewriter =
+                        new NameFilter(configuration.adaptResourceFileContents,
+                        new NameFilter("META-INF/MANIFEST.MF,META-INF/*.SF",
+                            new ManifestRewriter(programClassPool, writer),
+                            new DataEntryRewriter(programClassPool, writer)),
+                        resourceRewriter);
+                }
 
-            // Wrap the resource writer with a filter and a data entry renamer,
-            // if required.
-            if (configuration.adaptResourceFileNames != null)
-            {
-                Map packagePrefixMap = createPackagePrefixMap(programClassPool);
+                // Wrap the resource writer with a filter and a data entry
+                // renamer, if required.
+                if (configuration.adaptResourceFileNames != null)
+                {
+                    Map packagePrefixMap = createPackagePrefixMap(programClassPool);
 
-                resourceRewriter =
-                    new NameFilter(configuration.adaptResourceFileNames,
-                    new DataEntryObfuscator(programClassPool,
-                                            packagePrefixMap,
-                                            resourceRewriter),
-                    resourceRewriter);
+                    resourceRewriter =
+                        new NameFilter(configuration.adaptResourceFileNames,
+                        new DataEntryObfuscator(programClassPool,
+                                                packagePrefixMap,
+                                                resourceRewriter),
+                        resourceRewriter);
+                }
             }
 
             DataEntryReader directoryRewriter = null;
diff --git a/src/proguard/ParseException.java b/src/proguard/ParseException.java
index b4af6c2..4cb5e70 100644
--- a/src/proguard/ParseException.java
+++ b/src/proguard/ParseException.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/ProGuard.java b/src/proguard/ProGuard.java
index f9dbf54..b35921c 100644
--- a/src/proguard/ProGuard.java
+++ b/src/proguard/ProGuard.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -20,16 +20,16 @@
  */
 package proguard;
 
-import proguard.classfile.ClassPool;
-import proguard.classfile.editor.ClassElementSorter;
+import proguard.classfile.*;
+import proguard.classfile.attribute.visitor.AllAttributeVisitor;
+import proguard.classfile.editor.*;
 import proguard.classfile.visitor.*;
 import proguard.obfuscate.Obfuscator;
-import proguard.optimize.*;
+import proguard.optimize.Optimizer;
 import proguard.preverify.*;
 import proguard.shrink.Shrinker;
 
 import java.io.*;
-import java.util.Properties;
 
 /**
  * Tool for shrinking, optimizing, obfuscating, and preverifying Java classes.
@@ -38,7 +38,7 @@
  */
 public class ProGuard
 {
-    public static final String VERSION = "ProGuard, version 4.10";
+    public static final String VERSION = "ProGuard, version 5.1";
 
     private final Configuration configuration;
     private       ClassPool     programClassPool = new ClassPool();
@@ -69,6 +69,8 @@
             printConfiguration();
         }
 
+        new ConfigurationChecker(configuration).check();
+
         if (configuration.programJars != null     &&
             configuration.programJars.hasOutput() &&
             new UpToDateChecker(configuration).check())
@@ -78,6 +80,14 @@
 
         readInput();
 
+        if (configuration.shrink    ||
+            configuration.optimize  ||
+            configuration.obfuscate ||
+            configuration.preverify)
+        {
+            clearPreverification();
+        }
+
         if (configuration.printSeeds != null ||
             configuration.shrink    ||
             configuration.optimize  ||
@@ -336,6 +346,19 @@
 
 
     /**
+     * Clears any JSE preverification information from the program classes.
+     */
+    private void clearPreverification()
+    {
+        programClassPool.classesAccept(
+            new ClassVersionFilter(ClassConstants.CLASS_VERSION_1_6,
+            new AllMethodVisitor(
+            new AllAttributeVisitor(
+            new NamedAttributeDeleter(ClassConstants.ATTR_StackMapTable)))));
+    }
+
+
+    /**
      * Performs the preverification step.
      */
     private void preverify()
diff --git a/src/proguard/SeedPrinter.java b/src/proguard/SeedPrinter.java
index 8ed74b6..7418aee 100644
--- a/src/proguard/SeedPrinter.java
+++ b/src/proguard/SeedPrinter.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -21,16 +21,10 @@
 package proguard;
 
 import proguard.classfile.ClassPool;
-import proguard.classfile.attribute.visitor.AllAttributeVisitor;
-import proguard.classfile.constant.visitor.AllConstantVisitor;
-import proguard.classfile.instruction.visitor.AllInstructionVisitor;
-import proguard.classfile.util.*;
 import proguard.classfile.visitor.*;
 import proguard.optimize.*;
-import proguard.util.*;
 
 import java.io.*;
-import java.util.*;
 
 /**
  * This class prints out the seeds specified by keep options.
diff --git a/src/proguard/SubclassedClassFilter.java b/src/proguard/SubclassedClassFilter.java
index 1b9c1fe..e851a2b 100644
--- a/src/proguard/SubclassedClassFilter.java
+++ b/src/proguard/SubclassedClassFilter.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/Targeter.java b/src/proguard/Targeter.java
index 675f0df..b0e71c1 100644
--- a/src/proguard/Targeter.java
+++ b/src/proguard/Targeter.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/UpToDateChecker.java b/src/proguard/UpToDateChecker.java
index 7f5e7a6..f0b2b81 100644
--- a/src/proguard/UpToDateChecker.java
+++ b/src/proguard/UpToDateChecker.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/WordReader.java b/src/proguard/WordReader.java
index 110fce3..f375057 100644
--- a/src/proguard/WordReader.java
+++ b/src/proguard/WordReader.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/ant/ClassPathElement.java b/src/proguard/ant/ClassPathElement.java
index b496123..ef5b510 100644
--- a/src/proguard/ant/ClassPathElement.java
+++ b/src/proguard/ant/ClassPathElement.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -36,7 +36,9 @@
 public class ClassPathElement extends Path
 {
     private String filter;
+    private String apkFilter;
     private String jarFilter;
+    private String aarFilter;
     private String warFilter;
     private String earFilter;
     private String zipFilter;
@@ -120,7 +122,9 @@
                 new ClassPathEntry(file.isAbsolute() ? file : new File(baseDir, fileName),
                                    output);
             entry.setFilter(ListUtil.commaSeparatedList(filter));
+            entry.setApkFilter(ListUtil.commaSeparatedList(apkFilter));
             entry.setJarFilter(ListUtil.commaSeparatedList(jarFilter));
+            entry.setAarFilter(ListUtil.commaSeparatedList(aarFilter));
             entry.setWarFilter(ListUtil.commaSeparatedList(warFilter));
             entry.setEarFilter(ListUtil.commaSeparatedList(earFilter));
             entry.setZipFilter(ListUtil.commaSeparatedList(zipFilter));
@@ -166,12 +170,24 @@
     }
 
 
+    public void setApkfilter(String apkFilter)
+    {
+        this.apkFilter = apkFilter;
+    }
+
+
     public void setJarfilter(String jarFilter)
     {
         this.jarFilter = jarFilter;
     }
 
 
+    public void setAarfilter(String aarFilter)
+    {
+        this.aarFilter = aarFilter;
+    }
+
+
     public void setWarfilter(String warFilter)
     {
         this.warFilter = warFilter;
diff --git a/src/proguard/ant/ClassSpecificationElement.java b/src/proguard/ant/ClassSpecificationElement.java
index c07e101..146bf09 100644
--- a/src/proguard/ant/ClassSpecificationElement.java
+++ b/src/proguard/ant/ClassSpecificationElement.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -23,7 +23,7 @@
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.types.DataType;
 import proguard.*;
-import proguard.classfile.ClassConstants;
+import proguard.classfile.*;
 import proguard.classfile.util.ClassUtil;
 
 import java.util.*;
@@ -219,12 +219,12 @@
                         token;
 
                     int accessFlag =
-                        strippedToken.equals(ClassConstants.EXTERNAL_ACC_PUBLIC)     ? ClassConstants.INTERNAL_ACC_PUBLIC      :
-                        strippedToken.equals(ClassConstants.EXTERNAL_ACC_FINAL)      ? ClassConstants.INTERNAL_ACC_FINAL       :
-                        strippedToken.equals(ClassConstants.EXTERNAL_ACC_ABSTRACT)   ? ClassConstants.INTERNAL_ACC_ABSTRACT    :
-                        strippedToken.equals(ClassConstants.EXTERNAL_ACC_SYNTHETIC)  ? ClassConstants.INTERNAL_ACC_SYNTHETIC   :
-                        strippedToken.equals(ClassConstants.EXTERNAL_ACC_ANNOTATION) ? ClassConstants.INTERNAL_ACC_ANNOTATTION :
-                        0;
+                        strippedToken.equals(JavaConstants.ACC_PUBLIC)     ? ClassConstants.ACC_PUBLIC      :
+                        strippedToken.equals(JavaConstants.ACC_FINAL)      ? ClassConstants.ACC_FINAL       :
+                        strippedToken.equals(JavaConstants.ACC_ABSTRACT)   ? ClassConstants.ACC_ABSTRACT    :
+                        strippedToken.equals(JavaConstants.ACC_SYNTHETIC)  ? ClassConstants.ACC_SYNTHETIC   :
+                        strippedToken.equals(JavaConstants.ACC_ANNOTATION) ? ClassConstants.ACC_ANNOTATTION :
+                                                                             0;
 
                     if (accessFlag == 0)
                     {
@@ -239,12 +239,13 @@
         if (type != null && (type.startsWith("!") ^ set))
         {
             int accessFlag =
-                type.equals("class")                                     ? 0                                     :
-                type.equals(      ClassConstants.EXTERNAL_ACC_INTERFACE) ||
-                type.equals("!" + ClassConstants.EXTERNAL_ACC_INTERFACE) ? ClassConstants.INTERNAL_ACC_INTERFACE :
-                type.equals(      ClassConstants.EXTERNAL_ACC_ENUM)      ||
-                type.equals("!" + ClassConstants.EXTERNAL_ACC_ENUM)      ? ClassConstants.INTERNAL_ACC_ENUM      :
-                                                                           -1;
+                type.equals("class")                           ? 0                            :
+                type.equals(      JavaConstants.ACC_INTERFACE) ||
+                type.equals("!" + JavaConstants.ACC_INTERFACE) ? ClassConstants.ACC_INTERFACE :
+                type.equals(      JavaConstants.ACC_ENUM)      ||
+                type.equals("!" + JavaConstants.ACC_ENUM)      ? ClassConstants.ACC_ENUM      :
+                                                                 -1;
+
             if (accessFlag == -1)
             {
                 throw new BuildException("Incorrect class type ["+type+"]");
diff --git a/src/proguard/ant/ConfigurationElement.java b/src/proguard/ant/ConfigurationElement.java
index d184aef..f6e7be8 100644
--- a/src/proguard/ant/ConfigurationElement.java
+++ b/src/proguard/ant/ConfigurationElement.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -23,7 +23,6 @@
 import org.apache.tools.ant.*;
 import org.apache.tools.ant.types.*;
 import proguard.*;
-import proguard.util.ListUtil;
 
 import java.io.*;
 import java.util.Properties;
diff --git a/src/proguard/ant/ConfigurationTask.java b/src/proguard/ant/ConfigurationTask.java
index 376a1a1..0bd1b35 100644
--- a/src/proguard/ant/ConfigurationTask.java
+++ b/src/proguard/ant/ConfigurationTask.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/ant/FilterElement.java b/src/proguard/ant/FilterElement.java
index ab3364a..b31313f 100644
--- a/src/proguard/ant/FilterElement.java
+++ b/src/proguard/ant/FilterElement.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/ant/KeepSpecificationElement.java b/src/proguard/ant/KeepSpecificationElement.java
index feabc18..06c3ff0 100644
--- a/src/proguard/ant/KeepSpecificationElement.java
+++ b/src/proguard/ant/KeepSpecificationElement.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -31,6 +31,7 @@
  */
 public class KeepSpecificationElement extends ClassSpecificationElement
 {
+    private boolean markDescriptorClasses;
     private boolean allowShrinking;
     private boolean allowOptimization;
     private boolean allowObfuscation;
@@ -56,6 +57,7 @@
         KeepClassSpecification keepClassSpecification =
             new KeepClassSpecification(markClasses,
                                        markConditionally,
+                                       markDescriptorClasses,
                                        allowShrinking,
                                        allowOptimization,
                                        allowObfuscation,
@@ -68,6 +70,12 @@
 
     // Ant task attributes.
 
+    public void setIncludedescriptorclasses(boolean markDescriptorClasses)
+    {
+        this.markDescriptorClasses = markDescriptorClasses;
+    }
+
+
     public void setAllowshrinking(boolean allowShrinking)
     {
         this.allowShrinking = allowShrinking;
diff --git a/src/proguard/ant/MemberSpecificationElement.java b/src/proguard/ant/MemberSpecificationElement.java
index 9762009..2cfa697 100644
--- a/src/proguard/ant/MemberSpecificationElement.java
+++ b/src/proguard/ant/MemberSpecificationElement.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -23,7 +23,7 @@
 import org.apache.tools.ant.BuildException;
 import org.apache.tools.ant.types.DataType;
 import proguard.MemberSpecification;
-import proguard.classfile.ClassConstants;
+import proguard.classfile.*;
 import proguard.classfile.util.ClassUtil;
 import proguard.util.ListUtil;
 
@@ -87,10 +87,10 @@
 
                 if (parameters != null)
                 {
-                    type = ClassConstants.EXTERNAL_TYPE_VOID;
+                    type = JavaConstants.TYPE_VOID;
                 }
 
-                name = ClassConstants.INTERNAL_METHOD_NAME_INIT;
+                name = ClassConstants.METHOD_NAME_INIT;
             }
             else if ((type != null) ^ (parameters != null))
             {
@@ -187,21 +187,21 @@
                         token;
 
                     int accessFlag =
-                        strippedToken.equals(ClassConstants.EXTERNAL_ACC_PUBLIC)       ? ClassConstants.INTERNAL_ACC_PUBLIC       :
-                        strippedToken.equals(ClassConstants.EXTERNAL_ACC_PRIVATE)      ? ClassConstants.INTERNAL_ACC_PRIVATE      :
-                        strippedToken.equals(ClassConstants.EXTERNAL_ACC_PROTECTED)    ? ClassConstants.INTERNAL_ACC_PROTECTED    :
-                        strippedToken.equals(ClassConstants.EXTERNAL_ACC_STATIC)       ? ClassConstants.INTERNAL_ACC_STATIC       :
-                        strippedToken.equals(ClassConstants.EXTERNAL_ACC_FINAL)        ? ClassConstants.INTERNAL_ACC_FINAL        :
-                        strippedToken.equals(ClassConstants.EXTERNAL_ACC_SYNCHRONIZED) ? ClassConstants.INTERNAL_ACC_SYNCHRONIZED :
-                        strippedToken.equals(ClassConstants.EXTERNAL_ACC_VOLATILE)     ? ClassConstants.INTERNAL_ACC_VOLATILE     :
-                        strippedToken.equals(ClassConstants.EXTERNAL_ACC_TRANSIENT)    ? ClassConstants.INTERNAL_ACC_TRANSIENT    :
-                        strippedToken.equals(ClassConstants.EXTERNAL_ACC_BRIDGE)       ? ClassConstants.INTERNAL_ACC_BRIDGE       :
-                        strippedToken.equals(ClassConstants.EXTERNAL_ACC_VARARGS)      ? ClassConstants.INTERNAL_ACC_VARARGS      :
-                        strippedToken.equals(ClassConstants.EXTERNAL_ACC_NATIVE)       ? ClassConstants.INTERNAL_ACC_NATIVE       :
-                        strippedToken.equals(ClassConstants.EXTERNAL_ACC_ABSTRACT)     ? ClassConstants.INTERNAL_ACC_ABSTRACT     :
-                        strippedToken.equals(ClassConstants.EXTERNAL_ACC_STRICT)       ? ClassConstants.INTERNAL_ACC_STRICT       :
-                        strippedToken.equals(ClassConstants.EXTERNAL_ACC_SYNTHETIC)    ? ClassConstants.INTERNAL_ACC_SYNTHETIC    :
-                        0;
+                        strippedToken.equals(JavaConstants.ACC_PUBLIC)       ? ClassConstants.ACC_PUBLIC       :
+                        strippedToken.equals(JavaConstants.ACC_PRIVATE)      ? ClassConstants.ACC_PRIVATE      :
+                        strippedToken.equals(JavaConstants.ACC_PROTECTED)    ? ClassConstants.ACC_PROTECTED    :
+                        strippedToken.equals(JavaConstants.ACC_STATIC)       ? ClassConstants.ACC_STATIC       :
+                        strippedToken.equals(JavaConstants.ACC_FINAL)        ? ClassConstants.ACC_FINAL        :
+                        strippedToken.equals(JavaConstants.ACC_SYNCHRONIZED) ? ClassConstants.ACC_SYNCHRONIZED :
+                        strippedToken.equals(JavaConstants.ACC_VOLATILE)     ? ClassConstants.ACC_VOLATILE     :
+                        strippedToken.equals(JavaConstants.ACC_TRANSIENT)    ? ClassConstants.ACC_TRANSIENT    :
+                        strippedToken.equals(JavaConstants.ACC_BRIDGE)       ? ClassConstants.ACC_BRIDGE       :
+                        strippedToken.equals(JavaConstants.ACC_VARARGS)      ? ClassConstants.ACC_VARARGS      :
+                        strippedToken.equals(JavaConstants.ACC_NATIVE)       ? ClassConstants.ACC_NATIVE       :
+                        strippedToken.equals(JavaConstants.ACC_ABSTRACT)     ? ClassConstants.ACC_ABSTRACT     :
+                        strippedToken.equals(JavaConstants.ACC_STRICT)       ? ClassConstants.ACC_STRICT       :
+                        strippedToken.equals(JavaConstants.ACC_SYNTHETIC)    ? ClassConstants.ACC_SYNTHETIC    :
+                                                                               0;
 
                     if (accessFlag == 0)
                     {
diff --git a/src/proguard/ant/ProGuardTask.java b/src/proguard/ant/ProGuardTask.java
index 7ab1cdf..f26f1b2 100644
--- a/src/proguard/ant/ProGuardTask.java
+++ b/src/proguard/ant/ProGuardTask.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -51,18 +51,18 @@
             {
                 parser.parse(configuration);
             }
-            catch (ParseException ex)
+            catch (ParseException e)
             {
-                throw new BuildException(ex.getMessage());
+                throw new BuildException(e.getMessage(), e);
             }
             finally
             {
                 parser.close();
             }
         }
-        catch (IOException ex)
+        catch (IOException e)
         {
-            throw new BuildException(ex.getMessage());
+            throw new BuildException(e.getMessage(), e);
         }
     }
 
@@ -315,9 +315,9 @@
             ProGuard proGuard = new ProGuard(configuration);
             proGuard.execute();
         }
-        catch (IOException ex)
+        catch (IOException e)
         {
-            throw new BuildException(ex.getMessage());
+            throw new BuildException(e.getMessage(), e);
         }
     }
 
diff --git a/src/proguard/classfile/ClassConstants.java b/src/proguard/classfile/ClassConstants.java
index 59580c5..7220285 100644
--- a/src/proguard/classfile/ClassConstants.java
+++ b/src/proguard/classfile/ClassConstants.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -21,118 +21,94 @@
 package proguard.classfile;
 
 /**
- * Constants used in representing a Java class (*.class).
+ * Constants used in representing a Java class file (*.class).
  *
  * @author Eric Lafortune
  */
-public interface ClassConstants
+public class ClassConstants
 {
     public static final String CLASS_FILE_EXTENSION = ".class";
 
     public static final int MAGIC = 0xCAFEBABE;
 
-    public static final int INTERNAL_CLASS_VERSION_1_0_MAJOR = 45;
-    public static final int INTERNAL_CLASS_VERSION_1_0_MINOR = 3;
-    public static final int INTERNAL_CLASS_VERSION_1_2_MAJOR = 46;
-    public static final int INTERNAL_CLASS_VERSION_1_2_MINOR = 0;
-    public static final int INTERNAL_CLASS_VERSION_1_3_MAJOR = 47;
-    public static final int INTERNAL_CLASS_VERSION_1_3_MINOR = 0;
-    public static final int INTERNAL_CLASS_VERSION_1_4_MAJOR = 48;
-    public static final int INTERNAL_CLASS_VERSION_1_4_MINOR = 0;
-    public static final int INTERNAL_CLASS_VERSION_1_5_MAJOR = 49;
-    public static final int INTERNAL_CLASS_VERSION_1_5_MINOR = 0;
-    public static final int INTERNAL_CLASS_VERSION_1_6_MAJOR = 50;
-    public static final int INTERNAL_CLASS_VERSION_1_6_MINOR = 0;
-    public static final int INTERNAL_CLASS_VERSION_1_7_MAJOR = 51;
-    public static final int INTERNAL_CLASS_VERSION_1_7_MINOR = 0;
+    public static final int CLASS_VERSION_1_0_MAJOR = 45;
+    public static final int CLASS_VERSION_1_0_MINOR = 3;
+    public static final int CLASS_VERSION_1_2_MAJOR = 46;
+    public static final int CLASS_VERSION_1_2_MINOR = 0;
+    public static final int CLASS_VERSION_1_3_MAJOR = 47;
+    public static final int CLASS_VERSION_1_3_MINOR = 0;
+    public static final int CLASS_VERSION_1_4_MAJOR = 48;
+    public static final int CLASS_VERSION_1_4_MINOR = 0;
+    public static final int CLASS_VERSION_1_5_MAJOR = 49;
+    public static final int CLASS_VERSION_1_5_MINOR = 0;
+    public static final int CLASS_VERSION_1_6_MAJOR = 50;
+    public static final int CLASS_VERSION_1_6_MINOR = 0;
+    public static final int CLASS_VERSION_1_7_MAJOR = 51;
+    public static final int CLASS_VERSION_1_7_MINOR = 0;
+    public static final int CLASS_VERSION_1_8_MAJOR = 52;
+    public static final int CLASS_VERSION_1_8_MINOR = 0;
 
-    public static final int INTERNAL_CLASS_VERSION_1_0 = (INTERNAL_CLASS_VERSION_1_0_MAJOR << 16) | INTERNAL_CLASS_VERSION_1_0_MINOR;
-    public static final int INTERNAL_CLASS_VERSION_1_2 = (INTERNAL_CLASS_VERSION_1_2_MAJOR << 16) | INTERNAL_CLASS_VERSION_1_2_MINOR;
-    public static final int INTERNAL_CLASS_VERSION_1_3 = (INTERNAL_CLASS_VERSION_1_3_MAJOR << 16) | INTERNAL_CLASS_VERSION_1_3_MINOR;
-    public static final int INTERNAL_CLASS_VERSION_1_4 = (INTERNAL_CLASS_VERSION_1_4_MAJOR << 16) | INTERNAL_CLASS_VERSION_1_4_MINOR;
-    public static final int INTERNAL_CLASS_VERSION_1_5 = (INTERNAL_CLASS_VERSION_1_5_MAJOR << 16) | INTERNAL_CLASS_VERSION_1_5_MINOR;
-    public static final int INTERNAL_CLASS_VERSION_1_6 = (INTERNAL_CLASS_VERSION_1_6_MAJOR << 16) | INTERNAL_CLASS_VERSION_1_6_MINOR;
-    public static final int INTERNAL_CLASS_VERSION_1_7 = (INTERNAL_CLASS_VERSION_1_7_MAJOR << 16) | INTERNAL_CLASS_VERSION_1_7_MINOR;
+    public static final int CLASS_VERSION_1_0 = (CLASS_VERSION_1_0_MAJOR << 16) | CLASS_VERSION_1_0_MINOR;
+    public static final int CLASS_VERSION_1_2 = (CLASS_VERSION_1_2_MAJOR << 16) | CLASS_VERSION_1_2_MINOR;
+    public static final int CLASS_VERSION_1_3 = (CLASS_VERSION_1_3_MAJOR << 16) | CLASS_VERSION_1_3_MINOR;
+    public static final int CLASS_VERSION_1_4 = (CLASS_VERSION_1_4_MAJOR << 16) | CLASS_VERSION_1_4_MINOR;
+    public static final int CLASS_VERSION_1_5 = (CLASS_VERSION_1_5_MAJOR << 16) | CLASS_VERSION_1_5_MINOR;
+    public static final int CLASS_VERSION_1_6 = (CLASS_VERSION_1_6_MAJOR << 16) | CLASS_VERSION_1_6_MINOR;
+    public static final int CLASS_VERSION_1_7 = (CLASS_VERSION_1_7_MAJOR << 16) | CLASS_VERSION_1_7_MINOR;
+    public static final int CLASS_VERSION_1_8 = (CLASS_VERSION_1_8_MAJOR << 16) | CLASS_VERSION_1_8_MINOR;
 
-    public static final String EXTERNAL_CLASS_VERSION_1_0       = "1.0";
-    public static final String EXTERNAL_CLASS_VERSION_1_1       = "1.1";
-    public static final String EXTERNAL_CLASS_VERSION_1_2       = "1.2";
-    public static final String EXTERNAL_CLASS_VERSION_1_3       = "1.3";
-    public static final String EXTERNAL_CLASS_VERSION_1_4       = "1.4";
-    public static final String EXTERNAL_CLASS_VERSION_1_5       = "1.5";
-    public static final String EXTERNAL_CLASS_VERSION_1_6       = "1.6";
-    public static final String EXTERNAL_CLASS_VERSION_1_7       = "1.7";
-    public static final String EXTERNAL_CLASS_VERSION_1_5_ALIAS = "5";
-    public static final String EXTERNAL_CLASS_VERSION_1_6_ALIAS = "6";
-    public static final String EXTERNAL_CLASS_VERSION_1_7_ALIAS = "7";
+    public static final int ACC_PUBLIC       = 0x0001;
+    public static final int ACC_PRIVATE      = 0x0002;
+    public static final int ACC_PROTECTED    = 0x0004;
+    public static final int ACC_STATIC       = 0x0008;
+    public static final int ACC_FINAL        = 0x0010;
+    public static final int ACC_SUPER        = 0x0020;
+    public static final int ACC_SYNCHRONIZED = 0x0020;
+    public static final int ACC_VOLATILE     = 0x0040;
+    public static final int ACC_TRANSIENT    = 0x0080;
+    public static final int ACC_BRIDGE       = 0x0040;
+    public static final int ACC_VARARGS      = 0x0080;
+    public static final int ACC_NATIVE       = 0x0100;
+    public static final int ACC_INTERFACE    = 0x0200;
+    public static final int ACC_ABSTRACT     = 0x0400;
+    public static final int ACC_STRICT       = 0x0800;
+    public static final int ACC_SYNTHETIC    = 0x1000;
+    public static final int ACC_ANNOTATTION  = 0x2000;
+    public static final int ACC_ENUM         = 0x4000;
+    public static final int ACC_MANDATED     = 0x8000;
 
-    public static final int INTERNAL_ACC_PUBLIC       = 0x0001;
-    public static final int INTERNAL_ACC_PRIVATE      = 0x0002;
-    public static final int INTERNAL_ACC_PROTECTED    = 0x0004;
-    public static final int INTERNAL_ACC_STATIC       = 0x0008;
-    public static final int INTERNAL_ACC_FINAL        = 0x0010;
-    public static final int INTERNAL_ACC_SUPER        = 0x0020;
-    public static final int INTERNAL_ACC_SYNCHRONIZED = 0x0020;
-    public static final int INTERNAL_ACC_VOLATILE     = 0x0040;
-    public static final int INTERNAL_ACC_TRANSIENT    = 0x0080;
-    public static final int INTERNAL_ACC_BRIDGE       = 0x0040;
-    public static final int INTERNAL_ACC_VARARGS      = 0x0080;
-    public static final int INTERNAL_ACC_NATIVE       = 0x0100;
-    public static final int INTERNAL_ACC_INTERFACE    = 0x0200;
-    public static final int INTERNAL_ACC_ABSTRACT     = 0x0400;
-    public static final int INTERNAL_ACC_STRICT       = 0x0800;
-    public static final int INTERNAL_ACC_SYNTHETIC    = 0x1000;
-    public static final int INTERNAL_ACC_ANNOTATTION  = 0x2000;
-    public static final int INTERNAL_ACC_ENUM         = 0x4000;
-
-    public static final int VALID_INTERNAL_ACC_CLASS  = INTERNAL_ACC_PUBLIC       |
-                                                        INTERNAL_ACC_FINAL        |
-                                                        INTERNAL_ACC_SUPER        |
-                                                        INTERNAL_ACC_INTERFACE    |
-                                                        INTERNAL_ACC_ABSTRACT     |
-                                                        INTERNAL_ACC_SYNTHETIC    |
-                                                        INTERNAL_ACC_ANNOTATTION  |
-                                                        INTERNAL_ACC_ENUM;
-    public static final int VALID_INTERNAL_ACC_FIELD  = INTERNAL_ACC_PUBLIC       |
-                                                        INTERNAL_ACC_PRIVATE      |
-                                                        INTERNAL_ACC_PROTECTED    |
-                                                        INTERNAL_ACC_STATIC       |
-                                                        INTERNAL_ACC_FINAL        |
-                                                        INTERNAL_ACC_VOLATILE     |
-                                                        INTERNAL_ACC_TRANSIENT    |
-                                                        INTERNAL_ACC_SYNTHETIC    |
-                                                        INTERNAL_ACC_ENUM;
-    public static final int VALID_INTERNAL_ACC_METHOD = INTERNAL_ACC_PUBLIC       |
-                                                        INTERNAL_ACC_PRIVATE      |
-                                                        INTERNAL_ACC_PROTECTED    |
-                                                        INTERNAL_ACC_STATIC       |
-                                                        INTERNAL_ACC_FINAL        |
-                                                        INTERNAL_ACC_SYNCHRONIZED |
-                                                        INTERNAL_ACC_BRIDGE       |
-                                                        INTERNAL_ACC_VARARGS      |
-                                                        INTERNAL_ACC_NATIVE       |
-                                                        INTERNAL_ACC_ABSTRACT     |
-                                                        INTERNAL_ACC_STRICT       |
-                                                        INTERNAL_ACC_SYNTHETIC;
-
-    public static final String EXTERNAL_ACC_PUBLIC       = "public";
-    public static final String EXTERNAL_ACC_PRIVATE      = "private";
-    public static final String EXTERNAL_ACC_PROTECTED    = "protected";
-    public static final String EXTERNAL_ACC_STATIC       = "static";
-    public static final String EXTERNAL_ACC_FINAL        = "final";
-    public static final String EXTERNAL_ACC_SUPER        = "super";
-    public static final String EXTERNAL_ACC_SYNCHRONIZED = "synchronized";
-    public static final String EXTERNAL_ACC_VOLATILE     = "volatile";
-    public static final String EXTERNAL_ACC_TRANSIENT    = "transient";
-    public static final String EXTERNAL_ACC_BRIDGE       = "bridge";
-    public static final String EXTERNAL_ACC_VARARGS      = "varargs";
-    public static final String EXTERNAL_ACC_NATIVE       = "native";
-    public static final String EXTERNAL_ACC_INTERFACE    = "interface";
-    public static final String EXTERNAL_ACC_ABSTRACT     = "abstract";
-    public static final String EXTERNAL_ACC_STRICT       = "strictfp";
-    public static final String EXTERNAL_ACC_SYNTHETIC    = "synthetic";
-    public static final String EXTERNAL_ACC_ANNOTATION   = "@";
-    public static final String EXTERNAL_ACC_ENUM         = "enum";
+    public static final int VALID_ACC_CLASS     = ACC_PUBLIC       |
+                                                  ACC_FINAL        |
+                                                  ACC_SUPER        |
+                                                  ACC_INTERFACE    |
+                                                  ACC_ABSTRACT     |
+                                                  ACC_SYNTHETIC    |
+                                                  ACC_ANNOTATTION  |
+                                                  ACC_ENUM;
+    public static final int VALID_ACC_FIELD     = ACC_PUBLIC       |
+                                                  ACC_PRIVATE      |
+                                                  ACC_PROTECTED    |
+                                                  ACC_STATIC       |
+                                                  ACC_FINAL        |
+                                                  ACC_VOLATILE     |
+                                                  ACC_TRANSIENT    |
+                                                  ACC_SYNTHETIC    |
+                                                  ACC_ENUM;
+    public static final int VALID_ACC_METHOD    = ACC_PUBLIC       |
+                                                  ACC_PRIVATE      |
+                                                  ACC_PROTECTED    |
+                                                  ACC_STATIC       |
+                                                  ACC_FINAL        |
+                                                  ACC_SYNCHRONIZED |
+                                                  ACC_BRIDGE       |
+                                                  ACC_VARARGS      |
+                                                  ACC_NATIVE       |
+                                                  ACC_ABSTRACT     |
+                                                  ACC_STRICT       |
+                                                  ACC_SYNTHETIC;
+    public static final int VALID_ACC_PARAMETER = ACC_FINAL        |
+                                                  ACC_SYNTHETIC    |
+                                                  ACC_MANDATED;
 
     public static final int CONSTANT_Utf8               = 1;
     public static final int CONSTANT_Integer            = 3;
@@ -168,6 +144,7 @@
     public static final String ATTR_Synthetic                            = "Synthetic";
     public static final String ATTR_Signature                            = "Signature";
     public static final String ATTR_ConstantValue                        = "ConstantValue";
+    public static final String ATTR_MethodParameters                     = "MethodParameters";
     public static final String ATTR_Exceptions                           = "Exceptions";
     public static final String ATTR_Code                                 = "Code";
     public static final String ATTR_StackMap                             = "StackMap";
@@ -179,145 +156,183 @@
     public static final String ATTR_RuntimeInvisibleAnnotations          = "RuntimeInvisibleAnnotations";
     public static final String ATTR_RuntimeVisibleParameterAnnotations   = "RuntimeVisibleParameterAnnotations";
     public static final String ATTR_RuntimeInvisibleParameterAnnotations = "RuntimeInvisibleParameterAnnotations";
+    public static final String ATTR_RuntimeVisibleTypeAnnotations        = "RuntimeVisibleTypeAnnotations";
+    public static final String ATTR_RuntimeInvisibleTypeAnnotations      = "RuntimeInvisibleTypeAnnotations";
     public static final String ATTR_AnnotationDefault                    = "AnnotationDefault";
 
+    public static final int ANNOTATION_TARGET_ParameterGenericClass             = 0x00;
+    public static final int ANNOTATION_TARGET_ParameterGenericMethod            = 0x01;
+    public static final int ANNOTATION_TARGET_Extends                           = 0x10;
+    public static final int ANNOTATION_TARGET_BoundGenericClass                 = 0x11;
+    public static final int ANNOTATION_TARGET_BoundGenericMethod                = 0x12;
+    public static final int ANNOTATION_TARGET_Field                             = 0x13;
+    public static final int ANNOTATION_TARGET_Return                            = 0x14;
+    public static final int ANNOTATION_TARGET_Receiver                          = 0x15;
+    public static final int ANNOTATION_TARGET_Parameter                         = 0x16;
+    public static final int ANNOTATION_TARGET_Throws                            = 0x17;
+    public static final int ANNOTATION_TARGET_LocalVariable                     = 0x40;
+    public static final int ANNOTATION_TARGET_ResourceVariable                  = 0x41;
+    public static final int ANNOTATION_TARGET_Catch                             = 0x42;
+    public static final int ANNOTATION_TARGET_InstanceOf                        = 0x43;
+    public static final int ANNOTATION_TARGET_New                               = 0x44;
+    public static final int ANNOTATION_TARGET_MethodReferenceNew                = 0x45;
+    public static final int ANNOTATION_TARGET_MethodReference                   = 0x46;
+    public static final int ANNOTATION_TARGET_Cast                              = 0x47;
+    public static final int ANNOTATION_TARGET_ArgumentGenericMethodNew          = 0x48;
+    public static final int ANNOTATION_TARGET_ArgumentGenericMethod             = 0x49;
+    public static final int ANNOTATION_TARGET_ArgumentGenericMethodReferenceNew = 0x4a;
+    public static final int ANNOTATION_TARGET_ArgumentGenericMethodReference    = 0x4b;
+
     public static final char ELEMENT_VALUE_STRING_CONSTANT = 's';
     public static final char ELEMENT_VALUE_ENUM_CONSTANT   = 'e';
     public static final char ELEMENT_VALUE_CLASS           = 'c';
     public static final char ELEMENT_VALUE_ANNOTATION      = '@';
     public static final char ELEMENT_VALUE_ARRAY           = '[';
 
-    public static final char EXTERNAL_PACKAGE_SEPARATOR     = '.';
-    public static final char EXTERNAL_INNER_CLASS_SEPARATOR = '.';
-    public static final char INTERNAL_PACKAGE_SEPARATOR     = '/';
-    public static final char INTERNAL_INNER_CLASS_SEPARATOR = '$';
-    public static final char SPECIAL_CLASS_CHARACTER        = '-';
-    public static final char SPECIAL_MEMBER_SEPARATOR       = '$';
+    public static final char PACKAGE_SEPARATOR        = '/';
+    public static final char INNER_CLASS_SEPARATOR    = '$';
+    public static final char SPECIAL_CLASS_CHARACTER  = '-';
+    public static final char SPECIAL_MEMBER_SEPARATOR = '$';
 
-    public static final char EXTERNAL_METHOD_ARGUMENTS_OPEN      = '(';
-    public static final char EXTERNAL_METHOD_ARGUMENTS_CLOSE     = ')';
-    public static final char EXTERNAL_METHOD_ARGUMENTS_SEPARATOR = ',';
+    public static final char METHOD_ARGUMENTS_OPEN  = '(';
+    public static final char METHOD_ARGUMENTS_CLOSE = ')';
 
-    public static final char INTERNAL_METHOD_ARGUMENTS_OPEN  = '(';
-    public static final char INTERNAL_METHOD_ARGUMENTS_CLOSE = ')';
+    public static final String PACKAGE_JAVA_LANG                        = "java/lang/";
+    public static final String NAME_JAVA_LANG_OBJECT                    = "java/lang/Object";
+    public static final String TYPE_JAVA_LANG_OBJECT                    = "Ljava/lang/Object;";
+    public static final String NAME_JAVA_LANG_CLONEABLE                 = "java/lang/Cloneable";
+    public static final String NAME_JAVA_LANG_THROWABLE                 = "java/lang/Throwable";
+    public static final String NAME_JAVA_LANG_CLASS                     = "java/lang/Class";
+    public static final String NAME_JAVA_LANG_STRING                    = "java/lang/String";
+    public static final String NAME_JAVA_LANG_STRING_BUFFER             = "java/lang/StringBuffer";
+    public static final String NAME_JAVA_LANG_STRING_BUILDER            = "java/lang/StringBuilder";
+    public static final String NAME_JAVA_LANG_INVOKE_METHOD_HANDLE      = "java/lang/invoke/MethodHandle";
+    public static final String NAME_JAVA_LANG_INVOKE_METHOD_TYPE        = "java/lang/invoke/MethodType";
+    public static final String NAME_JAVA_LANG_VOID                      = "java/lang/Void";
+    public static final String NAME_JAVA_LANG_BOOLEAN                   = "java/lang/Boolean";
+    public static final String NAME_JAVA_LANG_BYTE                      = "java/lang/Byte";
+    public static final String NAME_JAVA_LANG_SHORT                     = "java/lang/Short";
+    public static final String NAME_JAVA_LANG_CHARACTER                 = "java/lang/Character";
+    public static final String NAME_JAVA_LANG_INTEGER                   = "java/lang/Integer";
+    public static final String NAME_JAVA_LANG_LONG                      = "java/lang/Long";
+    public static final String NAME_JAVA_LANG_FLOAT                     = "java/lang/Float";
+    public static final String NAME_JAVA_LANG_DOUBLE                    = "java/lang/Double";
+    public static final String NAME_JAVA_LANG_MATH                      = "java/lang/Math";
+    public static final String NAME_JAVA_LANG_SYSTEM                    = "java/lang/System";
+    public static final String NAME_JAVA_LANG_RUNTIME                   = "java/lang/Runtime";
+    public static final String NAME_JAVA_LANG_REFLECT_ARRAY             = "java/lang/reflect/Array";
+    public static final String NAME_JAVA_LANG_REFLECT_FIELD             = "java/lang/reflect/Field";
+    public static final String NAME_JAVA_LANG_REFLECT_METHOD            = "java/lang/reflect/Method";
+    public static final String NAME_JAVA_LANG_REFLECT_CONSTRUCTOR       = "java/lang/reflect/Constructor";
+    public static final String NAME_JAVA_LANG_REFLECT_ACCESSIBLE_OBJECT = "java/lang/reflect/AccessibleObject";
+    public static final String NAME_JAVA_IO_SERIALIZABLE                = "java/io/Serializable";
 
-    public static final String INTERNAL_PACKAGE_JAVA_LANG                   = "java/lang/";
-    public static final String INTERNAL_NAME_JAVA_LANG_OBJECT               = "java/lang/Object";
-    public static final String INTERNAL_TYPE_JAVA_LANG_OBJECT               = "Ljava/lang/Object;";
-    public static final String INTERNAL_NAME_JAVA_LANG_CLONEABLE            = "java/lang/Cloneable";
-    public static final String INTERNAL_NAME_JAVA_LANG_THROWABLE            = "java/lang/Throwable";
-    public static final String INTERNAL_NAME_JAVA_LANG_CLASS                = "java/lang/Class";
-    public static final String INTERNAL_NAME_JAVA_LANG_STRING               = "java/lang/String";
-    public static final String INTERNAL_NAME_JAVA_LANG_STRING_BUFFER        = "java/lang/StringBuffer";
-    public static final String INTERNAL_NAME_JAVA_LANG_STRING_BUILDER       = "java/lang/StringBuilder";
-    public static final String INTERNAL_NAME_JAVA_LANG_INVOKE_METHOD_HANDLE = "java/lang/invoke/MethodHandle";
-    public static final String INTERNAL_NAME_JAVA_LANG_INVOKE_METHOD_TYPE   = "java/lang/invoke/MethodType";
-    public static final String INTERNAL_NAME_JAVA_IO_SERIALIZABLE           = "java/io/Serializable";
+    public static final String NAME_JAVA_UTIL_CONCURRENT_ATOMIC_ATOMIC_INTEGER_FIELD_UPDATER   = "java/util/concurrent/atomic/AtomicIntegerFieldUpdater";
+    public static final String NAME_JAVA_UTIL_CONCURRENT_ATOMIC_ATOMIC_LONG_FIELD_UPDATER      = "java/util/concurrent/atomic/AtomicLongFieldUpdater";
+    public static final String NAME_JAVA_UTIL_CONCURRENT_ATOMIC_ATOMIC_REFERENCE_FIELD_UPDATER = "java/util/concurrent/atomic/AtomicReferenceFieldUpdater";
 
-    public static final String INTERNAL_NAME_JAVA_UTIL_CONCURRENT_ATOMIC_ATOMIC_INTEGER_FIELD_UPDATER   = "java/util/concurrent/atomic/AtomicIntegerFieldUpdater";
-    public static final String INTERNAL_NAME_JAVA_UTIL_CONCURRENT_ATOMIC_ATOMIC_LONG_FIELD_UPDATER      = "java/util/concurrent/atomic/AtomicLongFieldUpdater";
-    public static final String INTERNAL_NAME_JAVA_UTIL_CONCURRENT_ATOMIC_ATOMIC_REFERENCE_FIELD_UPDATER = "java/util/concurrent/atomic/AtomicReferenceFieldUpdater";
+    public static final String METHOD_NAME_INIT   = "<init>";
+    public static final String METHOD_TYPE_INIT   = "()V";
+    public static final String METHOD_NAME_CLINIT = "<clinit>";
+    public static final String METHOD_TYPE_CLINIT = "()V";
 
-    public static final String INTERNAL_METHOD_NAME_INIT   = "<init>";
-    public static final String INTERNAL_METHOD_TYPE_INIT   = "()V";
-    public static final String INTERNAL_METHOD_NAME_CLINIT = "<clinit>";
-    public static final String INTERNAL_METHOD_TYPE_CLINIT = "()V";
+    public static final String METHOD_NAME_CLASS_FOR_NAME                      = "forName";
+    public static final String METHOD_TYPE_CLASS_FOR_NAME                      = "(Ljava/lang/String;)Ljava/lang/Class;";
+    public static final String METHOD_NAME_CLASS_GET_COMPONENT_TYPE            = "getComponentType";
+    public static final String METHOD_TYPE_CLASS_GET_COMPONENT_TYPE            = "()Ljava/lang/Class;";
+    public static final String METHOD_NAME_CLASS_GET_FIELD                     = "getField";
+    public static final String METHOD_TYPE_CLASS_GET_FIELD                     = "(Ljava/lang/String;)Ljava/lang/reflect/Field;";
+    public static final String METHOD_NAME_CLASS_GET_DECLARED_FIELD            = "getDeclaredField";
+    public static final String METHOD_TYPE_CLASS_GET_DECLARED_FIELD            = "(Ljava/lang/String;)Ljava/lang/reflect/Field;";
+    public static final String CONSTRUCTOR_NAME_CLASS_GET_CONSTRUCTOR          = "getConstructor";
+    public static final String CONSTRUCTOR_TYPE_CLASS_GET_CONSTRUCTOR          = "([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;";
+    public static final String CONSTRUCTOR_NAME_CLASS_GET_DECLARED_CONSTRUCTOR = "getDeclaredConstructor";
+    public static final String CONSTRUCTOR_TYPE_CLASS_GET_DECLARED_CONSTRUCTOR = "([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;";
+    public static final String METHOD_NAME_CLASS_GET_METHOD                    = "getMethod";
+    public static final String METHOD_TYPE_CLASS_GET_METHOD                    = "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;";
+    public static final String METHOD_NAME_CLASS_GET_DECLARED_METHOD           = "getDeclaredMethod";
+    public static final String METHOD_TYPE_CLASS_GET_DECLARED_METHOD           = "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;";
+    public static final String METHOD_NAME_CLASS_GET_DECLARING_CLASS           = "getDeclaringClass";
+    public static final String METHOD_NAME_CLASS_GET_ENCLOSING_CLASS           = "getEnclosingClass";
+    public static final String METHOD_NAME_CLASS_GET_ENCLOSING_CONSTRUCTOR     = "getEnclosingConstructor";
+    public static final String METHOD_NAME_CLASS_GET_ENCLOSING_METHOD          = "getEnclosingMethod";
+    public static final String METHOD_NAME_GET_ANNOTATION                      = "getAnnotation";
+    public static final String METHOD_NAME_GET_ANNOTATIONS                     = "getAnnotations";
+    public static final String METHOD_NAME_GET_DECLARED_ANNOTATIONS            = "getDeclaredAnnotations";
+    public static final String METHOD_NAME_GET_PARAMETER_ANNOTATIONS           = "getParameterAnnotations";
+    public static final String METHOD_NAME_GET_TYPE_PREFIX                     = "getType";
+    public static final String METHOD_NAME_GET_GENERIC_PREFIX                  = "getGeneric";
+    public static final String METHOD_NAME_NEW_UPDATER                         = "newUpdater";
+    public static final String METHOD_TYPE_NEW_INTEGER_UPDATER                 = "(Ljava/lang/Class;Ljava/lang/String;)Ljava/util/concurrent/atomic/AtomicIntegerFieldUpdater;";
+    public static final String METHOD_TYPE_NEW_LONG_UPDATER                    = "(Ljava/lang/Class;Ljava/lang/String;)Ljava/util/concurrent/atomic/AtomicLongFieldUpdater;";
+    public static final String METHOD_TYPE_NEW_REFERENCE_UPDATER               = "(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/String;)Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;";
 
-    public static final String INTERNAL_METHOD_NAME_CLASS_FOR_NAME                      = "forName";
-    public static final String INTERNAL_METHOD_TYPE_CLASS_FOR_NAME                      = "(Ljava/lang/String;)Ljava/lang/Class;";
-    public static final String INTERNAL_METHOD_NAME_CLASS_GET_COMPONENT_TYPE            = "getComponentType";
-    public static final String INTERNAL_METHOD_TYPE_CLASS_GET_COMPONENT_TYPE            = "()Ljava/lang/Class;";
-    public static final String INTERNAL_METHOD_NAME_CLASS_GET_FIELD                     = "getField";
-    public static final String INTERNAL_METHOD_TYPE_CLASS_GET_FIELD                     = "(Ljava/lang/String;)Ljava/lang/reflect/Field;";
-    public static final String INTERNAL_METHOD_NAME_CLASS_GET_DECLARED_FIELD            = "getDeclaredField";
-    public static final String INTERNAL_METHOD_TYPE_CLASS_GET_DECLARED_FIELD            = "(Ljava/lang/String;)Ljava/lang/reflect/Field;";
-    public static final String INTERNAL_CONSTRUCTOR_NAME_CLASS_GET_CONSTRUCTOR          = "getConstructor";
-    public static final String INTERNAL_CONSTRUCTOR_TYPE_CLASS_GET_CONSTRUCTOR          = "([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;";
-    public static final String INTERNAL_CONSTRUCTOR_NAME_CLASS_GET_DECLARED_CONSTRUCTOR = "getDeclaredConstructor";
-    public static final String INTERNAL_CONSTRUCTOR_TYPE_CLASS_GET_DECLARED_CONSTRUCTOR = "([Ljava/lang/Class;)Ljava/lang/reflect/Constructor;";
-    public static final String INTERNAL_METHOD_NAME_CLASS_GET_METHOD                    = "getMethod";
-    public static final String INTERNAL_METHOD_TYPE_CLASS_GET_METHOD                    = "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;";
-    public static final String INTERNAL_METHOD_NAME_CLASS_GET_DECLARED_METHOD           = "getDeclaredMethod";
-    public static final String INTERNAL_METHOD_TYPE_CLASS_GET_DECLARED_METHOD           = "(Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;";
-    public static final String INTERNAL_METHOD_NAME_NEW_UPDATER                         = "newUpdater";
-    public static final String INTERNAL_METHOD_TYPE_NEW_INTEGER_UPDATER                 = "(Ljava/lang/Class;Ljava/lang/String;)Ljava/util/concurrent/atomic/AtomicIntegerFieldUpdater;";
-    public static final String INTERNAL_METHOD_TYPE_NEW_LONG_UPDATER                    = "(Ljava/lang/Class;Ljava/lang/String;)Ljava/util/concurrent/atomic/AtomicLongFieldUpdater;";
-    public static final String INTERNAL_METHOD_TYPE_NEW_REFERENCE_UPDATER               = "(Ljava/lang/Class;Ljava/lang/Class;Ljava/lang/String;)Ljava/util/concurrent/atomic/AtomicReferenceFieldUpdater;";
+    public static final String METHOD_NAME_DOT_CLASS_JAVAC = "class$";
+    public static final String METHOD_TYPE_DOT_CLASS_JAVAC = "(Ljava/lang/String;)Ljava/lang/Class;";
+    public static final String METHOD_NAME_DOT_CLASS_JIKES = "class";
+    public static final String METHOD_TYPE_DOT_CLASS_JIKES = "(Ljava/lang/String;Z)Ljava/lang/Class;";
 
-    public static final String INTERNAL_METHOD_NAME_DOT_CLASS_JAVAC = "class$";
-    public static final String INTERNAL_METHOD_TYPE_DOT_CLASS_JAVAC = "(Ljava/lang/String;)Ljava/lang/Class;";
-    public static final String INTERNAL_METHOD_NAME_DOT_CLASS_JIKES = "class";
-    public static final String INTERNAL_METHOD_TYPE_DOT_CLASS_JIKES = "(Ljava/lang/String;Z)Ljava/lang/Class;";
+    public static final String METHOD_TYPE_INIT_ENUM = "(Ljava/lang/String;I)V";
 
-    public static final String INTERNAL_METHOD_TYPE_INIT_ENUM = "(Ljava/lang/String;I)V";
+    public static final String METHOD_NAME_NEW_INSTANCE = "newInstance";
+    public static final String METHOD_TYPE_NEW_INSTANCE = "()Ljava/lang/Object;";
 
-    public static final String INTERNAL_METHOD_NAME_NEW_INSTANCE = "newInstance";
-    public static final String INTERNAL_METHOD_TYPE_NEW_INSTANCE = "()Ljava/lang/Object;";
+    public static final String METHOD_NAME_EQUALS                 = "equals";
+    public static final String METHOD_TYPE_EQUALS                 = "(Ljava/lang/Object;)Z";
+    public static final String METHOD_NAME_LENGTH                 = "length";
+    public static final String METHOD_NAME_VALUEOF                = "valueOf";
+    public static final String METHOD_TYPE_VALUEOF_BOOLEAN        = "(Z)Ljava/lang/String;";
+    public static final String METHOD_TYPE_VALUEOF_CHAR           = "(C)Ljava/lang/String;";
+    public static final String METHOD_TYPE_VALUEOF_INT            = "(I)Ljava/lang/String;";
+    public static final String METHOD_TYPE_VALUEOF_LONG           = "(J)Ljava/lang/String;";
+    public static final String METHOD_TYPE_VALUEOF_FLOAT          = "(F)Ljava/lang/String;";
+    public static final String METHOD_TYPE_VALUEOF_DOUBLE         = "(D)Ljava/lang/String;";
+    public static final String METHOD_TYPE_VALUEOF_OBJECT         = "(Ljava/lang/Object;)Ljava/lang/String;";
 
-    public static final String INTERNAL_METHOD_NAME_EQUALS                 = "equals";
-    public static final String INTERNAL_METHOD_TYPE_EQUALS                 = "(Ljava/lang/Object;)Z";
-    public static final String INTERNAL_METHOD_NAME_LENGTH                 = "length";
-    public static final String INTERNAL_METHOD_NAME_VALUEOF                = "valueOf";
-    public static final String INTERNAL_METHOD_TYPE_VALUEOF_BOOLEAN        = "(Z)Ljava/lang/String;";
-    public static final String INTERNAL_METHOD_TYPE_VALUEOF_CHAR           = "(C)Ljava/lang/String;";
-    public static final String INTERNAL_METHOD_TYPE_VALUEOF_INT            = "(I)Ljava/lang/String;";
-    public static final String INTERNAL_METHOD_TYPE_VALUEOF_LONG           = "(J)Ljava/lang/String;";
-    public static final String INTERNAL_METHOD_TYPE_VALUEOF_FLOAT          = "(F)Ljava/lang/String;";
-    public static final String INTERNAL_METHOD_TYPE_VALUEOF_DOUBLE         = "(D)Ljava/lang/String;";
-    public static final String INTERNAL_METHOD_TYPE_VALUEOF_OBJECT         = "(Ljava/lang/Object;)Ljava/lang/String;";
+    public static final String METHOD_TYPE_LENGTH                 = "()I";
+    public static final String METHOD_NAME_APPEND                 = "append";
+    public static final String METHOD_TYPE_STRING_VOID            = "(Ljava/lang/String;)V";
+    public static final String METHOD_TYPE_BOOLEAN_STRING_BUFFER  = "(Z)Ljava/lang/StringBuffer;";
+    public static final String METHOD_TYPE_CHAR_STRING_BUFFER     = "(C)Ljava/lang/StringBuffer;";
+    public static final String METHOD_TYPE_INT_STRING_BUFFER      = "(I)Ljava/lang/StringBuffer;";
+    public static final String METHOD_TYPE_LONG_STRING_BUFFER     = "(J)Ljava/lang/StringBuffer;";
+    public static final String METHOD_TYPE_FLOAT_STRING_BUFFER    = "(F)Ljava/lang/StringBuffer;";
+    public static final String METHOD_TYPE_DOUBLE_STRING_BUFFER   = "(D)Ljava/lang/StringBuffer;";
+    public static final String METHOD_TYPE_STRING_STRING_BUFFER   = "(Ljava/lang/String;)Ljava/lang/StringBuffer;";
+    public static final String METHOD_TYPE_OBJECT_STRING_BUFFER   = "(Ljava/lang/Object;)Ljava/lang/StringBuffer;";
+    public static final String METHOD_TYPE_BOOLEAN_STRING_BUILDER = "(Z)Ljava/lang/StringBuilder;";
+    public static final String METHOD_TYPE_CHAR_STRING_BUILDER    = "(C)Ljava/lang/StringBuilder;";
+    public static final String METHOD_TYPE_INT_STRING_BUILDER     = "(I)Ljava/lang/StringBuilder;";
+    public static final String METHOD_TYPE_LONG_STRING_BUILDER    = "(J)Ljava/lang/StringBuilder;";
+    public static final String METHOD_TYPE_FLOAT_STRING_BUILDER   = "(F)Ljava/lang/StringBuilder;";
+    public static final String METHOD_TYPE_DOUBLE_STRING_BUILDER  = "(D)Ljava/lang/StringBuilder;";
+    public static final String METHOD_TYPE_STRING_STRING_BUILDER  = "(Ljava/lang/String;)Ljava/lang/StringBuilder;";
+    public static final String METHOD_TYPE_OBJECT_STRING_BUILDER  = "(Ljava/lang/Object;)Ljava/lang/StringBuilder;";
+    public static final String METHOD_NAME_TOSTRING               = "toString";
+    public static final String METHOD_TYPE_TOSTRING               = "()Ljava/lang/String;";
+    public static final String METHOD_NAME_CLONE                  = "clone";
+    public static final String METHOD_TYPE_CLONE                  = "()Ljava/lang/Object;";
 
-    public static final String INTERNAL_METHOD_TYPE_LENGTH                 = "()I";
-    public static final String INTERNAL_METHOD_NAME_APPEND                 = "append";
-    public static final String INTERNAL_METHOD_TYPE_STRING_VOID            = "(Ljava/lang/String;)V";
-    public static final String INTERNAL_METHOD_TYPE_BOOLEAN_STRING_BUFFER  = "(Z)Ljava/lang/StringBuffer;";
-    public static final String INTERNAL_METHOD_TYPE_CHAR_STRING_BUFFER     = "(C)Ljava/lang/StringBuffer;";
-    public static final String INTERNAL_METHOD_TYPE_INT_STRING_BUFFER      = "(I)Ljava/lang/StringBuffer;";
-    public static final String INTERNAL_METHOD_TYPE_LONG_STRING_BUFFER     = "(J)Ljava/lang/StringBuffer;";
-    public static final String INTERNAL_METHOD_TYPE_FLOAT_STRING_BUFFER    = "(F)Ljava/lang/StringBuffer;";
-    public static final String INTERNAL_METHOD_TYPE_DOUBLE_STRING_BUFFER   = "(D)Ljava/lang/StringBuffer;";
-    public static final String INTERNAL_METHOD_TYPE_STRING_STRING_BUFFER   = "(Ljava/lang/String;)Ljava/lang/StringBuffer;";
-    public static final String INTERNAL_METHOD_TYPE_OBJECT_STRING_BUFFER   = "(Ljava/lang/Object;)Ljava/lang/StringBuffer;";
-    public static final String INTERNAL_METHOD_TYPE_BOOLEAN_STRING_BUILDER = "(Z)Ljava/lang/StringBuilder;";
-    public static final String INTERNAL_METHOD_TYPE_CHAR_STRING_BUILDER    = "(C)Ljava/lang/StringBuilder;";
-    public static final String INTERNAL_METHOD_TYPE_INT_STRING_BUILDER     = "(I)Ljava/lang/StringBuilder;";
-    public static final String INTERNAL_METHOD_TYPE_LONG_STRING_BUILDER    = "(J)Ljava/lang/StringBuilder;";
-    public static final String INTERNAL_METHOD_TYPE_FLOAT_STRING_BUILDER   = "(F)Ljava/lang/StringBuilder;";
-    public static final String INTERNAL_METHOD_TYPE_DOUBLE_STRING_BUILDER  = "(D)Ljava/lang/StringBuilder;";
-    public static final String INTERNAL_METHOD_TYPE_STRING_STRING_BUILDER  = "(Ljava/lang/String;)Ljava/lang/StringBuilder;";
-    public static final String INTERNAL_METHOD_TYPE_OBJECT_STRING_BUILDER  = "(Ljava/lang/Object;)Ljava/lang/StringBuilder;";
-    public static final String INTERNAL_METHOD_NAME_TOSTRING               = "toString";
-    public static final String INTERNAL_METHOD_TYPE_TOSTRING               = "()Ljava/lang/String;";
+    public static final String METHOD_NAME_VALUES                 = "values";
+    public static final String METHOD_NAME_ORDINAL                = "ordinal";
+    public static final String METHOD_TYPE_ORDINAL                = "()I";
 
-    public static final char INTERNAL_TYPE_VOID                   = 'V';
-    public static final char INTERNAL_TYPE_BOOLEAN                = 'Z';
-    public static final char INTERNAL_TYPE_BYTE                   = 'B';
-    public static final char INTERNAL_TYPE_CHAR                   = 'C';
-    public static final char INTERNAL_TYPE_SHORT                  = 'S';
-    public static final char INTERNAL_TYPE_INT                    = 'I';
-    public static final char INTERNAL_TYPE_LONG                   = 'J';
-    public static final char INTERNAL_TYPE_FLOAT                  = 'F';
-    public static final char INTERNAL_TYPE_DOUBLE                 = 'D';
-    public static final char INTERNAL_TYPE_CLASS_START            = 'L';
-    public static final char INTERNAL_TYPE_CLASS_END              = ';';
-    public static final char INTERNAL_TYPE_ARRAY                  = '[';
-    public static final char INTERNAL_TYPE_GENERIC_VARIABLE_START = 'T';
-    public static final char INTERNAL_TYPE_GENERIC_START          = '<';
-    public static final char INTERNAL_TYPE_GENERIC_BOUND          = ':';
-    public static final char INTERNAL_TYPE_GENERIC_END            = '>';
-
-    public static final String EXTERNAL_TYPE_JAVA_LANG_OBJECT = "java.lang.Object";
-    public static final String EXTERNAL_PACKAGE_JAVA_LANG     = "java.lang.";
-
-    public static final String EXTERNAL_TYPE_VOID    = "void";
-    public static final String EXTERNAL_TYPE_BOOLEAN = "boolean";
-    public static final String EXTERNAL_TYPE_BYTE    = "byte";
-    public static final String EXTERNAL_TYPE_CHAR    = "char";
-    public static final String EXTERNAL_TYPE_SHORT   = "short";
-    public static final String EXTERNAL_TYPE_INT     = "int";
-    public static final String EXTERNAL_TYPE_FLOAT   = "float";
-    public static final String EXTERNAL_TYPE_LONG    = "long";
-    public static final String EXTERNAL_TYPE_DOUBLE  = "double";
-    public static final String EXTERNAL_TYPE_ARRAY   = "[]";
+    public static final char TYPE_VOID                   = 'V';
+    public static final char TYPE_BOOLEAN                = 'Z';
+    public static final char TYPE_BYTE                   = 'B';
+    public static final char TYPE_CHAR                   = 'C';
+    public static final char TYPE_SHORT                  = 'S';
+    public static final char TYPE_INT                    = 'I';
+    public static final char TYPE_LONG                   = 'J';
+    public static final char TYPE_FLOAT                  = 'F';
+    public static final char TYPE_DOUBLE                 = 'D';
+    public static final char TYPE_CLASS_START            = 'L';
+    public static final char TYPE_CLASS_END              = ';';
+    public static final char TYPE_ARRAY                  = '[';
+    public static final char TYPE_GENERIC_VARIABLE_START = 'T';
+    public static final char TYPE_GENERIC_START          = '<';
+    public static final char TYPE_GENERIC_BOUND          = ':';
+    public static final char TYPE_GENERIC_END            = '>';
 
     public static final int TYPICAL_CONSTANT_POOL_SIZE     = 256;
     public static final int TYPICAL_FIELD_COUNT            = 64;
diff --git a/src/proguard/classfile/ClassPool.java b/src/proguard/classfile/ClassPool.java
index 5439c6f..da874b5 100644
--- a/src/proguard/classfile/ClassPool.java
+++ b/src/proguard/classfile/ClassPool.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -20,7 +20,6 @@
  */
 package proguard.classfile;
 
-import proguard.classfile.util.ClassUtil;
 import proguard.classfile.visitor.*;
 
 import java.util.*;
diff --git a/src/proguard/classfile/Clazz.java b/src/proguard/classfile/Clazz.java
index 35f8a1c..a055752 100644
--- a/src/proguard/classfile/Clazz.java
+++ b/src/proguard/classfile/Clazz.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -91,6 +91,11 @@
     public String getType(int constantIndex);
 
     /**
+     * Returns the class name of the RefConstant at the specified index.
+     */
+    public String getRefClassName(int constantIndex);
+
+    /**
      * Returns the name of the RefConstant at the specified index.
      */
     public String getRefName(int constantIndex);
diff --git a/src/proguard/classfile/Field.java b/src/proguard/classfile/Field.java
index 61bf2da..b3865a9 100644
--- a/src/proguard/classfile/Field.java
+++ b/src/proguard/classfile/Field.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/JavaConstants.java b/src/proguard/classfile/JavaConstants.java
new file mode 100644
index 0000000..ad8eeca
--- /dev/null
+++ b/src/proguard/classfile/JavaConstants.java
@@ -0,0 +1,89 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ *             of Java bytecode.
+ *
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+package proguard.classfile;
+
+/**
+ * Constants used in representing a Java source file (*.java).
+ *
+ * @author Eric Lafortune
+ */
+public interface JavaConstants
+{
+    public static final String JAVA_FILE_EXTENSION = ".java";
+
+    public static final String CLASS_VERSION_1_0       = "1.0";
+    public static final String CLASS_VERSION_1_1       = "1.1";
+    public static final String CLASS_VERSION_1_2       = "1.2";
+    public static final String CLASS_VERSION_1_3       = "1.3";
+    public static final String CLASS_VERSION_1_4       = "1.4";
+    public static final String CLASS_VERSION_1_5       = "1.5";
+    public static final String CLASS_VERSION_1_6       = "1.6";
+    public static final String CLASS_VERSION_1_7       = "1.7";
+    public static final String CLASS_VERSION_1_8       = "1.8";
+    public static final String CLASS_VERSION_1_5_ALIAS = "5";
+    public static final String CLASS_VERSION_1_6_ALIAS = "6";
+    public static final String CLASS_VERSION_1_7_ALIAS = "7";
+    public static final String CLASS_VERSION_1_8_ALIAS = "8";
+
+    public static final String ACC_PUBLIC       = "public";
+    public static final String ACC_PRIVATE      = "private";
+    public static final String ACC_PROTECTED    = "protected";
+    public static final String ACC_STATIC       = "static";
+    public static final String ACC_FINAL        = "final";
+//  public static final String ACC_SUPER        = "super";
+    public static final String ACC_SYNCHRONIZED = "synchronized";
+    public static final String ACC_VOLATILE     = "volatile";
+    public static final String ACC_TRANSIENT    = "transient";
+    public static final String ACC_BRIDGE       = "bridge";
+    public static final String ACC_VARARGS      = "varargs";
+    public static final String ACC_NATIVE       = "native";
+    public static final String ACC_INTERFACE    = "interface";
+    public static final String ACC_ABSTRACT     = "abstract";
+    public static final String ACC_STRICT       = "strictfp";
+    public static final String ACC_SYNTHETIC    = "synthetic";
+    public static final String ACC_ANNOTATION   = "@";
+    public static final String ACC_ENUM         = "enum";
+    public static final String ACC_MANDATED     = "mandated";
+//  public static final String ACC_CONSTRUCTOR  = "constructor";
+
+    public static final char PACKAGE_SEPARATOR     = '.';
+    public static final char INNER_CLASS_SEPARATOR = '.';
+    public static final char SPECIAL_CLASS_CHARACTER        = '-';
+    public static final char SPECIAL_MEMBER_SEPARATOR       = '$';
+
+    public static final char METHOD_ARGUMENTS_OPEN      = '(';
+    public static final char METHOD_ARGUMENTS_CLOSE     = ')';
+    public static final char METHOD_ARGUMENTS_SEPARATOR = ',';
+
+    public static final String TYPE_JAVA_LANG_OBJECT = "java.lang.Object";
+    public static final String PACKAGE_JAVA_LANG     = "java.lang.";
+
+    public static final String TYPE_VOID    = "void";
+    public static final String TYPE_BOOLEAN = "boolean";
+    public static final String TYPE_BYTE    = "byte";
+    public static final String TYPE_CHAR    = "char";
+    public static final String TYPE_SHORT   = "short";
+    public static final String TYPE_INT     = "int";
+    public static final String TYPE_FLOAT   = "float";
+    public static final String TYPE_LONG    = "long";
+    public static final String TYPE_DOUBLE  = "double";
+    public static final String TYPE_ARRAY   = "[]";
+}
\ No newline at end of file
diff --git a/src/proguard/classfile/LibraryClass.java b/src/proguard/classfile/LibraryClass.java
index 151a32a..3975677 100644
--- a/src/proguard/classfile/LibraryClass.java
+++ b/src/proguard/classfile/LibraryClass.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -74,7 +74,7 @@
      */
     boolean isVisible()
     {
-        return (u2accessFlags & ClassConstants.INTERNAL_ACC_PUBLIC) != 0;
+        return (u2accessFlags & ClassConstants.ACC_PUBLIC) != 0;
     }
 
 
@@ -137,6 +137,11 @@
     }
 
 
+    public String getRefClassName(int constantIndex)
+    {
+        throw new UnsupportedOperationException("Library class ["+thisClassName+"] doesn't store constant pool");
+    }
+
     public String getRefName(int constantIndex)
     {
         throw new UnsupportedOperationException("Library class ["+thisClassName+"] doesn't store constant pool");
@@ -505,12 +510,12 @@
     public boolean mayHaveImplementations(Method method)
     {
         return
-           (u2accessFlags & ClassConstants.INTERNAL_ACC_FINAL) == 0 &&
+           (u2accessFlags & ClassConstants.ACC_FINAL) == 0 &&
            (method == null ||
-            ((method.getAccessFlags() & (ClassConstants.INTERNAL_ACC_PRIVATE |
-                                         ClassConstants.INTERNAL_ACC_STATIC  |
-                                         ClassConstants.INTERNAL_ACC_FINAL)) == 0 &&
-                                                                                  !method.getName(this).equals(ClassConstants.INTERNAL_METHOD_NAME_INIT)));
+            ((method.getAccessFlags() & (ClassConstants.ACC_PRIVATE |
+                                         ClassConstants.ACC_STATIC  |
+                                         ClassConstants.ACC_FINAL)) == 0 &&
+             !method.getName(this).equals(ClassConstants.METHOD_NAME_INIT)));
     }
 
 
diff --git a/src/proguard/classfile/LibraryField.java b/src/proguard/classfile/LibraryField.java
index 1c1c427..2e28d37 100644
--- a/src/proguard/classfile/LibraryField.java
+++ b/src/proguard/classfile/LibraryField.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/LibraryMember.java b/src/proguard/classfile/LibraryMember.java
index 8d8d00e..1c27e1b 100644
--- a/src/proguard/classfile/LibraryMember.java
+++ b/src/proguard/classfile/LibraryMember.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -29,10 +29,6 @@
  */
 public abstract class LibraryMember implements Member
 {
-    private static final int ACC_VISIBLE = ClassConstants.INTERNAL_ACC_PUBLIC |
-                                           ClassConstants.INTERNAL_ACC_PROTECTED;
-
-
     public int    u2accessFlags;
     public String name;
     public String descriptor;
diff --git a/src/proguard/classfile/LibraryMethod.java b/src/proguard/classfile/LibraryMethod.java
index ac07857..0ef7b01 100644
--- a/src/proguard/classfile/LibraryMethod.java
+++ b/src/proguard/classfile/LibraryMethod.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/Member.java b/src/proguard/classfile/Member.java
index ee2cf19..d94cd80 100644
--- a/src/proguard/classfile/Member.java
+++ b/src/proguard/classfile/Member.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/Method.java b/src/proguard/classfile/Method.java
index 64ff50a..76eaf4f 100644
--- a/src/proguard/classfile/Method.java
+++ b/src/proguard/classfile/Method.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/ProgramClass.java b/src/proguard/classfile/ProgramClass.java
index 54bb8b1..b5d885c 100644
--- a/src/proguard/classfile/ProgramClass.java
+++ b/src/proguard/classfile/ProgramClass.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -170,6 +170,18 @@
     }
 
 
+    public String getRefClassName(int constantIndex)
+    {
+        try
+        {
+            return ((RefConstant)constantPool[constantIndex]).getClassName(this);
+        }
+        catch (ClassCastException ex)
+        {
+            throw ((IllegalStateException)new IllegalStateException("Expected RefConstant at index ["+constantIndex+"] in class ["+getName()+"]").initCause(ex));
+        }
+    }
+
     public String getRefName(int constantIndex)
     {
         try
@@ -519,12 +531,12 @@
     public boolean mayHaveImplementations(Method method)
     {
         return
-            (u2accessFlags & ClassConstants.INTERNAL_ACC_FINAL) == 0 &&
+            (u2accessFlags & ClassConstants.ACC_FINAL) == 0 &&
             (method == null ||
-             ((method.getAccessFlags() & (ClassConstants.INTERNAL_ACC_PRIVATE |
-                                          ClassConstants.INTERNAL_ACC_STATIC  |
-                                          ClassConstants.INTERNAL_ACC_FINAL)) == 0 &&
-              !method.getName(this).equals(ClassConstants.INTERNAL_METHOD_NAME_INIT)));
+             ((method.getAccessFlags() & (ClassConstants.ACC_PRIVATE |
+                                          ClassConstants.ACC_STATIC  |
+                                          ClassConstants.ACC_FINAL)) == 0 &&
+              !method.getName(this).equals(ClassConstants.METHOD_NAME_INIT)));
     }
 
 
diff --git a/src/proguard/classfile/ProgramField.java b/src/proguard/classfile/ProgramField.java
index 3bdfd85..c1ed101 100644
--- a/src/proguard/classfile/ProgramField.java
+++ b/src/proguard/classfile/ProgramField.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -20,8 +20,8 @@
  */
 package proguard.classfile;
 
-import proguard.classfile.attribute.visitor.AttributeVisitor;
 import proguard.classfile.attribute.Attribute;
+import proguard.classfile.attribute.visitor.AttributeVisitor;
 import proguard.classfile.visitor.*;
 
 /**
diff --git a/src/proguard/classfile/ProgramMember.java b/src/proguard/classfile/ProgramMember.java
index 240d344..6a9b1f2 100644
--- a/src/proguard/classfile/ProgramMember.java
+++ b/src/proguard/classfile/ProgramMember.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -21,7 +21,7 @@
 package proguard.classfile;
 
 
-import proguard.classfile.attribute.*;
+import proguard.classfile.attribute.Attribute;
 import proguard.classfile.attribute.visitor.AttributeVisitor;
 import proguard.classfile.visitor.MemberVisitor;
 
diff --git a/src/proguard/classfile/ProgramMethod.java b/src/proguard/classfile/ProgramMethod.java
index 26f793f..80e35e5 100644
--- a/src/proguard/classfile/ProgramMethod.java
+++ b/src/proguard/classfile/ProgramMethod.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -20,8 +20,8 @@
  */
 package proguard.classfile;
 
-import proguard.classfile.attribute.visitor.AttributeVisitor;
 import proguard.classfile.attribute.Attribute;
+import proguard.classfile.attribute.visitor.AttributeVisitor;
 import proguard.classfile.visitor.*;
 
 /**
diff --git a/src/proguard/classfile/VisitorAccepter.java b/src/proguard/classfile/VisitorAccepter.java
index 9c7a062..8fae922 100644
--- a/src/proguard/classfile/VisitorAccepter.java
+++ b/src/proguard/classfile/VisitorAccepter.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/Attribute.java b/src/proguard/classfile/attribute/Attribute.java
index f34a0ee..06845e0 100644
--- a/src/proguard/classfile/attribute/Attribute.java
+++ b/src/proguard/classfile/attribute/Attribute.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -84,7 +84,7 @@
      */
     public void accept(Clazz clazz, Field field, AttributeVisitor attributeVisitor)
     {
-        // Delegate the default invocation if the field is null anyway.
+        // Delegate to the default invocation if the field is null anyway.
         if (field == null)
         {
             accept(clazz, attributeVisitor);
@@ -100,7 +100,7 @@
      */
     public void accept(Clazz clazz, Method method, AttributeVisitor attributeVisitor)
     {
-        // Delegate the default invocation if the method is null anyway.
+        // Delegate to the default invocation if the method is null anyway.
         if (method == null)
         {
             accept(clazz, (Field)null, attributeVisitor);
@@ -116,7 +116,8 @@
      */
     public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, AttributeVisitor attributeVisitor)
     {
-        // Delegate the default invocation if the code attribute is null anyway.
+        // Delegate to the default invocation if the code attribute is null
+        // anyway.
         if (codeAttribute == null)
         {
             accept(clazz, method, attributeVisitor);
diff --git a/src/proguard/classfile/attribute/BootstrapMethodInfo.java b/src/proguard/classfile/attribute/BootstrapMethodInfo.java
index f246766..e819362 100755
--- a/src/proguard/classfile/attribute/BootstrapMethodInfo.java
+++ b/src/proguard/classfile/attribute/BootstrapMethodInfo.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/BootstrapMethodsAttribute.java b/src/proguard/classfile/attribute/BootstrapMethodsAttribute.java
index 4471a75..20b8965 100755
--- a/src/proguard/classfile/attribute/BootstrapMethodsAttribute.java
+++ b/src/proguard/classfile/attribute/BootstrapMethodsAttribute.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -20,9 +20,8 @@
  */
 package proguard.classfile.attribute;
 
-import proguard.classfile.*;
+import proguard.classfile.Clazz;
 import proguard.classfile.attribute.visitor.*;
-import proguard.classfile.constant.visitor.ConstantVisitor;
 
 /**
  * This Attribute represents a bootstrap methods attribute.
@@ -66,8 +65,7 @@
 
 
     /**
-     * Applies the given constant pool visitor to all bootstrap method info
-     * entries.
+     * Applies the given visitor to all bootstrap method info entries.
      */
     public void bootstrapMethodEntriesAccept(Clazz clazz, BootstrapMethodInfoVisitor bootstrapMethodInfoVisitor)
     {
@@ -81,8 +79,8 @@
 
 
     /**
-     * Applies the given constant pool visitor to the specified bootstrap method
-     * info entry.
+     * Applies the given visitor to the specified bootstrap method info
+     * entry.
      */
     public void bootstrapMethodEntryAccept(Clazz                      clazz,
                                            int                        bootstrapMethodIndex,
diff --git a/src/proguard/classfile/attribute/CodeAttribute.java b/src/proguard/classfile/attribute/CodeAttribute.java
index b3d4f4c..6bcaa0a 100644
--- a/src/proguard/classfile/attribute/CodeAttribute.java
+++ b/src/proguard/classfile/attribute/CodeAttribute.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/ConstantValueAttribute.java b/src/proguard/classfile/attribute/ConstantValueAttribute.java
index 056e377..b90f393 100644
--- a/src/proguard/classfile/attribute/ConstantValueAttribute.java
+++ b/src/proguard/classfile/attribute/ConstantValueAttribute.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/DeprecatedAttribute.java b/src/proguard/classfile/attribute/DeprecatedAttribute.java
index f668063..c1920e9 100644
--- a/src/proguard/classfile/attribute/DeprecatedAttribute.java
+++ b/src/proguard/classfile/attribute/DeprecatedAttribute.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/EnclosingMethodAttribute.java b/src/proguard/classfile/attribute/EnclosingMethodAttribute.java
index 1c2ecc4..8a31f03 100644
--- a/src/proguard/classfile/attribute/EnclosingMethodAttribute.java
+++ b/src/proguard/classfile/attribute/EnclosingMethodAttribute.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/ExceptionInfo.java b/src/proguard/classfile/attribute/ExceptionInfo.java
index 31512e5..2bb1118 100644
--- a/src/proguard/classfile/attribute/ExceptionInfo.java
+++ b/src/proguard/classfile/attribute/ExceptionInfo.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/ExceptionsAttribute.java b/src/proguard/classfile/attribute/ExceptionsAttribute.java
index ff7b84a..5ae5c3d 100644
--- a/src/proguard/classfile/attribute/ExceptionsAttribute.java
+++ b/src/proguard/classfile/attribute/ExceptionsAttribute.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/InnerClassesAttribute.java b/src/proguard/classfile/attribute/InnerClassesAttribute.java
index b08d104..f0c9e1e 100644
--- a/src/proguard/classfile/attribute/InnerClassesAttribute.java
+++ b/src/proguard/classfile/attribute/InnerClassesAttribute.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/InnerClassesInfo.java b/src/proguard/classfile/attribute/InnerClassesInfo.java
index 87b9de4..7a1eb67 100644
--- a/src/proguard/classfile/attribute/InnerClassesInfo.java
+++ b/src/proguard/classfile/attribute/InnerClassesInfo.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/LineNumberInfo.java b/src/proguard/classfile/attribute/LineNumberInfo.java
index 1bcacef..0dd527c 100644
--- a/src/proguard/classfile/attribute/LineNumberInfo.java
+++ b/src/proguard/classfile/attribute/LineNumberInfo.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/LineNumberTableAttribute.java b/src/proguard/classfile/attribute/LineNumberTableAttribute.java
index c217119..7bd3e00 100644
--- a/src/proguard/classfile/attribute/LineNumberTableAttribute.java
+++ b/src/proguard/classfile/attribute/LineNumberTableAttribute.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/LocalVariableInfo.java b/src/proguard/classfile/attribute/LocalVariableInfo.java
index 00bbd50..88035ce 100644
--- a/src/proguard/classfile/attribute/LocalVariableInfo.java
+++ b/src/proguard/classfile/attribute/LocalVariableInfo.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -76,6 +76,24 @@
 
 
     /**
+     * Returns the name.
+     */
+    public String getName(Clazz clazz)
+    {
+        return clazz.getString(u2nameIndex);
+    }
+
+
+    /**
+     * Returns the descriptor.
+     */
+    public String getDescriptor(Clazz clazz)
+    {
+        return clazz.getString(u2descriptorIndex);
+    }
+
+
+    /**
      * Lets the referenced class accept the given visitor.
      */
     public void referencedClassAccept(ClassVisitor classVisitor)
diff --git a/src/proguard/classfile/attribute/LocalVariableTableAttribute.java b/src/proguard/classfile/attribute/LocalVariableTableAttribute.java
index 9e081c0..a48e890 100644
--- a/src/proguard/classfile/attribute/LocalVariableTableAttribute.java
+++ b/src/proguard/classfile/attribute/LocalVariableTableAttribute.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/LocalVariableTypeInfo.java b/src/proguard/classfile/attribute/LocalVariableTypeInfo.java
index 15b9d24..c0fc405 100644
--- a/src/proguard/classfile/attribute/LocalVariableTypeInfo.java
+++ b/src/proguard/classfile/attribute/LocalVariableTypeInfo.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -77,6 +77,24 @@
 
 
     /**
+     * Returns the name.
+     */
+    public String getName(Clazz clazz)
+    {
+        return clazz.getString(u2nameIndex);
+    }
+
+
+    /**
+     * Returns the signature.
+     */
+    public String getSignature(Clazz clazz)
+    {
+        return clazz.getString(u2signatureIndex);
+    }
+
+
+    /**
      * Applies the given visitor to all referenced classes.
      */
     public void referencedClassesAccept(ClassVisitor classVisitor)
diff --git a/src/proguard/classfile/attribute/LocalVariableTypeTableAttribute.java b/src/proguard/classfile/attribute/LocalVariableTypeTableAttribute.java
index dda24fb..62643bc 100644
--- a/src/proguard/classfile/attribute/LocalVariableTypeTableAttribute.java
+++ b/src/proguard/classfile/attribute/LocalVariableTypeTableAttribute.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/MethodParametersAttribute.java b/src/proguard/classfile/attribute/MethodParametersAttribute.java
new file mode 100644
index 0000000..5e832d2
--- /dev/null
+++ b/src/proguard/classfile/attribute/MethodParametersAttribute.java
@@ -0,0 +1,80 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ *             of Java bytecode.
+ *
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+package proguard.classfile.attribute;
+
+import proguard.classfile.*;
+import proguard.classfile.attribute.visitor.*;
+
+/**
+ * This Attribute represents a method parameters attribute.
+ *
+ * @author Eric Lafortune
+ */
+public class MethodParametersAttribute extends Attribute
+{
+    public int             u1parametersCount;
+    public ParameterInfo[] parameters;
+
+
+    /**
+     * Creates an uninitialized MethodParametersAttribute.
+     */
+    public MethodParametersAttribute()
+    {
+    }
+
+
+    /**
+     * Creates an initialized MethodParametersAttribute.
+     */
+    public MethodParametersAttribute(int             u2attributeNameIndex,
+                                     int             u1parametersCount,
+                                     ParameterInfo[] parameters)
+    {
+        super(u2attributeNameIndex);
+
+        this.u1parametersCount = u1parametersCount;
+        this.parameters        = parameters;
+    }
+
+
+    // Implementations for Attribute.
+
+    public void accept(Clazz clazz, Method method, AttributeVisitor attributeVisitor)
+    {
+        attributeVisitor.visitMethodParametersAttribute(clazz, method, this);
+    }
+
+
+    /**
+     * Applies the given visitor to all parameters.
+     */
+    public void parametersAccept(Clazz clazz, Method method, ParameterInfoVisitor parameterInfoVisitor)
+    {
+        // Loop over all parameters.
+        for (int index = 0; index < u1parametersCount; index++)
+        {
+            // We don't need double dispatching here, since there is only one
+            // type of ParameterInfo.
+            parameterInfoVisitor.visitParameterInfo(clazz, method, index, parameters[index]);
+        }
+    }
+}
diff --git a/src/proguard/classfile/attribute/ParameterInfo.java b/src/proguard/classfile/attribute/ParameterInfo.java
new file mode 100644
index 0000000..dac5e1a
--- /dev/null
+++ b/src/proguard/classfile/attribute/ParameterInfo.java
@@ -0,0 +1,81 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ *             of Java bytecode.
+ *
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+package proguard.classfile.attribute;
+
+import proguard.classfile.*;
+
+/**
+ * Representation of a parameter, as defined in a method parameters
+ * attribute.
+ *
+ * @author Eric Lafortune
+ */
+public class ParameterInfo implements VisitorAccepter
+{
+    public int u2nameIndex;
+    public int u2accessFlags;
+
+    /**
+     * An extra field in which visitors can store information.
+     */
+    public Object visitorInfo;
+
+
+    /**
+     * Creates an uninitialized ParameterInfo.
+     */
+    public ParameterInfo()
+    {
+    }
+
+
+    /**
+     * Creates an initialized ParameterInfo.
+     */
+    public ParameterInfo(int u2nameIndex,
+                         int u2accessFlags)
+    {
+        this.u2nameIndex   = u2nameIndex;
+        this.u2accessFlags = u2accessFlags;
+    }
+
+
+    /**
+     * Returns the parameter name.
+     */
+    public String getName(Clazz clazz)
+    {
+        return clazz.getString(u2nameIndex);
+    }
+
+
+    // Implementations for VisitorAccepter.
+
+    public Object getVisitorInfo()
+    {
+        return visitorInfo;
+    }
+
+    public void setVisitorInfo(Object visitorInfo)
+    {
+        this.visitorInfo = visitorInfo;
+    }
+}
diff --git a/src/proguard/classfile/attribute/SignatureAttribute.java b/src/proguard/classfile/attribute/SignatureAttribute.java
index 86f95b8..120fa96 100644
--- a/src/proguard/classfile/attribute/SignatureAttribute.java
+++ b/src/proguard/classfile/attribute/SignatureAttribute.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -63,6 +63,15 @@
 
 
     /**
+     * Returns the signature.
+     */
+    public String getSignature(Clazz clazz)
+    {
+        return clazz.getString(u2signatureIndex);
+    }
+
+
+    /**
      * Lets the Clazz objects referenced in the signature string accept the
      * given visitor.
      */
diff --git a/src/proguard/classfile/attribute/SourceDirAttribute.java b/src/proguard/classfile/attribute/SourceDirAttribute.java
index faa1c79..100c840 100644
--- a/src/proguard/classfile/attribute/SourceDirAttribute.java
+++ b/src/proguard/classfile/attribute/SourceDirAttribute.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/SourceFileAttribute.java b/src/proguard/classfile/attribute/SourceFileAttribute.java
index 4abac17..e10b784 100644
--- a/src/proguard/classfile/attribute/SourceFileAttribute.java
+++ b/src/proguard/classfile/attribute/SourceFileAttribute.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/SyntheticAttribute.java b/src/proguard/classfile/attribute/SyntheticAttribute.java
index 0135330..a308545 100644
--- a/src/proguard/classfile/attribute/SyntheticAttribute.java
+++ b/src/proguard/classfile/attribute/SyntheticAttribute.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/UnknownAttribute.java b/src/proguard/classfile/attribute/UnknownAttribute.java
index 182a9e8..f928f25 100644
--- a/src/proguard/classfile/attribute/UnknownAttribute.java
+++ b/src/proguard/classfile/attribute/UnknownAttribute.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -32,15 +32,17 @@
 public class UnknownAttribute extends Attribute
 {
     public final int    u4attributeLength;
-    public byte[] info;
+    public       byte[] info;
 
 
     /**
-     * Creates an uninitialized UnknownAttribute with the given length.
+     * Creates an uninitialized UnknownAttribute with the specified name and
+     * length.
      */
-    public UnknownAttribute(int attributeLength)
+    public UnknownAttribute(int u2attributeNameIndex,
+                            int attributeLength)
     {
-        u4attributeLength = attributeLength;
+        this(u2attributeNameIndex, attributeLength, null);
     }
 
 
diff --git a/src/proguard/classfile/attribute/annotation/Annotation.java b/src/proguard/classfile/attribute/annotation/Annotation.java
index b2f18d5..3e24a9e 100644
--- a/src/proguard/classfile/attribute/annotation/Annotation.java
+++ b/src/proguard/classfile/attribute/annotation/Annotation.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/annotation/AnnotationDefaultAttribute.java b/src/proguard/classfile/attribute/annotation/AnnotationDefaultAttribute.java
index b8f29cc..1b06e82 100644
--- a/src/proguard/classfile/attribute/annotation/AnnotationDefaultAttribute.java
+++ b/src/proguard/classfile/attribute/annotation/AnnotationDefaultAttribute.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/annotation/AnnotationElementValue.java b/src/proguard/classfile/attribute/annotation/AnnotationElementValue.java
index 8354f5d..1e6365c 100644
--- a/src/proguard/classfile/attribute/annotation/AnnotationElementValue.java
+++ b/src/proguard/classfile/attribute/annotation/AnnotationElementValue.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/annotation/AnnotationsAttribute.java b/src/proguard/classfile/attribute/annotation/AnnotationsAttribute.java
index a936ff4..dcb7cf6 100644
--- a/src/proguard/classfile/attribute/annotation/AnnotationsAttribute.java
+++ b/src/proguard/classfile/attribute/annotation/AnnotationsAttribute.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -21,7 +21,7 @@
 package proguard.classfile.attribute.annotation;
 
 import proguard.classfile.*;
-import proguard.classfile.attribute.Attribute;
+import proguard.classfile.attribute.*;
 import proguard.classfile.attribute.annotation.visitor.AnnotationVisitor;
 
 /**
@@ -44,7 +44,7 @@
 
 
     /**
-     * Creates an initialized AnnotationsAttribute. 
+     * Creates an initialized AnnotationsAttribute.
      */
     protected AnnotationsAttribute(int          u2attributeNameIndex,
                                    int          u2annotationsCount,
@@ -97,4 +97,18 @@
             annotationVisitor.visitAnnotation(clazz, method, annotations[index]);
         }
     }
+
+
+    /**
+     * Applies the given visitor to all code attribute annotations.
+     */
+    public void annotationsAccept(Clazz clazz, Method method, CodeAttribute codeAttribute, AnnotationVisitor annotationVisitor)
+    {
+        for (int index = 0; index < u2annotationsCount; index++)
+        {
+            // We don't need double dispatching here, since there is only one
+            // type of Annotation.
+            annotationVisitor.visitAnnotation(clazz, method, codeAttribute, annotations[index]);
+        }
+    }
 }
diff --git a/src/proguard/classfile/attribute/annotation/ArrayElementValue.java b/src/proguard/classfile/attribute/annotation/ArrayElementValue.java
index 0aab49b..4d814c0 100644
--- a/src/proguard/classfile/attribute/annotation/ArrayElementValue.java
+++ b/src/proguard/classfile/attribute/annotation/ArrayElementValue.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/annotation/ClassElementValue.java b/src/proguard/classfile/attribute/annotation/ClassElementValue.java
index ffeaf71..0e5de1e 100644
--- a/src/proguard/classfile/attribute/annotation/ClassElementValue.java
+++ b/src/proguard/classfile/attribute/annotation/ClassElementValue.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -63,6 +63,15 @@
 
 
     /**
+     * Returns the class info name.
+     */
+    public String getClassName(Clazz clazz)
+    {
+        return clazz.getString(u2classInfoIndex);
+    }
+
+
+    /**
      * Applies the given visitor to all referenced classes.
      */
     public void referencedClassesAccept(ClassVisitor classVisitor)
diff --git a/src/proguard/classfile/attribute/annotation/ConstantElementValue.java b/src/proguard/classfile/attribute/annotation/ConstantElementValue.java
index 8be4329..5ff51db 100644
--- a/src/proguard/classfile/attribute/annotation/ConstantElementValue.java
+++ b/src/proguard/classfile/attribute/annotation/ConstantElementValue.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/annotation/ElementValue.java b/src/proguard/classfile/attribute/annotation/ElementValue.java
index 19a7198..9c0f2c9 100644
--- a/src/proguard/classfile/attribute/annotation/ElementValue.java
+++ b/src/proguard/classfile/attribute/annotation/ElementValue.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/annotation/EnumConstantElementValue.java b/src/proguard/classfile/attribute/annotation/EnumConstantElementValue.java
index cd0f2f9..1105100 100644
--- a/src/proguard/classfile/attribute/annotation/EnumConstantElementValue.java
+++ b/src/proguard/classfile/attribute/annotation/EnumConstantElementValue.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/annotation/ParameterAnnotationsAttribute.java b/src/proguard/classfile/attribute/annotation/ParameterAnnotationsAttribute.java
index ddaa3a6..4b0cb1c 100644
--- a/src/proguard/classfile/attribute/annotation/ParameterAnnotationsAttribute.java
+++ b/src/proguard/classfile/attribute/annotation/ParameterAnnotationsAttribute.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -25,13 +25,13 @@
 import proguard.classfile.attribute.annotation.visitor.AnnotationVisitor;
 
 /**
- * This Attribute represents a runtime parameter annotations attribute.
+ * This Attribute represents a parameter annotations attribute.
  *
  * @author Eric Lafortune
  */
 public abstract class ParameterAnnotationsAttribute extends Attribute
 {
-    public int            u2parametersCount;
+    public int            u1parametersCount;
     public int[]          u2parameterAnnotationsCount;
     public Annotation[][] parameterAnnotations;
 
@@ -48,13 +48,13 @@
      * Creates an initialized ParameterAnnotationsAttribute.
      */
     protected ParameterAnnotationsAttribute(int            u2attributeNameIndex,
-                                            int            u2parametersCount,
+                                            int            u1parametersCount,
                                             int[]          u2parameterAnnotationsCount,
                                             Annotation[][] parameterAnnotations)
     {
         super(u2attributeNameIndex);
 
-        this.u2parametersCount           = u2parametersCount;
+        this.u1parametersCount           = u1parametersCount;
         this.u2parameterAnnotationsCount = u2parameterAnnotationsCount;
         this.parameterAnnotations        = parameterAnnotations;
     }
@@ -66,7 +66,7 @@
     public void annotationsAccept(Clazz clazz, Method method, AnnotationVisitor annotationVisitor)
     {
         // Loop over all parameters.
-        for (int parameterIndex = 0; parameterIndex < u2parametersCount; parameterIndex++)
+        for (int parameterIndex = 0; parameterIndex < u1parametersCount; parameterIndex++)
         {
             int          annotationsCount = u2parameterAnnotationsCount[parameterIndex];
             Annotation[] annotations      = parameterAnnotations[parameterIndex];
diff --git a/src/proguard/classfile/attribute/annotation/RuntimeInvisibleAnnotationsAttribute.java b/src/proguard/classfile/attribute/annotation/RuntimeInvisibleAnnotationsAttribute.java
index deda8a5..84d9d61 100644
--- a/src/proguard/classfile/attribute/annotation/RuntimeInvisibleAnnotationsAttribute.java
+++ b/src/proguard/classfile/attribute/annotation/RuntimeInvisibleAnnotationsAttribute.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/annotation/RuntimeInvisibleParameterAnnotationsAttribute.java b/src/proguard/classfile/attribute/annotation/RuntimeInvisibleParameterAnnotationsAttribute.java
index 2fcae88..0a5e1d7 100644
--- a/src/proguard/classfile/attribute/annotation/RuntimeInvisibleParameterAnnotationsAttribute.java
+++ b/src/proguard/classfile/attribute/annotation/RuntimeInvisibleParameterAnnotationsAttribute.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -42,12 +42,12 @@
      * Creates an initialized RuntimeInvisibleParameterAnnotationsAttribute.
      */
     public RuntimeInvisibleParameterAnnotationsAttribute(int            u2attributeNameIndex,
-                                                         int            u2parametersCount,
+                                                         int            u1parametersCount,
                                                          int[]          u2parameterAnnotationsCount,
                                                          Annotation[][] parameterAnnotations)
     {
         super(u2attributeNameIndex,
-              u2parametersCount,
+              u1parametersCount,
               u2parameterAnnotationsCount,
               parameterAnnotations);
     }
diff --git a/src/proguard/classfile/attribute/annotation/RuntimeInvisibleTypeAnnotationsAttribute.java b/src/proguard/classfile/attribute/annotation/RuntimeInvisibleTypeAnnotationsAttribute.java
new file mode 100644
index 0000000..2e1ca95
--- /dev/null
+++ b/src/proguard/classfile/attribute/annotation/RuntimeInvisibleTypeAnnotationsAttribute.java
@@ -0,0 +1,77 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ *             of Java bytecode.
+ *
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+package proguard.classfile.attribute.annotation;
+
+import proguard.classfile.*;
+import proguard.classfile.attribute.CodeAttribute;
+import proguard.classfile.attribute.visitor.AttributeVisitor;
+
+/**
+ * This Attribute represents a runtime invisible type annotations attribute.
+ *
+ * @author Eric Lafortune
+ */
+public class RuntimeInvisibleTypeAnnotationsAttribute extends TypeAnnotationsAttribute
+{
+    /**
+     * Creates an uninitialized RuntimeInvisibleTypeAnnotationsAttribute.
+     */
+    public RuntimeInvisibleTypeAnnotationsAttribute()
+    {
+    }
+
+
+    /**
+     * Creates an initialized RuntimeInvisibleTypeAnnotationsAttribute.
+     */
+    public RuntimeInvisibleTypeAnnotationsAttribute(int              u2attributeNameIndex,
+                                                    int              u2annotationsCount,
+                                                    TypeAnnotation[] annotations)
+    {
+        super(u2attributeNameIndex, u2annotationsCount, annotations);
+    }
+
+
+    // Implementations for Attribute.
+
+    public void accept(Clazz clazz, AttributeVisitor attributeVisitor)
+    {
+        attributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, this);
+    }
+
+
+    public void accept(Clazz clazz, Field field, AttributeVisitor attributeVisitor)
+    {
+        attributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, field, this);
+    }
+
+
+    public void accept(Clazz clazz, Method method, AttributeVisitor attributeVisitor)
+    {
+        attributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, method, this);
+    }
+
+
+    public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, AttributeVisitor attributeVisitor)
+    {
+        attributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, method, codeAttribute, this);
+    }
+}
diff --git a/src/proguard/classfile/attribute/annotation/RuntimeVisibleAnnotationsAttribute.java b/src/proguard/classfile/attribute/annotation/RuntimeVisibleAnnotationsAttribute.java
index da94f0c..89acf04 100644
--- a/src/proguard/classfile/attribute/annotation/RuntimeVisibleAnnotationsAttribute.java
+++ b/src/proguard/classfile/attribute/annotation/RuntimeVisibleAnnotationsAttribute.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/annotation/RuntimeVisibleParameterAnnotationsAttribute.java b/src/proguard/classfile/attribute/annotation/RuntimeVisibleParameterAnnotationsAttribute.java
index caa6830..cc273c2 100644
--- a/src/proguard/classfile/attribute/annotation/RuntimeVisibleParameterAnnotationsAttribute.java
+++ b/src/proguard/classfile/attribute/annotation/RuntimeVisibleParameterAnnotationsAttribute.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -42,12 +42,12 @@
      * Creates an initialized RuntimeVisibleParameterAnnotationsAttribute.
      */
     public RuntimeVisibleParameterAnnotationsAttribute(int            u2attributeNameIndex,
-                                                       int            u2parametersCount,
+                                                       int            u1parametersCount,
                                                        int[]          u2parameterAnnotationsCount,
                                                        Annotation[][] parameterAnnotations)
     {
         super(u2attributeNameIndex,
-              u2parametersCount,
+              u1parametersCount,
               u2parameterAnnotationsCount,
               parameterAnnotations);
     }
diff --git a/src/proguard/classfile/attribute/annotation/RuntimeVisibleTypeAnnotationsAttribute.java b/src/proguard/classfile/attribute/annotation/RuntimeVisibleTypeAnnotationsAttribute.java
new file mode 100644
index 0000000..084827a
--- /dev/null
+++ b/src/proguard/classfile/attribute/annotation/RuntimeVisibleTypeAnnotationsAttribute.java
@@ -0,0 +1,77 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ *             of Java bytecode.
+ *
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+package proguard.classfile.attribute.annotation;
+
+import proguard.classfile.*;
+import proguard.classfile.attribute.CodeAttribute;
+import proguard.classfile.attribute.visitor.AttributeVisitor;
+
+/**
+ * This Attribute represents a runtime visible type annotations attribute.
+ *
+ * @author Eric Lafortune
+ */
+public class RuntimeVisibleTypeAnnotationsAttribute extends TypeAnnotationsAttribute
+{
+    /**
+     * Creates an uninitialized RuntimeVisibleTypeAnnotationsAttribute.
+     */
+    public RuntimeVisibleTypeAnnotationsAttribute()
+    {
+    }
+
+
+    /**
+     * Creates an initialized RuntimeVisibleTypeAnnotationsAttribute.
+     */
+    public RuntimeVisibleTypeAnnotationsAttribute(int              u2attributeNameIndex,
+                                                  int              u2annotationsCount,
+                                                  TypeAnnotation[] annotations)
+    {
+        super(u2attributeNameIndex, u2annotationsCount, annotations);
+    }
+
+
+    // Implementations for Attribute.
+
+    public void accept(Clazz clazz, AttributeVisitor attributeVisitor)
+    {
+        attributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, this);
+    }
+
+
+    public void accept(Clazz clazz, Field field, AttributeVisitor attributeVisitor)
+    {
+        attributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, field, this);
+    }
+
+
+    public void accept(Clazz clazz, Method method, AttributeVisitor attributeVisitor)
+    {
+        attributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, method, this);
+    }
+
+
+    public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, AttributeVisitor attributeVisitor)
+    {
+        attributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, method, codeAttribute, this);
+    }
+}
diff --git a/src/proguard/classfile/attribute/annotation/TypeAnnotation.java b/src/proguard/classfile/attribute/annotation/TypeAnnotation.java
new file mode 100644
index 0000000..86e4ddf
--- /dev/null
+++ b/src/proguard/classfile/attribute/annotation/TypeAnnotation.java
@@ -0,0 +1,162 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ *             of Java bytecode.
+ *
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+package proguard.classfile.attribute.annotation;
+
+import proguard.classfile.*;
+import proguard.classfile.attribute.CodeAttribute;
+import proguard.classfile.attribute.annotation.target.TargetInfo;
+import proguard.classfile.attribute.annotation.target.visitor.TargetInfoVisitor;
+import proguard.classfile.attribute.annotation.visitor.*;
+
+/**
+ * Representation of a type annotation.
+ *
+ * @author Eric Lafortune
+ */
+public class TypeAnnotation extends Annotation
+{
+    public TargetInfo     targetInfo;
+    public TypePathInfo[] typePath;
+
+
+    /**
+     * Creates an uninitialized TypeAnnotation.
+     */
+    public TypeAnnotation()
+    {
+    }
+
+
+    /**
+     * Creates an initialized TypeAnnotation.
+     */
+    public TypeAnnotation(int            u2typeIndex,
+                          int            u2elementValuesCount,
+                          ElementValue[] elementValues,
+                          TargetInfo     targetInfo,
+                          TypePathInfo[] typePath)
+    {
+        super(u2typeIndex, u2elementValuesCount, elementValues);
+
+        this.targetInfo = targetInfo;
+        this.typePath   = typePath;
+    }
+
+
+    /**
+     * Applies the given visitor to the target info.
+     */
+    public void targetInfoAccept(Clazz clazz, TargetInfoVisitor targetInfoVisitor)
+    {
+        // We don't need double dispatching here, since there is only one
+        // type of TypePathInfo.
+        targetInfo.accept(clazz, this, targetInfoVisitor);
+    }
+
+
+    /**
+     * Applies the given visitor to the target info.
+     */
+    public void targetInfoAccept(Clazz clazz, Field field, TargetInfoVisitor targetInfoVisitor)
+    {
+        // We don't need double dispatching here, since there is only one
+        // type of TypePathInfo.
+        targetInfo.accept(clazz, field, this, targetInfoVisitor);
+    }
+
+
+    /**
+     * Applies the given visitor to the target info.
+     */
+    public void targetInfoAccept(Clazz clazz, Method method, TargetInfoVisitor targetInfoVisitor)
+    {
+        // We don't need double dispatching here, since there is only one
+        // type of TypePathInfo.
+        targetInfo.accept(clazz, method, this, targetInfoVisitor);
+    }
+
+
+    /**
+     * Applies the given visitor to the target info.
+     */
+    public void targetInfoAccept(Clazz clazz, Method method, CodeAttribute codeAttribute, TargetInfoVisitor targetInfoVisitor)
+    {
+        // We don't need double dispatching here, since there is only one
+        // type of TypePathInfo.
+        targetInfo.accept(clazz, method, codeAttribute, this, targetInfoVisitor);
+    }
+
+
+    /**
+     * Applies the given visitor to all type path elements.
+     */
+    public void typePathInfosAccept(Clazz clazz, TypePathInfoVisitor typePathVisitor)
+    {
+        for (int index = 0; index < typePath.length; index++)
+        {
+            // We don't need double dispatching here, since there is only one
+            // type of TypePathInfo.
+            typePathVisitor.visitTypePathInfo(clazz, this, typePath[index]);
+        }
+    }
+
+
+    /**
+     * Applies the given visitor to all type path elements.
+     */
+    public void typePathInfosAccept(Clazz clazz, Field field, TypePathInfoVisitor typePathVisitor)
+    {
+        for (int index = 0; index < typePath.length; index++)
+        {
+            // We don't need double dispatching here, since there is only one
+            // type of TypePathInfo.
+            typePathVisitor.visitTypePathInfo(clazz, field, this, typePath[index]);
+        }
+    }
+
+
+    /**
+     * Applies the given visitor to all type path elements.
+     */
+    public void typePathInfosAccept(Clazz clazz, Method method, TypePathInfoVisitor typePathVisitor)
+    {
+        for (int index = 0; index < typePath.length; index++)
+        {
+            // We don't need double dispatching here, since there is only one
+            // type of TypePathInfo.
+            typePathVisitor.visitTypePathInfo(clazz, method, this, typePath[index]);
+        }
+    }
+
+
+    /**
+     * Applies the given visitor to all type path elements.
+     */
+    public void typePathInfosAccept(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, TypePathInfoVisitor typePathVisitor)
+    {
+        for (int index = 0; index < typePath.length; index++)
+        {
+            // We don't need double dispatching here, since there is only one
+            // type of TypePathInfo.
+            typePathVisitor.visitTypePathInfo(clazz, method, codeAttribute, typeAnnotation, typePath[index]);
+        }
+    }
+}
diff --git a/src/proguard/classfile/attribute/annotation/TypeAnnotationsAttribute.java b/src/proguard/classfile/attribute/annotation/TypeAnnotationsAttribute.java
new file mode 100644
index 0000000..7606e05
--- /dev/null
+++ b/src/proguard/classfile/attribute/annotation/TypeAnnotationsAttribute.java
@@ -0,0 +1,98 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ *             of Java bytecode.
+ *
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+package proguard.classfile.attribute.annotation;
+
+import proguard.classfile.*;
+import proguard.classfile.attribute.annotation.visitor.*;
+
+/**
+ * This Attribute represents a type annotations attribute.
+ *
+ * @author Eric Lafortune
+ */
+public abstract class TypeAnnotationsAttribute extends AnnotationsAttribute
+{
+    /**
+     * Creates an uninitialized TypeAnnotationsAttribute.
+     */
+    protected TypeAnnotationsAttribute()
+    {
+    }
+
+
+    /**
+     * Creates an initialized TypeAnnotationsAttribute.
+     */
+    protected TypeAnnotationsAttribute(int              u2attributeNameIndex,
+                                       int              u2annotationsCount,
+                                       TypeAnnotation[] annotations)
+    {
+        super(u2attributeNameIndex, u2annotationsCount, annotations);
+    }
+
+
+    /**
+     * Applies the given visitor to all class annotations.
+     */
+    public void typeAnnotationsAccept(Clazz clazz, TypeAnnotationVisitor typeAnnotationVisitor)
+    {
+        TypeAnnotation[] annotations = (TypeAnnotation[])this.annotations;
+
+        for (int index = 0; index < u2annotationsCount; index++)
+        {
+            // We don't need double dispatching here, since there is only one
+            // type of Annotation.
+            typeAnnotationVisitor.visitTypeAnnotation(clazz, annotations[index]);
+        }
+    }
+
+
+    /**
+     * Applies the given visitor to all field annotations.
+     */
+    public void typeAnnotationsAccept(Clazz clazz, Field field, TypeAnnotationVisitor typeAnnotationVisitor)
+    {
+        TypeAnnotation[] annotations = (TypeAnnotation[])this.annotations;
+
+        for (int index = 0; index < u2annotationsCount; index++)
+        {
+            // We don't need double dispatching here, since there is only one
+            // type of Annotation.
+            typeAnnotationVisitor.visitTypeAnnotation(clazz, field, annotations[index]);
+        }
+    }
+
+
+    /**
+     * Applies the given visitor to all method annotations.
+     */
+    public void typeAnnotationsAccept(Clazz clazz, Method method, TypeAnnotationVisitor typeAnnotationVisitor)
+    {
+        TypeAnnotation[] annotations = (TypeAnnotation[])this.annotations;
+
+        for (int index = 0; index < u2annotationsCount; index++)
+        {
+            // We don't need double dispatching here, since there is only one
+            // type of Annotation.
+            typeAnnotationVisitor.visitTypeAnnotation(clazz, method, annotations[index]);
+        }
+    }
+}
diff --git a/src/proguard/classfile/attribute/annotation/TypePathInfo.java b/src/proguard/classfile/attribute/annotation/TypePathInfo.java
new file mode 100644
index 0000000..9b40f7c
--- /dev/null
+++ b/src/proguard/classfile/attribute/annotation/TypePathInfo.java
@@ -0,0 +1,50 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ *             of Java bytecode.
+ *
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+package proguard.classfile.attribute.annotation;
+
+/**
+ * Representation of a path element in a type annotation.
+ *
+ * @author Eric Lafortune
+ */
+public class TypePathInfo
+{
+    public int u1typePathKind;
+    public int u1typeArgumentIndex;
+
+
+    /**
+     * Creates an uninitialized TypePathInfo.
+     */
+    public TypePathInfo()
+    {
+    }
+
+
+    /**
+     * Creates an initialized TypePathInfo.
+     */
+    public TypePathInfo(int u1typePathKind, int u1typeArgumentIndex)
+    {
+        this.u1typePathKind      = u1typePathKind;
+        this.u1typeArgumentIndex = u1typeArgumentIndex;
+    }
+}
diff --git a/src/proguard/classfile/attribute/annotation/target/CatchTargetInfo.java b/src/proguard/classfile/attribute/annotation/target/CatchTargetInfo.java
new file mode 100644
index 0000000..9421b9c
--- /dev/null
+++ b/src/proguard/classfile/attribute/annotation/target/CatchTargetInfo.java
@@ -0,0 +1,82 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ *             of Java bytecode.
+ *
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+package proguard.classfile.attribute.annotation.target;
+
+import proguard.classfile.*;
+import proguard.classfile.attribute.CodeAttribute;
+import proguard.classfile.attribute.annotation.TypeAnnotation;
+import proguard.classfile.attribute.annotation.target.visitor.TargetInfoVisitor;
+
+/**
+ * Representation of a 'catch' annotation target.
+ *
+ * @author Eric Lafortune
+ */
+public class CatchTargetInfo extends TargetInfo
+{
+    public int u2exceptionTableIndex;
+
+
+    /**
+     * Creates an uninitialized CatchTargetInfo.
+     */
+    public CatchTargetInfo()
+    {
+    }
+
+
+    /**
+     * Creates a partially initialized CatchTargetInfo.
+     */
+    public CatchTargetInfo(byte u1targetType)
+    {
+        super(u1targetType);
+    }
+
+
+    /**
+     * Creates an initialized CatchTargetInfo.
+     */
+    protected CatchTargetInfo(byte u1targetType,
+                              int  u2exceptionTableIndex)
+    {
+        super(u1targetType);
+
+        this.u2exceptionTableIndex = u2exceptionTableIndex;
+    }
+
+
+    // Implementations for TargetInfo.
+
+    /**
+     * Lets the visitor visit, with Method and CodeAttribute null.
+     */
+    public void accept(Clazz clazz, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor)
+    {
+        targetInfoVisitor.visitCatchTargetInfo(clazz, null, null, typeAnnotation, this);
+    }
+
+
+    public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor)
+    {
+        targetInfoVisitor.visitCatchTargetInfo(clazz, method, codeAttribute, typeAnnotation, this);
+    }
+}
diff --git a/src/proguard/classfile/attribute/annotation/target/EmptyTargetInfo.java b/src/proguard/classfile/attribute/annotation/target/EmptyTargetInfo.java
new file mode 100644
index 0000000..fb0d794
--- /dev/null
+++ b/src/proguard/classfile/attribute/annotation/target/EmptyTargetInfo.java
@@ -0,0 +1,72 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ *             of Java bytecode.
+ *
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+package proguard.classfile.attribute.annotation.target;
+
+import proguard.classfile.*;
+import proguard.classfile.attribute.annotation.TypeAnnotation;
+import proguard.classfile.attribute.annotation.target.visitor.TargetInfoVisitor;
+
+/**
+ * Representation of an empty annotation target.
+ *
+ * @author Eric Lafortune
+ */
+public class EmptyTargetInfo extends TargetInfo
+{
+    /**
+     * Creates an uninitialized EmptyTargetInfo.
+     */
+    public EmptyTargetInfo()
+    {
+    }
+
+
+    /**
+     * Creates an initialized EmptyTargetInfo.
+     */
+    public EmptyTargetInfo(byte u1targetType)
+    {
+        super(u1targetType);
+    }
+
+
+    // Implementations for TargetInfo.
+
+    /**
+     * Lets the visitor visit, with Field null.
+     */
+    public void accept(Clazz clazz, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor)
+    {
+        targetInfoVisitor.visitEmptyTargetInfo(clazz, (Field)null, typeAnnotation, this);
+    }
+
+
+    public void accept(Clazz clazz, Field field, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor)
+    {
+        targetInfoVisitor.visitEmptyTargetInfo(clazz, field, typeAnnotation, this);
+    }
+
+
+    public void accept(Clazz clazz, Method method, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor)
+    {
+        targetInfoVisitor.visitEmptyTargetInfo(clazz, method, typeAnnotation, this);
+    }
+}
diff --git a/src/proguard/classfile/attribute/annotation/target/FormalParameterTargetInfo.java b/src/proguard/classfile/attribute/annotation/target/FormalParameterTargetInfo.java
new file mode 100644
index 0000000..04bd9c5
--- /dev/null
+++ b/src/proguard/classfile/attribute/annotation/target/FormalParameterTargetInfo.java
@@ -0,0 +1,81 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ *             of Java bytecode.
+ *
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+package proguard.classfile.attribute.annotation.target;
+
+import proguard.classfile.*;
+import proguard.classfile.attribute.annotation.TypeAnnotation;
+import proguard.classfile.attribute.annotation.target.visitor.TargetInfoVisitor;
+
+/**
+ * Representation of a formal parameter annotation target.
+ *
+ * @author Eric Lafortune
+ */
+public class FormalParameterTargetInfo extends TargetInfo
+{
+    public int u1formalParameterIndex;
+
+
+    /**
+     * Creates an uninitialized FormalParameterTargetInfo.
+     */
+    public FormalParameterTargetInfo()
+    {
+    }
+
+
+    /**
+     * Creates a partially initialized FormalParameterTargetInfo.
+     */
+    public FormalParameterTargetInfo(byte u1targetType)
+    {
+        super(u1targetType);
+    }
+
+
+    /**
+     * Creates an initialized FormalParameterTargetInfo.
+     */
+    public FormalParameterTargetInfo(byte u1targetType,
+                                     int  u1formalParameterIndex)
+    {
+        super(u1targetType);
+
+        this.u1formalParameterIndex = u1formalParameterIndex;
+    }
+
+
+    // Implementations for TargetInfo.
+
+    /**
+     * Lets the visitor visit, with Method null.
+     */
+    public void accept(Clazz clazz, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor)
+    {
+        targetInfoVisitor.visitFormalParameterTargetInfo(clazz, null, typeAnnotation, this);
+    }
+
+
+    public void accept(Clazz clazz, Method method, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor)
+    {
+        targetInfoVisitor.visitFormalParameterTargetInfo(clazz, method, typeAnnotation, this);
+    }
+}
diff --git a/src/proguard/classfile/attribute/annotation/target/LocalVariableTargetElement.java b/src/proguard/classfile/attribute/annotation/target/LocalVariableTargetElement.java
new file mode 100644
index 0000000..bcf41dc
--- /dev/null
+++ b/src/proguard/classfile/attribute/annotation/target/LocalVariableTargetElement.java
@@ -0,0 +1,53 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ *             of Java bytecode.
+ *
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+package proguard.classfile.attribute.annotation.target;
+
+/**
+ * Representation of an local variable target table entry.
+ *
+ * @author Eric Lafortune
+ */
+public class LocalVariableTargetElement
+{
+    public int u2startPC;
+    public int u2length;
+    public int u2index;
+
+    /**
+     * Creates an uninitialized LocalVariableTargetElement.
+     */
+    public LocalVariableTargetElement()
+    {
+    }
+
+
+    /**
+     * Creates an initialized LocalVariableTargetElement.
+     */
+    public LocalVariableTargetElement(int u2startPC,
+                                      int u2length,
+                                      int u2index)
+    {
+        this.u2startPC = u2startPC;
+        this.u2length  = u2length;
+        this.u2index   = u2index;
+    }
+}
diff --git a/src/proguard/classfile/attribute/annotation/target/LocalVariableTargetInfo.java b/src/proguard/classfile/attribute/annotation/target/LocalVariableTargetInfo.java
new file mode 100644
index 0000000..dd9246c
--- /dev/null
+++ b/src/proguard/classfile/attribute/annotation/target/LocalVariableTargetInfo.java
@@ -0,0 +1,99 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ *             of Java bytecode.
+ *
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+package proguard.classfile.attribute.annotation.target;
+
+import proguard.classfile.*;
+import proguard.classfile.attribute.CodeAttribute;
+import proguard.classfile.attribute.annotation.TypeAnnotation;
+import proguard.classfile.attribute.annotation.target.visitor.*;
+
+/**
+ * Representation of a local variable annotation target.
+ *
+ * @author Eric Lafortune
+ */
+public class LocalVariableTargetInfo extends TargetInfo
+{
+    public int                          u2tableLength;
+    public LocalVariableTargetElement[] table;
+
+
+    /**
+     * Creates an uninitialized LocalVariableTargetInfo.
+     */
+    public LocalVariableTargetInfo()
+    {
+    }
+
+
+    /**
+     * Creates a partially initialized LocalVariableTargetInfo.
+     */
+    public LocalVariableTargetInfo(byte u1targetType)
+    {
+        super(u1targetType);
+    }
+
+
+    /**
+     * Creates an initialized LocalVariableTargetInfo.
+     */
+    protected LocalVariableTargetInfo(byte                         u1targetType,
+                                      int                          u2tableLength,
+                                      LocalVariableTargetElement[] table)
+    {
+        super(u1targetType);
+
+        this.u2tableLength = u2tableLength;
+        this.table         = table;
+    }
+
+
+    /**
+     * Applies the given visitor to all target elements.
+     */
+    public void targetElementsAccept(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, LocalVariableTargetElementVisitor localVariableTargetElementVisitor)
+    {
+        for (int index = 0; index < u2tableLength; index++)
+        {
+            // We don't need double dispatching here, since there is only one
+            // type of TypePathInfo.
+            localVariableTargetElementVisitor.visitLocalVariableTargetElement(clazz, method, codeAttribute, typeAnnotation, this, table[index]);
+        }
+    }
+
+
+    // Implementations for TargetInfo.
+
+    /**
+     * Lets the visitor visit, with Method and CodeAttribute null.
+     */
+    public void accept(Clazz clazz, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor)
+    {
+        targetInfoVisitor.visitLocalVariableTargetInfo(clazz, null, null, typeAnnotation, this);
+    }
+
+
+    public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor)
+    {
+        targetInfoVisitor.visitLocalVariableTargetInfo(clazz, method, codeAttribute, typeAnnotation, this);
+    }
+}
diff --git a/src/proguard/classfile/attribute/annotation/target/OffsetTargetInfo.java b/src/proguard/classfile/attribute/annotation/target/OffsetTargetInfo.java
new file mode 100644
index 0000000..312046b
--- /dev/null
+++ b/src/proguard/classfile/attribute/annotation/target/OffsetTargetInfo.java
@@ -0,0 +1,82 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ *             of Java bytecode.
+ *
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+package proguard.classfile.attribute.annotation.target;
+
+import proguard.classfile.*;
+import proguard.classfile.attribute.CodeAttribute;
+import proguard.classfile.attribute.annotation.TypeAnnotation;
+import proguard.classfile.attribute.annotation.target.visitor.TargetInfoVisitor;
+
+/**
+ * Representation of an offset annotation target.
+ *
+ * @author Eric Lafortune
+ */
+public class OffsetTargetInfo extends TargetInfo
+{
+    public int u2offset;
+
+
+    /**
+     * Creates an uninitialized OffsetTargetInfo.
+     */
+    public OffsetTargetInfo()
+    {
+    }
+
+
+    /**
+     * Creates a partially initialized OffsetTargetInfo.
+     */
+    public OffsetTargetInfo(byte u1targetType)
+    {
+        super(u1targetType);
+    }
+
+
+    /**
+     * Creates an initialized OffsetTargetInfo.
+     */
+    protected OffsetTargetInfo(byte u1targetType,
+                               int  u2offset)
+    {
+        super(u1targetType);
+
+        this.u2offset = u2offset;
+    }
+
+
+    // Implementations for TargetInfo.
+
+    /**
+     * Lets the visitor visit, with Method and CodeAttribute null.
+     */
+    public void accept(Clazz clazz, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor)
+    {
+        targetInfoVisitor.visitOffsetTargetInfo(clazz, null, null, typeAnnotation, this);
+    }
+
+
+    public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor)
+    {
+        targetInfoVisitor.visitOffsetTargetInfo(clazz, method, codeAttribute, typeAnnotation, this);
+    }
+}
diff --git a/src/proguard/classfile/attribute/annotation/target/SuperTypeTargetInfo.java b/src/proguard/classfile/attribute/annotation/target/SuperTypeTargetInfo.java
new file mode 100644
index 0000000..0db7ea4
--- /dev/null
+++ b/src/proguard/classfile/attribute/annotation/target/SuperTypeTargetInfo.java
@@ -0,0 +1,72 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ *             of Java bytecode.
+ *
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+package proguard.classfile.attribute.annotation.target;
+
+import proguard.classfile.Clazz;
+import proguard.classfile.attribute.annotation.TypeAnnotation;
+import proguard.classfile.attribute.annotation.target.visitor.TargetInfoVisitor;
+
+/**
+ * Representation of a super type annotation target.
+ *
+ * @author Eric Lafortune
+ */
+public class SuperTypeTargetInfo extends TargetInfo
+{
+    public int u2superTypeIndex;
+
+
+    /**
+     * Creates an uninitialized SuperTypeTargetInfo.
+     */
+    public SuperTypeTargetInfo()
+    {
+    }
+
+
+    /**
+     * Creates a partially initialized SuperTypeTargetInfo.
+     */
+    public SuperTypeTargetInfo(byte u1targetType)
+    {
+        super(u1targetType);
+    }
+
+
+    /**
+     * Creates an initialized SuperTypeTargetInfo.
+     */
+    public SuperTypeTargetInfo(byte u1targetType,
+                               int  u2superTypeIndex)
+    {
+        super(u1targetType);
+
+        this.u2superTypeIndex = u2superTypeIndex;
+    }
+
+
+    // Implementations for TargetInfo.
+
+    public void accept(Clazz clazz, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor)
+    {
+        targetInfoVisitor.visitSuperTypeTargetInfo(clazz, typeAnnotation, this);
+    }
+}
diff --git a/src/proguard/classfile/attribute/annotation/target/TargetInfo.java b/src/proguard/classfile/attribute/annotation/target/TargetInfo.java
new file mode 100644
index 0000000..efee2e2
--- /dev/null
+++ b/src/proguard/classfile/attribute/annotation/target/TargetInfo.java
@@ -0,0 +1,97 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ *             of Java bytecode.
+ *
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+package proguard.classfile.attribute.annotation.target;
+
+import proguard.classfile.*;
+import proguard.classfile.attribute.CodeAttribute;
+import proguard.classfile.attribute.annotation.TypeAnnotation;
+import proguard.classfile.attribute.annotation.target.visitor.TargetInfoVisitor;
+
+/**
+ * Representation of an annotation target.
+ *
+ * @author Eric Lafortune
+ */
+public abstract class TargetInfo
+{
+    public byte u1targetType;
+
+
+    /**
+     * Creates an uninitialized TargetInfo.
+     */
+    protected TargetInfo()
+    {
+    }
+
+
+    /**
+     * Creates an initialized TargetInfo.
+     */
+    protected TargetInfo(byte u1targetType)
+    {
+        this.u1targetType = u1targetType;
+    }
+
+
+    /**
+     * Returns the type of the target.
+     */
+    public byte getTargetType()
+    {
+        return u1targetType;
+    }
+
+
+    // Methods to be implemented by extensions.
+
+    /**
+     * Accepts the given visitor, in the context of a type annotation on a class.
+     */
+    public void accept(Clazz clazz,                                             TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor)
+    {
+        throw new UnsupportedOperationException("Unsupported type annotation [0x"+Integer.toHexString(u1targetType)+"] on a class");
+    }
+
+    /**
+     * Accepts the given visitor, in the context of a type annotation on a field.
+     */
+    public void accept(Clazz clazz, Field field,                                TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor)
+    {
+        throw new UnsupportedOperationException("Unsupported type annotation [0x"+Integer.toHexString(u1targetType)+"] on a field");
+    }
+
+    /**
+     * Accepts the given visitor, in the context of a type annotation on a method.
+     */
+    public void accept(Clazz clazz, Method method,                              TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor)
+    {
+        throw new UnsupportedOperationException("Unsupported type annotation [0x"+Integer.toHexString(u1targetType)+"] on a method");
+    }
+
+    /**
+     * Accepts the given visitor, in the context of a type annotation code.
+     */
+    public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor)
+    {
+        throw new UnsupportedOperationException("Unsupported type annotation [0x"+Integer.toHexString(u1targetType)+"] on code");
+    }
+}
diff --git a/src/proguard/classfile/attribute/annotation/target/ThrowsTargetInfo.java b/src/proguard/classfile/attribute/annotation/target/ThrowsTargetInfo.java
new file mode 100644
index 0000000..d5b2db7
--- /dev/null
+++ b/src/proguard/classfile/attribute/annotation/target/ThrowsTargetInfo.java
@@ -0,0 +1,81 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ *             of Java bytecode.
+ *
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+package proguard.classfile.attribute.annotation.target;
+
+import proguard.classfile.*;
+import proguard.classfile.attribute.annotation.TypeAnnotation;
+import proguard.classfile.attribute.annotation.target.visitor.TargetInfoVisitor;
+
+/**
+ * Representation of a 'throws' annotation target.
+ *
+ * @author Eric Lafortune
+ */
+public class ThrowsTargetInfo extends TargetInfo
+{
+    public int u2throwsTypeIndex;
+
+
+    /**
+     * Creates an uninitialized ThrowsTargetInfo.
+     */
+    public ThrowsTargetInfo()
+    {
+    }
+
+
+    /**
+     * Creates a partially initialized ThrowsTargetInfo.
+     */
+    public ThrowsTargetInfo(byte u1targetType)
+    {
+        super(u1targetType);
+    }
+
+
+    /**
+     * Creates an initialized ThrowsTargetInfo.
+     */
+    public ThrowsTargetInfo(byte u1targetType,
+                            int  u2throwsTypeIndex)
+    {
+        super(u1targetType);
+
+        this.u2throwsTypeIndex = u2throwsTypeIndex;
+    }
+
+
+    // Implementations for TargetInfo.
+
+    /**
+     * Lets the visitor visit, with Method null.
+     */
+    public void accept(Clazz clazz, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor)
+    {
+        targetInfoVisitor.visitThrowsTargetInfo(clazz, null, typeAnnotation, this);
+    }
+
+
+    public void accept(Clazz clazz, Method method, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor)
+    {
+        targetInfoVisitor.visitThrowsTargetInfo(clazz, method, typeAnnotation, this);
+    }
+}
diff --git a/src/proguard/classfile/attribute/annotation/target/TypeArgumentTargetInfo.java b/src/proguard/classfile/attribute/annotation/target/TypeArgumentTargetInfo.java
new file mode 100644
index 0000000..4aef72e
--- /dev/null
+++ b/src/proguard/classfile/attribute/annotation/target/TypeArgumentTargetInfo.java
@@ -0,0 +1,85 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ *             of Java bytecode.
+ *
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+package proguard.classfile.attribute.annotation.target;
+
+import proguard.classfile.*;
+import proguard.classfile.attribute.CodeAttribute;
+import proguard.classfile.attribute.annotation.TypeAnnotation;
+import proguard.classfile.attribute.annotation.target.visitor.TargetInfoVisitor;
+
+/**
+ * Representation of an offset annotation target.
+ *
+ * @author Eric Lafortune
+ */
+public class TypeArgumentTargetInfo extends TargetInfo
+{
+    public int u2offset;
+    public int u1typeArgumentIndex;
+
+
+    /**
+     * Creates an uninitialized TypeArgumentTargetInfo.
+     */
+    public TypeArgumentTargetInfo()
+    {
+    }
+
+
+    /**
+     * Creates a partially initialized TypeArgumentTargetInfo.
+     */
+    public TypeArgumentTargetInfo(byte u1targetType)
+    {
+        super(u1targetType);
+    }
+
+
+    /**
+     * Creates an initialized TypeArgumentTargetInfo.
+     */
+    protected TypeArgumentTargetInfo(byte u1targetType,
+                                     int  u2offset,
+                                     int  u1typeArgumentIndex)
+    {
+        super(u1targetType);
+
+        this.u2offset            = u2offset;
+        this.u1typeArgumentIndex = u1typeArgumentIndex;
+    }
+
+
+    // Implementations for TargetInfo.
+
+    /**
+     * Lets the visitor visit, with Method and CodeAttribute null.
+     */
+    public void accept(Clazz clazz, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor)
+    {
+        targetInfoVisitor.visitTypeArgumentTargetInfo(clazz, null, null, typeAnnotation, this);
+    }
+
+
+    public void accept(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor)
+    {
+        targetInfoVisitor.visitTypeArgumentTargetInfo(clazz, method, codeAttribute, typeAnnotation, this);
+    }
+}
diff --git a/src/proguard/classfile/attribute/annotation/target/TypeParameterBoundTargetInfo.java b/src/proguard/classfile/attribute/annotation/target/TypeParameterBoundTargetInfo.java
new file mode 100644
index 0000000..0f485ee
--- /dev/null
+++ b/src/proguard/classfile/attribute/annotation/target/TypeParameterBoundTargetInfo.java
@@ -0,0 +1,87 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ *             of Java bytecode.
+ *
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+package proguard.classfile.attribute.annotation.target;
+
+import proguard.classfile.*;
+import proguard.classfile.attribute.annotation.TypeAnnotation;
+import proguard.classfile.attribute.annotation.target.visitor.TargetInfoVisitor;
+
+/**
+ * Representation of a type parameter bound annotation target.
+ *
+ * @author Eric Lafortune
+ */
+public class TypeParameterBoundTargetInfo extends TargetInfo
+{
+    public int u1typeParameterIndex;
+    public int u1boundIndex;
+
+
+    /**
+     * Creates an uninitialized TypeParameterBoundTargetInfo.
+     */
+    public TypeParameterBoundTargetInfo()
+    {
+    }
+
+
+    /**
+     * Creates a partially initialized TypeParameterBoundTargetInfo.
+     */
+    public TypeParameterBoundTargetInfo(byte u1targetType)
+    {
+        super(u1targetType);
+    }
+
+
+    /**
+     * Creates an initialized TypeParameterBoundTargetInfo.
+     */
+    public TypeParameterBoundTargetInfo(byte u1targetType,
+                                        int  u1typeParameterIndex,
+                                        int  u1boundIndex)
+    {
+        super(u1targetType);
+
+        this.u1typeParameterIndex = u1typeParameterIndex;
+        this.u1boundIndex         = u1boundIndex;
+    }
+
+
+    // Implementations for TargetInfo.
+
+    public void accept(Clazz clazz, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor)
+    {
+        targetInfoVisitor.visitTypeParameterBoundTargetInfo(clazz, typeAnnotation, this);
+    }
+
+
+    public void accept(Clazz clazz, Field field, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor)
+    {
+        targetInfoVisitor.visitTypeParameterBoundTargetInfo(clazz, field, typeAnnotation, this);
+    }
+
+
+    public void accept(Clazz clazz, Method method, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor)
+    {
+        targetInfoVisitor.visitTypeParameterBoundTargetInfo(clazz, method, typeAnnotation, this);
+    }
+}
diff --git a/src/proguard/classfile/attribute/annotation/target/TypeParameterTargetInfo.java b/src/proguard/classfile/attribute/annotation/target/TypeParameterTargetInfo.java
new file mode 100644
index 0000000..3150a26
--- /dev/null
+++ b/src/proguard/classfile/attribute/annotation/target/TypeParameterTargetInfo.java
@@ -0,0 +1,79 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ *             of Java bytecode.
+ *
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+package proguard.classfile.attribute.annotation.target;
+
+import proguard.classfile.*;
+import proguard.classfile.attribute.CodeAttribute;
+import proguard.classfile.attribute.annotation.TypeAnnotation;
+import proguard.classfile.attribute.annotation.target.visitor.TargetInfoVisitor;
+
+/**
+ * Representation of a type parameter annotation target.
+ *
+ * @author Eric Lafortune
+ */
+public class TypeParameterTargetInfo extends TargetInfo
+{
+    public int u1typeParameterIndex;
+
+
+    /**
+     * Creates an uninitialized TypeParameterTargetInfo.
+     */
+    public TypeParameterTargetInfo()
+    {
+    }
+
+
+    /**
+     * Creates a partially initialized TypeParameterTargetInfo.
+     */
+    public TypeParameterTargetInfo(byte u1targetType)
+    {
+        super(u1targetType);
+    }
+
+
+    /**
+     * Creates an initialized TypeParameterTargetInfo.
+     */
+    public TypeParameterTargetInfo(byte u1targetType,
+                                   int  u1typeParameterIndex)
+    {
+        super(u1targetType);
+
+        this.u1typeParameterIndex = u1typeParameterIndex;
+    }
+
+
+    // Implementations for TargetInfo.
+
+    public void accept(Clazz clazz, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor)
+    {
+        targetInfoVisitor.visitTypeParameterTargetInfo(clazz, typeAnnotation, this);
+    }
+
+
+    public void accept(Clazz clazz, Method method, TypeAnnotation typeAnnotation, TargetInfoVisitor targetInfoVisitor)
+    {
+        targetInfoVisitor.visitTypeParameterTargetInfo(clazz, method, typeAnnotation, this);
+    }
+}
diff --git a/src/proguard/classfile/attribute/annotation/target/visitor/LocalVariableTargetElementVisitor.java b/src/proguard/classfile/attribute/annotation/target/visitor/LocalVariableTargetElementVisitor.java
new file mode 100644
index 0000000..62fe148
--- /dev/null
+++ b/src/proguard/classfile/attribute/annotation/target/visitor/LocalVariableTargetElementVisitor.java
@@ -0,0 +1,37 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ *             of Java bytecode.
+ *
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+package proguard.classfile.attribute.annotation.target.visitor;
+
+import proguard.classfile.*;
+import proguard.classfile.attribute.CodeAttribute;
+import proguard.classfile.attribute.annotation.TypeAnnotation;
+import proguard.classfile.attribute.annotation.target.*;
+
+/**
+ * This interface specifies the methods for a visitor of LocalVariableTargetElement
+ * instances.
+ *
+ * @author Eric Lafortune
+ */
+public interface LocalVariableTargetElementVisitor
+{
+    public void visitLocalVariableTargetElement(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, LocalVariableTargetInfo localVariableTargetInfo, LocalVariableTargetElement localVariableTargetElement);
+}
diff --git a/src/proguard/classfile/attribute/annotation/target/visitor/TargetInfoVisitor.java b/src/proguard/classfile/attribute/annotation/target/visitor/TargetInfoVisitor.java
new file mode 100644
index 0000000..33e7d32
--- /dev/null
+++ b/src/proguard/classfile/attribute/annotation/target/visitor/TargetInfoVisitor.java
@@ -0,0 +1,50 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ *             of Java bytecode.
+ *
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+package proguard.classfile.attribute.annotation.target.visitor;
+
+import proguard.classfile.*;
+import proguard.classfile.attribute.CodeAttribute;
+import proguard.classfile.attribute.annotation.*;
+import proguard.classfile.attribute.annotation.target.*;
+
+/**
+ * This interface specifies the methods for a visitor of <code>TargetInfo</code>
+ * objects.
+ *
+ * @author Eric Lafortune
+ */
+public interface TargetInfoVisitor
+{
+    public void visitTypeParameterTargetInfo(     Clazz clazz,                                             TypeAnnotation typeAnnotation, TypeParameterTargetInfo      typeParameterTargetInfo);
+    public void visitTypeParameterTargetInfo(     Clazz clazz, Method method,                              TypeAnnotation typeAnnotation, TypeParameterTargetInfo      typeParameterTargetInfo);
+    public void visitSuperTypeTargetInfo(         Clazz clazz,                                             TypeAnnotation typeAnnotation, SuperTypeTargetInfo          superTypeTargetInfo);
+    public void visitTypeParameterBoundTargetInfo(Clazz clazz,                                             TypeAnnotation typeAnnotation, TypeParameterBoundTargetInfo typeParameterBoundTargetInfo);
+    public void visitTypeParameterBoundTargetInfo(Clazz clazz, Field field,                                TypeAnnotation typeAnnotation, TypeParameterBoundTargetInfo typeParameterBoundTargetInfo);
+    public void visitTypeParameterBoundTargetInfo(Clazz clazz, Method method,                              TypeAnnotation typeAnnotation, TypeParameterBoundTargetInfo typeParameterBoundTargetInfo);
+    public void visitEmptyTargetInfo(             Clazz clazz, Field field,                                TypeAnnotation typeAnnotation, EmptyTargetInfo              emptyTargetInfo);
+    public void visitEmptyTargetInfo(             Clazz clazz, Method method,                              TypeAnnotation typeAnnotation, EmptyTargetInfo              emptyTargetInfo);
+    public void visitFormalParameterTargetInfo(   Clazz clazz, Method method,                              TypeAnnotation typeAnnotation, FormalParameterTargetInfo    formalParameterTargetInfo);
+    public void visitThrowsTargetInfo(            Clazz clazz, Method method,                              TypeAnnotation typeAnnotation, ThrowsTargetInfo             throwsTargetInfo);
+    public void visitLocalVariableTargetInfo(     Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, LocalVariableTargetInfo      localVariableTargetInfo);
+    public void visitCatchTargetInfo(             Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, CatchTargetInfo              catchTargetInfo);
+    public void visitOffsetTargetInfo(            Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, OffsetTargetInfo             offsetTargetInfo);
+    public void visitTypeArgumentTargetInfo(      Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, TypeArgumentTargetInfo       typeArgumentTargetInfo);
+}
diff --git a/src/proguard/classfile/attribute/annotation/visitor/AllAnnotationVisitor.java b/src/proguard/classfile/attribute/annotation/visitor/AllAnnotationVisitor.java
index 0aadfe3..b4513d7 100644
--- a/src/proguard/classfile/attribute/annotation/visitor/AllAnnotationVisitor.java
+++ b/src/proguard/classfile/attribute/annotation/visitor/AllAnnotationVisitor.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -21,7 +21,7 @@
 package proguard.classfile.attribute.annotation.visitor;
 
 import proguard.classfile.*;
-import proguard.classfile.attribute.Attribute;
+import proguard.classfile.attribute.*;
 import proguard.classfile.attribute.annotation.*;
 import proguard.classfile.attribute.visitor.AttributeVisitor;
 import proguard.classfile.util.SimplifiedVisitor;
@@ -102,4 +102,60 @@
         // Visit the annotations.
         parameterAnnotationsAttribute.annotationsAccept(clazz, method, annotationVisitor);
     }
+
+
+    public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute)
+    {
+        // Visit the annotations.
+        runtimeVisibleTypeAnnotationsAttribute.annotationsAccept(clazz, annotationVisitor);
+    }
+
+
+    public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Field field, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute)
+    {
+        // Visit the annotations.
+        runtimeVisibleTypeAnnotationsAttribute.annotationsAccept(clazz, field, annotationVisitor);
+    }
+
+
+    public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute)
+    {
+        // Visit the annotations.
+        runtimeVisibleTypeAnnotationsAttribute.annotationsAccept(clazz, method, annotationVisitor);
+    }
+
+
+    public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute)
+    {
+        // Visit the annotations.
+        runtimeVisibleTypeAnnotationsAttribute.annotationsAccept(clazz, method, codeAttribute, annotationVisitor);
+    }
+
+
+    public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute)
+    {
+        // Visit the annotations.
+        runtimeInvisibleTypeAnnotationsAttribute.annotationsAccept(clazz, annotationVisitor);
+    }
+
+
+    public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Field field, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute)
+    {
+        // Visit the annotations.
+        runtimeInvisibleTypeAnnotationsAttribute.annotationsAccept(clazz, field, annotationVisitor);
+    }
+
+
+    public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute)
+    {
+        // Visit the annotations.
+        runtimeInvisibleTypeAnnotationsAttribute.annotationsAccept(clazz, method, annotationVisitor);
+    }
+
+
+    public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute)
+    {
+        // Visit the annotations.
+        runtimeInvisibleTypeAnnotationsAttribute.annotationsAccept(clazz, method, codeAttribute, annotationVisitor);
+    }
 }
diff --git a/src/proguard/classfile/attribute/annotation/visitor/AllElementValueVisitor.java b/src/proguard/classfile/attribute/annotation/visitor/AllElementValueVisitor.java
index b728b8b..4413082 100644
--- a/src/proguard/classfile/attribute/annotation/visitor/AllElementValueVisitor.java
+++ b/src/proguard/classfile/attribute/annotation/visitor/AllElementValueVisitor.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -21,11 +21,10 @@
 package proguard.classfile.attribute.annotation.visitor;
 
 import proguard.classfile.*;
-import proguard.classfile.attribute.Attribute;
+import proguard.classfile.attribute.*;
 import proguard.classfile.attribute.annotation.*;
 import proguard.classfile.attribute.visitor.AttributeVisitor;
 import proguard.classfile.util.SimplifiedVisitor;
-import proguard.util.*;
 
 /**
  * This AttributeVisitor and AnnotationVisitor lets a given ElementValueVisitor
@@ -158,6 +157,12 @@
     }
 
 
+    public void visitAnnotation(Clazz clazz, Method method, CodeAttribute codeAttribute, Annotation annotation)
+    {
+        annotation.elementValuesAccept(clazz, this);
+    }
+
+
     // Implementations for ElementValueVisitor.
 
     public void visitConstantElementValue(Clazz clazz, Annotation annotation, ConstantElementValue constantElementValue)
diff --git a/src/proguard/classfile/attribute/annotation/visitor/AnnotatedClassVisitor.java b/src/proguard/classfile/attribute/annotation/visitor/AnnotatedClassVisitor.java
index 305928e..241e9e6 100644
--- a/src/proguard/classfile/attribute/annotation/visitor/AnnotatedClassVisitor.java
+++ b/src/proguard/classfile/attribute/annotation/visitor/AnnotatedClassVisitor.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/annotation/visitor/AnnotationToMemberVisitor.java b/src/proguard/classfile/attribute/annotation/visitor/AnnotationToMemberVisitor.java
index 7833f7e..6bb2454 100644
--- a/src/proguard/classfile/attribute/annotation/visitor/AnnotationToMemberVisitor.java
+++ b/src/proguard/classfile/attribute/annotation/visitor/AnnotationToMemberVisitor.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/annotation/visitor/AnnotationTypeFilter.java b/src/proguard/classfile/attribute/annotation/visitor/AnnotationTypeFilter.java
index d6ec3ca..ad7b316 100644
--- a/src/proguard/classfile/attribute/annotation/visitor/AnnotationTypeFilter.java
+++ b/src/proguard/classfile/attribute/annotation/visitor/AnnotationTypeFilter.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -21,8 +21,8 @@
 package proguard.classfile.attribute.annotation.visitor;
 
 import proguard.classfile.*;
+import proguard.classfile.attribute.CodeAttribute;
 import proguard.classfile.attribute.annotation.Annotation;
-import proguard.classfile.util.SimplifiedVisitor;
 import proguard.util.*;
 
 /**
@@ -92,6 +92,15 @@
     }
 
 
+    public void visitAnnotation(Clazz clazz, Method method, CodeAttribute codeAttribute, Annotation annotation)
+    {
+        if (accepted(annotation.getType(clazz)))
+        {
+            annotationVisitor.visitAnnotation(clazz, method, codeAttribute, annotation);
+        }
+    }
+
+
     // Small utility methods.
 
     private boolean accepted(String name)
diff --git a/src/proguard/classfile/attribute/annotation/visitor/AnnotationVisitor.java b/src/proguard/classfile/attribute/annotation/visitor/AnnotationVisitor.java
index 8d207af..3225c97 100644
--- a/src/proguard/classfile/attribute/annotation/visitor/AnnotationVisitor.java
+++ b/src/proguard/classfile/attribute/annotation/visitor/AnnotationVisitor.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -21,6 +21,7 @@
 package proguard.classfile.attribute.annotation.visitor;
 
 import proguard.classfile.*;
+import proguard.classfile.attribute.CodeAttribute;
 import proguard.classfile.attribute.annotation.Annotation;
 
 /**
@@ -33,8 +34,9 @@
  */
 public interface AnnotationVisitor
 {
-    public void visitAnnotation(Clazz clazz,                                    Annotation annotation);
-    public void visitAnnotation(Clazz clazz, Field  field,                      Annotation annotation);
-    public void visitAnnotation(Clazz clazz, Method method,                     Annotation annotation);
-    public void visitAnnotation(Clazz clazz, Method method, int parameterIndex, Annotation annotation);
+    public void visitAnnotation(Clazz clazz,                                             Annotation annotation);
+    public void visitAnnotation(Clazz clazz, Field  field,                               Annotation annotation);
+    public void visitAnnotation(Clazz clazz, Method method,                              Annotation annotation);
+    public void visitAnnotation(Clazz clazz, Method method, int parameterIndex,          Annotation annotation);
+    public void visitAnnotation(Clazz clazz, Method method, CodeAttribute codeAttribute, Annotation annotation);
 }
diff --git a/src/proguard/classfile/attribute/annotation/visitor/ElementValueVisitor.java b/src/proguard/classfile/attribute/annotation/visitor/ElementValueVisitor.java
index 2d3a20d..453c14b 100644
--- a/src/proguard/classfile/attribute/annotation/visitor/ElementValueVisitor.java
+++ b/src/proguard/classfile/attribute/annotation/visitor/ElementValueVisitor.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/annotation/visitor/TypeAnnotationVisitor.java b/src/proguard/classfile/attribute/annotation/visitor/TypeAnnotationVisitor.java
new file mode 100644
index 0000000..3a01887
--- /dev/null
+++ b/src/proguard/classfile/attribute/annotation/visitor/TypeAnnotationVisitor.java
@@ -0,0 +1,41 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ *             of Java bytecode.
+ *
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+package proguard.classfile.attribute.annotation.visitor;
+
+import proguard.classfile.*;
+import proguard.classfile.attribute.CodeAttribute;
+import proguard.classfile.attribute.annotation.*;
+
+/**
+ * This interface specifies the methods for a visitor of
+ * TypeAnnotation instances. Note that there is only a single
+ * implementation of TypeAnnotation, such that this interface
+ * is not strictly necessary as a visitor.
+ *
+ * @author Eric Lafortune
+ */
+public interface TypeAnnotationVisitor
+{
+    public void visitTypeAnnotation(Clazz clazz,                                             TypeAnnotation typeAnnotation);
+    public void visitTypeAnnotation(Clazz clazz, Field  field,                               TypeAnnotation typeAnnotation);
+    public void visitTypeAnnotation(Clazz clazz, Method method,                              TypeAnnotation typeAnnotation);
+    public void visitTypeAnnotation(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation);
+}
diff --git a/src/proguard/classfile/attribute/annotation/visitor/TypePathInfoVisitor.java b/src/proguard/classfile/attribute/annotation/visitor/TypePathInfoVisitor.java
new file mode 100644
index 0000000..ab7d51b
--- /dev/null
+++ b/src/proguard/classfile/attribute/annotation/visitor/TypePathInfoVisitor.java
@@ -0,0 +1,41 @@
+/*
+ * ProGuard -- shrinking, optimization, obfuscation, and preverification
+ *             of Java bytecode.
+ *
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+package proguard.classfile.attribute.annotation.visitor;
+
+import proguard.classfile.*;
+import proguard.classfile.attribute.CodeAttribute;
+import proguard.classfile.attribute.annotation.*;
+
+/**
+ * This interface specifies the methods for a visitor of
+ * TypePathInfo instances. Note that there is only a single
+ * implementation of TypePathInfo, such that this interface
+ * is not strictly necessary as a visitor.
+ *
+ * @author Eric Lafortune
+ */
+public interface TypePathInfoVisitor
+{
+    public void visitTypePathInfo(Clazz clazz,                                             TypeAnnotation typeAnnotation, TypePathInfo typePathInfo);
+    public void visitTypePathInfo(Clazz clazz, Field  field,                               TypeAnnotation typeAnnotation, TypePathInfo typePathInfo);
+    public void visitTypePathInfo(Clazz clazz, Method method,                              TypeAnnotation typeAnnotation, TypePathInfo typePathInfo);
+    public void visitTypePathInfo(Clazz clazz, Method method, CodeAttribute codeAttribute, TypeAnnotation typeAnnotation, TypePathInfo typePathInfo);
+}
diff --git a/src/proguard/classfile/attribute/preverification/DoubleType.java b/src/proguard/classfile/attribute/preverification/DoubleType.java
index 1bc3e5d..1f0478d 100644
--- a/src/proguard/classfile/attribute/preverification/DoubleType.java
+++ b/src/proguard/classfile/attribute/preverification/DoubleType.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/preverification/FloatType.java b/src/proguard/classfile/attribute/preverification/FloatType.java
index c58cd0a..ee0fe94 100644
--- a/src/proguard/classfile/attribute/preverification/FloatType.java
+++ b/src/proguard/classfile/attribute/preverification/FloatType.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/preverification/FullFrame.java b/src/proguard/classfile/attribute/preverification/FullFrame.java
index 4f0d72e..09890f2 100644
--- a/src/proguard/classfile/attribute/preverification/FullFrame.java
+++ b/src/proguard/classfile/attribute/preverification/FullFrame.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/preverification/IntegerType.java b/src/proguard/classfile/attribute/preverification/IntegerType.java
index 9c43cae..9d8144a 100644
--- a/src/proguard/classfile/attribute/preverification/IntegerType.java
+++ b/src/proguard/classfile/attribute/preverification/IntegerType.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/preverification/LessZeroFrame.java b/src/proguard/classfile/attribute/preverification/LessZeroFrame.java
index f722d73..681c9ab 100644
--- a/src/proguard/classfile/attribute/preverification/LessZeroFrame.java
+++ b/src/proguard/classfile/attribute/preverification/LessZeroFrame.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/preverification/LongType.java b/src/proguard/classfile/attribute/preverification/LongType.java
index c986165..dafac5a 100644
--- a/src/proguard/classfile/attribute/preverification/LongType.java
+++ b/src/proguard/classfile/attribute/preverification/LongType.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/preverification/MoreZeroFrame.java b/src/proguard/classfile/attribute/preverification/MoreZeroFrame.java
index be74df0..be4e08d 100644
--- a/src/proguard/classfile/attribute/preverification/MoreZeroFrame.java
+++ b/src/proguard/classfile/attribute/preverification/MoreZeroFrame.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/preverification/NullType.java b/src/proguard/classfile/attribute/preverification/NullType.java
index fe0d85f..00b27a7 100644
--- a/src/proguard/classfile/attribute/preverification/NullType.java
+++ b/src/proguard/classfile/attribute/preverification/NullType.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/preverification/ObjectType.java b/src/proguard/classfile/attribute/preverification/ObjectType.java
index 4ea370a..6b54277 100644
--- a/src/proguard/classfile/attribute/preverification/ObjectType.java
+++ b/src/proguard/classfile/attribute/preverification/ObjectType.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/preverification/SameOneFrame.java b/src/proguard/classfile/attribute/preverification/SameOneFrame.java
index 4384aae..63b9058 100644
--- a/src/proguard/classfile/attribute/preverification/SameOneFrame.java
+++ b/src/proguard/classfile/attribute/preverification/SameOneFrame.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/preverification/SameZeroFrame.java b/src/proguard/classfile/attribute/preverification/SameZeroFrame.java
index a3bd824..694ed2a 100644
--- a/src/proguard/classfile/attribute/preverification/SameZeroFrame.java
+++ b/src/proguard/classfile/attribute/preverification/SameZeroFrame.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/preverification/StackMapAttribute.java b/src/proguard/classfile/attribute/preverification/StackMapAttribute.java
index 51e69fb..9b7bbfd 100644
--- a/src/proguard/classfile/attribute/preverification/StackMapAttribute.java
+++ b/src/proguard/classfile/attribute/preverification/StackMapAttribute.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/preverification/StackMapFrame.java b/src/proguard/classfile/attribute/preverification/StackMapFrame.java
index 01890f3..9b2f43b 100644
--- a/src/proguard/classfile/attribute/preverification/StackMapFrame.java
+++ b/src/proguard/classfile/attribute/preverification/StackMapFrame.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/preverification/StackMapTableAttribute.java b/src/proguard/classfile/attribute/preverification/StackMapTableAttribute.java
index 3de059f..a6f9ca6 100644
--- a/src/proguard/classfile/attribute/preverification/StackMapTableAttribute.java
+++ b/src/proguard/classfile/attribute/preverification/StackMapTableAttribute.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/preverification/TopType.java b/src/proguard/classfile/attribute/preverification/TopType.java
index 02dd1a2..9804c53 100644
--- a/src/proguard/classfile/attribute/preverification/TopType.java
+++ b/src/proguard/classfile/attribute/preverification/TopType.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/preverification/UninitializedThisType.java b/src/proguard/classfile/attribute/preverification/UninitializedThisType.java
index 7b2bfa9..fcbcd7d 100644
--- a/src/proguard/classfile/attribute/preverification/UninitializedThisType.java
+++ b/src/proguard/classfile/attribute/preverification/UninitializedThisType.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/preverification/UninitializedType.java b/src/proguard/classfile/attribute/preverification/UninitializedType.java
index 7e4a0fd..1b9de74 100644
--- a/src/proguard/classfile/attribute/preverification/UninitializedType.java
+++ b/src/proguard/classfile/attribute/preverification/UninitializedType.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/preverification/VerificationType.java b/src/proguard/classfile/attribute/preverification/VerificationType.java
index 02c3872..22ad72f 100644
--- a/src/proguard/classfile/attribute/preverification/VerificationType.java
+++ b/src/proguard/classfile/attribute/preverification/VerificationType.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/preverification/VerificationTypeFactory.java b/src/proguard/classfile/attribute/preverification/VerificationTypeFactory.java
index ada9ce8..71d2c3e 100644
--- a/src/proguard/classfile/attribute/preverification/VerificationTypeFactory.java
+++ b/src/proguard/classfile/attribute/preverification/VerificationTypeFactory.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/preverification/visitor/StackMapFrameVisitor.java b/src/proguard/classfile/attribute/preverification/visitor/StackMapFrameVisitor.java
index 5e4cf88..f269f6e 100644
--- a/src/proguard/classfile/attribute/preverification/visitor/StackMapFrameVisitor.java
+++ b/src/proguard/classfile/attribute/preverification/visitor/StackMapFrameVisitor.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/preverification/visitor/VerificationTypeVisitor.java b/src/proguard/classfile/attribute/preverification/visitor/VerificationTypeVisitor.java
index 2a3e9e7..cf39ca2 100644
--- a/src/proguard/classfile/attribute/preverification/visitor/VerificationTypeVisitor.java
+++ b/src/proguard/classfile/attribute/preverification/visitor/VerificationTypeVisitor.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/visitor/AllAttributeVisitor.java b/src/proguard/classfile/attribute/visitor/AllAttributeVisitor.java
index 9d8801c..701451e 100644
--- a/src/proguard/classfile/attribute/visitor/AllAttributeVisitor.java
+++ b/src/proguard/classfile/attribute/visitor/AllAttributeVisitor.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/visitor/AllBootstrapMethodInfoVisitor.java b/src/proguard/classfile/attribute/visitor/AllBootstrapMethodInfoVisitor.java
index d70803c..6110325 100644
--- a/src/proguard/classfile/attribute/visitor/AllBootstrapMethodInfoVisitor.java
+++ b/src/proguard/classfile/attribute/visitor/AllBootstrapMethodInfoVisitor.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -20,7 +20,7 @@
  */
 package proguard.classfile.attribute.visitor;
 
-import proguard.classfile.*;
+import proguard.classfile.Clazz;
 import proguard.classfile.attribute.*;
 import proguard.classfile.util.SimplifiedVisitor;
 
diff --git a/src/proguard/classfile/attribute/visitor/AllExceptionInfoVisitor.java b/src/proguard/classfile/attribute/visitor/AllExceptionInfoVisitor.java
index 927bfd9..9b6c9de 100644
--- a/src/proguard/classfile/attribute/visitor/AllExceptionInfoVisitor.java
+++ b/src/proguard/classfile/attribute/visitor/AllExceptionInfoVisitor.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/visitor/AllInnerClassesInfoVisitor.java b/src/proguard/classfile/attribute/visitor/AllInnerClassesInfoVisitor.java
index 2422218..b1005c8 100644
--- a/src/proguard/classfile/attribute/visitor/AllInnerClassesInfoVisitor.java
+++ b/src/proguard/classfile/attribute/visitor/AllInnerClassesInfoVisitor.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -20,7 +20,7 @@
  */
 package proguard.classfile.attribute.visitor;
 
-import proguard.classfile.*;
+import proguard.classfile.Clazz;
 import proguard.classfile.attribute.*;
 import proguard.classfile.util.SimplifiedVisitor;
 
diff --git a/src/proguard/classfile/attribute/visitor/AttributeNameFilter.java b/src/proguard/classfile/attribute/visitor/AttributeNameFilter.java
index 0db77d5..14c1edc 100644
--- a/src/proguard/classfile/attribute/visitor/AttributeNameFilter.java
+++ b/src/proguard/classfile/attribute/visitor/AttributeNameFilter.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -93,7 +93,7 @@
     {
         if (accepted(clazz, unknownAttribute))
         {
-            unknownAttribute.accept(clazz, attributeVisitor);
+            attributeVisitor.visitUnknownAttribute(clazz, unknownAttribute);
         }
     }
 
@@ -102,7 +102,7 @@
     {
         if (accepted(clazz, bootstrapMethodsAttribute))
         {
-            bootstrapMethodsAttribute.accept(clazz, attributeVisitor);
+            attributeVisitor.visitBootstrapMethodsAttribute(clazz, bootstrapMethodsAttribute);
         }
     }
 
@@ -111,7 +111,7 @@
     {
         if (accepted(clazz, sourceFileAttribute))
         {
-            sourceFileAttribute.accept(clazz, attributeVisitor);
+            attributeVisitor.visitSourceFileAttribute(clazz, sourceFileAttribute);
         }
     }
 
@@ -120,7 +120,7 @@
     {
         if (accepted(clazz, sourceDirAttribute))
         {
-            sourceDirAttribute.accept(clazz, attributeVisitor);
+            attributeVisitor.visitSourceDirAttribute(clazz, sourceDirAttribute);
         }
     }
 
@@ -129,7 +129,7 @@
     {
         if (accepted(clazz, innerClassesAttribute))
         {
-            innerClassesAttribute.accept(clazz, attributeVisitor);
+            attributeVisitor.visitInnerClassesAttribute(clazz, innerClassesAttribute);
         }
     }
 
@@ -138,7 +138,7 @@
     {
         if (accepted(clazz, enclosingMethodAttribute))
         {
-            enclosingMethodAttribute.accept(clazz, attributeVisitor);
+            attributeVisitor.visitEnclosingMethodAttribute(clazz, enclosingMethodAttribute);
         }
     }
 
@@ -147,7 +147,7 @@
     {
         if (accepted(clazz, deprecatedAttribute))
         {
-            deprecatedAttribute.accept(clazz, attributeVisitor);
+            attributeVisitor.visitDeprecatedAttribute(clazz, deprecatedAttribute);
         }
     }
 
@@ -156,7 +156,7 @@
     {
         if (accepted(clazz, deprecatedAttribute))
         {
-            deprecatedAttribute.accept(clazz, field, attributeVisitor);
+            attributeVisitor.visitDeprecatedAttribute(clazz, field, deprecatedAttribute);
         }
     }
 
@@ -165,7 +165,7 @@
     {
         if (accepted(clazz, deprecatedAttribute))
         {
-            deprecatedAttribute.accept(clazz, method, attributeVisitor);
+            attributeVisitor.visitDeprecatedAttribute(clazz, method, deprecatedAttribute);
         }
     }
 
@@ -174,7 +174,7 @@
     {
         if (accepted(clazz, syntheticAttribute))
         {
-            syntheticAttribute.accept(clazz, attributeVisitor);
+            attributeVisitor.visitSyntheticAttribute(clazz, syntheticAttribute);
         }
     }
 
@@ -183,7 +183,7 @@
     {
         if (accepted(clazz, syntheticAttribute))
         {
-            syntheticAttribute.accept(clazz, field, attributeVisitor);
+            attributeVisitor.visitSyntheticAttribute(clazz, field, syntheticAttribute);
         }
     }
 
@@ -192,7 +192,7 @@
     {
         if (accepted(clazz, syntheticAttribute))
         {
-            syntheticAttribute.accept(clazz, method, attributeVisitor);
+            attributeVisitor.visitSyntheticAttribute(clazz, method, syntheticAttribute);
         }
     }
 
@@ -201,7 +201,7 @@
     {
         if (accepted(clazz, signatureAttribute))
         {
-            signatureAttribute.accept(clazz, attributeVisitor);
+            attributeVisitor.visitSignatureAttribute(clazz, signatureAttribute);
         }
     }
 
@@ -210,7 +210,7 @@
     {
         if (accepted(clazz, signatureAttribute))
         {
-            signatureAttribute.accept(clazz, field, attributeVisitor);
+            attributeVisitor.visitSignatureAttribute(clazz, field, signatureAttribute);
         }
     }
 
@@ -219,7 +219,7 @@
     {
         if (accepted(clazz, signatureAttribute))
         {
-            signatureAttribute.accept(clazz, method, attributeVisitor);
+            attributeVisitor.visitSignatureAttribute(clazz, method, signatureAttribute);
         }
     }
 
@@ -228,7 +228,16 @@
     {
         if (accepted(clazz, constantValueAttribute))
         {
-            constantValueAttribute.accept(clazz, field, attributeVisitor);
+            attributeVisitor.visitConstantValueAttribute(clazz, field, constantValueAttribute);
+        }
+    }
+
+
+    public void visitMethodParametersAttribute(Clazz clazz, Method method, MethodParametersAttribute exceptionsAttribute)
+    {
+        if (accepted(clazz, exceptionsAttribute))
+        {
+            attributeVisitor.visitMethodParametersAttribute(clazz, method, exceptionsAttribute);
         }
     }
 
@@ -237,7 +246,7 @@
     {
         if (accepted(clazz, exceptionsAttribute))
         {
-            exceptionsAttribute.accept(clazz, method, attributeVisitor);
+            attributeVisitor.visitExceptionsAttribute(clazz, method, exceptionsAttribute);
         }
     }
 
@@ -246,7 +255,7 @@
     {
         if (accepted(clazz, codeAttribute))
         {
-            codeAttribute.accept(clazz, method, attributeVisitor);
+            attributeVisitor.visitCodeAttribute(clazz, method, codeAttribute);
         }
     }
 
@@ -255,7 +264,7 @@
     {
         if (accepted(clazz, stackMapAttribute))
         {
-            stackMapAttribute.accept(clazz, method, codeAttribute, attributeVisitor);
+            attributeVisitor.visitStackMapAttribute(clazz, method, codeAttribute, stackMapAttribute);
         }
     }
 
@@ -264,7 +273,7 @@
     {
         if (accepted(clazz, stackMapTableAttribute))
         {
-            stackMapTableAttribute.accept(clazz, method, codeAttribute, attributeVisitor);
+            attributeVisitor.visitStackMapTableAttribute(clazz, method, codeAttribute, stackMapTableAttribute);
         }
     }
 
@@ -273,7 +282,7 @@
     {
         if (accepted(clazz, lineNumberTableAttribute))
         {
-            lineNumberTableAttribute.accept(clazz, method, codeAttribute, attributeVisitor);
+            attributeVisitor.visitLineNumberTableAttribute(clazz, method, codeAttribute, lineNumberTableAttribute);
         }
     }
 
@@ -282,7 +291,7 @@
     {
         if (accepted(clazz, localVariableTableAttribute))
         {
-            localVariableTableAttribute.accept(clazz, method, codeAttribute, attributeVisitor);
+            attributeVisitor.visitLocalVariableTableAttribute(clazz, method, codeAttribute, localVariableTableAttribute);
         }
     }
 
@@ -291,7 +300,7 @@
     {
         if (accepted(clazz, localVariableTypeTableAttribute))
         {
-            localVariableTypeTableAttribute.accept(clazz, method, codeAttribute, attributeVisitor);
+            attributeVisitor.visitLocalVariableTypeTableAttribute(clazz, method, codeAttribute, localVariableTypeTableAttribute);
         }
     }
 
@@ -300,7 +309,7 @@
     {
         if (accepted(clazz, runtimeVisibleAnnotationsAttribute))
         {
-            runtimeVisibleAnnotationsAttribute.accept(clazz, attributeVisitor);
+            attributeVisitor.visitRuntimeVisibleAnnotationsAttribute(clazz, runtimeVisibleAnnotationsAttribute);
         }
     }
 
@@ -309,7 +318,7 @@
     {
         if (accepted(clazz, runtimeVisibleAnnotationsAttribute))
         {
-            runtimeVisibleAnnotationsAttribute.accept(clazz, field, attributeVisitor);
+            attributeVisitor.visitRuntimeVisibleAnnotationsAttribute(clazz, field, runtimeVisibleAnnotationsAttribute);
         }
     }
 
@@ -318,7 +327,7 @@
     {
         if (accepted(clazz, runtimeVisibleAnnotationsAttribute))
         {
-            runtimeVisibleAnnotationsAttribute.accept(clazz, method, attributeVisitor);
+            attributeVisitor.visitRuntimeVisibleAnnotationsAttribute(clazz, method, runtimeVisibleAnnotationsAttribute);
         }
     }
 
@@ -327,7 +336,7 @@
     {
         if (accepted(clazz, runtimeInvisibleAnnotationsAttribute))
         {
-            runtimeInvisibleAnnotationsAttribute.accept(clazz, attributeVisitor);
+            attributeVisitor.visitRuntimeInvisibleAnnotationsAttribute(clazz, runtimeInvisibleAnnotationsAttribute);
         }
     }
 
@@ -336,7 +345,7 @@
     {
         if (accepted(clazz, runtimeInvisibleAnnotationsAttribute))
         {
-            runtimeInvisibleAnnotationsAttribute.accept(clazz, field, attributeVisitor);
+            attributeVisitor.visitRuntimeInvisibleAnnotationsAttribute(clazz, field, runtimeInvisibleAnnotationsAttribute);
         }
     }
 
@@ -345,7 +354,7 @@
     {
         if (accepted(clazz, runtimeInvisibleAnnotationsAttribute))
         {
-            runtimeInvisibleAnnotationsAttribute.accept(clazz, method, attributeVisitor);
+            attributeVisitor.visitRuntimeInvisibleAnnotationsAttribute(clazz, method, runtimeInvisibleAnnotationsAttribute);
         }
     }
 
@@ -354,7 +363,7 @@
     {
         if (accepted(clazz, runtimeVisibleParameterAnnotationsAttribute))
         {
-            runtimeVisibleParameterAnnotationsAttribute.accept(clazz, method, attributeVisitor);
+            attributeVisitor.visitRuntimeVisibleParameterAnnotationsAttribute(clazz, method, runtimeVisibleParameterAnnotationsAttribute);
         }
     }
 
@@ -363,7 +372,79 @@
     {
         if (accepted(clazz, runtimeInvisibleParameterAnnotationsAttribute))
         {
-            runtimeInvisibleParameterAnnotationsAttribute.accept(clazz, method, attributeVisitor);
+            attributeVisitor.visitRuntimeInvisibleParameterAnnotationsAttribute(clazz, method, runtimeInvisibleParameterAnnotationsAttribute);
+        }
+    }
+
+
+    public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute)
+    {
+        if (accepted(clazz, runtimeVisibleTypeAnnotationsAttribute))
+        {
+            attributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, runtimeVisibleTypeAnnotationsAttribute);
+        }
+    }
+
+
+    public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Field field, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute)
+    {
+        if (accepted(clazz, runtimeVisibleTypeAnnotationsAttribute))
+        {
+            attributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, field, runtimeVisibleTypeAnnotationsAttribute);
+        }
+    }
+
+
+    public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute)
+    {
+        if (accepted(clazz, runtimeVisibleTypeAnnotationsAttribute))
+        {
+            attributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, method, runtimeVisibleTypeAnnotationsAttribute);
+        }
+    }
+
+
+    public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute)
+    {
+        if (accepted(clazz, runtimeVisibleTypeAnnotationsAttribute))
+        {
+            attributeVisitor.visitRuntimeVisibleTypeAnnotationsAttribute(clazz, method, codeAttribute, runtimeVisibleTypeAnnotationsAttribute);
+        }
+    }
+
+
+    public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute)
+    {
+        if (accepted(clazz, runtimeInvisibleTypeAnnotationsAttribute))
+        {
+            attributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, runtimeInvisibleTypeAnnotationsAttribute);
+        }
+    }
+
+
+    public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Field field, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute)
+    {
+        if (accepted(clazz, runtimeInvisibleTypeAnnotationsAttribute))
+        {
+            attributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, field, runtimeInvisibleTypeAnnotationsAttribute);
+        }
+    }
+
+
+    public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute)
+    {
+        if (accepted(clazz, runtimeInvisibleTypeAnnotationsAttribute))
+        {
+            attributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, method, runtimeInvisibleTypeAnnotationsAttribute);
+        }
+    }
+
+
+    public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute)
+    {
+        if (accepted(clazz, runtimeInvisibleTypeAnnotationsAttribute))
+        {
+            attributeVisitor.visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, method, codeAttribute, runtimeInvisibleTypeAnnotationsAttribute);
         }
     }
 
@@ -372,7 +453,7 @@
     {
         if (accepted(clazz, annotationDefaultAttribute))
         {
-            annotationDefaultAttribute.accept(clazz, method, attributeVisitor);
+            attributeVisitor.visitAnnotationDefaultAttribute(clazz, method, annotationDefaultAttribute);
         }
     }
 
diff --git a/src/proguard/classfile/attribute/visitor/AttributeVisitor.java b/src/proguard/classfile/attribute/visitor/AttributeVisitor.java
index 76c1ab9..a9fc6b6 100644
--- a/src/proguard/classfile/attribute/visitor/AttributeVisitor.java
+++ b/src/proguard/classfile/attribute/visitor/AttributeVisitor.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -62,8 +62,9 @@
 
     // Attributes that are attached to methods.
 
-    public void visitExceptionsAttribute(            Clazz clazz, Method method, ExceptionsAttribute exceptionsAttribute);
-    public void visitCodeAttribute(                  Clazz clazz, Method method, CodeAttribute       codeAttribute);
+    public void visitMethodParametersAttribute(      Clazz clazz, Method method, MethodParametersAttribute methodParametersAttribute);
+    public void visitExceptionsAttribute(            Clazz clazz, Method method, ExceptionsAttribute       exceptionsAttribute);
+    public void visitCodeAttribute(                  Clazz clazz, Method method, CodeAttribute             codeAttribute);
 
     // Attributes that are attached to code attributes.
 
@@ -86,5 +87,15 @@
     public void visitRuntimeVisibleParameterAnnotationsAttribute(  Clazz clazz, Method method, RuntimeVisibleParameterAnnotationsAttribute   runtimeVisibleParameterAnnotationsAttribute);
     public void visitRuntimeInvisibleParameterAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleParameterAnnotationsAttribute runtimeInvisibleParameterAnnotationsAttribute);
 
+    public void visitRuntimeVisibleTypeAnnotationsAttribute(       Clazz clazz,                                             RuntimeVisibleTypeAnnotationsAttribute   runtimeVisibleTypeAnnotationsAttribute);
+    public void visitRuntimeVisibleTypeAnnotationsAttribute(       Clazz clazz, Field  field,                               RuntimeVisibleTypeAnnotationsAttribute   runtimeVisibleTypeAnnotationsAttribute);
+    public void visitRuntimeVisibleTypeAnnotationsAttribute(       Clazz clazz, Method method,                              RuntimeVisibleTypeAnnotationsAttribute   runtimeVisibleTypeAnnotationsAttribute);
+    public void visitRuntimeVisibleTypeAnnotationsAttribute(       Clazz clazz, Method method, CodeAttribute codeAttribute, RuntimeVisibleTypeAnnotationsAttribute   runtimeVisibleTypeAnnotationsAttribute);
+
+    public void visitRuntimeInvisibleTypeAnnotationsAttribute(     Clazz clazz,                                             RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute);
+    public void visitRuntimeInvisibleTypeAnnotationsAttribute(     Clazz clazz, Field  field,                               RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute);
+    public void visitRuntimeInvisibleTypeAnnotationsAttribute(     Clazz clazz, Method method,                              RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute);
+    public void visitRuntimeInvisibleTypeAnnotationsAttribute(     Clazz clazz, Method method, CodeAttribute codeAttribute, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute);
+
     public void visitAnnotationDefaultAttribute(                   Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute);
 }
diff --git a/src/proguard/classfile/attribute/visitor/BootstrapMethodInfoVisitor.java b/src/proguard/classfile/attribute/visitor/BootstrapMethodInfoVisitor.java
index 9aab92e..fb2a9d6 100755
--- a/src/proguard/classfile/attribute/visitor/BootstrapMethodInfoVisitor.java
+++ b/src/proguard/classfile/attribute/visitor/BootstrapMethodInfoVisitor.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -20,10 +20,8 @@
  */
 package proguard.classfile.attribute.visitor;
 
-import proguard.classfile.*;
-import proguard.classfile.attribute.*;
-
-import java.beans.MethodDescriptor;
+import proguard.classfile.Clazz;
+import proguard.classfile.attribute.BootstrapMethodInfo;
 
 
 /**
diff --git a/src/proguard/classfile/attribute/visitor/ExceptionInfoVisitor.java b/src/proguard/classfile/attribute/visitor/ExceptionInfoVisitor.java
index 4a765f2..953dc06 100644
--- a/src/proguard/classfile/attribute/visitor/ExceptionInfoVisitor.java
+++ b/src/proguard/classfile/attribute/visitor/ExceptionInfoVisitor.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/visitor/InnerClassesInfoVisitor.java b/src/proguard/classfile/attribute/visitor/InnerClassesInfoVisitor.java
index b373493..f9e1a03 100644
--- a/src/proguard/classfile/attribute/visitor/InnerClassesInfoVisitor.java
+++ b/src/proguard/classfile/attribute/visitor/InnerClassesInfoVisitor.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/visitor/LineNumberInfoVisitor.java b/src/proguard/classfile/attribute/visitor/LineNumberInfoVisitor.java
index 189b3d0..5a6400d 100644
--- a/src/proguard/classfile/attribute/visitor/LineNumberInfoVisitor.java
+++ b/src/proguard/classfile/attribute/visitor/LineNumberInfoVisitor.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/visitor/LocalVariableInfoVisitor.java b/src/proguard/classfile/attribute/visitor/LocalVariableInfoVisitor.java
index c888d63..dd17bea 100644
--- a/src/proguard/classfile/attribute/visitor/LocalVariableInfoVisitor.java
+++ b/src/proguard/classfile/attribute/visitor/LocalVariableInfoVisitor.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/visitor/LocalVariableTypeInfoVisitor.java b/src/proguard/classfile/attribute/visitor/LocalVariableTypeInfoVisitor.java
index f992e6d..c37e9d7 100644
--- a/src/proguard/classfile/attribute/visitor/LocalVariableTypeInfoVisitor.java
+++ b/src/proguard/classfile/attribute/visitor/LocalVariableTypeInfoVisitor.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
diff --git a/src/proguard/classfile/attribute/visitor/MultiAttributeVisitor.java b/src/proguard/classfile/attribute/visitor/MultiAttributeVisitor.java
index 37c0639..968f852 100644
--- a/src/proguard/classfile/attribute/visitor/MultiAttributeVisitor.java
+++ b/src/proguard/classfile/attribute/visitor/MultiAttributeVisitor.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -220,6 +220,15 @@
     }
 
 
+    public void visitMethodParametersAttribute(Clazz clazz, Method method, MethodParametersAttribute methodParametersAttribute)
+    {
+        for (int index = 0; index < attributeVisitors.length; index++)
+        {
+            attributeVisitors[index].visitMethodParametersAttribute(clazz, method, methodParametersAttribute);
+        }
+    }
+
+
     public void visitExceptionsAttribute(Clazz clazz, Method method, ExceptionsAttribute exceptionsAttribute)
     {
         for (int index = 0; index < attributeVisitors.length; index++)
@@ -355,6 +364,78 @@
     }
 
 
+    public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute)
+    {
+        for (int index = 0; index < attributeVisitors.length; index++)
+        {
+            attributeVisitors[index].visitRuntimeVisibleTypeAnnotationsAttribute(clazz, runtimeVisibleTypeAnnotationsAttribute);
+        }
+    }
+
+
+    public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Field field, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute)
+    {
+        for (int index = 0; index < attributeVisitors.length; index++)
+        {
+            attributeVisitors[index].visitRuntimeVisibleTypeAnnotationsAttribute(clazz, field, runtimeVisibleTypeAnnotationsAttribute);
+        }
+    }
+
+
+    public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Method method, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute)
+    {
+        for (int index = 0; index < attributeVisitors.length; index++)
+        {
+            attributeVisitors[index].visitRuntimeVisibleTypeAnnotationsAttribute(clazz, method, runtimeVisibleTypeAnnotationsAttribute);
+        }
+    }
+
+
+    public void visitRuntimeVisibleTypeAnnotationsAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, RuntimeVisibleTypeAnnotationsAttribute runtimeVisibleTypeAnnotationsAttribute)
+    {
+        for (int index = 0; index < attributeVisitors.length; index++)
+        {
+            attributeVisitors[index].visitRuntimeVisibleTypeAnnotationsAttribute(clazz, method, codeAttribute, runtimeVisibleTypeAnnotationsAttribute);
+        }
+    }
+
+
+    public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute)
+    {
+        for (int index = 0; index < attributeVisitors.length; index++)
+        {
+            attributeVisitors[index].visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, runtimeInvisibleTypeAnnotationsAttribute);
+        }
+    }
+
+
+    public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Field field, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute)
+    {
+        for (int index = 0; index < attributeVisitors.length; index++)
+        {
+            attributeVisitors[index].visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, field, runtimeInvisibleTypeAnnotationsAttribute);
+        }
+    }
+
+
+    public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Method method, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute)
+    {
+        for (int index = 0; index < attributeVisitors.length; index++)
+        {
+            attributeVisitors[index].visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, method, runtimeInvisibleTypeAnnotationsAttribute);
+        }
+    }
+
+
+    public void visitRuntimeInvisibleTypeAnnotationsAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute, RuntimeInvisibleTypeAnnotationsAttribute runtimeInvisibleTypeAnnotationsAttribute)
+    {
+        for (int index = 0; index < attributeVisitors.length; index++)
+        {
+            attributeVisitors[index].visitRuntimeInvisibleTypeAnnotationsAttribute(clazz, method, codeAttribute, runtimeInvisibleTypeAnnotationsAttribute);
+        }
+    }
+
+
     public void visitAnnotationDefaultAttribute(Clazz clazz, Method method, AnnotationDefaultAttribute annotationDefaultAttribute)
     {
         for (int index = 0; index < attributeVisitors.length; index++)
diff --git a/src/proguard/classfile/attribute/visitor/NonEmptyAttributeFilter.java b/src/proguard/classfile/attribute/visitor/NonEmptyAttributeFilter.java
index 2ccc09c..4a54f75 100644
--- a/src/proguard/classfile/attribute/visitor/NonEmptyAttributeFilter.java
+++ b/src/proguard/classfile/attribute/visitor/NonEmptyAttributeFilter.java
@@ -2,7 +2,7 @@
  * ProGuard -- shrinking, optimization, obfuscation, and preverification
  *             of Java bytecode.
  *
- * Copyright (c) 2002-2013 Eric Lafortune (eric@graphics.cornell.edu)
+ * Copyright (c) 2002-2014 Eric Lafortune (eric@graphics.cornell.edu)
  *
  * This program is free software; you can redistribute it and/or modify it
  * under the terms of the GNU General Public License as published by the Free
@@ -24,7 +24,6 @@
 import proguard.classfile.attribute.*;
 import proguard.classfile.attribute.annotation.*;
 import proguard.classfile.attribute.preverification.*;
-import proguard.util.StringMatcher;
 
 /**
  * This AttributeVisitor delegates its visits another AttributeVisitor, but
@@ -54,7 +53,7 @@
 
     public void visitUnknownAttribute(Clazz clazz, UnknownAttribute unknownAttribute)
     {
-        unknownAttribute.accept(clazz, attributeVisitor);
+        attributeVisitor.visitUnknownAttribute(clazz, unknownAttribute);
     }
 
 
@@ -62,20 +61,20 @@
     {
         if (bootstrapMethodsAttribute.u2bootstrapMethodsCount > 0)
         {
-            bootstrapMethodsAttribute.accept(clazz, attributeVisitor);
+            attributeVisitor.visitBootstrapMethodsAttribute(clazz, bootstrapMethodsAttribute);
         }
     }
 
 
     public void visitSourceFileAttribute(Clazz clazz, SourceFileAttribute sourceFileAttribute)
     {
-        sourceFileAttribute.accept(clazz, attributeVisitor);
+        attributeVisitor.visitSourceFileAttribute(clazz, sourceFileAttribute);
     }
 
 
     public void visitSourceDirAttribute(Clazz clazz, SourceDirAttribute sourceDirAttribute)
     {
-        sourceDirAttribute.accept(clazz, attributeVisitor);
+        attributeVisitor.visitSourceDirAttribute(clazz, sourceDirAttribute);
     }
 
 
@@ -83,74 +82,83 @@
     {
         if (innerClassesAttribute.u2classesCount > 0)
         {
-            innerClassesAttribute.accept(clazz, attributeVisitor);
+            attributeVisitor.visitInnerClassesAttribute(clazz, innerClassesAttribute);
         }
     }
 
 
     public void visitEnclosingMethodAttribute(Clazz clazz, EnclosingMethodAttribute enclosingMethodAttribute)
     {
-        enclosingMethodAttribute.accept(clazz, attributeVisitor);
+        attributeVisitor.visitEnclosingMethodAttribute(clazz, enclosingMethodAttribute);
     }
 
 
     public void visitDeprecatedAttribute(Clazz clazz, DeprecatedAttribute deprecatedAttribute)
     {
-        deprecatedAttribute.accept(clazz, attributeVisitor);
+        attributeVisitor.visitDeprecatedAttribute(clazz, deprecatedAttribute);
     }
 
 
     public void visitDeprecatedAttribute(Clazz clazz, Field field, DeprecatedAttribute deprecatedAttribute)
     {
-        deprecatedAttribute.accept(clazz, field, attributeVisitor);
+        attributeVisitor.visitDeprecatedAttribute(clazz, field, deprecatedAttribute);
     }
 
 
     public void visitDeprecatedAttribute(Clazz clazz, Method method, DeprecatedAttribute deprecatedAttribute)
     {
-        deprecatedAttribute.accept(clazz, method, attributeVisitor);
+        attributeVisitor.visitDeprecatedAttribute(clazz, method, deprecatedAttribute);
     }
 
 
     public void visitSyntheticAttribute(Clazz clazz, SyntheticAttribute syntheticAttribute)
     {
-        syntheticAttribute.accept(clazz, attributeVisitor);
+        attributeVisitor.visitSyntheticAttribute(clazz, syntheticAttribute);
     }
 
 
     public void visitSyntheticAttribute(Clazz clazz, Field field, SyntheticAttribute syntheticAttribute)
     {
-        syntheticAttribute.accept(clazz, field, attributeVisitor);
+        attributeVisitor.visitSyntheticAttribute(clazz, field, syntheticAttribute);
     }
 
 
     public void visitSyntheticAttribute(Clazz clazz, Method method, SyntheticAttribute syntheticAttribute)
     {
-        syntheticAttribute.accept(clazz, method, attributeVisitor);
+        attributeVisitor.visitSyntheticAttribute(clazz, method, syntheticAttribute);
     }
 
 
     public void visitSignatureAttribute(Clazz clazz, SignatureAttribute signatureAttribute)
     {
-        signatureAttribute.accept(clazz, attributeVisitor);
+        attributeVisitor.visitSignatureAttribute(clazz, signatureAttribute);
     }
 
 
     public void visitSignatureAttribute(Clazz clazz, Field field, SignatureAttribute signatureAttribute)
     {
-        signatureAttribute.accept(clazz, field, attributeVisitor);
+        attributeVisitor.visitSignatureAttribute(clazz, field, signatureAttribute);
     }
 
 
     public void visitSignatureAttribute(Clazz clazz, Method method, SignatureAttribute signatureAttribute)
     {
-        signatureAttribute.accept(clazz, method, attributeVisitor);
+        attributeVisitor.visitSignatureAttribute(clazz, method, signatureAttribute);
     }
 
 
     public void visitConstantValueAttribute(Clazz clazz, Field field, ConstantValueAttribute constantValueAttribute)
     {
-        constantValueAttribute.accept(clazz, field, attributeVisitor);
+        attributeVisitor.visitConstantValueAttribute(clazz, field, constantValueAttribute);
+    }
+
+
+    public void visitMethodParametersAttribute(Clazz clazz, Method method, MethodParametersAttribute exceptionsAttribute)
+    {
+        if (exceptionsAttribute.u1parametersCount > 0)
+        {
+            attributeVisitor.visitMethodParametersAttribute(clazz, method, exceptionsAttribute);
+        }
     }
 
 
@@ -158,14 +166,14 @@
     {
         if (exceptionsAttribute.u2exceptionIndexTableLength > 0)
         {
-            exceptionsAttribute.accept(clazz, method, attributeVisitor);
+            attributeVisitor.visitExceptionsAttribute(clazz, method, exceptionsAttribute);
         }
     }
 
 
     public void visitCodeAttribute(Clazz clazz, Method method, CodeAttribute codeAttribute)
     {
-        codeAttribute.accept(clazz, method, attributeVisitor);
+        attributeVisitor.visitCodeAttribute(clazz, method, codeAttribute);
     }
 
 
@@ -173,7 +181,7 @@
     {
         if (stackMapAttribute.u2stackMapFramesCount > 0)
         {
-            stackMapAttribute.accept(clazz, method, codeAttribu