diff --git a/modules/party_log/party_log.info b/modules/party_log/party_log.info
new file mode 100644
index 0000000..489d966
--- /dev/null
+++ b/modules/party_log/party_log.info
@@ -0,0 +1,9 @@
+name = Party Logging
+description = Provide an integrated log of everything that happens to a party.
+core = 7.x
+
+dependencies[] = message
+dependencies[] = party
+dependencies[] = token
+dependencies[] = entity_token
+dependencies[] = entityreference
diff --git a/modules/party_log/party_log.module b/modules/party_log/party_log.module
new file mode 100644
index 0000000..8e19cf6
--- /dev/null
+++ b/modules/party_log/party_log.module
@@ -0,0 +1,78 @@
+<?php
+/**
+ * @file
+ * Provide a framework for logging things that happen to and with parties.
+ */
+
+/**
+ * Implements hook_default_message_type_category().
+ *
+ * Provide a default message type category for all party messages.
+ */
+function party_log_default_message_type_category() {
+  $categories = array();
+
+  $categories['party_log'] = entity_import('message_type_category', '{
+    "name" : "party_log",
+    "description" : "Party Log Message",
+  }');
+
+  return $categories;
+}
+
+/**
+ * Implements hook_field_attach_create_bundle().
+ *
+ * Add a party reference field to every bundle that is made party of the party
+ * log message_type_category.
+ */
+function party_log_field_attach_create_bundle($entity_type, $bundle) {
+  if ($entity_type != 'message') {
+    return;
+  }
+
+  $message_type = entity_load_single('message_type', $bundle);
+  if ($message_type->category != 'party_log') {
+    return;
+  }
+
+  // Add a party field.
+  if (!field_info_field('party')) {
+    $field = array(
+      'field_name' => 'party',
+      'type' => 'entityreference',
+      'cardinality' => 1,
+      'settings' => array(
+        'target_type' => 'party',
+        'handler' => 'base',
+        'handler_settings' => array(
+          'sort' => array(
+            'type' => 'none',
+          ),
+        ),
+      ),
+    );
+    field_create_field($field);
+  }
+
+  if (!field_info_instance('message', 'party', $bundle)) {
+    $instance = array(
+      'field_name' => 'party',
+      'entity_type' => 'message',
+      'bundle' => $bundle,
+      'label' => t('Party'),
+      'required' => TRUE,
+      'settings' => array(
+        'default_value' => '',
+      ),
+      'widget' => array(
+        'type' => 'entityreference_autocomplete',
+        'settings' => array(
+          'size' => '60',
+          'match_operator' => 'CONTAINS',
+        ),
+      ),
+    );
+    field_create_instance($instance);
+  }
+}
