New in release 0.92 (Aug 9, 2006)

* 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.
* 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.

