diff --git includes/project_maintainers.inc includes/project_maintainers.inc
index 88f3727..418f9f9 100644
--- includes/project_maintainers.inc
+++ includes/project_maintainers.inc
@@ -37,6 +37,7 @@
 function project_maintainers_form($form_state, $project) {
   // Load all the info about per-project permissions on this site.
   $project_perms = project_permission_load($project);
+  $is_admin = project_user_access($project, 'administer maintainers');
 
   $form = array();
   $form['#tree'] = TRUE;
@@ -46,7 +47,10 @@ function project_maintainers_form($form_state, $project) {
   foreach ($project_perms as $perm_name => $perm_info) {
     $form['#header'][$perm_name] = array('data' => $perm_info['title']);
   }
-  $form['#header']['operations'] = array('data' => t('Operations'));
+
+  if ($is_admin) {
+    $form['#header']['operations'] = array('data' => t('Operations'));
+  }
 
   if (!empty($project->project['maintainers'])) {
     foreach ($project->project['maintainers'] as $uid => $maintainer) {
@@ -59,46 +63,51 @@ function project_maintainers_form($form_state, $project) {
         $form['maintainers'][$uid]['permissions'][$perm_name] = array(
           '#type' => 'checkbox',
           '#default_value' => !empty($maintainer['permissions'][$perm_name]),
+          '#disabled' => !$is_admin,
         );
       }
+      // No operations column by default.
       $form['maintainers'][$uid]['operations'] = array();
-      if ($uid == $project->uid) {
-        // We special-case the project owner with disabled checkboxes.
-        foreach ($project_perms as $perm_name => $perm_info) {
-          $form['maintainers'][$uid]['permissions'][$perm_name]['#disabled'] = TRUE;
+      if ($is_admin) {
+        if ($uid == $project->uid) {
+          // We special-case the project owner with disabled checkboxes.
+          foreach ($project_perms as $perm_name => $perm_info) {
+            $form['maintainers'][$uid]['permissions'][$perm_name]['#disabled'] = TRUE;
+          }
+          $form['maintainers'][$uid]['operations']['delete'] = array(
+            '#value' => t('locked'),
+          );
+        }
+        else {
+          $form['maintainers'][$uid]['operations']['delete'] = array(
+            '#value' => l(t('delete'), "node/$project->nid/maintainers/delete/$uid"),
+          );
         }
-        $form['maintainers'][$uid]['operations']['delete'] = array(
-          '#value' => t('locked'),
-        );
-      }
-      else {
-        $form['maintainers'][$uid]['operations']['delete'] = array(
-          '#value' => l(t('delete'), "node/$project->nid/maintainers/delete/$uid"),
-        );
       }
     }
   }
-
-  $form['new_maintainer'] = array();
-  $form['new_maintainer']['user'] = array(
-    '#type' => 'textfield',
-    '#size' => 20,
-    '#maxlength' => 40,
-    '#autocomplete_path' => 'user/autocomplete',
-  );
-  // we'll fill this in with a real value during validate()
-  $form['new_maintainer']['uid'] = array(
-    '#type' => 'value',
-    '#value' => 0,
-  );
-  foreach ($project_perms as $perm_name => $perm_info) {
-    $form['new_maintainer']['permissions'][$perm_name] = array(
-      '#type' => 'checkbox',
+  // Only admins ever need to submit the form.
+  if ($is_admin) {
+    $form['new_maintainer'] = array();
+    $form['new_maintainer']['user'] = array(
+      '#type' => 'textfield',
+      '#size' => 20,
+      '#maxlength' => 40,
+      '#autocomplete_path' => 'user/autocomplete',
     );
-  }
-
-  $form['submit'] = array('#type' => 'submit', '#value' => t('Update'));
+    // we'll fill this in with a real value during validate()
+    $form['new_maintainer']['uid'] = array(
+      '#type' => 'value',
+      '#value' => 0,
+    );
+    foreach ($project_perms as $perm_name => $perm_info) {
+      $form['new_maintainer']['permissions'][$perm_name] = array(
+        '#type' => 'checkbox',
+      );
+    }
 
+    $form['submit'] = array('#type' => 'submit', '#value' => t('Update'));
+  }
   return $form;
 }
 
@@ -131,7 +140,9 @@ function theme_project_maintainers_form($form) {
       foreach (element_children($form['maintainers'][$uid]['permissions']) as $perm) {
         $row[] = drupal_render($form['maintainers'][$uid]['permissions'][$perm]);
       }
-      $row[] = drupal_render($form['maintainers'][$uid]['operations']);
+      if ($form['maintainers'][$uid]['operations']) {
+        $row[] = drupal_render($form['maintainers'][$uid]['operations']);
+      }
       if ($form['#project']->uid == $uid) {
         $owner_row = $row;
       }
diff --git project.module project.module
index 94e77c6..3945eaa 100644
--- project.module
+++ project.module
@@ -174,6 +174,7 @@ function project_perm() {
     'delete any projects',
     'delete own projects',
     'browse project listings',
+    'view project maintainers',
   );
   return $perms;
 }
@@ -553,8 +554,8 @@ function project_menu() {
     'title' => 'Maintainers',
     'page callback' => 'drupal_get_form',
     'page arguments' => array('project_maintainers_form', 1),
-    'access callback' => 'project_user_access',
-    'access arguments' => array(1, 'administer maintainers'),
+    'access callback' => 'project_maintainer_tab_access',
+    'access arguments' => array(1),
     'file' => 'includes/project_maintainers.inc',
     'type' => MENU_LOCAL_TASK,
     'weight' => 4,
@@ -669,6 +670,13 @@ function project_promote_project_access($node) {
 }
 
 /**
+ * See if the current user has access to the maintainers tab on a given project.
+ */
+function project_maintainer_tab_access($project) {
+  return user_access('view project maintainers') || project_user_access($project, 'administer maintainers');
+}
+
+/**
  * See if the current user has the given permission on a given project.
  *
  * @param $project
