diff --git a/commons_activity_streams.features.inc b/commons_activity_streams.features.inc
index fc08391..fa97ed1 100644
--- a/commons_activity_streams.features.inc
+++ b/commons_activity_streams.features.inc
@@ -52,7 +52,8 @@ function commons_activity_streams_default_message_type() {
           "safe_value" : "[commons-groups:in-groups-text]"
         }
       ]
-    }
+    },
+    "rdf_mapping" : []
   }');
   $items['commons_activity_streams_node_created'] = entity_import('message_type', '{
     "name" : "commons_activity_streams_node_created",
@@ -80,7 +81,37 @@ function commons_activity_streams_default_message_type() {
           "safe_value" : "[commons-groups:in-groups-text]"
         }
       ]
-    }
+    },
+    "rdf_mapping" : []
+  }');
+  $items['commons_activity_streams_user_profile_updated'] = entity_import('message_type', '{
+    "name" : "commons_activity_streams_user_profile_updated",
+    "description" : "commons_activity_streams_user_profile_updated",
+    "argument_keys" : [],
+    "argument" : [],
+    "category" : "message_type",
+    "data" : { "purge" : { "override" : 0, "enabled" : 0, "quota" : "", "days" : "" } },
+    "language" : "",
+    "arguments" : null,
+    "message_text" : { "und" : [
+        {
+          "value" : "[message:user:picture]",
+          "format" : "filtered_html",
+          "safe_value" : "[message:user:picture]"
+        },
+        {
+          "value" : "\\u003Ca class=\\u0022aloha-link-text\\u0022\\u003E@{message:user:name}\\u003C\\/a\\u003E\\u0026nbsp;has an updated profile",
+          "format" : "full_html",
+          "safe_value" : "\\u003Ca class=\\u0022aloha-link-text\\u0022\\u003E@{message:user:name}\\u003C\\/a\\u003E\\u0026nbsp;has an updated profile"
+        },
+        {
+          "value" : "\\u003Cbr\\u003E",
+          "format" : "full_html",
+          "safe_value" : "\\u003Cbr\\u003E"
+        }
+      ]
+    },
+    "rdf_mapping" : []
   }');
   return $items;
 }
diff --git a/commons_activity_streams.info b/commons_activity_streams.info
index 22289de..a4b9fb9 100644
--- a/commons_activity_streams.info
+++ b/commons_activity_streams.info
@@ -2,8 +2,11 @@ name = Commons Activity Streams
 core = 7.x
 package = Commons - Building blocks
 php = 5.2.4
+version = 7.x-3.0-alpha1
 project = commons_activity_streams
 dependencies[] = commons_follow
+dependencies[] = ctools
+dependencies[] = entity
 dependencies[] = entityreference
 dependencies[] = features
 dependencies[] = message
@@ -22,6 +25,10 @@ features[field_instance][] = message-commons_activity_streams_comment_created-fi
 features[field_instance][] = message-commons_activity_streams_node_created-field_target_nodes
 features[message_type][] = commons_activity_streams_comment_created
 features[message_type][] = commons_activity_streams_node_created
+features[message_type][] = commons_activity_streams_user_profile_updated
+features[variable][] = field_bundle_settings_message__commons_activity_streams_comment_created
+features[variable][] = field_bundle_settings_message__commons_activity_streams_node_created
+features[variable][] = field_bundle_settings_message__commons_activity_streams_user_profile_updated
 features[variable][] = timeago_comment
 features[variable][] = timeago_node
 features[views_view][] = commons_activity_streams_activity
diff --git a/commons_activity_streams.module b/commons_activity_streams.module
index e20cff0..5cf8926 100644
--- a/commons_activity_streams.module
+++ b/commons_activity_streams.module
@@ -11,6 +11,10 @@ function commons_activity_streams_form_alter(&$form, &$form_state, $form_id) {
     $form['following']['#options'][0] = t("activity I'm not following");
     $form['following']['#options'][1] = t("activity I'm following");
   }
+
+  if ($form_id == 'edit_profile_user_profile_form') {
+    $form['#submit'][] = 'commons_activity_streams_user_profile_submit';
+  }
 }
 
 /**
@@ -68,7 +72,6 @@ function commons_activity_streams_comment_delete($comment) {
   }
 }
 
-
 /**
 * Find existing messages that match certain parameters.
 */
@@ -89,3 +92,68 @@ function commons_activity_streams_existing_messages($acting_uid, $target_ids, $t
   }
   return FALSE;
 }
+
+/**
+ * Sets message for user profile update.
+ */
+function commons_activity_streams_user_profile_submit($form, &$form_state) {
+  global $user;
+
+  // Fields to ignore in $form_state['values'] when detecting changes.
+  $remove_keys = array(
+    'uid',
+    'name',
+    'pass',
+    'current_pass_required_values',
+    'current_pass',
+    'status',
+    'roles',
+    'notify',
+    'signature',
+    'picture_delete',
+    'message_subscribe_email',
+    'og_user_node',
+    'cancel',
+    'metatags',
+    'timezone',
+    'signature_format',
+  );
+  $profile_values = array_diff_key($form_state['values'], array_flip($remove_keys));
+  ksort($profile_values);
+  $profile_data = serialize($profile_values);
+
+  $change_detected = FALSE;
+  $time = time();
+  $last_update = 0;
+
+  $cid = 'commons_up_' . $form_state['values']['uid'];
+  if ($cache = cache_get($cid)) {
+    $last_update = $cache->created;
+    if ($cache->data != $profile_data) {
+      $change_detected = TRUE;
+      drupal_set_message('change_detected');
+    }
+  }
+  cache_set($cid, $profile_data);
+
+  // Do not generate a message if
+  //  - the user did not submit their own form
+  //  - no changes were detected
+  //  - the last profile update was after 15 minutes ago
+  if ($user->uid != $form_state['user']->uid ||
+    !$change_detected ||
+    $last_update > $time - 900) {
+    return;
+  }
+
+  // Create a message when a user creates a new node.
+  $account = $form_state['user'];
+  // Allow other modules to change the message type used for this event.
+  $hook = 'user_profile_update';
+  $message_type = 'commons_activity_streams_user_profile_updated';
+  drupal_alter('commons_activity_streams_message_selection', $message_type, $hook, $account);
+  $message = message_create($message_type, array('uid' => $account->uid, 'timestamp' => $time));
+  // Save reference to the node in the node reference field, and the
+  $wrapper = entity_metadata_wrapper('message', $message);
+  $wrapper->save();
+}
diff --git a/commons_activity_streams.strongarm.inc b/commons_activity_streams.strongarm.inc
index 55a14d0..7040cba 100644
--- a/commons_activity_streams.strongarm.inc
+++ b/commons_activity_streams.strongarm.inc
@@ -13,6 +13,108 @@ function commons_activity_streams_strongarm() {
   $strongarm = new stdClass();
   $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
   $strongarm->api_version = 1;
+  $strongarm->name = 'field_bundle_settings_message__commons_activity_streams_comment_created';
+  $strongarm->value = array(
+    'view_modes' => array(),
+    'extra_fields' => array(
+      'form' => array(),
+      'display' => array(
+        'message__message_text__0' => array(
+          'message_notify_email_subject' => array(
+            'visible' => TRUE,
+            'weight' => 0,
+          ),
+          'message_notify_email_body' => array(
+            'visible' => FALSE,
+            'weight' => 0,
+          ),
+        ),
+        'message__message_text__1' => array(
+          'message_notify_email_subject' => array(
+            'visible' => FALSE,
+            'weight' => 0,
+          ),
+          'message_notify_email_body' => array(
+            'visible' => TRUE,
+            'weight' => 0,
+          ),
+        ),
+      ),
+    ),
+  );
+  $export['field_bundle_settings_message__commons_activity_streams_comment_created'] = $strongarm;
+
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'field_bundle_settings_message__commons_activity_streams_node_created';
+  $strongarm->value = array(
+    'view_modes' => array(),
+    'extra_fields' => array(
+      'form' => array(),
+      'display' => array(
+        'message__message_text__0' => array(
+          'message_notify_email_subject' => array(
+            'visible' => TRUE,
+            'weight' => 0,
+          ),
+          'message_notify_email_body' => array(
+            'visible' => FALSE,
+            'weight' => 0,
+          ),
+        ),
+        'message__message_text__1' => array(
+          'message_notify_email_subject' => array(
+            'visible' => FALSE,
+            'weight' => 0,
+          ),
+          'message_notify_email_body' => array(
+            'visible' => TRUE,
+            'weight' => 0,
+          ),
+        ),
+      ),
+    ),
+  );
+  $export['field_bundle_settings_message__commons_activity_streams_node_created'] = $strongarm;
+
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
+  $strongarm->name = 'field_bundle_settings_message__commons_activity_streams_user_profile_updated';
+  $strongarm->value = array(
+    'view_modes' => array(),
+    'extra_fields' => array(
+      'form' => array(),
+      'display' => array(
+        'message__message_text__0' => array(
+          'message_notify_email_subject' => array(
+            'visible' => TRUE,
+            'weight' => 0,
+          ),
+          'message_notify_email_body' => array(
+            'visible' => FALSE,
+            'weight' => 0,
+          ),
+        ),
+        'message__message_text__1' => array(
+          'message_notify_email_subject' => array(
+            'visible' => FALSE,
+            'weight' => 0,
+          ),
+          'message_notify_email_body' => array(
+            'visible' => TRUE,
+            'weight' => 0,
+          ),
+        ),
+      ),
+    ),
+  );
+  $export['field_bundle_settings_message__commons_activity_streams_user_profile_updated'] = $strongarm;
+
+  $strongarm = new stdClass();
+  $strongarm->disabled = FALSE; /* Edit this to true to make a default strongarm disabled initially */
+  $strongarm->api_version = 1;
   $strongarm->name = 'timeago_comment';
   $strongarm->value = 0;
   $export['timeago_comment'] = $strongarm;
