diff --git a/CHANGES b/CHANGES
index 46e9657a325bb0fa8fb51e5f3e3a254dd10a22c7..e7af312c53aad3740eaeab7d675daccb8e9abae7 100644
--- a/CHANGES
+++ b/CHANGES
@@ -1,310 +1,23 @@
-Pike 9.0: Changes since Pike 8.0
+Pike 9.1: Changes since Pike 9.0
 ----------------------------------------------------------------------
 
 New language features
 ---------------------
 
-o Unlimited character constant size.
+o Syntax for default values in multi-assignment.
 
-  There is no longer any limit to the size of character constants,
-  e.g. 'acdefghijk' creates the bignum 0x61636465666768696a6b.
+  It is now possible to specify default values in multi-
+  assignment.
 
-o Syntax for annotating classes and symbols added.
+    [int a, int b = 4] = ({ 1 });
 
-o Syntax for specifying default values for function arguments added.
+  or
 
-  The function definition
-
-    string foo(string bar = "bar") { return bar; }
-
-  will now result in a function(string|void:string) that returns
-  "bar" if called with no arguments or UNDEFINED, and its argument
-  otherwise. The local variable 'bar' above will be typed string
-  (ie not string|void) in the function body.
-
-  The syntax is also valid for implicit create:
-
-    class foo(string bar = "bar") {}
+    [int a, int b = 4] = ({ 1, UNDEFINED });
 
 o Syntax for using multi-assign in function calls.
 
-  The function definition
-
-    int add([int a, int b], int c) { return a + b + c; }
-
-  will result in a function that may be called as
-
-    add(({ 1, 2 }), 3);
-
-o Major changes to the compiler type checker.
-
-  - The type for the value 0 or UNDEFINED now needs to be
-    declared explicitly. For convenience the symbol 'zero'
-    now evaluates to the type 'zero'.
-
-o '__unknown__' type added.
-
-  This is a type that is the inverse of the type mixed|void,
-  and is used eg in the type for the empty string
-  string(zero:__unknown__) and for the generic function type
-  function(__unknown__...:mixed).
-
-o '__experimental__' type attribute added.
-
-  This identifier is analogous to __deprecated__, but warns that
-  the symbol is experimental rather than deprecated. There are
-  also #pragmas {no_,}experimental_warnings that are analogous
-  to the #pragmas {no_,}deprecation_warnings.
-
-o Syntax for declaring and using generic types added.
-
-    class Foo (< T >) (protected T val) {
-      T get_val() { return val; }
-    }
-
-    class Bar (< X, Y >) {
-      inherit Foo (< Y >);
-      X z;
-    }
-
-    class Foobar {
-      __generic__ Z;  // This is equivalent to declaring Foobar (< Z >) above.
-      inherit Bar (< Z, Z >);
-    }
-
-    Bar(<float, int>) bar = Bar(<float, int>)(17);
-
-    bar->z = 1.0;
-
-o Several modules have been updated to use generics.
-
-  - ADT.Heap
-
-  - ADT.Stack
-
-  - Concurrent
-
-  They all default their generics to mixed in order to be backward-compatible.
-
-o 'auto' type added.
-
-  This is much like a strict typed mixed. The actual type is deduced
-  compile-time.
-
-  Typical use is as the type for variables in foreach when looping over
-  complexly typed values, or as the type in macro-defined functions and
-  similar.
-
-  auto can be used as return type for a function, it will be the
-  type-union of all the types of the return statements in the
-  function.
-
-o typeof(X) can now be used as a type.
-
-  The main use case is in macros, but it might be useful for other
-  things as well (as an example in a typedef).
-
-  typedef typeof(Val.true)|typeof(Val.false) bool;
-
-  typeof, when used like this, behaves very much like the C++
-  decltype() expression.
-
-o Shorthand for int(val..val) added: int(val) .
-
-  A syntax for when the range of an integer type only
-  contains a single value.
-
-o Shorthand for string(val..val) added: string(val) .
-
-  A syntax for when the range of a string type only
-  contains a single value.
-
-o Syntax for specifying the length of array and string types.
-
-  Eg string(4bit: 8bit) is 8-bit strings of lengths 0-15.
-
-o Syntax for specifying the type of named constants.
-
-  Eg constant int(0..1) flag = 0, other = 1;
-
-o Backward-compatible syntax for specifying the type of named constants.
-
-  Eg constant flag = [int(0..1)](mixed)0, other = [int(0..1)](mixed)1;
-
-o ** operator added. It's exponentiation and works with most
-  combination of numerical types (int,float,Gmp.mpq,Gmp.mpf,Gmp.mpz)
-
-  `** and ``** operator overloading functions added.
-
-  This introduces one incompatible change: Previously the "pow"
-  function called a "_pow" function in the first argument if it was an
-  object. It has now been changed to also use `** (or, rather, pow()
-  is now implemented using predef::`**()).
-
-o __cast() added.
-
-  This efun performs a cast of a value to a specified type, where the type
-  may be specified either as a type value or as a string. It is intended
-  to help in implementing lfun::cast().
-
-o Binary or between a multiset and UNDEFINED is now behaves like
-  binary or between the multiset and the empty multiset.
-
-o Three pass compiler.
-
-  An extra pass of the compiler has been added. It is used to properly
-  resolve types in forward referring expressions, and is only run when
-  needed.
-
-o #pragma disassemble
-
-  This directive is now available even in pikes compiled --without-debug.
-
-  The byte code output is now interleaved with the generated machine code
-  on selected architectures.
-
-o #pragma no_strict_types
-
-  It is now possible to turn off the strict types mode for a section
-  of code.
-
-o Complain about redundant backslash escapes.
-
-  The compiler now complains about redundant backslash escapes
-  in literal strings and character constants.
-
-o '__weak__' modifier added.
-
-  It is now possible to declare object variables to have weak references.
-
-o Support for arguments to implicit lambdas added.
-
-  Implicit lambdas now behave as if they were declared as
-  lambda(mixed ... __ARGS__).
-
-  Support for this feature can be detected with #ifdef __ARGS__.
-
-o Function local function declarations are now statements
-  (and not expressions). This means that there is no longer
-  any need to terminate them with a semicolon.
-
-o Anonymous class definitions are now always expressions.
-
-o Function local class definitions are now statements
-  (and not expressions). This means that there is no longer
-  any need to terminate them with a semicolon.
-
-o The inherit statement's argument is now a proper
-  constant expression. This means that it is possible
-  to dynamically (at compile-time) generate the value
-  to be inherited, eg with Pike.ProxyFactory().
-
-o Complain about shadowed variant functions.
-
-o Syntax for generator (and restartable) functions added.
-
-  - Added the new modifier __generator__, which causes such functions
-    to become generator functions, where calling the function sets
-    up a restartable function context.
-
-  - continue may preceed return statements, which causes
-    the restartable function state to be saved before returning.
-
-    Alternatively the "function" yield() may be used to return
-    a value, and restart with a value from the restarter.
-
-  - Re-entrant/concurrent calls of restartable functions save
-    the argument(s) (NB: only one set), returns UNDEFINED, and
-    causes the next continue return or yield() in the initial
-    function call to continue immediately with the new argument(s)
-    instead of returning.
-
-  - continue::this_function may be used to refer to the restartable
-    function from within restartable functions. This is useful eg
-    when setting callbacks.
-
-  Restartable functions get the type signature
-
-    X fun(mixed|void value, function(mixed|void: void)|void resume_cb)
-
-  where X is the declared return type of the generator function,
-  value is the value to be returned by yield(), and resume_cb
-  is a function that will be called at the yield point. resume_cb
-  may be used to eg behave as if yield() had thrown an error.
-
-o Syntax for asynchronous functions added.
-
-  - Added the new modifier __async__, which causes such functions
-    to become asynchronous functions, which automatically return
-    Concurrent.Future objects.
-
-    Asynchronous functions are implemented with generators with
-    some differences. Eg:
-
-      __async__ T foo(mixed ... args) {
-        // ...
-      }
-
-    Behaves similar to:
-
-      Concurrent.Future (<T>) foo(mixed ... args) {
-        Concurrent.Promise (<T>) __async_promise__ = Concurrent.Promise(<T>)();
-        __async_promise__->failure(catch {
-            __async_promise__->success(
-              __generator__ lambda() {
-                // ...
-              }()()
-            );
-          });
-        return __async_promise__->future();
-      }
-
-  - Add Concurrent.Future()->on_async()
-
-    This function is shorthand for on_success(f)->on_failure(f, throw).
-
-  - Add "function" await(future), which sets up callbacks in the
-    future and then yields control, to resume when the future is
-    fulfilled. It returns the value of the future on success,
-    and throws the failure value on failure.
-
-    Eg:
-
-      mixed x = await(f);
-
-   Behaves similar to:
-
-      f->on_await(continue::this_function);
-      mixed x = yield(0);
-
-o Machine code support for more architectures.
-
-  There's now machine code support for arm32 and arm64.
-
-o Fixed multiple integer over- and underflow bugs.
-
-o Extended sscanf %O
-
-  sscanf() is now able to parse all base types that sprintf %O can
-  output. It can now also parse most literal constants pike accepts,
-  including integers prefixed with 0x and 0b, and floating point
-  numbers in scientific notation.
-
-o Returning void
-
-  It is now possible to return void responses from void functions.
-
-    void a() { return; }
-    void b() { return a(); }
-
-o Cleaned up expression grammar.
-
-  The base expression grammar now mirrors that of the C-standard.
-
-  This makes it easier to understand what the various expression
-  productions mean.
-
-o Added the unary +-operator (noop).
+  *CAVEAT* Broken in combination with default values (Issue #10169).
 
 
 Bug fixes
@@ -312,707 +25,38 @@ Bug fixes
 
 o Compiler
 
-  - Constant integers outside the 32-bit signed range no longer
-    get their types mapped to int(-0x80000000) or int(0x7fffffff),
-    (depending on sign) but instead keep the generic int type.
-    This fixes issues where the type resolution system derived
-    erroneous types from the truncated types.
-
-  - Under some circumstances the compiler would insert erroneous
-    F_ESCAPE_CATCH opcodes. This could cause very strange
-    runtime errors.
-
-  - The compiler could get confused by combinations of labels
-    with inline functions or constant expressions.
-
-  - The type checker now checks that operator assignment
-    expressions are valid.
-
-  - The safe-indexing operators (->?, [?] and (?)) now short-circuit
-    the expression when the operand is false. Previously later unsafe
-    operators were still applied.
-
 o Runtime
 
-  The runtime could get confused by PROGRAM_DESTRUCT_IMMEDIATE
-  objects having destruct callbacks under some circumstances.
-
 o Operator functions
 
-  - Calling operator functions with more than two arguments will now
-    work correctly for objects, where previously only the first two
-    objects where added.
-
-  - When adding arrays, multisets and mappings, UNDEFINED will now
-    always be ignored. Previously it was only ignored when first in the
-    argument list, otherwise an exception would be thrown.
-
-  - Adding UNDEFINED with UNDEFINED now results in UNDEFINED
-    (rather than 0).
-
-  - The LFUNs will now be called with a consistent number of
-    arguments. Pike implementations rarely implemented varargs on
-    operator LFUNs, so this change should address many potential hidden
-    errors.
-
-  - Most operators that use LFUNs now have types that check
-    that the arguments to the corresponding LFUN are correct.
-
-o Pike.Backend
-
-  Backend callbacks throwing errors could cause backends to
-  enter a state where they got stuck throwing "Backend already
-  running - cannot reenter.". This was typically triggered via
-  the Stdio.sendfile() result callback.
-
-o Protocols.HTTP.Server
-
-  The server module will now read payloads for HTTP PUT requests, just
-  as any other method. Previously it would stop reading the body and
-  it was up to the caller to read enough data from the socket and
-  combine with already read data.
-
-  Setting "connection" header in the "extra_heads" to Request object
-  method response_and_finish() will now control if keep-alive should be
-  used or not. Otherwise it will be decided by the clients request
-  headers, as previously.
-
-  The headers "content-type", "content-range", "content-length",
-  "server", "date" and "last-modified" will not be added or
-  overwritten if provided in the "extra_heads".
-
-  Header names in "extra_heads" will not have their case modified.
-
-o SSL.File: Propagate fatal alerts to close and write callbacks.
-
-  SSL did not call the close_callback on SSL.File()s that connect outgoing
-  and abort the handshake by sending fatal alerts to the server.
-
-  Fatal alerts generated locally (ie due to broken data from peer)
-  are now signalled on the close and write callbacks with errno set
-  to ECONNABORTED and fatal alerts received from the peer have errno
-  set to ECONNRESET.
-
-o Standards.JSON and Standards.JSON5
-
-  encode() now allows other threads to run every now and then.
-
-o ADT.OrderedMapping
-
-  Adding duplicate keys now replaces the existing keys.
-
 
 Incompatible changes
 --------------------
 
-o Compatibility code for Pike 7.6 and earlier removed.
-
-o Require GMP 4.1 or later.
-
-  Support for compiling Pike without bignums or with ancient
-  GMP has been removed.
-
-o As mentioned above; variables that may be set to 0 or UNDEFINED
-  now need to be declared accordingly. Note that this is not needed
-  for code that is compiled in Pike 8.0 or earlier compat mode.
-
-o The new stricter type checker may expose old bugs that the
-  old type checker did not find.
-
-o Simplified the Iterator API.
-
-  - Renamed Iterator API functions and made them LFUNs:
-
-    o index() ==> iterator_index()
-
-    o value() ==> iterator_value()
-
-    o next() ==> iterator_next()
-
-  - Iterators now start at the position before the first element
-    to be iterated over. This position may be the the same
-    position as after the last element.
-
-  - The only function that is required for an Iterator is
-    iterator_next(). It should advance the iterator one
-    element, and return UNDEFINED if the position is now
-    after the last element. It may return any other value
-    otherwise. The returned value will be used in place of
-    the values returned by iterator_index() and/or
-    iterator_value() if they do not exist.
-
-o Sql.Sql is no longer a wrapper class, but a function.
-
-  The wrapper class has been obsoleted by introduction of the
-  new base class __builtin.Sql.Connection. Note that it is
-  still possible to use Sql.Sql as the type of connection objects.
-
-o Stdio.File has had some name space cleanups.
-
-  Multiple symbols in Stdio.File are now protected:
-
-    * {in,out}buffer
-
-    * ___{read,write,close,read_oob,write_oob,fs_event}_callback
-
-    * ___id
-
-  Moved the {read,write}_callback_t types to the Stdio module proper.
-
-o Stdio.Port now has a default id of itself (as documented).
-
-  Previously the default id for Stdio.Port objects was 0.
-
-o Thread.Farm()->run() et al now return Concurrent.Future objects.
-
-  Previously they returned Thread.Farm.Result objects (which had
-  similar functionality, but a different API).
-
-o Named classes are always statements.
-
-  As mentioned above, it is no longer possible to define a named
-  class in an expression. Such code has been observed, but none
-  where the name was actually used. Use an anonymous class instead.
-
-o Anonymous classes are always expressions.
-
-  It used to be possible (but typically not useful) to define
-  an anonymous class as a statement. Add a name for the class.
-
-o Gz.crc32 and Nettle.crc32c now only return positive results.
-
-o glob() has changed.
-
-  The main incompatibilities are that [ and \ are now special
-  characters in the pattern, and if you check the return value against
-  1 instead of checking if it's true, and use an array as the first
-  argument you will have to change your code.
-
-  This is in order to extend the glob function to cover what
-  'standard' glob functions do:
-
-  - glob() now accepts quotes (eg \* to match a single *) and
-    handles ranges (eg [abc] for a, b or c, [a-z0-9] for a single
-    character between a and z or 0-9).
-
-  - You can also negate a range using ^ or ! (eg [^a-zA-Z]).
-
-  - When the first argument (the pattern) to glob is an array, glob now
-    returns the pattern in the array that matched.
-
-o hash() has been changed to use siphash. The old hash function is
-  available under the name hash_8_0(). Note that this is not a
-  cryptographic hash function.
-
-o Stdio.UDP()->send() no longer throws errors on EMSGSIZE and EWOULDBLOCK.
-
-o When a thread exits by throwing, the thrown value is propagated to
-  wait() which in turn will throw the value further. Previously it
-  was sent directly to master()->handle_error().
-
-o String.trim_all_whites() renamed String.trim().
-
-o Floats are no longer by default sorted before added. This may reduce
-  the precision but increases the speed of adding large number of
-  floats by a factor of 500. Applications handling floats with large
-  differences in magnitude need to apply the appropriate sorting
-  before arithmetics. As `+ was the only operator that performed
-  sorting, and functions like Array.sum did not, this was already a
-  concern.
-
-o Returning UNDEFINED from `+ and ``+ is not allowed and will cause an
-  exception.
-
-o RegGetValue(), RegGetKeyNames(), RegGetKeyValues(), openlog(),
-  syslog() and closelog() have been moved to System.
-
-o The ZXID module has been removed.
 
 New modules and functions
 -------------------------
 
-o predef::m_add()
-
-  This function adds (as opposed to inserts) an element to a multiset.
-
-o ADT.Scheduler & ADT.TreeScheduler
-
-  These are variants of ADT.Heap where elements typically aren't
-  removed from the heap.
-
-o Apple.Keychain
-
-  Parser for Apple Keychain format files (like the ones in
-  /System/Library/Keychains/).
-
-o __builtin.Sql
-
-  Generic base classes for Sql API modules.
-
-o Filesystem.Zip
-
-  New filesystem class with support for operation on Zip files.
-
-o Function.bind()
-
-  Partially evaluate a function. Similar to Function.curry, but with
-  better granularity.
-
-o Standards.HPack (RFC 7541)
-o Stdio.FakePipe
-
-  A simulated Stdio.Pipe.
-
-o Parser.Markdown
-
-o Crypto.AES.OCB etc
-
-  Add support for the AEAD OCB.
-
-o Crypto.Checksum
-
-  This module collect non-cryptographic checksums. Support for crc32,
-  adler32 and Castagnoli CRC (CRC32C).
-
-  NB: In the future these may be amended to support the Crypto.Hash API.
-
-o Crypto.ECC.Curve.GOSTDSA
-
-  Add support for GOSTDSA (RFC 5832 and RFC 7091).
-
-o Crypto.ECC.Curve448
-
-  Add support for Edwards curve 448.
-
-o Crypto.SHA256.balloon() (and others)
-
-  This is a memory-hard password hashing algorithm. It requires Nettle 3.9
-  or later.
-
-o Parser.ECMAScript
-
-  This module simply provides a token splitter for
-  ECMAScript/JavaScript.
-
-o Pike.Annotations
-
-  Multiple common annotations are available.
-
-o Pike.DestructImmediate
-
-  Objects of classes that inherit Pike.DestructImmediate will be
-  destructed immediately on their references reaching zero (rather
-  than at some arbitrary time "soon"). This class should be used
-  for any classes that are (or hold) locks or similar.
-
-o Pike.InhibitDestruct
-
-  Objects of classes that inherit Pike.InhibitDestruct may
-  control whether explicit destruct() calls should succeed
-  (or be delayed until later). Note that this class is just
-  a convenience API, and that this functionality may also
-  be implemented by hand. The intended use is for C-classes
-  that do not want their storage to be zapped eg during
-  library calls.
-
-  Note that it is not possible to inhibit destruction due
-  to running out of references or by the gc.
-
-o Pike.LiveBacktraceFrame
-
-  This is similar to Pike.BacktraceFrame, but refers two-way
-  to an active (or not) execution context. It can be used
-  to eg examine (and change) local variables, and is intended
-  for debugger use.
-
-o Pike.ProxyFactory()
-
-  This is a function that generates a proxy class for objects
-  of the given class.
-
-o Process.Process
-
-  Support using Stdio.Fd for "cwd" and "chroot" on OSes that
-  have fchdir(2).
-
-o Web.Auth & Web.Api
-o Web.EngineIO & Web.SocketIO
-o Protocols.HTTP2
-o Bittorrent.DHT
-o Standards.MsgPack
-
-o Thread.Mutex
-
-  - Implemented support for multiple readers / single writer
-    operation by adding shared_lock() and try_shared_lock().
-
-  - Asynchronous locking added with future_lock() and
-    future_shared_lock().
-
 
 New features
 ------------
 
-o Command-line options
-
-  - It is now possible to define function-style macros with the
-    command-line option '-D'. Eg:
-
-      $ pike '-DFOO(X)=X'
-
-o predef::backtrace()
-
-  predef::backtrace() now takes an optional argument that causes it
-  to return LiveBacktraceFrames (instead of BacktraceFrames), which
-  may be used to access local variables for the frame while they are
-  still in use. This is intended for debugger use.
-
-o predef::destruct()
-
-  lfun::_destruct() may now inhibit explicit destruction.
-
-o predef::equal()
-
-  equal() on functions now checks if their definitions are the same
-  identifier in the same program.
-
-o predef::gc()
-
-  gc() called with a weak mapping as argument now removes weak references
-  that are only held by that mapping.
-
-o predef::m_clear()
-
-  m_clear() now supports operation on multisets and objects.
-
-o predef::m_delete()
-
-  m_delete() now supports operation on multisets.
-
-o ADT.Heap
-
-  - An indirection object ADT.Heap.Element has been added to make it
-    possible to optimize several heap operations.
-
-  - Added low_pop().
-
-o Calendar
-
-  - The timezone expert system has been updated for the first time
-    in quite a while.
-
-o Crypto & Nettle
-
-  - Added Curve25519 with EdDSA.
-
-  - Added support for CMAC.
-
-o Filesystem.Monitor
-
-  The filesystem monitoring system now uses accelleration via
-  Inotify et al.
-
-o Gmp
-
-  - mpf is now implemented using gmpf if the library is available.
-
-  - Improved support for GMP 5.0 and later.
-
-o GTK2
-
-  Multiple runtime fixes.
-
-o JOSE (JSON Object Signing and Encryption)
-
-  Some low-level API support has been added to the Crypto and Web
-  modules to support parts of RFC 7515 - 7520.
-
-o MasterObject
-
-  - Protect against the same file being compiled concurrently
-    in multiple threads.
-
-  - cast_to_program() and cast_to_object() should now be thread safe.
-
-  - main() may now return a Concurrent.Future object, in which case
-    the default backend will be started, and the pike interpreter
-    will terminate when the Concurrent.Future object is fulfilled.
-
-o CompilerEnvironment()->lock()
-
-  Access to the compiler lock.
-
-o Crypto.ECC.Curve.Point
-
-  A point on an ECC curve.
-
-o Parser.Pike
-
-  Support new language features.
-
-o Protocols.DNS
-
-  - Protocols.DNS now supports encoding and decoding CAA RRs.
-
-  - Classes derived from Protocols.DNS.server may now override
-    report_decode_error() and handle_decode_error() to change how
-    errors while decoding a DNS packet are reported and handled.
-
-o Protocols.WebSocket
-
-  Multiple API changes.
-
-o Random rewrite
-
-  The random functions have been rewritten to ensure security by
-  default. random_string() and random() now get their data directly
-  from the operating system random generator, i.e. /dev/urandom on
-  most unixen. This is about half the speed compared with the
-  random_string function in Pike 8.0, but is now as secure as the
-  system random generator.
-
-  For consumers of random data that have additional requirements,
-  different random generators are exposed in the new module
-  Random. The module has the following generators:
-
-  - Random.Interface
-
-    This is not actually a generator, but an interface class that is
-    inherited into all the other generators. It contains code that can
-    turn the output from the random_string method into random numbers
-    with different limits without introducing bias. It also contains
-    code for all the different variants of random() on different
-    types. This is currently not possible to implement in Pike code,
-    as the typing is too complicated and it is not possible to access
-    private/protected _random methods in objects.
-
-  - Random.System
-
-    This generator maps directly on top of the system random
-    generator. This is the default generator used for random() and
-    random_string().
-
-  - Random.Deterministic
-
-    This generator creates the same sequence of random numbers for a
-    given seed, with good pseudo random properties.
-
-  - Random.Hardware
-
-    This generator accesses the hardware random generator, when
-    available.
-
-  - Random.Fast
-
-    This generator takes entropy from the Random.System, but feeds
-    it into a cryptographic pseudo random number generator to be
-    able to output data fast. This is not the default random number
-    generator to avoid loading crypto code on every startup.
-
-  Comparing the different generators with each other gives the
-  following approximate speeds on a Linux system with hardware
-  random support:
-
-    Random.System           1.0
-    Pike 8.0 random_string  0.45
-    Random.Hardware         0.25
-    Random.Fast             0.20
-    Random.Deterministic    0.20
-
-  Objects implementing the _random lfun now get two arguments, the
-  current random_string() and random() functions. This is convenient
-  for C-level functions in that they don't need to look up functions
-  themselves. Note that it is possible for a user to replace these
-  with non-conforming functions (returning values of the wrong type,
-  strings of the wrong length or shift size, and values outside the
-  given range) or even non-functions.
-
-  All code in Pike that use random numbers now use the current random
-  functions (though in some cases fixed at object creation). This
-  allows for repeatable results if the random functions are replaced
-  with a deterministic random generator, such as
-  Random.Deterministic. Example:
-
-    Random.Deterministic rnd = Random.Deterministic( seed );
-    add_constant( "random_string", rnd->random_string );
-    add_constant( "random", rnd->random );
-
-o Sql
-
-  - Most Sql C-modules converted to cmod.
-
-  - All Sql driver modules have __builtin.Sql.Connection as
-    a common base class.
-
-  - Added next_result() to support queries returning multiple resultsets.
-
-  - ODBC & tds: Support more datatypes.
-
-  - ODBC: Support big_typed_query().
-
-  - pgsql: Lots of changes and fixes.
-
-  - pgsql: Toggle cache_autoprepared_statements default to off;
-    turning it on triggers a bug in PostgreSQL sometimes
-    that causes spikes in CPU usage of the database.
-
-o SSL
-
-  - Support session tickets.
-
-  - Support Negotiated FF-DHE.
-
-  - Support Curve25519 key exchange.
-
-  - Support client certificates.
-
-  - Support ALPN.
-
-  - Prefer AEAD suites to CBC suites.
-
-  - SSL.File supports set_buffer_mode().
-
-o Standards.JSON.CANONICAL
-
-  Support RFC 8785-compliant canonical encoding of JSON on platforms
-  where the Pike float type is 64 bits or more. On other platforms
-  a best-effort is performed.
-
-o Standards.PKCS
-
-  Support PKCS#8 private keys.
-
-o Stdio.Fd
-
-  - Support changing directory relative to an open file.
-
-o String.Buffer & Stdio.Buffer
-
-  Added _search().
-
-o System.LookupAccountName(), etc [NT]
-
-  Several NT-specific functions now support wide strings
-  as arguments and as output.
-
-o The self testing framework now supports *.test-files.
-
-o Thread
-
-  - _sprintf() improvements: Thread.Mutex now prints the ID of the thread
-    holding the lock, and thread IDs are shown as hexadecimal numbers.
-
-  - Thread.Farm now supports a callback for thread creation and termination
-    for the purpose of tracking thread names.
-
-  - Thread.Condition are now bound to the first Thread.Mutex object
-    that they are used together with. This ensures that the correct
-    Thread.Mutex is aways used.
-
-o sprintf %x
-
-  %X and %x can now be used on 8-bit wide strings to get a hexadecimal
-  representation of their contents. Just calling sprintf("%x",data) is
-  the same as calling String.string2hex(data).
-
-o Unicode 10.0.0.
-
-o Unicode.is_whitespace()
-
-  This new function returns whether a unicode character is a whitespace
-  character or not.
-
 
 Deprecated symbols and modules
 ------------------------------
 
-o Sql.mysql_result and Sql.mysqls_result have been deprecated.
-  Use Sql.Result instead.
-
-o call_function() has been deprecated. Use `()() instead.
-
-o Stdio.Buffer()->match has been deprecated.
-  Use Stdio.Buffer()->sscanf() instead.
-
 
 Removed features and modules
 ----------------------------
 
-o Compatibility for Pike versions before 7.8 is no longer available.
-
-o GTK1 library is deprecated, so glue code has been removed.
-
 
 C-level API changes
 -------------------
 
-o The contract for functions is now changed so that a function is no
-  longer required to clean the stack. The topmost value of the stack
-  will be regarded as the return value and the rest of the items on
-  the stack, compared to before the function arguments were pushed,
-  will be popped and discarded. Efuns still have to clean their stack
-  as previously.
-
-o Object destructor callbacks may now run during pop_stack() and
-  pop_n_elems(). This means that code must be prepared for arbitrary
-  state changes after having called them.
-
-o Removed add_function, pike_add_function, pike_add_function2,
-  simple_add_variable, map_variable and MAP_VARIABLE. This removes the
-  remaining few API:s where text types were used. Use ADD_FUNCTION and
-  PIKE_MAP_VARIABLE instead.
-
-o Removed the functions my_rand and my_srand. Use the random functions
-  on the stack for _random lfuns, the push_random_string or look up
-  the random function from get_builtin_constants(). For deterministic
-  pseudo random, create a private Random.Deterministic object.
-
-o The preprocessor has been converted into a cmod, and been modified
-  to use more standard Pike datatypes.
-
-o The preprocessor-specific hashtable implementation has been removed.
-
-o The gdb_backtraces() function is now available also --without-debug.
-
-o There's now support to block mapping hashtables from being shrunk
-  on map_delete().
-
-o guaranteed_memset() is replaced with secure_zero() which fills a
-  buffer with zero. On x86 SSE2 is used to zero the memory without
-  loading it into the CPU cache, as this function is typically used
-  before calling free() on memory with cryptographic key data.
-
-o The GC marker hash table has been removed. For types which require
-  GC markers, they are now allocated as part of the data type. Such
-  structures must now start with GC_MARKER_MEMBERS (which includes
-  eg the refs field). See "gc_header.h" for details.
-
-  This change significantly improves GC performance (up to a factor
-  of 2 in some situations).
-
 
 Documentation
 -------------
 
-o RFC references added.
-
-o Character encoding issues fixed.
-
-o Added @enum/@endenum markup.
-
-o Support undocumented enums with documented constants.
-
-o Add some support for documenting annotations.
-
 
 Building and installing
 -----------------------
-
-o GMP 4.1 or later is now required.
-
-o Nettle 3.5 is now supported.
-
-o C99 assumed
-
-  The configure tests will not check for functions defined in C99
-  anymore and C99 compiler support is assumed.