diff --git a/features.module b/features.module
index 2756bd5..4645630 100644
--- a/features.module
+++ b/features.module
@@ -262,6 +262,30 @@ function features_help($path, $arg) {
 }
 
 /**
+ * Implements hook_modules_disabled().
+ */
+function features_modules_disabled($modules) {
+  // Find any features modules that were disabled.
+  if ($modules = array_intersect(array_keys(features_get_features()), $modules)) {
+    foreach ($modules as $module) {
+      features_disable($module);
+    }
+  }
+}
+
+/**
+ * Implements hook_modules_enabled().
+ */
+function features_modules_enabled($modules) {
+  // Find any features modules that were enabled.
+  if ($modules = array_intersect(array_keys(features_get_features()), $modules)) {
+    foreach ($modules as $module) {
+      features_enable($module);
+    }
+  }
+}
+
+/**
  * Load includes for any modules that implement the features API and
  * load includes for those provided by features.
  */
@@ -682,6 +706,14 @@ function _features_restore($op, $items = array()) {
       $restore_hook = 'features_rebuild';
       $log_action = 'Rebuild';
       break;
+    case 'disable':
+      $restore_hook = 'features_disable';
+      $log_action = 'Disable';
+      break;
+    case 'enable':
+      $restore_hook = 'features_enable';
+      $log_action = 'Enable';
+      break;
   }
 
   if (empty($items)) {
@@ -727,6 +759,24 @@ function features_rebuild($rebuild = array()) {
 }
 
 /**
+ * Wrapper around _features_restore().
+ */
+function features_disable($module) {
+  $feature = feature_load($module);
+  $items[$module] = array_keys($feature->info['features']);
+  return _features_restore('disable', $items);
+}
+
+/**
+ * Wrapper around _features_restore().
+ */
+function features_enable($module) {
+  $feature = feature_load($module);
+  $items[$module] = array_keys($feature->info['features']);
+  return _features_restore('enable', $items);
+}
+
+/**
  * Utility functions ==================================================
  */
 
diff --git a/includes/features.node.inc b/includes/features.node.inc
index 8e54827..2d2add6 100644
--- a/includes/features.node.inc
+++ b/includes/features.node.inc
@@ -113,3 +113,49 @@ function node_features_revert($module = NULL) {
     menu_rebuild();
   }
 }
+
+/**
+ * Implements hook_features_disable().
+ *
+ * When a features module is disabled, modify any node types it provides so
+ * they can be deleted manually through the content types UI.
+ *
+ * @param $module
+ *   Name of module that has been disabled.
+ */
+function node_features_disable($module) {
+  if ($default_types = features_get_default('node', $module)) {
+    foreach ($default_types as $type_name => $type_info) {
+      $type_info = node_type_load($type_name);
+      $type_info->module = 'node';
+      $type_info->custom = 1;
+      $type_info->modified = 1;
+      $type_info->locked = 0;
+      node_type_save($type_info);
+    }
+  }
+}
+
+/**
+ * Implements hook_features_enable().
+ *
+ * When a features module is enabled, modify any node types it provides so
+ * they can no longer be deleted manually through the content types UI.
+ *
+ * @param $module
+ *   Name of module that has been enabled.
+ */
+function node_features_enable($module) {
+  if ($default_types = features_get_default('node', $module)) {
+    foreach ($default_types as $type_name => $type_info) {
+      // Ensure the type exists.
+      if ($type_info = node_type_load($type_name)) {
+        $type_info->module = $module;
+        $type_info->custom = 0;
+        $type_info->modified = 0;
+        $type_info->locked = 1;
+        node_type_save($type_info);
+      }
+    }
+  }
+}
