diff --git a/question_answer.module b/question_answer.module
index 9e69370..a0ecf70 100644
--- a/question_answer.module
+++ b/question_answer.module
@@ -18,6 +18,8 @@ function question_answer_init() {
 function question_answer_perm() {
   $perms = array(
     'select best answer for any question',
+    'deselect best answer for own question',
+    'deselect best answer for any question',
   );
   return $perms;
 }
@@ -28,16 +30,24 @@ function question_answer_perm() {
 function question_answer_menu() {
   $items['question_answer/select'] = array(
     'title' => 'Select answer',
-    'page callback' => 'question_answer_select',
-    'page arguments' => array(2,3),
-    'access callback' => 'user_is_logged_in', 
+    'page callback' => 'question_answer_action',
+    'page arguments' => array(1,2,3),
+    'access callback' => 'user_is_logged_in',
+    'type' => MENU_CALLBACK,
+    'file' => 'question_answer.pages.inc',
+  );
+  $items['question_answer/deselect'] = array(
+    'title' => 'Deselect answer',
+    'page callback' => 'question_answer_action',
+    'page arguments' => array(1,2,3),
+    'access callback' => 'user_is_logged_in',
     'type' => MENU_CALLBACK,
     'file' => 'question_answer.pages.inc',
   );
   $items['admin/settings/question_answer'] = array(
     'title' => 'Question/Answer',
     'description' => 'Allows the admin to configure the Q/A settings',
-    'page callback' => 'drupal_get_form', 
+    'page callback' => 'drupal_get_form',
     'page arguments' => array('question_answer_settings'),
     'file' => 'question_answer.pages.inc',
     'access arguments' => array('administer site configuration'),
@@ -99,21 +109,41 @@ function question_answer_link($type, $object = NULL, $teaser = FALSE) {
   if ($type == 'comment') {
     $node = node_load($object->nid);
     $qtype = _question_answer_nodetypes();
+
+    // The author or any user with "select best answer for any question" can select
+    // the best answer if there is none selected for this question.
     if (in_array($node->type, array_keys($qtype)) && ($node->uid == $user->uid || user_access('select best answer for any question')) && empty($node->{$qtype[$node->type]['answer']}[0]['value'])) {
-      $links['question_answer_select'] = array(
-        'title' => t('select'),
-        'href' => 'question_answer/select/'. $object->cid .'/'. drupal_get_token('question_answer/select/'. $object->cid),
-        'attributes' => array(
-          'title' => t('Select this comment.'),
-          'class' => 'ctools-use-ajax',
-        ),
-      );
-      ctools_add_js('ajax-responder');
+      $links['question_answer_action'] = question_answer_build_link('select', $object);
+    }
+
+    // The author with "deselect best answer for own question" perm or any user
+    // with "deselect best answer for any question" perm can deselect the best
+    // answer if there is one already selected for this question.
+    if (in_array($node->type, array_keys($qtype)) && (($node->uid == $user->uid && user_access('deselect best answer for own question')) || user_access('deselect best answer for any question')) && $node->{$qtype[$node->type]['answer']}[0]['value'] == $object->cid) {
+      $links['question_answer_action'] = question_answer_build_link('deselect', $object);
     }
+
   }
   return $links;
 }
 
+/*
+* Helper function for building the array to be returned
+* for the links.
+*/
+function question_answer_build_link($action, $object) {
+  $link = array(
+            'title' => t($action),
+            'href' => 'question_answer/' . $action . '/'. $object->cid .'/'. drupal_get_token('question_answer/' .$action .'/'. $object->cid),
+            'attributes' => array(
+              'title' => t($action . ' this comment.')),
+              'class' => 'ctools-use-ajax',
+            ),
+          );
+  ctools_add_js('ajax-responder');
+  return $link;
+}
+
 /**
 * Declare information about a formatter.
 *
diff --git a/question_answer.pages.inc b/question_answer.pages.inc
index 407ec9a..2ba2390 100644
--- a/question_answer.pages.inc
+++ b/question_answer.pages.inc
@@ -6,33 +6,49 @@
  */
 
 /**
- * Menu callback; select a comment.
+ * Generic menu callback for:
+ * - select an answer
+ * - deselect a previous answer.
+ *
+ * @param $action, $cid, $token
  *
- * @param $cid
- *   The comment do be hidden.
  */
-function question_answer_select($cid, $token) {
-  if (is_numeric($cid) && drupal_valid_token($token, "question_answer/select/$cid")) {
+function question_answer_action($action, $cid, $token) {
+  if (is_numeric($cid) && drupal_valid_token($token, "question_answer/$action/$cid")) {
     $nid = db_result(db_query('SELECT nid FROM {comments} WHERE cid=%d', $cid));
     if (is_numeric($nid)) {
       $node = node_load($nid);
       $qtype = _question_answer_nodetypes();
-      $node->{$qtype[$node->type]['answer']}[0]['value'] = $cid;
+      if (!empty($node->{$qtype[$node->type]['answer']}[0]['value']) && $action == 'deselect') {
+        // here we deselect the current comment
+        $node->{$qtype[$node->type]['answer']}[0]['value'] = "";
+      } else {
+        // here we select a comment, a new one or a replacement for a previous selection
+        $node->{$qtype[$node->type]['answer']}[0]['value'] = $cid;
+      }
+      
       node_save($node);
+      
+      // let's add some feedback to the user
+      (($action == 'deselect') ? drupal_set_message(t("The previous choice for the <em>best answer</em> (comment #!cid) is now cancelled. This question is once again available for selecting the best answer.", array('!cid' => $cid)), 'status') : drupal_set_message(t("The comment #!cid is now selected as the current <em>best answer</em>.", array('!cid' => $cid)), 'status'));
     }
   }
 
   if (! $node) {
-    drupal_set_message(t("Oops! There was an error in selecting your answer!"), 'warning');
+    (($action == 'deselect') ? drupal_set_message(t("Oops! There was an error in deselecting your previous answer!"), 'warning') : drupal_set_message(t("Oops! There was an error in selecting your answer!"), 'warning'));
   }
 
   if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) && $_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') {
     ctools_include('ajax');
     $commands = array();
-    $commands[] = ctools_ajax_command_remove('a[href^='. url('question_answer/select') .']');
+    $commands[] = ctools_ajax_command_remove('a[href^='. url('question_answer/$action') .']');
     //should be some "addClass" command, not supported now, but will (at least will be D7)
     //$commands[] = ctools_ajax_command_attr('#comment-'. $cid.' + div', 'class', 'question_answer-selected');
 
+    // it looks like we need this to have the feedback displayed
+    // without the user having to relaod the page him/herself
+    $commands[] = ctools_ajax_command_reload();
+
     ctools_ajax_render($commands);
   }
   else {
