diff -urN user_relationships-6.x-1.x-dev-20090713/user_relationships_api/user_relationships_api.api.inc user_relationships-6.x-1.x-dev-20090713-work/user_relationships_api/user_relationships_api.api.inc
--- user_relationships-6.x-1.x-dev-20090713/user_relationships_api/user_relationships_api.api.inc	2009-07-06 23:55:04.000000000 +0800
+++ user_relationships-6.x-1.x-dev-20090713-work/user_relationships_api/user_relationships_api.api.inc	2009-07-19 15:50:13.000000000 +0800
@@ -169,8 +169,16 @@
     //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 (!user_relationships_load(array('between' => array($requester->uid, $requestee->uid), 'rtid' => $type->rtid), array('count' => TRUE))) {
+  if (!$existing) {
     $relationship = (object)array(
       'requester_id'  => $requester->uid,
       'requestee_id'  => $requestee->uid,
@@ -430,4 +438,4 @@
 function user_relationships_api_cck_field_privacy_access($requestee, $requester) {
   $relationship = user_relationships_load(array('between' => array($requestee->uid, $requester->uid), 'approved' => TRUE), array('count' => TRUE), FALSE);
   return $relationship;
-}
\ No newline at end of file
+}
diff -urN user_relationships-6.x-1.x-dev-20090713/user_relationships_api/user_relationships_api.install user_relationships-6.x-1.x-dev-20090713-work/user_relationships_api/user_relationships_api.install
--- user_relationships-6.x-1.x-dev-20090713/user_relationships_api/user_relationships_api.install	2009-03-17 19:57:14.000000000 +0900
+++ user_relationships-6.x-1.x-dev-20090713-work/user_relationships_api/user_relationships_api.install	2009-07-19 15:49:49.000000000 +0800
@@ -36,6 +36,7 @@
       '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),
     ),
@@ -95,3 +96,19 @@
   db_create_table($ret, 'user_relationship_type_roles', $schema['user_relationship_type_roles']);
   return $ret;
 }
+
+/**
+ * Implementation of hook_update_N().
+ * Update 6102 adds the column is_reciprocal to the {user_relationship_types} table
+ */
+function user_relationships_api_update_6102() {
+  $new_fields = array(
+    'is_reciprocal' => array('type' => 'int', 'unsigned' => TRUE, 'not null' => TRUE, 'default' => 0, 'size' => 'tiny'),
+  );
+
+  $ret = array();
+  foreach ($new_fields as $field => $spec) {
+    db_add_field($ret, 'user_relationship_types', $field, $spec);
+  }
+  return $ret;
+}
diff -urN user_relationships-6.x-1.x-dev-20090713/user_relationships_api/user_relationships_api.module user_relationships-6.x-1.x-dev-20090713-work/user_relationships_api/user_relationships_api.module
--- user_relationships-6.x-1.x-dev-20090713/user_relationships_api/user_relationships_api.module	2009-07-10 16:46:01.000000000 +0800
+++ user_relationships-6.x-1.x-dev-20090713-work/user_relationships_api/user_relationships_api.module	2009-07-19 15:53:34.000000000 +0800
@@ -81,7 +81,7 @@
       $twoway_reverse_clause = TRUE;//#479486 these columns automatically should exclude duplicates
 
     default:
-      $types_cols = array('name', 'plural_name', 'is_oneway', 'requires_approval', 'expires_val');
+      $types_cols = array('name', 'plural_name', 'is_oneway', 'is_reciprocal', 'requires_approval', 'expires_val');
       $cond[] = "%s.%s {$operator}";
       $arguments[] = !in_array($key, $types_cols) ? 'ur' : 'urt';
       $arguments[] = $key;
diff -urN user_relationships-6.x-1.x-dev-20090713/user_relationships_ui/user_relationships_ui.admin.inc user_relationships-6.x-1.x-dev-20090713-work/user_relationships_ui/user_relationships_ui.admin.inc
--- user_relationships-6.x-1.x-dev-20090713/user_relationships_ui/user_relationships_ui.admin.inc	2009-07-13 01:20:27.000000000 +0800
+++ user_relationships-6.x-1.x-dev-20090713-work/user_relationships_ui/user_relationships_ui.admin.inc	2009-07-19 15:54:40.000000000 +0800
@@ -132,13 +132,6 @@
     '#description'    => t("Example: buddies, friends, coworkers, spouses."),
     '#weight'         => -9,
   );
-  $form['is_oneway'] = array(
-    '#type'           => 'checkbox',
-    '#title'          => t('This is a one-way relationship'),
-    '#default_value'  => $relationship_type->is_oneway,
-    '#description'    => t('Check this if this relationship should only go one way (ex Manager, Subscriber)'),
-    '#weight'         => -8,
-  );
   $form['requires_approval'] = array(
     '#type'           => 'checkbox',
     '#title'          => t('Requires Approval'),
@@ -153,7 +146,21 @@
     '#size'           => 4,
     '#default_value'  => isset($relationship_type->expires_val) ? $relationship_type->expires_val : 0,
     '#description'    => t('After how many days should a request of this type be removed? (0 for never)'),
-    '#weight'         => -8,
+    '#weight'         => -7,
+  );
+  $form['is_oneway'] = array(
+    '#type'           => 'checkbox',
+    '#title'          => t('This is a one-way relationship'),
+    '#default_value'  => $relationship_type->is_oneway,
+    '#description'    => t('Check this if this relationship should only go one way (ex Manager, Subscriber)'),
+    '#weight'         => -6,
+  );
+  $form['is_reciprocal'] = array(
+    '#type'           => 'checkbox',
+    '#title'          => t('This one-way relationship can be reciprocated'),
+    '#default_value'  => $relationship_type->is_reciprocal,
+    '#description'    => t('Check if this one-way relationship can go either way'),
+    '#weight'         => -5,
   );
   $form['roles'] = array(
     '#title' => t('Role access'),
diff -urN user_relationships-6.x-1.x-dev-20090713/user_relationships_ui/user_relationships_ui.js user_relationships-6.x-1.x-dev-20090713-work/user_relationships_ui/user_relationships_ui.js
--- user_relationships-6.x-1.x-dev-20090713/user_relationships_ui/user_relationships_ui.js	2009-04-18 13:51:41.000000000 +0800
+++ user_relationships-6.x-1.x-dev-20090713-work/user_relationships_ui/user_relationships_ui.js	2009-07-19 15:55:02.000000000 +0800
@@ -116,3 +116,18 @@
     setTimeout(notice, 60000);
   });
 };
+
+$(document).ready(function() {
+  $('#edit-is-oneway').click(function () {
+    if ($('#edit-is-oneway').attr('checked')) {
+      $('#edit-is-reciprocal-wrapper').slideDown('slow');
+    }
+    else {
+      $('#edit-is-reciprocal-wrapper').slideUp('slow');
+    }
+  });
+  
+  if (!$('#edit-is-oneway').attr('checked')) {
+    $('#edit-is-reciprocal-wrapper').hide();
+  }
+});
diff -urN user_relationships-6.x-1.x-dev-20090713/user_relationships_ui/user_relationships_ui.module user_relationships-6.x-1.x-dev-20090713-work/user_relationships_ui/user_relationships_ui.module
--- user_relationships-6.x-1.x-dev-20090713/user_relationships_ui/user_relationships_ui.module	2009-07-13 01:20:27.000000000 +0800
+++ user_relationships-6.x-1.x-dev-20090713-work/user_relationships_ui/user_relationships_ui.module	2009-07-19 15:57:48.000000000 +0800
@@ -231,19 +231,27 @@
     ));
   }
 
+  // Compute if any more relationships can be created
   $types_count = (int)db_result(db_query("SELECT COUNT(*) FROM {user_relationship_types}"));
-  //relationship request link(s)
-  $relationships_count = user_relationships_load(array('between' => array($viewer->uid, $viewed->uid)), array('count' => TRUE));
+  $existing_relationships = user_relationships_load(array('between' => array($viewer->uid, $viewed->uid)), array('sort' => 'rtid'));
+  $all_relationships = user_relationships_types_load();
+  $relationships_count = 0;
+
+  // Unset the relationships which already exist
+  foreach ($existing_relationships as $rtid => $relationship_type) {
+    foreach ($relationship_type as $relationship) {
+      if (!$relationship->is_oneway || !$relationship->is_reciprocal || $relationship->requester_id == $viewer->uid) {
+        unset($all_relationships[$rtid]);
+        $relationships_count++;
+      }
+    }
+  }
+
   if (!$relationships_count || (variable_get('user_relationships_allow_multiple', TRUE) && ($relationships_count < $types_count))) {
     //if configured, create direct links
     if (variable_get('user_relationships_show_direct_links', 1)) {
       //draw a single link, or one for each relationship type
-      $existing_relationships = user_relationships_load(array('between' => array($viewer->uid, $viewed->uid)), array('sort' => 'rtid'));
-      $all_relationships = user_relationships_types_load();
       foreach ($all_relationships as $rtid => $relationship) {
-        if ($existing_relationships[$rtid]) {
-          continue;
-        }
         //check this type can be requested
         if (!user_relationships_api_can_request($viewer, $relationship)) {
           continue;
diff -urN user_relationships-6.x-1.x-dev-20090713/user_relationships_ui/user_relationships_ui.pages.inc user_relationships-6.x-1.x-dev-20090713-work/user_relationships_ui/user_relationships_ui.pages.inc
--- user_relationships-6.x-1.x-dev-20090713/user_relationships_ui/user_relationships_ui.pages.inc	2009-07-06 23:39:21.000000000 +0800
+++ user_relationships-6.x-1.x-dev-20090713-work/user_relationships_ui/user_relationships_ui.pages.inc	2009-07-19 15:58:14.000000000 +0800
@@ -20,7 +20,7 @@
     $table['rows'][] = array(
       $relationship->name,
       $relationship->plural_name,
-      ($relationship->is_oneway ? t('one way') : t('mutual')),
+      ($relationship->is_oneway ? ($relationship->is_reciprocal ? t('reciprocal') : t('one way')) : t('mutual')),
       ($relationship->requires_approval ? t('yes') : t('no')),
       ($relationship->expires_val ? t('@expires_val', array('@expires_val' => format_plural($relationship->expires_val, '1 day', '@count days'))) : t('Never')),
       l(t('edit'),    "admin/user/relationships/{$relationship->rtid}/edit") .' | '.
