diff --git a/commons.api.php b/commons.api.php
new file mode 100644
index 0000000..f137568
--- /dev/null
+++ b/commons.api.php
@@ -0,0 +1,68 @@
+<?php
+
+/**
+ * @file
+ * Hooks provided by the Commons module.
+ */
+
+/**
+ * @addtogroup hooks
+ * @{
+ */
+
+/**
+ * Define entity integrations.
+ *
+ * This hook allows modules to register entity types and/or bundles that they
+ * provide for integration with Commons functionality. For example, a webform
+ * module could use it to register a form entity type and its "Test", "Survey"
+ * and "Suggestion" bundles.
+ *
+ * @return
+ *   An associative array of entity integrations whose keys define the entity
+ *   type for each integration and whose values contain the bundles which have
+ *   been integrated. Each bundle is itself an associative array, whose keys
+ *   define the type of integration to enable and whose values contain the
+ *   status of the integration. TRUE = enabled, FALSE = disabled.
+ *
+ * For a detailed usage example, see commons_q_a.module.
+ *
+ * @see hook_commons_entity_integration_alter()
+ */
+function hook_commons_entity_integration() {
+  // Register three of the webform entity's bundles for various integrations.
+  return array(
+    'webform' => array(
+      'test' => array(
+        'exclude_rate' => TRUE,
+      ),
+      'survey' => array(
+        'exclude_topics' => TRUE,
+      ),
+      'suggestion' => array(
+        'media' => TRUE,
+      ),
+    ),
+  );
+}
+
+/**
+ * Perform alterations on entity integrations.
+ *
+ * @param $integrations
+ *   An associative array of entity integrations whose keys define the entity
+ *   type for each integration and whose values contain the bundles which have
+ *   been integrated. Each bundle is itself an associative array, whose keys
+ *   define the type of integration to enable and whose values contain the
+ *   status of the integration. TRUE = enabled, FALSE = disabled.
+ *
+ * @see hook_commons_entity_integration()
+ */
+function hook_commons_entity_integration_alter(&$integrations) {
+  // Disable Media integration for the post content type.
+  $integrations['node']['post']['media'] = FALSE;
+}
+
+/**
+ * @} End of "addtogroup hooks".
+ */
diff --git a/commons.profile b/commons.profile
index 922272c..19fa34d 100644
--- a/commons.profile
+++ b/commons.profile
@@ -169,6 +169,33 @@ function commons_install_tasks() {
 }
 
 /**
+ * Get Commons entity integration information.
+ *
+ * @param $entity_type
+ *   (optional) The entity type to load, e.g. node or user.
+ *
+ * @return
+ *   An associative array of entity integrations whose keys define the entity
+ *   type for each integration and whose values contain the bundles which have
+ *   been integrated. Each bundle is itself an associative array, whose keys
+ *   define the type of integration to enable and whose values contain the
+ *   status of the integration. TRUE = enabled, FALSE = disabled.
+ */
+function commons_entity_integration_info($entity_type = NULL) {
+  $info = &drupal_static(__FUNCTION__);
+  if (!$info) {
+    $info = module_invoke_all('commons_entity_integration');
+    drupal_alter('commons_entity_integration', $info);
+  }
+  if ($entity_type) {
+    return isset($info[$entity_type]) ? $info[$entity_type] : array();
+  }
+  else {
+    return $info;
+  }
+}
+
+/**
  * Allow users to select from a predefined list of color palettes during
  * the commons installation.
  */
diff --git a/modules/commons/commons_documents/commons_documents.module b/modules/commons/commons_documents/commons_documents.module
index b65e298..de94e87 100644
--- a/modules/commons/commons_documents/commons_documents.module
+++ b/modules/commons/commons_documents/commons_documents.module
@@ -85,7 +85,7 @@ function commons_documents_views_pre_render(&$view) {
 }
 
 /**
- * Implements hook_commons_entity_integration.
+ * Implements hook_commons_entity_integration().
  */
 function commons_documents_commons_entity_integration() {
   return array(
diff --git a/modules/commons/commons_follow/commons_follow.module b/modules/commons/commons_follow/commons_follow.module
index f6c6c62..e301be2 100644
--- a/modules/commons/commons_follow/commons_follow.module
+++ b/modules/commons/commons_follow/commons_follow.module
@@ -119,7 +119,7 @@ function commons_follow_flag_export_alter(&$flag) {
  * Implements hook_flag_alter().
  */
 function commons_follow_flag_alter(&$flag) {
-  $commons_entity_integrations = module_invoke_all('commons_entity_integration');
+  $commons_entity_integrations = commons_entity_integration_info();
   // Find Commons node types that should have follow integration and alter
   // the commons_follow_node flag to allow following these node types.
   // This is currently hard-coded to node entities and the
diff --git a/modules/commons/commons_groups/commons_groups.module b/modules/commons/commons_groups/commons_groups.module
index d28beb2..c122918 100644
--- a/modules/commons/commons_groups/commons_groups.module
+++ b/modules/commons/commons_groups/commons_groups.module
@@ -811,7 +811,7 @@ function commons_groups_set_group_permissions($node) {
  */
 function commons_groups_get_group_content_entity_types() {
   // Find all Commons Entity integrations.
-  $commons_entity_integrations = module_invoke_all('commons_entity_integration');
+  $commons_entity_integrations = commons_entity_integration_info();
   if (empty($commons_entity_integrations)) {
     return array();
   }
diff --git a/modules/commons/commons_like/commons_like.module b/modules/commons/commons_like/commons_like.module
index 5ed5021..49f6f2e 100644
--- a/modules/commons/commons_like/commons_like.module
+++ b/modules/commons/commons_like/commons_like.module
@@ -25,7 +25,7 @@ function commons_like_features_export_alter(&$export, $module_name) {
   if (!empty($items['rate_widgets']->value)) {
     foreach($items['rate_widgets']->value as $key => $widget) {
       if ($widget->name == 'commons_like') {
-        $commons_entity_integrations = module_invoke_all('commons_entity_integration');
+        $commons_entity_integrations = commons_entity_integration_info();
         if (!empty($commons_entity_integrations['node'])) {
           foreach ($commons_entity_integrations['node'] as $bundle => $options) {
             if (!isset($options['exclude_rate']) || $options['exclude_rate'] != TRUE) {
diff --git a/modules/commons/commons_media/commons_media.module b/modules/commons/commons_media/commons_media.module
index c732863..5f026c1 100644
--- a/modules/commons/commons_media/commons_media.module
+++ b/modules/commons/commons_media/commons_media.module
@@ -11,7 +11,7 @@ include_once 'commons_media.features.inc';
  */
 function commons_media_system_info_alter(&$info, $file, $type) {
   if ($file->name == 'commons_media') {
-    $entity_integrations = module_invoke_all('commons_entity_integration');
+    $entity_integrations = commons_entity_integration_info();
 
     if (!empty($entity_integrations)) {
       foreach ($entity_integrations as $entity_type => $bundles) {
diff --git a/modules/commons/commons_polls/commons_polls.module b/modules/commons/commons_polls/commons_polls.module
index 3a87629..bf5f98a 100644
--- a/modules/commons/commons_polls/commons_polls.module
+++ b/modules/commons/commons_polls/commons_polls.module
@@ -23,7 +23,7 @@ function commons_polls_commons_bw_group_widget() {
 }
 
 /**
- * Implements hook_commons_entity_integration.
+ * Implements hook_commons_entity_integration().
  */
 function commons_polls_commons_entity_integration() {
   return array(
diff --git a/modules/commons/commons_posts/commons_posts.module b/modules/commons/commons_posts/commons_posts.module
index a14d1eb..1d34611 100644
--- a/modules/commons/commons_posts/commons_posts.module
+++ b/modules/commons/commons_posts/commons_posts.module
@@ -92,7 +92,7 @@ function commons_posts_commons_activity_streams_message_selection_alter(&$messag
 }
 
 /**
- * Implements hook_commons_entity_integration.
+ * Implements hook_commons_entity_integration().
  */
 function commons_posts_commons_entity_integration() {
   return array(
diff --git a/modules/commons/commons_q_a/commons_q_a.module b/modules/commons/commons_q_a/commons_q_a.module
index f7270a6..d9a3783 100644
--- a/modules/commons/commons_q_a/commons_q_a.module
+++ b/modules/commons/commons_q_a/commons_q_a.module
@@ -245,7 +245,7 @@ function commons_q_a_commons_bw_create_all_widget($group) {
 }
 
 /**
- * Implements hook_commons_entity_integration.
+ * Implements hook_commons_entity_integration().
  */
 function commons_q_a_commons_entity_integration() {
   return array(
diff --git a/modules/commons/commons_radioactivity/commons_radioactivity.module b/modules/commons/commons_radioactivity/commons_radioactivity.module
index e367a96..7a5cfe4 100644
--- a/modules/commons/commons_radioactivity/commons_radioactivity.module
+++ b/modules/commons/commons_radioactivity/commons_radioactivity.module
@@ -98,7 +98,7 @@ function commons_radioactivity_features_pipe_alter(&$pipe, $data, $export) {
 */
 function commons_radioactivity_get_radioactive_entity_types() {
   // Find all Commons Entity integrations.
-  $commons_entity_integrations = module_invoke_all('commons_entity_integration');
+  $commons_entity_integrations = commons_entity_integration_info();
   if (empty($commons_entity_integrations)) {
     return array();
   }
diff --git a/modules/commons/commons_social_sharing/commons_social_sharing.module b/modules/commons/commons_social_sharing/commons_social_sharing.module
index db2ac2f..2a0bc9e 100644
--- a/modules/commons/commons_social_sharing/commons_social_sharing.module
+++ b/modules/commons/commons_social_sharing/commons_social_sharing.module
@@ -26,7 +26,7 @@ function commons_social_sharing_features_export_alter(&$export, $module_name) {
   if (!empty($items['rate_widgets']->value)) {
     foreach($items['rate_widgets']->value as $key => $widget) {
       if ($widget->name == 'commons_social_sharing') {
-        $commons_entity_integrations = module_invoke_all('commons_entity_integration');
+        $commons_entity_integrations = commons_entity_integration_info();
         if (!empty($commons_entity_integrations['node'])) {
           foreach ($commons_entity_integrations['node'] as $bundle => $options) {
             if (!isset($options['exclude_rate']) || $options['exclude_rate'] != TRUE) {
diff --git a/modules/commons/commons_topics/commons_topics.module b/modules/commons/commons_topics/commons_topics.module
index 0b43123..b4dc6dd 100644
--- a/modules/commons/commons_topics/commons_topics.module
+++ b/modules/commons/commons_topics/commons_topics.module
@@ -51,7 +51,7 @@ function commons_topics_form_node_form_alter(&$form, &$form_state) {
  */
 function commons_topics_get_entity_types_with_topics() {
   // Find all Commons Entity integrations.
-  $commons_entity_integrations = module_invoke_all('commons_entity_integration');
+  $commons_entity_integrations = commons_entity_integration_info();
   if (empty($commons_entity_integrations)) {
     return array();
   }
diff --git a/modules/commons/commons_wikis/commons_wikis.module b/modules/commons/commons_wikis/commons_wikis.module
index 20cf44b..356bdf7 100644
--- a/modules/commons/commons_wikis/commons_wikis.module
+++ b/modules/commons/commons_wikis/commons_wikis.module
@@ -156,7 +156,7 @@ function commons_wikis_commons_bw_group_widget() {
 }
 
 /**
- * Implements hook_commons_entity_integration.
+ * Implements hook_commons_entity_integration().
  */
 function commons_wikis_commons_entity_integration() {
   return array(
