diff --git a/src/lib66/tree/tree_service_add.c b/src/lib66/tree/tree_service_add.c
index b4f71e3b585b71afa454fe189b58a1732c5df847..c3a2a1e4dab02c464a08aa81902450c196b47246 100644
--- a/src/lib66/tree/tree_service_add.c
+++ b/src/lib66/tree/tree_service_add.c
@@ -13,9 +13,7 @@
  */
 
 #include <oblibs/log.h>
-#include <oblibs/sastr.h>
-
-#include <skalibs/stralloc.h>
+#include <oblibs/stack.h>
 
 #include <66/resolve.h>
 #include <66/tree.h>
@@ -24,43 +22,53 @@ void tree_service_add(char const *base, char const *treename, char const *servic
 {
     log_flow() ;
 
+    int r ;
+    size_t len = strlen(service) ;
     resolve_tree_t tres = RESOLVE_TREE_ZERO ;
     resolve_wrapper_t_ref wres = resolve_set_struct(DATA_TREE, &tres) ;
-    stralloc sa = STRALLOC_ZERO ;
+    stack_ref pstk = 0 ;
+
+    _init_stack_(stk, SS_MAX_SERVICE * SS_MAX_SERVICE_NAME + 1 + len + 1) ;
 
     if (resolve_read_g(wres, base, treename) <= 0)
         log_dieusys(LOG_EXIT_SYS, "read resolve file of tree: ", treename) ;
 
     if (tres.ncontents) {
 
-        if (!sastr_clean_string(&sa, tres.sa.s + tres.contents))
-            log_dieu(LOG_EXIT_SYS, "clean string") ;
+        if (!stack_convert_string(&stk, tres.sa.s + tres.contents, strlen(tres.sa.s + tres.contents)))
+            log_dieusys(LOG_EXIT_SYS, "convert string to stack") ;
+
+        if (stack_retrieve_element(&stk, service) < 0) {
 
-        if (!sastr_add_string(&sa, service))
-            log_dieu(LOG_EXIT_SYS, "clean string") ;
+            if (!stack_add_g(&stk, service))
+                log_dieusys(LOG_EXIT_SYS, "add service: ", service, " to tree: ", treename) ;
 
-        if (!sastr_sortndrop_element(&sa))
-            log_dieu(LOG_EXIT_SYS, "sort string") ;
+            tres.ncontents++ ;
+        }
 
-        tres.ncontents = sastr_nelement(&sa) ;
+        if (!stack_close(&stk))
+            log_dieusys(LOG_EXIT_SYS, "close stack") ;
 
     } else {
 
-        if (!sastr_add_string(&sa, service))
-            log_dieu(LOG_EXIT_SYS, "add string") ;
+        if (!stack_add_g(&stk, service))
+            log_dieu(LOG_EXIT_SYS, "add string to stack") ;
 
         tres.ncontents++ ;
+
+        if (!stack_close(&stk))
+            log_dieusys(LOG_EXIT_SYS, "close stack") ;
+
     }
 
-    if (!sastr_rebuild_in_oneline(&sa))
-        log_dieu(LOG_EXIT_SYS, "rebuild stralloc list") ;
+    if (!stack_convert_tostring(&stk))
+        log_dieu(LOG_EXIT_SYS, "convert stack to string") ;
 
-    if (!resolve_modify_field(wres, E_RESOLVE_TREE_CONTENTS, sa.s))
+    if (!resolve_modify_field(wres, E_RESOLVE_TREE_CONTENTS, stk.s))
         log_dieusys(LOG_EXIT_SYS, "modify resolve file of: ", treename) ;
 
     if (!resolve_write_g(wres, base, treename))
         log_dieusys(LOG_EXIT_SYS, "write resolve file of tree: ", treename) ;
 
-    stralloc_free(&sa) ;
     resolve_free(wres) ;
 }
diff --git a/src/lib66/tree/tree_service_remove.c b/src/lib66/tree/tree_service_remove.c
index 14f983e6c6d267c7a41a944930b3df815e3c1130..75271456881046bd7ecf3eed5ef46049937b3e31 100644
--- a/src/lib66/tree/tree_service_remove.c
+++ b/src/lib66/tree/tree_service_remove.c
@@ -13,9 +13,7 @@
  */
 
 #include <oblibs/log.h>
-#include <oblibs/sastr.h>
-
-#include <skalibs/stralloc.h>
+#include <oblibs/stack.h>
 
 #include <66/resolve.h>
 #include <66/tree.h>
@@ -26,7 +24,6 @@ void tree_service_remove(char const *base, char const *treename, char const *ser
 
     resolve_tree_t tres = RESOLVE_TREE_ZERO ;
     resolve_wrapper_t_ref wres = resolve_set_struct(DATA_TREE, &tres) ;
-    stralloc sa = STRALLOC_ZERO ;
     char *str = 0 ;
 
     log_trace("modify field contents of resolve tree file: ", treename) ;
@@ -36,29 +33,32 @@ void tree_service_remove(char const *base, char const *treename, char const *ser
 
     if (tres.ncontents) {
 
-        if (!sastr_clean_string(&sa, tres.sa.s + tres.contents))
-            log_dieu(LOG_EXIT_SYS, "clean string") ;
+        size_t clen = strlen(tres.sa.s + tres.contents) ;
+        _init_stack_(stk, clen + 1) ;
+
+        if (!stack_convert_string(&stk, tres.sa.s + tres.contents, clen))
+            log_dieusys(LOG_EXIT_SYS, "convert string to stack") ;
 
-        if (!sastr_remove_element(&sa, service))
+        if (!stack_remove_element_g(&stk, service))
             log_dieu(LOG_EXIT_SYS, "remove service: ", service, " from selection") ;
 
-        if (sa.len) {
-            if (!sastr_rebuild_in_oneline(&sa))
-                log_dieu(LOG_EXIT_SYS, "rebuild stralloc list") ;
-            str = sa.s ;
+        if (stk.len) {
+
+            if (!stack_convert_tostring(&stk))
+                log_dieu(LOG_EXIT_SYS, "convert stack to string") ;
+
+            str = stk.s ;
 
         } else str = "" ;
 
         if (!resolve_modify_field(wres, E_RESOLVE_TREE_CONTENTS, str))
-        log_dieusys(LOG_EXIT_SYS, "modify resolve file of: ", treename) ;
-    }
+            log_dieusys(LOG_EXIT_SYS, "modify resolve file of: ", treename) ;
 
-    if (tres.ncontents)
         tres.ncontents-- ;
 
-    if (!resolve_write_g(wres, base, treename))
-        log_dieusys(LOG_EXIT_SYS, "write resolve file of tree: ", treename) ;
+        if (!resolve_write_g(wres, base, treename))
+            log_dieusys(LOG_EXIT_SYS, "write resolve file of tree: ", treename) ;
+    }
 
-    stralloc_free(&sa) ;
     resolve_free(wres) ;
 }