diff --git a/userpoints.module b/userpoints.module
index 1a53d88..b4cdf15 100644
--- a/userpoints.module
+++ b/userpoints.module
@@ -221,7 +221,7 @@ function userpoints_menu() {
     'title arguments' => userpoints_translation(),
     'page callback' => 'drupal_get_form',
     'page arguments' => array('userpoints_list_transactions'),
-    'access callback' => 'userpoints_access_my_points',
+    'access callback' => 'userpoints_access_transactions',
     'file' => 'userpoints.pages.inc',
     'type' => MENU_NORMAL_ITEM,
     'menu_name' => 'user-menu',
@@ -232,7 +232,7 @@ function userpoints_menu() {
     'title arguments' => userpoints_translation(),
     'page callback' => 'drupal_get_form',
     'page arguments' => array('userpoints_list_transactions', NULL, 1),
-    'access callback' => 'userpoints_access_my_points',
+    'access callback' => 'userpoints_access_transactions',
     'file' => 'userpoints.pages.inc',
     'type' => MENU_NORMAL_ITEM,
     'menu_name' => 'user-menu',
@@ -243,7 +243,7 @@ function userpoints_menu() {
     'title arguments' => userpoints_translation(),
     'page callback' => 'drupal_get_form',
     'page arguments' => array('userpoints_list_transactions', 1),
-    'access callback' => 'userpoints_access_my_points',
+    'access callback' => 'userpoints_access_transactions',
     'access arguments' => array(1),
     'file' => 'userpoints.pages.inc',
     'type' => MENU_LOCAL_TASK,
@@ -359,9 +359,13 @@ function userpoints_admin_access_transaction_pending(UserpointsTransaction $tran
 /**
  * Checks if user can access their points - used via hook_menu().
  *
+ * @param $account
+ *   (optional) The account to check; if not given use currently
+ *   logged in user.
+ *
  * @return
- *   TRUE if user has permissions to view userpoints and if the user is logged
- *   in.
+ *   TRUE if user has permissions to view userpoints and if the user
+ *   is logged in.
  */
 function userpoints_access_my_points($account = NULL) {
   global $user;
@@ -373,6 +377,33 @@ function userpoints_access_my_points($account = NULL) {
 }
 
 /**
+ * Checks if a user has access to own or other users transactions history.
+ *
+ * The user must be logged in to have access both, own or other users
+ * transactions.
+ *
+ * @param $account
+ *   (optional) The account to check; if not given use currently
+ *   logged in user.
+ *
+ * @return
+ *   TRUE if the user has access to view the transactions of the requested
+ *   account and FALSE otherwise.
+ */
+function userpoints_access_transactions($account = NULL) {
+  global $user;
+
+  // Other users accounts.
+  if ($account && $user->uid != $account->uid) {
+    return (user_access('view userpoints transactions') || userpoints_admin_access('edit')) && user_is_logged_in();
+  }
+
+  // Own user account.
+  $user_has_transactions_permissions = user_access('view own userpoints transactions') || user_access('view userpoints transactions') ? TRUE : FALSE;
+  return ($user_has_transactions_permissions || userpoints_admin_access('edit')) && user_is_logged_in();
+}
+
+/**
  * Checks if a user has access to a transaction.
  *
  * @return
@@ -389,11 +420,19 @@ function userpoints_permission() {
   return array(
     'view own userpoints' => array(
       'title' => t('View own !points', userpoints_translation()),
-      'description' => t('Allows to view own !points, including own !point transactions.', userpoints_translation()),
+      'description' => t('Allows to view own !points.', userpoints_translation()),
     ),
     'view userpoints' => array(
       'title' => t('View all !points', userpoints_translation()),
-      'description' => t('Allows to view the !points of other users, but not the transactions.', userpoints_translation()),
+      'description' => t('Allows to view the !points of other users.', userpoints_translation()),
+    ),
+    'view own userpoints transactions' => array(
+      'title' => t('View own transactions'),
+      'description' => t('Allows to view own userpoints transactions history.', userpoints_translation()),
+    ),
+    'view userpoints transactions' => array(
+      'title' => t('View all transactions'),
+      'description' => t('Allows to view the userpoints transactions history of other users.', userpoints_translation()),
     ),
     'add userpoints' => array(
       'title' => t('Add new !point transactions', userpoints_translation()),
@@ -812,7 +851,7 @@ function userpoints_get_points_list($account = NULL) {
   }
 
   $links = array();
-  if (userpoints_access_my_points($account)) {
+  if (userpoints_access_transactions($account)) {
     $links['userpoints-view'] = array(
       'title' => t('View !points transactions', userpoints_translation()),
       'href' => $user->uid == $account->uid ? 'myuserpoints' : 'user/' . $account->uid . '/points',
diff --git a/userpoints.test b/userpoints.test
index c16366f..4a59c95 100644
--- a/userpoints.test
+++ b/userpoints.test
@@ -363,6 +363,101 @@ class UserpointsAPITestCase extends UserpointsBaseTestCase {
     $this->drupalGet('admin/config/people/userpoints');
     $this->assertResponse(403, t("Successful verified that a user without admin userpoints permissions can not access the admin interface."));
   }
+
+  /**
+   * Test user userpoints transactions permissions
+   *
+   * Creates users with different permissions on userpoints transactions, and
+   * check both, own and other users accounts access to the userpoints
+   * transaction history.
+   */
+  function testUserTransactionPermissions() {
+    // Sets default points and creates default test users.
+    $points = 10;
+    $view_own_transactions_user = $this->DrupalCreateUser(array('view own userpoints transactions'));
+    $view_all_transactions_user = $this->DrupalCreateUser(array('view userpoints transactions'));
+
+    // Login with the admin user.
+    $this->drupalLogin($this->admin_user);
+    // Add points to every user created.
+    $this->addPoints($points, $this->non_admin_user);
+    $this->addPoints($points, $view_own_transactions_user);
+    $this->addPoints($points, $view_all_transactions_user);
+
+    // Login with no permissions.
+    $this->drupalLogin($this->non_admin_user);
+    // Checking own account.
+    $this->drupalGet('myuserpoints');
+    $this->assertResponse(403, t("Successful verified that a user without view own userpoints transactions permission can not access to myuserpoints."));
+    // Checking against other's user account.
+    $this->drupalGet('user/'.$view_all_transactions_user->uid.'/points');
+    $this->assertResponse(403, t("Successful verified that a user without view own userpoints transactions permission can not access to others user points transactions."));
+
+    // Login as view own userpoints transactions.
+    $this->drupalLogin($view_own_transactions_user);
+    // Checking own account.
+    $this->drupalGet('myuserpoints');
+    $this->assertResponse(200, t("Successful verified that a user with view own userpoints transactions permission can access to myuserpoints."));
+    $this->drupalGet('user');
+    // Checking against other's user account.
+    $this->drupalGet('user/'.$view_all_transactions_user->uid.'/points');
+    $this->assertResponse(403, t("Successful verified that a user with view own userpoints transactions permission can not access to others user points transactions."));
+
+    // Login as view userpoints transactions.
+    $this->drupalLogin($view_all_transactions_user);
+    // Checking own account.
+    $this->drupalGet('myuserpoints');
+    $this->assertResponse(200, t("Successful verified that a user with view userpoints transactions can access to myuserpoints."));
+    $this->drupalGet('user');
+    // Checking against other's user account.
+    $this->drupalGet('user/'.$this->non_admin_user->uid.'/points');
+    $this->assertResponse(200, t("Successful verified that a user with view userpoints transactions permission can access to others user points transactions."));
+  }
+
+  /**
+   * Test user transactions links permissions on users profile.
+   *
+   * Creates users with different permissions on userpoints, userpoints
+   * transactions and access user profiles, and check both, own and other
+   * users accounts access to the userpoints transaction history links.
+   */
+  function testUserTransactionLinksPermissions() {
+    // Sets default points and creates default test users
+    $points = 10;
+    $view_own_transactions_links_user = $this->DrupalCreateUser(array('access user profiles', 'view own userpoints', 'view own userpoints transactions'));
+    $view_all_transactions_links_user = $this->DrupalCreateUser(array('access user profiles', 'view userpoints', 'view userpoints transactions'));
+
+    // Login with the admin user.
+    $this->drupalLogin($this->admin_user);
+    // Add points to every user created.
+    $this->addPoints($points, $this->non_admin_user);
+    $this->addPoints($points, $view_own_transactions_links_user);
+    $this->addPoints($points, $view_all_transactions_links_user);
+
+    // Login with no permissions.
+    $this->drupalLogin($this->non_admin_user);
+    // Checking own user account.
+    $this->drupalGet('user');
+    $this->assertNoLink(t('View !points transactions', userpoints_translation()),t("Successful verified that a user without view own userpoints transactions permission can not access to view points transaction link."));
+
+    // Login as access user profiles, view own userpoints, view own userpoints transactions.
+    $this->drupalLogin($view_own_transactions_links_user);
+    // Checking own user account.
+    $this->drupalGet('user');
+    $this->assertLink(t('View !points transactions', userpoints_translation()), 0, t("Successful verified that a user with view own userpoints transactions permission and view own userpoints permission can access to view own points transaction link."));
+    // Checking others user accounts.
+    $this->drupalGet('user/'.$view_all_transactions_links_user->uid);
+    $this->assertNoLink(t('View !points transactions', userpoints_translation()), t("Successful verified that a user with view own userpoints transactions permission and view own userpoints permission can not access to view points transaction link from other user."));
+
+    // Login as access user profiles, view userpoints, view userpoints transactions.
+    $this->drupalLogin($view_all_transactions_links_user);
+    // Checking own user account.
+    $this->drupalGet('user');
+    $this->assertLink(t('View !points transactions', userpoints_translation()), 0, t("Successful verified that a user with view userpoints transactions permission and view userpoints permission can access to view points transaction link."));
+    // Checking others user accounts.
+    $this->drupalGet('user/'.$view_own_transactions_links_user->uid);
+    $this->assertLink(t('View !points transactions', userpoints_translation()), 0, t("Successful verified that a user with view userpoints transactions permission and view userpoints permission can access to view points transaction link from other user."));
+  }
 }
 
 /**
diff --git a/userpoints_rules/userpoints_rules.test b/userpoints_rules/userpoints_rules.test
index a116749..5381bb3 100644
--- a/userpoints_rules/userpoints_rules.test
+++ b/userpoints_rules/userpoints_rules.test
@@ -28,7 +28,7 @@ class UserpointsRulesTestCase extends DrupalWebTestCase {
    * Test the rules actions exposed by this module.
    */
   public function testActions() {
-    $user = $this->drupalCreateUser(array('view userpoints'));
+    $user = $this->drupalCreateUser(array('view userpoints', 'view userpoints transactions'));
 
     $this->createActionRules();
 
