*** Changes in GCC 4.0:

* Character encoders and decoders have been added for: iso-8859-6
(arabic), iso-8859-7 (greek), iso-8859-8 (hebrew), iso-8859-9
(latin-5), iso-8859-13, iso-8859-15 (latin-9), cp1047 (ebcdic),
ebcdic-xml-us,ascii, windows-1250, windows-1252, UTF-16BE (Big Endian),
UTF-16LE (Little Endian), UTF-32BE (Big Endian), UTF-32LE (Little
Endian).

* Lots of Calendar bug fixes.

* The http url protocol handler has been replaced with a full HTTP/1.1
version from GNU inetlib.

* A new ftp url protocol handler has been added also from GNU inetlib.

* java.beans has been updated to 1.4 including support for XMLEncoder
and XMLDecoder.

* Added implementations of javax.xml (JAXP 1.3), org.xml.sax (SAX2)
and org.w3c.dom (DOM Level 3) interfaces. It is possible to switch
between different implementations AElfred2, GNU DOM, GNU XSL, libxmlj
SAX, libxmlj DOM and libxmlj XSL by setting different system
properties.  Also provided is a preliminary XPath 1.0
implementation. The libxmlj versions are build around libxml2 and
libxslt and have to be enabled during build time by the --enable-xmlj
configure flag. The current support is equal to the last released GNU
JAXP 1.3 release. These packages will be maintained as part of the GNU
Classpath core classes in the future. For more information,
conformance results and documentation on selecting different
implementations see doc/README.jaxp.

* Much fuller collection documentation.

* libgcj can now load service providers that are described via
META-INF/services/* resources in extension JARs. This is useful for
implementing the various APIs that are supposed to be extensible via
custom plugins. For details, please see the documentation of
gnu.classpath.ServiceFactory.

* GNU Classpath's JAR implementation now has preliminary support for
signed entries, for so called "signed JAR" file support. Signed JAR
files are one of the key security features of managed runtimes, and
allows code to run privileged given unforgeable proofs of identity.

* A much improved version of X.509 certificates has been added,
including a robust certificate path checking algorithm. Also included
is an implementation of the RSA signature scheme.

* New javax.crypto, javax.crypto.interfaces, javax.crypto.spec,
javax.net, javax.net.ssl, javax.security.auth,
javax.security.auth.callback, javax.security.auth.login,
javax.security.auth.x500, javax.security.sasl and org.ietf.jgss
packages are now officially part of GNU Classpath. Extra crypto
algorithms can be obtained from the GNU Crypto project, a full TLS
implementation is provided by the Jessie project.
http://www.gnu.org/software/gnu-crypto/ 
http://www.nongnu.org/jessie/

* java.security.AccessController has been implemented.

* The default java.lang.SecurityManager now uses AccessController.

* Lookahead support for regular expressions.

* java.util.regexp implementation through gnu.regexp wrappers.

* Serialization object stream fixes for multiple ClassLoader scenarios.

* java.net.URL now uses application classloader to load
URLStreamHandlers and reuses URLStreamHandlers when URL is reset (but
protocol isn't changed).

* java.io.File.deleteOnExit() implementation.

* java.io is now implemented by delegating most tasks directly to
java.nio.

* Reworked/Optimized implementations of java.nio.Buffer and subclasses.

* BufferedReader speed improvements.

* Multiple java.net.InetAdress fixes and java.rmi fixes.

* ServerSocket.accept() now restarts listening when system call
interrupted.

* java.net.URI implementation.

* New javax.print, javax.print.attribute[.standard] and
javax.print.event packages and classes.

* java.text multiple new features and bug fixes (only 2 out of the
1000+ java.text Mauve tests now fail).

* java.text attributed iterators support.

* Improved useabilty of java.text implementation for several
applications.

* More AWT accessible support.

* AWT gtk+ peers component layout, dialog placement, keyboard focus
handling and text positioning have been improved.

* ImageIO interfaces are more complete.

* JList, JTable and JTree have been hugely improved.

* java.awt.Robot support with GdkRobot in the gtk+ awt peers. Needs
XTest Extension (libXtst) XServer support.

* Full java.awt.color implementation, with all standard ICC profiles,
except for PhotoYCC color space.

* java.awt.image support updated to 1.4.

* Big-endian (PowerPC) fixes for native awt GTK+ peers.

* Better AWT focus management fro GTK+ peers.

* Much faster and better fonts support (for both gdk Graphics and cairo
Graphics2D)

* AWT Choice fixes for hidden components.

* More javax.imageio support.

* Better AWT Help MenuBar support.

* Swing TabbedPane, ColorChooser and ComboBox improvements.

* Start of JTree functionality.

* javax.swing.Spring and SpringLayout support.

* Added pluggable look and feel support for BasicTextFieldUI and
BasicToolBarSeparatorUI.

* java.swing.text support for (Default and Layered) Highlighter,
FieldView, PlainView, TabExpander and TabableView added.

* Start of JTable and JTree implementation.

* Internal Swing frames work.

* JMenu and JPopupMenu work.

* New gtk+ AWT FileDialog peer now based on gtk+2.4 or higher.

* java.awt.image LookupTables and kernel support.

* Improved java.awt.image.BufferedImage support.

* AWT 1.0 event model support.

* Frame.setIconImage() support.

* AWT GDKGraphics scaling.

* New configure flag --enable-gtk-cairo to build Graphics2D
implementation build on cairo and pangoft2. Enabled at runtime by
defining the system property gnu.java.awt.peer.gtk.Graphics=Graphics2D.

* javax.swing.JSpinner implemented.

* java.awt.geom completed. Area, Arc2D, Ellipse2D and Line2D
implemented.

* JColorChooser, JComboBox and JTextField implemented, including
example uses in GNU Classpath Examples swing Demo.

* Better (non-black) default AWT System colors.

* AWT lists use GTK treeviews.

* Proper AWT focus management has been implemented.

* Swing menus and scrollpanes are beginning to work.

* Swing splitpanes, dialogs and internal frames were added.

* Swing repainting / double buffering was redone.

* Font management and Pango DPI conversion fixes.

* A lot of AWT imaging and event bugs have been picked out.

* More of javax.swing.text has been implemented.

* javax.swing.Timer has been reimplemented.

* The gnu.java.awt.EmbeddedWindow class has been improved, and now
supports embedding AWT windows in other top-level X windows. This
functionality is required by gcjwebplugin.

* New javax.imageio, javax.imageio.event and javax.imageio.spi packages
and classes.

* Working implementation of javax.swing.undo.

* java.awt.geom.CubicCurve2D/QuadCurve2D: Can now solve cubic and
quadratic equations; implementation adapted from the GNU Scientific
Library.

* Lots of java.awt and gtk+ peer improvements. Also more Swing work.
Start of EmbeddedWindow support.

*** Changes in GCC 3.4:

* Compiling a .jar file will now cause non-.class entries to be automatically 
  compiled as resources.

* libgcj has been ported to Darwin.

* Jeff Sturm has adapted Jan Hubicka's call graph optimization code to gcj.

* libgcj has a new gcjlib URL type; this lets URLClassLoader load code from 
  shared libraries.

* libgcj has been much more completely merged with GNU Classpath.

* Class loading is now much more correct; in particular the caller's class 
  loader is now used when that is required.

* Eclipse 2.x will run out of the box using gij.

* Parts of java.nio have been implemented. Direct and indirect buffers work, 
  as do fundamental file and socket operations.

* java.awt has been improved, though it is still not ready for general use.

* The HTTP protocol handler now uses HTTP/1.1 and can handle the POST method.

* The MinGW port has matured. Enhancements include socket timeout support, 
  thread interruption, improved Runtime.exec() handling and support for 
  accented characters in filenames.

*** Changes in GCC 3.3:

* The java.sql and javax.sql packages now implement the JDBC 3.0 (JDK 1.4) 
  API.

* The JDK 1.4 assert facility has been implemented.

* The bytecode interpreter is now direct threaded and thus faster.


*** Changes in GCC 3.1:

* libgcj now includes RMI, java.lang.ref.*, javax.naming, and 
  javax.transaction.

* Property files and other system resources can be compiled into executables 
  which use libgcj using the new gcj --resource feature.

* libgcj has been ported to more platforms. In particular there is now a 
  mostly-functional mingw32 (Windows) target port.

* JNI and CNI invocation interfaces were implemented, so gcj-compiled Java 
  code can now be called from a C/C++ application.

* gcj can now use builtin functions for certain known methods, for instance 
  Math.cos.

* gcj can now automatically remove redundant array-store checks in some common 
  cases.

* The --no-store-checks optimization option was added. This can be used to 
  omit runtime store checks for code which is known not to throw 
  ArrayStoreException

* The following third party interface standards were added to libgcj: 
  org.w3c.dom and org.xml.sax.

* java.security has been merged with GNU Classpath. The new package is now 
  JDK 1.2 compliant, and much more complete.

* A bytecode verifier was added to the libgcj interpreter.

* java.lang.Character was rewritten to comply with the Unicode 3.0 standard, 
  and improve performance.

* Partial support for many more locales was added to libgcj.

* Socket timeouts have been implemented.

* libgcj has been merged into a single shared library. There are no longer 
  separate shared libraries for the garbage collector and zlib.

* Several performance improvements were made to gcj and libgcj:
      o Hash synchronization (thin locks)
      o A special allocation path for finalizer-free objects
      o Thread-local allocation
      o Parallel GC, and other GC tweaks

*** Changes in GCC 3.0:

* libgcj now includes a bytecode interpreter. If a compiled version of a class 
is not found in the application binary or linked shared libraries, the
class loader will search for a bytecode version in the CLASSPATH and execute
it using the interpreter. A new front end that behaves like the traditional
`java' command is also provided: `gij'.

* Support for specifying java system properties. Properties can either be set 
at runtime via the GCJ_PROPERTIES environment variable in the format 
"<name>=<value> ..."'; or can be compiled into an application binary using 
-D<name>=<value>.

* Support for setjmp/longjmp (sjlj) exception handling has been added, as an
alternative to the existing range-table based mechanism. sjlj is the default
on non-sparc, non-x86 targets, or can be specified with the 
`--enable-sjlj-exceptions' configure parameter.

* Complete JDK 1.1 reflection support, including invocation.

* Throwable.printStackTrace() has been implemented.

* Runtime.loadLibrary() has been implemented.

* Class.forName() will now try to load a series of shared objects in order 
to find the requested class.  If a class `gnu.quux.whatever' is requested, 
libgcj will search the system shared library path (eg LD_LIBRARY_PATH) for 
`gnu-quux-whatever.so', then `gnu-quux.so', and finally `gnu.so'.

* A pure-java implementation of java.math.BigInteger.

New in libgcj 2.95:

* First public release
