diff --git a/core/installer/kube.go b/core/installer/kube.go
index 25a7103..bc57805 100644
--- a/core/installer/kube.go
+++ b/core/installer/kube.go
@@ -1,48 +1,35 @@
 package installer
 
 import (
+	"bytes"
 	"context"
+	"encoding/json"
+	"fmt"
 
 	corev1 "k8s.io/api/core/v1"
 	"k8s.io/apimachinery/pkg/api/errors"
 	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
+	"k8s.io/apimachinery/pkg/runtime/schema"
+	"k8s.io/client-go/dynamic"
 	"k8s.io/client-go/kubernetes"
 	"k8s.io/client-go/rest"
 	"k8s.io/client-go/tools/clientcmd"
+
+	dnsv1 "github.com/giolekva/pcloud/core/ns-controller/api/v1"
 )
 
 type NamespaceCreator interface {
 	Create(name string) error
 }
 
+type ZoneStatusFetcher interface {
+	Fetch(namespace, name string) (error, bool, string)
+}
+
 type realNamespaceCreator struct {
 	clientset *kubernetes.Clientset
 }
 
-func NewOutOfClusterNamespaceCreator(kubeconfig string) (NamespaceCreator, error) {
-	config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
-	if err != nil {
-		return nil, err
-	}
-	clientset, err := kubernetes.NewForConfig(config)
-	if err != nil {
-		return nil, err
-	}
-	return &realNamespaceCreator{clientset}, nil
-}
-
-func NewInClusterNamespaceCreator() (NamespaceCreator, error) {
-	config, err := rest.InClusterConfig()
-	if err != nil {
-		panic(err.Error())
-	}
-	clientset, err := kubernetes.NewForConfig(config)
-	if err != nil {
-		return nil, err
-	}
-	return &realNamespaceCreator{clientset}, nil
-}
-
 func (n *realNamespaceCreator) Create(name string) error {
 	_, err := n.clientset.CoreV1().Namespaces().Create(context.Background(), &corev1.Namespace{
 		TypeMeta: metav1.TypeMeta{
@@ -58,3 +45,75 @@
 	}
 	return err
 }
+
+type realZoneStatusFetcher struct {
+	clientset dynamic.Interface
+}
+
+func (f *realZoneStatusFetcher) Fetch(namespace, name string) (error, bool, string) {
+	dnsZoneRes := schema.GroupVersionResource{Group: "dodo.cloud.dodo.cloud", Version: "v1", Resource: "dnszones"}
+	zoneUnstr, err := f.clientset.Resource(dnsZoneRes).Namespace(namespace).Get(context.TODO(), name, metav1.GetOptions{})
+	fmt.Printf("%+v %+v\n", zoneUnstr, err)
+	if err != nil {
+		return err, false, ""
+	}
+	var contents bytes.Buffer
+	if err := json.NewEncoder(&contents).Encode(zoneUnstr.Object); err != nil {
+		return err, false, ""
+	}
+	var zone dnsv1.DNSZone
+	if err := json.NewDecoder(&contents).Decode(&zone); err != nil {
+		return err, false, ""
+	}
+	return nil, zone.Status.Ready, zone.Status.RecordsToPublish
+}
+
+func NewNamespaceCreator(kubeconfig string) (NamespaceCreator, error) {
+	clientset, err := NewKubeConfig(kubeconfig)
+	if err != nil {
+		return nil, err
+	}
+	return &realNamespaceCreator{clientset}, nil
+}
+
+func NewZoneStatusFetcher(kubeconfig string) (ZoneStatusFetcher, error) {
+	if kubeconfig == "" {
+		config, err := rest.InClusterConfig()
+		if err != nil {
+			return nil, err
+		}
+		client, err := dynamic.NewForConfig(config)
+		if err != nil {
+			return nil, err
+		}
+		return &realZoneStatusFetcher{client}, nil
+
+	} else {
+		config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
+		if err != nil {
+			return nil, err
+		}
+		client, err := dynamic.NewForConfig(config)
+		if err != nil {
+			return nil, err
+		}
+		return &realZoneStatusFetcher{client}, nil
+	}
+}
+
+func NewKubeConfig(kubeconfig string) (*kubernetes.Clientset, error) {
+	if kubeconfig == "" {
+		config, err := rest.InClusterConfig()
+		if err != nil {
+			return nil, err
+		}
+		return kubernetes.NewForConfig(config)
+
+	} else {
+		config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
+		if err != nil {
+			return nil, err
+		}
+		return kubernetes.NewForConfig(config)
+	}
+}
