diff --git a/oa_worktracker.module b/oa_worktracker.module
index 01c3e01..00fda46 100644
--- a/oa_worktracker.module
+++ b/oa_worktracker.module
@@ -139,16 +139,23 @@ function oa_worktracker_oa_messages_create_alter(&$wrapper, $context) {
  */
 function _oa_worktracker_check_section_options(&$options) {
   if (module_exists('oa_buttons')) {
-    foreach (array_keys($options) as $nid) {
-      if ($nid === '_none') continue;
-
-      // Make sure this section can take Task nodes
-      // TODO: we need to cache this somehow for performance!
-      $buttons = array();
-      _oa_buttons_get_node_command_buttons(node_load($nid), $buttons);
-      if (!isset($buttons['oa_worktracker_task'])) {
-        unset($options[$nid]);
+    // Check for cached options.
+    if ($cache = cache_get('oa_worktracker_section_options', 'cache')) {
+      $options = $cache->data;
+    }
+    else {
+      foreach (array_keys($options) as $nid) {
+        if ($nid === '_none') continue;
+        // Make sure this section can take Task nodes.
+        $buttons = array();
+        _oa_buttons_get_node_command_buttons(node_load($nid), $buttons);
+        foreach ($buttons as $key => $button) {
+          if ($button['value'] !== 'oa_worktracker_task') {
+            unset($options[$nid]);
+          }
+        }
       }
+      cache_set('oa_worktracker_section_options', $options, 'cache');
     }
   }
 }
