private bool RezCoalescedObject(IClientAPI remoteClient, UUID itemID, 
            CoalescedObject obj, Vector3 RayEnd, Vector3 RayStart, UUID RayTargetID, 
            byte BypassRayCast, byte bRayEndIsIntersection, 
            bool RezSelected, bool rezAtRoot, Vector3 pos, 
            IInventoryItem item, int? startParam, UUID? newAvatarGroupId,
            UUID? rezzedByObjectUUID)
        {
            //determine the bounding box of the entire set
            Box coBoundingBox = obj.GetBoundingBox();
            Vector3 rezAtRootOffset = Vector3.Zero;

            pos = GetNewRezLocation(
                  RayStart, RayEnd, RayTargetID, Quaternion.Identity,
                  BypassRayCast, bRayEndIsIntersection, true, coBoundingBox.Size, false, 
                  remoteClient != null ? remoteClient.AgentId : UUID.Zero);

            Vector3 newPos = coBoundingBox.Center;
            if (rezAtRoot)
            {
                // Use the root prim position of the last object (matches SL).
                SceneObjectGroup lastGroup = null;
                foreach (SceneObjectGroup group in obj.Groups)
                    lastGroup = group;

                if (lastGroup != null)
                    rezAtRootOffset = (coBoundingBox.Center - lastGroup.RootPart.AbsolutePosition);
            }

            //reset the positions of all parts to be an offset from 0
            SceneObjectGroup.TranslateToNewCenterPosition(coBoundingBox.Center, pos, obj.Groups);
            
            //rez each group
            bool success = true;
            foreach (SceneObjectGroup group in obj.Groups)
            {
                group.ResetInstance(true, false, UUID.Zero);
                success = success &&
                (this.RezSingleObjectToWorld(remoteClient, itemID, group, RayEnd, RayStart, RayTargetID,
                    BypassRayCast, bRayEndIsIntersection, RezSelected, false, group.AbsolutePosition+rezAtRootOffset,
                    group.RootPart.Name, group.RootPart.Description, item, obj.FindPermissions(group.UUID),
                    startParam, newAvatarGroupId, rezzedByObjectUUID)) != null;
            }

            return success;
        }
        private bool RestoreCoalescedObject(IClientAPI remoteClient, CachedUserInfo userInfo, CoalescedObject obj, UUID itemID, InventoryItemBase item, UUID groupId)
        {
            //determine the bounding box of the entire set
            Box coBoundingBox = obj.GetBoundingBox();
            Vector3 rezAtRootOffset = Vector3.Zero;

            Vector3 newPos = coBoundingBox.Center;

            //rez each group
            bool success = true;
            foreach (SceneObjectGroup group in obj.Groups)
            {
                group.ResetInstance(true, false, UUID.Zero);
                success &= RestoreObject(remoteClient, userInfo, itemID, item, group, groupId);
            }

            return success;
        }