diff --git a/flag.api.php b/flag.api.php
index ff1d9d7..4c4e962 100644
--- a/flag.api.php
+++ b/flag.api.php
@@ -13,6 +13,8 @@
 /**
  * Define one or more flag types.
  *
+ * This hook may be placed in a $module.flag.inc file.
+ *
  * @return
  *  An array whose keys are flag type names and whose values are properties of
  *  the flag type.
@@ -39,6 +41,8 @@ function hook_flag_type_info() {
 /**
  * Alter flag type definitions provided by other modules.
  *
+ * This hook may be placed in a $module.flag.inc file.
+ *
  * @param $definitions
  *  An array of flag definitions returned by hook_flag_type_info().
  */
@@ -164,6 +168,8 @@ function hook_flag_access_multiple($flag, $entity_ids, $account) {
  *
  * Link types defined here must be returned by this module's hook_flag_link().
  *
+ * This hook may be placed in a $module.flag.inc file.
+ *
  * @return
  *  An array of one or more types, keyed by the machine name of the type, and
  *  where each value is a link type definition as an array with the following
@@ -190,6 +196,8 @@ function hook_flag_link_type_info() {
 /**
  * Alter other modules' definitions of flag link types.
  *
+ * This hook may be placed in a $module.flag.inc file.
+ *
  * @param $link_types
  *  An array of the link types defined by all modules.
  *
diff --git a/flag.flag.inc b/flag.flag.inc
new file mode 100644
index 0000000..09c990a
--- /dev/null
+++ b/flag.flag.inc
@@ -0,0 +1,90 @@
+<?php
+
+/**
+ * @file
+ * Contains implementations of flag info hooks.
+ */
+
+/**
+ * Implements hook_flag_type_info().
+ *
+ * Defines the flag types this module implements.
+ *
+ * @return
+ *   An "array of arrays", keyed by object type. The 'handler' slot
+ *   should point to the PHP class implementing this flag.
+ */
+function flag_flag_type_info() {
+  // Entity types we specifically cater for.
+  $flags = array(
+    'node' => array(
+      'title' => t('Nodes'),
+      'description' => t("Nodes are a Drupal site's primary content."),
+      'handler' => 'flag_node',
+    ),
+    'comment' => array(
+      'title' => t('Comments'),
+      'description' => t('Comments are responses to node content.'),
+      'handler' => 'flag_comment',
+    ),
+    'user' => array(
+      'title' => t('Users'),
+      'description' => t('Users who have created accounts on your site.'),
+      'handler' => 'flag_user',
+    ),
+  );
+
+  return $flags;
+}
+
+/**
+ * Implements hook_flag_type_info_alter().
+ *
+ * Step in and add flag types for any entities not yet catered for, using the
+ * basic flag_entity handler. This allows other modules to provide more
+ * specialized handlers for entities in hook_flag_type_info() as normal.
+ */
+function flag_flag_type_info_alter(&$definitions) {
+  foreach (entity_get_info() as $entity_type => $entity) {
+    // Only add flag support for entities that don't yet have them, and which
+    // are non-config entities.
+    if (!isset($definitions[$entity_type]) && empty($entity['configuration'])) {
+      $definitions[$entity_type] = array(
+        'title' => $entity['label'],
+        'description' => t('@entity-type entity', array('@entity-type' => $entity['label'])),
+        'handler' => 'flag_entity',
+      );
+    }
+  }
+}
+
+/**
+ * Implements hook_flag_link_type_info().
+ */
+function flag_flag_link_type_info() {
+  return array(
+    'toggle' => array(
+      'title' => t('JavaScript toggle'),
+      'description' => t('An AJAX request will be made and degrades to type "Normal link" if JavaScript is not available.'),
+      'uses standard js' => TRUE,
+      'uses standard css' => TRUE,
+    ),
+    'normal' => array(
+      'title' => t('Normal link'),
+      'description' => t('A normal non-JavaScript request will be made and the current page will be reloaded.'),
+      'uses standard js' => FALSE,
+      'uses standard css' => FALSE,
+    ),
+    'confirm' => array(
+      'title' => t('Confirmation form'),
+      'description' => t('The user will be taken to a confirmation form on a separate page to confirm the flag.'),
+      'options' => array(
+        'flag_confirmation' => '',
+        'unflag_confirmation' => '',
+      ),
+      'uses standard js' => FALSE,
+      'uses standard css' => FALSE,
+      'provides form' => TRUE,
+    ),
+  );
+}
diff --git a/flag.inc b/flag.inc
index 9f8ebb3..082272c 100644
--- a/flag.inc
+++ b/flag.inc
@@ -1,59 +1,6 @@
 <?php
 
 /**
- * Implements hook_flag_type_info().
- *
- * Defines the flag types this module implements.
- *
- * @return
- *   An "array of arrays", keyed by object type. The 'handler' slot
- *   should point to the PHP class implementing this flag.
- */
-function flag_flag_type_info() {
-  // Entity types we specifically cater for.
-  $flags = array(
-    'node' => array(
-      'title' => t('Nodes'),
-      'description' => t("Nodes are a Drupal site's primary content."),
-      'handler' => 'flag_node',
-    ),
-    'comment' => array(
-      'title' => t('Comments'),
-      'description' => t('Comments are responses to node content.'),
-      'handler' => 'flag_comment',
-    ),
-    'user' => array(
-      'title' => t('Users'),
-      'description' => t('Users who have created accounts on your site.'),
-      'handler' => 'flag_user',
-    ),
-  );
-
-  return $flags;
-}
-
-/**
- * Implements hook_flag_type_info_alter().
- *
- * Step in and add flag types for any entities not yet catered for, using the
- * basic flag_entity handler. This allows other modules to provide more
- * specialized handlers for entities in hook_flag_type_info() as normal.
- */
-function flag_flag_type_info_alter(&$definitions) {
-  foreach (entity_get_info() as $entity_type => $entity) {
-    // Only add flag support for entities that don't yet have them, and which
-    // are non-config entities.
-    if (!isset($definitions[$entity_type]) && empty($entity['configuration'])) {
-      $definitions[$entity_type] = array(
-        'title' => $entity['label'],
-        'description' => t('@entity-type entity', array('@entity-type' => $entity['label'])),
-        'handler' => 'flag_entity',
-      );
-    }
-  }
-}
-
-/**
  * Returns a flag definition.
  */
 function flag_fetch_definition($entity_type = NULL) {
diff --git a/flag.module b/flag.module
index c8e369c..a79a0ea 100644
--- a/flag.module
+++ b/flag.module
@@ -331,6 +331,25 @@ function flag_init() {
 }
 
 /**
+ * Implements hook_hook_info().
+ */
+function flag_hook_info() {
+  $hooks['flag_type_info'] = array(
+    'group' => 'flag',
+  );
+  $hooks['flag_type_info_alter'] = array(
+    'group' => 'flag',
+  );
+  $hooks['flag_link_type_info'] = array(
+    'group' => 'flag',
+  );
+  $hooks['flag_link_type_info_alter'] = array(
+    'group' => 'flag',
+  );
+  return $hooks;
+}
+
+/**
  * Implements hook_views_api().
  */
 function flag_views_api() {
@@ -450,37 +469,6 @@ function flag_flag_link($flag, $action, $entity_id) {
 }
 
 /**
- * Implements hook_flag_link_type_info().
- */
-function flag_flag_link_type_info() {
-  return array(
-    'toggle' => array(
-      'title' => t('JavaScript toggle'),
-      'description' => t('An AJAX request will be made and degrades to type "Normal link" if JavaScript is not available.'),
-      'uses standard js' => TRUE,
-      'uses standard css' => TRUE,
-    ),
-    'normal' => array(
-      'title' => t('Normal link'),
-      'description' => t('A normal non-JavaScript request will be made and the current page will be reloaded.'),
-      'uses standard js' => FALSE,
-      'uses standard css' => FALSE,
-    ),
-    'confirm' => array(
-      'title' => t('Confirmation form'),
-      'description' => t('The user will be taken to a confirmation form on a separate page to confirm the flag.'),
-      'options' => array(
-        'flag_confirmation' => '',
-        'unflag_confirmation' => '',
-      ),
-      'uses standard js' => FALSE,
-      'uses standard css' => FALSE,
-      'provides form' => TRUE,
-    ),
-  );
-}
-
-/**
  * Implements hook_field_extra_fields().
  */
 function flag_field_extra_fields() {
