diff --git a/bin/is b/bin/is
index 2ef02e99299c49521a87544f977f9f7823af83f7..3a5beb97b81c832de4f1a2bf9352feb8f0559afe 100755
--- a/bin/is
+++ b/bin/is
@@ -98,17 +98,13 @@ def c_build(parser, args):
 
 def c_cat(parser, args):
     '''
-    Display image's file(s)
+    Display image's file
     '''
     # looks if arguments is a file or image name
-    if istools.isfile(args.image) and os.path.isfile(args.image):
-        pkg = PackageImage(istools.abspath(args.image))
-    elif PackageImage.check_image_name(args.image):
-        # get image package
-        repoman = load_repositories(args)
-        pkg = repoman.get(args.image, args.image_version)
-    for filename in args.files:
-        pkg.cat(filename)
+    repoman = load_repositories(args)
+    img, repo = select_image(args.image, repoman)
+    for filename in args.file:
+        img.cat(filename)
 
 def c_clean(parser, args):
     '''
@@ -340,10 +336,8 @@ p_build.set_defaults(func=c_build)
 
 # cat command parser
 p_cat = subparsers.add_parser("cat", help=c_cat.__doc__.lower())
-p_cat.add_argument("-v", "--image-version", type=int, default=None,
-                   help="image version")
-p_cat.add_argument("image", help="image (path or name)")
-p_cat.add_argument("files", nargs="+", help="files to cat")
+p_cat.add_argument("image")
+p_cat.add_argument("file", nargs="+", help="file to cat (glob allowed)")
 p_cat.set_defaults(func=c_cat)
 
 # clean command parser
diff --git a/installsystems/image.py b/installsystems/image.py
index 494a8e83ed817177eb6c112198e17a4110205dc2..621735bcf4fcd63ab3bc2e233b440e8bc3946613 100644
--- a/installsystems/image.py
+++ b/installsystems/image.py
@@ -17,7 +17,6 @@ import re
 import cStringIO
 import shutil
 import gzip
-import fnmatch
 import installsystems.template as istemplate
 import installsystems.tools as istools
 from installsystems.printer import *
@@ -458,12 +457,9 @@ class PackageImage(Image):
         '''
         Display filename in the tarball
         '''
-        for filename in fnmatch.filter(self._tarball.getnames(), filename):
-            fd = self._tarball.extractfile(filename)
-            if fd is not None:
-                arrow(filename)
-                out(fd.read())
-                fd.close()
+        for filename in self._tarball.getnames(glob_pattern=filename):
+            arrow(filename)
+            out(self._tarball.get_str(filename))
 
     def run_parser(self, **kwargs):
         '''
@@ -484,7 +480,7 @@ class PackageImage(Image):
         arrow("Run %s scripts" % directory)
         arrowlevel(1)
         # get list of parser scripts
-        l_scripts = self._tarball.getnames("%s/.*\.py" % directory)
+        l_scripts = self._tarball.getnames(re_pattern="%s/.*\.py" % directory)
         # order matter!
         l_scripts.sort()
         # run scripts
diff --git a/installsystems/tarball.py b/installsystems/tarball.py
index 9b41f0c0c94856abe68b4aa06f78bdf7e0fd8748..a9c524587ac9c7cbf8c904c56a4c154ea77dd3d4 100644
--- a/installsystems/tarball.py
+++ b/installsystems/tarball.py
@@ -11,6 +11,7 @@ import time
 import tarfile
 import StringIO
 import re
+import fnmatch
 
 class Tarball(tarfile.TarFile):
     def add_str(self, name, content, ftype, mode):
@@ -31,15 +32,19 @@ class Tarball(tarfile.TarFile):
         Return a string from a filename in a tarball
         '''
         ti = self.getmember(name)
-        return self.extractfile(ti).read()
+        fd = self.extractfile(ti)
+        return fd.read() if fd is not None else ""
 
-    def getnames(self, reg_pattern=None):
+    def getnames(self, re_pattern=None, glob_pattern=None):
         lorig = super(Tarball, self).getnames()
-        if reg_pattern is None:
-            return lorig
-        else:
+        # regexp matching
+        if re_pattern is not None:
             return [ tpname for tpname in lorig
                      if re.match(reg_pattern, tpname) ]
+        # globbing matching
+        if glob_pattern is not None:
+            return fnmatch.filter(lorig, glob_pattern)
+        return lorig
 
     def size(self):
         '''