diff --git a/CONTRIBUTORS.txt b/CONTRIBUTORS.txt
index 24432446c8..38343a4bbc 100644
--- a/CONTRIBUTORS.txt
+++ b/CONTRIBUTORS.txt
@@ -167,6 +167,7 @@ This software uses components from the following developers:
 * GlynnTucker.Cache (http://gtcache.sourceforge.net/)
 * NDesk.Options 0.2.1 (http://www.ndesk.org/Options)
 * Json.NET 3.5 Release 6.  The binary used is actually Newtonsoft.Json.Net20.dll for Mono 2.4 compatability (http://james.newtonking.com/projects/json-net.aspx)
+* zlib.net for C# 1.0.4 (http://www.componentace.com/zlib_.NET.htm)
 
 Some plugins are based on Cable Beach
 Cable Beach is Copyright (c) 2008 Intel Corporation
diff --git a/OpenSim/Data/MySQL/MySQLRegionData.cs b/OpenSim/Data/MySQL/MySQLRegionData.cs
index baa948e680..efefad9704 100644
--- a/OpenSim/Data/MySQL/MySQLRegionData.cs
+++ b/OpenSim/Data/MySQL/MySQLRegionData.cs
@@ -62,6 +62,8 @@ namespace OpenSim.Data.MySQL
             if (scopeID != UUID.Zero)
                 command += " and ScopeID = ?scopeID";
 
+            command += " order by regionName";
+
             using (MySqlCommand cmd = new MySqlCommand(command))
             {
                 cmd.Parameters.AddWithValue("?regionName", regionName);
diff --git a/OpenSim/Data/MySQL/Resources/Presence.migrations b/OpenSim/Data/MySQL/Resources/Presence.migrations
index 1075a15721..be4030efb0 100644
--- a/OpenSim/Data/MySQL/Resources/Presence.migrations
+++ b/OpenSim/Data/MySQL/Resources/Presence.migrations
@@ -14,7 +14,7 @@ CREATE INDEX UserID ON Presence(UserID);
 
 COMMIT;
 
-:VERSION 1         # -------------------------- 
+:VERSION 2         # -------------------------- 
 
 BEGIN;
 
diff --git a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs
index d1274e9cf1..e3d49692f3 100644
--- a/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Inventory/Transfer/InventoryTransferModule.cs
@@ -159,9 +159,9 @@ namespace OpenSim.Region.CoreModules.Avatar.Inventory.Transfer
 
         private void OnInstantMessage(IClientAPI client, GridInstantMessage im)
         {
-            m_log.DebugFormat(
-                "[INVENTORY TRANSFER]: {0} IM type received from {1}", 
-                (InstantMessageDialog)im.dialog, client.Name);
+//            m_log.DebugFormat(
+//                "[INVENTORY TRANSFER]: {0} IM type received from {1}", 
+//                (InstantMessageDialog)im.dialog, client.Name);
           
             Scene scene = FindClientScene(client.AgentId);
 
diff --git a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs
index 252304b876..7b94a8131a 100644
--- a/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs
+++ b/OpenSim/Region/Framework/Scenes/Serialization/SceneObjectSerializer.cs
@@ -1363,7 +1363,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
                 }
                 else
                 {
-                    m_log.DebugFormat("[SceneObjectSerializer]: caught unknown element {0}", nodeName);
+//                    m_log.DebugFormat("[SceneObjectSerializer]: caught unknown element {0}", nodeName);
                     reader.ReadOuterXml(); // ignore
                 }
 
@@ -1438,7 +1438,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
                         p(item, reader);
                     else
                     {
-                        m_log.DebugFormat("[SceneObjectSerializer]: caught unknown element in TaskInventory {0}, {1}", reader.Name, reader.Value);
+//                        m_log.DebugFormat("[SceneObjectSerializer]: caught unknown element in TaskInventory {0}, {1}", reader.Name, reader.Value);
                         reader.ReadOuterXml();
                     }
                 }
@@ -1467,7 +1467,7 @@ namespace OpenSim.Region.Framework.Scenes.Serialization
                     p(shape, reader);
                 else
                 {
-                    m_log.DebugFormat("[SceneObjectSerializer]: caught unknown element in Shape {0}", reader.Name);
+//                    m_log.DebugFormat("[SceneObjectSerializer]: caught unknown element in Shape {0}", reader.Name);
                     reader.ReadOuterXml();
                 }
             }
diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsMessagingModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsMessagingModule.cs
index 185d44de80..25dba7f45e 100644
--- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsMessagingModule.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsMessagingModule.cs
@@ -212,12 +212,15 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
         
         public void SendMessageToGroup(GridInstantMessage im, UUID groupID)
         {
+            List<GroupMembersData> groupMembers = m_groupData.GetGroupMembers(new UUID(im.fromAgentID), groupID);
+            
             if (m_debugEnabled) 
-                m_log.DebugFormat("[GROUPS-MESSAGING]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
-
-
-            foreach (GroupMembersData member in m_groupData.GetGroupMembers(UUID.Zero, groupID))
-            {
+                m_log.DebugFormat(
+                    "[GROUPS-MESSAGING]: SendMessageToGroup called for group {0} with {1} visible members", 
+                    groupID, groupMembers.Count);
+            
+            foreach (GroupMembersData member in groupMembers)
+            {               
                 if (m_groupData.hasAgentDroppedGroupChatSession(member.AgentID, groupID))
                 {
                     // Don't deliver messages to people who have dropped this session
@@ -263,9 +266,7 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
 
         void OnClientLogin(IClientAPI client)
         {
-            if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: OnInstantMessage registered for {0}", client.Name);
-
-            
+            if (m_debugEnabled) m_log.DebugFormat("[GROUPS-MESSAGING]: OnInstantMessage registered for {0}", client.Name);           
         }
 
         private void OnNewClient(IClientAPI client)
diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
index 6f044e0086..0c8113e604 100644
--- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/GroupsModule.cs
@@ -599,7 +599,10 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
 
         public List<GroupMembersData> GroupMembersRequest(IClientAPI remoteClient, UUID groupID)
         {
-            if (m_debugEnabled) m_log.DebugFormat("[GROUPS]: {0} called", System.Reflection.MethodBase.GetCurrentMethod().Name);
+            if (m_debugEnabled) 
+                m_log.DebugFormat(
+                    "[GROUPS]: GroupMembersRequest called for {0} from client {1}", groupID, remoteClient.Name);
+            
             List<GroupMembersData> data = m_groupData.GetGroupMembers(GetRequestingAgentID(remoteClient), groupID);
 
             if (m_debugEnabled)
diff --git a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsServicesConnectorModule.cs b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsServicesConnectorModule.cs
index 5fabbb03dd..2631ac10d3 100644
--- a/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsServicesConnectorModule.cs
+++ b/OpenSim/Region/OptionalModules/Avatar/XmlRpcGroups/XmlRpcGroupsServicesConnectorModule.cs
@@ -641,11 +641,8 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
             }
 
             return Roles;
-
         }
 
-
-
         public List<GroupMembersData> GetGroupMembers(UUID requestingAgentID, UUID GroupID)
         {
             Hashtable param = new Hashtable();
@@ -988,8 +985,11 @@ namespace OpenSim.Region.OptionalModules.Avatar.XmlRpcGroups
                 }
                 catch (Exception e)
                 {
-                    m_log.ErrorFormat("[XMLRPC-GROUPS-CONNECTOR]: An error has occured while attempting to access the XmlRpcGroups server method: {0}", function);
-                    m_log.ErrorFormat("[XMLRPC-GROUPS-CONNECTOR]: {0} ", e.ToString());
+                    m_log.ErrorFormat(
+                        "[XMLRPC-GROUPS-CONNECTOR]: An error has occured while attempting to access the XmlRpcGroups server method {0} at {1}", 
+                        function, m_groupsServerURI);
+                    
+                    m_log.ErrorFormat("[XMLRPC-GROUPS-CONNECTOR]: {0}{1}", e.Message, e.StackTrace);
 
                     foreach (string ResponseLine in req.RequestResponse.Split(new string[] { Environment.NewLine }, StringSplitOptions.None))
                     {
diff --git a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
index 3e3a0f0589..72dce6ddcb 100644
--- a/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
+++ b/OpenSim/Region/Physics/Meshing/Meshmerizer.cs
@@ -40,6 +40,7 @@ using log4net;
 using Nini.Config;
 using System.Reflection;
 using System.IO;
+using ComponentAce.Compression.Libs.zlib;
 
 namespace OpenSim.Region.Physics.Meshing
 {
@@ -74,6 +75,7 @@ namespace OpenSim.Region.Physics.Meshing
 
         private bool cacheSculptMaps = true;
         private string decodedSculptMapPath = null;
+        private bool useMeshiesPhysicsMesh = false;
 
         private float minSizeForComplexMesh = 0.2f; // prims with all dimensions smaller than this will have a bounding box mesh
 
@@ -85,6 +87,7 @@ namespace OpenSim.Region.Physics.Meshing
 
             decodedSculptMapPath = start_config.GetString("DecodedSculptMapPath","j2kDecodeCache");
             cacheSculptMaps = start_config.GetBoolean("CacheSculptMaps", cacheSculptMaps);
+            useMeshiesPhysicsMesh = start_config.GetBoolean("UseMeshiesPhysicsMesh", useMeshiesPhysicsMesh);
 
             try
             {
@@ -268,73 +271,113 @@ namespace OpenSim.Region.Physics.Meshing
             {
                 if (((OpenMetaverse.SculptType)primShape.SculptType) == SculptType.Mesh)
                 {
-                    // add code for mesh physics proxy generation here
-                    m_log.Debug("[MESH]: mesh proxy generation not implemented yet ");
+                    if (!useMeshiesPhysicsMesh)
+                        return null;
+
+                    m_log.Debug("[MESH]: experimental mesh proxy generation");
 
                     OSD meshOsd;
 
-                    if (primShape.SculptData.Length > 0)
-                    {
-                        
-                        
-                        m_log.Debug("[MESH]: asset data length: " + primShape.SculptData.Length.ToString());
-                        byte[] header = Util.StringToBytes256("<? LLSD/Binary ?>");
-
-                        ////dump to debugging file
-                        //string filename = System.IO.Path.Combine(decodedSculptMapPath, "mesh_" + primShape.SculptTexture.ToString());
-                        //BinaryWriter writer = new BinaryWriter(File.Open(filename, FileMode.Create));
-                        //writer.Write(primShape.SculptData);
-                        //writer.Close();
-
-                    }
-                    else
+                    if (primShape.SculptData.Length <= 0)
                     {
                         m_log.Error("[MESH]: asset data is zero length");
                         return null;
                     }
 
-                    try
+                    long start = 0;
+                    using (MemoryStream data = new MemoryStream(primShape.SculptData))
                     {
-                        meshOsd = OSDParser.DeserializeLLSDBinary(primShape.SculptData, true);
-                    }
-                    catch (Exception e)
-                    {
-                        m_log.Error("[MESH]: exception decoding mesh asset: " + e.ToString());
-                        return null;
+                        meshOsd = (OSDMap)OSDParser.DeserializeLLSDBinary(data, true);
+                        start = data.Position;
                     }
 
                     if (meshOsd is OSDMap)
                     {
                         OSDMap map = (OSDMap)meshOsd;
-                        //foreach (string name in map.Keys)
-                        //    m_log.Debug("[MESH]: key:" + name + " value:" + map[name].AsString());
                         OSDMap physicsParms = (OSDMap)map["physics_shape"];
-                        int physOffset = physicsParms["offset"].AsInteger();
+                        int physOffset = physicsParms["offset"].AsInteger() + (int)start;
                         int physSize = physicsParms["size"].AsInteger();
 
                         if (physOffset < 0 || physSize == 0)
                             return null; // no mesh data in asset
 
-                        m_log.Debug("[MESH]: physOffset:" + physOffset.ToString() + " physSize:" + physSize.ToString());
-                        //MemoryStream ms = new MemoryStream(primShape.SculptData, physOffset, physSize);
-                        //GZipStream gzStream = new GZipStream(ms, CompressionMode.Decompress);
-                        
-                        //int maxSize = physSize * 5; // arbitrary guess
-                        //byte[] readBuffer = new byte[maxSize];
+                        OSD decodedMeshOsd = new OSD();
+                        byte[] meshBytes = new byte[physSize];
+                        System.Buffer.BlockCopy(primShape.SculptData, physOffset, meshBytes, 0, physSize);
+                        byte[] decompressed = new byte[physSize * 5];
+                        try
+                        {
+                            using (MemoryStream inMs = new MemoryStream(meshBytes))
+                            {
+                                using (MemoryStream outMs = new MemoryStream())
+                                {
+                                    using (ZOutputStream zOut = new ZOutputStream(outMs))
+                                    {
+                                        byte[] readBuffer = new byte[2048];
+                                        int readLen = 0;
+                                        while ((readLen = inMs.Read(readBuffer, 0, readBuffer.Length)) > 0)
+                                        {
+                                            zOut.Write(readBuffer, 0, readLen);
+                                        }
+                                        zOut.Flush();
+                                        outMs.Seek(0, SeekOrigin.Begin);
 
-                        //int bytesRead = gzStream.Read(readBuffer, 0, maxSize);
+                                        byte[] decompressedBuf = outMs.GetBuffer();
 
-                        //OSD physMeshOsd = OSDParser.DeserializeLLSDBinary(readBuffer);
+                                        decodedMeshOsd = OSDParser.DeserializeLLSDBinary(decompressedBuf, true);
+                                    }
+                                }
+                            }
+                        }
+                        catch (Exception e)
+                        {
+                            m_log.Error("[MESH]: exception decoding physical mesh: " + e.ToString());
+                            return null;
+                        }
 
+                        OSDArray decodedMeshOsdArray = null;
 
+                        // physics_shape is an array of OSDMaps, one for each submesh
+                        if (decodedMeshOsd is OSDArray)
+                        {
+                            decodedMeshOsdArray = (OSDArray)decodedMeshOsd;
+                            foreach (OSD subMeshOsd in decodedMeshOsdArray)
+                            {
+                                if (subMeshOsd is OSDMap)
+                                {
+                                    OSDMap subMeshMap = (OSDMap)subMeshOsd;
 
+                                    OpenMetaverse.Vector3 posMax = ((OSDMap)subMeshMap["PositionDomain"])["Max"].AsVector3();
+                                    OpenMetaverse.Vector3 posMin = ((OSDMap)subMeshMap["PositionDomain"])["Min"].AsVector3();
 
+                                    byte[] posBytes = subMeshMap["Position"].AsBinary();
+                                    for (int i = 0; i < posBytes.Length; i += 6)
+                                    {
+                                        ushort uX = Utils.BytesToUInt16(posBytes, i);
+                                        ushort uY = Utils.BytesToUInt16(posBytes, i + 2);
+                                        ushort uZ = Utils.BytesToUInt16(posBytes, i + 4);
 
+                                        Coord c = new Coord(
+                                        Utils.UInt16ToFloat(uX, posMin.X, posMax.X) * size.X,
+                                        Utils.UInt16ToFloat(uY, posMin.Y, posMax.Y) * size.Y,
+                                        Utils.UInt16ToFloat(uZ, posMin.Z, posMax.Z) * size.Z);
+
+                                        coords.Add(c);
+                                    }
+
+                                    byte[] triangleBytes = subMeshMap["TriangleList"].AsBinary();
+                                    for (int i = 0; i < triangleBytes.Length; i += 6)
+                                    {
+                                        ushort v1 = Utils.BytesToUInt16(triangleBytes, i);
+                                        ushort v2 = Utils.BytesToUInt16(triangleBytes, i + 2);
+                                        ushort v3 = Utils.BytesToUInt16(triangleBytes, i + 4);
+                                        Face f = new Face(v1, v2, v3);
+                                        faces.Add(f);
+                                    }
+                                }
+                            }
+                        }
                     }
-
-                    //just bail out for now until mesh code is finished
-                    return null;
-
                 }
                 else
                 {
diff --git a/OpenSim/Services/GridService/GridService.cs b/OpenSim/Services/GridService/GridService.cs
index add1be0b49..125c2be8cf 100644
--- a/OpenSim/Services/GridService/GridService.cs
+++ b/OpenSim/Services/GridService/GridService.cs
@@ -323,7 +323,7 @@ namespace OpenSim.Services.GridService
         {
             m_log.DebugFormat("[GRID SERVICE]: GetRegionsByName {0}", name);
 
-            List<RegionData> rdatas = m_Database.Get("%" + name + "%", scopeID);
+            List<RegionData> rdatas = m_Database.Get(name + "%", scopeID);
 
             int count = 0;
             List<GridRegion> rinfos = new List<GridRegion>();
diff --git a/bin/OpenSimDefaults.ini b/bin/OpenSimDefaults.ini
index 05358c4373..82267edcc9 100644
--- a/bin/OpenSimDefaults.ini
+++ b/bin/OpenSimDefaults.ini
@@ -147,6 +147,12 @@
     ; to false if you have compatibility problems.
     ;CacheSculptMaps = true
     
+    ; if you use Meshmerizer and want collisions for meshies, setting this to true
+    ; will cause OpenSim to attempt to decode meshies assets, extract the physics
+    ; mesh, and use it for collisions. This is currently experimental code and enabling
+    ; it may cause unexpected physics problems.
+    ;UseMeshiesPhysicsMesh = false
+    
     ; Choose one of the physics engines below
     ; OpenDynamicsEngine is by some distance the most developed physics engine
     ; basicphysics effectively does not model physics at all, making all objects phantom
diff --git a/bin/zlib.net.dll b/bin/zlib.net.dll
new file mode 100644
index 0000000000..9d156547f3
Binary files /dev/null and b/bin/zlib.net.dll differ
diff --git a/prebuild.xml b/prebuild.xml
index cc0424a692..b28d22697f 100644
--- a/prebuild.xml
+++ b/prebuild.xml
@@ -587,7 +587,6 @@
       <ReferencePath>../../../../bin/</ReferencePath>
       <Reference name="System"/>
       <Reference name="System.Drawing"/>
-      <Reference name="System.IO.Compression;"/>
       <Reference name="CSJ2K" path="../../../../bin/"/>
       <Reference name="OpenMetaverseTypes" path="../../../../bin/"/>
       <Reference name="OpenMetaverse" path="../../../../bin/"/>
@@ -597,6 +596,7 @@
       <Reference name="OpenSim.Framework.Console"/>
       <Reference name="OpenSim.Region.Physics.Manager"/>
       <Reference name="log4net" path="../../../../bin/"/>
+      <Reference name="zlib.net" path="../../../../bin/"/>
 
       <Files>
         <Match pattern="*.cs" recurse="true"/>