diff --git a/lib/backend.py b/lib/backend.py
index 500feba258baaadfee3f1820516ff4743e69aef8..396b59d7db2e6c24da8686c9bdfceaee36d28eb0 100644
--- a/lib/backend.py
+++ b/lib/backend.py
@@ -966,7 +966,7 @@ def DiagnoseOS(top_dirs=None):
   for dir in top_dirs:
     if os.path.isdir(dir):
       try:
-        f_names = os.listdir(dir)
+        f_names = utils.ListVisibleFiles(dir)
       except EnvironmentError, err:
         logger.Error("Can't list the OS directory %s: %s" % (dir,str(err)))
         break
@@ -1282,7 +1282,7 @@ def ListExports():
 
   """
   if os.path.isdir(constants.EXPORT_DIR):
-    return os.listdir(constants.EXPORT_DIR)
+    return utils.ListVisibleFiles(constants.EXPORT_DIR)
   else:
     return []
 
@@ -1392,7 +1392,7 @@ class HooksRunner(object):
     subdir = "%s-%s.d" % (hpath, suffix)
     dir_name = "%s/%s" % (self._BASE_DIR, subdir)
     try:
-      dir_contents = os.listdir(dir_name)
+      dir_contents = utils.ListVisibleFiles(dir_name)
     except OSError, err:
       # must log
       return rr
diff --git a/lib/utils.py b/lib/utils.py
index bc9a1046f4621cfe801aacf00b7374f41e227b4d..be93d198f0819e7fba8236782838d82e79240856 100644
--- a/lib/utils.py
+++ b/lib/utils.py
@@ -848,3 +848,10 @@ def TcpPing(source, target, port, timeout=10, live_port_needed=True):
     success = (not live_port_needed) and (errcode == errno.ECONNREFUSED)
 
   return success
+
+
+def ListVisibleFiles(path):
+  """Returns a list of all visible files in a directory.
+
+  """
+  return [i for i in os.listdir(path) if not i.startswith(".")]
diff --git a/test/ganeti.utils_unittest.py b/test/ganeti.utils_unittest.py
index 1ef9f9cf63a6365cab78eb01753c2d1f764cccb5..b9a93b4eade8c563097aa7536d8dc3a16dc6ef70 100755
--- a/test/ganeti.utils_unittest.py
+++ b/test/ganeti.utils_unittest.py
@@ -28,13 +28,14 @@ import tempfile
 import os.path
 import md5
 import socket
-
+import shutil
 
 import ganeti
 from ganeti.utils import IsProcessAlive, Lock, Unlock, RunCmd, \
      RemoveFile, CheckDict, MatchNameComponent, FormatUnit, \
      ParseUnit, AddAuthorizedKey, RemoveAuthorizedKey, \
-     ShellQuote, ShellQuoteArgs, _ParseIpOutput, TcpPing
+     ShellQuote, ShellQuoteArgs, _ParseIpOutput, TcpPing, \
+     ListVisibleFiles
 from ganeti.errors import LockError, UnitParseError
 
 
@@ -522,5 +523,47 @@ class TestTcpPingDeaf(unittest.TestCase):
                  "failed to ping alive host on deaf port")
 
 
+class TestListVisibleFiles(unittest.TestCase):
+  """Test case for ListVisibleFiles"""
+
+  def setUp(self):
+    self.path = tempfile.mkdtemp()
+
+  def tearDown(self):
+    shutil.rmtree(self.path)
+
+  def _test(self, files, expected):
+    # Sort a copy
+    expected = expected[:]
+    expected.sort()
+
+    for name in files:
+      f = open(os.path.join(self.path, name), 'w')
+      try:
+        f.write("Test\n")
+      finally:
+        f.close()
+
+    found = ListVisibleFiles(self.path)
+    found.sort()
+
+    self.assertEqual(found, expected)
+
+  def testAllVisible(self):
+    files = ["a", "b", "c"]
+    expected = files
+    self._test(files, expected)
+
+  def testNoneVisible(self):
+    files = [".a", ".b", ".c"]
+    expected = []
+    self._test(files, expected)
+
+  def testSomeVisible(self):
+    files = ["a", "b", ".c"]
+    expected = ["a", "b"]
+    self._test(files, expected)
+
+
 if __name__ == '__main__':
   unittest.main()