Version 1.52 (Released 20150711)
   Core:
    * Allow torrent files to be up to 32MB in size

   BitTorrent:
    * Blacklisted ut_metadata support of Deluge
    * Increase size of ut_metadata dummy-container

Version 1.51 (Released 20140302)
   Core:
    * Changed some code parts to avoid warnings if running under Perl >= 5.16

   BitTorrent:
    * Crashfix: Bitflu could panic if the last file in a download had 
      a size of zero bytes AND was hitting a piece boundary


Version 1.50 (Released 20120711)
   Core:
    * Implement 'vfs_datafsync' option:
      Bitflu will call fsync() after writing metadata to disk (this is and was
      enabled by default)
      Setting it to '0' skips the fsync() call. This can speedup slow disks but 
      can cause data corruption during power outtages or kernel crashes
    * Workaround for FreeBSD bug/feature in the socket implementation

   BitTorrent:
    * Support for uTorrent ratings (stars)


Version 1.43 (Released 20120501)
   Core:
    * Bugfix: Bitflu used to autopause all torrents if 'min_free_mb' was 
      set to > 0 on a system that does not support statfs()
    * statfs (aka: 'df' and 'autopause') support for FreeBSD

   BitTorrent:
    * Bugfix: Fixed crashbug triggered by the 'verifiy' task:
      The verify task used to mark 'lost' pieces as done, but this messed 
      up our internal have-state.

   Kademlia:
    * Workaround for perl 5.12 (?) bug - bitflu (ehr perl) could silently exit

   Telnet:
    * Bugfix: Escape 'tab' and 'grep' user input correctly: Bitflu could be
      crashed if someone entered '[<TAB>' on the telnet prompt


Version 1.42 (Released 20120408)
   BitTorrent:
    * 'files $sha preview' has been replaced with 'files $sha priority'
      Setting the priority flag on a download causes bitflu to download 
      the needed pieces as soon as possible. The command will still 
      favour the first+last few MB (just like the old command did)
    * Bugfix: 'tracker $queueid set default' was broken
    * Bitflu will now respect tracker urls in magnet links
    * Autoadjust retry timeout for broken trackers

   WebUI:
    * Upgraded to YUI 2.9
    * Autoresize tables in dialog windows while resizing


Version 1.41 (Released 20120211)
   Core:
    * The Bencoding decoder has been rewritten from scratch.
      The new implementation is 3x faster :-)

   Telnet:
    * Fixed old authentication bug where bitflu would refuse to accept a login
      if the input stream was sent too fast
    * Variable length output in 'vd', 'peerlist' and 'files' output.
      Also note that the 'telnet_view' configuration option has been removed.

   BitTorrent:
    * Drop connection if we have more than 512KB of unparsed data
    * Establish less new (outgoing) connections if we are seeding
    * Fixed two crashbugs while loading dht:// links


Version 1.40 (Released 20111218)
   Core:
    * Autopause faster if running out of space
    * Allow completed_downloads == unshared_downloads
      Bitflu will no longer add a .1 to canceled downloads if both directories
      are the same

   BitTorrent:
    * 'Pessimistic' pipelining: only use pipelining if the client is
      known to be 'fast'

   Kademlia:
    * Optimize blacklisting
    * Be more sceptic while receiving sha+ip pairs from other nodes
      (some clients seem to send outdated + unverified data to other
       clients)


Version 1.39 (Released 20111022)
   Core:
    * Bitflu will not check for storage locks if BITFLU_FORCE_START is set in ENV
    * The RSS-Plugin has been removed - bitflu will not startup if the file
      plugins/Bitflu/99_Rss.pm is present. (just remove it)
    * Tweaked bitflu's upload throttling: the new code should use less CPU
      time and downloading via the Webinterface will be much faster.

   BitTorrent:
    * Fixed an off-by-one error that could have caused
      bitflu to crash while importing a torrent with empty files

   HTTP:
    * The http client was rewritten from scratch.
      HTTP is still a 2nd class protocol in Bitflu but the
      new version of the plugin is able to handle downloads
      with unknown size (up to 5MB)


Version 1.38 (Released 20110823)
   Core:
    * Complain at startup if we are started as root while
      the configuration file is writable by other users
    * New config option: pidfile
    * Easier chroot: No need to copy .so files into bitflu's jail anymore.
      However: You'll have to supply $chroot/etc/protocols if you are using IPv6

   WebUI:
    * Add 'hover' in /browse/ mode

   Cron:
    * Stop autoload if we blocked for more than 1 second.
      (The default was to load 10 torrents at a time)


Version 1.37 (Released 20110626)
   BitTorrent:
    * Use more randomness in PeerID

   Kademlia:
    * Accept smaller token values
    * Learn tockens faster due to more random node selection
    * Tuning: Ping good (but failing) nodes more often and recover slowly

   WebUI:
    * Support for desktop notifications (currently only supported by google-chrome)
      Note: chrome seems to 'forget' the desktop notification permission after a
      restart if bitflu is not running on port 80. This means that you'll have to
      re-click the permission button after each restart of chrome if you are running
      bitflu on the default port 4081


Version 1.36 (Released 20110508)
   Core:
    * New feature: 'preview' download:
      The command
      > files queue_id preview 3 6
      will instruct bitflu to download the first few
      (and the last few) Megabytes of file 3 6 first.
      Bitflu will still download other pieces (of these
      or other files) but it will give the start and end
      blocks a higher priority.

    * Bencoding: Corretly encode negative integers
      (bitflu never has to, but it's good to have)

    * Do not load torrents > 8MB

   BitTorrent:
    * Added an workaround to 'create_torrent' for
      'transmission'

   Telnet:
    * Better (readline-like) history handling

   WebUI:
    * Added Disk-Usage bar


Version 1.35 (Released 20110308)
   Core:
    * Setting upspeed to 0 now disables any upload
      throttling (like 'downspeed' does it)
    * Do not re-shuffle file-layout

   BitTorrent:
    * Tracker-Plugin: Be extra-picky while parsing the
      announce list. (This fixes a crashbug)


Version 1.34 (Released 20110227)
   Core:
    * Workaround for perl 5.8.8 bug (1.33 will not
      startup using perl 5.8.8)


Version 1.33 (Released 20110227)
   StorageVFS:
    * Improved detection (and auto-removal) of broken metadata
    * Autodisable fallocate at creation time if we would run
      out of space anyway (helps ext[34])

   WebUI:
    * Add UTF8-Hint to 'browse' view (helps Chrome)
    * Fix scrolling problem in main window

   Core:
    * Optimize call to _GetAddrFoo somewhat for IPv4
    * New option 'downspeed'
      Use 'config set downspeed 0' to disable it (default)
      'config set downspeed 300' would limit your download speed
      to ~300 KB/s.

   Cron:
    * Commit completed downloads even if there are excluded
      (but downloaded) files
    * Fix broken 'df' output

   Rss:
    * Fixed a crashbug


Version 1.32 (Released 20110128)
   Cron:
    * Never autoload more than 10 files per run

   BitTorrent:
    * Support for dht:// links
    * Fixed a crash-bug in the bt_connect command

   Kademlia:
    * Do not complain about 'vote' RPC calls

   WebUI:
    * Complete rewrite using YUI2 javascript library


Version 1.31 (Released 20101228)
   Core:
    * The 'StorageFarabDB' plugin has been removed and is not
      supported anymore.
    * The 'quota' command has been removed / replaced with min_free_mb
    * New config option: min_free_mb :
      Bitflu will stop all active downloads (using sparsefiles) if the
      free disk space drops below 'min_free_mb', example:

       bitflu> config set min_free_mb 8000

      (Stop if free disk space drops below 8GiB)

      Setting this option to 0 (default), disables this feature

   BitTorrent:
    * fixed a very stupid (and old) bug that caused bitflu
      to misparse handshake messages.
    * the tracker-plugin will now only do one auto-udp query
      This should improve 'start-times' for trackers that still
      do not support UDP.

   StorageVFS:
    * call fsync() on _WriteFile
    * check if some other instance of bitflu is using the same
      storage directory and refuse to startup if this is the case.
    * run a 'background verify' if the old bitflu instance crashed
    * the old allocator (vfs_use_allocator) has been replaced
      with fallocate()
    * support for fallocate (disabled by default, can be enabled
      via config option 'vfs_use_fallocate').
      Without fallocate, bitflu creates sparsefiles. While this
      saves some space (unwritten data does not use up any diskspace),
      it will also lead to fragmentation.
      With fallocate() enabled, the filesystem will try to allocate
      space for the full file in advance. This will help reducing
      fragmentation. But keep in mind that fallocate() has a few
      downsides:

       - (currently) only i386 and x86_64 linux are supported
       - only works on some filesystems (eg. ext4 and btrfs).
         fallocate() is *not* supported on ext3!
       - fallocate'd files are not sparsefiles: they will not grow.

      Enabling vfs_use_fallocate should be safe even if your
      operatingsystem or filesystem does not support fallocate():
      In this case bitflu will silently continue using sparsefiles.


Version 1.30 (Released: 20101127)
   Core:
    * Convert :ffff:<ipv4> style IPs into old-style ASAP
    * Internal support to disable IPv4 (See README_IPV6.txt)
    * Refuse to startup if Danga::Socket is <= 1.51

   Kademlia:
    * Ping good nodes more often (even if they are 'unused')

   BitTorrent:
    * Workaround for broken trackers: do not send empty 'event'
      values. (BEP-0003 allows this, but some trackers don't like
      such requests)
    * The tracker plugin failed to accept some (valid) tracker URIs

   Telnet:
    * Better UTF8-Support in 'vd' (Still has problems with CJK)

   StorageVFS:
    * Refuse to create filenames > 255 chars
    * Refuse to create paths longer than 1024 chars

    
Version 1.22 (Released: 20101011)
   Kademlia:
    * Send plain version string (older versions used the packed APIVER)
    * Bugfix: Refuse to add own id as a torrent
         (this would cause some panics due to assert checks)
    * Use larger and random transaction-id values
    * Fix 'kdebug[46] -v $sha': older versions always used the
      'own-id' instead of the provided argument
    * Less noise: Remove the 'ignoring malformed query' message

   BitTorrent:
    * Disconnect from peers who ask for unadvertised data
    * Smarter Endgame mode: dispatch freed pieces to faster clients

   StorageVFS:
    * Bugfix: ->OpenStorage might trigger an assert check
      if the storage id was invalid


Version 1.21 (Released: 20100909)
   Core:
    * New feature: disk quotas
       Use 'quota show' to display your current usage
       Use 'quota set 4096' to set the quota to 4GB
       Use 'quota set off' to disable it (default)

   StorageVFS:
    * Keep a copy of the 'clipboard' in Memory
      (Kademlia uses the clipboard each X seconds, so it
       doesn't make much sense to store->load->store it often)

   WebUI:
    * Create correct paths to /browse/ icons if we are
      behind a reverse proxy


Version 1.20 (Released: 20100815)

   BitTorrent:
    * Refuse to connect to ports <= 1024
    * Ask 'slow clients' less often for new data
    * Ask for more metadata ASAP while downloading
      ut_metadata

   Core:
    * Do not panic if socket() fails to create a new sock.
      (Seems to be 'normal' while running in a Linux-VM)
    * Added option to *remove* data for completed download:
      Use as 'cancel --wipe queue_id'
      ..or hit the 'delete' button in the webui

   HTTP:
    * Accept malformed load command: 'load http:/single-slash.com/foo'
      (Useful if we are running behind nginx)

   WebUI:
    * Relaxed parsing: Accept requests to //foo (instead of /foo)
    * Support for file-list in JSON (needed for Transdroid)
    * Fix some JSON errors (also for Transdroid)


Version 1.10 (Released: 20100615)

   BitTorrent:
    * Performance: return early if the buffer is empty (saves some cpu time)
    * The torrent created by create_torrent includes the sha1-sum in its filename
    * Changed piece selection: Bitflu will now try to finish partial completed
      chunks faster

   StorageVFS:
    * Try to remove corrupted storages
    * New options to the 'files' command:
      files $sha list-included | list-excluded

   Core:
    * ETA: return seconds as integer (1.3521523 seconds doesn't make sense)
    * API: The 'tempdir' setting got removed

   Telnet:
    * Implemented 'head' and 'tail' commands

   Rss:
    * Accept larger RSS feeds (> 256KB)


Version 1.00 (Released: 20100505)

   Telnet:
    * Change the 'details' output to use localtime (old version used gmtime)
    * Added 'ETA' information

   BitTorrent:
    * Autoadjust torrent_gcpriority if we are under pressure (many clients)
    * Fixed a very rare crash bug: Bitflu could panic if:
         - there are less than 3 connected peers
         - and a torrent is near completition...
         - ..while the GC kicks in.


Version 0.99 (Released: 20100329)

   BitTorrent:
    * Do not complain if we receive old/invalid Metadata

   Kademlia:
    * Bugfix: An invalid getpeers reply could have caused bitflu to panic

   WebUI:
    * Add a close-button to the Notification!-Element


Version 0.98 (Released: 20100308)

   Kademlia:
    * Fixed broken node_id generator


Version 0.97 (Released: 20100222)

   WebUI:
    * Bugfix: Browsing a torrent with zero-sized files crashed
               bitflu (division by zero)

   Core:
    * New configuration option: 'chdir':
      If this option is set, bitflu will change into this
      directory after loading all plugins.
      
      An example:
        plugins              = ./plugins
        chdir                = /tmp/foo
        incomplete_downloads = ./workdir/unfinished
      
      - Bitflu will load all plugins from './plugins'
      - change into /tmp/foo
      -> incomplete_downloads would then be at /tmp/foo/workdir/unfinished

   Kademlia:
    * Use less CPU (about -15% on my 800Mhz PC!)
    * Never use more than 5kbps for outgoing traffic


Version 0.96 (Released: 20100111)

   Core:
    * Complain if IO::Socket::INET6 version is < 2.56
    * Do not even try to parse strings that appear to be
      non-bencoded

   BitTorrent
    * Rewrote HuntPiece
    * Printout tracker 'failure reason' message.
    * Bugfix: Bitflu would panic (bugcheck) if a non-ut_meta peer
      would send us a reject message. ouch!

   Telnet interface:
    * Line editing support (CTRL+A and CTRL+E also works!)


Version 0.95 (Released: 20091129)

   Internal:
    * Make use of 'fields' in some plugins to save memory + cpu

   BitTorrent:
    * Optimized magnet-links usage: Received metadata is now
      swapped ASAP.

   Kademlia:
    * Support for BEP-32 (Kademlia over IPv6).
      Bitflu <= 0.94 included experimental IPv6-Kademlia support and is
      not compatible with BEP-32. Upgrading to 0.95 is recommended for
      all people using bitflu with IPv6

      BEP-32 specs are at: http://www.bittorrent.org/beps/bep_0032.html

    * Fixed stupid ping-bug (introduced in 0.94). Bitflu would stop
      pinging valid DHT-Nodes.

    * General Kademlia optimizations


Version 0.94 (Released: 20091114)

   WebUi:
    * Added 'browse' button to view torrent in an apache-like dirlisting
      (or just enter: http://localhost:4081/browse/ in your browser)
    * Support for HTTP HEAD Requests (needed by crazy wget)

   Internal:
    * Moved all Bencoding stuff to Bitflu::Tools->Benc*
      The bencoder isn't really bittorrent specific, so it can be used by other
      plugins.
    * Bugfix: Removing an SxTask could have crashed bitflu
    * VeryInternal: Make _Runners a Hashref ( < 0.94 used to use an arrayref )
    * Fixed rare socket leakage due to failed writes
      (Only affected plugins that do not timeout established connections such as
       AdminTelnet and AdminHTTP)

   StorageVFS:
    * Fixed filehandle leak: Bitflu forgot to flush its own filehandle cache while
      removing a completed download from it's own queue.

   BitTorrent:
    * Added tracker editor: Bitlu can now edit/set/replace existing trackers.
      Example 1: Set 2 trackers
       bitflu> tracker df18859fa3c1840967523254e9d37cf1754aaef3 set http://tracker1.com/announce,http://tracker2.com/announce
       (Note: ',' seperates trackers, '!' forms groups)

      Example 2: Restore default
       bitflu> tracker df18859fa3c1840967523254e9d37cf1754aaef3 set default

    * Changed create_torrent syntax to be consistent with 'tracker set'
    * Fixed perl warning (Use of uninitialized...) while running the 'peerlist' command.
      (This bug was old, sorry! ;-) )
    * Fixed a small memory leak in the torrent module
      (Bitflu still used memory for unlocked piece. Not a big leak but it was still a bug)
    * ENDGAME: Better 'endgame' detection. Before this release bitflu would enter the endgame mode
      if $pieces_left was below 30.
      Bitflu will now activate the endgame mode if it detects that all free pieces have
      been queued/locked.
    * ENDGAME: Kick locked pieces while entering endgame mode. Otherwise a slow peer could
      queue up all remaining pieces for a long time
    * Support for invalid (non-base32-encoded) magnet links

   Kademlia:
    * Fixed timing issue with bootstrap
    * AliveHunter() should scale better even when working with big
      routing tables. The old version used to re-shuffle a list of
      nodes on each run. This list will now be keept in a cache.
    * Improved kdebug output: Better statistics

   Cron:
    * Run 'history cleanup' each 5 hours to keep it 'small'


Version 0.93 (Released: 20091026)
   WebUi:
    * Some cosmetic fixes

   Kademlia:
    * Strict response checking: Do not accept a 'values' reply if we did not
      ask for it.

   BitTorrent:
    * Bitflu understands the (unused but handy?) torrent://info_hash format. Example:
          bitflu> load torrent://640fe84c613c17f663551d218689a64e8aebeabe
          (Note: This is Slackware 12.2)
      Magnet-Links are still supported (torrent:// links are actually converted
      into a magnet link internally)


Version 0.92 (Released: 20090816)
   Rss:
    * Fixed help text ('see rss help' -> 'see help rss')
    * Bugfix: Avoid stuck rss downloads

   BitTorrent:
    * Speedup verify command
    * Added 'verify progress' command

   Telnet:
    * New Pipe-Command: sort
       Example: vd | grep Foo | sort
    * Removed compact-download-view command ('l' command)
    * Added new option telnet_view
    
       telnet_view can be used to alter the output of the 'vd' command.
       The option takes a line in this format:
         field1[=max_length],field2[=max_length] 

       The default value is:
         type,name=25,hash,peers,pieces,bytes,percent,ratio,up,down,note

       This means that 'vd' will display the download-type, the name (limited to 25 chars),
       the queue_id, number of peers, etc... 

       The value of telnet_view can be altered at runtime. An example:
       bitflu> config set telnet_view name=10,hash=10,pieces,percent,up,down

       The default value can be restored by setting telnet_view to "" :
       bitflu> config set telnet_view ""


    Internal:
     * Plugins can now create some sort of threads (Called SxTasks)
       The API might (will?) change as this is a first bare-bones implementation
       that doesn't do any cleanups (Killing an SxTask doesn't cleanup Sockets)
       Currently this is only used by the verify command but might find use
       for the Rss/Cron plugins (and maybe the BitTorrent GC?)


Version 0.91 (Released: 20090621)

   Rss:
    * This is a new plugin: Bitflu can handle RSS feeds and download all (whitelisted) content
      Example:
        
        bitflu> rss add http://rss.a.scarywater.net/
            rss-job http://rss.a.scarywater.net/ has been added
        
        bitflu> rss list
            Registered RSS feeds:
            rss-e0a453c7d0b483f7bfa2d52b0e5debfa0b18b7a2 : http://rss.a.scarywater.net/
        
        bitflu> rss rss-e0a453c7d0b483f7bfa2d52b0e5debfa0b18b7a2 whitelist haruhi
            rss-e0a453c7d0b483f7bfa2d52b0e5debfa0b18b7a2: whitelist set to 'haruhi'

   WebUi:
    * Limit download name to 180 chars in display

   Telnet:
    * New shortcuts:
        CTRL+D quits the current session
        CTRL+L clear screen
    * Better tab-completion:
        TAB will complete as much as possible
        Bitflu will show multiple hits (if any)

   StorageVFS:
    * Try to re-create missing dataroot-directories

   Internal:
    * Reduced DNS-Lookup timeout (via RES_OPTIONS)
    * Remember 'bad' DNS-Names and skip them for a while if resolving
      failed
    * Implemented ->GetCompletion and ->RegisterCompletion
      The 'tab completion' isn't hardcoded anymore: plugins can
      provide their own suggestions


Version 0.90 (Released: 20090501)

   Core:
    * Bitflu::Network has been rewritten and uses Danga::Socked instead of IO::Select
      So this means that bitflu can use epoll() on Linux and kqueue on *BSD.
      Please note that version >= 1.61 is highly recommended and even required if
      you are using IPv6 (FreeBSD ports includes a very old version. Just use CPAN
      and you are done :-) )

   BitTorrent:
    * Bugfix: Fixed IPv6-PEX bug
    * Bugfix: Do not work-around bitflu's bandwith scheduler (->WriteDataNow misuse)
    * Performance: Do not re-parse databuffers if we know that they are not yet
      fully received
    * Tracker: Accept broken HTTP-Responses (\n\n instead of \r\n)
    * Tracker: Do not accept responses >~ 256Kb

   Kademlia:
    * Bugfix: Use correct handle while writing/reading to blacklists

   HTTP
    * Display download speed for each queue entry (Finally)


Version 0.81 (Released: 20090412)

    Network:
     * Fixed IPv6 resolver on FreeBSD (and others?)
     * Increased network buffer-size to 32kb (old: 8kb on Linux, 1kb on FreeBSD)
       This should fix speed issues on *BSD

    BitTorrent:
     * Bugfix: Fixed broken 'tracker show' output (broke in 0.80 due to IPv6)

    Kademlia:
     * IPv6 Support (Experimental: Bitflu is currently the only implementation
                     that supports IPv6-Kad)

    StorageVFS:
     * New configuration option vfs_use_allocator
       Turns bitflus internal pre-allocator on or off
       Setting this to 1 causes bitflu to pre-allocate data.
       This results in more disc activity but can help to avoid fragmentation
       on some filesystems. Setting this to 0 turns the pre-allocation off
       The default is '0' (= Disabled).
       (Note: Bitflu <= 0.80 had this on and you couldn't turn it off) 


Version 0.80 (Released: 20090209)

This might be the worst or the best bitflu release ever: You decide (and i
don't care :-p )

Bitflu 0.80 brings you (almost) full IPv6 support. yeah!


     Core:
      * Support for binding an OUTGOING connection to a specific (non-standard)
        Interface has been dropped.
      * Network: IPv6 support!
      * Network: API-Change: Use of IPv4 has been replaced by RemoteIp
      * Config: Bitflu will now create a backup of your configuration file
                while starting up

     StorageVFS:
      * Bugfix: _WriteFile failed to check the return code of print() and close(), this
        could have caused a corrupted clipboard file if you ran out of diskspace


     BitTorrent:
      * Bugfix: analyze_torrent and verify would cause a panic if the specified
                queue_id string did not exist. Oops.
      * Outgoing connections are (again) established less aggressive.
        Bitflu ~0.62 tried very hard to create outgoing connections but
        this would only reward people who are unable to receive
        incoming connections.
      * Tracker: Support IPv6 responses (TCP and UDP!)
      * PEX: Bitflu cann receive IPv6 Peers and will use them .. maybe :-)
      * New command: seedprio: Tells bitflu to reserve X upload slots
                     for a specific torrent
      * New command: seedhide: Tells bitflu to hide X % while seeding a
                     torrent. So bitflu will look like a normal 
                     downloader and leechers won't be able to get the
                     full torrent from just a single peer.



Version 0.70 (Released: 20090102)

     BitTorrent:
      * The tracker plugin can now handle udp:// trackers
        We also use auto-udp (= try to contact a tracker via
        udp even if there is no udp:// uri for it)
        New config options:
         -> torrent_tracker_udpport (Port used for UDP, must not be forwarded)
         -> torrent_tracker_autoudp ('Guess' udp capability)
      * Disable 'pipelining' (reqq) if torrent is in 'AlmostDone' state.
        This reduces the feasibility that a slow/broken peer can pile-up
        all remaining piece requests.
      * Bugfix: Bitflu will now always send NOT_INTERESTED messages
                after completing the download (not a big problem but it was
                still a bug)
      * Disconnect from other seeders while seeding a torrent
        (Bitflu used to wait until the connection times out due to
         no activity)
      * Internal: Removed multilock feature (Wasn't used anyway)

     Core:
      * Beautified 'config show' output (locked values are yellow)
      * Added a '--quiet' option
      * Beautified '--help' output
      * Bitflu will not print anything to STDOUT if started with --daemon


Version 0.62 (Released: 20081222)

     StorageVFS:
      * Implemented a filedescriptor cache to reduce
        the number of open()/close() calls.

     Core:
      * Removed the (unimplemented) echo command that caused
        bitflu to panic. Uups...

     Telnet:
      * Added 'clear' command to clear the screen
      * Added 'repeat' command that repeats a command each second.
        Example:
          foo@bitflu> repeat clear ; date ; vd
        (Hit CTRL+C to stop)

     BitTorrent:
      * Remember received peers (via Tracker, Kademlia or ut_pex)
        and try to contact them in small steps.
        This will/should result in more peers
      * Removed torrent_minpeers setting
      * Do not blacklist peer if first chunk was bad (Added MIN_HASHFAILS)

     WebUI:
      * Bugfix: The upload function forgot to remove tempfiles. oops.


Version 0.61 (Released: 20081112)

     StorageVFS:
      * Bitflu 0.60 used to crash often on *bsd and OSX due to my
        misuse of seek() :-) . This release fixes this annoying bug.

     Core:
      * The networking layer now detects fast senders and requeues
        recv() calls if needed. This can reduce CPU load while increasing
        the download speed.
      * Implemented '--all' keyword for pause, resume, cancel and commit.
        So you can type 'pause --all' to pause all downloads.
      * Added 'history drop' to delete bitflus download history with
        a single command.

     BitTorrent:
      * Delay writing 'piece request' results.
        Bitflu used to respond to piece-requests ASAP. This caused some ugly
        'buffer overrun' messages to appear if the remote client did ignore
        the 'reqq' value sent during handshake.
        Bitflu now has an internal buffer for all piece request and only writes
        a response if the buffer won't get 'overflowed' by this.

     WebUI:
      * Implemented torrent-uploading via HTTP. Thanks to Pedro Melo for sending
        me this patch.


Version 0.60 (Released: 20081009)
     Cron:
      * Added version check: Bitflu checks if your version is up-to-date and sends you
        a note (via 'notify') if it isn't.
        > Note: This 'phone home' check does NOT transmit any personal data
               or/and replace any files itself!
               The check just lookups the A-Record of 'version.bitflu.org'
        > You can set 'checkversion = 0' in .bitflu.config to DISABLE this feature.
          (default is: enabled)
        > Implementation details:
         - Bitflu does an A-Record lookup for 'version.bitflu.org' and
           will receive something such as: '1.0.60.0'
            1 = Unused
            0 = Major version
           60 = Minor version
            0 = Unused
         - Have a look at 'sub _VersionScan'
      * Blacklisted IPs are now expired after 1 hour.

     Kademlia:
      * Removed 'own' blacklisting code: The kademlia plugin will
        now use the Network-Blacklist API

     BitTorrent:
      * Include User-Agent string in Tracker requests
      * Do not schedule/throttle tracker writes (avoiding some timeout issues)
      * The tracker plugin no longer destroys bencoded data with linebreaks ("\n") .. d'uh!
 

   
Version 0.52

     Core:
      * Implemented 'log': This command returns the last X log messages from bitflu's
        internal buffer
      * Bugfix/Workaround:
        Bitflu assumed that the system clock would never step backwards. This is true on systems
        that use ntpd/chrony/clockspeed to adjust clock drifts. But if something such as
        ntpdate is used we would run into much trouble. (The BitTorrent plugin could
        even cause bitflu to crash due to a division by zero).
        SetTime will now no longer accept timestamps from the past. This avoids
        Possible crashes but calculations (Download speed) will still suffer.

     BitTorrent:
      * Blacklist 'own' IP if detected (connecting to ourself doesn't make any sense)

     StorageVFS:
      * Implemented a simple 'allocator' to avoid fragmentation
      * Renamed default Storage-Directory names

     Core:
      * Moved the pause/resume commands into QueueMGR (This was implemented
        by the BitTorrent plugin itself)

     WebUI:
      * Added History dialog
      * Added a Notifications! button

     Cron:
      * Complain (via notify) if autoload failed for some reason


Version 0.51 

     BitTorrent:
      * create_torrent will not create torrents with piece-size < 32kb (would confuse uTorrent)
      * import_torrent: Skip incomplete files instead of panicing
      * Removed the old ranking-system with a fairer version
        (The old version discriminate fresh connections)
 
     StorageVFS:
      * Improved the 'cancel' command:
         -> Canceling an unfished/uncommitted downloads removes all traces
         -> Canceling a committed download moves it into $unshared_downloads

     WebUI:
      * Made the '/getfile' link relative to avoid problems behind an apache proxy
      * Added Include/Exclude buttons

Version 0.50 (Released: 20080531)
     BitTorrent:
      * Replaced some substr() calls with unpack().
        This is less ugly to read and might be somewhat faster.
      * Fixed some import_torrent bugs:
        - The imported data is now added to the uploaded counter to
          keep your ratio 'in-sync'
        - We'll disable autocommit/autocancel after importing
          data
      * Tracker-Plugin will now also bind to torrent_bind
      * Added create_torrent command.
         
     Kademlia:
      * Bugfix: Flush _knownbad each hour
      * Use torrent_bind (= Do not listen on all interfaces if set)

     Cron:
      * Bugfix: 100% completed downloads WITH excluded files would cause
                cron to do an endless-autocommit.
                Bitflu will now not try to autocommit files that have excluded
                files. (Wouldn't make much sense anyway...)

     Core:
      * bind() outgoing TCP connections to the same interface as the
        listening socket.
      * New configuration option: 'default_bind'
        bind outgoing/incoming connections to this interface if the
        plugin doesn't have its own *_bind value.
        default_bind is currently only used by the HTTP-Plugin.
      * New configuration option: history
          history = 1 : Use / update the download history (Default)
          history = 0 : Do not use or write to the history

     StorageFarabDb:
      * _WriteFile will now use rename() to do an atomic write

     StorageVFS:
      * New storage plugin: The old/current FarabDb-Storage plugin 
        needs a lengthy commit after a download has been finished because
        the whole 'stream' is stored within small chunks. This made it easy
        to ensure integrity (because it can use rename() to change a pieces
        state and it uses fsync() before moving a file into .done) but is very
        unhandy because commiting a download requires a LOT of space (it doubles
        the space usage). The new VFS plugin stores downloads the way it's done
        by 'all other' clients such as Azureus or uTorrent.
        Give it a try if you feel brave: (Note: This is alpha/beta code)
          1: Stop bitflu
          2: Edit .bitflu.config and set/replace 'storage = StorageVFS'
          3: Start bitflu
        The download list will now be empty because the VFS plugin is not
        'compatible' with FarabDb.
        -> Unfinished downloads are stored at ./workdir/unfinished/$SHA1
        -> Finished downloads are stored at ./workdir/finished/$NAME

        The plugin still has some known bugs/missing features:
        -> Moving/deleting files within ./workdir/(un)finished will cause
           bitflu to panic. You must 'cancel' a download before touching
           any files
        -> Canceling an unfinished download does not remove any files
        -> The plugin does not try to 'repair' a 'broken' download directory

        Btw: Switching back to the FarabDb plugin is easy: Just delete the
             'storage = ...' line and start bitflu again.


Version 0.45 (Released: 20080421)

     Core:
      * Implemented download-history:
         Bitflu will now remember what you've downloaded and refuses
         to download the same item twice.
         Use the 'history' command to view and edit the internal history

     Cron:
      * Implemented 'schedule' command:
         The schedule command can be used to change configuration values
         at a given time.
         An example:
          > schedule set upspeed 20 80@2200-2300 90@0100-0500
         This would cause bitflu to set the value of 'upspeed' to:
           80 from 22:00 until 23:00
           90 from 01:00 until 05:00
           20 otherwise (= Default value)
         Note that there is no 'weekday' support yet. So you cannot
         have a 'Sunday' rule. I'll implement it if there is demand for
         such an option.

     StorageFarabDb:
      * Added 'sprofile' command (Storage 'Profiler', used for performance debugging)
      * Fixed a typo that caused some unneeded printf() calls during startup
      * Moved Config-Proto from Bitflu::Configuration to StorageFarabDb

     Kademlia:
      * Save good nodes each 15 min. and boot from them
        at startup (if needed). The old behaviour was to boot using
        router.utorrent.com:6881 and router.bittorrent.com:6881.
        Both nodes will still be used if your routing table is
        empty. If you are running bitflu on a static ip, feel free to
        drop me a note and i'll add your ip/host to the hardcoded
        bootstrap list :-)

     Telnet:
      * Added 'l' command: This command outputs a compact
        (small screen) version of the 'vd' output
      * Log ip of connecting peer instead of the sockref on console

     WebUI:
      * Added Pause/Resume buttons to each download


Version 0.44 (Released: 20080229)

     Core:
      * New option: --daemon (fork into background after startup)
      * New configuration file option: logfile
      * Check 'APIVERSION' while loading plugins

     StorageFarabDb:
      * Dump bitfield on exit and slurp it while starting up.
        Doing this improves startup time while running on
        filesystems with slow metadata performance (Such as Ext3)
      * Executing 'files 0 list' triggered a panic, this has been
        fixed.
      * Do not try to 'fix up' the StorageId, this caused certain
        plugins to panic

     BitTorrent:
      * Keep one PPL-Piece until it's done. This helps to
        'bootstrap' a torrent.

     Kademlia:
      * Removed 'kademlia_enabled' setting. You can disable
        the kademlia plugin via 'pluginexclude'

     AdminTelnet:
      * You can now specify multiple commands on a line using ';', Example:
         bitflu> config show upspeed ; netstat
      * Support for pseudo-pipes and grep, Example:
         bitflu> files 1234567890abcdef1234567890abcdef12345678 list | grep Foo

     WebUI:
      * Do not use absolute links, making the WebUI useable behind an Apache-Proxy
      * Display 'ratio'


Version 0.43 (Released: 20080117)

     BitTorrent:
      * Support for MAGNET links
      * Added 'pause' and 'resume' commands.
      * Only keep needed information form the torrent in memory
      * Removed partial FastPeers support: Mainline dropped support in
        version 6.x (also known as uTorrent)
      * Delay ReleasePiece calls after receiving a CHOKE message.
        This helps to work around some obscure uTorrent UNCHOKE->CHOKE->UNCHOKE
        tactic.
      * Bugfix: import_torrent can now correctly slurp torrents
                that include zero-sized files.
        
     WebUI:
      * Added a (bare-bones) WebUI: http://127.0.0.1:4081/

     StorageFarabDb:
      * Added 'files .. include' and 'files .. exclude' (for selective downloads!)
      * Fixed 'files .. list' percent calculation to be more accurate :-)
      * Replaced the 'pcommit' command with 'files queue_id commit 1 2 3'
      * Display percentage while verifing storage
      * Do not cache more than 256 bytes per setting (Caching _torrent
        doesn't make much sense)
      * Cache Free/Inwork/Done data using a bitfield
      * (Try to) fsync() file before moving it to .done

     Core:
      * API-Change: Changed how ->ExecuteCommand works:
                    Plugins can now return 'leftovers' (SCRAP) that we'll
                    pass to the remaining plugins.
                    This makes it possible pass torrent and http-urls to
                    a single 'load' command.
      * Added 'pluginexclude' setting:
         pluginexclude = 10_AdminTelnet.pm;99_Cron.pm
        would disable the telnet + cron plugin


Version 0.42 (Released: 20071226)

     Core:
      * Enhancement: Run out-of-the-box on Perl 5.10 by using Digest::SHA if
                     installed (and fallback to Digest::SHA1 if it isn't)
      * Bugfix: Check for EWOULDBLOCK and EAGAIN if syswrite() failed.
                This fix makes bitflu a much better uploader :-)
      * Bugfix: Reject incoming connection if $sock->peername; fails
      * API-Change: Callbacks are now registered while creating the socket.
      * API-Change: Throttle is depricated. Use WriteDataNow() instead.
      * Many netiolib changes (This release includes version 20071220_1)
      * Use /dev/null instead of /dev/zero to test file descriptors.
      * Try to read() multiple times from a socket while in _IOread();

     BitTorrent:
      * Bugfix: Release locked pieces on unchoke.
      * Bugfix: Do not crash if torrent has an empty info=>{} hash
      * Removed torrent_huntpriority and torrent_slowspread settings.
      * Added torrent_upslots setting. (Configures how many peers can be unchoked)
      * Run an unchoke round each 30sec+skew (not each 20sec like 0.41 did), optimistinc
        unchoking has also been implemented (we are unchoking 1 GLOBAL peer)
      * Rewrote mainloop: The 'GarbageCollector' runs now each second but does only
        work on a small subset of peers.
      * Try (even more) to avoid calls to $self->Hunt; (they can be very expensive)
      * Do not accept more than 30 peers per ut_pex message.
      * DebugPeer (the 'x' command) does now display the name (+ version) of some
        well known clients such as uTorrent, Azureus, BitComet.. etc..
      * Trackerblacklist matches are now caseINsensitive

     AdminTelnet:
      * Removed the flags column and replaced it by colors + text
      * Added command 'details'

     Kademlia:
      * Do not accept malformed kademlia nodes ($port == 1) in response
        to get_peers/find_nodes as this will just trigger a bugcheck/panic.

     StorageFarabDb:
      * Check storage directory on first ->OpenStorage call
      * Security fix: A malicious .torrent could have caused bitflu to
                      either append data to existing files or create
                      new files (overwriting files was not possible) 'outside'
                      it's own workdir while committing the download.
                      The storage driver will now try to sanitize filenames
                      and refuses to append data to existing files.
                      Well.. fixing this was on my todo list for 0.40 but i forgot
                      to implement it...
                      Remember: Always run bitflu inside a chroot jail ;-)

        


Version 0.41 (Released: 20071213)

     Core:
      * Added 'pcommit' command
      * Mark broken commits wit a 'INCOMPLETE_' prefix
      * Advertise MAX_OUTSTANDING_REQUESTS via EPROTO-Handshake
      * Added 'useradmin' command (Authentication)
      * Fixed some perl warnings and adjusted loglevel
      * Bugfix: StorageFarabDb: OpenStorage does now cache (and more important) share
                the storage object globally. This fixes a rare 'race condition'.

     BitTorrent:
      * Added Kademlia Support
      * Downloading a .torrent file using the 'load' command will now
        trigger an auto-import (= Bitflu will start load the torrent itself)
      * Implemented PPL-Hunting: Bitflu will now try to get some complete pieces ASAP


Version 0.40
      * This is a complete rewrite

