diff --git a/ui/code-owners-fetcher.js b/ui/code-owners-fetcher.js
index 61e362b..6fd5b35 100644
--- a/ui/code-owners-fetcher.js
+++ b/ui/code-owners-fetcher.js
@@ -170,20 +170,21 @@
 
   _getFilesToFetch(codeOwnerStatusMap) {
     // only fetch those not approved yet
-    const filesGroupByStatus = [...codeOwnerStatusMap.keys()].reduce(
-        (list, file) => {
-          const status = codeOwnerStatusMap
-              .get(file).status;
-          if (status === OwnerStatus.INSUFFICIENT_REVIEWERS) {
-            list.missing.push(file);
-          } else if (status === OwnerStatus.PENDING) {
-            list.pending.push(file);
-          }
+    const filesGroupByStatus = [...codeOwnerStatusMap.entries()].reduce(
+        (list, [file, fileInfo]) => {
+          if (list[fileInfo.status]) list[fileInfo.status].push(file);
           return list;
         }
-        , {pending: [], missing: []});
-    // always fetch INSUFFICIENT_REVIEWERS first and then pending
-    return filesGroupByStatus.missing.concat(filesGroupByStatus.pending);
+        , {
+          [OwnerStatus.PENDING]: [],
+          [OwnerStatus.INSUFFICIENT_REVIEWERS]: [],
+          [OwnerStatus.APPROVED]: [],
+        }
+    );
+    // always fetch INSUFFICIENT_REVIEWERS first, then pending and then approved
+    return filesGroupByStatus[OwnerStatus.INSUFFICIENT_REVIEWERS]
+        .concat(filesGroupByStatus[OwnerStatus.PENDING])
+        .concat(filesGroupByStatus[OwnerStatus.APPROVED]);
   }
 
   pause() {
diff --git a/ui/owner-requirement.js b/ui/owner-requirement.js
index b506a8b..a173c75 100644
--- a/ui/owner-requirement.js
+++ b/ui/owner-requirement.js
@@ -74,11 +74,9 @@
                     title="Documentation for overriding code owners"></iron-icon>
                 </a>
               </template>
-              <template is="dom-if" if="[[!_allApproved]]">
-                <gr-button link on-click="_openReplyDialog">
-                Suggest owners
+              <gr-button link on-click="_openReplyDialog">
+                [[_getSuggestOwnersText(_statusCount)]]
               </gr-button>
-              </template>
             </template>
             <template is="dom-if" if="[[model.branchConfig.no_code_owners_defined]]">                
               <span>No code-owners file</span>
@@ -106,10 +104,6 @@
         computed: '_computeIsLoading(model.branchConfig, model.status, '
             + 'model.userRole, model.pluginStatus)',
       },
-      _allApproved: {
-        type: Boolean,
-        computed: '_computeAllApproved(_statusCount)',
-      },
       _isOverriden: {
         type: Boolean,
         computed: '_computeIsOverriden(change, model.branchConfig)',
@@ -171,8 +165,7 @@
       return false;
     }
 
-
-    for(const requiredApprovalInfo of branchConfig['override_approval']) {
+    for (const requiredApprovalInfo of branchConfig['override_approval']) {
       const overridenLabel = requiredApprovalInfo.label;
       const overridenValue = Number(requiredApprovalInfo.value);
       if (isNaN(overridenValue)) continue;
@@ -189,9 +182,9 @@
     return false;
   }
 
-  _computeAllApproved(statusCount) {
-    return statusCount && statusCount.missing === 0
-            && statusCount.pending === 0;
+  _getSuggestOwnersText(statusCount) {
+    return statusCount && statusCount.missing === 0 ?
+      'Add owners' : 'Suggest owners';
   }
 
   _getStatusCount(rawStatuses) {
diff --git a/ui/suggest-owners-trigger.js b/ui/suggest-owners-trigger.js
index 97f616d..05b01a5 100644
--- a/ui/suggest-owners-trigger.js
+++ b/ui/suggest-owners-trigger.js
@@ -27,8 +27,7 @@
     return {
       hidden: {
         type: Boolean,
-        computed: '_computeHidden(model.pluginStatus,' +
-            'model.areAllFilesApproved, model.userRole, model.branchConfig)',
+        computed: '_computeHidden(model.pluginStatus, model.branchConfig)',
         reflectToAttribute: true,
       },
     };
@@ -74,19 +73,12 @@
     this.modelLoader.loadBranchConfig();
   }
 
-  _computeHidden(pluginStatus, allFilesApproved, userRole, branchConfig) {
-    if (pluginStatus === undefined ||
-        allFilesApproved === undefined ||
-        userRole === undefined ||
-        branchConfig === undefined) {
+  _computeHidden(pluginStatus, branchConfig) {
+    if (pluginStatus === undefined || branchConfig === undefined) {
       return true;
     }
-    if (branchConfig.no_code_owners_defined) return true;
-    if (pluginStatus.state === PluginState.Enabled) {
-      return allFilesApproved;
-    } else {
-      return true;
-    }
+    return !!branchConfig.no_code_owners_defined ||
+        pluginStatus.state !== PluginState.Enabled;
   }
 
   toggleControlContent() {
diff --git a/ui/suggest-owners.js b/ui/suggest-owners.js
index 781f64b..1233bd5 100644
--- a/ui/suggest-owners.js
+++ b/ui/suggest-owners.js
@@ -352,8 +352,7 @@
         type: Boolean,
         value: true,
         reflectToAttribute: true,
-        computed: '_isHidden(model.areAllFilesApproved, ' +
-            'model.showSuggestions)',
+        computed: '_isHidden(model.showSuggestions)',
       },
       suggestedOwners: Array,
       isLoading: {
@@ -470,10 +469,8 @@
     this.isLoading = state === SuggestionsState.Loading;
   }
 
-  _isHidden(allFilesApproved, showSuggestions) {
-    if (!showSuggestions) return true;
-    // if all approved, no need to show the container
-    return allFilesApproved === undefined || !!allFilesApproved;
+  _isHidden(showSuggestions) {
+    return !showSuggestions;
   }
 
   loadPropertiesAfterModelChanged() {
