diff --git a/src/include/66/service.h b/src/include/66/service.h
index b19734561416c0483270adbbf56056b5bc55c241..4776b3309901dc2c45fb2629d298e80d3e97ce23 100644
--- a/src/include/66/service.h
+++ b/src/include/66/service.h
@@ -312,7 +312,8 @@ extern int service_resolve_copy(resolve_service_t *dst, resolve_service_t *res)
 extern int service_resolve_get_field_tosa(stralloc *sa, resolve_service_t *res, resolve_service_enum_t field) ;
 extern int service_resolve_modify_field(resolve_service_t *res, resolve_service_enum_t field, char const *data) ;
 extern int service_resolve_read_cdb(cdb *c, resolve_service_t *res) ;
-extern int service_resolve_write(resolve_service_t *res) ;
+extern void service_resolve_write(resolve_service_t *res) ;
+extern void service_resolve_write_tmp(resolve_service_t *res, char const *dst, uint8_t force) ;
 extern int service_resolve_write_cdb(cdbmaker *c, resolve_service_t *sres) ;
 extern void service_enable_disable(graph_t *g, resolve_service_t *res, resolve_service_t *ares, unsigned int areslen, uint8_t action, visit_t *visit) ;
 /* avoid circular dependencies by prototyping the ss_state_t instead
diff --git a/src/include/66/state.h b/src/include/66/state.h
index 07eeb9bf20dd07316fb7a33b8fbf4480ac005a08..67761f088679cb50cf034d1aa088f04d03b183af 100644
--- a/src/include/66/state.h
+++ b/src/include/66/state.h
@@ -83,6 +83,7 @@ extern void state_unpack(char *pack, ss_state_t *sta) ;
 extern void state_set_flag(ss_state_t *sta, int flags,int flags_val) ;
 extern int state_check(resolve_service_t *res) ;
 extern int state_write(ss_state_t *sta, resolve_service_t *res) ;
+extern int state_write_tmp(ss_state_t *sta, char const *tmp) ;
 extern int state_read(ss_state_t *sta, resolve_service_t *res) ;
 extern int state_messenger(resolve_service_t *res, uint32_t flag, uint32_t value) ;
 
diff --git a/src/lib66/service/deps-lib/deps b/src/lib66/service/deps-lib/deps
index 7c95830e872611c71b4c8ea2ab8ab0598ac1de74..af99bdb4e3ea311a76f60f36809883997114e78d 100644
--- a/src/lib66/service/deps-lib/deps
+++ b/src/lib66/service/deps-lib/deps
@@ -12,9 +12,10 @@ service_resolve_array_search.o
 service_resolve_copy.o
 service_resolve_get_field_tosa.o
 service_resolve_modify_field.o
-service_resolve_read_cdb.o
 service_resolve_write.o
+service_resolve_read_cdb.o
 service_resolve_write_cdb.o
+service_resolve_write_tmp.o
 -loblibs
 -lskarnet
 
diff --git a/src/lib66/service/service_resolve_write_tmp.c b/src/lib66/service/service_resolve_write_tmp.c
new file mode 100644
index 0000000000000000000000000000000000000000..cc105138c93c5e828030c601dc54d880e4982d79
--- /dev/null
+++ b/src/lib66/service/service_resolve_write_tmp.c
@@ -0,0 +1,58 @@
+/*
+ * service_resolve_write_tmp.c
+ *
+ * Copyright (c) 2018-2021 Eric Vidal <eric@obarun.org>
+ *
+ * All rights reserved.
+ *
+ * This file is part of Obarun. It is subject to the license terms in
+ * the LICENSE file found in the top-level directory of this
+ * distribution.
+ * This file may not be copied, modified, propagated, or distributed
+ * except according to the terms contained in the LICENSE file./
+ */
+
+#include <string.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+#include <oblibs/log.h>
+#include <oblibs/string.h>
+#include <oblibs/directory.h>
+
+#include <66/service.h>
+#include <66/constants.h>
+#include <66/parse.h>
+
+void service_resolve_write_tmp(resolve_service_t *res, char const *dst, uint8_t force)
+{
+    log_flow() ;
+
+    char *name = res->sa.s + res->name ;
+    size_t dstlen = strlen(dst) ;
+    char dest[dstlen + SS_RESOLVE_LEN + 1] ;
+
+    resolve_wrapper_t_ref wres = resolve_set_struct(DATA_SERVICE, res) ;
+
+    auto_strings(dest, dst, SS_RESOLVE) ;
+
+    if (access(dest, F_OK) < 0) {
+        log_trace("create directory: ", dest) ;
+        if (!dir_create_parent(dest, 0755)) {
+            parse_cleanup(res, dst, force) ;
+            free(wres) ;
+            log_dieusys(LOG_EXIT_SYS, "create directory: ", dest) ;
+        }
+    }
+
+    dest[dstlen] = 0  ;
+
+    log_trace("write resolve file: ", dest, SS_RESOLVE, "/", name) ;
+    if (!resolve_write(wres, dest, name)) {
+        parse_cleanup(res, dst, force) ;
+        free(wres) ;
+        log_dieusys(LOG_EXIT_SYS, "write resolve file: ", dest, SS_RESOLVE, "/", name) ;
+    }
+
+    free(wres) ;
+}
diff --git a/src/lib66/state/deps-lib/deps b/src/lib66/state/deps-lib/deps
index aff0afdb1386915c3593dbad1d3f333d8c278b43..7d53df783d25c046ccc84197e14e6e492b337322 100644
--- a/src/lib66/state/deps-lib/deps
+++ b/src/lib66/state/deps-lib/deps
@@ -5,6 +5,7 @@ state_read.o
 state_rmfile.o
 state_set_flag.o
 state_unpack.o
+state_write_tmp.o
 state_write.o
 -loblibs
 -lskarnet
diff --git a/src/lib66/state/state_write_tmp.c b/src/lib66/state/state_write_tmp.c
new file mode 100644
index 0000000000000000000000000000000000000000..4dac683af7541e7b617cfa74c2dd889d7d837c02
--- /dev/null
+++ b/src/lib66/state/state_write_tmp.c
@@ -0,0 +1,52 @@
+/*
+ * state_write_tmp.c
+ *
+ * Copyright (c) 2018-2021 Eric Vidal <eric@obarun.org>
+ *
+ * All rights reserved.
+ *
+ * This file is part of Obarun. It is subject to the license terms in
+ * the LICENSE file found in the top-level directory of this
+ * distribution.
+ * This file may not be copied, modified, propagated, or distributed
+ * except according to the terms contained in the LICENSE file./
+ */
+
+#include <string.h>
+#include <unistd.h>
+
+#include <oblibs/log.h>
+#include <oblibs/string.h>
+#include <oblibs/directory.h>
+
+#include <skalibs/djbunix.h>
+
+#include <66/state.h>
+#include <66/constants.h>
+
+int state_write_tmp(ss_state_t *sta, char const *dst)
+{
+    log_flow() ;
+
+    size_t len = strlen(dst) ;
+    char pack[STATE_STATE_SIZE] ;
+    char dir[len + SS_STATE_LEN + 1 + SS_STATUS_LEN + 1] ;
+
+    auto_strings(dir, dst, SS_STATE) ;
+
+    if (access(dir, F_OK) < 0) {
+        log_trace("create directory: ", dir) ;
+        if (!dir_create_parent(dir, 0755))
+            log_warnusys_return(LOG_EXIT_ZERO, "create directory: ", dir) ;
+    }
+
+    state_pack(pack, sta) ;
+
+    auto_strings(dir + len + SS_STATE_LEN, "/", SS_STATUS) ;
+
+    log_trace("write status file: ", dir) ;
+    if (!openwritenclose_unsafe(dir, pack, STATE_STATE_SIZE))
+        log_warnusys_return(LOG_EXIT_ZERO, "write status file: ", dir) ;
+
+    return 1 ;
+}