diff --git a/apps.api.php b/apps.api.php
index 4b30528..bfab4b7 100644
--- a/apps.api.php
+++ b/apps.api.php
@@ -27,6 +27,8 @@ function hook_apps_app_info() {
 
     'configure form' => 'appname_app_configure_form', // This form will be render on the app config page
     'post install callback' => 'appname_app_post_install', // This will be called after the app is enabled intialy or of the app has been uninstalled
+    'post enabled callback' => 'appname_app_post_enable', // This will be called after the app is enabled.
+    'post disable callback' => 'appname_app_post_disable', // This will be called after the app is disabled.
     'status callback' => 'appname_app_status'
     /*
     This call back is used to render a status table on the config page.  it should be an array with two keys (and on optional third) 
diff --git a/apps.manifest.inc b/apps.manifest.inc
index c2c54db..81ea064 100755
--- a/apps.manifest.inc
+++ b/apps.manifest.inc
@@ -412,6 +412,15 @@ function apps_app_callback($app, $key) {
   if (isset($app[$key]) && module_exists($app['machine_name']) && function_exists($app[$key])){
     return $app[$key];
   }
+
+	// Else try load this module (happens when module is not enabled)
+  if (isset($app['machine_name']) && !empty($key)) {
+    module_load_include("module", $app['machine_name']);
+    $info = module_invoke($app['machine_name'], 'apps_app_info');
+    if (isset($info[$key]) && function_exists($info[$key])) {
+      return $info[$key];
+    }
+  }
 }
 
 
diff --git a/apps.pages.inc b/apps.pages.inc
index af8ce49..d1a412e 100755
--- a/apps.pages.inc
+++ b/apps.pages.inc
@@ -174,11 +174,15 @@ function apps_app_enable($app) {
   $next = apps_app_page_path($app, 'configure');
   $success = module_enable(array($app['machine_name']), TRUE);
   if ($success) {
+    system_rebuild_module_data();
     drupal_flush_all_caches();
     drupal_set_message(t("Enabled @name app", array('@name' => $app['name'])));
     if (!$app['disabled'] && ($cb = apps_app_callback($app, "post install callback"))) {
       $cb($app);
     }
+    if ($cb = apps_app_callback($app, "post enabled callback")) {
+      $cb($app);
+    }
     if(!apps_app_access('administer apps', $app, 'configure')) {
       $next = apps_app_page_path($app);
     }
@@ -205,6 +209,9 @@ function apps_app_disable($app) {
   module_disable(array($app['machine_name']));
   drupal_flush_all_caches();
   drupal_set_message(t("Disabled @name app", array('@name' => $app['name'])));
+  if ($cb = apps_app_callback($app, "post disable callback")) {
+    $cb($app);
+  }
   $next = apps_app_page_path($app);
   drupal_goto($next);
 }
@@ -213,6 +220,10 @@ function apps_app_disable($app) {
  * Callback for app uninstall
  */
 function apps_app_uninstall($app) {
+	if ($callback = apps_app_callback($app, "post install callback")) {
+    $callback($app);
+  }
+
   require_once DRUPAL_ROOT . '/includes/install.inc';
   $uninstall[] = $app['machine_name'];
   if (isset($app['demo content module']) && $app['demo content module']) {
@@ -220,6 +231,7 @@ function apps_app_uninstall($app) {
   }
 
   if (drupal_uninstall_modules($uninstall)) {
+    system_rebuild_module_data();
     drupal_flush_all_caches();
     drupal_set_message(t("Uninstalled @name app", array('@name' => $app['name'])));
   }
