From c1bcf1f8077b41eff0245f3398cb7675fda8690e Mon Sep 17 00:00:00 2001
From: Sascha Grossenbacher <saschagros@gmail.com>
Date: Thu, 24 Mar 2011 12:19:59 +0100
Subject: [PATCH] Issue #990422 by Berdir: Renamed user_relationships_api module to user_relationships.

---
 README.txt                                         |   21 +-
 tests/user_relationships.api.test                  |  266 +++++++
 .../user_relationship_blocks.info                  |    2 +-
 .../user_relationship_blocks.install               |    2 +-
 .../user_relationship_defaults.info                |    2 +-
 .../user_relationship_elaborations.info            |    2 +-
 .../user_relationship_implications.info            |    2 +-
 .../user_relationship_invites.info                 |    2 +-
 .../user_relationship_invites.module               |    2 +-
 .../user_relationship_mailer.info                  |    2 +-
 .../user_relationship_mailer.module                |    2 +-
 .../user_relationship_node_access.info             |    2 +-
 .../user_relationship_privatemsg.info              |    2 +-
 .../user_relationship_privatemsg.test              |    2 +-
 .../user_relationship_service.inc                  |    2 -
 .../user_relationship_service.info                 |    2 +-
 .../user_relationship_views.info                   |    2 +-
 user_relationships.activity.inc                    |   56 ++
 user_relationships.api.php                         |  131 ++++
 user_relationships.author-pane.inc                 |  100 +++
 user_relationships.info                            |    5 +
 user_relationships.install                         |   78 ++
 user_relationships.module                          |  743 ++++++++++++++++++++
 user_relationships_api/README.txt                  |   25 -
 .../tests/user_relationships_api.api.test          |  266 -------
 .../user_relationships_api.activity.inc            |   56 --
 .../user_relationships_api.api.inc                 |  525 --------------
 .../user_relationships_api.api.php                 |  131 ----
 .../user_relationships_api.author-pane.inc         |  100 ---
 user_relationships_api/user_relationships_api.info |    5 -
 .../user_relationships_api.install                 |   78 --
 .../user_relationships_api.module                  |  289 --------
 .../user_relationships_panels_visibility.info      |    2 +-
 .../user_relationships_rules.info                  |    2 +-
 .../user_relationships_ui.actions.inc              |    4 +-
 .../user_relationships_ui.admin.inc                |    4 +-
 user_relationships_ui/user_relationships_ui.info   |    9 +-
 .../user_relationships_ui.install                  |   24 +
 user_relationships_ui/user_relationships_ui.module |    4 +-
 39 files changed, 1445 insertions(+), 1509 deletions(-)
 create mode 100644 tests/user_relationships.api.test
 create mode 100644 user_relationships.activity.inc
 create mode 100644 user_relationships.api.php
 create mode 100644 user_relationships.author-pane.inc
 create mode 100644 user_relationships.info
 create mode 100644 user_relationships.install
 create mode 100644 user_relationships.module
 delete mode 100644 user_relationships_api/README.txt
 delete mode 100644 user_relationships_api/tests/user_relationships_api.api.test
 delete mode 100644 user_relationships_api/user_relationships_api.activity.inc
 delete mode 100644 user_relationships_api/user_relationships_api.api.inc
 delete mode 100644 user_relationships_api/user_relationships_api.api.php
 delete mode 100644 user_relationships_api/user_relationships_api.author-pane.inc
 delete mode 100644 user_relationships_api/user_relationships_api.info
 delete mode 100644 user_relationships_api/user_relationships_api.install
 delete mode 100644 user_relationships_api/user_relationships_api.module

diff --git a/README.txt b/README.txt
index 13ba342..f94bf58 100644
--- a/README.txt
+++ b/README.txt
@@ -33,7 +33,7 @@ Included Modules
 NOTE: Please read the individual README.txt files in each module's directory for a more in-depth
       explanation of the module and its functionality.
 
-User Relationships API:
+User Relationships:
   This is the purely functional portion. It will only provide an API that other modules can
   use to control relationships
 
@@ -54,7 +54,24 @@ User Relationship Implications:
 User Relationships Mailer:
   A helper module that will send email notifications about relationship actions
 
-
+Developers
+------------
+There are a number of API functions and corresponding hooks. The hooks are documented in user_relationships.api.php.
+The API functions are all defined in user_relationships.module. I've provded a list below for quick lookup, but you'll
+need to see the documentation in that file for a deeper explanaition.
+
+  Functions
+  =========
+  user_relationships_type_load($param = array())
+  user_relationships_types_load($reset = NULL)
+  user_relationships_type_save($rtype)
+  user_relationships_type_delete($rtid)
+
+  user_relationships_load($param = array(), $options = array(), $reset = FALSE)
+  user_relationships_translate_user_info($relationship)
+  user_relationships_request_relationship($requester, $requestee, $type, $approved = FALSE)
+  user_relationships_save_relationship($relationship, $op = 'request')
+  user_relationships_delete_relationship($relationship, &$deleted_by, $op = 'remove')
 
 Credits
 -------
diff --git a/tests/user_relationships.api.test b/tests/user_relationships.api.test
new file mode 100644
index 0000000..36c9182
--- /dev/null
+++ b/tests/user_relationships.api.test
@@ -0,0 +1,266 @@
+<?php
+
+/**
+ * @file
+ * User Relationships API testcase
+ * @author Alex Karshakevich http://drupal.org/user/183217
+ */
+class UserRelationshipsTestCase extends DrupalWebTestCase {
+  //test users
+  var $users = array();
+  //test relationship types
+  var $rtypes = array();
+
+  /**
+   * Implements getInfo().
+   */
+  function getInfo() {
+    return array(
+      'name' => t('User Relationships API implementation'),
+      'description' => t('Checks correctness of some UR API functions.'),
+      'group' => t('User Relationships'),
+    );
+  }
+
+  /**
+   * Enable modules.
+   */
+  function setUp() {
+    parent::setUp('user_relationships');
+    $this->users = array();
+    $this->rtypes = array();
+    //important, reset cache of rel types between runs
+    user_relationships_types_load(TRUE);
+    //create test users
+//    $user = $this->drupalCreateUser();
+//    $users[$user->uid] = $user;
+//    $user = $this->drupalCreateUser();
+//    $users[$user->uid] = $user;
+//    $user = $this->drupalCreateUser();
+//    $users[$user->uid] = $user;
+    //create relationships
+    $rtype = new StdClass;
+    $rtype->name = 'oneway';
+    $rtype->plural_name = 'oneways';
+    $rtype->is_oneway = TRUE;
+    $rtype->requires_approval = FALSE;
+    $rtype->expires_val = 0;
+    user_relationships_type_save($rtype);
+    $this->rtypes['oneway'] = $rtype;
+
+    unset($rtype);
+    $rtype = new StdClass;
+    $rtype->name = 'twoway';
+    $rtype->plural_name = 'twoways';
+    $rtype->is_oneway = FALSE;
+    $rtype->requires_approval = FALSE;
+    $rtype->expires_val = 0;
+    user_relationships_type_save($rtype);
+    $this->rtypes['twoway'] = $rtype;
+
+    unset($rtype);
+    $rtype = new StdClass;
+    $rtype->name = 'approval';
+    $rtype->plural_name = 'approvals';
+    $rtype->is_oneway = FALSE;
+    $rtype->requires_approval = TRUE;
+    $rtype->expires_val = 0;
+    user_relationships_type_save($rtype);
+    $this->rtypes['approval'] = $rtype;
+
+    unset($rtype);
+    $rtype = new StdClass;
+    $rtype->name = 'approval-oneway';
+    $rtype->plural_name = 'approvals-oneway';
+    $rtype->is_oneway = TRUE;
+    $rtype->requires_approval = TRUE;
+    $rtype->expires_val = 0;
+    user_relationships_type_save($rtype);
+    $this->rtypes['approval-oneway'] = $rtype;
+
+    //#348025 reciprocal one-way relationships
+    unset($rtype);
+    $rtype = new StdClass;
+    $rtype->name = 'approval-reciprocal';
+    $rtype->plural_name = 'approvals-reciprocal';
+    $rtype->is_oneway = TRUE;
+    $rtype->is_reciprocal = TRUE;
+    $rtype->requires_approval = TRUE;
+    $rtype->expires_val = 0;
+    user_relationships_type_save($rtype);
+    $this->rtypes['approval-reciprocal'] = $rtype;
+
+    user_relationships_types_load(TRUE);
+  }
+
+  function tearDown() {
+    unset($this->rtypes);
+    parent::tearDown();
+  }
+
+  //Test #479486 duplicate records for two-way relationships
+  function testUserRelationshipsLoadDuplicates() {
+    $u1 = $this->drupalCreateUser();
+    $u2 = $this->drupalCreateUser();
+    $u3 = $this->drupalCreateUser();
+    $u4 = $this->drupalCreateUser();
+    //create relationships
+    user_relationships_request_relationship($u1, $u2, $this->rtypes['oneway']->rtid, FALSE);
+    user_relationships_request_relationship($u1, $u3, $this->rtypes['oneway']->rtid, FALSE);
+//    user_relationships_request_relationship($u3, $u1, $this->rtypes['oneway']->rtid, FALSE);//this is a no-op
+
+    user_relationships_request_relationship($u1, $u2, $this->rtypes['twoway']->rtid, FALSE);
+    user_relationships_request_relationship($u1, $u3, $this->rtypes['twoway']->rtid, FALSE);
+    user_relationships_request_relationship($u4, $u1, $this->rtypes['twoway']->rtid, FALSE);
+    //test between
+    $result = user_relationships_load(array('between' => array($u1->uid, $u2->uid)));
+    $this->assertEqual(count($result), 2);
+    $result = user_relationships_load(array('between' => array($u1->uid, $u2->uid)), array('include_twoway_reverse' => 1));
+    $this->assertEqual(count($result), 2);
+    //sort by rtid and here reverse relationships will show up
+    $result = user_relationships_load(array('between' => array($u1->uid, $u2->uid)), array('sort' => 'rtid'));
+    $this->assertEqual(count($result[$this->rtypes['oneway']->rtid]), 1);
+    $this->assertEqual(count($result[$this->rtypes['twoway']->rtid]), 1);
+    $result = user_relationships_load(array('between' => array($u1->uid, $u2->uid)), array('sort' => 'rtid', 'include_twoway_reverse' => 1));
+    $this->assertEqual(count($result[$this->rtypes['oneway']->rtid]), 1);
+    $this->assertEqual(count($result[$this->rtypes['twoway']->rtid]), 2);
+
+    //test user
+    $result = user_relationships_load(array('user' => $u1->uid));
+    $this->assertEqual(count($result), 5);
+    $result = user_relationships_load(array('user' => $u1->uid), array('include_twoway_reverse' => 1));
+    $this->assertEqual(count($result), 5);
+    $result = user_relationships_load(array('user' => $u1->uid), array('sort' => 'rtid'));
+    $this->assertEqual(count($result[$this->rtypes['oneway']->rtid]), 2);
+    $this->assertEqual(count($result[$this->rtypes['twoway']->rtid]), 3);
+    $result = user_relationships_load(array('user' => $u1->uid), array('sort' => 'rtid', 'include_twoway_reverse' => 1));
+    $this->assertEqual(count($result[$this->rtypes['oneway']->rtid]), 2);
+    $this->assertEqual(count($result[$this->rtypes['twoway']->rtid]), 6);
+
+    //test rtid
+    $result = user_relationships_load(array('rtid' => $this->rtypes['twoway']->rtid));
+    $this->assertEqual(count($result), 3);
+    $result = user_relationships_load(array('rtid' => $this->rtypes['twoway']->rtid), array('include_twoway_reverse' => 1));
+    $this->assertEqual(count($result), 3);
+    $result = user_relationships_load(array('rtid' => $this->rtypes['twoway']->rtid), array('sort' => 'rtid'));
+    $this->assertFalse(isset($result[$this->rtypes['oneway']->rtid]));
+    $this->assertEqual(count($result[$this->rtypes['twoway']->rtid]), 3);
+    $result = user_relationships_load(array('rtid' => $this->rtypes['twoway']->rtid), array('sort' => 'rtid', 'include_twoway_reverse' => 1));
+    $this->assertFalse(isset($result[$this->rtypes['oneway']->rtid]));
+    $this->assertEqual(count($result[$this->rtypes['twoway']->rtid]), 6);
+
+    //test approved
+    //load pending records
+    $this->assertTrue(user_relationships_can_request($u1, $this->rtypes['approval-oneway']));
+    user_relationships_request_relationship($u1, $u2, $this->rtypes['approval-oneway']->rtid, FALSE);
+    $this->assertTrue(user_relationships_can_request($u3, $this->rtypes['approval-oneway']));
+    user_relationships_request_relationship($u3, $u1, $this->rtypes['approval-oneway']->rtid, FALSE);
+
+    $result = user_relationships_load(array('approved' => 1));
+    $this->assertEqual(count($result), 5);
+    $result = user_relationships_load(array('approved' => 1), array('include_twoway_reverse' => 1));
+    $this->assertEqual(count($result), 5);
+    $result = user_relationships_load(array('approved' => 1), array('sort' => 'rtid'));
+    $this->assertEqual(count($result[$this->rtypes['oneway']->rtid]), 2);
+    $this->assertEqual(count($result[$this->rtypes['twoway']->rtid]), 3);
+    $this->assertFalse(isset($result[$this->rtypes['approval-oneway']->rtid]));
+    $result = user_relationships_load(array('approved' => 1), array('sort' => 'rtid', 'include_twoway_reverse' => 1));
+    $this->assertEqual(count($result[$this->rtypes['oneway']->rtid]), 2);
+    $this->assertEqual(count($result[$this->rtypes['twoway']->rtid]), 6);
+    $this->assertFalse(isset($result[$this->rtypes['approval-oneway']->rtid]));
+    //test pending
+    $result = user_relationships_load(array('approved' => 0));
+    $this->assertEqual(count($result), 2);
+    $result = user_relationships_load(array('approved' => 0), array('include_twoway_reverse' => 1));
+    $this->assertEqual(count($result), 2);
+    $result = user_relationships_load(array('approved' => 0), array('sort' => 'rtid'));
+    $this->assertEqual(count($result), 1);
+    $this->assertEqual(count($result[$this->rtypes['approval-oneway']->rtid]), 2);
+    $result = user_relationships_load(array('approved' => 0), array('sort' => 'rtid', 'include_twoway_reverse' => 1));
+    $this->assertEqual(count($result), 1);
+    $this->assertEqual(count($result[$this->rtypes['approval-oneway']->rtid]), 2);
+    //test user and pending
+    $result = user_relationships_load(array('user' => $u1->uid, 'approved' => 0));
+    $this->assertEqual(count($result), 2);
+    $result = user_relationships_load(array('user' => $u1->uid, 'approved' => 0), array('include_twoway_reverse' => 1));
+    $this->assertEqual(count($result), 2);
+    $result = user_relationships_load(array('requester_id' => $u1->uid, 'approved' => 0));
+    $this->assertEqual(count($result), 1);
+    $result = user_relationships_load(array('requester_id' => $u1->uid, 'approved' => 0), array('include_twoway_reverse' => 1));
+    $this->assertEqual(count($result), 1);
+    //test user and approved
+    $result = user_relationships_load(array('user' => $u1->uid, 'approved' => 1));
+    $this->assertEqual(count($result), 5);
+    $result = user_relationships_load(array('user' => $u1->uid, 'approved' => 1), array('include_twoway_reverse' => 1));
+    $this->assertEqual(count($result), 5);
+    $result = user_relationships_load(array('requester_id' => $u1->uid, 'approved' => 1));
+    $this->assertEqual(count($result), 5);
+    $result = user_relationships_load(array('requester_id' => $u1->uid, 'approved' => 1), array('include_twoway_reverse' => 1));
+    $this->assertEqual(count($result), 5);
+    $result = user_relationships_load(array('requestee_id' => $u1->uid, 'approved' => 1));
+    $this->assertEqual(count($result), 3);
+    $result = user_relationships_load(array('requestee_id' => $u1->uid, 'approved' => 1), array('include_twoway_reverse' => 1));
+    $this->assertEqual(count($result), 3);
+
+    //add more pending records
+    $this->assertTrue(user_relationships_can_request($u1, $this->rtypes['approval']));
+    $this->assertTrue(user_relationships_can_request($u3, $this->rtypes['approval']));
+    $this->assertTrue(user_relationships_can_request($u4, $this->rtypes['approval']));
+    $this->assertTrue(user_relationships_can_request($u4, $this->rtypes['approval-oneway']));
+    user_relationships_request_relationship($u4, $u2, $this->rtypes['approval-oneway']->rtid, FALSE);
+    user_relationships_request_relationship($u3, $u4, $this->rtypes['approval-oneway']->rtid, FALSE);
+    user_relationships_request_relationship($u1, $u2, $this->rtypes['approval']->rtid, FALSE);
+    user_relationships_request_relationship($u4, $u2, $this->rtypes['approval']->rtid, FALSE);
+    user_relationships_request_relationship($u3, $u4, $this->rtypes['approval']->rtid, FALSE);
+    user_relationships_request_relationship($u3, $u1, $this->rtypes['approval']->rtid, FALSE);
+
+    //test pending and requester
+    $result = user_relationships_load(array('requester_id' => $u3->uid, 'approved' => 0));
+    $this->assertEqual(count($result), 4);
+    $result = user_relationships_load(array('requester_id' => $u3->uid, 'approved' => 0), array('include_twoway_reverse' => 1));
+    $this->assertEqual(count($result), 4);
+    //test pending and requestee
+    $result = user_relationships_load(array('requestee_id' => $u2->uid, 'approved' => 0));
+    $this->assertEqual(count($result), 4);
+    $result = user_relationships_load(array('requestee_id' => $u2->uid, 'approved' => 0), array('include_twoway_reverse' => 1));
+    $this->assertEqual(count($result), 4);
+    //test pending and user
+    $result = user_relationships_load(array('user' => $u3->uid, 'approved' => 0));
+    $this->assertEqual(count($result), 4);
+    $result = user_relationships_load(array('user' => $u3->uid, 'approved' => 0), array('include_twoway_reverse' => 1));
+    $this->assertEqual(count($result), 4);
+    $result = user_relationships_load(array('user' => $u2->uid, 'approved' => 0));
+    $this->assertEqual(count($result), 4);
+    $result = user_relationships_load(array('user' => $u2->uid, 'approved' => 0), array('include_twoway_reverse' => 1));
+    $this->assertEqual(count($result), 4);
+    //test between and pending
+    $result = user_relationships_load(array('between' => array($u3->uid, $u1->uid), 'approved' => 0));
+    $this->assertEqual(count($result), 2);
+    $result = user_relationships_load(array('between' => array($u3->uid, $u1->uid), 'approved' => 0), array('include_twoway_reverse' => 1));
+    $this->assertEqual(count($result), 2);
+    $result = user_relationships_load(array('between' => array($u3->uid, $u4->uid), 'approved' => 0));
+    $this->assertEqual(count($result), 2);
+    $result = user_relationships_load(array('between' => array($u3->uid, $u4->uid), 'approved' => 0), array('include_twoway_reverse' => 1));
+    $this->assertEqual(count($result), 2);
+    //#520392 test just between
+    $result = user_relationships_load(array('between' => array($u3->uid, $u1->uid)));
+    $this->assertEqual(count($result), 4);
+    $result = user_relationships_load(array('between' => array($u3->uid, $u1->uid)), array('include_twoway_reverse' => 1));
+    $this->assertEqual(count($result), 4);
+    $result = user_relationships_load(array('between' => array($u1->uid, $u3->uid)));
+    $this->assertEqual(count($result), 4);
+    $result = user_relationships_load(array('between' => array($u1->uid, $u3->uid)), array('include_twoway_reverse' => 1));
+    $this->assertEqual(count($result), 4);
+  }
+
+  //Test #348025 that user_relationship_load_types will load is_reciprocal flag
+  function testUserRelationshipsReciprocalTypes() {
+    $rtypes = user_relationships_types_load();
+    $rtype = $rtypes[$this->rtypes['approval-reciprocal']->rtid];
+    $this->assertTrue($rtype->is_reciprocal);
+    $rtype = $rtypes[$this->rtypes['approval-oneway']->rtid];
+    $this->assertFalse($rtype->is_reciprocal);
+    $rtype = $rtypes[$this->rtypes['approval']->rtid];
+    $this-> assertFalse($rtype->is_reciprocal);
+  }
+}
diff --git a/user_relationship_blocks/user_relationship_blocks.info b/user_relationship_blocks/user_relationship_blocks.info
index 953510c..54f1d9d 100644
--- a/user_relationship_blocks/user_relationship_blocks.info
+++ b/user_relationship_blocks/user_relationship_blocks.info
@@ -1,6 +1,6 @@
 name = UR-Blocks
 description = "Blocks that can be used with User Relationships"
-dependencies[] = user_relationships_api
+dependencies[] = user_relationships
 dependencies[] = user_relationships_ui
 package = "User Relationships"
 core = 7.x
diff --git a/user_relationship_blocks/user_relationship_blocks.install b/user_relationship_blocks/user_relationship_blocks.install
index 759268d..5dee3fc 100644
--- a/user_relationship_blocks/user_relationship_blocks.install
+++ b/user_relationship_blocks/user_relationship_blocks.install
@@ -26,7 +26,7 @@ function user_relationship_blocks_schema() {
 function user_relationship_blocks_install() {
 
   include_once(drupal_get_path('module', 'user_relationship_blocks') .'/user_relationship_blocks.module');
-  include_once(drupal_get_path('module', 'user_relationships_api') .'/user_relationships_api.module');
+  include_once(drupal_get_path('module', 'user_relationships') .'/user_relationships.module');
 
   _user_relationship_blocks_insert_defaults();
 }
diff --git a/user_relationship_defaults/user_relationship_defaults.info b/user_relationship_defaults/user_relationship_defaults.info
index 2c07916..0f80052 100644
--- a/user_relationship_defaults/user_relationship_defaults.info
+++ b/user_relationship_defaults/user_relationship_defaults.info
@@ -1,6 +1,6 @@
 name = UR-Defaults
 description = "Allows admins to specify relationships that are automatically created when a new user joins"
-dependencies[] = user_relationships_api
+dependencies[] = user_relationships
 dependencies[] = user_relationships_ui
 package = "User Relationships"
 core = 7.x
diff --git a/user_relationship_elaborations/user_relationship_elaborations.info b/user_relationship_elaborations/user_relationship_elaborations.info
index 139d346..b557bc0 100644
--- a/user_relationship_elaborations/user_relationship_elaborations.info
+++ b/user_relationship_elaborations/user_relationship_elaborations.info
@@ -1,6 +1,6 @@
 name = UR-Elaborations
 description = "Allow users to elaborate on their relationships with others"
-dependencies[] = user_relationships_api
+dependencies[] = user_relationships
 package = "User Relationships"
 core = 7.x
 files[]=user_relationship_elaborations.module
diff --git a/user_relationship_implications/user_relationship_implications.info b/user_relationship_implications/user_relationship_implications.info
index f40df9c..f635874 100644
--- a/user_relationship_implications/user_relationship_implications.info
+++ b/user_relationship_implications/user_relationship_implications.info
@@ -1,6 +1,6 @@
 name = UR-Implications
 description = "Lets admins create implied relationships. For example 'Manager implies Coworker'"
-dependencies[] = user_relationships_api
+dependencies[] = user_relationships
 dependencies[] = user_relationships_ui
 package = "User Relationships"
 core = 7.x
diff --git a/user_relationship_invites/user_relationship_invites.info b/user_relationship_invites/user_relationship_invites.info
index bb0254a..6ada1cc 100644
--- a/user_relationship_invites/user_relationship_invites.info
+++ b/user_relationship_invites/user_relationship_invites.info
@@ -1,6 +1,6 @@
 name = UR-Invite
 description = "Gives users the option of specifying a relationship when inviting new users"
-dependencies[] = user_relationships_api
+dependencies[] = user_relationships
 dependencies[] = user_relationships_ui
 dependencies[] = invite
 core = 6.x
diff --git a/user_relationship_invites/user_relationship_invites.module b/user_relationship_invites/user_relationship_invites.module
index d01322f..e12d2fb 100644
--- a/user_relationship_invites/user_relationship_invites.module
+++ b/user_relationship_invites/user_relationship_invites.module
@@ -69,7 +69,7 @@ function user_relationship_invites_invite($op, $args) {
  * Implementation of hook_user().
 */
 function user_relationship_invites_user($op, &$edit, &$account, $category = NULL) {
-  if (!(module_exists('invite') && module_exists('user_relationships_api'))) {
+  if (!(module_exists('invite') && module_exists('user_relationships'))) {
     return;
   }
 
diff --git a/user_relationship_mailer/user_relationship_mailer.info b/user_relationship_mailer/user_relationship_mailer.info
index 2cd2801..3bbd4a0 100644
--- a/user_relationship_mailer/user_relationship_mailer.info
+++ b/user_relationship_mailer/user_relationship_mailer.info
@@ -1,6 +1,6 @@
 name = UR-Mailer
 description = "Gives the option to mail users when about relationship events (request, remove, disapprove, approve, etc)"
-dependencies[] = user_relationships_api
+dependencies[] = user_relationships
 dependencies[] = user_relationships_ui
 package = "User Relationships"
 core = 7.x
diff --git a/user_relationship_mailer/user_relationship_mailer.module b/user_relationship_mailer/user_relationship_mailer.module
index 477b509..d423292 100644
--- a/user_relationship_mailer/user_relationship_mailer.module
+++ b/user_relationship_mailer/user_relationship_mailer.module
@@ -21,7 +21,7 @@ function user_relationship_mailer_init() {
  *
  */
 function user_relationship_mailer_send_email($op, $relationship) {
-  //Cron runs may call this and not set $relationship to a valid object. Happens during request expiry in user_relationships_api_cron().
+  //Cron runs may call this and not set $relationship to a valid object. Happens during request expiry in user_relationships_cron().
   if (!isset($relationship->rtid)) {
     return;
   }
diff --git a/user_relationship_node_access/user_relationship_node_access.info b/user_relationship_node_access/user_relationship_node_access.info
index f3561eb..b668b5a 100644
--- a/user_relationship_node_access/user_relationship_node_access.info
+++ b/user_relationship_node_access/user_relationship_node_access.info
@@ -1,6 +1,6 @@
 name = UR-Node Access
 description = "Provides per node access control based on relationship to author"
-dependencies[] = user_relationships_api
+dependencies[] = user_relationships
 package = "User Relationships"
 core = 7.x
 files[]=user_relationship_node_access.module
\ No newline at end of file
diff --git a/user_relationship_privatemsg/user_relationship_privatemsg.info b/user_relationship_privatemsg/user_relationship_privatemsg.info
index 16c0200..efa85f7 100644
--- a/user_relationship_privatemsg/user_relationship_privatemsg.info
+++ b/user_relationship_privatemsg/user_relationship_privatemsg.info
@@ -3,7 +3,7 @@ description = Allows to send message to relationships.
 package = "User Relationships"
 core = 7.x
 dependencies[] = privatemsg
-dependencies[] = user_relationships_api
+dependencies[] = user_relationships
 dependencies[] = user_relationships_ui
 files[]=user_relationship_privatemsg.test
 
diff --git a/user_relationship_privatemsg/user_relationship_privatemsg.test b/user_relationship_privatemsg/user_relationship_privatemsg.test
index 3e8aaaa..35a21fa 100644
--- a/user_relationship_privatemsg/user_relationship_privatemsg.test
+++ b/user_relationship_privatemsg/user_relationship_privatemsg.test
@@ -25,7 +25,7 @@ class UserRelationshipsPrivatemsgRecipientTestCase extends DrupalWebTestCase {
    * Enable required modules.
    */
   function setUp() {
-    return parent::setUp('privatemsg', 'user_relationships_api', 'user_relationships_ui', 'user_relationship_privatemsg');
+    return parent::setUp('privatemsg', 'user_relationships', 'user_relationships_ui', 'user_relationship_privatemsg');
   }
 
   /**
diff --git a/user_relationship_service/user_relationship_service.inc b/user_relationship_service/user_relationship_service.inc
index ea85155..453642a 100644
--- a/user_relationship_service/user_relationship_service.inc
+++ b/user_relationship_service/user_relationship_service.inc
@@ -4,8 +4,6 @@
  * @author Written by scottgifford http://drupal.org/user/245699
  * @file Link general user relationship functionalities to services module.
  */
-// Loading the API functions if not already loaded
-module_load_include('inc', 'user_relationships_api', 'user_relationships.api');
 
 
 function user_relationship_service_types($version) {
diff --git a/user_relationship_service/user_relationship_service.info b/user_relationship_service/user_relationship_service.info
index 4a791da..f591530 100644
--- a/user_relationship_service/user_relationship_service.info
+++ b/user_relationship_service/user_relationship_service.info
@@ -2,5 +2,5 @@ name = UR-Services
 description = Provides functions of User Relationships to Services module.
 package = "User Relationships"
 dependencies[] = services
-dependencies[] = user_relationships_api
+dependencies[] = user_relationships
 core = 6.x
\ No newline at end of file
diff --git a/user_relationship_views/user_relationship_views.info b/user_relationship_views/user_relationship_views.info
index 8faaf96..9e3020f 100644
--- a/user_relationship_views/user_relationship_views.info
+++ b/user_relationship_views/user_relationship_views.info
@@ -1,6 +1,6 @@
 name = UR-Views
 description = "Integrates User Relationships with Views"
-dependencies[] = user_relationships_api
+dependencies[] = user_relationships
 dependencies[] = views
 core = 7.x
 package = "User Relationships"
diff --git a/user_relationships.activity.inc b/user_relationships.activity.inc
new file mode 100644
index 0000000..c9be645
--- /dev/null
+++ b/user_relationships.activity.inc
@@ -0,0 +1,56 @@
+<?php
+
+/**
+ * @file
+ * provides the activity implementation for user_relationships module
+ * @todo: Port to D7 once activity.module is available. Maybe move to separate
+ *        module.
+ */
+
+/**
+ * Implementation of hook_activity_grants().
+ */
+function user_relationships_activity_grants($activity) {
+  $relationships = array();
+  foreach (user_relationships_types_load() as $type_obj) {
+    $relationships["user_relationships_" . $type_obj->rtid] = array($activity->uid);
+  }
+  return $relationships;
+}
+
+/**
+ * hook_activity_access_grants().
+ */
+function user_relationships_activity_access_grants($account, $object = NULL, $type = NULL) {
+  // load up all the users relationships
+  $params = array(
+    'user' => $account->uid
+  );
+  $relationships = user_relationships_load($params);
+
+  $relationship_ids = array();
+  foreach ($relationships as $rid => $relationship) {
+    // is this approved yet?
+    $relationship_approved = (!$relationship->requires_approval || $relationship->approved);
+
+    if ($relationship_approved) {
+      // if the relationship is not one way, grant to the other uid
+      if (!$relationship->is_oneway) {
+        if ($relationship->requester_id == $account->uid) {
+          $relationship_ids["user_relationships_" . $relationship->rtid][] = $relationship->requestee_id;
+        }
+        else {
+          $relationship_ids["user_relationships_" . $relationship->rtid][] = $relationship->requester_id;
+        }
+      }
+      // if the relationship is one way, grant only if $account->uid == requester_id
+      elseif ($relationship->is_oneway) {
+        if ($relationship->requester_id == $account->uid) {
+          $relationship_ids["user_relationships_" . $relationship->rtid][] = $relationship->requestee_id;
+        }
+      }
+    }
+  }
+  return $relationship_ids;
+}
+
diff --git a/user_relationships.api.php b/user_relationships.api.php
new file mode 100644
index 0000000..31385e7
--- /dev/null
+++ b/user_relationships.api.php
@@ -0,0 +1,131 @@
+<?php
+
+/**
+ * @file
+ * This file documents all hooks for user_relationships.module
+ */
+
+/**
+ * Act when relationship types are loaded.
+ *
+ * @param $relationship_types_list
+ *   A list of relationship types, keyed by rtid.
+ *
+ * @see user_relationhips_type_load_multiple()
+ */
+function hook_user_relationships_type_load($relationship_types_list) {
+
+}
+
+/**
+ * This hook is executed before an existing or new relationship type is saved.
+ *
+ * @param $relationship_type
+ *   Relationship type object.
+ *
+ * @see user_relationships_type_save()
+ */
+function hook_user_relationships_type_presave($relationship_type) {
+
+}
+
+/**
+ * This hook is executed after an relationship type has been updated.
+ *
+ * @param $relationship_type
+ *   Relationship type object.
+ *
+ * @see user_relationships_type_save()
+ */
+function hook_user_relationships_type_update($relationship_type) {
+
+}
+
+/**
+ * This hook is executed after a new relationship type has been inserted.
+ *
+ * @param $relationship_type
+ *   Relationship type object.
+ *
+ * @see user_relationships_type_save()
+ */
+function hook_user_relationships_type_insert($relationship_type) {
+
+}
+
+/**
+ * This hook is executed after a relationship type has been deleted.
+ *
+ * @param $relationship_type
+ *   Relationship type object.
+ *
+ * @see user_relationships_type_delete()
+ */
+function hook_user_relationships_type_delete($relationship_type) {
+
+}
+
+/**
+ * Act when relationships are loaded.
+ *
+ * @param $relationship_list
+ *   Array of relations, keyed by rid.
+ *
+ * @see user_relationships_load()
+ */
+function hook_user_relationships_load($relationship_list) {
+
+}
+
+/**
+ * This hook is executed before a relationship will be saved.
+ *
+ * @param $relationship
+ *   Relationship object.
+ *
+ * @see user_relationships_save_relationship()
+ */
+function hook_user_relationships_presave($relationship) {
+
+}
+
+/**
+ * This hook is executed after a relationship has been updated.
+ *
+ * @param $relationship
+ *   Relationship object.
+ * @param $action
+ *   The reason for the update (request, approve, update).
+ *
+ * @see user_relationships_save_relationship()
+ */
+function hook_user_relationships_save($relationship, $action) {
+
+}
+
+/**
+ * This hook is executed after a new relationship has been saved.
+ *
+ * @param $relationship
+ *   Relationship object.
+ *
+ * @see user_relationships_save_relationship()
+ */
+function hook_user_relationships_insert($relationship) {
+
+}
+
+/**
+ * This hook is executed before a relationship will be saved.
+ *
+ * @param $relationship
+ *   Relationship object.
+ * @param $action
+ *   String reason for removal ('cancel','disapprove','remove').
+ *
+ * @see user_relationships_delete_relationship()
+ * 
+ */
+function hook_user_relationships_delete($relationship, $action) {
+
+}
\ No newline at end of file
diff --git a/user_relationships.author-pane.inc b/user_relationships.author-pane.inc
new file mode 100644
index 0000000..f43a498
--- /dev/null
+++ b/user_relationships.author-pane.inc
@@ -0,0 +1,100 @@
+<?php
+
+/**
+ * @file
+ * integration with Author Pane for User Relationships API
+ * @author Alex Karshakevich http://drupal.org/user/183217
+ */
+
+/**
+ * Implements hook_preprocess_author_pane().
+ */
+function user_relationships_preprocess_author_pane(&$variables) {
+  // Check if this preprocess needs to be run given who's calling it.
+  if (function_exists('author_pane_run_preprocess') && !author_pane_run_preprocess('user_relationships', $variables['caller'])) {
+    return;
+  }
+
+  global $user;
+  $account = $variables['account'];
+
+  // Anonymous users and users viewing their own account won't get a link.
+  if (!$user->uid || !$account->uid || $user->uid == $account->uid) {
+    return;
+  }
+
+  $rtids = variable_get('user_relationships_author_pane_rtids', array());
+  if (!is_array($rtids)) {
+    $rtids = array($rtids);//wrap into array for now, while selection is single
+  }
+  if (!count($rtids)) {
+   return;
+  }
+  // Get a list of selected relationship types
+  $all_rtypes = user_relationships_types_load();
+  $rtypes = array();
+  foreach ($rtids as $rtid) {
+    $rtypes[] = $all_rtypes[$rtid];
+  }
+
+  foreach ($rtypes as $rtype) {
+    $relationships = user_relationships_load(array('requester_id' => $user->uid, 'requestee_id' => $account->uid, 'rtid' => $rtype->rtid));
+
+    if (count($relationships)) {
+      // Existing relationship; need remove icon/link. (Despite the foreach,
+      // there should only be one.)
+      foreach ($relationships as $rtid => $relationship) {
+        $link_label = t('Remove @name from @rel_plural_name', array('@name' => format_username($account), '@rel_plural_name' => $relationship->plural_name));
+        $css_class = array(str_replace(' ', '-', $relationship->name), 'author-pane-link', 'user_relationships_popup_link', 'author-relationship-remove-icon');
+        //link to remove
+        if (!isset($variables['user_relationships'])) {
+          $variables['user_relationships'] = '';
+        }
+        $variables['user_relationships'] .= '<div class="author-pane-ur-link-item">';
+        $variables['user_relationships'] .=
+          l('<span>' . t('Remove @rel_name', array('@name' => format_username($account), '@rel_name' => ur_tt("user_relationships:rtid:$relationship->rtid:name", $relationship->name))) . '</span>',
+          "user/{$user->uid}/relationships/{$relationship->rid}/remove",
+          array(
+                'query' => drupal_get_destination(),
+                'html' => TRUE,
+                'attributes'  => array('title' => $link_label, 'class' => $css_class),
+          ));
+        $variables['user_relationships'] .= '</div>';
+      }
+    }
+    else {
+      //No existing relationship; need an add icon/link.
+      if (!user_relationships_can_request($user, $rtype) || !user_relationships_can_receive($account, $rtype)) {
+        continue;
+      }
+      $relationships_count = user_relationships_load(array('between' => array($user->uid, $account->uid)), array('count' => TRUE));
+      $link_label = t('Add @rel_name', array('@rel_name' => ur_tt("user_relationships:rtid:$rtype->rtid:name", $rtype->name)));
+      $css_class = array(str_replace(' ', '-', $relationship->name), 'author-pane-link', 'user_relationships_popup_link', 'author-relationship-remove-icon');
+      //add link
+      if (!isset($variables['user_relationships'])) {
+        $variables['user_relationships'] = '';
+      }
+      $variables['user_relationships'] .= '<div class="author-pane-ur-link-item">';
+      $variables['user_relationships'] .=
+        l('<span>' . t('Add @rel_name', array('@name' => format_username($account), '@rel_name' => ur_tt("user_relationships:rtid:$rtype->rtid:name", $rtype->name))) . '</span>',
+          "relationship/{$account->uid}/request/{$rtype->rtid}",
+          array(
+            'query' => drupal_get_destination(),
+            'html' => TRUE,
+            'attributes'  => array(
+              'title' => t('Become @name\'s @rel_name', array('@name' => format_username($account), '@rel_name' => ur_tt("user_relationships:rtid:$rtype->rtid:name", $rtype->name))),
+              'class' => $css_class
+            ),
+          )
+        );
+      $variables['user_relationships'] .= '</div>';
+    }
+  }
+}
+
+/**
+ * Implements hook_author_pane_allow_preprocess_disable().
+ */
+function user_relationships_author_pane_allow_preprocess_disable() {
+  return array('user_relationships' => 'User Relationships');
+}
diff --git a/user_relationships.info b/user_relationships.info
new file mode 100644
index 0000000..9c3ce23
--- /dev/null
+++ b/user_relationships.info
@@ -0,0 +1,5 @@
+name = User Relationships
+description = "API for User Relationships. This only provides the programming interface."
+package = "User Relationships"
+core = 7.x
+files[]=tests/user_relationships.api.test
diff --git a/user_relationships.install b/user_relationships.install
new file mode 100644
index 0000000..c32a7a4
--- /dev/null
+++ b/user_relationships.install
@@ -0,0 +1,78 @@
+<?php
+
+/**
+ * @file
+ * User Relationships API Module installation file.
+ */
+
+/**
+ * Implements hook_schema().
+ */
+function user_relationships_schema() {
+  $schema['user_relationships'] = array(
+    'fields' => array(
+      'rid'           => array('type' => 'serial', 'not null' => TRUE),
+      'requester_id'  => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+      'requestee_id'  => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+      'rtid'          => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+      'approved'      => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny'),
+      'created_at'    => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+      'updated_at'    => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+      'flags'         => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+    ),
+    'primary key' => array('requester_id', 'requestee_id', 'rtid'),
+    'indexes' => array(
+      'requester_id' => array('requester_id'),
+      'requestee_id' => array('requestee_id'),
+      'rtid' => array('rtid'),
+      'rid' => array('rid'),
+    ),
+  );
+
+  $schema['user_relationship_types'] = array(
+    'fields' => array(
+      'rtid'              => array('type' => 'serial', 'unsigned' => TRUE, 'not null' => TRUE),
+      'name'              => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'plural_name'       => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
+      'is_oneway'         => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny'),
+      'is_reciprocal'     => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny'),
+      'requires_approval' => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny'),
+      'expires_val'       => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+    ),
+    'unique keys' => array(
+      'name'  => array('name'),
+    ),
+    'primary key' => array('rtid')
+  );
+
+  $schema['user_relationship_type_roles'] = array(
+    'fields' => array(
+      'rtid'              => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+      'rid'              => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+    ),
+    'primary key' => array('rtid', 'rid'),
+    'indexes' => array(
+      'rtid' => array('rtid'),
+    )
+  );
+
+  $schema['user_relationship_type_roles_receive'] = array(
+    'fields' => array(
+      'rtid'              => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+      'rid'              => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
+    ),
+    'primary key' => array('rtid', 'rid'),
+    'indexes' => array(
+      'rtid' => array('rtid'),
+    )
+  );
+
+  return $schema;
+}
+
+/**
+ * Implements hook_update_last_removed().
+ */
+function user_relationships_last_removed() {
+  return 6103;
+}
\ No newline at end of file
diff --git a/user_relationships.module b/user_relationships.module
new file mode 100644
index 0000000..6db0b43
--- /dev/null
+++ b/user_relationships.module
@@ -0,0 +1,743 @@
+<?php
+
+/**
+ * @file
+ * User Relationships API. Module shell.
+ *
+ * @author Jeff Smick (creator)
+ * @author Alex Karshakevich (maintainer) http://drupal.org/user/183217
+ */
+
+define('UR_OK', 0x0);
+define('UR_BANNED', 0x1);
+
+/**
+ * Helper function to generate the main and count queries from a list of parameters and options
+ */
+function _user_relationships_generate_query($param = array(), $options = array()) {
+  extract($options, EXTR_SKIP);
+
+  $twoway_reverse_clause = FALSE;//#479486
+  // Turn the conditions into a query.
+  $query = db_select('user_relationships', 'ur');
+  $query->innerJoin('user_relationship_types', 'urt', 'urt.rtid = ur.rtid');
+  foreach ($param as $key => $value) {
+    if (!isset($value)) {
+      continue;
+    }
+
+    switch ($key) {
+    case 'between':
+      $or = db_or()->condition(db_and()
+          ->condition('ur.requester_id', $value[0])
+          ->condition('ur.requestee_id', $value[1])
+      );
+      $and = db_and()
+        ->condition('ur.requestee_id', $value[0])
+        ->condition('ur.requester_id', $value[1]);
+      //#479486 do not include reverse records of two-way relationships by default
+      if (!isset($include_twoway_reverse)) {
+        $and->condition(db_or()
+          ->condition('ur.approved', 1, '<>')
+          ->condition('urt.is_oneway', 0, '<>'));
+        $twoway_reverse_clause = TRUE;
+      }
+      $or->condition($and);
+      $query->condition($or);
+      break;
+
+    case 'user':
+      //#479486 when showing all user's relationships, do not include reverse records of two-way relationships
+      if (!isset($include_twoway_reverse)) {
+        $query->condition(db_or()
+          ->condition('ur.requester_id', $value)
+          ->condition(db_and()
+            ->condition(db_or()
+              ->condition('ur.approved', 1, '<>')
+              ->condition('urt.is_oneway', 0, '<>')
+            )
+            ->condition('ur.requestee_id', $value)
+          )
+        );
+        $twoway_reverse_clause = TRUE;
+      }
+      else {
+        $query->condition(db_or()
+          ->condition('ur.requester_id', $value)
+          ->condition('ur.requestee_id', $value)
+        );
+      }
+      $arguments[] = $value;
+      break;
+
+    case 'requester_id':
+    case 'requestee_id':
+      $twoway_reverse_clause = TRUE;//#479486 these columns automatically should exclude duplicates
+
+    default:
+      $types_cols = array('name', 'plural_name', 'is_oneway', 'is_reciprocal', 'requires_approval', 'expires_val');
+      $prefix = !in_array($key, $types_cols) ? 'ur' : 'urt';
+      $query->condition($prefix . '.' . $key, $value);
+    }
+  }
+
+  //#479486 add a general clause that removed reverse direction from two-way relationship results, unless it's been addressed above
+  if (!$twoway_reverse_clause && !isset($include_twoway_reverse)) {
+    $query->condition(db_or()
+      ->condition('urt.is_oneway', 0, '<>')
+      ->condition('ur.approved', 1, '<>')
+      ->where('ur.requester_id < ur.requestee_id')
+    );
+    $twoway_reverse_clause = TRUE;
+  }
+
+  if (!empty($only_count) || !empty($paging)) {
+    $count = clone $query;
+    $count->addExpression('COUNT(DISTINCT rid)', 'count');
+  }
+  $query
+    ->distinct()
+    ->fields('ur')
+    ->fields('urt');
+
+  if (isset($include_user_info) && $include_user_info) {
+    $query->addField('requesters', 'name', 'requester_name');
+    $query->addField('requesters', 'mail', 'requester_mail');
+    $query->addField('requesters', 'data', 'requester_data');
+    $query->addField('requesters', 'picture', 'requester_picture');
+    $query->addField('requestees', 'name', 'requestee_name');
+    $query->addField('requestees', 'mail', 'requestee_mail');
+    $query->addField('requestees', 'data', 'requestee_data');
+    $query->addField('requestees', 'picture', 'requestee_picture');
+
+    $query->innerJoin('users', 'requesters', 'ur.requester_id = requesters.uid');
+    $query->innerJoin('users', 'requestees', 'ur.requestee_id = requestees.uid');
+  }
+  if (!empty($order)) {
+    if (is_array($order)) {
+      $query->orderBy($order[0], $order[1]);
+    }
+    else {
+      $query->orderBy($order);
+    }
+  }
+  if (!empty($limit)) {
+    $offset = !empty($offset) ? $offset : 0;
+    $query->range($offset, $limit);
+  }
+  if (!empty($only_count)) {
+    return $count;
+  }
+  if (!empty($paging)) {
+    $query = $query
+      ->extend('PagerDefault')
+      ->limit($paging);
+    $query->setCountQuery($count);
+  }
+  return $query;
+}
+
+
+/**
+ * hook_perm()
+ */
+function user_relationships_permission() {
+  return array('can have relationships' => array(
+    'title' => t('Can have relationships'),
+    'description' => t('The user is allowed to have and accept relationships.'),
+  ));
+}
+
+
+/**
+ * hook_cron()
+ */
+function user_relationships_cron() {
+  $now = REQUEST_TIME;
+
+  // only expire relationships once a day
+  $last_cron = variable_get('user_relationships_last_expire', 0);
+  if ($now < $last_cron + 86400) {
+    return FALSE;
+  }
+
+  $result = db_query(
+    " SELECT ur.rid
+      FROM {user_relationships} ur
+        INNER JOIN {user_relationship_types} urt ON ur.rtid = urt.rtid
+      WHERE ur.approved = 0
+        AND urt.expires_val > 0
+        AND ur.updated_at < (:now - (urt.expires_val * 86400))
+      GROUP BY ur.rid", array(':now' => $now)
+  );
+  $expired_requests = $result->fetchCol();
+  if (count($expired_requests)) {
+    db_delete('user_relationships')
+      ->condition('rid', $expired_requests)
+      ->execute();
+    //FIXME: this will trigger various hook_user_relationships() but will not pass a valid relationship object. E.g. in mailer.
+    module_invoke_all('user_relationships_delete', $expired_requests);
+  }
+
+  // remember when we last expired relationships
+  variable_set('user_relationships_last_expire', $now);
+  return TRUE;
+}
+
+
+/**
+ * Implements hook_user_cancel().
+ */
+function user_relationships_user_cancel($edit, $account, $method) {
+    db_delete('user_relationships')
+      ->condition(db_or()
+        ->condition('requester_id', $account->uid)
+        ->condition('requestee_id', $account->uid)
+      )
+      ->execute();
+}
+
+/**
+ * Wrapper function for tt() if i18nstrings enabled.
+ */
+function ur_tt($name, $string, $langcode = NULL, $update = FALSE) {
+  if (module_exists('i18nstrings')) {
+    return tt($name, $string, $langcode, $update);
+  }
+  else {
+    return $string;
+  }
+}
+
+/**
+ * Implements hook_activity_info().
+ */
+function user_relationships_activity_info() {
+  $info = new stdClass();
+  $info->api = 2;
+  $info->name = 'user_relationships';
+  $info->object_type = 'user_relationships';
+  $info->objects = array('Requester' => 'requester', 'Requestee' => 'requestee', 'Relationship' => 'relationship');
+  $info->hooks = array('user_relationships' => array('approve', 'request'));
+  foreach (user_relationships_types_load() as $type_obj) {
+    $info->realms["user_relationships_" . $type_obj->rtid] = $type_obj->plural_name;
+  }
+  return $info;
+}
+
+/**
+ * Public API for retrieving a specific relationship
+ *
+ * @param $param
+ *    The rtid or an associative array of attributes to search for in selecting the
+ *    relationship, such as rtid or name. Attributes must match column names
+ *    in the user_relationship_types table.
+ *
+ * @param $reset
+ *    a boolean that forces a reset of the internal static types list
+ *
+ * @return
+ *    object of the requested relationship type
+ *
+ */
+function user_relationships_type_load($param = array(), $reset = NULL) {
+  $types = user_relationships_types_load($reset);
+
+  if (!is_array($param)) {
+    if (isset($types[$param])) {
+      return $types[$param];
+    }
+    return FALSE;
+  }
+
+  foreach ($types as $type) {
+    $found = TRUE;
+
+    foreach ($param as $column => $value) {
+      $column = strtolower($column);
+
+      if ($column == 'name' || $column == 'plural_name') {
+        $value = strtolower($value);
+        $col_val = strtolower($type->$column);
+      }
+      else {
+        $col_val = $type->$column;
+      }
+
+      // mismatch, move to the next type
+      if ($col_val != $value) {
+        $found = FALSE;
+        break;
+      }
+    }
+
+    if ($found) {
+      return $type;
+    }
+  }
+}
+
+
+/**
+ * Load all relationship types.
+ *
+ * @param $reset
+ *   A boolean that forces a reset of the internal static types list
+ *
+ * @return
+ *   Array of relationship_type objects
+ */
+function user_relationships_types_load($reset = FALSE) {
+  static $relationship_types_list = NULL;
+
+  if ($reset || !isset($relationship_types_list)) {
+    // Clear the cached list, since some relationships may have disappeared.
+    $relationship_types_list = db_query("SELECT * FROM {user_relationship_types}")->fetchAllAssoc('rtid');
+    if (empty($relationship_types_list)) {
+      // No relationships, avoid querying role permissions.
+      return $relationship_types_list;
+    }
+    // Load role permissions for all types.
+    $result = db_query('SELECT rtid, rid FROM {user_relationship_type_roles} WHERE rtid IN (:rtids) ORDER BY rtid, rid', array(':rtids' => array_keys($relationship_types_list)));
+    foreach ($result as $mapping) {
+      // roles is an associative array {role id} => {role id}.
+      $relationship_types_list[$mapping->rtid]->roles[$mapping->rid] = $mapping->rid;//] = $mapping->name;
+    }
+
+    // Load role receive permissions for all types.
+    $results = db_query('SELECT rtid, rid FROM {user_relationship_type_roles_receive} WHERE rtid IN (:rtids) ORDER BY rtid, rid', array(':rtids' => array_keys($relationship_types_list)));
+    foreach ($results as $mapping) {
+      // roles_receive is an associative array {role id} => {role id}.
+      $relationship_types_list[$mapping->rtid]->roles_receive[$mapping->rid] = $mapping->rid;
+    }
+  }
+
+  module_invoke_all('user_relationships_type_load', $relationship_types_list);
+
+  return $relationship_types_list;
+}
+
+
+/**
+ * Create or Update a User Relationship Type
+ *
+ * @param $rtype
+ *   A User Relationship type object
+ */
+function user_relationships_type_save($rtype) {
+  module_invoke_all('user_relationships_type_presave', $rtype);
+
+  $op = (isset($rtype->rtid) && $rtype->rtid) ? 'update' : 'insert';
+
+  // find a relationship type with the name we're trying to save
+  // if it's an update action check to see that the rtypes match
+  // otherwise it's just invalid
+  if (
+    ($found_rt = user_relationships_type_load(array('name' => $rtype->name))) &&
+    ($op == 'update' ? $found_rt->rtid != $rtype->rtid : TRUE)
+  ) {
+    return FALSE;
+  }
+
+  // ensure "expires_val" is numeric and not negative
+  if (!is_numeric($rtype->expires_val) || $rtype->expires_val < 0) {
+    $rtype->expires_val = 0;
+  }
+
+  drupal_write_record('user_relationship_types', $rtype, ($op == 'update' ? 'rtid' : array()));
+
+  module_invoke_all('user_relationships_type_' . $op, $rtype);
+}
+
+
+/**
+ * Delete a User Relationship Type
+ *
+ * @param $rtid
+ *   A User Relationship type ID
+ */
+function user_relationships_type_delete($rtid) {
+  $rtype = user_relationships_type_load($rtid);
+
+  db_delete('user_relationship_types')
+    ->condition('rtid', $rtid)
+    ->execute();
+  db_delete('user_relationships')
+    ->condition('rtid', $rtid)
+    ->execute();
+  db_delete('user_relationship_type_roles')
+    ->condition('rtid', $rtid)
+    ->execute();
+  db_delete('user_relationship_type_roles_receive')
+    ->condition('rtid', $rtid)
+    ->execute();
+
+  module_invoke_all('user_relationships_type_delete', $rtype);
+}
+
+
+/**
+ * Request a new user relationship
+ *
+ * @param $requester
+ *   object or UID of the requester
+ * @param $requestee
+ *   object  or UID of the requestee
+ * @param $type
+ *   object or RTID of the relationship type
+ * @param $approved
+ *    boolean status of the relationship
+ *
+ * @return
+ *    object of the newly created relationship
+ */
+function user_relationships_request_relationship($requester, $requestee = NULL, $type = NULL, $approved = FALSE) {
+  //#578372 check if this is a "new" type of invocation, where first argument is a relationship object
+  if (is_object($requester) && isset($requester->requester) && isset($requester->requestee) && isset($requester->type)) {
+    $relationship = $requester;
+    $requester = $relationship->requester;
+    $requestee = $relationship->requestee;
+    $type = $relationship->type;
+    if (isset($relationship->approved)) {
+      $approved = $relationship->approved;
+    }
+  }
+  else {
+    $relationship = new stdClass;
+  }
+  // translate an ID into an object
+  foreach (array('requester' => $requester, 'requestee' => $requestee, 'type' => $type) as $key => $value) {
+    if (!is_object($value)) {
+      $$key = $key == 'type' ? user_relationships_type_load($value) : user_load($value);
+    }
+  }
+
+  //check requester is allowed to create this rtype
+  if (!user_relationships_can_request($requester, $type)) {
+    watchdog('user_relationships', 'User %user has no suitable roles to request a %rtype relationship', array('%user' => format_username($requester), '%rtype' => $type->name), WATCHDOG_WARNING);
+    //it would be good to return a reason why save is denied, but it's the API portion, it does not expose anything user-visible
+    return FALSE;
+  }
+
+  //check requestee is allowed to receive this rtype
+  if (!user_relationships_can_receive($requestee, $type)) {
+    watchdog('user_relationships', 'User %user has no suitable roles to receive a %rtype relationship', array('%user' => format_username($requestee), '%rtype' => $type->name), WATCHDOG_WARNING);
+    //it would be good to return a reason why save is denied, but it's the API portion, it does not expose anything user-visible
+    return FALSE;
+  }
+
+  // check whether this relationship aleady exists
+  if (!$type->is_oneway || !$type->is_reciprocal) {
+    $existing = user_relationships_load(array('between' => array($requester->uid, $requestee->uid), 'rtid' => $type->rtid), array('count' => TRUE));
+  }
+  else {
+    $existing = user_relationships_load(array('requester_id' => $requester->uid, 'requestee_id' => $requestee->uid, 'rtid' => $type->rtid), array('count' => TRUE));
+  }
+
+  if (!$existing) {
+    $relationship->requester_id = $requester->uid;
+    $relationship->requestee_id = $requestee->uid;
+    $relationship->approved = $approved || !$type->requires_approval || (isset($requestee->data['user_relationships_ui_auto_approve']) && isset($requestee->data['user_relationships_ui_auto_approve'][$type->rtid]));
+    $relationship->rtid = $type->rtid;
+
+    return user_relationships_save_relationship($relationship);
+  }
+}
+
+
+/**
+ * Create or update a user relationship.
+ *
+ * @param $relationship
+ *   Object of the current relationship.
+ * @param $action
+ *   The reason for the update (request, approve, update).
+ *
+ * @return
+ *   Object of the updated relationship or FALSE if the relationship wasn't
+ *   able to save
+ */
+function user_relationships_save_relationship($relationship, $action = 'request') {
+  //set basic info if it doesn't already exist
+  !isset($relationship->flags) ? $relationship->flags = UR_OK : NULL;
+  !isset($relationship->created_at) ? $relationship->created_at = REQUEST_TIME : NULL;
+  $relationship->updated_at = REQUEST_TIME;
+
+  if ($action == 'approve') {
+    $relationship->approved = 1;
+  }
+
+  // Start a transaction so that we can roll back in case of an error.
+  $transaction = db_transaction();
+  try {
+    module_invoke_all('user_relationships_presave', $relationship);
+
+    if (isset($relationship->rid)) {
+      // Delete possible requests coming the other direction
+      $relationship_type = user_relationships_type_load($relationship->rtid);
+      if (!$relationship_type->is_oneway) {
+        db_delete('user_relationships')
+          ->condition('rtid', $relationship->rtid)
+          ->condition('requester_id', $relationship->requestee_id)
+          ->condition('requestee_id', $relationship->requester_id)
+          ->execute();
+      }
+    }
+
+    //#454680 make sure that an update is performed if this is an existing relationship
+    if (drupal_write_record('user_relationships', $relationship, (isset($relationship->rid) ? array('rid') : array()))) {
+      // if the relationship has been approved and is two-way we need
+      // to do a double entry for DB efficiency
+      $relationship_type = user_relationships_type_load($relationship->rtid);
+      if ($relationship->approved && !$relationship_type->is_oneway) {
+        //#365623 drupal_write_record will not work because rid is a serial field, and we need to use the same rid
+        // @todo: Verify that this doesn't cause problems when an existing
+        // relationship is updated again after being approved.
+        $select = db_select('user_relationships', 'ur')
+          ->fields('ur', array('rid', 'requester_id', 'requestee_id', 'rtid', 'approved', 'created_at', 'updated_at', 'flags'))
+          ->condition('rid', $relationship->rid);
+        db_insert('user_relationships')
+          ->fields(array('rid', 'requestee_id', 'requester_id', 'rtid', 'approved', 'created_at', 'updated_at', 'flags'))
+          ->from($select)
+          ->execute();
+      }
+    }
+
+    // Don't execute a different hook for update/insert since that is not
+    // relevant. The $action is important if someone needs to differentiate.
+    module_invoke_all('user_relationships_save', $relationship, $action);
+    return $relationship;
+  }
+  catch (Exception $e) {
+    $transaction->rollback();
+    watchdog_exception('user_relationships', $e);
+    return FALSE;
+  }
+}
+
+
+/**
+ * Public API for deleting a relationship.
+ *
+ * @param $relationship
+ *    object of the relationship
+ * @param $deleted_by
+ *    object of the user that initiated the delete command
+ * @param $action
+ *    string reason for removal ('cancel','disapprove','remove')
+ */
+function user_relationships_delete_relationship($relationship, $deleted_by, $action = 'remove') {
+  $relationship->deleted_by = $deleted_by;
+  db_delete('user_relationships')
+    ->condition('rid', $relationship->rid)
+    ->execute();
+
+  module_invoke_all('user_relationships_delete', $relationship, $action);
+}
+
+
+/**
+  * Load relationship objects from the database.
+  *
+  * @param $param
+  *   an array of parameters with the key being the column. columns from both the user_relationships and user_relationship_types tables will work
+  *     columns from user_relationships: rid, requester_id, requestee_id, rtid, approved, created_at, updated_at, flags
+  *     columns from user_relationship_types: name, plural_name, is_oneway, requires_approval, expires_val
+  *   There are two special keys:
+  *     1) array("between" => array($uid1, $uid2)) will return all relationships between the two user ids.
+  *     2) array("user" => $uid) will return all relationships for the specified uid
+  *
+  *   arguments will process operators as well using the syntax: array(col => '> {value}').
+  *     example: show all relationships created in 2007
+  *       $start_time = mktime(0,0,0,0,0,2007);
+  *       $end_time = mktime(0,0,0,0,0,2008);
+  *       user_relationships_load(array('created_at' => ">= {$start_time}", 'created_at' => '< {$end_time'}));
+  *
+  *   each parameter may be an array, if you wish to pass several values
+  *     example: user_relationships_load(array('rtid' => array(2, 3), 'between' => array($uid1, $uid2)))
+  *       will load all relationships of types 2 or 3 between uid1 and uid2 (query will have an IN clause)
+  *
+  * @param @options
+  *   An array keyed by the option
+  *   count
+  *     a boolean stating whether or not the return value should be the number of relationships found
+  *
+  *   sort
+  *     a string containing a valid column name which will become the key for the returned array of relationships
+  *     default is 'rid'
+  *
+  *   order
+  *     a string containing SQL stating the column and direction of the sort (ex. "requester_id ASC, rtid DESC")
+  *
+  *   limit
+  *     a string containing SQL stating the limit (ex "10" or "10, 5")
+  *
+  *   include_user_info
+  *     a boolean that will load basic user info without having to call user_load
+  *     columns: uid, name, mail, data, picture
+  *
+  *   include_twoway_reverse (not used unless there is a specific need)
+  *     a boolean that, if present, and if sort is set to other than 'rid', will include records for both directions for
+  *     two-way relationships. Normally for a two-way relationship only one entry is returned, although in the database there
+  *     are two records. This flag has no effect if sort is 'rid'
+  *
+  * @param $reset
+  *   a boolean that will reset the internal static $relationships variable to ensure programatic relationship insertion works
+  *
+  * @return
+  *   an array of relationships
+  *   if the key is "rid" the array will be a single dimention: array($rid => $relationship, $rid => $relationship)
+  *   otherwise it'll be multidimentional: array($rtid => array($relationship, $relationship))
+  *
+  *   each relationship will have the user's name, mail, and data attached as requester_name, requester_mail, requester_data
+  *   or requestee_name, requestee_mail, requestee_data
+ */
+function user_relationships_load($param = array(), $options = array(), $reset = FALSE) {
+  static $relationships = array();
+
+  $default_options = array(
+    'sort' => 'rid',
+  );
+  $options = array_merge($default_options, $options);
+  extract($options, EXTR_SKIP);
+
+  $arguments = array();
+  if (is_numeric($param)) {
+    if (!$reset && isset($relationships[$param])) {
+      return is_object($relationships[$param]) ? clone $relationships[$param] : $relationships[$param];
+    }
+    $rid = $param;
+    $param = array('rid' => $param);
+  }
+
+  $options['only_count'] = !empty($count);
+
+  $query = _user_relationships_generate_query($param, $options);
+
+  if (!empty($count)) {
+    return (int)$query->execute()->fetchField();
+  }
+
+  $relationships = array();
+  foreach ($query->execute() as $relationship) {
+    if (isset($include_user_info)) {
+      user_relationships_translate_user_info($relationship);
+    }
+
+    if ($sort == 'rid') {
+      $relationships[$relationship->$sort] = $relationship;
+    }
+    else {
+      $relationships[$relationship->$sort][] = $relationship;
+    }
+  }
+
+  if (isset($rid) && !isset($relationships[$rid])) {
+    return FALSE;
+  }
+
+  // Always call the hook with an array, even though there is only single entry.
+  if (isset($rid)) {
+    $return = $relationships[$rid];
+    module_invoke_all('user_relationships_load', array($rid => $return));
+  }
+  else {
+    $return = $relationships;
+    // Only execute the hook if the array is not empty.
+    if (!empty($return)) {
+      module_invoke_all('user_relationships_load', $return);
+    }
+  }
+  return $return;
+}
+
+
+/**
+ * Used when the "include_user_info" option is set on user_relationships_load
+ * to translate the retrieved user fields into actual user objects. This allows us
+ * to pull the basic user data without having to run user_load
+ *
+ * @param $relationship
+ *    The relationship object with pulled user info
+ */
+function user_relationships_translate_user_info(&$relationship) {
+  if ($relationship->requester_name) {
+    foreach (array('requester', 'requestee') as $user_type) {
+      $relationship->{$user_type} = new stdClass();
+      foreach (array('name', 'mail', 'data', 'picture') as $field) {
+        $db_field = "{$user_type}_{$field}";
+        $relationship->{$user_type}->{$field} = $relationship->{$db_field};
+
+        unset($relationship->{$db_field});
+      }
+      $user_type_id = "{$user_type}_id";
+      $relationship->{$user_type}->uid = $relationship->{$user_type_id};
+      $relationship->{$user_type}->data = unserialize($relationship->{$user_type}->data);
+    }
+  }
+}
+
+/**
+ * Check whether a user is allowed to request a certain relationship type
+ *
+ * @param $requester requesting user object or uid
+ * @param $relationship_type loaded relationship type object or rtid
+ * @return TRUE iff requester is allowed to request this type of relationship
+ */
+function user_relationships_can_request($requester, $relationship_type) {
+  //validate arguments
+  if (is_numeric($requester)) {
+    $requester = user_load($requester);
+  }
+  if (is_numeric($relationship_type)) {
+    $relationship_type = user_relationships_type_load($relationship_type);
+  }
+  if (!is_object($requester) || !is_object($relationship_type)) {
+    return FALSE;
+  }
+  if ($requester->uid == 1) {
+    return TRUE;
+  }
+  //if no roles have been set, any user can request
+  if (!isset($relationship_type->roles) || !count($relationship_type->roles)) {
+    return TRUE;
+  }
+  //check user has at least one required role
+  foreach ($relationship_type->roles as $role_id) {
+    if (isset($requester->roles[$role_id])) {
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+
+/**
+ * Check whether a user is allowed to receive a certain relationship type
+ *
+ * @param $requestee requesting user object or uid
+ * @param $relationship_type loaded relationship type object or rtid
+ * @return TRUE iff receiver is allowed to request this type of relationship
+ */
+function user_relationships_can_receive($requestee, $relationship_type) {
+  //validate arguments
+  if (is_numeric($relationship_type)) {
+    $relationship_type = user_relationships_type_load($relationship_type);
+  }
+  if (is_numeric($requestee)) {
+    $requestee = user_load($requestee);
+  }
+  if (!is_object($requestee) || !is_object($relationship_type)) {
+    return FALSE;
+  }
+  //if no roles have been set to receive the relationship, any user can receive it
+  if (!isset($relationship_type->roles_receive) || !count($relationship_type->roles_receive)) {
+    return TRUE;
+  }
+  //check user has at least one required role
+  foreach ($relationship_type->roles_receive as $role_id) {
+    if (isset($requestee->roles[$role_id])) {
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
diff --git a/user_relationships_api/README.txt b/user_relationships_api/README.txt
deleted file mode 100644
index 054bef8..0000000
--- a/user_relationships_api/README.txt
+++ /dev/null
@@ -1,25 +0,0 @@
-
-User Relationships API
-------------------
-This the API only portion of User Relationships. This is required by all UR plugins and addon
-modules. It provides no frontend interface.
-
-Developers
-------------
-There are a number of API functions and corresponding hooks. The hooks are documented in user_relationships_api.api.php.
-The API functions are all defined in user_relationships_api.api.inc. I've provded a list below for quick lookup, but you'll
-need to see the documentation in that file for a deeper explanaition.
-
-  Functions
-  =========
-  user_relationships_type_load($param = array())
-  user_relationships_types_load($reset = NULL)
-  user_relationships_type_save($rtype)
-  user_relationships_type_delete($rtid)
-
-  user_relationships_load($param = array(), $options = array(), $reset = FALSE)
-  user_relationships_api_translate_user_info($relationship)
-  user_relationships_request_relationship($requester, $requestee, $type, $approved = FALSE)
-  user_relationships_save_relationship($relationship, $op = 'request')
-  user_relationships_delete_relationship($relationship, &$deleted_by, $op = 'remove')
-
diff --git a/user_relationships_api/tests/user_relationships_api.api.test b/user_relationships_api/tests/user_relationships_api.api.test
deleted file mode 100644
index ef3b15f..0000000
--- a/user_relationships_api/tests/user_relationships_api.api.test
+++ /dev/null
@@ -1,266 +0,0 @@
-<?php
-
-/**
- * @file
- * User Relationships API testcase
- * @author Alex Karshakevich http://drupal.org/user/183217
- */
-class UserRelationshipsApiTestCase extends DrupalWebTestCase {
-  //test users
-  var $users = array();
-  //test relationship types
-  var $rtypes = array();
-
-  /**
-   * Implements getInfo().
-   */
-  function getInfo() {
-    return array(
-      'name' => t('User Relationships API implementation'),
-      'description' => t('Checks correctness of some UR API functions.'),
-      'group' => t('User Relationships'),
-    );
-  }
-
-  /**
-   * Enable modules.
-   */
-  function setUp() {
-    parent::setUp('user_relationships_api');
-    $this->users = array();
-    $this->rtypes = array();
-    //important, reset cache of rel types between runs
-    user_relationships_types_load(TRUE);
-    //create test users
-//    $user = $this->drupalCreateUser();
-//    $users[$user->uid] = $user;
-//    $user = $this->drupalCreateUser();
-//    $users[$user->uid] = $user;
-//    $user = $this->drupalCreateUser();
-//    $users[$user->uid] = $user;
-    //create relationships
-    $rtype = new StdClass;
-    $rtype->name = 'oneway';
-    $rtype->plural_name = 'oneways';
-    $rtype->is_oneway = TRUE;
-    $rtype->requires_approval = FALSE;
-    $rtype->expires_val = 0;
-    user_relationships_type_save($rtype);
-    $this->rtypes['oneway'] = $rtype;
-
-    unset($rtype);
-    $rtype = new StdClass;
-    $rtype->name = 'twoway';
-    $rtype->plural_name = 'twoways';
-    $rtype->is_oneway = FALSE;
-    $rtype->requires_approval = FALSE;
-    $rtype->expires_val = 0;
-    user_relationships_type_save($rtype);
-    $this->rtypes['twoway'] = $rtype;
-
-    unset($rtype);
-    $rtype = new StdClass;
-    $rtype->name = 'approval';
-    $rtype->plural_name = 'approvals';
-    $rtype->is_oneway = FALSE;
-    $rtype->requires_approval = TRUE;
-    $rtype->expires_val = 0;
-    user_relationships_type_save($rtype);
-    $this->rtypes['approval'] = $rtype;
-
-    unset($rtype);
-    $rtype = new StdClass;
-    $rtype->name = 'approval-oneway';
-    $rtype->plural_name = 'approvals-oneway';
-    $rtype->is_oneway = TRUE;
-    $rtype->requires_approval = TRUE;
-    $rtype->expires_val = 0;
-    user_relationships_type_save($rtype);
-    $this->rtypes['approval-oneway'] = $rtype;
-
-    //#348025 reciprocal one-way relationships
-    unset($rtype);
-    $rtype = new StdClass;
-    $rtype->name = 'approval-reciprocal';
-    $rtype->plural_name = 'approvals-reciprocal';
-    $rtype->is_oneway = TRUE;
-    $rtype->is_reciprocal = TRUE;
-    $rtype->requires_approval = TRUE;
-    $rtype->expires_val = 0;
-    user_relationships_type_save($rtype);
-    $this->rtypes['approval-reciprocal'] = $rtype;
-
-    user_relationships_types_load(TRUE);
-  }
-
-  function tearDown() {
-    unset($this->rtypes);
-    parent::tearDown();
-  }
-
-  //Test #479486 duplicate records for two-way relationships
-  function testUserRelationshipsLoadDuplicates() {
-    $u1 = $this->drupalCreateUser();
-    $u2 = $this->drupalCreateUser();
-    $u3 = $this->drupalCreateUser();
-    $u4 = $this->drupalCreateUser();
-    //create relationships
-    user_relationships_request_relationship($u1, $u2, $this->rtypes['oneway']->rtid, FALSE);
-    user_relationships_request_relationship($u1, $u3, $this->rtypes['oneway']->rtid, FALSE);
-//    user_relationships_request_relationship($u3, $u1, $this->rtypes['oneway']->rtid, FALSE);//this is a no-op
-
-    user_relationships_request_relationship($u1, $u2, $this->rtypes['twoway']->rtid, FALSE);
-    user_relationships_request_relationship($u1, $u3, $this->rtypes['twoway']->rtid, FALSE);
-    user_relationships_request_relationship($u4, $u1, $this->rtypes['twoway']->rtid, FALSE);
-    //test between
-    $result = user_relationships_load(array('between' => array($u1->uid, $u2->uid)));
-    $this->assertEqual(count($result), 2);
-    $result = user_relationships_load(array('between' => array($u1->uid, $u2->uid)), array('include_twoway_reverse' => 1));
-    $this->assertEqual(count($result), 2);
-    //sort by rtid and here reverse relationships will show up
-    $result = user_relationships_load(array('between' => array($u1->uid, $u2->uid)), array('sort' => 'rtid'));
-    $this->assertEqual(count($result[$this->rtypes['oneway']->rtid]), 1);
-    $this->assertEqual(count($result[$this->rtypes['twoway']->rtid]), 1);
-    $result = user_relationships_load(array('between' => array($u1->uid, $u2->uid)), array('sort' => 'rtid', 'include_twoway_reverse' => 1));
-    $this->assertEqual(count($result[$this->rtypes['oneway']->rtid]), 1);
-    $this->assertEqual(count($result[$this->rtypes['twoway']->rtid]), 2);
-
-    //test user
-    $result = user_relationships_load(array('user' => $u1->uid));
-    $this->assertEqual(count($result), 5);
-    $result = user_relationships_load(array('user' => $u1->uid), array('include_twoway_reverse' => 1));
-    $this->assertEqual(count($result), 5);
-    $result = user_relationships_load(array('user' => $u1->uid), array('sort' => 'rtid'));
-    $this->assertEqual(count($result[$this->rtypes['oneway']->rtid]), 2);
-    $this->assertEqual(count($result[$this->rtypes['twoway']->rtid]), 3);
-    $result = user_relationships_load(array('user' => $u1->uid), array('sort' => 'rtid', 'include_twoway_reverse' => 1));
-    $this->assertEqual(count($result[$this->rtypes['oneway']->rtid]), 2);
-    $this->assertEqual(count($result[$this->rtypes['twoway']->rtid]), 6);
-
-    //test rtid
-    $result = user_relationships_load(array('rtid' => $this->rtypes['twoway']->rtid));
-    $this->assertEqual(count($result), 3);
-    $result = user_relationships_load(array('rtid' => $this->rtypes['twoway']->rtid), array('include_twoway_reverse' => 1));
-    $this->assertEqual(count($result), 3);
-    $result = user_relationships_load(array('rtid' => $this->rtypes['twoway']->rtid), array('sort' => 'rtid'));
-    $this->assertFalse(isset($result[$this->rtypes['oneway']->rtid]));
-    $this->assertEqual(count($result[$this->rtypes['twoway']->rtid]), 3);
-    $result = user_relationships_load(array('rtid' => $this->rtypes['twoway']->rtid), array('sort' => 'rtid', 'include_twoway_reverse' => 1));
-    $this->assertFalse(isset($result[$this->rtypes['oneway']->rtid]));
-    $this->assertEqual(count($result[$this->rtypes['twoway']->rtid]), 6);
-
-    //test approved
-    //load pending records
-    $this->assertTrue(user_relationships_api_can_request($u1, $this->rtypes['approval-oneway']));
-    user_relationships_request_relationship($u1, $u2, $this->rtypes['approval-oneway']->rtid, FALSE);
-    $this->assertTrue(user_relationships_api_can_request($u3, $this->rtypes['approval-oneway']));
-    user_relationships_request_relationship($u3, $u1, $this->rtypes['approval-oneway']->rtid, FALSE);
-
-    $result = user_relationships_load(array('approved' => 1));
-    $this->assertEqual(count($result), 5);
-    $result = user_relationships_load(array('approved' => 1), array('include_twoway_reverse' => 1));
-    $this->assertEqual(count($result), 5);
-    $result = user_relationships_load(array('approved' => 1), array('sort' => 'rtid'));
-    $this->assertEqual(count($result[$this->rtypes['oneway']->rtid]), 2);
-    $this->assertEqual(count($result[$this->rtypes['twoway']->rtid]), 3);
-    $this->assertFalse(isset($result[$this->rtypes['approval-oneway']->rtid]));
-    $result = user_relationships_load(array('approved' => 1), array('sort' => 'rtid', 'include_twoway_reverse' => 1));
-    $this->assertEqual(count($result[$this->rtypes['oneway']->rtid]), 2);
-    $this->assertEqual(count($result[$this->rtypes['twoway']->rtid]), 6);
-    $this->assertFalse(isset($result[$this->rtypes['approval-oneway']->rtid]));
-    //test pending
-    $result = user_relationships_load(array('approved' => 0));
-    $this->assertEqual(count($result), 2);
-    $result = user_relationships_load(array('approved' => 0), array('include_twoway_reverse' => 1));
-    $this->assertEqual(count($result), 2);
-    $result = user_relationships_load(array('approved' => 0), array('sort' => 'rtid'));
-    $this->assertEqual(count($result), 1);
-    $this->assertEqual(count($result[$this->rtypes['approval-oneway']->rtid]), 2);
-    $result = user_relationships_load(array('approved' => 0), array('sort' => 'rtid', 'include_twoway_reverse' => 1));
-    $this->assertEqual(count($result), 1);
-    $this->assertEqual(count($result[$this->rtypes['approval-oneway']->rtid]), 2);
-    //test user and pending
-    $result = user_relationships_load(array('user' => $u1->uid, 'approved' => 0));
-    $this->assertEqual(count($result), 2);
-    $result = user_relationships_load(array('user' => $u1->uid, 'approved' => 0), array('include_twoway_reverse' => 1));
-    $this->assertEqual(count($result), 2);
-    $result = user_relationships_load(array('requester_id' => $u1->uid, 'approved' => 0));
-    $this->assertEqual(count($result), 1);
-    $result = user_relationships_load(array('requester_id' => $u1->uid, 'approved' => 0), array('include_twoway_reverse' => 1));
-    $this->assertEqual(count($result), 1);
-    //test user and approved
-    $result = user_relationships_load(array('user' => $u1->uid, 'approved' => 1));
-    $this->assertEqual(count($result), 5);
-    $result = user_relationships_load(array('user' => $u1->uid, 'approved' => 1), array('include_twoway_reverse' => 1));
-    $this->assertEqual(count($result), 5);
-    $result = user_relationships_load(array('requester_id' => $u1->uid, 'approved' => 1));
-    $this->assertEqual(count($result), 5);
-    $result = user_relationships_load(array('requester_id' => $u1->uid, 'approved' => 1), array('include_twoway_reverse' => 1));
-    $this->assertEqual(count($result), 5);
-    $result = user_relationships_load(array('requestee_id' => $u1->uid, 'approved' => 1));
-    $this->assertEqual(count($result), 3);
-    $result = user_relationships_load(array('requestee_id' => $u1->uid, 'approved' => 1), array('include_twoway_reverse' => 1));
-    $this->assertEqual(count($result), 3);
-
-    //add more pending records
-    $this->assertTrue(user_relationships_api_can_request($u1, $this->rtypes['approval']));
-    $this->assertTrue(user_relationships_api_can_request($u3, $this->rtypes['approval']));
-    $this->assertTrue(user_relationships_api_can_request($u4, $this->rtypes['approval']));
-    $this->assertTrue(user_relationships_api_can_request($u4, $this->rtypes['approval-oneway']));
-    user_relationships_request_relationship($u4, $u2, $this->rtypes['approval-oneway']->rtid, FALSE);
-    user_relationships_request_relationship($u3, $u4, $this->rtypes['approval-oneway']->rtid, FALSE);
-    user_relationships_request_relationship($u1, $u2, $this->rtypes['approval']->rtid, FALSE);
-    user_relationships_request_relationship($u4, $u2, $this->rtypes['approval']->rtid, FALSE);
-    user_relationships_request_relationship($u3, $u4, $this->rtypes['approval']->rtid, FALSE);
-    user_relationships_request_relationship($u3, $u1, $this->rtypes['approval']->rtid, FALSE);
-
-    //test pending and requester
-    $result = user_relationships_load(array('requester_id' => $u3->uid, 'approved' => 0));
-    $this->assertEqual(count($result), 4);
-    $result = user_relationships_load(array('requester_id' => $u3->uid, 'approved' => 0), array('include_twoway_reverse' => 1));
-    $this->assertEqual(count($result), 4);
-    //test pending and requestee
-    $result = user_relationships_load(array('requestee_id' => $u2->uid, 'approved' => 0));
-    $this->assertEqual(count($result), 4);
-    $result = user_relationships_load(array('requestee_id' => $u2->uid, 'approved' => 0), array('include_twoway_reverse' => 1));
-    $this->assertEqual(count($result), 4);
-    //test pending and user
-    $result = user_relationships_load(array('user' => $u3->uid, 'approved' => 0));
-    $this->assertEqual(count($result), 4);
-    $result = user_relationships_load(array('user' => $u3->uid, 'approved' => 0), array('include_twoway_reverse' => 1));
-    $this->assertEqual(count($result), 4);
-    $result = user_relationships_load(array('user' => $u2->uid, 'approved' => 0));
-    $this->assertEqual(count($result), 4);
-    $result = user_relationships_load(array('user' => $u2->uid, 'approved' => 0), array('include_twoway_reverse' => 1));
-    $this->assertEqual(count($result), 4);
-    //test between and pending
-    $result = user_relationships_load(array('between' => array($u3->uid, $u1->uid), 'approved' => 0));
-    $this->assertEqual(count($result), 2);
-    $result = user_relationships_load(array('between' => array($u3->uid, $u1->uid), 'approved' => 0), array('include_twoway_reverse' => 1));
-    $this->assertEqual(count($result), 2);
-    $result = user_relationships_load(array('between' => array($u3->uid, $u4->uid), 'approved' => 0));
-    $this->assertEqual(count($result), 2);
-    $result = user_relationships_load(array('between' => array($u3->uid, $u4->uid), 'approved' => 0), array('include_twoway_reverse' => 1));
-    $this->assertEqual(count($result), 2);
-    //#520392 test just between
-    $result = user_relationships_load(array('between' => array($u3->uid, $u1->uid)));
-    $this->assertEqual(count($result), 4);
-    $result = user_relationships_load(array('between' => array($u3->uid, $u1->uid)), array('include_twoway_reverse' => 1));
-    $this->assertEqual(count($result), 4);
-    $result = user_relationships_load(array('between' => array($u1->uid, $u3->uid)));
-    $this->assertEqual(count($result), 4);
-    $result = user_relationships_load(array('between' => array($u1->uid, $u3->uid)), array('include_twoway_reverse' => 1));
-    $this->assertEqual(count($result), 4);
-  }
-
-  //Test #348025 that user_relationship_load_types will load is_reciprocal flag
-  function testUserRelationshipsReciprocalTypes() {
-    $rtypes = user_relationships_types_load();
-    $rtype = $rtypes[$this->rtypes['approval-reciprocal']->rtid];
-    $this->assertTrue($rtype->is_reciprocal);
-    $rtype = $rtypes[$this->rtypes['approval-oneway']->rtid];
-    $this->assertFalse($rtype->is_reciprocal);
-    $rtype = $rtypes[$this->rtypes['approval']->rtid];
-    $this-> assertFalse($rtype->is_reciprocal);
-  }
-}
diff --git a/user_relationships_api/user_relationships_api.activity.inc b/user_relationships_api/user_relationships_api.activity.inc
deleted file mode 100644
index e88a618..0000000
--- a/user_relationships_api/user_relationships_api.activity.inc
+++ /dev/null
@@ -1,56 +0,0 @@
-<?php
-
-/**
- * @file
- * provides the activity implementation for user_relationships_api module
- * @todo: Port to D7 once activity.module is available. Maybe move to separate
- *        module.
- */
-
-/**
- * Implementation of hook_activity_grants().
- */
-function user_relationships_api_activity_grants($activity) {
-  $relationships = array();
-  foreach (user_relationships_types_load() as $type_obj) {
-    $relationships["user_relationships_" . $type_obj->rtid] = array($activity->uid);
-  }
-  return $relationships;
-}
-
-/**
- * hook_activity_access_grants().
- */
-function user_relationships_api_activity_access_grants($account, $object = NULL, $type = NULL) {
-  // load up all the users relationships
-  $params = array(
-    'user' => $account->uid
-  );
-  $relationships = user_relationships_load($params);
-
-  $relationship_ids = array();
-  foreach ($relationships as $rid => $relationship) {
-    // is this approved yet?
-    $relationship_approved = (!$relationship->requires_approval || $relationship->approved);
-
-    if ($relationship_approved) {
-      // if the relationship is not one way, grant to the other uid
-      if (!$relationship->is_oneway) {
-        if ($relationship->requester_id == $account->uid) {
-          $relationship_ids["user_relationships_" . $relationship->rtid][] = $relationship->requestee_id;
-        }
-        else {
-          $relationship_ids["user_relationships_" . $relationship->rtid][] = $relationship->requester_id;
-        }
-      }
-      // if the relationship is one way, grant only if $account->uid == requester_id
-      elseif ($relationship->is_oneway) {
-        if ($relationship->requester_id == $account->uid) {
-          $relationship_ids["user_relationships_" . $relationship->rtid][] = $relationship->requestee_id;
-        }
-      }
-    }
-  }
-  return $relationship_ids;
-}
-
diff --git a/user_relationships_api/user_relationships_api.api.inc b/user_relationships_api/user_relationships_api.api.inc
deleted file mode 100644
index c78ab5a..0000000
--- a/user_relationships_api/user_relationships_api.api.inc
+++ /dev/null
@@ -1,525 +0,0 @@
-<?php
-
-/**
- * @file
- * User Relationships API. Data abstraction layer
- * @author Jeff Smick (creator)
- * @author Alex Karshakevich (maintainer) http://drupal.org/user/183217
- */
-
-/**
- * Public API for retrieving a specific relationship
- *
- * @param $param
- *    The rtid or an associative array of attributes to search for in selecting the
- *    relationship, such as rtid or name. Attributes must match column names
- *    in the user_relationship_types table.
- *
- * @param $reset
- *    a boolean that forces a reset of the internal static types list
- *
- * @return
- *    object of the requested relationship type
- *
- */
-function user_relationships_type_load($param = array(), $reset = NULL) {
-  $types = user_relationships_types_load($reset);
-
-  if (!is_array($param)) {
-    if (isset($types[$param])) {
-      return $types[$param];
-    }
-    return FALSE;
-  }
-
-  foreach ($types as $type) {
-    $found = TRUE;
-
-    foreach ($param as $column => $value) {
-      $column = strtolower($column);
-
-      if ($column == 'name' || $column == 'plural_name') {
-        $value = strtolower($value);
-        $col_val = strtolower($type->$column);
-      }
-      else {
-        $col_val = $type->$column;
-      }
-
-      // mismatch, move to the next type
-      if ($col_val != $value) {
-        $found = FALSE;
-        break;
-      }
-    }
-
-    if ($found) {
-      return $type;
-    }
-  }
-}
-
-
-/**
- * Load all relationship types.
- *
- * @param $reset
- *   A boolean that forces a reset of the internal static types list
- *
- * @return
- *   Array of relationship_type objects
- */
-function user_relationships_types_load($reset = FALSE) {
-  static $relationship_types_list = NULL;
-
-  if ($reset || !isset($relationship_types_list)) {
-    // Clear the cached list, since some relationships may have disappeared.
-    $relationship_types_list = db_query("SELECT * FROM {user_relationship_types}")->fetchAllAssoc('rtid');
-    if (empty($relationship_types_list)) {
-      // No relationships, avoid querying role permissions.
-      return $relationship_types_list;
-    }
-    // Load role permissions for all types.
-    $result = db_query('SELECT rtid, rid FROM {user_relationship_type_roles} WHERE rtid IN (:rtids) ORDER BY rtid, rid', array(':rtids' => array_keys($relationship_types_list)));
-    foreach ($result as $mapping) {
-      // roles is an associative array {role id} => {role id}.
-      $relationship_types_list[$mapping->rtid]->roles[$mapping->rid] = $mapping->rid;//] = $mapping->name;
-    }
-
-    // Load role receive permissions for all types.
-    $results = db_query('SELECT rtid, rid FROM {user_relationship_type_roles_receive} WHERE rtid IN (:rtids) ORDER BY rtid, rid', array(':rtids' => array_keys($relationship_types_list)));
-    foreach ($results as $mapping) {
-      // roles_receive is an associative array {role id} => {role id}.
-      $relationship_types_list[$mapping->rtid]->roles_receive[$mapping->rid] = $mapping->rid;
-    }
-  }
-
-  module_invoke_all('user_relationships_type_load', $relationship_types_list);
-
-  return $relationship_types_list;
-}
-
-
-/**
- * Create or Update a User Relationship Type
- *
- * @param $rtype
- *   A User Relationship type object
- */
-function user_relationships_type_save($rtype) {
-  module_invoke_all('user_relationships_type_presave', $rtype);
-
-  $op = (isset($rtype->rtid) && $rtype->rtid) ? 'update' : 'insert';
-
-  // find a relationship type with the name we're trying to save
-  // if it's an update action check to see that the rtypes match
-  // otherwise it's just invalid
-  if (
-    ($found_rt = user_relationships_type_load(array('name' => $rtype->name))) &&
-    ($op == 'update' ? $found_rt->rtid != $rtype->rtid : TRUE)
-  ) {
-    return FALSE;
-  }
-
-  // ensure "expires_val" is numeric and not negative
-  if (!is_numeric($rtype->expires_val) || $rtype->expires_val < 0) {
-    $rtype->expires_val = 0;
-  }
-
-  drupal_write_record('user_relationship_types', $rtype, ($op == 'update' ? 'rtid' : array()));
-
-  module_invoke_all('user_relationships_type_' . $op, $rtype);
-}
-
-
-/**
- * Delete a User Relationship Type
- *
- * @param $rtid
- *   A User Relationship type ID
- */
-function user_relationships_type_delete($rtid) {
-  $rtype = user_relationships_type_load($rtid);
-
-  db_delete('user_relationship_types')
-    ->condition('rtid', $rtid)
-    ->execute();
-  db_delete('user_relationships')
-    ->condition('rtid', $rtid)
-    ->execute();
-  db_delete('user_relationship_type_roles')
-    ->condition('rtid', $rtid)
-    ->execute();
-  db_delete('user_relationship_type_roles_receive')
-    ->condition('rtid', $rtid)
-    ->execute();
-
-  module_invoke_all('user_relationships_type_delete', $rtype);
-}
-
-
-/**
- * Request a new user relationship
- *
- * @param $requester
- *   object or UID of the requester
- * @param $requestee
- *   object  or UID of the requestee
- * @param $type
- *   object or RTID of the relationship type
- * @param $approved
- *    boolean status of the relationship
- *
- * @return
- *    object of the newly created relationship
- */
-function user_relationships_request_relationship($requester, $requestee = NULL, $type = NULL, $approved = FALSE) {
-  //#578372 check if this is a "new" type of invocation, where first argument is a relationship object
-  if (is_object($requester) && isset($requester->requester) && isset($requester->requestee) && isset($requester->type)) {
-    $relationship = $requester;
-    $requester = $relationship->requester;
-    $requestee = $relationship->requestee;
-    $type = $relationship->type;
-    if (isset($relationship->approved)) {
-      $approved = $relationship->approved;
-    }
-  }
-  else {
-    $relationship = new stdClass;
-  }
-  // translate an ID into an object
-  foreach (array('requester' => $requester, 'requestee' => $requestee, 'type' => $type) as $key => $value) {
-    if (!is_object($value)) {
-      $$key = $key == 'type' ? user_relationships_type_load($value) : user_load($value);
-    }
-  }
-
-  //check requester is allowed to create this rtype
-  if (!user_relationships_api_can_request($requester, $type)) {
-    watchdog('user_relationships_api', 'User %user has no suitable roles to request a %rtype relationship', array('%user' => format_username($requester), '%rtype' => $type->name), WATCHDOG_WARNING);
-    //it would be good to return a reason why save is denied, but it's the API portion, it does not expose anything user-visible
-    return FALSE;
-  }
-
-  //check requestee is allowed to receive this rtype
-  if (!user_relationships_api_can_receive($requestee, $type)) {
-    watchdog('user_relationships_api', 'User %user has no suitable roles to receive a %rtype relationship', array('%user' => format_username($requestee), '%rtype' => $type->name), WATCHDOG_WARNING);
-    //it would be good to return a reason why save is denied, but it's the API portion, it does not expose anything user-visible
-    return FALSE;
-  }
-
-  // check whether this relationship aleady exists
-  if (!$type->is_oneway || !$type->is_reciprocal) {
-    $existing = user_relationships_load(array('between' => array($requester->uid, $requestee->uid), 'rtid' => $type->rtid), array('count' => TRUE));
-  }
-  else {
-    $existing = user_relationships_load(array('requester_id' => $requester->uid, 'requestee_id' => $requestee->uid, 'rtid' => $type->rtid), array('count' => TRUE));
-  }
-
-  if (!$existing) {
-    $relationship->requester_id = $requester->uid;
-    $relationship->requestee_id = $requestee->uid;
-    $relationship->approved = $approved || !$type->requires_approval || (isset($requestee->data['user_relationships_ui_auto_approve']) && isset($requestee->data['user_relationships_ui_auto_approve'][$type->rtid]));
-    $relationship->rtid = $type->rtid;
-
-    return user_relationships_save_relationship($relationship);
-  }
-}
-
-
-/**
- * Create or update a user relationship.
- *
- * @param $relationship
- *   Object of the current relationship.
- * @param $action
- *   The reason for the update (request, approve, update).
- *
- * @return
- *   Object of the updated relationship or FALSE if the relationship wasn't
- *   able to save
- */
-function user_relationships_save_relationship($relationship, $action = 'request') {
-  //set basic info if it doesn't already exist
-  !isset($relationship->flags) ? $relationship->flags = UR_OK : NULL;
-  !isset($relationship->created_at) ? $relationship->created_at = REQUEST_TIME : NULL;
-  $relationship->updated_at = REQUEST_TIME;
-
-  if ($action == 'approve') {
-    $relationship->approved = 1;
-  }
-
-  // Start a transaction so that we can roll back in case of an error.
-  $transaction = db_transaction();
-  try {
-    module_invoke_all('user_relationships_presave', $relationship);
-
-    if (isset($relationship->rid)) {
-      // Delete possible requests coming the other direction
-      $relationship_type = user_relationships_type_load($relationship->rtid);
-      if (!$relationship_type->is_oneway) {
-        db_delete('user_relationships')
-          ->condition('rtid', $relationship->rtid)
-          ->condition('requester_id', $relationship->requestee_id)
-          ->condition('requestee_id', $relationship->requester_id)
-          ->execute();
-      }
-    }
-
-    //#454680 make sure that an update is performed if this is an existing relationship
-    if (drupal_write_record('user_relationships', $relationship, (isset($relationship->rid) ? array('rid') : array()))) {
-      // if the relationship has been approved and is two-way we need
-      // to do a double entry for DB efficiency
-      $relationship_type = user_relationships_type_load($relationship->rtid);
-      if ($relationship->approved && !$relationship_type->is_oneway) {
-        //#365623 drupal_write_record will not work because rid is a serial field, and we need to use the same rid
-        // @todo: Verify that this doesn't cause problems when an existing
-        // relationship is updated again after being approved.
-        $select = db_select('user_relationships', 'ur')
-          ->fields('ur', array('rid', 'requester_id', 'requestee_id', 'rtid', 'approved', 'created_at', 'updated_at', 'flags'))
-          ->condition('rid', $relationship->rid);
-        db_insert('user_relationships')
-          ->fields(array('rid', 'requestee_id', 'requester_id', 'rtid', 'approved', 'created_at', 'updated_at', 'flags'))
-          ->from($select)
-          ->execute();
-      }
-    }
-
-    // Don't execute a different hook for update/insert since that is not
-    // relevant. The $action is important if someone needs to differentiate.
-    module_invoke_all('user_relationships_save', $relationship, $action);
-    return $relationship;
-  }
-  catch (Exception $e) {
-    $transaction->rollback();
-    watchdog_exception('user_relationships', $e);
-    return FALSE;
-  }
-}
-
-
-/**
- * Public API for deleting a relationship.
- *
- * @param $relationship
- *    object of the relationship
- * @param $deleted_by
- *    object of the user that initiated the delete command
- * @param $action
- *    string reason for removal ('cancel','disapprove','remove')
- */
-function user_relationships_delete_relationship($relationship, $deleted_by, $action = 'remove') {
-  $relationship->deleted_by = $deleted_by;
-  db_delete('user_relationships')
-    ->condition('rid', $relationship->rid)
-    ->execute();
-
-  module_invoke_all('user_relationships_delete', $relationship, $action);
-}
-
-
-/**
-  * Load relationship objects from the database.
-  *
-  * @param $param
-  *   an array of parameters with the key being the column. columns from both the user_relationships and user_relationship_types tables will work
-  *     columns from user_relationships: rid, requester_id, requestee_id, rtid, approved, created_at, updated_at, flags
-  *     columns from user_relationship_types: name, plural_name, is_oneway, requires_approval, expires_val
-  *   There are two special keys:
-  *     1) array("between" => array($uid1, $uid2)) will return all relationships between the two user ids.
-  *     2) array("user" => $uid) will return all relationships for the specified uid
-  *
-  *   arguments will process operators as well using the syntax: array(col => '> {value}').
-  *     example: show all relationships created in 2007
-  *       $start_time = mktime(0,0,0,0,0,2007);
-  *       $end_time = mktime(0,0,0,0,0,2008);
-  *       user_relationships_load(array('created_at' => ">= {$start_time}", 'created_at' => '< {$end_time'}));
-  *
-  *   each parameter may be an array, if you wish to pass several values
-  *     example: user_relationships_load(array('rtid' => array(2, 3), 'between' => array($uid1, $uid2)))
-  *       will load all relationships of types 2 or 3 between uid1 and uid2 (query will have an IN clause)
-  *
-  * @param @options
-  *   An array keyed by the option
-  *   count
-  *     a boolean stating whether or not the return value should be the number of relationships found
-  *
-  *   sort
-  *     a string containing a valid column name which will become the key for the returned array of relationships
-  *     default is 'rid'
-  *
-  *   order
-  *     a string containing SQL stating the column and direction of the sort (ex. "requester_id ASC, rtid DESC")
-  *
-  *   limit
-  *     a string containing SQL stating the limit (ex "10" or "10, 5")
-  *
-  *   include_user_info
-  *     a boolean that will load basic user info without having to call user_load
-  *     columns: uid, name, mail, data, picture
-  *
-  *   include_twoway_reverse (not used unless there is a specific need)
-  *     a boolean that, if present, and if sort is set to other than 'rid', will include records for both directions for
-  *     two-way relationships. Normally for a two-way relationship only one entry is returned, although in the database there
-  *     are two records. This flag has no effect if sort is 'rid'
-  *
-  * @param $reset
-  *   a boolean that will reset the internal static $relationships variable to ensure programatic relationship insertion works
-  *
-  * @return
-  *   an array of relationships
-  *   if the key is "rid" the array will be a single dimention: array($rid => $relationship, $rid => $relationship)
-  *   otherwise it'll be multidimentional: array($rtid => array($relationship, $relationship))
-  *
-  *   each relationship will have the user's name, mail, and data attached as requester_name, requester_mail, requester_data
-  *   or requestee_name, requestee_mail, requestee_data
- */
-function user_relationships_load($param = array(), $options = array(), $reset = FALSE) {
-  static $relationships = array();
-
-  $default_options = array(
-    'sort' => 'rid',
-  );
-  $options = array_merge($default_options, $options);
-  extract($options, EXTR_SKIP);
-
-  $arguments = array();
-  if (is_numeric($param)) {
-    if (!$reset && isset($relationships[$param])) {
-      return is_object($relationships[$param]) ? clone $relationships[$param] : $relationships[$param];
-    }
-    $rid = $param;
-    $param = array('rid' => $param);
-  }
-
-  $options['only_count'] = !empty($count);
-
-  $query = _user_relationships_generate_query($param, $options);
-
-  if (!empty($count)) {
-    return (int)$query->execute()->fetchField();
-  }
-
-  $relationships = array();
-  foreach ($query->execute() as $relationship) {
-    if (isset($include_user_info)) {
-      user_relationships_api_translate_user_info($relationship);
-    }
-
-    if ($sort == 'rid') {
-      $relationships[$relationship->$sort] = $relationship;
-    }
-    else {
-      $relationships[$relationship->$sort][] = $relationship;
-    }
-  }
-
-  if (isset($rid) && !isset($relationships[$rid])) {
-    return FALSE;
-  }
-
-  // Always call the hook with an array, even though there is only single entry.
-  if (isset($rid)) {
-    $return = $relationships[$rid];
-    module_invoke_all('user_relationships_load', array($rid => $return));
-  }
-  else {
-    $return = $relationships;
-    // Only execute the hook if the array is not empty.
-    if (!empty($return)) {
-      module_invoke_all('user_relationships_load', $return);
-    }
-  }
-  return $return;
-}
-
-
-/**
- * Used when the "include_user_info" option is set on user_relationships_load
- * to translate the retrieved user fields into actual user objects. This allows us
- * to pull the basic user data without having to run user_load
- *
- * @param $relationship
- *    The relationship object with pulled user info
- */
-function user_relationships_api_translate_user_info(&$relationship) {
-  if ($relationship->requester_name) {
-    foreach (array('requester', 'requestee') as $user_type) {
-      $relationship->{$user_type} = new stdClass();
-      foreach (array('name', 'mail', 'data', 'picture') as $field) {
-        $db_field = "{$user_type}_{$field}";
-        $relationship->{$user_type}->{$field} = $relationship->{$db_field};
-
-        unset($relationship->{$db_field});
-      }
-      $user_type_id = "{$user_type}_id";
-      $relationship->{$user_type}->uid = $relationship->{$user_type_id};
-      $relationship->{$user_type}->data = unserialize($relationship->{$user_type}->data);
-    }
-  }
-}
-
-/**
- * Check whether a user is allowed to request a certain relationship type
- *
- * @param $requester requesting user object or uid
- * @param $relationship_type loaded relationship type object or rtid
- * @return TRUE iff requester is allowed to request this type of relationship
- */
-function user_relationships_api_can_request($requester, $relationship_type) {
-  //validate arguments
-  if (is_numeric($requester)) {
-    $requester = user_load($requester);
-  }
-  if (is_numeric($relationship_type)) {
-    $relationship_type = user_relationships_type_load($relationship_type);
-  }
-  if (!is_object($requester) || !is_object($relationship_type)) {
-    return FALSE;
-  }
-  if ($requester->uid == 1) {
-    return TRUE;
-  }
-  //if no roles have been set, any user can request
-  if (!isset($relationship_type->roles) || !count($relationship_type->roles)) {
-    return TRUE;
-  }
-  //check user has at least one required role
-  foreach ($relationship_type->roles as $role_id) {
-    if (isset($requester->roles[$role_id])) {
-      return TRUE;
-    }
-  }
-  return FALSE;
-}
-
-/**
- * Check whether a user is allowed to receive a certain relationship type
- *
- * @param $requestee requesting user object or uid
- * @param $relationship_type loaded relationship type object or rtid
- * @return TRUE iff receiver is allowed to request this type of relationship
- */
-function user_relationships_api_can_receive($requestee, $relationship_type) {
-  //validate arguments
-  if (is_numeric($relationship_type)) {
-    $relationship_type = user_relationships_type_load($relationship_type);
-  }
-  if (is_numeric($requestee)) {
-    $requestee = user_load($requestee);
-  }
-  if (!is_object($requestee) || !is_object($relationship_type)) {
-    return FALSE;
-  }
-  //if no roles have been set to receive the relationship, any user can receive it
-  if (!isset($relationship_type->roles_receive) || !count($relationship_type->roles_receive)) {
-    return TRUE;
-  }
-  //check user has at least one required role
-  foreach ($relationship_type->roles_receive as $role_id) {
-    if (isset($requestee->roles[$role_id])) {
-      return TRUE;
-    }
-  }
-  return FALSE;
-}
diff --git a/user_relationships_api/user_relationships_api.api.php b/user_relationships_api/user_relationships_api.api.php
deleted file mode 100644
index 4ce42f0..0000000
--- a/user_relationships_api/user_relationships_api.api.php
+++ /dev/null
@@ -1,131 +0,0 @@
-<?php
-
-/**
- * @file
- * This file documents all hooks for user_relationships_api.module
- */
-
-/**
- * Act when relationship types are loaded.
- *
- * @param $relationship_types_list
- *   A list of relationship types, keyed by rtid.
- *
- * @see user_relationhips_type_load_multiple()
- */
-function hook_user_relationships_type_load($relationship_types_list) {
-
-}
-
-/**
- * This hook is executed before an existing or new relationship type is saved.
- *
- * @param $relationship_type
- *   Relationship type object.
- *
- * @see user_relationships_type_save()
- */
-function hook_user_relationships_type_presave($relationship_type) {
-
-}
-
-/**
- * This hook is executed after an relationship type has been updated.
- *
- * @param $relationship_type
- *   Relationship type object.
- *
- * @see user_relationships_type_save()
- */
-function hook_user_relationships_type_update($relationship_type) {
-
-}
-
-/**
- * This hook is executed after a new relationship type has been inserted.
- *
- * @param $relationship_type
- *   Relationship type object.
- *
- * @see user_relationships_type_save()
- */
-function hook_user_relationships_type_insert($relationship_type) {
-
-}
-
-/**
- * This hook is executed after a relationship type has been deleted.
- *
- * @param $relationship_type
- *   Relationship type object.
- *
- * @see user_relationships_type_delete()
- */
-function hook_user_relationships_type_delete($relationship_type) {
-
-}
-
-/**
- * Act when relationships are loaded.
- *
- * @param $relationship_list
- *   Array of relations, keyed by rid.
- *
- * @see user_relationships_load()
- */
-function hook_user_relationships_load($relationship_list) {
-
-}
-
-/**
- * This hook is executed before a relationship will be saved.
- *
- * @param $relationship
- *   Relationship object.
- *
- * @see user_relationships_save_relationship()
- */
-function hook_user_relationships_presave($relationship) {
-
-}
-
-/**
- * This hook is executed after a relationship has been updated.
- *
- * @param $relationship
- *   Relationship object.
- * @param $action
- *   The reason for the update (request, approve, update).
- *
- * @see user_relationships_save_relationship()
- */
-function hook_user_relationships_save($relationship, $action) {
-
-}
-
-/**
- * This hook is executed after a new relationship has been saved.
- *
- * @param $relationship
- *   Relationship object.
- *
- * @see user_relationships_save_relationship()
- */
-function hook_user_relationships_insert($relationship) {
-
-}
-
-/**
- * This hook is executed before a relationship will be saved.
- *
- * @param $relationship
- *   Relationship object.
- * @param $action
- *   String reason for removal ('cancel','disapprove','remove').
- *
- * @see user_relationships_delete_relationship()
- * 
- */
-function hook_user_relationships_delete($relationship, $action) {
-
-}
\ No newline at end of file
diff --git a/user_relationships_api/user_relationships_api.author-pane.inc b/user_relationships_api/user_relationships_api.author-pane.inc
deleted file mode 100644
index 9dc04c9..0000000
--- a/user_relationships_api/user_relationships_api.author-pane.inc
+++ /dev/null
@@ -1,100 +0,0 @@
-<?php
-
-/**
- * @file
- * integration with Author Pane for User Relationships API
- * @author Alex Karshakevich http://drupal.org/user/183217
- */
-
-/**
- * Implements hook_preprocess_author_pane().
- */
-function user_relationships_api_preprocess_author_pane(&$variables) {
-  // Check if this preprocess needs to be run given who's calling it.
-  if (function_exists('author_pane_run_preprocess') && !author_pane_run_preprocess('user_relationships_api', $variables['caller'])) {
-    return;
-  }
-
-  global $user;
-  $account = $variables['account'];
-
-  // Anonymous users and users viewing their own account won't get a link.
-  if (!$user->uid || !$account->uid || $user->uid == $account->uid) {
-    return;
-  }
-
-  $rtids = variable_get('user_relationships_api_author_pane_rtids', array());
-  if (!is_array($rtids)) {
-    $rtids = array($rtids);//wrap into array for now, while selection is single
-  }
-  if (!count($rtids)) {
-   return;
-  }
-  // Get a list of selected relationship types
-  $all_rtypes = user_relationships_types_load();
-  $rtypes = array();
-  foreach ($rtids as $rtid) {
-    $rtypes[] = $all_rtypes[$rtid];
-  }
-
-  foreach ($rtypes as $rtype) {
-    $relationships = user_relationships_load(array('requester_id' => $user->uid, 'requestee_id' => $account->uid, 'rtid' => $rtype->rtid));
-
-    if (count($relationships)) {
-      // Existing relationship; need remove icon/link. (Despite the foreach,
-      // there should only be one.)
-      foreach ($relationships as $rtid => $relationship) {
-        $link_label = t('Remove @name from @rel_plural_name', array('@name' => format_username($account), '@rel_plural_name' => $relationship->plural_name));
-        $css_class = array(str_replace(' ', '-', $relationship->name), 'author-pane-link', 'user_relationships_popup_link', 'author-relationship-remove-icon');
-        //link to remove
-        if (!isset($variables['user_relationships_api'])) {
-          $variables['user_relationships_api'] = '';
-        }
-        $variables['user_relationships_api'] .= '<div class="author-pane-ur-link-item">';
-        $variables['user_relationships_api'] .=
-          l('<span>' . t('Remove @rel_name', array('@name' => format_username($account), '@rel_name' => ur_tt("user_relationships:rtid:$relationship->rtid:name", $relationship->name))) . '</span>',
-          "user/{$user->uid}/relationships/{$relationship->rid}/remove",
-          array(
-                'query' => drupal_get_destination(),
-                'html' => TRUE,
-                'attributes'  => array('title' => $link_label, 'class' => $css_class),
-          ));
-        $variables['user_relationships_api'] .= '</div>';
-      }
-    }
-    else {
-      //No existing relationship; need an add icon/link.
-      if (!user_relationships_api_can_request($user, $rtype) || !user_relationships_api_can_receive($account, $rtype)) {
-        continue;
-      }
-      $relationships_count = user_relationships_load(array('between' => array($user->uid, $account->uid)), array('count' => TRUE));
-      $link_label = t('Add @rel_name', array('@rel_name' => ur_tt("user_relationships:rtid:$rtype->rtid:name", $rtype->name)));
-      $css_class = array(str_replace(' ', '-', $relationship->name), 'author-pane-link', 'user_relationships_popup_link', 'author-relationship-remove-icon');
-      //add link
-      if (!isset($variables['user_relationships_api'])) {
-        $variables['user_relationships_api'] = '';
-      }
-      $variables['user_relationships_api'] .= '<div class="author-pane-ur-link-item">';
-      $variables['user_relationships_api'] .=
-        l('<span>' . t('Add @rel_name', array('@name' => format_username($account), '@rel_name' => ur_tt("user_relationships:rtid:$rtype->rtid:name", $rtype->name))) . '</span>',
-          "relationship/{$account->uid}/request/{$rtype->rtid}",
-          array(
-            'query' => drupal_get_destination(),
-            'html' => TRUE,
-            'attributes'  => array(
-              'title' => t('Become @name\'s @rel_name', array('@name' => format_username($account), '@rel_name' => ur_tt("user_relationships:rtid:$rtype->rtid:name", $rtype->name))),
-              'class' => $css_class
-            ),
-          )
-        );
-      $variables['user_relationships_api'] .= '</div>';
-    }
-  }
-}
-
-/**
- * Implements hook_author_pane_allow_preprocess_disable().
- */
-function user_relationships_api_author_pane_allow_preprocess_disable() {
-  return array('user_relationships_api' => 'User Relationships');
-}
diff --git a/user_relationships_api/user_relationships_api.info b/user_relationships_api/user_relationships_api.info
deleted file mode 100644
index d6f18a4..0000000
--- a/user_relationships_api/user_relationships_api.info
+++ /dev/null
@@ -1,5 +0,0 @@
-name = UR-API
-description = "API for User Relationships. This only provides the programming interface."
-package = "User Relationships"
-core = 7.x
-files[]=tests/user_relationships_api.api.test
diff --git a/user_relationships_api/user_relationships_api.install b/user_relationships_api/user_relationships_api.install
deleted file mode 100644
index 77bde8d..0000000
--- a/user_relationships_api/user_relationships_api.install
+++ /dev/null
@@ -1,78 +0,0 @@
-<?php
-
-/**
- * @file
- * User Relationships API Module installation file.
- */
-
-/**
- * Implements hook_schema().
- */
-function user_relationships_api_schema() {
-  $schema['user_relationships'] = array(
-    'fields' => array(
-      'rid'           => array('type' => 'serial', 'not null' => TRUE),
-      'requester_id'  => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
-      'requestee_id'  => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
-      'rtid'          => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
-      'approved'      => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny'),
-      'created_at'    => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
-      'updated_at'    => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
-      'flags'         => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
-    ),
-    'primary key' => array('requester_id', 'requestee_id', 'rtid'),
-    'indexes' => array(
-      'requester_id' => array('requester_id'),
-      'requestee_id' => array('requestee_id'),
-      'rtid' => array('rtid'),
-      'rid' => array('rid'),
-    ),
-  );
-
-  $schema['user_relationship_types'] = array(
-    'fields' => array(
-      'rtid'              => array('type' => 'serial', 'unsigned' => TRUE, 'not null' => TRUE),
-      'name'              => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
-      'plural_name'       => array('type' => 'varchar', 'length' => 255, 'not null' => TRUE, 'default' => ''),
-      'is_oneway'         => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny'),
-      'is_reciprocal'     => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny'),
-      'requires_approval' => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny'),
-      'expires_val'       => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
-    ),
-    'unique keys' => array(
-      'name'  => array('name'),
-    ),
-    'primary key' => array('rtid')
-  );
-
-  $schema['user_relationship_type_roles'] = array(
-    'fields' => array(
-      'rtid'              => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
-      'rid'              => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
-    ),
-    'primary key' => array('rtid', 'rid'),
-    'indexes' => array(
-      'rtid' => array('rtid'),
-    )
-  );
-
-  $schema['user_relationship_type_roles_receive'] = array(
-    'fields' => array(
-      'rtid'              => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
-      'rid'              => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0),
-    ),
-    'primary key' => array('rtid', 'rid'),
-    'indexes' => array(
-      'rtid' => array('rtid'),
-    )
-  );
-
-  return $schema;
-}
-
-/**
- * Implements hook_update_last_removed().
- */
-function user_relationships_api_last_removed() {
-  return 6103;
-}
\ No newline at end of file
diff --git a/user_relationships_api/user_relationships_api.module b/user_relationships_api/user_relationships_api.module
deleted file mode 100644
index 57bd9d9..0000000
--- a/user_relationships_api/user_relationships_api.module
+++ /dev/null
@@ -1,289 +0,0 @@
-<?php
-
-/**
- * @file
- * User Relationships API. Module shell.
- * @see user_relationships_api.api.inc
- * @author Jeff Smick (creator)
- * @author Alex Karshakevich (maintainer) http://drupal.org/user/183217
- */
-
-define('UR_OK', 0x0);
-define('UR_BANNED', 0x1);
-
-// @todo Move functions into this file and remove the explicit include.
-module_load_include("inc", "user_relationships_api", "user_relationships_api.api");
-
-/**
- * Helper function to generate the main and count queries from a list of parameters and options
- */
-function _user_relationships_generate_query($param = array(), $options = array()) {
-  extract($options, EXTR_SKIP);
-
-  $twoway_reverse_clause = FALSE;//#479486
-  // Turn the conditions into a query.
-  $query = db_select('user_relationships', 'ur');
-  $query->innerJoin('user_relationship_types', 'urt', 'urt.rtid = ur.rtid');
-  foreach ($param as $key => $value) {
-    if (!isset($value)) {
-      continue;
-    }
-
-    switch ($key) {
-    case 'between':
-      $or = db_or()->condition(db_and()
-          ->condition('ur.requester_id', $value[0])
-          ->condition('ur.requestee_id', $value[1])
-      );
-      $and = db_and()
-        ->condition('ur.requestee_id', $value[0])
-        ->condition('ur.requester_id', $value[1]);
-      //#479486 do not include reverse records of two-way relationships by default
-      if (!isset($include_twoway_reverse)) {
-        $and->condition(db_or()
-          ->condition('ur.approved', 1, '<>')
-          ->condition('urt.is_oneway', 0, '<>'));
-        $twoway_reverse_clause = TRUE;
-      }
-      $or->condition($and);
-      $query->condition($or);
-      break;
-
-    case 'user':
-      //#479486 when showing all user's relationships, do not include reverse records of two-way relationships
-      if (!isset($include_twoway_reverse)) {
-        $query->condition(db_or()
-          ->condition('ur.requester_id', $value)
-          ->condition(db_and()
-            ->condition(db_or()
-              ->condition('ur.approved', 1, '<>')
-              ->condition('urt.is_oneway', 0, '<>')
-            )
-            ->condition('ur.requestee_id', $value)
-          )
-        );
-        $twoway_reverse_clause = TRUE;
-      }
-      else {
-        $query->condition(db_or()
-          ->condition('ur.requester_id', $value)
-          ->condition('ur.requestee_id', $value)
-        );
-      }
-      $arguments[] = $value;
-      break;
-
-    case 'requester_id':
-    case 'requestee_id':
-      $twoway_reverse_clause = TRUE;//#479486 these columns automatically should exclude duplicates
-
-    default:
-      $types_cols = array('name', 'plural_name', 'is_oneway', 'is_reciprocal', 'requires_approval', 'expires_val');
-      $prefix = !in_array($key, $types_cols) ? 'ur' : 'urt';
-      $query->condition($prefix . '.' . $key, $value);
-    }
-  }
-
-  //#479486 add a general clause that removed reverse direction from two-way relationship results, unless it's been addressed above
-  if (!$twoway_reverse_clause && !isset($include_twoway_reverse)) {
-    $query->condition(db_or()
-      ->condition('urt.is_oneway', 0, '<>')
-      ->condition('ur.approved', 1, '<>')
-      ->where('ur.requester_id < ur.requestee_id')
-    );
-    $twoway_reverse_clause = TRUE;
-  }
-
-  if (!empty($only_count) || !empty($paging)) {
-    $count = clone $query;
-    $count->addExpression('COUNT(DISTINCT rid)', 'count');
-  }
-  $query
-    ->distinct()
-    ->fields('ur')
-    ->fields('urt');
-
-  if (isset($include_user_info) && $include_user_info) {
-    $query->addField('requesters', 'name', 'requester_name');
-    $query->addField('requesters', 'mail', 'requester_mail');
-    $query->addField('requesters', 'data', 'requester_data');
-    $query->addField('requesters', 'picture', 'requester_picture');
-    $query->addField('requestees', 'name', 'requestee_name');
-    $query->addField('requestees', 'mail', 'requestee_mail');
-    $query->addField('requestees', 'data', 'requestee_data');
-    $query->addField('requestees', 'picture', 'requestee_picture');
-
-    $query->innerJoin('users', 'requesters', 'ur.requester_id = requesters.uid');
-    $query->innerJoin('users', 'requestees', 'ur.requestee_id = requestees.uid');
-  }
-  if (!empty($order)) {
-    if (is_array($order)) {
-      $query->orderBy($order[0], $order[1]);
-    }
-    else {
-      $query->orderBy($order);
-    }
-  }
-  if (!empty($limit)) {
-    $offset = !empty($offset) ? $offset : 0;
-    $query->range($offset, $limit);
-  }
-  if (!empty($only_count)) {
-    return $count;
-  }
-  if (!empty($paging)) {
-    $query = $query
-      ->extend('PagerDefault')
-      ->limit($paging);
-    $query->setCountQuery($count);
-  }
-  return $query;
-}
-
-
-/**
- * hook_perm()
- */
-function user_relationships_api_permission() {
-  return array('can have relationships' => array(
-    'title' => t('Can have relationships'),
-    'description' => t('The user is allowed to have and accept relationships.'),
-  ));
-}
-
-
-/**
- * hook_cron()
- */
-function user_relationships_api_cron() {
-  $now = REQUEST_TIME;
-
-  // only expire relationships once a day
-  $last_cron = variable_get('user_relationships_last_expire', 0);
-  if ($now < $last_cron + 86400) {
-    return FALSE;
-  }
-
-  $result = db_query(
-    " SELECT ur.rid
-      FROM {user_relationships} ur
-        INNER JOIN {user_relationship_types} urt ON ur.rtid = urt.rtid
-      WHERE ur.approved = 0
-        AND urt.expires_val > 0
-        AND ur.updated_at < (:now - (urt.expires_val * 86400))
-      GROUP BY ur.rid", array(':now' => $now)
-  );
-  $expired_requests = $result->fetchCol();
-  if (count($expired_requests)) {
-    db_delete('user_relationships')
-      ->condition('rid', $expired_requests)
-      ->execute();
-    //FIXME: this will trigger various hook_user_relationships() but will not pass a valid relationship object. E.g. in mailer.
-    module_invoke_all('user_relationships_delete', $expired_requests);
-  }
-
-  // remember when we last expired relationships
-  variable_set('user_relationships_last_expire', $now);
-  return TRUE;
-}
-
-
-/**
- * Implements hook_user_cancel().
- */
-function user_relationships_api_user_cancel($edit, $account, $method) {
-    db_delete('user_relationships')
-      ->condition(db_or()
-        ->condition('requester_id', $account->uid)
-        ->condition('requestee_id', $account->uid)
-      )
-      ->execute();
-}
-
-/**
- * Wrapper function for tt() if i18nstrings enabled.
- */
-function ur_tt($name, $string, $langcode = NULL, $update = FALSE) {
-  if (module_exists('i18nstrings')) {
-    return tt($name, $string, $langcode, $update);
-  }
-  else {
-    return $string;
-  }
-}
-
-/**
- * Implements hook_activity_info().
- */
-function user_relationships_api_activity_info() {
-  $info = new stdClass();
-  $info->api = 2;
-  $info->name = 'user_relationships_api';
-  $info->object_type = 'user_relationships_api';
-  $info->objects = array('Requester' => 'requester', 'Requestee' => 'requestee', 'Relationship' => 'relationship');
-  $info->hooks = array('user_relationships_api' => array('approve', 'request'));
-  foreach (user_relationships_types_load() as $type_obj) {
-    $info->realms["user_relationships_" . $type_obj->rtid] = $type_obj->plural_name;
-  }
-  return $info;
-}
-
-/**
- * Implements hook_token_list().
- */
-function user_relationships_api_token_list($type = 'all') {
-  if ($type == 'requester') {
-    $tokens['user_relationships_api'] = array(
-      'requester' => t('The user who issued the connection request.'),
-    );
-  }
-  elseif ($type == 'relationship') {
-    $tokens['user_relationships_api'] = array(
-      'requestee' => t('The user who approved the connnection request.'),
-      'relationship-name' => t('The relationship name (singular form)'),
-    );
-  }
-  return $tokens;
-}
-
-/**
- * Implements hook_token_values().
- */
-function user_relationships_api_token_values($type, $data = NULL, $options = array()) {
-  if ($type == 'requester') {
-    $r = $data;
-    $token_values = array(
-      'requester' => theme('username', array('account' => user_load($r->uid))),
-    );
-  }
-  elseif ($type == 'requestee') {
-    $r = $data;
-    $token_values = array(
-      'requestee' => theme('username', array('account' => user_load($r->uid))),
-    );
-  }
-  elseif ($type == 'relationship') {
-    // http://drupal.org/node/811222 need to unwrap the relationship object from an array sometimes
-    if (is_array($data)) {
-      foreach ($data as $object) {
-        if (is_object($object)) {
-          $r = $object;
-          break;
-        }
-      }
-    }
-    else {
-      $r = $data;
-    }
-
-    $r_type = user_relationships_type_load((int) $r->rtid);
-
-    $token_values = array(
-      'requestee' => theme('username', array('account' => user_load($r->requestee_id))),
-      'requester' => theme('username', array('account' => user_load($r->requester_id))),
-      'relationship-name' => drupal_placeholder($r_type->name),
-    );
-  }
-
-  return isset($token_values) ? $token_values : NULL;
-}
diff --git a/user_relationships_panels_visibility/user_relationships_panels_visibility.info b/user_relationships_panels_visibility/user_relationships_panels_visibility.info
index 19d6c07..0118fc0 100644
--- a/user_relationships_panels_visibility/user_relationships_panels_visibility.info
+++ b/user_relationships_panels_visibility/user_relationships_panels_visibility.info
@@ -1,6 +1,6 @@
 name = UR-Panels Visibility
 description = "Provide visibility for panels panes and pages based on User Relationships"
-dependencies[] = user_relationships_api
+dependencies[] = user_relationships
 dependencies[] = ctools
 core = 6.x
 package = "User Relationships"
diff --git a/user_relationships_rules/user_relationships_rules.info b/user_relationships_rules/user_relationships_rules.info
index 27cdaf2..42452fb 100755
--- a/user_relationships_rules/user_relationships_rules.info
+++ b/user_relationships_rules/user_relationships_rules.info
@@ -2,5 +2,5 @@ name = UR-Rules
 description = "Rules integration for User Relationships."
 package = "User Relationships"
 core = 7.x
-dependencies[] = user_relationships_api
+dependencies[] = user_relationships
 dependencies[] = rules
\ No newline at end of file
diff --git a/user_relationships_ui/user_relationships_ui.actions.inc b/user_relationships_ui/user_relationships_ui.actions.inc
index 6883e2b..9578b5f 100644
--- a/user_relationships_ui/user_relationships_ui.actions.inc
+++ b/user_relationships_ui/user_relationships_ui.actions.inc
@@ -38,7 +38,7 @@ function user_relationships_ui_request_validate($form, &$form_state) {
       }
     }
     //check user is allowed to request this type
-    if (!user_relationships_api_can_request($requester, $rtype)) {
+    if (!user_relationships_can_request($requester, $rtype)) {
       $rtype->requester = $requester;
       $rtype->requestee = $requestee;
       form_set_error('rtid', user_relationships_ui_get_message('relationship_type_not_allowed', $rtype));
@@ -51,7 +51,7 @@ function user_relationships_ui_request_validate($form, &$form_state) {
     }
 
     //check user is allowed to receive this type
-    if (!user_relationships_api_can_receive($requestee, $rtype)) {
+    if (!user_relationships_can_receive($requestee, $rtype)) {
       $rtype->requester = $requester;
       $rtype->requestee = $requestee;
       form_set_error('rtid', user_relationships_ui_get_message('relationship_type_not_allowed', $rtype));
diff --git a/user_relationships_ui/user_relationships_ui.admin.inc b/user_relationships_ui/user_relationships_ui.admin.inc
index 9c01084..ee41434 100644
--- a/user_relationships_ui/user_relationships_ui.admin.inc
+++ b/user_relationships_ui/user_relationships_ui.admin.inc
@@ -137,11 +137,11 @@ function user_relationships_ui_settings() {
       foreach ($rtypes as $rtype) {
         $options[$rtype->rtid] = $rtype->name;
       }
-      $form['author_pane']['user_relationships_api_author_pane_rtids'] = array(
+      $form['author_pane']['user_relationships_author_pane_rtids'] = array(
         '#type' => 'select',
         '#multiple' => TRUE,
         '#title' => t('Relationship types to use'),
-        '#default_value' => variable_get('user_relationships_api_author_pane_rtids', 'absolute'),
+        '#default_value' => variable_get('user_relationships_author_pane_rtids', 'absolute'),
         '#options' => $options,
         '#description' => t('The chosen relationship types will be used for add/remove links.'),
       );
diff --git a/user_relationships_ui/user_relationships_ui.info b/user_relationships_ui/user_relationships_ui.info
index 3849a5f..e1c66bb 100644
--- a/user_relationships_ui/user_relationships_ui.info
+++ b/user_relationships_ui/user_relationships_ui.info
@@ -1,12 +1,5 @@
 name = UR-UI
 description = "User Relationships UI. This enables basic UI functionality for User Relationships"
 package = "User Relationships"
-dependencies[] = user_relationships_api
+dependencies[] = user_relationships
 core = 7.x
-files[]=user_relationships_ui.actions.inc
-files[]=user_relationships_ui.admin.inc
-files[]=user_relationships_ui.admin_actions.inc
-files[]=user_relationships_ui.forms.inc
-files[]=user_relationships_ui.module
-files[]=user_relationships_ui.pages.inc
-files[]=user_relationships_ui.theme.inc
diff --git a/user_relationships_ui/user_relationships_ui.install b/user_relationships_ui/user_relationships_ui.install
index 106297d..9e74771 100644
--- a/user_relationships_ui/user_relationships_ui.install
+++ b/user_relationships_ui/user_relationships_ui.install
@@ -23,5 +23,29 @@ function user_relationships_ui_uninstall() {
   variable_del('user_relationships_allow_multiple');
   variable_del('user_relationships_allow_auto_approve');
   variable_del('user_relationships_enable_author_pane');
+  variable_del('user_relationships_author_pane_rtids');
+}
+
+/**
+ * Enable renamed user_relationships module and update changed variables.
+ */
+function user_relationships_ui_update_7001() {
+
+  // Create a faked entry in {system} to avoid re-installing the schema of the
+  // user_relationships module.
+  db_update('system')
+   ->fields(array(
+     'schema_version' => 0,
+   ))
+   ->condition('name', 'user_relationships')
+   ->execute();
+
+  module_enable(array('user_relationships'));
+
+  // Rename variable.
+  $rtids = variable_get('user_relationships_api_author_pane_rtids', array());
+  if (!empty($rtids)) {
+    variable_set('user_relationships_author_pane_rtids', $rtids);
+  }
   variable_del('user_relationships_api_author_pane_rtids');
 }
diff --git a/user_relationships_ui/user_relationships_ui.module b/user_relationships_ui/user_relationships_ui.module
index f873f4b..e4c99ed 100644
--- a/user_relationships_ui/user_relationships_ui.module
+++ b/user_relationships_ui/user_relationships_ui.module
@@ -246,7 +246,7 @@ function _user_relationships_ui_actions_between(&$viewer, &$viewed, $action_type
         //draw a single link, or one for each relationship type
         foreach ($all_relationships as $rtid => $relationship) {
           //check this type can be requested
-          if (!user_relationships_api_can_request($viewer, $relationship) || !user_relationships_api_can_receive($viewed, $relationship) || !user_access('maintain own relationships')) {
+          if (!user_relationships_can_request($viewer, $relationship) || !user_relationships_can_receive($viewed, $relationship) || !user_access('maintain own relationships')) {
             continue;
           }
           $list[] = theme('user_relationships_request_relationship_direct_link', array('relate_to' => $viewed, 'relationship_type' => $relationship));
@@ -339,7 +339,7 @@ function _user_relationships_ui_get_requestable_rtypes($requester, $requestee) {
       continue;
     }
     //exclude types that are not allowed
-    if (!user_relationships_api_can_request($requester, $rtype) || !user_relationships_api_can_receive($requestee, $rtype)) {
+    if (!user_relationships_can_request($requester, $rtype) || !user_relationships_can_receive($requestee, $rtype)) {
       continue;
     }
     $relationships[$rtype->rtid] = ur_tt("user_relationships:rtid:$rtype->rtid:name", $rtype->name);
-- 
1.7.4.1

