diff --git a/cmd/path-traversal/path_traversal.go b/cmd/path-traversal/path_traversal.go
index 9952b95896c93721134b7ea829fcf60693140fba..e24c58abb3b7dd9605a769841282afd449229f97 100644
--- a/cmd/path-traversal/path_traversal.go
+++ b/cmd/path-traversal/path_traversal.go
@@ -1,62 +1,21 @@
 package main
 
 import (
+	"code.fbi.h-da.de/cocsn/gosdn/nucleus/util"
 	schema "code.fbi.h-da.de/cocsn/yang-models/generated/arista"
-	"fmt"
-	"github.com/openconfig/goyang/pkg/yang"
 )
 
-type PathElement struct {
-	Children []*PathElement
-	Name     string
-}
-
-func (p *PathElement)Print()  {
-	printPE(0, p)
-}
-
-func printPE(indent int, pe *PathElement) {
-	for i := 0; i < indent; i++ {
-		fmt.Print("    ")
-	}
-	fmt.Println(pe.Name)
-	if len(pe.Children) > 0 {
-		for _,p := range pe.Children {
-			printPE(indent+1, p)
-		}
-	}
-}
-
 func main() {
 	tree := schema.SchemaTree
-	paths := make(map[string]*PathElement)
+	paths := util.NewPaths()
 
-	for k,v := range tree {
+	for _,v := range tree {
 		if v.Parent != nil {
 			if v.Parent.Name == "device" {
-				pathElement := processEntry(v)
+				pathElement := paths.ProcessEntry(v)
 				pathElement.Print()
-				paths[k] = pathElement
 			}
 		}
 	}
 }
 
-func processEntry(e *yang.Entry) *PathElement {
-	if e.Dir != nil {
-		elem := &PathElement{
-			Children: make([]*PathElement, len(e.Dir)),
-			Name:     e.Name,
-		}
-		i := 0
-		for _,v := range e.Dir {
-			elem.Children[i] =  processEntry(v)
-			i++
-		}
-		return elem
-	}
-	leaf := &PathElement{
-		Name:     e.Name,
-	}
-	return leaf
-}
\ No newline at end of file
diff --git a/nucleus/util/path_traversal.go b/nucleus/util/path_traversal.go
new file mode 100644
index 0000000000000000000000000000000000000000..36ba100e1dbdd2b1cf9fb0cc66f8e37695f2c2ea
--- /dev/null
+++ b/nucleus/util/path_traversal.go
@@ -0,0 +1,53 @@
+package util
+
+import (
+	"fmt"
+	"github.com/openconfig/goyang/pkg/yang"
+)
+
+type PathElement struct {
+	Children []*PathElement
+	Name     string
+}
+
+func (p *PathElement)Print()  {
+	printPE(0, p)
+}
+
+func printPE(indent int, pe *PathElement) {
+	for i := 0; i < indent; i++ {
+		fmt.Print("    ")
+	}
+	fmt.Println(pe.Name)
+	if len(pe.Children) > 0 {
+		for _,p := range pe.Children {
+			printPE(indent+1, p)
+		}
+	}
+}
+
+func NewPaths() Paths {
+	return make(map[string]*PathElement)
+}
+
+type Paths map[string]*PathElement
+
+func (p Paths)ProcessEntry(e *yang.Entry) *PathElement {
+	if e.Dir != nil {
+		elem := &PathElement{
+			Children: make([]*PathElement, len(e.Dir)),
+			Name:     e.Name,
+		}
+		i := 0
+		for _,v := range e.Dir {
+			elem.Children[i] =  p.ProcessEntry(v)
+			i++
+		}
+		p[e.Name] = elem
+		return elem
+	}
+	leaf := &PathElement{
+		Name:     e.Name,
+	}
+	return leaf
+}
\ No newline at end of file