diff --git a/indra/newview/llimprocessing.cpp b/indra/newview/llimprocessing.cpp
index 3d2241020835d31b7e468b027e5e3bdc8e8a9f6e..7b87b432431d1862d4b9740ed560143a82827c89 100644
--- a/indra/newview/llimprocessing.cpp
+++ b/indra/newview/llimprocessing.cpp
@@ -857,13 +857,30 @@ void LLIMProcessing::processNewMessage(LLUUID from_id,
             }
             else // IM_TASK_INVENTORY_OFFERED
             {
-                if (sizeof(S8) != binary_bucket_size)
+                if (sizeof(S8) == binary_bucket_size)
                 {
-                    LL_WARNS("Messaging") << "Malformed inventory offer from object" << LL_ENDL;
-                    delete info;
-                    break;
+                    info->mType = (LLAssetType::EType) binary_bucket[0];
+                }
+                else
+                {
+                    /*RIDER*/ // The previous version of the protocol returned the wrong binary bucket... we 
+                    // still might be able to figure out the type... even though the offer is not retrievable. 
+
+                    // Should be safe to remove once DRTSIM-451 fully deploys
+                    std::string str_bucket(reinterpret_cast<char *>(binary_bucket));
+                    std::string str_type(str_bucket.substr(0, str_bucket.find('|')));
+
+                    std::stringstream type_convert(str_type);
+
+                    S32 type;
+                    type_convert >> type;
+
+                    // We could try AT_UNKNOWN which would be more accurate, but that causes an auto decline
+                    info->mType = static_cast<LLAssetType::EType>(type);
+                    // Don't break in the case of a bad binary bucket.  Go ahead and show the 
+                    // accept/decline popup even though it will not do anything.
+                    LL_WARNS("Messaging") << "Malformed inventory offer from object, type might be " << info->mType << LL_ENDL;
                 }
-                info->mType = (LLAssetType::EType) binary_bucket[0];
                 info->mObjectID = LLUUID::null;
                 info->mFromObject = TRUE;
             }
@@ -1558,8 +1575,6 @@ void LLIMProcessing::requestOfflineMessagesCoro(std::string url)
 
     LL_INFOS("Messaging") << "Processing offline messages." << LL_ENDL;
 
-//     std::vector<U8> data;
-//     S32 binary_bucket_size = 0;
     LLHost sender = gAgent.getRegionHost();
 
     LLSD::array_iterator i = messages.beginArray();
@@ -1591,16 +1606,27 @@ void LLIMProcessing::requestOfflineMessagesCoro(std::string url)
             bin_bucket.push_back(0);
         }
 
+        // Todo: once drtsim-451 releases, remove the string option
+        BOOL from_group;
+        if (message_data["from_group"].isInteger())
+        {
+            from_group = message_data["from_group"].asInteger();
+        }
+        else
+        {
+            from_group = message_data["from_group"].asString() == "Y";
+        }
+
         LLIMProcessing::processNewMessage(
             message_data["from_agent_id"].asUUID(),
-            message_data["from_group"].asBoolean(),
+            from_group,
             message_data["to_agent_id"].asUUID(),
-            static_cast<U8>(message_data["offline"].asInteger()),
+            message_data.has("offline") ? static_cast<U8>(message_data["offline"].asInteger()) : IM_OFFLINE,
             static_cast<EInstantMessage>(message_data["dialog"].asInteger()),
             message_data["transaction-id"].asUUID(),
             static_cast<U32>(message_data["timestamp"].asInteger()),
-            message_data["from_name"].asString(),
-            (message_data.has("message")) ? message_data["message"].asString() : std::string(),
+            message_data["from_agent_name"].asString(),
+            message_data["message"].asString(),
             static_cast<U32>((message_data.has("parent_estate_id")) ? message_data["parent_estate_id"].asInteger() : 1), // 1 - IMMainland
             message_data["region_id"].asUUID(),
             position,