diff --git a/Library/Homebrew/cask/lib/hbc/cli/doctor.rb b/Library/Homebrew/cask/lib/hbc/cli/doctor.rb
index 857471420ab8cfa3468c7fbe588d19c21241ed3f..2632bcaef17804f93b809032511d99bea7f4ccbc 100644
--- a/Library/Homebrew/cask/lib/hbc/cli/doctor.rb
+++ b/Library/Homebrew/cask/lib/hbc/cli/doctor.rb
@@ -33,18 +33,14 @@ class Hbc::CLI::Doctor < Hbc::CLI::Base
   end
 
   def self.alt_taps
-    Tap.select { |t| t.cask_dir.directory? && t != Hbc.default_tap }
+    Tap.select { |t| t.cask_dir && t != Hbc.default_tap }
        .map(&:path)
   end
 
   def self.default_cask_count
-    default_cask_count = notfound_string
-    begin
-      default_cask_count = Hbc.default_tap.cask_dir.children.count(&:file?)
-    rescue StandardError
-      default_cask_count = "0 #{error_string "Error reading #{Hbc.default_tap.path}"}"
-    end
-    default_cask_count
+    Hbc.default_tap.cask_files.count
+  rescue StandardError
+    "0 #{error_string "Error reading #{Hbc.default_tap.path}"}"
   end
 
   def self.homebrew_origin
diff --git a/Library/Homebrew/cask/lib/hbc/cli/search.rb b/Library/Homebrew/cask/lib/hbc/cli/search.rb
index c356128a688339aeac4d7a826b460eb457c4be41..5c57ba43da92865f022829cb3883f6c05b4af833 100644
--- a/Library/Homebrew/cask/lib/hbc/cli/search.rb
+++ b/Library/Homebrew/cask/lib/hbc/cli/search.rb
@@ -16,12 +16,11 @@ class Hbc::CLI::Search < Hbc::CLI::Base
     partial_matches = []
     search_term = arguments.join(" ")
     search_regexp = extract_regexp arguments.first
+    all_tokens = Hbc::CLI.nice_listing(Hbc.all_tokens)
     if search_regexp
       search_term = arguments.first
-      partial_matches = Hbc::CLI.nice_listing(Hbc.all_tokens).grep(%r{#{search_regexp}}i)
+      partial_matches = all_tokens.grep(%r{#{search_regexp}}i)
     else
-      # suppressing search of the font Tap is a quick hack until behavior can be made configurable
-      all_tokens = Hbc::CLI.nice_listing Hbc.all_tokens.reject { |t| %r{^caskroom/homebrew-fonts/}.match(t) }
       simplified_tokens = all_tokens.map { |t| t.sub(%r{^.*\/}, "").gsub(%r{[^a-z0-9]+}i, "") }
       simplified_search_term = search_term.sub(%r{\.rb$}i, "").gsub(%r{[^a-z0-9]+}i, "")
       exact_match = simplified_tokens.grep(%r{^#{simplified_search_term}$}i) { |t| all_tokens[simplified_tokens.index(t)] }.first
diff --git a/Library/Homebrew/cask/lib/hbc/scopes.rb b/Library/Homebrew/cask/lib/hbc/scopes.rb
index 3fbb59d26d0dc2037dd6dd3cdd6f557d0cd65e7c..431c3ff475141511f15f4704e34da17756397ee2 100644
--- a/Library/Homebrew/cask/lib/hbc/scopes.rb
+++ b/Library/Homebrew/cask/lib/hbc/scopes.rb
@@ -10,29 +10,15 @@ module Hbc::Scopes
     end
 
     def all_tapped_cask_dirs
-      @all_tapped_cask_dirs ||= Tap.names.map(&Tap.method(:fetch)).map(&:cask_dir)
-                                   .unshift(default_tap.cask_dir) # optimization: place the default Tap first
-                                   .uniq
-    end
-
-    def reset_all_tapped_cask_dirs
-      # The memoized value should be reset when a Tap is added/removed
-      # (which is a rare event in our codebase).
-      @all_tapped_cask_dirs = nil
+      Tap.map(&:cask_dir).compact
     end
 
     def all_tokens
-      cask_tokens = all_tapped_cask_dirs.map { |d| Dir.glob d.join("*.rb") }.flatten
-      cask_tokens.map { |c|
-        # => "/usr/local/Library/Taps/caskroom/example-tap/Casks/example.rb"
-        c.sub!(%r{\.rb$}, "")
-        # => ".../example"
-        c = c.split("/").last 4
-        # => ["caskroom", "example-tap", "Casks", "example"]
-        c.delete_at(-2)
-        # => ["caskroom", "example-tap", "example"]
-        c.join "/"
-      }
+      Tap.map { |t|
+        t.cask_files.map { |p|
+          "#{t.name}/#{File.basename(p, ".rb")}"
+        }
+      }.flatten
     end
 
     def installed
diff --git a/Library/Homebrew/tap.rb b/Library/Homebrew/tap.rb
index 8dd7fd1557629ecbe21b05196ecf3241e177d73d..340f6eca3136b4b8e202f6caf3f0fe03e8f18d00 100644
--- a/Library/Homebrew/tap.rb
+++ b/Library/Homebrew/tap.rb
@@ -290,13 +290,22 @@ class Tap
 
   # path to the directory of all {Cask} files for this {Tap}.
   def cask_dir
-    @cask_dir ||= path/"Casks"
+    @cask_dir ||= [path/"Casks"].detect(&:directory?)
   end
 
   # an array of all {Formula} files of this {Tap}.
   def formula_files
     @formula_files ||= if formula_dir
-      formula_dir.children.select { |p| p.extname == ".rb" }
+      formula_dir.children.select(&method(:formula_file?))
+    else
+      []
+    end
+  end
+
+  # an array of all {Cask} files of this {Tap}.
+  def cask_files
+    @cask_files ||= if cask_dir
+      cask_dir.children.select(&method(:cask_file?))
     else
       []
     end
@@ -311,7 +320,7 @@ class Tap
     file.extname == ".rb" && file.parent == formula_dir
   end
 
-  # return true if given path would present a cask file in this {Tap}.
+  # return true if given path would present a {Cask} file in this {Tap}.
   # accepts both absolute path and relative path (relative to this {Tap}'s path)
   # @private
   def cask_file?(file)