Design for basic Structure of transports
Design the factory classes for generating TransportPlugin instances
Interface design for transport addresses

This interface has been designed considering a very abstract address.
Although it has been kept in mind that most transports will be IP based.
Some methods will be supported by IP based transports only.
Exception classes

The major exceptions that can be thrown while dealing with transports.
Add more core classes

These classes are mainly empty interfaces that will be used later as stream support is developed.
Add configuration files

The TransportManagerConfig is used to setup the TransportManager.
They store addresses and enabled transports.

TransportConfig is used to initialise a transport instance from a factory class.
Add PeerTransport

This is a very important refactoring change.
It involves moving methods from PeerNode onto PeerTransport since each transport requires separate methods and fields.
Since this class involved several changes this is the version after the major desing was agreed upon.
Refactor-1 branch can be used for the entire history.
Add bundle objects for PeerNode

Each PeerNode will need to create a copy of PeerTransport using the bundle object.
They are created in NodeCrpyto.
Add transport managers

The development history for these can be found in refactor-1 branch.
It is main point of connection between fred plugins and fred for supporting transports.
Synchronization issues haven't been dealt with completely. But performance is not an issue. For now synchrnoized methods are used.
A plugin registers with the registered manager which notifies all the managers present.

A thorough review and good testing is necessary.
Add factory class for existing UDPSocketHandler

In NodeCrpyto we will use this class to create the instance of UDPSocketHandler.
Add PeerConnection

These classes are used for a specific connection.
To store trackers, keys, packetformat instance.
Every transport after every connection(handshake) will create one.
Add PeerPluginAddress

This is an implementation of PluginAddress that can be used by all IP based transports.
It uses Peer to do all the necessary work that Peer object did before.
Create TransportManager objects

Create for opennet and darknet. Also create their config classes.
We would in the future read from a file and create the config class.

Add static variables for default transport names.
Handle a new transport

This involves notifying all PeerNode instances i.e. all our peers
Also write a workaround that makes UDPSocketHandler behave as a plugin.
Change from Peer to PluginAddress for PacketSocketHandler
Make UDP a plugin instance

This instance is created by UDPSocketPluginFactory.
It uses PeerPluginAddress to handle addresses.
Add new transport address message

This can be used for remoteDetectedAddress functionality.
We want to keep FNPDetectedIPAddress for backwards compatibility.
Change from Peer to PluginAddress

These involve minor changes and have been grouped as a commit.
Add methods for PluginAddress in PeerManager

These methods provide equivalent functionality that was provided for Peer object.
These include comparing addresses and checking for them.
Port from Peer to PluginAddress

This shift had been done in one go itself.
No history exists.
Mainly invovled replacing Peer with PluginAddress and renaming field names appropriately.
peer field name has been changed to address.
Please check with PeerNode for corresponding changes.
These need to be checked thoroughly.