Unstructured P2P networks support distributed applications whose workload may vary significantly over time and between nodes. Self-optimizing systems try to keep the load in the network balanced despite the frequent load fluctuations. Several P2P systems exhibit a number of related features but fail to avoid centralisation under high-load situations. ERGO aims to balance the overloaded nodes by rewiring some of their incoming links to underloaded ones via a set of interconnected servers which index the underloaded nodes. In two simulated environments, ERGO load-balancing on Gnutella network increases the balanced nodes and network availability by preserving its efficiency and even reducing its messages.