diff --git a/l10n_community/ajax.inc b/l10n_community/ajax.inc
index 779ea10..3112b10 100644
--- a/l10n_community/ajax.inc
+++ b/l10n_community/ajax.inc
@@ -45,7 +45,7 @@ function l10n_community_string_details($langcode = NULL, $sid = 0) {
 
   // Information about translator and translation timestamp.
   $translation_info = '';
-  $translation = db_fetch_object(db_query("SELECT translation, uid_entered, time_entered FROM {l10n_community_translation} WHERE language = '%s' AND sid = %d AND is_active = 1 AND is_suggestion = 0", $langcode, $sid));
+  $translation = db_fetch_object(db_query("SELECT translation, uid_entered, time_entered, language FROM {l10n_community_translation} WHERE language = '%s' AND sid = %d AND is_active = 1 AND is_suggestion = 0", $langcode, $sid));
   if (!empty($translation->translation)) {
     $account = user_load(array('uid' => $translation->uid_entered));
     $translation_info = t('<strong>Translated by:</strong><br /> %username at %date', array('%username' => $account->name, '%date' => format_date($translation->time_entered)));
@@ -60,15 +60,16 @@ function l10n_community_string_suggestions($langcode = NULL, $sid = 0) {
 
   // Existing, "unresolved" suggestions.
   $suggestions = array();
-  $result = db_query("SELECT t.tid, t.sid, t.translation, t.uid_entered, t.time_entered, u.name FROM {l10n_community_translation} t LEFT JOIN {users} u ON u.uid = t.uid_entered WHERE t.language = '%s' AND t.sid = %d AND t.is_active = 1 AND t.is_suggestion = 1 ORDER BY t.time_entered", $langcode, $sid);
+  $result = db_query("SELECT t.tid, t.sid, t.translation, t.uid_entered, t.time_entered, t.language, u.name FROM {l10n_community_translation} t LEFT JOIN {users} u ON u.uid = t.uid_entered WHERE t.language = '%s' AND t.sid = %d AND t.is_active = 1 AND t.is_suggestion = 1 ORDER BY t.time_entered", $langcode, $sid);
 
-  $perm = l10n_community_get_permission($langcode);
   while ($suggestion = db_fetch_object($result)) {
     // This detail pane is only retrieved from JS, so we are free to output obtrusive JS here.
     $token = "'". drupal_get_token('l10n_server_'. $suggestion->tid .'_'. $suggestion->sid) ."'";
     $approve_button = $decline_button = '';
-    if ($perm & ($suggestion->uid_entered == $user->uid ? L10N_PERM_MODERATE_OWN : L10N_PERM_MODERATE_OTHERS)) {
+    if (l10n_community_may_approve_translation($suggestion)) {
       $approve_button = theme('l10n_community_button', 'approve', 'l10n-approve', 'onclick="l10nCommunity.approveSuggestion('. $suggestion->tid .','. $suggestion->sid .', this, '. $token .');" title="'. t('Approve suggestion.') .'"');
+    }
+    if (l10n_community_may_decline_translation($suggestion)) {
       $decline_button = theme('l10n_community_button', 'decline', 'l10n-decline', 'onclick="l10nCommunity.declineSuggestion('. $suggestion->tid .','. $suggestion->sid .', this, '. $token .');" title="'. t('Decline suggestion.') .'"');
     }
 
@@ -103,8 +104,6 @@ function l10n_community_string_ajax_suggestion($tid = 0) {
   global $user;
   
   if (($suggestion = db_fetch_object(db_query("SELECT * FROM {l10n_community_translation} WHERE tid = %d AND is_suggestion = 1 AND is_active = 1", $tid))) &&
-      ($perm = l10n_community_get_permission($suggestion->language)) &&
-      ($perm & ($suggestion->uid_entered == $user->uid ? L10N_PERM_MODERATE_OWN : L10N_PERM_MODERATE_OTHERS)) &&
       !empty($_GET['form_token']) &&
       drupal_valid_token($_GET['form_token'], 'l10n_server_'. $suggestion->tid .'_'. $suggestion->sid)) {
     return $suggestion;
@@ -123,7 +122,8 @@ function l10n_community_string_ajax_suggestion($tid = 0) {
 function l10n_community_string_approve($tid = 0) {
   global $user;
 
-  if ($suggestion = l10n_community_string_ajax_suggestion($tid)) {
+  $suggestion = l10n_community_string_ajax_suggestion($tid);
+  if ($suggestion && l10n_community_may_approve_translation($suggestion)) {
     // Mark existing translations and suggestions as inactive in this language.
     db_query("UPDATE {l10n_community_translation} SET is_active = 0 WHERE sid = %d AND language = '%s'", $suggestion->sid, $suggestion->language);
     // Remove placeholder translation record (which was there if
@@ -148,7 +148,8 @@ function l10n_community_string_approve($tid = 0) {
  *   Suggestion ID.
  */
 function l10n_community_string_decline($tid = 0) {
-  if ($suggestion = l10n_community_string_ajax_suggestion($tid)) {
+  $suggestion = l10n_community_string_ajax_suggestion($tid);
+  if ($suggestion && l10n_community_may_decline_translation($suggestion)) {
     // Mark this suggestion as inactive.
     db_query("UPDATE {l10n_community_translation} SET is_active = 0 WHERE tid = %d", $tid);
     // Let's see if we have any other suggestion remaining in this language.
diff --git a/l10n_community/l10n_community.module b/l10n_community/l10n_community.module
index bbd3de7..e5d460b 100644
--- a/l10n_community/l10n_community.module
+++ b/l10n_community/l10n_community.module
@@ -1000,12 +1000,47 @@ function l10n_community_get_permission($langcode, $account = NULL) {
  * @param $langcode
  *   Language code, for example 'hu', 'pt-br', 'de' or 'it'.
  * @param $permission
- *   The permission to check for.
+ *   The permission to check for. Note that if you pass multiple permission
+ *   constants, this function will return TRUE if the user has at least one
+ *   of them.
  * @return
  *   TRUE if the user has at least one of the specified permissions.
  */
 function l10n_community_has_permission($langcode, $permission) {
-  return (bool)(l10n_community_get_permission($langcode, NULL) & $permission);
+  return (bool)(l10n_community_get_permission($langcode) & $permission);
+}
+
+/**
+ * Checks whether the current user may approve a translation.
+ *
+ * @param $translation
+ *   The translation in question.
+ * @return
+ *   TRUE if the user may approve the translation.
+ */
+function l10n_community_may_approve_translation($translation) {
+  global $user;
+  $required = $translation->uid_entered == $user->uid ? L10N_PERM_MODERATE_OWN : L10N_PERM_MODERATE_OTHERS;
+  return l10n_community_has_permission($translation->language, $required);
+}
+
+/**
+ * Checks whether the current user may decline a translation.
+ *
+ * @param $translation
+ *   The translation in question.
+ * @return
+ *   TRUE if the user may decline the translation.
+ */
+function l10n_community_may_decline_translation($translation) {
+  global $user;
+  if ($translation->uid_entered == $user->uid) {
+    // Everyone may decline their own translations.
+    return TRUE;
+  }
+  else {
+    return l10n_community_has_permission($translation->language, L10N_PERM_MODERATE_OTHERS);
+  }
 }
 
 /**
