diff --git a/bin/isinstall b/bin/isinstall
index b1878a77dde74ab2395314a59f27adc441ae6d2d..84a74e0bcbf83712e82c60c3827cad938c421c80 100755
--- a/bin/isinstall
+++ b/bin/isinstall
@@ -52,10 +52,9 @@ try:
     # load config
     config = ConfigFile("isinstall", args.config)
     # looks if arguments is a file or image name
-    image_name_type = istools.pathtype(args.image_name)
-    if image_name_type == "file":
+    if istools.pathtype(args.image_name) == "file" and os.path.isfile(args.image_name):
         pkg = PackageImage(istools.abspath(args.image_name))
-    elif image_name_type == "name":
+    elif PackageImage.check_image_name(args.image_name):
         # remove cache is asked
         if args.no_cache:
             config.cache = None
@@ -74,17 +73,13 @@ try:
         exit(1)
     # install start time
     t0 = time.time()
-    # global dict of execution context
-    gl_exec = { "parser": p_main }
-    # run parser scripts
-    pkg.run_parser(gl_exec)
+    # run parser scripts with parser parser argument
+    pkg.run_parser(parser=p_main)
     # call parser again, with extended attributes
-    arrow("Run parser", 1, args.verbose)
+    arrow("Parsing arguments", 1, args.verbose)
     args = p_main.parse_args()
-    # add parser result to global dict
-    gl_exec["args"] = args
     # run setup scripts
-    pkg.run_setup(gl_exec)
+    pkg.run_setup(namespace = args)
     # compute building time
     t1 = time.time()
     dt = int(t1 - t0)
diff --git a/installsystems/image.py b/installsystems/image.py
index 5ddcb2da584d040ae2f93b3b319b0fbc7b171d93..fdead34c384dbc34cc6557504b8245b7e3faa530 100644
--- a/installsystems/image.py
+++ b/installsystems/image.py
@@ -375,21 +375,19 @@ class PackageImage(Image):
             arrow(pay_name, 2, self.verbose)
             pay_obj.check()
 
-    def run_parser(self, gl):
+    def run_parser(self, **kwargs):
         '''
         Run parser scripts
         '''
-        gl["image"] = self
-        self._run_scripts(gl, "parser")
+        self._run_scripts("parser", **kwargs)
 
-    def run_setup(self, gl):
+    def run_setup(self, **kwargs):
         '''
         Run setup scripts
         '''
-        gl["image"] = self
-        self._run_scripts(gl, "setup")
+        self._run_scripts("setup", **kwargs)
 
-    def _run_scripts(self, gl, directory):
+    def _run_scripts(self, directory, **kwargs):
         '''
         Run scripts in a tarball directory
         '''
@@ -401,16 +399,29 @@ class PackageImage(Image):
         # run scripts
         for n_scripts in l_scripts:
             arrow(os.path.basename(n_scripts), 2, self.verbose)
+            # extract source code
             try:
                 s_scripts = self._tarball.get_str(n_scripts)
             except Exception as e:
                 raise Exception("Extracting script %s fail: %s" %
-                                (os.path.basename(n_scripts), e))
+                                (n_scripts, e))
+            # compile source code
             try:
-                exec(s_scripts, gl, dict())
+                o_scripts = compile(s_scripts, n_scripts, "exec")
+            except Exception as e:
+                raise Exception("Unable to compile %s fail: %s" %
+                                (n_scripts, e))
+            # define execution context
+            gl = {}
+            for k in kwargs:
+                gl[k] = kwargs[k]
+            gl["image"] = self
+            # execute source code
+            try:
+                exec o_scripts in gl
             except Exception as e:
                 raise Exception("Execution script %s fail: %s" %
-                                (os.path.basename(n_scripts), e))
+                                (n_scripts, e))
 
 
 class Payload(object):
@@ -438,7 +449,7 @@ class Payload(object):
         raise AttributeError
 
     def __setattr__(self, name, value):
-        # set all value which exists have no underscore, but undesrcore exists
+        # set all value which exists have no underscore, but where undesrcore exists
         if name in self.legit_attr:
             object.__setattr__(self, "_%s" % name, value)
         else:
diff --git a/installsystems/template.py b/installsystems/template.py
index af960e5801d24f745e5ca1b8064ce389a91581da..f24bd7eb40615c8aba35d0af91fbf17469afe152 100644
--- a/installsystems/template.py
+++ b/installsystems/template.py
@@ -12,8 +12,20 @@ author =
 parser = """# -*- python -*-
 # -*- coding: utf-8 -*-
 
+# image object is a reference to current image
+# parser object is installsystems argument parser
+
+import os
+import installsystems.argparse as argparse
+
+class TargetAction(argparse.Action):
+  def __call__(self, parser, namespace, values, option_string=None):
+    if not os.path.isdir(values):
+      raise Exception("Invalid target directory %s" % values)
+    namespace.target = values
+
 parser.add_argument("-n", "--hostname", dest="hostname", type=str, required=True)
-parser.add_argument("target", type=str,
+parser.add_argument("target", type=str, action=TargetAction,
   help="target installation directory")
 
 # vim:set ts=2 sw=2 noet:
@@ -22,9 +34,13 @@ parser.add_argument("target", type=str,
 setup = """# -*- python -*-
 # -*- coding: utf-8 -*-
 
-print "hostname: %s" % args.hostname
+# image object is a reference to current image
+# namespace object is the persistant, it can be used to store data accross scripts
+
+print "hostname: %s" % namespace.hostname
 
-image.payload["rootfs"].extract(args.target)
+# uncomment to extract payload named root in namespace.target directory
+#image.payload["rootfs"].extract(namespace.target)
 
 # vim:set ts=2 sw=2 noet:
 """
diff --git a/installsystems/tools.py b/installsystems/tools.py
index d45d04237c67c14a1625a8954b991bbfd8a7e607..1f3e9f854798bf04984da47e914ffa551114b12e 100644
--- a/installsystems/tools.py
+++ b/installsystems/tools.py
@@ -81,18 +81,14 @@ def chrights(path, uid=None, gid=None, mode=None, mtime=None):
 
 def pathtype(path):
     '''Return path type. This is usefull to know what kind of path is given'''
-    from installsystems.image import Image
     if path.startswith("http://") or path.startswith("https://"):
         return "http"
     if path.startswith("ftp://") or path.startswith("ftps://"):
         return "ftp"
     elif path.startswith("ssh://"):
         return "ssh"
-    elif path.startswith("file://") or path.startswith("/") or os.path.exists(path):
+    else:
         return "file"
-    elif Image.check_image_name(path):
-        return "name"
-    return None
 
 def abspath(path):
     '''Format a path to be absolute'''