diff --git a/cdist/config.py b/cdist/config.py
index bc05a28c..30117382 100644
--- a/cdist/config.py
+++ b/cdist/config.py
@@ -104,9 +104,12 @@ class Config(object):
         self.remove_remote_files_dirs = remove_remote_files_dirs
 
         self.explorer = core.Explorer(self.local.target_host, self.local,
-                                      self.remote, jobs=self.jobs)
-        self.manifest = core.Manifest(self.local.target_host, self.local)
-        self.code = core.Code(self.local.target_host, self.local, self.remote)
+                                      self.remote, jobs=self.jobs,
+                                      dry_run=self.dry_run)
+        self.manifest = core.Manifest(self.local.target_host, self.local,
+                                      dry_run=self.dry_run)
+        self.code = core.Code(self.local.target_host, self.local, self.remote,
+                              dry_run=self.dry_run)
 
     def _init_files_dirs(self):
         """Prepare files and directories for the run"""
diff --git a/cdist/core/code.py b/cdist/core/code.py
index 670029ed..1550880a 100644
--- a/cdist/core/code.py
+++ b/cdist/core/code.py
@@ -97,7 +97,7 @@ class Code(object):
 
     """
     # target_host is tuple (target_host, target_hostname, target_fqdn)
-    def __init__(self, target_host, local, remote):
+    def __init__(self, target_host, local, remote, dry_run=False):
         self.target_host = target_host
         self.local = local
         self.remote = remote
@@ -113,6 +113,9 @@ class Code(object):
                 local.log),
         }
 
+        if dry_run:
+            self.env['__cdist_dry_run'] = '1'
+
     def _run_gencode(self, cdist_object, which):
         cdist_type = cdist_object.cdist_type
         script = os.path.join(self.local.type_path,
diff --git a/cdist/core/explorer.py b/cdist/core/explorer.py
index acceacac..353d7681 100644
--- a/cdist/core/explorer.py
+++ b/cdist/core/explorer.py
@@ -67,7 +67,7 @@ class Explorer(object):
     """Executes cdist explorers.
 
     """
-    def __init__(self, target_host, local, remote, jobs=None):
+    def __init__(self, target_host, local, remote, jobs=None, dry_run=False):
         self.target_host = target_host
 
         self._open_logger()
@@ -84,6 +84,10 @@ class Explorer(object):
             '__cdist_log_level_name': util.log_level_name_env_var_val(
                 self.log),
         }
+
+        if dry_run:
+            self.env['__cdist_dry_run'] = '1'
+
         self._type_explorers_transferred = []
         self.jobs = jobs
 
diff --git a/cdist/core/manifest.py b/cdist/core/manifest.py
index 938ad8b8..07af0ef8 100644
--- a/cdist/core/manifest.py
+++ b/cdist/core/manifest.py
@@ -96,7 +96,7 @@ class Manifest(object):
     """Executes cdist manifests.
 
     """
-    def __init__(self, target_host, local):
+    def __init__(self, target_host, local, dry_run=False):
         self.target_host = target_host
         self.local = local
 
@@ -117,6 +117,9 @@ class Manifest(object):
                 self.log),
         }
 
+        if dry_run:
+            self.env['__cdist_dry_run'] = '1'
+
     def _open_logger(self):
         self.log = logging.getLogger(self.target_host[0])
 
diff --git a/docs/src/cdist-reference.rst.sh b/docs/src/cdist-reference.rst.sh
index 2c9c7b40..f4a37816 100755
--- a/docs/src/cdist-reference.rst.sh
+++ b/docs/src/cdist-reference.rst.sh
@@ -219,6 +219,10 @@ __cdist_log_level, __cdist_log_level_name
     | TRACE          | 5               |
     +----------------+-----------------+
 
+    Available for: initial manifest, explorer, type manifest, type explorer,
+    type gencode.
+__cdist_dry_run
+    Is set only when doing dry run (``-n`` flag).
     Available for: initial manifest, explorer, type manifest, type explorer,
     type gencode.
 __explorer
diff --git a/docs/src/cdist-type.rst b/docs/src/cdist-type.rst
index 7c0dab8d..7e5e39ef 100644
--- a/docs/src/cdist-type.rst
+++ b/docs/src/cdist-type.rst
@@ -371,6 +371,15 @@ It is available for initial manifest, explorer, type manifest,
 type explorer, type gencode.
 
 
+Detecting dry run
+-----------------
+
+If ``$__cdist_dry_run`` environment variable is set, then it's dry run.
+
+It is available for initial manifest, explorer, type manifest,
+type explorer, type gencode.
+
+
 Hints for typewriters
 ----------------------
 It must be assumed that the target is pretty dumb and thus does not have high