diff --git a/change.go b/change.go
index 95e7e462d02024af2b14bd9fd1c72bb39feb1278..df2b1bd2cc96382fef42b436671e66697a6028c4 100644
--- a/change.go
+++ b/change.go
@@ -7,25 +7,21 @@ import (
 	"github.com/r3labs/diff/v3"
 )
 
-func (s *Settings[C]) setConfigInternal(config C, lock bool) *Settings[C] {
+func (s *Settings[C]) notifyHooks(changelog diff.Changelog) {
 
-	var (
-		changelog diff.Changelog
-		err       error
-	)
-
-	if lock {
-		s.Lock()
+	if len(changelog) > 0 {
+		s.notifyPostprocessingHooks(changelog)
+		s.notifyChangeHooks(changelog)
 	}
 
-	defer func() {
+}
 
-		if len(changelog) > 0 {
-			s.notifyPostprocessingHooks(changelog)
-			s.notifyChangeHooks(changelog)
-		}
+func (s *Settings[C]) setConfigInternal(config C) (*Settings[C], diff.Changelog) {
 
-	}()
+	var (
+		changelog diff.Changelog
+		err       error
+	)
 
 	errorCount := len(s.errors)
 	defer func() {
@@ -34,21 +30,15 @@ func (s *Settings[C]) setConfigInternal(config C, lock bool) *Settings[C] {
 		}
 	}()
 
-	defer func() {
-		if lock {
-			s.Unlock()
-		}
-	}()
-
 	if err := validateConfig[C](config); err != nil {
 		s.errors = append(s.errors, err)
-		return s
+		return s, changelog
 	}
 
 	d, err := diff.NewDiffer()
 	if err != nil {
 		s.errors = append(s.errors, err)
-		return s
+		return s, changelog
 	}
 
 	d.ConvertCompatibleTypes = true
@@ -57,13 +47,19 @@ func (s *Settings[C]) setConfigInternal(config C, lock bool) *Settings[C] {
 	changelog, err = d.Diff(s.config, config)
 	if err != nil {
 		s.errors = append(s.errors, err)
-		return s
+		return s, changelog
 	}
 
 	s.config = config
-	return s
+	return s, changelog
 }
 
 func (s *Settings[C]) SetConfig(config C) *Settings[C] {
-	return s.setConfigInternal(config, true)
+	s.Lock()
+	c, l := s.setConfigInternal(config)
+	s.Unlock()
+
+	s.notifyHooks(l)
+
+	return c
 }
diff --git a/copyable.go b/copyable.go
index b579e6d008f9d6875ca7065fb338832ef3c7be63..7a64e4b624df4de57d4f456fc5ae2b5469df1346 100644
--- a/copyable.go
+++ b/copyable.go
@@ -7,15 +7,14 @@ import (
 	"gitlab.schukai.com/oss/libraries/go/utilities/pathfinder"
 )
 
-// // Copy implements the xflags.Copyable interface.
+// Copy implements the xflags.Copyable interface.
 func (s *Settings[C]) Copy(m map[string]any) {
 
 	if s == nil {
-		panic("struct is not initialized")
+		panic("cannot copy nil")
 	}
 
 	s.Lock()
-	defer s.Unlock()
 
 	errorCount := len(s.errors)
 	defer func() {
@@ -37,6 +36,9 @@ func (s *Settings[C]) Copy(m map[string]any) {
 		}
 	}
 
-	s.setConfigInternal(c, false)
-	
+	_, l := s.setConfigInternal(c)
+	s.Unlock()
+
+	s.notifyHooks(l)
+
 }
diff --git a/devenv.nix b/devenv.nix
index 2568f0c76e7a3ebc2003ee009c7d0bfa6dc3e41c..0eb76b3c2a096fae6bfa92afd944cbda0eeaae79 100644
--- a/devenv.nix
+++ b/devenv.nix
@@ -3,34 +3,34 @@
 {
 
   # https://devenv.sh/packages/
-  packages = [
+  packages = with pkgs; [
     inputs.version.defaultPackage."${builtins.currentSystem}"
-    pkgs.git
-    pkgs.gcc12
-    pkgs.go-task
-    pkgs.blackbox
-    pkgs.blackbox-terminal
-    pkgs.jq
-    pkgs.delve
-    pkgs.gdlv
-    pkgs.wget
-    pkgs.glab
-    pkgs.unixtools.xxd
-    pkgs.libffi
-    pkgs.zlib
-    pkgs.procps
-    pkgs.php81Extensions.xdebug
-    pkgs.ranger
-    pkgs.meld
-    pkgs.gnused
-    pkgs.coreutils-full
-    pkgs.gnugrep
-    pkgs.gnumake
-    pkgs.util-linux
-    pkgs.httpie
-    pkgs.netcat
-    pkgs.memcached
-    pkgs.fd    
+    git
+    gcc12
+    go-task
+    blackbox
+    blackbox-terminal
+    jq
+    delve
+    gdlv
+    wget
+    glab
+    unixtools.xxd
+    libffi
+    zlib
+    procps
+    php81Extensions.xdebug
+    ranger
+    meld
+    gnused
+    coreutils-full
+    gnugrep
+    gnumake
+    util-linux
+    httpie
+    netcat
+    memcached
+    fd    
   ];
 
 
@@ -65,7 +65,7 @@ PATH="''${PATH}":${pkgs.git}/bin/
 PATH="''${PATH}":${pkgs.gnugrep}/bin/
 PATH="''${PATH}":${inputs.version.defaultPackage."${builtins.currentSystem}"}/bin/
 
-export -f PATH
+export PATH
 
 task test
 
diff --git a/http-handler.go b/http-handler.go
index c865f4289e8b923c21ce086b82b0dad6f64ed3dc..b7c2b71d1c31821e78f1a7fae35b0059fab63c0a 100644
--- a/http-handler.go
+++ b/http-handler.go
@@ -83,7 +83,6 @@ func (s *Settings[C]) servePost(w http.ResponseWriter, r *http.Request) {
 	}
 
 	s.Lock()
-	defer s.Unlock()
 
 	b := s.config
 	s.importStream(rs)
@@ -91,7 +90,9 @@ func (s *Settings[C]) servePost(w http.ResponseWriter, r *http.Request) {
 	x := s.config
 	s.config = b
 
-	s.setConfigInternal(x, false)
+	_, l := s.setConfigInternal(x)
+	s.Unlock()
+	s.notifyHooks(l)
 
 }
 
diff --git a/import.go b/import.go
index 486f02b20da54e28e1c69387dc542e9ff8415d7f..f6162ef154771aa224fd90cb881906a269a20ea8 100644
--- a/import.go
+++ b/import.go
@@ -187,7 +187,6 @@ func (s *Settings[C]) importFiles() {
 func (s *Settings[C]) Import() *Settings[C] {
 
 	s.Lock()
-	defer s.Unlock()
 
 	errorCount := len(s.errors)
 	defer func() {
@@ -216,7 +215,9 @@ func (s *Settings[C]) Import() *Settings[C] {
 
 	x := s.config
 	s.config = defaults
-	s.setConfigInternal(x, false)
+	_, l := s.setConfigInternal(x)
+	s.Unlock()
+	s.notifyHooks(l)
 
 	return s
 }