add patch to really federate groups.
diff --git a/really-federate-groups.diff b/really-federate-groups.diff
new file mode 100644
--- /dev/null
+++ b/really-federate-groups.diff
@@ -0,0 +1,125 @@
+From d6794cba2e7047616ba8bcbc1217a4ae7f245d99 Mon Sep 17 00:00:00 2001
+From: Joshua Judson Rosen <rozzin@geekspace.com>
+Date: Sun, 29 Jul 2012 18:17:16 -0400
+Subject: [PATCH] Correctly distribute notices from remote posters through local groups to remote group-members via OStatus.
+ Allow the OStatus queue-handler to handle all posts,
+ and give it the smarts required to make correct decisions
+ about whether it should or shouldn't relay notices
+ over OStatus.
+ cf. http://status.net/open-source/issues/3540
+
+---
+ plugins/OStatus/OStatusPlugin.php | 18 ++++------
+ plugins/OStatus/lib/ostatusqueuehandler.php | 53 +++++++++++++++++----------
+ 2 files changed, 40 insertions(+), 31 deletions(-)
+
+diff --git a/plugins/OStatus/OStatusPlugin.php b/plugins/OStatus/OStatusPlugin.php
+index 43b90cf..90e5e9e 100644
+--- a/plugins/OStatus/OStatusPlugin.php
++++ b/plugins/OStatus/OStatusPlugin.php
+@@ -125,18 +125,14 @@ class OStatusPlugin extends Plugin
+ */
+ function onStartEnqueueNotice($notice, &$transports)
+ {
+- if ($notice->isLocal()) {
+- if ($notice->inScope(null)) {
+- // put our transport first, in case there's any conflict (like OMB)
+- array_unshift($transports, 'ostatus');
+- $this->log(LOG_INFO, "Notice {$notice->id} queued for OStatus processing");
+- } else {
+- // FIXME: we don't do privacy-controlled OStatus updates yet.
+- // once that happens, finer grain of control here.
+- $this->log(LOG_NOTICE, "Not queueing notice {$notice->id} for OStatus because of privacy; scope = {$notice->scope}");
+- }
++ if ($notice->inScope(null)) {
++ // put our transport first, in case there's any conflict (like OMB)
++ array_unshift($transports, 'ostatus');
++ $this->log(LOG_INFO, "Notice {$notice->id} queued for OStatus processing");
+ } else {
+- $this->log(LOG_NOTICE, "Not queueing notice {$notice->id} for OStatus because it's not local.");
++ // FIXME: we don't do privacy-controlled OStatus updates yet.
++ // once that happens, finer grain of control here.
++ $this->log(LOG_NOTICE, "Not queueing notice {$notice->id} for OStatus because of privacy; scope = {$notice->scope}");
+ }
+ return true;
+ }
+diff --git a/plugins/OStatus/lib/ostatusqueuehandler.php b/plugins/OStatus/lib/ostatusqueuehandler.php
+index f528405..74e145b 100644
+--- a/plugins/OStatus/lib/ostatusqueuehandler.php
++++ b/plugins/OStatus/lib/ostatusqueuehandler.php
+@@ -60,40 +60,53 @@ class OStatusQueueHandler extends QueueHandler
+ return true;
+ }
+
+- $this->pushUser();
++ if ($notice->isLocal()) {
++ // Notices generated on remote sites will have already
++ // been pushed to user's subscribers by their origin sites.
++ $this->pushUser();
++ }
+
+ foreach ($notice->getGroups() as $group) {
+ $oprofile = Ostatus_profile::staticGet('group_id', $group->id);
+ if ($oprofile) {
+- $this->pingReply($oprofile);
++ // remote group
++ if ($notice->isLocal()) {
++ $this->pingReply($oprofile);
++ }
+ } else {
++ // local group
+ $this->pushGroup($group->id);
+ }
+ }
+-
+- foreach ($notice->getReplies() as $profile_id) {
+- $oprofile = Ostatus_profile::staticGet('profile_id', $profile_id);
+- if ($oprofile) {
+- $this->pingReply($oprofile);
++
++ if ($notice->isLocal()) {
++ // Notices generated on other sites will have already
++ // pinged their reply-targets.
++
++ foreach ($notice->getReplies() as $profile_id) {
++ $oprofile = Ostatus_profile::staticGet('profile_id', $profile_id);
++ if ($oprofile) {
++ $this->pingReply($oprofile);
++ }
+ }
+- }
+
+- if (!empty($this->notice->reply_to)) {
+- $replyTo = Notice::staticGet('id', $this->notice->reply_to);
+- if (!empty($replyTo)) {
+- foreach($replyTo->getReplies() as $profile_id) {
+- $oprofile = Ostatus_profile::staticGet('profile_id', $profile_id);
+- if ($oprofile) {
+- $this->pingReply($oprofile);
++ if (!empty($this->notice->reply_to)) {
++ $replyTo = Notice::staticGet('id', $this->notice->reply_to);
++ if (!empty($replyTo)) {
++ foreach($replyTo->getReplies() as $profile_id) {
++ $oprofile = Ostatus_profile::staticGet('profile_id', $profile_id);
++ if ($oprofile) {
++ $this->pingReply($oprofile);
++ }
+ }
+ }
+ }
+- }
+
+- foreach ($notice->getProfileTags() as $ptag) {
+- $oprofile = Ostatus_profile::staticGet('peopletag_id', $ptag->id);
+- if (!$oprofile) {
+- $this->pushPeopletag($ptag);
++ foreach ($notice->getProfileTags() as $ptag) {
++ $oprofile = Ostatus_profile::staticGet('peopletag_id', $ptag->id);
++ if (!$oprofile) {
++ $this->pushPeopletag($ptag);
++ }
+ }
+ }
+
+--
+1.7.1