diff --git a/includes/registration.entity.inc b/includes/registration.entity.inc
index 083e7ac..4185b3c 100644
--- a/includes/registration.entity.inc
+++ b/includes/registration.entity.inc
@@ -93,11 +93,12 @@ function registration_entity_property_info_alter(&$info) {
     'type' => 'date',
     'schema field' => 'updated',
   );
-  $properties['nid'] = array(
-    'label' => t("Node"),
-    'description' => t("The node this registration is associated with."),
-    'type' => 'node',
-    'schema field' => 'nid',
+  // @todo: Is switching this from a node to an entity correct here? Not 100% sure what this is doing.
+  $properties['entity_id'] = array(
+    'label' => t("Entity ID"),
+    'description' => t("The entity id this registration is associated with."),
+    'type' => 'entity',
+    'schema field' => 'entity_id',
   );
 
   return $info;
diff --git a/includes/registration.forms.inc b/includes/registration.forms.inc
index 2a62ffd..04616c9 100644
--- a/includes/registration.forms.inc
+++ b/includes/registration.forms.inc
@@ -30,12 +30,12 @@ function registration_form($form, &$form_state, $registration) {
     '#maxlength' => 255,
     '#required' => TRUE,
   );
-
-  $settings  = registration_node_settings($registration->nid);
+  
+  $settings = registration_node_settings('node', $registration->entity_id);
   $capacity  = $settings['capacity'];
   $remaining = 20;
   if ($capacity) {
-    $remaining = $capacity - registration_event_count($registration->nid);
+    $remaining = $capacity - registration_event_count('node', $registration->entity_id);
   }
   $options = array();
   for ($i = 1; $i < $remaining + 1; $i++) {
@@ -74,7 +74,7 @@ function registration_form($form, &$form_state, $registration) {
   $form['actions']['cancel'] = array(
     '#type' => 'link',
     '#title' => t('Cancel'),
-    '#href' => 'node/' . $registration->nid,
+    '#href' => 'node/' . $registration->entity_id,
   );
 
   return $form;
@@ -87,7 +87,8 @@ function registration_form_validate($form, &$form_state) {
   $registration = $form_state['registration'];
 
   // verify the event hasn't sold out
-  if (!registration_has_room($registration->nid)) {
+  //$entity = entity_load(, array($registration->entity_id));
+  if (!registration_has_room('node', $registration->entity_id)) {
     drupal_set_message(t('Sorry, this event has reached this registration limit during your registration.'));
   }
 
@@ -98,7 +99,8 @@ function registration_form_validate($form, &$form_state) {
   // check for duplicate registrations
   else {
     $query = db_select('registration', 'r')
-      ->condition('nid', $registration->nid)
+      ->condition('entity_type', 'node')
+      ->condition('entity_id', $registration->entity_id)
       ->condition('mail', $form_state['values']['mail']);
     
     // exclude existing registration
@@ -126,6 +128,8 @@ function registration_form_submit($form, &$form_state) {
   // Set the contact's author uid
   global $user;
   $registration->author_uid = $user->uid;
+  $registration->entity_type = 'node';
+  $registration->entity_id = $registration->entity_id;
   $registration->mail = $form_state['values']['mail'];
   $registration->count = $form_state['values']['count'];
 
@@ -243,7 +247,7 @@ function registration_registrations_broadcast_form_submit($form, &$form_state) {
 function registration_registrations_settings_form($form, &$form_state, $node) {
   $form_state['nid'] = $node->nid;
 
-  $settings = registration_node_settings($node->nid);
+  $settings = registration_node_settings('node', $node->nid);
 
   $form['status'] = array(
     '#type' => 'checkbox',
diff --git a/registration.install b/registration.install
index d9a8e47..734a72f 100644
--- a/registration.install
+++ b/registration.install
@@ -25,7 +25,13 @@ function registration_schema() {
         'not null' => TRUE,
         'default' => '',
       ),
-      'nid' => array(
+      'entity_type' => array(
+        'description' => 'The entity type that this registration is tied to.',
+        'type' => 'varchar',
+        'length' => 100,
+        'not null' => TRUE,
+      ),
+      'entity_id' => array(
         'description' => 'The id of the entity this registration is associated with.',
         'type' => 'int',
         'not null' => TRUE,
@@ -69,26 +75,41 @@ function registration_schema() {
       'registration_type' => array(array('type', 4)),
     ),
     'foreign keys' => array(
+      // @todo: Ties to node are problematic. I think foreign keys are for reference only right now. Can this just go away?
+      /*
       'registration_node' => array(
         'table' => 'node',
-        'columns' => array('nid' => 'nid'),
+        'columns' => array('entity_id' => 'nid'),
       ),
+      */
       'registration_author' => array(
         'table' => 'users',
         'columns' => array('author_uid' => 'uid'),
       ),
     ),
     'unique keys' => array(
-      'nid_mail' => array('nid', 'mail'), 
-    ), 
+      'entity_type_id_mail' => array('entity_type', 'entity_id', 'mail'), 
+    ),
     'primary key' => array('registration_id'),
   );
 
-  $schema['registration_node'] = array(
-    'description' => 'Registration per-entity settings.',
+  $schema['registration_settings'] = array(
+    'description' => 'Registration per-entity_id settings.',
     'fields' => array(
-      'nid' => array(
-        'description' => 'Node id these registration settings are for.',
+      'rsid' => array(
+        'description' => 'The primary id for a registration settings on an individual entity.',
+        'type' => 'serial',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+      ),
+      'entity_type' => array(
+        'description' => 'The entity type that this entity id is tied to.',
+        'type' => 'varchar',
+        'length' => 100,
+        'not null' => TRUE,
+      ),
+      'entity_id' => array(
+        'description' => 'The entity id these registration settings are for.',
         'type' => 'int',
         'not null' => TRUE,
       ),
@@ -100,7 +121,7 @@ function registration_schema() {
         'default' => 0,
       ),
       'status' => array(
-        'description' => 'Boolean indicating if signups are open (1) or closed (0) for the given node',
+        'description' => 'Boolean indicating if signups are open (1) or closed (0) for the given entity',
         'type' => 'int',
         'not null' => TRUE,
         'default' => 1,
@@ -131,13 +152,16 @@ function registration_schema() {
         'description' => 'A serialized object that stores additional registration settings.',
       ),
     ),
+    // @todo: Ties to node are problematic and foreign keys are for reference only right now. Can this just go away?
+    /*
     'foreign keys' => array(
       'registration_node_node' => array(
         'table' => 'node',
         'columns' => array('nid' => 'nid'),
       ),
     ),
-    'primary key' => array('nid'),
+    */
+    'primary key' => array('rsid'),
   );
 
   return $schema;
diff --git a/registration.module b/registration.module
index c713d37..0f35890 100644
--- a/registration.module
+++ b/registration.module
@@ -163,9 +163,11 @@ function registration_page_view($registration, $view_mode = 'full') {
  * Page title callback.
  */
 function registration_page_title($registration) {
-  // use the node title in the registration page title
-  if ($node = node_load($registration->nid)) {
-    return t('Registration for @title', array('@title' => $node->title));
+  // Use the entity title in the registration page title, if available
+  // @todo: Will all entities have a title or is this node-specific?
+  $entity = entity_load_single($registration->entity_type, $registration->entity_id);
+  if (isset($entity->title)) {
+    return t('Registration for @title', array('@title' => $entity->title));
   }
 }
 
@@ -208,7 +210,7 @@ function registration_register_page_access($node) {
   $ret = FALSE;
   if (variable_get('registration_node_status_' . $node->type, 0)) {
     if (user_access('administer registration') || user_access('add registration')) {
-      $settings = registration_node_settings($node->nid);
+     $settings = registration_node_settings('node', $node->nid);
       if ($settings['status']) {
         $ret = TRUE;
       }
@@ -236,9 +238,10 @@ function registration_administer_registrations_access($node) {
  * Page callback for adding a registration.
  */
 function registration_register_page($node) {
-  if (registration_has_room($node->nid)) {
+  if (registration_has_room('node', $node->nid)) {
     $registration = entity_get_controller('registration')->create(array('type' => 'registration'));
-    $registration->nid = $node->nid;
+    $registration->entity_type = 'node';
+    $registration->entity_id = $node->nid;
     return drupal_get_form('registration_form', $registration);
   }
   else {
@@ -267,7 +270,8 @@ function registration_registrations_page($node) {
   $query = new EntityFieldQuery;
   $result = $query
     ->entityCondition('entity_type', 'registration')
-    ->propertyCondition('nid', $node->nid)
+    ->propertyCondition('entity_type', 'node')
+    ->propertyCondition('entity_id', $node->nid)
     ->pager(20)
     ->tableSort($header)
     ->execute();
@@ -296,8 +300,8 @@ function registration_registrations_page($node) {
         implode(' | ', $actions)
       );
     }
-
-    $settings = registration_node_settings($node->nid);
+    
+    $settings = registration_node_settings('node', $node->nid);
         
     $table = array(
       'header' => $header,
@@ -305,7 +309,7 @@ function registration_registrations_page($node) {
       'caption' => t('List of registrations for %title. !count of !capacity slots are filled.', 
         array(
           '%title' => $node->title,
-          '!count' => '<strong>' . registration_event_count($node->nid) . '</strong>', 
+          '!count' => '<strong>' . registration_event_count('node', $node->nid) . '</strong>', 
           '!capacity' => '<strong>' . $settings['capacity'] . '</strong>'
         ))
     );
@@ -323,12 +327,12 @@ function registration_registrations_page($node) {
 /**
  * Helper to determine if a node has any slots left.
  */
-function registration_has_room($nid) {
-  $ret      = TRUE;
-  $settings = registration_node_settings($nid);
+function registration_has_room($entity_type, $entity_id) {
+  $ret = TRUE;
+  $settings = registration_node_settings($entity_type, $entity_id);
   $capacity = $settings['capacity'];
   if ($capacity) {
-    $count = registration_event_count($nid);
+    $count = registration_event_count('node', $nid);
     if (($capacity - $count) < 1) {
       $ret = FALSE;
     }
@@ -344,11 +348,11 @@ function registration_has_room($nid) {
  *
  * @return int
  */
-function registration_event_count($nid) {
+function registration_event_count($entity_type, $entity_id) {
   $count = &drupal_static(__FUNCTION__, FALSE);
   if (!$count) {
-    $count = db_query("SELECT sum(count) FROM {registration} WHERE nid = :nid",
-      array(':nid' => $nid)
+    $count = db_query("SELECT sum(count) FROM {registration} WHERE entity_type = :entity_type AND entity_id = :entity_id",
+      array(':entity_type' => $entity_type, ':entity_id' => $entity_id)
     )->fetchField();    
   }
   return $count;
@@ -366,15 +370,16 @@ function registration_node_delete($node) {
 /**
  * Return all registration settings for a given node.
  *
- * @param string $nid
+ * @param string $entity The full entity object (node, etc.)
  *
  * @return array
  */
-function registration_node_settings($nid) {
+function registration_node_settings($entity_type, $entity_id) {
   // @TODO: Add static variable handling.
-  $result = db_select('registration_node', 'rn')
-    ->fields('rn')
-    ->condition('nid', $nid, '=')
+  $result = db_select('registration_settings', 'rs')
+    ->fields('rs')
+    ->condition('entity_type', $entity_type, '=')
+    ->condition('entity_id', $entity_id, '=')
     ->execute()
     ->fetchAssoc();
 
@@ -401,12 +406,13 @@ function registration_theme() {
  *
  * @param array $variables
  *   Contains a complete registration object.
+ * @todo: Much of this is node specific. Move some of this into a preprocessor to set up variables first.
  */
 function theme_registration($variables) {
   $registration = $variables['registration'];
   $output = '<div><label>' . t('Email') . '</label>' . $registration->mail . '</div>';
-  if ($node = node_load($registration->nid)) {
-    $output .= '<div><label>' . $node->type . "</label>" . l($node->title, 'node/' . $registration->nid) . '</div>';
+  if ($node = node_load($registration->entity_id)) {
+    $output .= '<div><label>' . $node->type . "</label>" . l($node->title, 'node/' . $registration->entity_id) . '</div>';
   }
 
   $output .= '<div><label>' . t('Count') . '</label>' . $registration->count . '</div>';
@@ -434,7 +440,7 @@ function registration_send_broadcast($node, $subject, $message) {
   global $language;
   
   // grab registration node settings
-  $settings = registration_node_settings($node->nid);
+  $settings = registration_node_settings('node', $node->nid);
   $from = $settings['settings']['from_address'];
   
   // grab all registrations
@@ -504,8 +510,9 @@ function registration_send_broadcast($node, $subject, $message) {
  */
 function registration_update_node_settings($nid, $settings) {
   // insert or udpate registration node settings
-  db_merge('registration_node')
-    ->key(array('nid' => $nid))
+  db_merge('registration_settings')
+    ->key(array('entity_type' => 'node'))
+    ->key(array('entity_id' => $nid))
     ->fields($settings)
     ->execute();
 
