Key:

SX  - http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=X
RHX - https://bugzilla.redhat.com/show_bug.cgi?id=X
DX  - http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=X
GX  - http://bugs.gentoo.org/show_bug.cgi?id=X
CAX - http://server.complang.tuwien.ac.at/cgi-bin/bugzilla/show_bug.cgi?id=X
LPX - https://bugs.launchpad.net/bugs/X 
PRX - http://gcc.gnu.org/bugzilla/show_bug.cgi?id=X

CVE-XXXX-YYYY: http://www.cve.mitre.org/cgi-bin/cvename.cgi?name=XXXX-YYYY

New in release 0.99.1 (XXX XX, 2012)

* Bug fixes:
  - PR42134: NPE in java.text.Bidi
  - PR54931: Classpath will not build docs with version of GJDoc included with itself
  - PR54960: Avoid NullPointerException in SAXSerializer.
  - PR42551: Avoid overwriting length of message when computing length representation.
  - PR44208: Ensure a handle for the enum is registered before its constant.
  - PR41689: javax.security.sasl.CREDIENTIALS field is missing
  - PR55140: Addition of exception to codePointBefore breaks OpenJDK GenerateBreakIteratorData tool

New in release 0.99 (Feb 15, 2012)

* Addition of java.util.regex.Pattern.quote.
* Addition of java.io.IOError.
* Addition of java.io.Console.
* Bug fixes:
  - PR39408: gjavah doesn't generate constants in header files where they occur in a superclass
  - PR40590: namespace namespace broken in CNI
  - PR40630: java.util.Scanner fails when used for charset generation by the OpenJDK build
  - PR40653: Issue with XML stream writer and namespaces
  - PR40663: Support Stax API 1.0.1
  - PR39177: trunk revision 144128 - jar: internal error: java.lang.NullPointerException
  - PR41696: java.util.zip.Inflater:finished () returns false when it should return true
  - PR43536: CopyOnWriteArrayList bug in delete() when empty
  - PR36560: java.util.zip: Error parsing zip file with larger files in it
  - Restrict access to VM classes.
  - Cleanup use of message resources.
  - Throw exception when encrypted zip file entries are encountered.
  - Fix infinite recursion in javax.print.attribute.standard.JobStateReasons.add.
  - Native code cleanups in GtkToolkit.c and jcl.c.
  - Only log when debugging is on.
  - PR44411: System.nanoTime() is not independent of wall-clock time
  - PR46775: Calling Policy.setPolicy with a new Policy object has no effect on the DefaultSecurityManager
  - Use implementation of VMClass.getSimpleName from gcj.
  - Simplify security determination in ProtectionDomain in situations where all permissions are available.
  - PR42390: Missing Security Manager checks in classpath apis
  - Throw NullPointerExceptions appropriately for compatibility with OpenJDK.
  - Use Integer.parseInt in preference to Integer.decode in java.util.Formatter.
  - Use same default capacity in java.util.HashMap as documented in OpenJDK.
  - Check for hashcode equality before calling equals in java.util.HashMap.put
  - Make sure match is within input data limits in java.util.regex.Matcher.find.
  - Fix misuse of ArrayList.set in javax.swing.text.html.StyleSheet.resolveStyle.
  - PR48131: java.util.zip.ZipException: incomplete dynamic bit lengths tree
  - Check for negative capacity in VMDirectByteBuffer's native code.
  - PR42823: tcp/ip sockets read/write operations causes memory leak 
  - Generate META-INF/INDEX.LST for glibj.zip
  - Fix issues when building with -Werror and gcc 4.6.
  - PR40188: javah creates constants using name of superclass
  - PR45527: gjavah encodes $ as used in inner classes as 00024 where Oracle's javah does not
  - PR45526: gjavah does not implicitly produce header files for inner classes
  - Fix NullPointerException for null keys in java.util.HashMap.put.
  - Fix BEAST security issue in gnu.javax.net.ssl.provider.
  - RH712013: pdftk crashes with java.lang.ArrayIndexOutOfBoundsException
* Updated to libtool 2.x.
* Lots of warning fixes / addition of generics.
* Fix license headers in tools.
* Normalise whitespace.
* Maintenance work on javac detection.
* Mark plugin as unmaintained and disable by default.

New in release 0.98 (Feb 05, 2009)

* Native support for BigInteger is now provided using the GMP
library.  A new option, --enable/disable-gmp is provided, and
the option is enabled by default if GMP is found.
* Classpath now makes use of a new StringBuilder implementation
internally called CPStringBuilder.  In addition to being
unsynchronised, like StringBuilder, this also avoids copying the
array when toString or substring is called.  While StringBuffer/Builder
always retain their own array, which is only altered during resizing,
CPStringBuilder gives away its array when the result is generated
by toString()/substring() and starts afresh.  The default capacity of
CPStringBuilder can also be configured using the
gnu.classpath.cpstringbuilder.capacity property. (PR21869)
* gjdoc is now built as part of tools.zip.
* Import of the Java Activation Framework from ClasspathX to provide
javax.activation (part of 1.6).
* Preliminary version of java.util.Scanner (PR30436)
* Reduce cost of ThreadLocal(s) to improve Jython performance (PR33690)
* Updated to use CLDR 1.5.1 (PR35237)
* Many bug fixes including:
  - PR22851: zoneStrings in gnu/java/locale/LocaleInformation*
  - PR31895: setCurrency(Currency) does not actually change the currency.
  - PR32028: Make fails at gjdoc
  - PR34840: Mismatch between Sun and Classpath's java.lang.Appendable
  - PR35487: gcj causes ConcurrentModificationException during tomcat5
  - PR35690: javax.tools.FileObject.toUri is in wrong case
  - PR36085: java.util.regex escape-sequence handling 
  - PR36147: Apache Tomcat fails to read descriptors using GNU XML
  - PR36219: gnu.xml.transform.SortKey isn't subclass
  - PR36220: NPEs in gnu.xml.transform.* clone methods 
  - PR36221: DomDOMException running SPEC jvm 2008 xml.transform
  - PR36477: OOME in CPStringBuilder when running Eclipse
  - PR36522: Policy file is not read at all
  - PR36636: gjar -u doesn't work
  - PR36637: --without-fastjar doesn't wor
  - PR36677: Omission bug in JDWP VirtualMachineCommandSet 
  - PR38417: gnu.java.security.util.PRNG produces easily predictable values
  - PR38473: Segmentation fault in retrieving font outline decomposition 
  - PR38861: Support XULRunner 1.9.1.
  - PR38912: XMLParser not interning element names 

Runtime interface changes:

  * VMSecureRandom has moved to gnu.java.security.jce.prng.VMSecureRandom
  as part of the fix for PR38417.
  * gnu.java.lang.VMCPStringBuilder has been added and should be added to
  avoid the inefficency of reflection when creating non-copied String objects.

Bug fixes in release 0.97.2 (Jun 06, 2007)

* Include headers in the release tarball.
* Allow the building of tools to be optional.
* Only check for a Java compiler when required.
* Allow VMOperatingSystemMXBeanImpl to compile on Solaris.
* Documentation typo fixes
* Fix memory leak in native/jni/classpath/jcl.c
* Web page updates (PR classpath/22883)
* Fixes to pass the JSR166 TCK
* Use awk to construct the classlist on building
* Fix deadlock in Logger (PR classpath/35974)
* Fix regression in java.lang.String (PR classpath/35482)
* Allow Classpath tools to handle @file options.
* Allow parseInt to handle a + prefix correctly.
* Remove use of 1.5 language constructs in the VM layer.

Bug fixes in release 0.97.1 (Mar 11, 2007)

* Include documentation for JSR166 (java.util.concurrent)
* Fix STaX API compatability.
* Include the tools properties file in the release tarball.

New in release 0.97 (Feb 22, 2007)

Build changes:

* A copy of javah (to produce C header files from Java source code)
is now required to generate the files in include.
* The javac check has been changed so that it attempts to find ecj,
javac and gcj (in that order).  You may override this by using
JAVAC=<preferred javac>

Runtime interface changes:

* Removed VMFloat.floatToIntBits amd VMDouble.doubleToLongBits.
* Added new getParameterAnnotations() methods in Constructor and Method.

New in release 0.96.1 (Oct 16, 2007)

* Small compile, configure and build fixes.

New in release 0.96 (Oct 15, 2007)

* New experimental GStreamer javax.sound peer (see README.gstreamer)
* The JNI interface has been updated to 1.6
* Better support for the OpenJDK javac compiler
* Support for using javah via tools.zip and com.sun.tools.javah.Main
* Much improved Escher AWT peers
* Many bug fixes including improvements to AWT and Swing support

Runtime interface changes:

* Add VMFloat.toString(float) and VMFloat.parseFloat(String). Default
  implementations are the same as previous behavior.
* Add new default implementations of VMMemoryMXBean.getHeapUsage()
  and VMMemoryMXBean.getNonHeapUsage() via iteration over the memory
  pools of the appropriate type.

New in release 0.95 (Apr 23, 2007)

* Full merge of 1.5 generics work.
* Added 1.6 java.util.ServiceLoader support.
* The ASM library is now included.  A separate copy is no longer
  needed.  gjavah works out of the box now.
* The setReadTimeout and getReadTimeout methods have been added to
  java.net.URLConnection.  They are now fully implemented for http URLs.
* The java.lang.management implementation now includes the new features
  added in 1.6
* java.util.TimeZone now reads time zone information from the system
  zoneinfo files (see also runtime interface changes below).
* The collection classes have been updated to support all the 1.6
  additions.
* java.util.spi 1.6 package has been added and is used in java.text.
* Bootstrappable with OpenJDK javac compiler
  (use configure --with-javac).
* Large speedups (and locking behaviour updated) in Graphics2D cairo
  and freetype support.
* Better detection of browser plugin mechanism for mozilla, iceweasel,
  firefox on various platforms.
* Inclusion of generic javadoc classes in tools.zip to support more
  javadoc processing tools.
* Added documentation for command lines options for the included GNU
  Classpath Tools gjar, gjavah, gnative2ascii, gorbd, grmid,
  grmiregistry, gserialver and gtnameserv.

Runtime interface changes:

* gnu.java.lang.management.VMThreadMXBeanImpl has gained three new
  optional native methods to allow the 1.6 version of the threading
  bean to be supported.  One (getMonitorInfo) fills in information
  about object monitor locks held by a thread and is only required
  if the monitoring of object monitor locks is supported by the VM.
  The other two (findDeadlockedThreads and getLockInfo) are related
  to ownable synchronizers (part of the java.util.concurrent suite)
  and only required if monitoring of locks relating to these is
  supported by the VM.
* java.util.VMTimeZone and java.util.TimeZone have been refactored
  to simplify the reference implementation.  VMTimeZone.readtzFile()
  and VMTimeZone.skipFully() have been removed, and a new method
  VMTimeZone.readSysconfigClockFile() has been introduced.
* VMs need to set the system property "gnu.java.util.zoneinfo.dir"
  to point to the directory where zoneinfo files live.  In libgcj
  this is set to the value of the TZDATA environment variable, or
  "/usr/share/zoneinfo" if this is not set.
* VMFile has been extended to support new 1.6 methods (canExecute,
  setReadable, setWritable, setExecutable).

New in release 0.93 (Dec 8, 2006)

* CORBA objects that exist on the same virtual machine and only are connected
  to another ORB are now accessed directly and no longer via network. It is
  the same feature that RMI implementation provides. These faster calls should
  be completely transparent, as the parameters are cloned, where required. 
  Currently the direct calls are only possible for the non-deprecated objects
  that are connected to the ORB via POA.
* The 'javah' tool has been added.  It requires the ASM library
  (see asm.objectweb.org); it can be enabled with the --with-asm
  option to configure
* Added the rmi and corbaname URL context factories for JNDI.
* Fixes in the JNDI InitialContext now allows to plug-in user implementation.
* Removed currentClassLoader method from
  vm/reference/java/io/ObjectInputStream.java.
* Added firstNonNullClassLoader method to
  vm/reference/gnu/classpath/VMStackWalker.java. VMs are encouraged to
  provide a more efficient implementation.
* Added aton method to vm/reference/java/net/VMInetAddress.java.
* NetworkInterface has been implemented for systems that provide the
  `getifaddrs' function.
* java.nio.channels.Selector implementations have been added that use
  the kqueue notification mechanism on Mac OS X and *BSD, and that use
  the epoll notification mechanism on Linux 2.6.
* java.nio has been refactored to support more non-blocking operations
  natively. Blocking IO classes have been refactored to call
  non-blocking classes. Non-blocking accepts, connects, and
  scatter-gather IO should now be better supported.
* HTML support for Swing has been greatly enhanced.

Runtime interface changes:

* java.net.VMNetworkInterface and java.net.NetworkInterface have been
  updated to keep native-modified state in the former, and to simplify
  the native code in our reference implementation.
* gnu.java.nio.VMChannel has been expanded to better support native
  non-blocking IO. Most native state data (such as file descriptor
  integers) has been abstracted away into private state in the runtime
  interface.
* gnu.java.nio.VMPipe has been similarly changed.
* gnu.java.net.VMPlainSocketImpl has been changed to remove some
  functionality now provided by VMChannel; datagram socket-specific
  methods have also been moved here, deprecating VMPlainDatagramSocketImpl.
* gnu.java.net.VMPlainDatagramSocketImpl removed.

New in release 0.92 (Aug 9, 2006)

* GConf is used as a backend for java.util.prefs. GNU Classpath 
  thanks to Mario Torre for this contribution!
* libjawtgnu.so has been renamed libjawt.so for binary compatibility.
  libjawt.so should be installed in a VM-specific directory rather
  than directly in /usr/lib.  Proprietary VMs put their libjawt.so
  implementations in VM-specific directories but search /usr/lib first.
  If GNU Classpath's libjawt.so is installed in /usr/lib it will create
  problems for people who use a proprietary VM to run AWT Native
  Interface applications.
* The GdkGraphics2D backend has been made the default.  There is no
  longer an explicit dependency on Cairo, the --enable-gtk-cairo
  configure option is gone, and GTK 2.8 or higher is now required to
  build the GTK peers.
* A Mozilla plugin, 'gcjwebplugin', is now included.  It introduces a
  dependency on the Mozilla plugin support headers and libraries.
* New java implementations of png and gif imageio readers and writers.
* A tools.texinfo document has been created and now includes
  documentation about:
  * appletviewer
  * gcjwebplugin
  * jarsigner
  * keytool
* Several new tools are now included:
  * appletviewer
  * jar
  * native2ascii
  * serialver
  * keytool
  * jarsigner
  A new configure option --enable-tool-wrappers causes wrapper
  binaries to be built for VMs that support the JNI Invocation API.
* We've imported the JSR 166 (concurrency) reference implementation.
* javax.sound.midi providers have been added to read and
  write standard MIDI files.
* A javax.sound.sampled .au and .wav file readers have been added.
* New Java Virtual Machine Tool Interface header, jvmti.h. 
* AWT peers for X Windows based on Escher (a pure java X protocol
  implementation) have been added. So far it supports AWT 1.1 style
  Graphics, image loading via ImageIO (PNG, GIF and BMP images in this
  release), top level components as well as mouse and keyboard input.
  It is capable of running many Swing applications. Graphics2D and
  AWT widgets are not yet supported with this peer set.
* GConf based util.peers backend (see the --enable-gconf-peer and
  --enable-default-preferences-peer configure options).
* Support for batch importing trusted certificates for use with ssl
  connections (see script/import-cacerts.sh).
* NIO scatter-gather channel support.

Runtime interface changes:

* A new class, VMURLConnection, is used to implement
  URLConnection.guessContentTypeFromStream.  The reference
  implementation uses libmagic (and falls back to doing nothing if
  libmagic is not available).
* The method gnu.java.io.PlatformHelper.toCanonicalForm() has been
  replaced with a JNI implementation of VMFile.toCanonicalForm() for
  GNU/Posix systems.
* A new class, VMRuntimeMXBeanImpl, is used to implement
  the low-level support of the runtime management bean.
  VMs should use it to supply the input arguments and start
  time of the VM.  In addition, one of sun.boot.class.path
  or java.boot.class.path should be defined by the VM to
  support the optional boot class path access functionality.
* The Unsafe class was moved back to the place expected by the JSR 166
  reference implementation.  We've also added a couple other new VM
  classes to support the JSR 166 code -- sun.reflect.Reflection and
  sun.reflect.misc.ReflectUtil.
* Another new class, VMClassLoadingMXBeanImpl, is used to implement
  the low-level support of the class loading management bean.
  VMs need to supply it with information about how many classes
  are currently loaded, how many have been unloaded and whether
  verbose class loading output is on or off.  Provision should also
  be made for the latter to be toggled at runtime.
* VMThreadMXBeanImpl is used to implement the low-level support
  of the thread management bean.  Providing this interface requires
  providing a fair amount of information about threads, including
  optional time and contention monitoring, and instances of the
  new ThreadInfo class in java.lang.management.  getState() has also
  been added to the VMThread interface; this is required by the bean
  as well as java.lang.Thread.
* VMMemoryMXBeanImpl is used to implement the low-level support
  of the memory management bean.  Providing this interface requires
  providing information about the levels of heap and non-heap memory,
  and the number of objects eligible for garbage collection.
* VMCompilationMXBeanImpl is used to allow for optional compilation
  time support for Just-In-Time compilers.
* VMMemoryPoolMXBeanImpl is used to implement the low-level support
  of the memory pool beans.  Providing this interface requires
  providing memory usage statistics for each supported bean.
* VMManagementFactory provides the names of the memory pools,
  memory managers and garbage collectors maintained by the virtual
  machine.  These are used to create the beans by the ManagementFactory.
* VMMemoryManagerMXBeanImpl and VMGarbageCollectorMXBeanImpl provide
  low-level support for memory managers (including the specific subclass
  of garbage collecting memory managers).  The interfaces for these
  require no more than enumerating the number of collections and the
  time spent (for garbage collectors) and a relationship to the memory
  pools (for all), along with a validity check.

New in release 0.91 (May 15, 2006)

* Experimental activation (java.rmi.activation) support, including RMI
  activation daemon and persistent naming service tools.
* Experimental printing support: The API implementation of the javax.print 
  packages has been finished and work on the printing provider implementation
  started. Currently supported features from the Java Print Service API are 
  print service discovery (CUPS registered printers), single document print 
  jobs and support for client-formatted print data. An example application
  (see: examples/gnu/classpath/examples/print/Demo) has been added to show 
  the API usage for service discovery and printing of files.
* The GTKToolkit now gives access to the both the system clipboard and
  system selection.
* Custom mouse cursor support has been added to the gtk+ peers. And cursors
  can now also be set on light-weight components.
* Free Swing improvements: Support for OceanTheme has been mostly completed
  and turned on as default Metal theme. X11-style Copy and Paste behavior in
  text components with the middle mouse button. Support cursor changes on
  various components when resizing. Support for Look and Feel window
  decorations has been added.
* Updated locale data information to CLDR 1.3.
* Various bugs in Classpath's SecureRandom implementations have been
  fixed; that class now respects the "securerandom.source" security
  property and the "java.security.egd" system property.
* Support for assistive technologies has been added to AWT and Swing.

Runtime interface changes:

* A new class, VMArray, is now available which separates the native
  array creation method from java.lang.reflect.Array.  
* A new class, gnu.classpath.Unsafe, is provided for handling the
  new low-level operations required by java.util.concurrent.
* The reference implementations of Method, Constructor, and Field
  now have a new native getModifiersInternal() method.  The public
  getModifiers() method in each case has been rewritten in terms of
  this method.
* The reference implementation of VMThread has been updated to handle
  the new Thread.UncaughtExceptionHandler support.
* A new class, java.security.VMSecureRandom, is now available that is
  used to generate random numbers for seeding cryptographically-secure
  pseudo-random number generators.
* VMClass and the reference implementations of Method, Constructor and Field
  now include a number of 1.5 methods imported from the generics branch.
  These are all optional (in the sense that the methods associated with them
  merely fail on use if the VM doesn't provide them, rather than the
  VM failing altogether), but VMs should aim to support them where possible.
* The implementation of java.lang.instrument has been merged to the main
  branch from the generics branch.
* The VM interfaces of the main branch and the generics branch are now
  consistent with one another.  As a result, the main branch includes an
  additional environ() function in VMSystem and an additional argument has
  been added to nativeSpawn() in VMProcess.
* Annotation support is now available in the main branch, if the VM supports
  it. The VM should implement VMClass.getDeclaredAnnotations,
  Constructor.getAnnotation, Constructor.getDeclaredAnnotations,
  Field.getAnnotation, Field.getDeclaredAnnotations, Method.getAnnotation and
  Method.getDeclaredAnnotations.
* java.lang.Package now has a new constructor that takes the defining
  ClassLoader as an extra argument. If you use a custom version of
  VMClassLoader, please switch it to use this constructor.
* The reference implementation of VMClassLoader.getBootPackages() now
  reads the META-INF/INDEX.LIST resource using the java.boot.class.path
  system property.

New in release 0.90 (March 6, 2006)

* Free Swing improvements: JTable columns are rearrangeable and
  resizeable with mouse. Painting and scrolling are now much
  faster. Plain text components now support highlighting and
  copy+paste to the system clipboard. Support for styled text has been
  improved, including some very basic HTML support. JFileChooser is
  now usable. Global event dispatching has been implemented. Memory
  consumption of Swing components has been reduced. Lots of general
  bugfixes. Added new system property to turn off Graphics2D use in
  Swing, even if Graphics2D is available: gnu.javax.swing.noGraphics2D

* AWT. Improved support for mixing "lightweight" and "heavyweight"
  Components in Containers. Better support for dynamically updated
  menus. Better 1.0 event model support for Scrollbars. Better class
  documentation of gtk+ awt peers.

* GNU Crypto and Jessie have been merged into GNU Classpath; this
  provides Classpath with a wide array of cryptographic algorithms
  (ciphers, message digests, etc.) and implementations of SSL version
  3 and TLS version 1. These roughly complement the public
  `java.security.' `javax.crypto,' and `javax.net.ssl' packages, and
  are service providers implementing the underlying algorithms.
 
* Updated HTTP and FTP URLConnection protocol handlers. HTTPS support
  out of the box.

* Unicode 4.0.0 is supported. Character now includes support for using
  ether a char or an int to identify code points.

* More correct handling of Object methods and serialization support
  for Proxy and abstract classes.

* The new folder tools includes GIOP and RMI stub and tie source code
  generators, IOR parser and both transient and persistent GIOP naming
  services.

* Added experimental support for dynamic creation of the RMI stubs
  using proxy classes. The rmic compiler is no longer required (unless
  for research and specific stubs).

* XML validaton support for RELAX NG and W3C XML schema namespace
  URIs. RELAX NG pluggable XML schema datatype library API and an
  implementation for XML Schema Datatypes
  (http://www.w3.org/TR/xmlschema-2/).

* Updated StAX implementaton to be compatible with final JSWDP 2.0.

* The default back end for java.util.prefs has been changed.  The new
  default is capable of saving and restoring preferences to and from
  the file system.

* javax.imageio.plugins.bmp implementation.

* Added --enable-collections configure option which builds
  "collections.jar", a 1.1 VM compatibility jar.

* gnu.regexp updated from GNU/Posix syntax to support util.regex
  syntax including various Unicode blocks, categories and properties.

Runtime interface changes:

* A new class, VMMath, is now available which separates the native
  mathematical functions from java.lang.Math.  The previous fdlibm
  implementation now forms the reference material for this class.

* Updated VMObjectInputStream class to return Thread context class
  loader if no other class loader is found.

* Updated documentation on InstrumentationImpl in vmintegration guide.

New in release 0.20 (Jan 13, 2006)

* New StAX pull parser and SAX-over-StAX driver. Lots of DOM, SAX/StAX,
  XPath and XSLT improvements.  Support for XInclude and XML Base added.
  Conformance is now regularly tested against various test-suites at
  http://builder.classpath.org/xml/ See also doc/README.jaxp.

* Full beans XMLEncoder implementation.

* javax.sound.sampled implementation.

* javax.print.attribute and javax.print.event implementated.

* Lots of new datatransfer, print swing and swing.text work and optimization.

* Additional 1.5 support. Including new (separate) generic branch release.

* SecurityManager cleanups and start of review of all Permission checks
  (includes adding lots of new checks to the Mauve test-suite).

* Buildable on cygwin.

* Fully buildable as "in-workspace" library-plus-vm inside (native) Eclipse
  see http://developer.classpath.org/mediation/ClasspathHackingWithEclipse

* Full example that shows a real world CORBA and Free Swing implementation.
  See examples/gnu/classpath/examples/CORBA/swing/README.html

* A list of bug fixes can be found at:
http://gcc.gnu.org/bugzilla/buglist.cgi?product=classpath&target_milestone=0.20

Runtime interface changes:

* New method VMStackWalker.getClassLoader() was added to avoid an infinite
  loop between getCallingClassLoader() and Class.getClassLoader().

* The included fdlibm implementation has seen several cleanups to handle
  new architectures and namespacing issues (in particular for ppc, darwin
  and non-C99 compilers). Please double check any arithmetic test against
  new platforms/runtimes.

* The gnu.java.net.Plain[Datagram]Socket implementations have been
  turned into VM reference classes with JNI/Posix implementations.

New in release 0.19 (Nov 2, 2005)

* The Swing RepaintManager has been reworked for more efficient painting,
  especially for large GUIs.

* The Swing layout manager OverlayLayout has been implemented, the BoxLayout
  has been rewritten to make use of the SizeRequirements utility class and
  caching for more efficient layout.

* Improved accessibility support for Swing.

* The java.net.HttpURLConnection implementation no longer buffers the
  entire response body in memory.  This means that response bodies
  larger than available memory can now be handled.

* The Andrew Watson, Vice President and Technical Director of the Object
  Management Group, has officially assigned us 20 bit Vendor Minor Code Id: 
  0x47430 ("GC") that will mark remote Classpath - specific system exceptions.
  Obtaining the VMCID means that GNU Classpath now is a recogniseable type of
  node in a highly interoperable CORBA world. 

* Classpath now includes the first working draft to support the RMI over
  IIOP protocol. The current implementation is capable for remote invocations,
  transferring various Serializables and Externalizables via RMI-IIOP protocol.
  It can flatten graphs and, at least for the simple cases, is interoperable
  with Sun's jdk 1.5.

* Qt4 configury switches for OS-X. Additional to the --enable-qt-peer, OS-X
  users with a Qt4 installation can build the qt-peers with the argument
  --with-qt4dir=<Qt4-installation-dir>.

* Significant progress has been made in the implementation of the 
  javax.swing.plaf.metal.* package, with most UI delegates in a working state
  now.  Please test this with your own applications and provide feedback that 
  will help us to improve this package.

* The GUI demo (gnu.classpath.examples.swing.Demo) has been extended to 
  highlight various features in our free-swing implementation. And includes
  a look and feel switcher (Metal default, Ocean or GNU).

Runtime interface changes:

* Changed implementation of VMClassLoader.getPackage(s) : new method
  VMClassLoader.getBootPackages should be implemented by the vm, and sould
  return a string array of boot package names ("java.lang", "java.net", ...).
  Feedback from vm implementors for usability and relevance of the
  getBootPackages method would be greatly appreciated.
  
New in release 0.18 (Sep 6, 2005)

* GNU JAWT implementation, the AWT Native Interface, which allows direct
  access to native screen resources from within a Canvas's paint method.
  GNU Classpath Examples comes with a Demo, see examples/README.
* awt.datatransfer updated to 1.5 with supports for FlavorEvents.
  The gtk+ awt peers now allow copy/paste of text, images, uris/files
  and serialized objects with other applications and tracking
  clipboard change events with gtk+ 2.6 (for gtk+ 2.4 only text and
  serialized objects are supported). A GNU Classpath Examples
  datatransfer Demo was added to show the new functionality.
* org.omg.PortableInterceptor and related functionality in other packages
  is now implemented:
    - The sever and client interceptors work as required since 1.4.
    - The IOR interceptor works as needed for 1.5. 
* The org.omg.DynamicAny package is completed and passes the prepared tests.
* The Portable Object Adapter should now support the output of the
  recent IDL to java compilers. These compilers now generate servants and 
  not CORBA objects as before, making the output depended on the existing 
  POA implementation. Completing POA means that such code can already be 
  tried to run on Classpath. Our POA is tested for the following usager
  scenarios:
    - POA converts servant to the CORBA object.
    - Servant provides to the CORBA object.
    - POA activates new CORBA object with the given Object Id (byte array) 
      that is later accessible for the servant.
    - During the first call, the ServantActivator provides servant for this 
      and all subsequent calls on the current object.
    - During each call, the ServantLocator provides servant for this call
      only.
    - ServantLocator or ServantActivator forwards call to another server.
    - POA has a single servant, responsible for all objects.
    - POA has a default servant, but some objects are explicitly connected 
      to they specific servants.
  The POA is verified using tests from the former cost.omg.org.      
* The javax.swing.plaf.multi.* package is now implemented.
* Editing and several key actions for JTree and JTable were implemented.
* Lots of icons and look and feel improvements for Free Swing basic and
  metal themes were added.  Try running the GNU Classpath Swing Demo in
  examples (gnu.classpath.examples.swing.Demo) with:
  -Dswing.defaultlaf=javax.swing.plaf.basic.BasicLookAndFeel
  -Dswing.defaultlaf=javax.swing.plaf.metal.MetalLookAndFeel
* Start of styled text capabilites for java.swing.text.
* NIO FileChannel.map implementation, fast bulk put implementation for
  DirectByteBuffer (speeds up this method 10x).
* Split gtk+ awt peers event handling in two threads and improve gdk lock
  handling (solves several AWT lock ups).
* Speed up awt Image loading.
* Updated TimeZone data against Olson tzdata2005l.
* Make zip and jar UTF-8 "clean".
* "native" code  builds and compiles (warning free) on Darwin and Solaris.

Runtime interface changes:

* All native resource "pointers" in the VM interface classes are now exposed
  as gnu.classpath.Pointer objects. This might impact runtimes that
  optimize and support java.nio.DirectByteBuffers. Creating these classes
  and accessing the contents as void * pointers for the native reference JNI
  implementation is done through the JCL_NewRawDataObject and JCL_GetRawData
  functions.
* Simplified the Class/VMClass interface.
* Removed loadedClasses map from ClassLoader. It's now the VMs responsibility
  to manage the list of defined and loaded classes for each class loader.
* Moved native methods from java.lang.reflect.Proxy to VMProxy.
* Added hook to VMClassLoader to allow VM to do class caching.

New Untested/Disabled Features:

  The following new features are included, but not ready for production
  yet. They are explicitly disabled and not supported. But if you want
  to help with the development of these new features we are interested
  in feedback. You will have to explicitly enable them to try them out
  (and they will most likely contain bugs). If you are interested in any
  of these then please join the mailing-list and follow development in
  CVS.

* QT4 AWT peers, enable by giving configure --enable-qt-peer.
* JDWP framework, enable by deleting the jdwp references from
  lib/standard.omit and vm/reference/standard.omit. No default
  implementation is provided. Work is being done on gcj/gij integration.
* StAX java.xml.stream, enable by deleting the gnu.xml.stream and
  java.xml.stream references in lib/standard.omit.

New in release 0.17 (Jul 15, 2005)

* gnu.xml fix for nodes created outside a namespace context.
* Add support for output indenting and cdata-section-elements output
  instruction in xml.transform.
* xml.xpath corrections for cases where elements/attributes might have
  been created in non-namespace-aware mode. Corrections to handling of
  XSL variables and minor conformance updates.
* DefaultMutableTreeNode preorder, postorder, depthFirst and breadthFirst
  traversal enumerations implemented.
* JInternalFrame colors and titlebar draw properly.
* JTree is working up to par (icons, selection and keyboard traversal).
* JMenus were made more compatible in visual and programmatic behavior.
* JTable changeSelection and multiple selections implemented.
* JButton and JToggleButton change states work properly now.
* JFileChooser fixes.
* revalidate and repaint fixes which make Free Swing much more responsive.
* Correctly handle system call interrupts and timeouts in native nio
  and net functions.
* MetalIconFactory implemented.
* Handle image loading errors correctly for gdkpixbuf and MediaTracker.
* Added Tree World to GNU Classpath examples Free Swing demo.
* FileChannel.lock() and FileChannel.force() implemented.
* java.util.logging.FileHandler now rotates files.
* Better handle GDK lock. Properly prefix gtkpeer native functions (cp_gtk).
* Corba bug fixes and documentation updates.
* Updated gcj build infrastructure.
* Documentation fixes all over the place.
  See http://developer.classpath.org/doc/
* VM Integration Guide updates with a full section on VM/Classpath hooks.

New in release 0.16 (Jun 30, 2005)

* Better GTK scrollbar peer implementation when using GTK >= 2.6.
* GdkGraphics2D has been updated to use Cairo 0.5.x APIs.
* BufferedImage and GtkImage rewrites. All image drawing operations
  should now work correctly (flipping requires gtk+ >= 2.6)
* Future Graphics2D, Image and Text work is documented at:
  http://developer.classpath.org/mediation/ClasspathGraphicsImagesText
* Free Swing Top-Level Compatibility. JFrame, JDialog, JApplet,
  JInternalFrame, and JWindow are now 1.5 compatible in the sense that you
  can call add() and setLayout() directly on them, which will have the same
  effect as calling getContentPane().add() and getContentPane().setLayout().
* The JTree interface has been completed. JTrees now recognizes mouse clicks
  and selections work, but the visual implementation is not yet complete.
  Work on expansion and collapsing of the tree nodes is being implemented.
* BoxLayout works properly now.
* Fixed GrayFilter to actually work.
* Metal SplitPane implemented.
* Lots of free swing text and editor stuff work now.

* When gtk+ 2.6 or higher is installed the default log handler will produce
  stack traces whenever a WARNING, CRITICAL or ERROR message is produced.

* The CORBA implementation is now a working prototype that should support
  features up till 1.3 inclusive. 
  We would invite groups writing CORBA dependent applications to
  try Classpath implementation, reporting any possible bugs.

  The CORBA prototype is interoperable with Sun's implementation v 1.4,
  transferring object references, primitive types, narrow and wide 
  strings, arrays, structures, trees, abstract interfaces and 
  value types (feature of CORBA 2.3) between these two platforms. 
  The remote exceptions are transferred and handled correctly.
  The stringified object references (IORs) from various sources are
  parsed as required. 
  The transient (for current session) and permanent (till jre restart)
  redirections work. 
  Both Little and Big Endian encoded messages are accepted. 
  The implementation is verified using tests from the former cost.omg.org.
  The current release includes working examples (see the examples directory),
  demonstrating the client-server communication, using either CORBA Request
  or IDL-based  stub (usually generated by a IDL to java compiler).
  These examples also show how to use the Classpath CORBA naming service.
  The IDL to java compiler is not yet written, but as our library must be 
  compatible, it naturally accepts the output of other idlj implementations.

* New --with-vm-classes configure option, and new 'build' setting
  for --with-glibj. (Only for integrators.)

Runtime interface changes:

* Start of a generic JDWP framework in gnu/classpath/jdwp.
  This is unfinished, but feedback (at classpath@gnu.org) from runtime
  hackers is greatly appreciated. Although most of the work is currently
  being done around gcj/gij we want this framework to be as VM neutral as
  possible. Early design is described in:
  http://gcc.gnu.org/ml/java/2005-05/msg00260.html
* Native method VMClass.getModifiers() now takes an additional
  boolean parameter.
* Deprecated native method VMClassLoader.defineClass(ClassLoader,
  String, byte[], int, int) has been replaced by
  VMClassLoader.defineClass(ClassLoader, String, byte[], int, int,
  ProtectionDomain)
* VMClassLoader.loadClass(String name, boolean resolve) is now native,
  replacing the former version which just returned null.
* Deprecated native method VMClassLoader.getPrimitiveClass(String) has
  been replaced by new native method VMClassLoader.getPrimitiveClass(char).
* Previously empty implementations of methods VMThread.countStackFrames(),
  VMThrowable.fillInStackTrace(), and VMThrowable.getStackTrace() have
  been removed; these methods are now native methods.
* Fields "exceptionTypes" and "parameterTypes" have been removed from
  Contructor.java and getExceptionTypes() and getParameterTypes() are
  now native methods.

New in release 0.15 (Apr 29, 2005)

* The old character encoding framework (gnu.java.io.EncodingManager)
has been replaced by a system based completely on nio.charset
providers. Many converters have been added, both the io, lang and nio
frameworks now use the same set of converters and the whole character
stream framework (Readers and Writers) have been optimized. For some
workloads this leads to 2x till 20x speedups.

The default charsets supported are:

  Cp424, Cp437, Cp737, Cp775, Cp850, Cp852, Cp855, Cp857, Cp860, Cp861,
  Cp862, Cp863, Cp864, Cp865, Cp866, Cp869, Cp874, ISO_8859_1, ISO_8859_13,
  ISO_8859_15, ISO_8859_2, ISO_8859_3, ISO_8859_4, ISO_8859_5, ISO_8859_6,
  ISO_8859_7, ISO_8859_8, ISO_8859_9, KOI_8, MS874, MacCentralEurope,
  MacCroatian, MacCyrillic, MacDingbat, MacGreek, MacIceland, MacRoman,
  MacRomania, MacSymbol, MacThai, MacTurkish, US_ASCII, UTF_16, UTF_16BE,
  UTF_16Decoder, UTF_16Encoder, UTF_16LE, UTF_8, UnicodeLittle, Windows1250,
  Windows1251, Windows1252, Windows1253, Windows1254, Windows1255,
  Windows1256, Windows1257, Windows1258.

Many more encoding are supported through the new IconvProvider
depending on the platform iconv support. GNU libiconv is recommended.
The IconvProvider is currently not enabled by default. To enable it
define the system property gnu.classpath.nio.charset.provider.iconv=true.
Some runtimes might choose to enable this by default by setting it
through VMSystemProperties. We would like to get feedback on whether
enabling or disabling the IconvProvider by default results in the
highest speedups.

* Free swing metal and pluggable look and feels have been improved.
The GNU Classpath free swing example can now be run with different
"skins" by setting the system property swing.defaultlaf to the GNU,
Basic or Metal look and feel.

* Some of the org.omg.CORBA classes and packages have now been
implemented. The Savannah bug tracker contains additional tasks for
which we are seeking help.

* Fixed compatibility problems in the java.beans which affected
Eclipse's Visual Editor Project.

* New completely lock free (Inheritable)ThreadLocal implementation.

* javax.swing.text.rtf framework added which can handle simple (plain)
text tokens.

* Support for parsing html files into Level 2 Document Object Model
(org.w3c.dom.html2 and javax.swing.text.html.parser). And a start of
javax.swing.text.html framework added.

Runtime interface changes:

* jni.h changed to better support compiling runtimes implementing jni;
  see VM integration guide for details.
* New --enable-default-toolkit option to configure can be used to set
  the fully qualified class name of the default AWT toolkit to use.
  If not given, the old default of gnu.java.awt.peerk.gtk.GtkToolkit
  is used.
* New --disable-core-jni option can be used to disable building the
  "core" JNI libraries.  This is primarily useful if your VM can use the
  Gtk peers but not the core JNI libraries.
* New system property "gnu.classpath.boot.library.path" can be specified
  to define the location of the JNI libraries. It is by all means meant
  ONLY for VM implementors and GNU Classpath hackers. See the hacking
  guide for more information.
* The helper methods currentLoader() and allocateObject() for
  java.io.ObjectInputStream have been moved to a VMObjectInputStream class.
  Reference implementations are provided.
* java.net.InetAddress now uses VMInetAddress for runtime/platform
  specific methods getLocalHostname(), getHostByAddr() and
  getHostByName(). java.net.NetworkInterface now uses VMNetworkInterface
  for runtime/platform specific getInterfaces() support. Default
  (Posix/GNU JNI) implementations are provided.
* VMClass has a new method getModifiers(Class, boolean) which can be
  used to get the real modifiers for an inner class or the ones
  specified by the InnerClasses attribute.
* All (possible) runtime specific methods of Object and Double are now
  in VMObject and VMDouble. Where possible generic reference
  implementations are provided.
* The reference implementation of VMClassLoader now handles zip files
  on the boot loader class path in getResources().

Other changes:

New in release 0.14 (Feb 25, 2005)

* 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).
* Full documentation for all classes can be generated (again) by using
  the --with-gjdoc configure option.
* javax.awt.imageio support through gdkpixbuf.

Runtime interface changes:

* VMSecurityManager has been replaced by gnu.classpath.VMStackWalker.
  currentClassLoader() is no longer needed, and there are also two new
  methods with non-native implementations. VM implementors are encouraged
  to provide more efficient versions.
* VMRuntime.nativeLoad() now takes an additional ClassLoader parameter.

New in release 0.13 (Jan 6, 2005)

* 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.
* The java.util.Locale support is now based on the Common Locale Data
  Repository (CLDR) Project (see http://www.unicode.org/cldr/).
  GNU Classpath provides support for more than 250 locales now.
  This new support is experimental and the GNU Classpath hackers are
  working together with runtime developers and the unicode consortium
  to improve them in the future.
  If your runtime misdetects your locale or if the default locale gives
  problems please try running with -Duser.language=en and -Duser.region=US
  to fall back on a known good locale.
* 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.
* 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.
* New --disable-examples configure argument.

Runtime interface changes:

* Added a new method (VMRuntime.enableShutdownHooks) that enables the VM
  to lazily register an exit handler.
* The java.lang.Class constructor now automatically sets the protection
  domain for array classes, based on the protection domain of the component
  type class.
* New gnu.classpath.VMSystemProperties class. This replaces the
  system properties initialization in VMRuntime. Note that it is
  now the VMs responsibility to set one additional property:
  gnu.cpu.endian should be set to "big" or "little".
* VMRuntime.nativeGetLibname() has been renamed to VMRuntime.mapLibraryName()
  and has only one argument, the name of the library.
* String and StringBuffer now call VMSystem.arraycopy() directly and don't
  go through java.lang.System. Be careful to not initialize java.lang.System
  early in the bootstrap sequence in your VM runtime interface classes.
* Some (wrong) documentation about the behavior of VMThread.sleep(0, 0)
  has been updated. Also, VMThread.sleep() now has a default non-native
  implementation, but it is a generic implementation that ignores the
  nano-seconds argument. Runtime hackers are encouraged to provide a more
  efficient version.
* There is prelimenary support for nio direct byte buffers.
  See VMDirectByteBuffer. Please contact the GNU Classpath mailinglist when
  you add support for this to your runtime.

New in release 0.12 (Nov 14, 2004)

* 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.
* Full java.awt.color implementation, with all standard ICC profiles,
  except for PhotoYCC color space.
* java.beans 1.4 updates and bug fixes.
* java.awt.image support updated to 1.4.
* Improved build process. Uses less memory with gcj and C code is
  buildable with -Werror on most platform. Please configure with
  --enable-Werror and report any remaining issues.
* Big-endian (PowerPC) fixes for native awt GTK+ peers.
* Checkstyle support, see scripts/checkstyle-config.xml.
* 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.
* HTTP Connection Handler fixes for POST support.
* Much fuller collection documentation.
* Lots of Calendar bug fixes.
* More javax.imageio support.
* Better AWT Help MenuBar support.
* Lookahead support for regular expressions.
* Serialization object stream fixes for multiple ClassLoader scenarios.
* Swing TabbedPane, ColorChooser and ComboBox improvements.
* Start of JTree functionality.
* Improved Eclipse 3 support for GNU Classpath based runtimes.

Runtime interface Changes:

* New --enable-java-lang-system-explicit-initialization configuration
  option. (Warning, will be replaced in next release, please consult
  the mailinglist.)
* The reference implementation of VMClassLoader has default
  implementations for getResource(s) and provides support for a new
  default getSystemClassLoader implementation.

New in release 0.11 (Sep 13, 2004)

* 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.
* GNU Classpath now comes with some example programs (see examples/README).
* 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/
* 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.
* Extensive documentation update for java.util collection classes.
* java.awt.geom completed. Area, Arc2D, Ellipse2D and Line2D implemented.
* GNU JAXP is no longer included with GNU Classpath. Runtime, compiler and
  tool integrators are encouraged to directly integrate GNU JAXP.
  This release has been tested against GNU JAXP 1.1.
  http://www.gnu.org/software/classpathx/jaxp/jaxp.html
* JColorChooser, JComboBox and JTextField implemented, including example
  uses in GNU Classpath Examples swing Demo.

Runtime interface Changes:

* java.lang.Compiler now uses the new java.lang.VMCompiler; there is
  a reference implementation that most VMs can use.
* java.lang.VMSystem has a new getenv(String) method and a reference C/JNI
  implementation that should work on most Posix like systems.
* java.util.TimeZone has been split into a platform independent class and
  a platform dependent class VMTimeZone.  GNU Classpath comes with a generic
  way to get at the default time zone for Posix/GNU-like platforms.
* [VM]AccessController improvements.  In particular it handles
  `doPrivileged' calls better, and allows for recursive `doPrivileged'
  calls in the same Thread. (see vm/reference/java/security/)

New in release 0.10 (Jul 9, 2004)

* 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.text multiple new features and bug fixes
  (only 2 out of the 1000+ java.text Mauve tests now fail).
* 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.
* java.security.AccessController has been implemented
  (see runtime section).
* The default java.lang.SecurityManager now uses AccessController.
* New java.beans.Statement and Expression implementations.
* Small FileChannel implementation speed improvement for traditional
  JNI based systems.
* Regenerated all included JNI header files with gcjh (3.5 CVS),
  removes extra extern modifier and allows stricter compiler warning.
* More C code cleanups (-Wmissing-declarations, -Wmissing-prototypes and
  -Wstring-prototypes) and jni.h fixes (a few funtion prototype fixes,
  made it compilable with C++ compilers and jni.h got renamed from jni.h.in).
* Double.toString() and Float.toString() now work properly on 64-bit 
  PowerPC systems.
* PPC Darwin, arm, x86-64 and s/390 JNI C code compilation fixes.
* Build system refactored and removed old Japhar specific support.
* 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.
* gcjwebplugin, an applet viewer that can be embedded into several web
  browsers, has been extensively tested with this release of classpath.
  (See http://www.nongnu.org/gcjwebplugin/)
* Runtime environments based on GNU Classpath 0.10 should be able to
  start up Eclipse 3.0 out of the box now.

Runtime interface Changes:

* VMProcess.destroy() default implementation fixes.
* Fixed the "portable native sync" code; it had been broken since
  Classpath release 0.06, when we upgraded to GTK+2.    
  Classpath's AWT peers use GTK+.  GTK+ uses GLIB.  GLIB by default uses
  the platform's native threading model -- pthreads in most cases.
  If the Java runtime doesn't use the native threading model, then you should
  specify --portable-native-sync when configuring Classpath, so that GLIB will
  use the Java threading primitives instead.  (For a superior alternative,
  see below.)
* The VM can set the system property
  gnu.classpath.awt.gtk.portable.native.sync instead of using the
  --portable-native-sync configure-type option.
  See doc/vmintegration.texinfo for details.
* We intend that the next release of GNU Classpath will require the VM 
  to provide JNI 1.2.  Classpath currently uses only JNI 1.1, except for 
  one JNI 1.2 function: GetEnv(), in the JNI Invocation API. 
  If this poses problems, please raise them on the classpath mailing list.
* The reference implementation of VMThread.holdsLock(Object) now has
  a default implementation written in java. For efficiency and to
  prevent spurious wakeups a real 'native' runtime version can be supplied.
* There is a new java.security.VMAccessController class that runtimes need
  to implement to properly support SecurityManagers. The default
  implementation that comes with GNU Classpath makes sure that ANY attempt
  to access a protected resource is denied when a SecurityManager is
  installed. Which is pretty secure, but also no very useful.
  Please see the documentation in
  vm/reference/java/security/VMAccessController.java,
  and please give feedback on the GNU Classpath mailinglist whether or not
  the current AccessController framework is flexible enough.

New in release 0.09 (May 2, 2004)

* Includes updated GNU JAXP version from 2004-02-01.
* Native C code is now -ansi -pedantic (C89) clean and (almost) -Wall clean.
* java.io is now implemented by delegating most tasks directly to java.nio.
* Reworked/Optimized implementations of java.nio.Buffer and subclasses.
* New javax.print, javax.print.attribute[.standard] and javax.print.event
  packages and classes.
* java.text attributed iterators support.
* New javax.imageio, javax.imageio.event and javax.imageio.spi packages and
  classes.
* GNU Classpath 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.
  Application developers are strongly discouraged from calling glibj
  internal packages.  Instead, they might want invoke the newly implemented
  javax.imageio.spi.ServiceRegistry.lookupProviders, which is a standard 
  method for loading plug-ins.
* New developers wanting to help the GNU Classpath project might want to
  review the greatly expanded Hacker Guide included in the doc directory
  or online at http://www.gnu.org/software/classpath/docs/hacking.html
  Also the FAQ has been expanded. And when working from CVS you can now use
  a simple autogen.sh script to get all autotools magic done automagically.
* New configure option --with-glibj which defines how to install the glibj
  class files as zip, as flat directory files or both (zip|flat|both)
  [default=zip].  When working with multiple runtimes some of which might
  not support bootstrap classes in zip files the --with-glibj=both option
  is recommended (this does take extra disc space).
* Two big code drops from the libgcj gui branch updating various java.awt
  and javax.swing classes.
* Multiple java.net.InetAdress fixes and java.rmi fixes.
* ServerSocket.accept() now restarts listening when system call interrupted.
* Much cleanups to make standard API doc valid XHTML (not completed yet).
* A scan for unused variables and non-static invocation of static methods
  turned up a couple of subtle bugs which have now all been fixed.
* The Mauve testsuite has been cleaned up considerable and lots of issues
  in the GNU Classpath core class implementation have been fixed.

VM Interface changes:

* java.lang.Class/VMClass interface was changed. The interface now no
  longer requires an instance of VMClass for each Class instance. Instead
  the field vmdata in Class is now of type Object.
* GNU Classpath now assumes that JNI calls SetXField can modify final
  fields. This was previously used silently for System.in/out/err and should
  be considered as a feature now.
* A new VMProcess and a sample JNI C implementation are now provided to
  make Runtime.exec() work out of the box on some systems.  This requires
  a small change to VMRuntime.exec() when a runtime wants to use it as the
  default java.lang.Process implementation.
* The implementation of most of java.io through java.nio moved serveral
  runtime specific I/O methods. Most methods do have a generic default native
  C JNI implementation in native/jni/java-nio.
* Runtime support methods for java.io.File have been moved to VMFile which
  also comes with a default JNI C implementation.
* To support the new service provider mechanism runtimes must make sure that
  extension JARs are made accessible via the default context class loader.

New in release 0.08 (2004/12/03)

* java.util.regexp implementation through gnu.regexp wrappers.
* java.net.URI implementation.
* 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.
* BufferedReader speed improvements.
* Improved useabilty of java.text implementation for several applications.
* ObjectInputStream is much faster and more compatible with other
  implementations.
* Fix handling of alias methods, where a method has been deprecated in
  favour of a new one with the same funtion but a different name.
  (See Deprecated Methods section in the GNU Classpath Hacking Guide.)
* javax.print.attribute.standard added.
* Lots of java.nio, java.net, java.io
* Depend on autoconf 2.59+ and automake 1.7+, GCJ 3.3+, jikes 1.18+.

VM Interface changes:
* Split native methods in java.lang.Runtime into java.lang.VMRuntime.
* Resources are now also loaded/needed through the bootstrap classloader
  (gnu.regexp needs MessageBundle included in glibj.zip

Fixed Classpath bugs:
  #6095 java.awt.geom.QuadCurve2D.solveQuadratic sometimes gives
        wrong results
  #7099 EventListenerList.getListenerCount should accept null argument
  #7104 EventListenerList.add does not work
  #7105 EventListenerList.remove does not work
  #7107 DefaultBoundedRangeModel.setValue and friends should not throw
  And lots more.

New in release 0.07 (2003/30/11)

* Works with libtool 1.5 (and 1.4.3).
* java.awt gtk+ peers now depend on gtk+ 2.2.x and uses pango.
  Lots and lots improvements on the peers.
* java.awt.geom.CubicCurve2D, java.awt.geom.QuadCurve2D:
  Subdivision and flatness calculation implemented.
* java.awt.geom.FlatteningPathIterator: Working implementation.
* gnu.java.awt.BitwiseXORComposite helper class.
* New rmic compilers (jikes, kjc) support.
* java.text bug fixing and 1.4 updates (Currency).
* Hashtable and HashMap function more similar to other implementations.
* javax.naming and java.beans classloader fixes.
* URL parsing, URLConnection, protocol and (needed) permission fixes.
* More java.nio implementation
  (API complete, but implementation not finished yet).
* Lots of java.net code cleanup.
* Improved documentation.
* Numerous bug fixes in almost every package, and lots of updates for
  1.4 functionality.
* Fixed Classpath bugs:
  #2944 Incorrect synchronization in java.util.logging.ErrorManager
  #6075 java.awt.geom.GeneralPath.getCurrentPoint returns wrong results
  #6076 java.awt.geom.GeneralPath constructor sometimes hangs
  #6089 java.awt.geom.GeneralPath.getPathIterator does not work
  [...]

VM Interface changes:

* Thread has been split in a VM-independent Thread class and a VM-dependent
  VMThread class.

New in release 0.06 (2003/22/08)

* Update java.awt peers to GTK+2.
* java.awt.GridBagLayout implementation.
* javax.swing.border implementation.
* java.security and java.security.cert updated to 1.4 spec.
* New JNI native target code layer. See native/target/readme.txt.
* --enable-regen-headers configure flag for automatic jni .h file generation.
* Removed workaround for gcj 3.2 and lower, gcj 3.3+ or jikes 1.18+ is now
  needed for compiling.
* Lots of improvements and/or new classes for java.awt, java.awt.dnd,
  java.awt.font, java.awt.geom, java.awt.image, java.io, java.math, java.net,
  java.nio, java.rmi, java.text, java.util, javax.swing, javax.swing.plaf,
  javax.swing.text.

VM Interface changes:

* VMClassLoader.loadClass(), the bootstrap classloader called by
  Class.forName() and ClassLoader.loadClass(), may now return null when
  a class is not found instead of throwing a new ClassNotFoundException.
  This is a performance optimization in some cases. This also changes
  the Class.forName() reference code.
* Native methods in Class have been moved to VMClass.  A few additional
  methods are also available in VMClass to provide optional performance
  improvements.
* A VM can now supply its own String.intern() strategy through the
  VMString class. The supplied VMString reference class implements the
  original WeakHashMap strategy.
* Float and Double to/from bits conversion functions can now be supplied by
  the VM through VMFloat and VMDouble. Default JNI conversion methods are
  supplied.

New in release 0.05 (2003/02/15)
* Supports free Java VMs Jikes RVM and Kissme out of the box, perhaps others.
* Supports GNU Crypto 1.1 as the official provider of cryptographic primitives
  and tools for GNU Classpath, available separately from 
  http://www.gnu.org/software/classpathx/crypto/crypto.html. 
* Supports GNU Classpath Tools sub-project of GNU Classpath, official provider
  of standard tools such as gjdoc, a javadoc replacement, and others.  Future
  releases of GNU Classpath will begin to include these tools, available
  separately from http://www.gnu.org/software/cp-tools/.
* Java primitives can be used to support AWT native threading, see 
  the --enable-portable-native-sync configure option which may become the
  default in a future release.
* Include file jni.h has been updated to the 1.4 specification.
* VM specific internal types for jobject, jfieldID, and jmethodID are
  supported in jni.h.  More details can be found by reading the comment
  in include/jni.h.in.  By default the old definitions are used instead.
* New VM helper class java.io.VMObjectStreamClass which should provide
  the hasClassInitializer() method. Previously ObjectStreamClass used
  Class.getDeclaredMethod("<clinit>") but according to the spec this
  should always throw NoSuchMethodException for class initialization methods.
  A JNI reference implementation is provided as
  vm/reference/java-io/java_io_VMObjectStreamClass.c
* There have been numerous infrastructure improvements
  * Configure option --enable-gjdoc to generate javadoc-like output 
  * Gjdoc output is included with distribution, see doc/api/html/
  * DESTDIR fully supported for install and uninstall
* Runtime.execInternal contract changed to allow for null `env'
  and to accept `dir' argument.
* VMObject.getClass() removed. It was never used.
* java.lang.Throwable is now a 'normal' GNU Classpath class that uses the
  VM specific java.lang.VMThrowable to get at the VM state and (if needed)
  the StackTraceElements for a particular exception. A default implementation
  (that does nothing) is provided in vm/reference/java/lang/VMThrowable.java.
* The vm/reference classes from the gnu.vm.stack and their counterparts
  ExecutionStack and StackFrame in gnu.java.lang have been removed since they
  are not actually part of the VM interface anyway.
* The GPLed com.sun.javadoc classes have been moved to the gjdoc application
  from the GNU Classpath Tools project. See for more information the homepage
  at: <http://www.gnu.org/software/cp-tools/>.

New in release 0.04 (2002/05/05)
* Additional configure options to disable zip creation and installation as
  well as disable gtk peer native compilation.
* Addition of java.nio, java.util.logging, and javax.swing.
* Integration of most or all of the ORP patches to date, the purpose of 
  which are to make it possible to use JBOSS with ORP and Classpath.  This
  is still in a testing phase however.
* Significant changes in the reference VM interface that may require
  support from the JVMs.
* Lots of bugfixes.

New in release 0.03 (2002/02/08)
* More merges with libgcj have been performed including java.math which now
  provides a pure Java implementation of that package.
  Current status at <http://gcc.gnu.org/java/libgcj-classpath-compare.html>
* A pure Java implementation (Jazzlib) of java.util.zip is available.
* Added the java.rmi implementation that Transvirtual donated to the FSF.
* Includes jni.h now, eliminating the need to specify a particular VM
  via configure.
* No proprietary classes or programs are required to compile.
  Compiles out of the box with jikes or gcj.
* Separation of compiling Java source and native libraries through the 
  configure mechanism.  If given no arguments, configure will setup the
  subsequent build to only produce Java bytecode (.class files).  More
  information is available in INSTALLING.
* Support for compiling in a separate directory, as an example you may
  cd classpath-0.03; mkdir build; cd build; ../configure; make
* Works with Orp 1.0.9 out of the box. Build instructions can be found at
  <http://www.gnu.org/software/classpath/doc/orp.html>
* Lots of bugfixes that were found by using Classpath with the gcj, Orp,
  SableVM, KissMe and Jaos VMs. Please use our bugdatabase at
  <http://savannah.gnu.org/support/?group_id=85>
* Lots of updates to make Classpath more compliant with the 1.2, 1.3 and 1.4
  API specification. The current status can be found at
  <http://www.gnu.org/software/classpath/status.html>
* All files are now distributed under the same terms. Added clarification to
  GPL exception.

New in release 0.02 (2001/01/06)
* Support for printing exceptions with Japhar 0.09 + patch included in
  resource/japhar-0.09.patch.1.
* Typos, assorted bugfixes.

New in release 0.01 (2000/11/20)
* More packages are included now, though many remain untested.
* Support for Japhar 0.09 included.

New in release 0.00 (1999/02/01)
* First official development release of clean room class library for Java
* Following packages included:
	-- java.beans
	-- java.io
	-- java.lang
	-- java.lang.reflect
	-- java.math
	-- java.net
	-- java.security (partial and non-functioning)
	-- java.security.acl
	-- java.security.interfaces
	-- java.util
* Code is mostly Java 2 (see JDK 1.2) compatible with some functionality
  missing and/or untested.
* Support for Japhar (http://www.japhar.org/) virtual machine is included.
  Requires the current Japhar from CVS.
* Extensive javadoc comments for public API included
* Licensed under the GNU Library General Public License (see COPYING.LIB)
* Does not depend on any non-free code - developed in a "clean room"
  environment.

