diff --git a/statuses.install b/statuses.install
index 3bb5d68..1d285a6 100644
--- a/statuses.install
+++ b/statuses.install
@@ -60,15 +60,6 @@ function statuses_schema() {
     ),
     'primary key' => array('sid'),
   );
-  $schema += _statuses_contexts_schema();
-  return $schema;
-}
-
-/**
- * Specifies the schema for the contexts table.
- */
-function _statuses_contexts_schema() {
-  $schema = array();
   $schema['statuses_contexts'] = array(
     'description' => 'Stores stream context configurations.',
     'fields' => array(
@@ -128,6 +119,67 @@ function _statuses_contexts_schema() {
 }
 
 /**
+ * Implements hook_update_N().
+ */
+function statuses_update_7100(&$sandbox) {
+  if (db_table_exists('facebook_status')) {
+    // Rename the database tables.
+    db_rename_table('facebook_status', 'statuses');
+    db_rename_table('facebook_status_contexts', 'statuses_contexts');
+
+    // Convert old settings.
+    variable_set('statuses_default_text_other', variable_get('facebook_status_default_text_other', ''));
+    variable_set('statuses_imagecache_preset', variable_get('facebook_status_imagecache_preset', ''));
+    variable_set('statuses_user_other_view', variable_get('facebook_status_user_other_view', 'statuses_stream'));
+    variable_set('statuses_default_text', variable_get('facebook_status_default_text', ''));
+    variable_set('statuses_hide_length', variable_get('facebook_status_hide_length', 0));
+    variable_set('statuses_block_view', variable_get('facebook_status_block_view', 1));
+    variable_set('statuses_reply_type', variable_get('facebook_status_reply_type', 'at'));
+    variable_set('statuses_share_view', variable_get('facebook_status_share_view', 'statuses_stream'));
+    variable_set('statuses_box_rows', variable_get('facebook_status_box_rows', 2));
+    variable_set('statuses_profile', variable_get('facebook_status_profile', 1));
+    variable_set('statuses_refresh', variable_get('facebook_status_refresh', 0));
+    variable_set('statuses_filter', variable_get('facebook_status_filter', 'none'));
+    variable_set('statuses_length', variable_get('facebook_status_length', 140));
+    variable_set('statuses_repost', variable_get('facebook_status_repost', 'Re: @name @message '));
+    variable_set('statuses_enter', variable_get('facebook_status_enter', 0));
+    variable_set('statuses_nl2br', variable_get('facebook_status_nl2br', 0));
+    variable_set('statuses_ahah', variable_get('facebook_status_ahah', 1));
+    variable_del('facebook_status_default_text_other');
+    variable_del('facebook_status_imagecache_preset');
+    variable_del('facebook_status_user_other_view');
+    variable_del('facebook_status_default_text');
+    variable_del('facebook_status_hide_length');
+    variable_del('facebook_status_block_view');
+    variable_del('facebook_status_reply_type');
+    variable_del('facebook_status_share_view');
+    variable_del('facebook_status_box_rows');
+    variable_del('facebook_status_profile');
+    variable_del('facebook_status_refresh');
+    variable_del('facebook_status_filter');
+    variable_del('facebook_status_length');
+    variable_del('facebook_status_repost');
+    variable_del('facebook_status_enter');
+    variable_del('facebook_status_nl2br');
+    variable_del('facebook_status_ahah');
+
+    // Convert block position. This also fixes Tags blocks.
+    db_update('block')
+      ->expression('module', "REPLACE(module, 'facebook_status', 'statuses')")
+      ->expression('delta', "REPLACE(delta, 'facebook_status', 'statuses')")
+      ->condition('module', 'facebook_status%', 'LIKE')
+      ->execute();
+    db_update('block_role')
+      ->expression('module', "REPLACE(module, 'facebook_status', 'statuses')")
+      ->expression('delta', "REPLACE(delta, 'facebook_status', 'statuses')")
+      ->condition('module', 'facebook_status%', 'LIKE')
+      ->execute();
+
+    return t('The Statuses module for Drupal 7 was upgraded from the Facebook-style Statuses module for Drupal 6.');
+  }
+}
+
+/**
  * Implements hook_uninstall().
  */
 function statuses_uninstall() {
diff --git a/submodules/README.txt b/submodules/README.txt
index e45d52a..f9a78ec 100644
--- a/submodules/README.txt
+++ b/submodules/README.txt
@@ -1,4 +1,7 @@
-Submodules should be named fbss_[integrated-module], with one exception:
-statuses_tags, because it existed before this naming convention, and
-changing the name of a pre-existing module is difficult to do without breaking
-the upgrade process.
\ No newline at end of file
+Submodules should generally be named statuses_[integrated_module]. The reason
+most of them are not named this way is because they existed before Statuses was
+renamed, and it's not worth the hassle of renaming them when the machine name
+isn't user-facing anyway. "FBSS" previously stood for "Facebook-style Statuses"
+which was the name of this module in Drupal 6 and earlier. The module was
+renamed because it has evolved from merely imitating Facebook alone to a more
+generally useful suite of communication tools.
\ No newline at end of file
diff --git a/submodules/fbss_comments/fbss_comments.install b/submodules/fbss_comments/fbss_comments.install
index 52520a5..d0cd7ea 100644
--- a/submodules/fbss_comments/fbss_comments.install
+++ b/submodules/fbss_comments/fbss_comments.install
@@ -56,37 +56,12 @@ function fbss_comments_schema() {
 }
 
 /**
- * Implements hook_install().
- */
-function fbss_comments_install() {
-  if (module_exists('fbssc')) {
-    module_disable(array('fbssc'));
-  }
-  // TODO The drupal_(un)install_schema functions are called automatically in D7.
-  // drupal_install_schema('fbss_comments')
-  if (db_table_exists('fbssc')) {
-    db_query("
-      INSERT INTO {fbss_comments} (cid, sid, uid, created, comment)
-      SELECT old.cid, old.sid, old.uid, old.comment_time, old.comment
-      FROM {fbssc} as old
-      ORDER BY old.cid ASC
-    ");
-    drupal_uninstall_modules(array('fbssc'));
-    drupal_set_message(st('The Statuses Comments module has been upgraded.') . ' ' .
-      st('You should remove the "fbssc" folder from your modules directory to ensure you do not confuse it with the new version, which is part of the main Statuses package.')
-    );
-  }
-}
-
-/**
  * Implements hook_uninstall().
  */
 function fbss_comments_uninstall() {
-  // TODO The drupal_(un)install_schema functions are called automatically in D7.
-  // drupal_uninstall_schema('fbss_comments')
   variable_del('fbss_comments_user_pictures');
   variable_del('fbss_comments_hide_small');
   variable_del('fbss_comments_show_all');
-  variable_del('statuses_ahah');
   variable_del('fbss_comments_enter');
+  variable_del('fbss_comments_ahah');
 }
diff --git a/submodules/fbss_comments/fbss_comments_rules/fbss_comments_rules.module b/submodules/fbss_comments/fbss_comments_rules/fbss_comments_rules.module
index 2056a96..23ffa47 100644
--- a/submodules/fbss_comments/fbss_comments_rules/fbss_comments_rules.module
+++ b/submodules/fbss_comments/fbss_comments_rules/fbss_comments_rules.module
@@ -6,11 +6,7 @@
  */
 
 /*
- * Implementation of hook_fbss_comments_after_save().
- */
-/**
- * @todo Please document this function.
- * @see http://drupal.org/node/1354
+ * Implements hook_fbss_comments_after_save().
  */
 function fbss_comments_rules_fbss_comments_after_save($comment, $edit) {
   if ($edit) {
@@ -22,11 +18,7 @@ function fbss_comments_rules_fbss_comments_after_save($comment, $edit) {
 }
 
 /*
- * Implementation of hook_fbss_comments_delete().
- */
-/**
- * @todo Please document this function.
- * @see http://drupal.org/node/1354
+ * Implements hook_fbss_comments_delete().
  */
 function fbss_comments_rules_fbss_comments_delete($cid) {
   $comment = fbss_comments_load($cid);
diff --git a/submodules/fbss_domain/fbss_domain.install b/submodules/fbss_domain/fbss_domain.install
index 18e09a1..3884d51 100644
--- a/submodules/fbss_domain/fbss_domain.install
+++ b/submodules/fbss_domain/fbss_domain.install
@@ -35,10 +35,3 @@ function fbss_domain_schema() {
   );
   return $schema;
 }
-
-/**
- * Implementation of hook_uninstall().
- */
-function fbss_domain_uninstall() {
-  drupal_uninstall_schema('fbss_domain');
-}
diff --git a/submodules/fbss_flag/fbss_flag.install b/submodules/fbss_flag/fbss_flag.install
index fd5825b..2e972c8 100644
--- a/submodules/fbss_flag/fbss_flag.install
+++ b/submodules/fbss_flag/fbss_flag.install
@@ -12,12 +12,23 @@ function fbss_flag_install() {
   // Lower weight so that the Flag module's classes are available to us.
   // We take precautions in fbss_flag.inc to make sure this isn't strictly
   // necessary, but it (probably) doesn't hurt.
-  // TODO Please review the conversion of this statement to the D7 database API syntax.
-  /* db_query("UPDATE {system} SET weight = 2 WHERE name = 'fbss_flag'") */
   db_update('system')
-  ->fields(array(
-    'weight' =>  2,
-  ))
-  ->condition('name', 'fbss_flag')
-  ->execute();
+    ->fields(array('weight' => 2))
+    ->condition('name', 'fbss_flag')
+    ->execute();
+}
+
+/**
+ * Implements hook_update_N().
+ */
+function fbss_flag_update_7100(&$sandbox) {
+  db_update('flags')
+    ->expression('content_type', "REPLACE(content_type, 'facebook_status', 'statuses')")
+    ->execute();
+  db_update('flag_content')
+    ->expression('content_type', "REPLACE(content_type, 'facebook_status', 'statuses')")
+    ->execute();
+  db_update('flag_counts')
+    ->expression('content_type', "REPLACE(content_type, 'facebook_status', 'statuses')")
+    ->execute();
 }
diff --git a/submodules/fbss_privacy/fbss_privacy.install b/submodules/fbss_privacy/fbss_privacy.install
index 3829d7b..734c2a0 100644
--- a/submodules/fbss_privacy/fbss_privacy.install
+++ b/submodules/fbss_privacy/fbss_privacy.install
@@ -23,7 +23,6 @@ function fbss_privacy_schema_alter(&$schema) {
  * Implements hook_install().
  */
 function fbss_privacy_install() {
-  $ret = array();
   db_add_field('statuses', 'private', array(
     'type' => 'int',
     'size' => 'tiny',
@@ -38,6 +37,5 @@ function fbss_privacy_install() {
  * Implements hook_uninstall().
  */
 function fbss_privacy_uninstall() {
-  $ret = array();
   db_drop_field('statuses', 'private');
 }
diff --git a/submodules/fbss_userpoints/fbss_userpoints.install b/submodules/fbss_userpoints/fbss_userpoints.install
index d4067c6..61882b9 100644
--- a/submodules/fbss_userpoints/fbss_userpoints.install
+++ b/submodules/fbss_userpoints/fbss_userpoints.install
@@ -6,6 +6,15 @@
  */
 
 /**
+ * Implements hook_update_N().
+ */
+function fbss_userpoints_update_7100(&$sandbox) {
+  db_update('userpoints_txn')
+    ->expression('operation', "REPLACE(operation, 'facebook_status', 'statuses')")
+    ->execute();
+}
+
+/**
  * Implements hook_uninstall().
  */
 function fbss_userpoints_uninstall() {
diff --git a/submodules/statuses_tags/statuses_tags.install b/submodules/statuses_tags/statuses_tags.install
index be0c4d2..4007084 100644
--- a/submodules/statuses_tags/statuses_tags.install
+++ b/submodules/statuses_tags/statuses_tags.install
@@ -2,8 +2,7 @@
 
 /**
  * @file
- *   Converts @usernames to themed usernames and #hashtags to themed taxonomy
- *   terms on Statuses.
+ *   (Un)installs the Statuses Tags module.
  */
 
 /**
@@ -57,8 +56,8 @@ function statuses_tags_schema() {
 function statuses_tags_install() {
   if (module_exists('taxonomy')) {
     // Check to see if the vocabulary already existed (i.e. from a previous installation).
-    $already_exists = db_query("SELECT vid, name FROM {taxonomy_vocabulary} WHERE module = :module", array(':module' => 'statuses_tags'))->fetchObject();
-    if ($already_exists !== FALSE) {
+    $already_exists = db_query("SELECT vid, name FROM {taxonomy_vocabulary} WHERE module = 'statuses_tags'")->fetchObject();
+    if (!empty($already_exists) && !empty($already_exists->vid)) {
       variable_set('statuses_tags_vid', $already_exists->vid);
       drupal_set_message(st('The vocabulary "@name" has been configured for use with the Statuses Tags module.', array('@name' => $already_exists->name)));
       return;
@@ -74,7 +73,7 @@ function statuses_tags_install() {
     );
     taxonomy_vocabulary_save($vocabulary);
     $vid = isset($vocabulary->vid) ? $vocabulary->vid :
-      db_query("SELECT vid FROM {taxonomy_vocabulary} WHERE machine_name = :name AND module = :module", array(':name' => 'hashtags', ':module' => 'statuses_tags'))->fetchField();
+      db_query("SELECT vid FROM {taxonomy_vocabulary} WHERE machine_name = 'hashtags' AND module = 'statuses_tags'")->fetchField();
     variable_set('statuses_tags_vid', $vid);
     drupal_set_message(st('The vocabulary "Hashtags" has been created and configured for use with the Statuses Tags module.'));
   }
@@ -113,3 +112,38 @@ function statuses_tags_uninstall() {
   // FBSST is ever installed again.
   //variable_del('statuses_tags_alt_pattern');
 }
+
+/**
+ * Implements hook_update_N().
+ */
+function statuses_tags_update_7100(&$sandbox) {
+  if (db_table_exists('facebook_status_tags')) {
+    // Rename the database table.
+    db_rename_table('facebook_status_tags', 'statuses_tags');
+
+    // Update the vocabulary.
+    if (variable_get('facebook_status_tags_vid', -1) != -1) {
+      db_update('taxonomy_vocabulary')
+        ->fields(array(
+          'machine_name' => 'hashtags',
+          'description' => t('Contains #hashtags used in Statuses.'),
+          'module' => 'statuses_tags',
+        ))
+        ->condition('module', 'facebook_status_tags')
+        ->condition('vid', variable_get('facebook_status_tags_vid', -1))
+        ->execute();
+    }
+
+    // Convert old settings.
+    variable_set('statuses_tags_url', variable_get('facebook_status_tags_url', 'statuses/term'));
+    variable_set('statuses_tags_vid', variable_get('facebook_status_tags_vid', -1));
+    variable_set('statuses_tags_time', variable_get('facebook_status_tags_time', 'all'));
+    variable_set('statuses_tags_count', variable_get('facebook_status_tags_count', 5));
+    variable_del('facebook_status_tags_url');
+    variable_del('facebook_status_tags_vid');
+    variable_del('facebook_status_tags_time');
+    variable_del('facebook_status_tags_count');
+
+    return t('The Statuses Tags module for Drupal 7 was upgraded from Facebook-style Statuses Tags module for Drupal 6.');
+  }
+}
