diff --git a/reclass_tools/cli.py b/reclass_tools/cli.py
index 92e2bd2..a894251 100644
--- a/reclass_tools/cli.py
+++ b/reclass_tools/cli.py
@@ -113,20 +113,16 @@
         print(yaml.dump(current_underlay_context, default_flow_style=False))
 
     def do_render(self):
-        try:
-            from reclass_tools import create_inventory
-        except ImportError:
-            sys.exit("Please run this tool on the salt-master node "
-                     "with installed 'reclass'")
+        from reclass_tools import render
 
         if not self.params.template_dir or not self.params.output_dir \
                 or not self.params.contexts:
             sys.exit("Missing parameters, see: reclass-tools render -h")
 
-        create_inventory.render_dir(template_dir=self.params.template_dir,
-                                    output_dir=self.params.output_dir,
-                                    contexts=self.params.contexts,
-                                    env_name=self.params.env_name)
+        render.render_dir(template_dir=self.params.template_dir,
+                          output_dir=self.params.output_dir,
+                          contexts=self.params.contexts,
+                          env_name=self.params.env_name)
 
     def get_params(self):
 
diff --git a/reclass_tools/create_inventory.py b/reclass_tools/create_inventory.py
index 8bb5840..5a03ed7 100644
--- a/reclass_tools/create_inventory.py
+++ b/reclass_tools/create_inventory.py
@@ -13,10 +13,6 @@
 #    under the License.
 
 import sys
-import yaml
-
-from cookiecutter.exceptions import UndefinedVariableInTemplate
-from cookiecutter import generate
 
 from reclass_tools import helpers
 from reclass_tools import reclass_models
@@ -97,60 +93,3 @@
         }
 
     return current_underlay_context
-
-
-def render_dir(template_dir, output_dir, contexts, env_name=None):
-    """Coockiecutter echancement to use several source JSON files
-
-    :param template_dir: directory with templates to render
-    :param output_dir: directory that should be created from templates
-    :param context_files: list of strings, paths to YAML or JSON files
-                          that provide the context variables for rendering.
-                          Merge of the files usind update() into a single
-                          dict is in the same order as files in the list.
-    :param env_name: name for new environment that will be created
-    """
-    def toyaml(value, width=0, indentfirst=False):
-        string = yaml.dump(value, default_flow_style=False)
-        if string.splitlines():
-            return (
-                ' ' * width * indentfirst +
-                ('\n' + ' ' * width).join(string.splitlines()) + '\n')
-        else:
-            return ''
-
-    overwrite_if_exists = True
-
-    merged_context = {}
-
-    for fcon in contexts:
-        if fcon.endswith('.yaml'):
-            context = helpers.yaml_read(fcon)
-        elif fcon.endswith('.json'):
-            context = helpers.json_read(fcon)
-        else:
-            sys.exit("Error: Please use YAML or JSON files for contexts")
-
-        merged_context = helpers.merge_nested_objects(merged_context, context)
-
-    merged_context['toyaml'] = toyaml
-    if env_name:
-        merged_context['cookiecutter']['_environment_name'] = env_name
-
-    try:
-        generate.generate_files(
-            repo_dir=template_dir,
-            context=merged_context,
-            overwrite_if_exists=overwrite_if_exists,
-            output_dir=output_dir
-        )
-
-    except UndefinedVariableInTemplate as undefined_err:
-        context_str = yaml.dump(
-            undefined_err.context,
-            default_flow_style=False
-        )
-        print('=' * 15 + ' Context: ' + '=' * 15 +
-              '\n{}'.format(context_str) + '='*40)
-        print('>>> {}'.format(undefined_err.message))
-        sys.exit('>>> Error message: {}'.format(undefined_err.error.message))
diff --git a/reclass_tools/render.py b/reclass_tools/render.py
new file mode 100644
index 0000000..285858f
--- /dev/null
+++ b/reclass_tools/render.py
@@ -0,0 +1,80 @@
+#    Copyright 2013 - 2017 Mirantis, Inc.
+#
+#    Licensed under the Apache License, Version 2.0 (the "License"); you may
+#    not use this file except in compliance with the License. You may obtain
+#    a copy of the License at
+#
+#         http://www.apache.org/licenses/LICENSE-2.0
+#
+#    Unless required by applicable law or agreed to in writing, software
+#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
+#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
+#    License for the specific language governing permissions and limitations
+#    under the License.
+
+import sys
+import yaml
+
+from cookiecutter.exceptions import UndefinedVariableInTemplate
+from cookiecutter import generate
+
+from reclass_tools import helpers
+
+
+def render_dir(template_dir, output_dir, contexts, env_name=None):
+    """Coockiecutter echancement to use several source JSON files
+
+    :param template_dir: directory with templates to render
+    :param output_dir: directory that should be created from templates
+    :param context_files: list of strings, paths to YAML or JSON files
+                          that provide the context variables for rendering.
+                          Merge of the files usind update() into a single
+                          dict is in the same order as files in the list.
+    :param env_name: name for new environment that will be created
+    """
+    def toyaml(value, width=0, indentfirst=False):
+        string = yaml.dump(value, default_flow_style=False)
+        if string.splitlines():
+            return (
+                ' ' * width * indentfirst +
+                ('\n' + ' ' * width).join(string.splitlines()) + '\n')
+        else:
+            return ''
+
+    overwrite_if_exists = True
+
+    merged_context = {}
+
+    for fcon in contexts:
+        if fcon.endswith('.yaml'):
+            context = helpers.yaml_read(fcon)
+        elif fcon.endswith('.json'):
+            context = helpers.json_read(fcon)
+        else:
+            sys.exit("Error: Please use YAML or JSON files for contexts")
+
+        merged_context = helpers.merge_nested_objects(merged_context, context)
+
+    merged_context['toyaml'] = toyaml
+    if env_name:
+        if 'cookiecutter' not in merged_context:
+            merged_context['cookiecutter'] = {}
+        merged_context['cookiecutter']['_env_name'] = env_name
+
+    try:
+        generate.generate_files(
+            repo_dir=template_dir,
+            context=merged_context,
+            overwrite_if_exists=overwrite_if_exists,
+            output_dir=output_dir
+        )
+
+    except UndefinedVariableInTemplate as undefined_err:
+        context_str = yaml.dump(
+            undefined_err.context,
+            default_flow_style=False
+        )
+        print('=' * 15 + ' Context: ' + '=' * 15 +
+              '\n{}'.format(context_str) + '='*40)
+        print('>>> {}'.format(undefined_err.message))
+        sys.exit('>>> Error message: {}'.format(undefined_err.error.message))
