diff --git a/OpenSim/Framework/NetworkUtil.cs b/OpenSim/Framework/NetworkUtil.cs
new file mode 100644
index 0000000000..1abf0d85eb
--- /dev/null
+++ b/OpenSim/Framework/NetworkUtil.cs
@@ -0,0 +1,122 @@
+using System.Collections.Generic;
+using System.Net.Sockets;
+using System.Net;
+using System.Net.NetworkInformation;
+
+namespace OpenSim.Framework
+{
+ ///
+ /// Handles NAT translation in a 'manner of speaking'
+ /// Allows you to return multiple different external
+ /// hostnames depending on the requestors network
+ ///
+ /// This enables standard port forwarding techniques
+ /// to work correctly with OpenSim.
+ ///
+ static class NetworkUtil
+ {
+ // IPv4Address, Subnet
+ static readonly Dictionary m_subnets = new Dictionary();
+
+ private static IPAddress GetExternalIPFor(IPAddress destination, string defaultHostname)
+ {
+ // Adds IPv6 Support (Not that any of the major protocols supports it...)
+ if (destination.AddressFamily == AddressFamily.InterNetworkV6)
+ {
+ foreach (IPAddress host in Dns.GetHostAddresses(defaultHostname))
+ {
+ if (host.AddressFamily == AddressFamily.InterNetworkV6)
+ return host;
+ }
+ }
+
+ if(destination.AddressFamily != AddressFamily.InterNetwork)
+ return null;
+
+ // Check if we're accessing localhost.
+ foreach (IPAddress host in Dns.GetHostAddresses(Dns.GetHostName()))
+ {
+ if (host.Equals(destination))
+ return destination;
+ }
+
+ // Check for same LAN segment
+ foreach (KeyValuePair subnet in m_subnets)
+ {
+ byte[] subnetBytes = subnet.Value.GetAddressBytes();
+ byte[] localBytes = subnet.Key.GetAddressBytes();
+ byte[] destBytes = destination.GetAddressBytes();
+
+ if(subnetBytes.Length != destBytes.Length || subnetBytes.Length != localBytes.Length)
+ return null;
+
+ bool valid = true;
+
+ for(int i=0;i
+ /// Gets a list of all local system IP addresses
+ ///
+ ///
+ public static IPAddress[] GetLocalHosts()
+ {
+ return Dns.GetHostAddresses(Dns.GetHostName());
+ }
+
public static IPAddress GetLocalHost()
{
string dnsAddress = "localhost";