diff --git a/fsl/data/featanalysis.py b/fsl/data/featanalysis.py
index 5d527863dd48dd19b3184a7c56a59c93139aaabe..f11fc261dc6baaca821bf990b9f911bbf91246b2 100644
--- a/fsl/data/featanalysis.py
+++ b/fsl/data/featanalysis.py
@@ -62,9 +62,11 @@ def isFEATImage(path):
     a FEAT analysis, ``False`` otherwise.
     """
     dirname  = op.dirname( path)
-    filename = op.basename(path) 
+    filename = op.basename(path)
 
-    return filename.startswith('filtered_func_data') and isFEATDir(dirname) 
+    return filename.startswith('filtered_func_data') and \
+        fslimage.looksLikeImage(filename)            and \
+        isFEATDir(dirname) 
 
 
 def isFEATDir(path):
@@ -90,7 +92,7 @@ def isFEATDir(path):
         return False
 
     try:
-        fslimage.addExt(op.join(path, 'filtered_func_data'), mustExist=True)
+        fslimage.addExt(op.join(dirname, 'filtered_func_data'), mustExist=True)
     except fslimage.PathError:
         return False
     
@@ -124,7 +126,7 @@ def getAnalysisDir(path):
     """If the given path is contained within a FEAT directory, the path
     to that FEAT directory is returned. Otherwise, ``None`` is returned.
     """
-    featdir = fslpath.deepest(path, ['.feat', '.gfeat'])
+    featdir = fslpath.deepest(path, ['.feat'])
 
     if featdir is not None and isFEATDir(featdir):
         return featdir
@@ -153,8 +155,7 @@ def getReportFile(featdir):
 def loadContrasts(featdir):
     """Loads the contrasts from a FEAT directory. Returns a tuple containing:
     
-      - A dictionary of ``{contrastnum : name}`` mappings (the ``contrastnum``
-        values are 1-indexed).
+      - A list of names, one for each contrast.
     
       - A list of contrast vectors (each of which is a list itself).
 
@@ -274,10 +275,13 @@ def getThresholds(settings):
 
     :arg settings: A FEAT settings dictionary (see :func:`loadSettings`).
     """
-    return {
-        'p' : settings.get('prob_thresh', None),
-        'z' : settings.get('z_thresh',    None)
-    }
+    p = settings.get('prob_thresh', None)
+    z = settings.get('z_thresh',    None)
+
+    if p is not None: p = float(p)
+    if z is not None: z = float(z)
+
+    return {'p' : p, 'z' : z}
 
 
 def isFirstLevelAnalysis(settings):
@@ -432,10 +436,6 @@ def loadClusterResults(featdir, settings, contrast):
         colNames     =  colNames.split('\t')
         clusterLines = [cl      .split('\t') for cl in clusterLines]
 
-        # No clusters
-        if len(clusterLines) == 0:
-            return None
-
         # Turn each cluster line into a
         # Cluster instance. An error will
         # be raised if the columm names