diff --git a/course_credit.module b/course_credit.module
index a3ee22b..ba7d78a 100644
--- a/course_credit.module
+++ b/course_credit.module
@@ -50,6 +50,10 @@ function course_credit_menu() {
     'page arguments' => array('course_credit_type_map_form', 4),
   );
 
+  if (module_exists('rules')) {
+    $items += rules_ui()->config_menu('admin/course/credit/types');
+  }
+
   $items['admin/course/credit/types/%/delete'] = array(
     'title' => 'Delete credit type',
     'access arguments' => array('administer course credit'),
@@ -652,6 +656,7 @@ function theme_course_credit($variables) {
   $eligible_credit = $variables['course_credit'];
   $account = $variables['account'];
   $node = $variables['node'];
+  $items = array();
   foreach ($eligible_credit as $key => $credit_instance) {
     if ($credit_instance->active) {
       $item = t('<span class="course-credit-amount">@credits</span> <span class="course-credit-title">!title</span>', array(
@@ -1205,7 +1210,11 @@ function course_credit_types_form() {
       ),
       'edit' => array(
         '#type' => 'markup',
-        '#markup' => l('Edit', "admin/course/credit/types/$type->type/map") . ' | ' . l('Delete', "admin/course/credit/types/$type->type/delete"),
+        '#markup' => implode(' | ', array(
+          l('Edit', "admin/course/credit/types/$type->type/map"),
+          l('Conditions', "admin/course/credit/types/manage/course_credit_eligibility_{$type->type}"),
+          l('Delete', "admin/course/credit/types/$type->type/delete"),
+        )),
       ),
       'weight' => array(
         '#type' => 'weight',
@@ -1235,7 +1244,7 @@ function theme_course_credit_types_form($variables) {
   // Help text.
   $out .= '<div class="description">' . t('These are the default settings that will be used when creating a creditable activity.') . '</div>';
 
-  $headers = array('', 'Title', 'Type', 'Description', 'Min', 'Max', 'Increments', 'Variable', 'Map', 'Weight');
+  $headers = array('', 'Title', 'Type', 'Description', 'Min', 'Max', 'Increments', 'Variable', '', 'Weight');
   $rows = array();
   foreach (element_children($form) as $key) {
     foreach (element_children($form[$key]) as $credit_type) {
@@ -1279,33 +1288,29 @@ function course_credit_types_form_submit($form, $form_state) {
  *
  * @param stdClass $node
  *   A course node object.
- * @param stdClass $user
+ * @param stdClass $account
  *   A user object.
  *
  * @return array
  *   An array of valid credit instances as objects, keyed by type.
  */
-function course_credit_user_credit_types($node, $user) {
+function course_credit_user_credit_types($node, $account) {
   $valid_credit_instances = array();
   $fallback_instance = NULL;
 
   $fallback_credit_type = variable_get('course_credit_fallback_type', null);
 
-  $user = user_load($user->uid, TRUE);
-  $profile['user'] = $user;
+  $profile['user'] = $account;
   if (module_exists('profile2')) {
     $types = field_info_instances('profile2');
     foreach ($types as $bundle_name => $fields) {
-      $profile[$bundle_name] = profile2_load_by_user($user, $bundle_name);
+      $profile[$bundle_name] = profile2_load_by_user($account, $bundle_name);
     }
   }
-  if (module_exists('course')) {
-    $enrollment = course_enrollment_load($node, $user);
-  }
 
   $open_claim = variable_get('course_credit_open_claim', 0);
 
-  $sql = "SELECT cct.title, cct.description, cct.type, cc.* FROM {course_credit} cc
+  $sql = "SELECT cc.* FROM {course_credit} cc
     INNER JOIN {course_credit_type} cct USING (type)
     WHERE nid = :nid
     ORDER BY cct.weight";
@@ -1335,8 +1340,19 @@ function course_credit_user_credit_types($node, $user) {
         }
       }
 
+      if (module_exists('rules')) {
+        // Try rules.
+        $set = rules_config_load("course_credit_eligibility_{$ct_instance->type}");
+        if ($set->property('children') && $set->execute($ct_instance, $account)) {
+          // There is actually a condition. For now, to mimic previous behavior we
+          // require at least one condition before granting eligibility.
+          $valid_credit_instances[$ct_instance->type] = $ct_instance;
+        }
+      }
+
+
       // Have fun!
-      if (array_filter(module_invoke_all('course_credit_map', $node, $user, $mappings))) {
+      if (array_filter(module_invoke_all('course_credit_map', $node, $account, $mappings))) {
         // We're just looking for true, if the user is eligible.
         $valid_credit_instances[$ct_instance->type] = $ct_instance;
       }
@@ -1354,7 +1370,7 @@ function course_credit_user_credit_types($node, $user) {
   }
 
   // Alter the eligible types.
-  drupal_alter('course_credit_user_credit_types', $valid_credit_instances, $node, $user);
+  drupal_alter('course_credit_user_credit_types', $valid_credit_instances, $node, $account);
 
   return $valid_credit_instances;
 }
diff --git a/course_credit.rules_defaults.inc b/course_credit.rules_defaults.inc
new file mode 100644
index 0000000..be06c30
--- /dev/null
+++ b/course_credit.rules_defaults.inc
@@ -0,0 +1,20 @@
+<?php
+
+/**
+ * Implements hook_default_rules_configuration().
+ */
+function course_credit_default_rules_configuration() {
+  $credit_types = course_credit_get_credit_types();
+  foreach ($credit_types as $type => $credit_type) {
+    $set = rules_and(array(
+      'course_credit' => array('type' => 'course_credit', 'label' => t('Credit instance')),
+      'user' => array('type' => 'user', 'label' => t('User')),
+    ));
+    $set->label = t('@type eligibility', array('@type' => $credit_type->title));
+    $set->tags[] = 'course_credit';
+
+    $configs["course_credit_eligibility_$type"] = $set;
+  }
+
+  return $configs;
+}
