You should look at the handshake headers used by LimeWire and look them up in the GDF wiki. That shows you which features you need to support. One thing which is important nowadays, is something called "high outdegree". That means you must use a TTL of 4 at maximum and you should connect to about 32 Ultrapeers and let further leaves connect.
The most important feature to support is the Query Routing Protocol (QRP):
The message type for this is really 0x30 not 0x20. Further, for new software, there's no excuse for not supporting Unicode:
http://www.the-gdf.org/wiki/index.ph...s_with_Unicode
Vendor messages are not critical but still important: These use a generic scheme that can be used to introduce new vendor-dependent but also common messages. You should absolutely never introduce your own message types, that's what vendor messages are for. You should certainly support the "connect back" requests, that's also fairly simple.
Don't expect that other vendors' leaves accept your Ultrapeer. Most peers prefer their own vendor as Ultrapeers except the smaller vendors and/or those that have no Ultrapeer support anyway. Thus focus Ultrapeer <-> Ultrapeer connections.
Read also this:
http://groups.yahoo.com/group/the_gdf/message/21552