diff --git a/app/vpnhole/handler.go b/app/vpnhole/handler.go
index b24f56d1448ce1582b3a0d159d6587078d9720a7..efb429a73c2fe8903ce2ed69a9724f5ef81c9427 100644
--- a/app/vpnhole/handler.go
+++ b/app/vpnhole/handler.go
@@ -27,7 +27,14 @@ func Handler(rw dns.ResponseWriter, req *dns.Msg) {
 
 		return
 	}
-	c := vpnhole.ParseFlags()
+	c := vpnhole.NewVpnHoleClient("", "", "", nil)
+	err := c.Start()
+	if err != nil {
+		log.Fatal(err)
+	}
+	defer c.Stop()
+	fmt.Println(c)
+
 	resp, _, err := client.Exchange(req, c.Upstream)
 	if err != nil {
 		log.Fatalln(fmt.Errorf("failed to exchange: %w", err))
@@ -37,6 +44,7 @@ func Handler(rw dns.ResponseWriter, req *dns.Msg) {
 	if err = rw.WriteMsg(resp); err != nil {
 		log.Println(fmt.Errorf("failed to reply: %w", err))
 	}
+
 }
 
 func Block(rw dns.ResponseWriter, req *dns.Msg) error {
diff --git a/app/vpnhole/main.go b/app/vpnhole/main.go
index 8ae72052496f85fe36a8a50a20ebc734e9fde09a..76748b2b42bc9afbc1f354d8aff1adabe8c61808 100644
--- a/app/vpnhole/main.go
+++ b/app/vpnhole/main.go
@@ -5,22 +5,27 @@ import (
 	"fmt"
 	"log"
 
+	"time"
+
 	"0xacab.org/leap/vpn-hole/vpnhole/vpnhole"
+	"github.com/common-nighthawk/go-figure"
 	"github.com/miekg/dns"
-
-	"time"
 )
 
-func init() {
-	// start the cmdline parser
-	vpnhole.ParseFlags()
-
-}
-
 func main() {
 
-	// call ParseFlags() to get the config struct with the values
-	c := vpnhole.ParseFlags()
+	// Print the 'VPN-Hole' Logo
+	Logo := figure.NewColorFigure(" VPN-Hole", "", "green", true)
+	Logo.Print()
+
+	// call Start() to get the config struct with the values
+	// and then call Stop() to stop the VpnHoleClient
+	c := vpnhole.NewVpnHoleClient("", "", "", nil)
+	err := c.Start()
+	if err != nil {
+		log.Fatal(err)
+	}
+	defer c.Stop()
 	fmt.Println(c)
 
 	// start the vpnhole
diff --git a/vpnhole/vpnhole.go b/vpnhole/vpnhole.go
index 3acba5f5b333eebcbddb4199dc6f627490b34e54..1716f3b1e885ab0433f35e01a92e889ef790d5b8 100644
--- a/vpnhole/vpnhole.go
+++ b/vpnhole/vpnhole.go
@@ -1,32 +1,98 @@
 package vpnhole
 
 import (
+	"errors"
 	"fmt"
+	"log"
 )
 
-var ErrShutdown = fmt.Errorf("vpnhole was shutdown gracefully")
+var (
+	ErrAlreadyRunning = errors.New("already running")
+	ErrNotRunning     = errors.New("not running")
+)
 
-type vpnholeclient struct {
+type VpnHoleClient struct {
 	Addr                  string
 	SubscriptionsFilename string
 	Upstream              string
+	Eventlogger           EventLogger
+}
+
+type EventLogger interface {
+	Infof(format string, v ...interface{})
+	Errorf(format string, v ...interface{})
+}
+
+type DefaultEventLogger struct {
+	InfoLogger  *log.Logger
+	ErrorLogger *log.Logger
+}
+
+// Implement the EventLogger interface
+func (l *DefaultEventLogger) Infof(format string, v ...interface{}) {
+	l.InfoLogger.Printf(format, v...)
 }
 
-// parse the flags and return the config struct with the values
-func ParseFlags() vpnholeclient {
-	return vpnholeclient{
-		Addr:                  ":53",
-		SubscriptionsFilename: "subs.list",
-		Upstream:              "1.1.1.1:53",
+func (l *DefaultEventLogger) Errorf(format string, v ...interface{}) {
+	l.ErrorLogger.Printf(format, v...)
+}
+
+func (c *VpnHoleClient) String() string {
+	return fmt.Sprintf("addr=%s, subscriptions=%s, upstream=%s", c.Addr, c.SubscriptionsFilename, c.Upstream)
+}
+
+// NewVpnHoleClient creates a new VpnHoleClient
+
+func NewVpnHoleClient(addr, subscriptionsFilename, upstream string, eventlogger EventLogger) *VpnHoleClient {
+	return &VpnHoleClient{
+		Addr:                  addr,
+		SubscriptionsFilename: subscriptionsFilename,
+		Upstream:              upstream,
+		Eventlogger:           eventlogger,
 	}
 }
 
-// start the vpnhole
-func (c *vpnholeclient) Start() error {
+// Start starts the VpnHoleClient and config new values
+func (c *VpnHoleClient) Start() error {
+
+	if c.Addr == "" {
+		c.Addr = ":53"
+	}
+
+	if c.SubscriptionsFilename == "" {
+		c.SubscriptionsFilename = "subs.list"
+	}
+
+	if c.Upstream == "" {
+		c.Upstream = "1.1.1.1:53"
+	}
+
+	if c.Eventlogger == nil {
+		c.Eventlogger = &DefaultEventLogger{
+			InfoLogger:  log.New(log.Writer(), "INFO: ", log.Flags()),
+			ErrorLogger: log.New(log.Writer(), "ERROR: ", log.Flags()),
+		}
+	}
+
+	c.Eventlogger.Infof("vpnhole started: %s", c)
+
+	if c.IsRunning() {
+		return ErrAlreadyRunning
+	}
+
 	return nil
 }
 
-// stop the vpnhole
-func (c *vpnholeclient) Stop() error {
+// Stop stops the VpnHoleClient
+func (c *VpnHoleClient) Stop() error {
+	if !c.IsRunning() {
+		return ErrNotRunning
+	}
+
 	return nil
 }
+
+// IsRunning returns true if the VpnHoleClient is running
+func (c *VpnHoleClient) IsRunning() bool {
+	return false
+}