diff --git a/core/nebula/controllers/ca.go b/core/nebula/controllers/ca.go
index 452b9e5..c848571 100644
--- a/core/nebula/controllers/ca.go
+++ b/core/nebula/controllers/ca.go
@@ -38,7 +38,7 @@
 	key string
 }
 
-type CAController struct {
+type NebulaController struct {
 	kubeClient   kubernetes.Interface
 	nebulaClient clientset.Interface
 	caLister     listers.NebulaCALister
@@ -52,13 +52,13 @@
 	nebulaCert string
 }
 
-func NewCAController(kubeClient kubernetes.Interface,
+func NewNebulaController(kubeClient kubernetes.Interface,
 	nebulaClient clientset.Interface,
 	caInformer informers.NebulaCAInformer,
 	nodeInformer informers.NebulaNodeInformer,
 	secretInformer corev1informers.SecretInformer,
-	nebulaCert string) *CAController {
-	c := &CAController{
+	nebulaCert string) *NebulaController {
+	c := &NebulaController{
 		kubeClient:   kubeClient,
 		nebulaClient: nebulaClient,
 		caLister:     caInformer.Lister(),
@@ -91,7 +91,7 @@
 	return c
 }
 
-func (c *CAController) enqueueCA(o interface{}) {
+func (c *NebulaController) enqueueCA(o interface{}) {
 	var key string
 	var err error
 	if key, err = cache.MetaNamespaceKeyFunc(o); err != nil {
@@ -101,7 +101,7 @@
 	c.workqueue.Add(caRef{key})
 }
 
-func (c *CAController) enqueueNode(o interface{}) {
+func (c *NebulaController) enqueueNode(o interface{}) {
 	var key string
 	var err error
 	if key, err = cache.MetaNamespaceKeyFunc(o); err != nil {
@@ -111,7 +111,7 @@
 	c.workqueue.Add(nodeRef{key})
 }
 
-func (c *CAController) Run(workers int, stopCh <-chan struct{}) error {
+func (c *NebulaController) Run(workers int, stopCh <-chan struct{}) error {
 	defer utilruntime.HandleCrash()
 	defer c.workqueue.ShutDown()
 	klog.Info("Starting NebulaCA controller")
@@ -129,12 +129,12 @@
 	return nil
 }
 
-func (c *CAController) runWorker() {
+func (c *NebulaController) runWorker() {
 	for c.processNextWorkItem() {
 	}
 }
 
-func (c *CAController) processNextWorkItem() bool {
+func (c *NebulaController) processNextWorkItem() bool {
 	o, shutdown := c.workqueue.Get()
 	if shutdown {
 		return false
@@ -168,7 +168,7 @@
 	return true
 }
 
-func (c *CAController) processCAWithKey(key string) error {
+func (c *NebulaController) processCAWithKey(key string) error {
 	namespace, name, err := cache.SplitMetaNamespaceKey(key)
 	if err != nil {
 		return nil
@@ -203,7 +203,7 @@
 	return nil
 }
 
-func (c *CAController) processNodeWithKey(key string) error {
+func (c *NebulaController) processNodeWithKey(key string) error {
 	namespace, name, err := cache.SplitMetaNamespaceKey(key)
 	if err != nil {
 		return nil
@@ -255,7 +255,7 @@
 	return nil
 }
 
-func (c *CAController) updateCAStatus(ca *nebulav1.NebulaCA, state nebulav1.NebulaCAState, msg string) error {
+func (c *NebulaController) updateCAStatus(ca *nebulav1.NebulaCA, state nebulav1.NebulaCAState, msg string) error {
 	cp := ca.DeepCopy()
 	cp.Status.State = state
 	cp.Status.Message = msg
@@ -263,7 +263,7 @@
 	return err
 }
 
-func (c *CAController) updateNodeStatus(node *nebulav1.NebulaNode, state nebulav1.NebulaNodeState, msg string) error {
+func (c *NebulaController) updateNodeStatus(node *nebulav1.NebulaNode, state nebulav1.NebulaNodeState, msg string) error {
 	cp := node.DeepCopy()
 	cp.Status.State = state
 	cp.Status.Message = msg
@@ -337,7 +337,7 @@
 	return nil
 }
 
-func (c *CAController) getCA(namespace, name string) (*nebulav1.NebulaCA, error) {
+func (c *NebulaController) getCA(namespace, name string) (*nebulav1.NebulaCA, error) {
 	s := labels.NewSelector()
 	r, err := labels.NewRequirement("metadata.namespace", selection.Equals, []string{namespace})
 	if err != nil {
@@ -358,7 +358,7 @@
 	return ncas[0], nil
 }
 
-func (c *CAController) getNode(namespace, name string) (*nebulav1.NebulaNode, error) {
+func (c *NebulaController) getNode(namespace, name string) (*nebulav1.NebulaNode, error) {
 	s := labels.NewSelector()
 	r, err := labels.NewRequirement("metadata.namespace", selection.Equals, []string{namespace})
 	if err != nil {
@@ -379,6 +379,6 @@
 	return nodes[0], nil
 }
 
-func (c *CAController) getSecret(namespace, name string) (*corev1.Secret, error) {
+func (c *NebulaController) getSecret(namespace, name string) (*corev1.Secret, error) {
 	return c.secretLister.Secrets(namespace).Get(name)
 }
diff --git a/core/nebula/main.go b/core/nebula/main.go
index af7b0b5..9abfc9e 100644
--- a/core/nebula/main.go
+++ b/core/nebula/main.go
@@ -35,7 +35,7 @@
 	utilruntime.Must(nebulascheme.AddToScheme(scheme.Scheme))
 	kubeInformerFactory := kubeinformers.NewSharedInformerFactory(kubeClient, time.Second*30)
 	nebulaInformerFactory := informers.NewSharedInformerFactory(nebulaClient, 5*time.Second)
-	c := controllers.NewCAController(
+	c := controllers.NewNebulaController(
 		kubeClient,
 		nebulaClient,
 		nebulaInformerFactory.Lekva().V1().NebulaCAs(),
