diff --git a/.gitignore b/.gitignore
index 159fd2d040dbb2bc31b032e93a50d5089aa2212f..7dfe9ba22312fc5c77e3652cb458e3dca30e7e6c 100644
--- a/.gitignore
+++ b/.gitignore
@@ -23,12 +23,13 @@ cli/gosdnc
 csbi/resources/csbi
 
 # controller
+controller/config/*_test.toml
 controller/configs/testing-gosdn.toml
 controller/configs/gosdn.toml
 controller/configs/development-gosdn.toml
 controller/configs/containerlab-gosdn.toml
-controller/config/*_test.toml
 controller/configs/ci-testing-gosdn.toml
+controller/configs/gNMISubscriptions.txt
 controller/stores_testing
 controller/stores/**
 controller/cmd/gosdn/stores/
diff --git a/controller/config/gnmiSubscriptionConfig.go b/controller/config/gnmiSubscriptionConfig.go
new file mode 100644
index 0000000000000000000000000000000000000000..fa433e3d8fce96733c4b0f55d5fc99b3ed47396b
--- /dev/null
+++ b/controller/config/gnmiSubscriptionConfig.go
@@ -0,0 +1,48 @@
+package config
+
+import (
+	"bufio"
+	"fmt"
+	"os"
+	"path/filepath"
+	"strings"
+)
+
+const (
+	defaultGnmiSubscriptionFilePath = "controller/configs/gNMISubscriptions.txt"
+)
+
+var gnmiSubscriptionPaths [][]string
+
+// ReadGnmiSubscriptionPaths reads the paths the watcher should subscribe to provided in a file.
+func ReadGnmiSubscriptionPaths() error {
+	currentDir, err := os.Getwd()
+	if err != nil {
+		return err
+	}
+
+	filePath := filepath.Join(currentDir, defaultGnmiSubscriptionFilePath)
+
+	f, err := os.Open(filePath)
+	if err != nil {
+		return err
+	}
+
+	defer f.Close()
+
+	scanner := bufio.NewScanner(f)
+
+	for scanner.Scan() {
+		path := strings.Split(scanner.Text(), "/")
+		gnmiSubscriptionPaths = append(gnmiSubscriptionPaths, path)
+	}
+
+	fmt.Println(gnmiSubscriptionPaths)
+
+	return nil
+}
+
+// GetGnmiSubscriptionPaths returns the paths the watcher should subscribe to.
+func GetGnmiSubscriptionPaths() [][]string {
+	return gnmiSubscriptionPaths
+}
diff --git a/controller/configs/gNMISubscriptions.txt.example b/controller/configs/gNMISubscriptions.txt.example
new file mode 100644
index 0000000000000000000000000000000000000000..46b4f0456aff4350275a64c46efb1a4c6431f81d
--- /dev/null
+++ b/controller/configs/gNMISubscriptions.txt.example
@@ -0,0 +1,2 @@
+system/config/hostname
+system/config/domain-name
diff --git a/controller/controller.go b/controller/controller.go
index 7b48477b18b757da291167d04e19711e7ba9b9af..d2f9f454cea7f279f4209a11d5cd06bd900eecc9 100644
--- a/controller/controller.go
+++ b/controller/controller.go
@@ -74,6 +74,11 @@ func initialize() error {
 		return err
 	}
 
+	err = config.ReadGnmiSubscriptionPaths()
+	if err != nil {
+		log.Error("Error reading in gNMI subscription paths, can not watch devices automatically: ", err)
+	}
+
 	eventService, err := eventservice.NewEventService()
 	if err != nil {
 		return err
@@ -107,8 +112,9 @@ func initialize() error {
 	}
 
 	c.deviceWatcher = nucleus.NewDeviceWatcher(c.pndStore)
-	// TODO: udpate with actual paths to subscribe to using template/config
-	c.deviceWatcher.SubToDevices([][]string{{"system", "config", "hostname"}}, nil)
+	// TODO: udpate with actual paths to subscribe when using template/config
+	fmt.Println(config.GetGnmiSubscriptionPaths())
+	c.deviceWatcher.SubToDevices(config.GetGnmiSubscriptionPaths(), nil)
 
 	err = ensureDefaultRoleExists()
 	if err != nil {