diff --git a/cfg_checker/common/kube_utils.py b/cfg_checker/common/kube_utils.py
index 86e59a5..042db5d 100644
--- a/cfg_checker/common/kube_utils.py
+++ b/cfg_checker/common/kube_utils.py
@@ -8,14 +8,17 @@
 
 from kubernetes import client as kclient, config as kconfig
 from kubernetes.stream import stream
+from kubernetes.client.rest import ApiException
 
 from cfg_checker.common import logger, logger_cli
+from cfg_checker.common.decorators import retry
 from cfg_checker.common.exception import InvalidReturnException, KubeException
 from cfg_checker.common.file_utils import create_temp_file_with_content
 from cfg_checker.common.other import utils, shell
 from cfg_checker.common.ssh_utils import ssh_shell_p
 from cfg_checker.common.const import ENV_LOCAL
 
+
 urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)
 
 
@@ -208,7 +211,10 @@
     @property
     def CoreV1(self):
         if not self._coreV1:
-            self._coreV1 = kclient.CoreV1Api(self.kApi)
+            if self.is_local:
+                self._coreV1 = kclient.CoreV1Api(kclient.ApiClient())
+            else:
+                self._coreV1 = kclient.CoreV1Api(kclient.ApiClient(self.kConf))
         return self._coreV1
 
     @property
@@ -306,7 +312,7 @@
                 "... searching for pods with the name '{}'".format(pod_name)
             )
             _pods = {}
-            _pods = self._coreV1.list_namespaced_pod(namespace)
+            _pods = self.CoreV1.list_namespaced_pod(namespace)
             _names = self._get_listed_attrs(_pods.items, "metadata.name")
             _pname = ""
             _pnames = [n for n in _names if n.startswith(pod_name)]
@@ -334,11 +340,12 @@
         # If not, output gets converted to str
         # Which causes to change " to '
         # After that json.loads(...) fail
+        cmd = cmd if isinstance(cmd, list) else cmd.split()
         _pod_stream = stream(
             self.CoreV1.connect_get_namespaced_pod_exec,
             _pname,
             namespace,
-            command=cmd.split(),
+            command=cmd,
             stderr=True,
             stdin=False,
             stdout=True,
@@ -350,7 +357,11 @@
         # run for timeout
         _pod_stream.run_forever(timeout=_request_timeout)
         # read the output
-        return _pod_stream.read_stdout()
+        _output = _pod_stream.read_stdout()
+        # Force recreate of api objects
+        self._coreV1 = None
+        # Send output
+        return _output
 
     def ensure_namespace(self, ns):
         """
@@ -487,3 +498,71 @@
         # create result list
 
         return []
+
+    @retry(ApiException)
+    def get_pods_for_daemonset(self, ds):
+        # get all pod names for daemonset
+        logger_cli.debug(
+            "... extracting pod names from daemonset '{}'".format(
+                ds.metadata.name
+            )
+        )
+        _ns = ds.metadata.namespace
+        _name = ds.metadata.name
+        _pods = self.CoreV1.list_namespaced_pod(
+            namespace=_ns,
+            label_selector='name={}'.format(_name)
+        )
+        return _pods
+
+    def put_string_buffer_to_pod_as_textfile(
+        self,
+        pod_name,
+        namespace,
+        buffer,
+        filepath,
+        _request_timeout=120,
+        **kwargs
+    ):
+        _command = ['/bin/sh']
+        response = stream(
+            self.CoreV1.connect_get_namespaced_pod_exec,
+            pod_name,
+            namespace,
+            command=_command,
+            stderr=True,
+            stdin=True,
+            stdout=True,
+            tty=False,
+            _request_timeout=_request_timeout,
+            _preload_content=False,
+            **kwargs
+        )
+
+        # if json
+        # buffer = json.dumps(_dict, indent=2).encode('utf-8')
+
+        commands = [
+            bytes("cat <<'EOF' >" + filepath + "\n", 'utf-8'),
+            buffer,
+            bytes("\n" + "EOF\n", 'utf-8')
+        ]
+
+        while response.is_open():
+            response.update(timeout=1)
+            if response.peek_stdout():
+                logger_cli.debug("... STDOUT: %s" % response.read_stdout())
+            if response.peek_stderr():
+                logger_cli.debug("... STDERR: %s" % response.read_stderr())
+            if commands:
+                c = commands.pop(0)
+                logger_cli.debug("... running command... {}\n".format(c))
+                response.write_stdin(str(c, encoding='utf-8'))
+            else:
+                break
+        response.close()
+
+        # Force recreate of Api objects
+        self._coreV1 = None
+
+        return
