diff --git a/userpoints.admin.inc b/userpoints.admin.inc
index d5d81b6..38fd598 100644
--- a/userpoints.admin.inc
+++ b/userpoints.admin.inc
@@ -28,22 +28,18 @@ function userpoints_admin_txn($form, &$form_state, $mode, $txn = NULL) {
     drupal_set_title(t('Edit !points transaction', userpoints_translation()));
     $timestamp = format_date($txn->time_stamp, 'custom', 'Y-m-d H:i:s O');
     $txn_user = $txn->getUser();
-
-    $form['txn'] = array(
-      '#type' => 'value',
-      '#value' => $txn,
-    );
   }
   elseif ($mode == 'add') {
     drupal_set_title(t('Add !points', userpoints_translation()));
     if ($txn) {
       $txn_user = user_load($txn);
     }
-    $txn = NULL;
+    $txn = new UserpointsTransaction();
   }
+  $form_state['userpoints_transaction'] = $txn;
 
   // If this transaction is read only, disable all fields.
-  $disable = $txn && $txn->isReadOnly();
+  $disable = $txn->isReadOnly();
 
   if ($disable) {
     drupal_set_message(t('This transaction is read only and can not be changed.'), 'warning');
@@ -92,6 +88,7 @@ function userpoints_admin_txn($form, &$form_state, $mode, $txn = NULL) {
 
   $form['additional_settings'] = array(
     '#type' => 'vertical_tabs',
+    '#weight' => 20,
   );
 
   $form['status'] = array(
@@ -170,7 +167,7 @@ function userpoints_admin_txn($form, &$form_state, $mode, $txn = NULL) {
   $form['reason']['operation'] = array(
       '#type' => 'textfield',
       '#title' => t('Operation'),
-      '#default_value' => isset($txn) ? $txn->operation : t('admin'),
+      '#default_value' => $txn->getOperation() ? $txn->operation : t('admin'),
       '#maxlength' => 48,
       '#description' => t('The operation type for this transaction (default is %admin). Any value is valid but using a defined operation will cause an auto-generated description (specific to the chosen operation) to be included. This description can be translated into multiple languages.', array('%admin' => t('admin'))),
       '#weight' => 5,
@@ -251,12 +248,18 @@ function userpoints_admin_txn($form, &$form_state, $mode, $txn = NULL) {
       '#default_value' => $mode
   );
 
-  $form['submit'] = array(
+  $form['actions'] = array(
+    '#type' => 'actions',
+  );
+
+  $form['actions']['submit'] = array(
       '#type' => 'submit',
       '#value' => t('Save'),
       '#weight' => 50,
       '#disabled' => $disable,
   );
+
+  field_attach_form('userpoints_transaction', $txn, $form, $form_state);
   return $form;
 }
 /**
@@ -325,6 +328,7 @@ function userpoints_admin_txn_validate($form, &$form_state) {
     form_set_error('time_stamp', t('The provided timestamp is not a valid date.'));
   }
 
+  field_attach_form_validate('userpoints_transaction', $form_state['userpoints_transaction'], $form, $form_state);
 }
 
 /**
@@ -333,11 +337,13 @@ function userpoints_admin_txn_validate($form, &$form_state) {
 function userpoints_admin_txn_submit($form, &$form_state) {
   global $user;
 
+  $transaction = $form_state['userpoints_transaction'];
+
   // Check if this is a new transaction or if we are editing an existing one.
   if ($form_state['values']['mode'] == 'add') {
-
-    // Create a new transaction object.
-    $transaction = userpoints_grant_points($form_state['values']['operation'], $form_state['values']['points'], $form_state['values']['txn_user']->uid)
+    // Set basic properties.
+    $transaction
+      ->setUid($form_state['values']['txn_user']->uid)
       ->setTimestamp($form_state['values']['time_stamp']);
 
     // If the transaction should be moderated, set it to pending.
@@ -356,8 +362,7 @@ function userpoints_admin_txn_submit($form, &$form_state) {
   else {
 
     // Updating an existing transaction, load and update values.
-    $transaction = userpoints_transaction_load($form_state['values']['txn']->txn_id)
-      ->setPoints($form_state['values']['points'])
+    $transaction
       ->setStatus($form_state['values']['status'])
       // We display a custom message instead of the default.
       ->setMessage(t('Changes to the !points transaction have been saved.', userpoints_translation()));
@@ -370,14 +375,23 @@ function userpoints_admin_txn_submit($form, &$form_state) {
     }
 
     // If status changed, the current user is the new approver.
-    if ($form_state['values']['txn']->status != $form_state['values']['status']) {
+    if ($transaction->getStatus() != $form_state['values']['status']) {
       $transaction->setApproverUid($user->uid);
     }
   }
 
+  // Attach field information directly to the userpoints transaction object.
+  foreach (field_info_instances('userpoints_transaction', 'userpoints_transaction') as $instance) {
+    $field_name = $instance['field_name'];
+    $transaction->$field_name = $form_state['values'][$field_name];
+  }
+
+  field_attach_submit('userpoints_transaction', $transaction, $form, $form_state);
+
   // Set common properties and save the transaction.
   $transaction
     ->setTid($form_state['values']['tid'])
+    ->setPoints($form_state['values']['points'])
     ->setOperation($form_state['values']['operation'])
     ->setReference($form_state['values']['reference'])
     ->setDescription($form_state['values']['description'])
diff --git a/userpoints.module b/userpoints.module
index b8156a7..cf19c85 100644
--- a/userpoints.module
+++ b/userpoints.module
@@ -368,10 +368,8 @@ function userpoints_admin_access_transaction_pending(UserpointsTransaction $tran
  *   is logged in.
  */
 function userpoints_access_my_points($account = NULL) {
-  global $user;
-
-  if ($account && $user->uid != $account->uid) {
-    return userpoints_admin_access('edit');
+  if (userpoints_admin_access('edit')) {
+    return TRUE;
   }
   return (user_access('view userpoints') && user_is_logged_in()) || user_access('view own userpoints');
 }
@@ -799,6 +797,34 @@ function userpoints_field_extra_fields() {
       )
     )
   );
+  $extra['userpoints_transaction']['userpoints_transaction'] = array(
+    'form' => array(
+      'txn_points' => array(
+        'label' => t('Transaction user'),
+        'description' => t('The user of the transaction'),
+        'weight' => -20,
+      ),
+      'points' => array(
+        'label' => t('!Points', userpoints_translation()),
+        'description' => t('!Points amount of the transaction', userpoints_translation()),
+        'weight' => -15,
+      ),
+    ),
+  );
+
+  if (module_exists('taxonomy') && count(userpoints_get_categories()) > 1) {
+    $extra['userpoints_transaction']['userpoints_transaction']['form']['tid'] = array(
+      'label' => t('Category'),
+      'description' => t('Category of the transaction'),
+      'weight' => 0,
+    );
+  }
+
+  /*$extra['userpoints_transaction']['userpoints_transaction']['form']['additional_settings'] = array(
+    'label' => t('Additional settings'),
+    'description' => t('Additional settings'),
+    'weight' => 20,
+  );*/
   return $extra;
 }
 
@@ -1402,10 +1428,25 @@ function userpoints_entity_info() {
       'views controller class' => 'EntityDefaultViewsController',
       'base table' => 'userpoints_txn',
       'uri callback' => 'entity_class_uri',
-      'fieldable' => FALSE,
+      'fieldable' => TRUE,
       'entity keys' => array(
         'id' => 'txn_id',
       ),
+      'bundles' => array(
+        'userpoints_transaction' => array(
+          'label' => t('Default bundle'),
+          'admin' => array(
+            'path' => 'admin/config/people/userpoints',
+            'access arguments' => array('administer userpoints'),
+          ),
+        ),
+      ),
+      'view modes' => array(
+        'full' => array(
+          'label' => t('Full content'),
+          'custom settings' => FALSE,
+        ),
+      ),
     ),
   );
   return $return;
diff --git a/userpoints.pages.inc b/userpoints.pages.inc
index fd9be4d..2f9ec54 100644
--- a/userpoints.pages.inc
+++ b/userpoints.pages.inc
@@ -218,6 +218,7 @@ function userpoints_list_users($form, &$form_state, $tid = NULL) {
 function userpoints_view_transaction($transaction) {
   drupal_add_css(drupal_get_path('module', 'userpoints') . '/userpoints.css');
 
+  field_attach_prepare_view('userpoints_transaction', array($transaction->getTxnId() => $transaction), 'full');
   drupal_set_title(t('View transaction #@txn_id', array('@txn_id' => $transaction->txn_id)));
 
   $css_stati = array(
@@ -437,5 +438,8 @@ function userpoints_view_transaction($transaction) {
       '#attributes' => array('class' => array('userpoints-item-actions')),
     );
   }
+
+  $content += field_attach_view('userpoints_transaction', $transaction, 'full');
+
   return $content;
 }
\ No newline at end of file
diff --git a/userpoints.test b/userpoints.test
index adccfb2..20ea947 100644
--- a/userpoints.test
+++ b/userpoints.test
@@ -651,3 +651,58 @@ class UserpointsGrantPointsTestCase extends UserpointsBaseTestCase {
     }
   }
 }
+
+
+/**
+ * Tests for fields integration.
+ */
+class UserpointsFieldsTestCase extends UserpointsBaseTestCase {
+  /**
+   * Implements getInfo().
+   */
+  public static function getInfo() {
+    return array(
+      'name' => t('Userpoints fields.'),
+      'description' => t('Tests integration with fields.'),
+      'group' => t('Userpoints'),
+    );
+  }
+
+  /**
+   * Implements setUp().
+   */
+  function setUp() {
+    parent::setUp('userpoints');
+  }
+
+  function testSingleField() {
+    // Create an administrator account.
+    $admin = $this->drupalCreateUser(array('administer userpoints'));
+    $this->drupalLogin($admin);
+
+    // Create a new field.
+    $edit = array(
+      'fields[_add_new_field][label]' => $this->randomName(),
+      'fields[_add_new_field][field_name]' => $name = strtolower($this->randomName()),
+      'fields[_add_new_field][type]' => 'text',
+      'fields[_add_new_field][widget_type]' => 'text_textfield',
+    );
+    $this->drupalPost('admin/config/people/userpoints/fields', $edit, t('Save'));
+    $this->drupalPost(NULL, array(), t('Save field settings'));
+    $this->drupalPost(NULL, array(), t('Save settings'));
+
+    // Create transaction.
+    $message = array(
+      'txn_user' => $admin->name,
+      'points' => 10,
+      'field_' . $name . '[' . LANGUAGE_NONE . '][0][value]' => $this->randomName(50),
+    );
+    $this->drupalPost('admin/config/people/userpoints/add', $message, t('Save'));
+
+    // Check message.
+    $this->drupalGet('myuserpoints');
+    $this->clickLink(t('view'));
+
+    $this->assertText($message['field_' . $name . '[' . LANGUAGE_NONE . '][0][value]'], t('Content of new field is displayed.'));
+  }
+}
