Index: uspace/srv/taskmon/meson.build
===================================================================
--- uspace/srv/taskmon/meson.build	(revision 8f049928445f06042a36af4db46b4151cc5b20aa)
+++ uspace/srv/taskmon/meson.build	(revision de4f1654092789b6efed61bbff0da134b7746ec0)
@@ -1,4 +1,4 @@
 #
-# Copyright (c) 2023 Jiri Svoboda
+# Copyright (c) 2024 Jiri Svoboda
 # All rights reserved.
 #
@@ -27,4 +27,4 @@
 #
 
-deps = [ 'corecfg' ]
+deps = [ 'corecfg', 'sif' ]
 src = files('taskmon.c')
Index: uspace/srv/taskmon/taskmon.c
===================================================================
--- uspace/srv/taskmon/taskmon.c	(revision 8f049928445f06042a36af4db46b4151cc5b20aa)
+++ uspace/srv/taskmon/taskmon.c	(revision de4f1654092789b6efed61bbff0da134b7746ec0)
@@ -1,4 +1,4 @@
 /*
- * Copyright (c) 2023 Jiri Svoboda
+ * Copyright (c) 2024 Jiri Svoboda
  * All rights reserved.
  *
@@ -35,18 +35,24 @@
  */
 
-#include <stdio.h>
 #include <async.h>
+#include <errno.h>
+#include <macros.h>
 #include <ipc/services.h>
-#include <task.h>
 #include <ipc/corecfg.h>
 #include <loc.h>
-#include <macros.h>
-#include <errno.h>
+#include <sif.h>
+#include <stdio.h>
+#include <str.h>
 #include <str_error.h>
+#include <task.h>
 
 #define NAME  "taskmon"
 
+static const char *taskmon_cfg_path = "/w/cfg/taskmon.sif";
+
 static bool write_core_files;
 
+static errno_t taskmon_load_cfg(const char *);
+static errno_t taskmon_save_cfg(const char *);
 static void corecfg_client_conn(ipc_call_t *, void *);
 
@@ -103,4 +109,5 @@
 	write_core_files = ipc_get_arg1(icall);
 	async_answer_0(icall, EOK);
+	(void) taskmon_save_cfg(taskmon_cfg_path);
 }
 
@@ -134,4 +141,93 @@
 }
 
+/** Load task monitor configuration from SIF file.
+ *
+ * @param cfgpath Configuration file path
+ *
+ * @return EOK on success or an error code
+ */
+static errno_t taskmon_load_cfg(const char *cfgpath)
+{
+	sif_doc_t *doc = NULL;
+	sif_node_t *rnode;
+	sif_node_t *ncorefiles;
+	const char *ntype;
+	const char *swrite;
+	errno_t rc;
+
+	rc = sif_load(cfgpath, &doc);
+	if (rc != EOK)
+		goto error;
+
+	rnode = sif_get_root(doc);
+	ncorefiles = sif_node_first_child(rnode);
+	ntype = sif_node_get_type(ncorefiles);
+	if (str_cmp(ntype, "corefiles") != 0) {
+		rc = EIO;
+		goto error;
+	}
+
+	swrite = sif_node_get_attr(ncorefiles, "write");
+	if (swrite == NULL) {
+		rc = EIO;
+		goto error;
+	}
+
+	if (str_cmp(swrite, "y") == 0) {
+		write_core_files = true;
+	} else if (str_cmp(swrite, "n") == 0) {
+		write_core_files = false;
+	} else {
+		rc = EIO;
+		goto error;
+	}
+
+	sif_delete(doc);
+	return EOK;
+error:
+	if (doc != NULL)
+		sif_delete(doc);
+	return rc;
+}
+
+/** Save task monitor configuration to SIF file.
+ *
+ * @param cfgpath Configuration file path
+ *
+ * @return EOK on success or an error code
+ */
+static errno_t taskmon_save_cfg(const char *cfgpath)
+{
+	sif_doc_t *doc = NULL;
+	sif_node_t *rnode;
+	sif_node_t *ncorefiles;
+	errno_t rc;
+
+	rc = sif_new(&doc);
+	if (rc != EOK)
+		goto error;
+
+	rnode = sif_get_root(doc);
+	rc = sif_node_append_child(rnode, "corefiles", &ncorefiles);
+	if (rc != EOK)
+		goto error;
+
+	rc = sif_node_set_attr(ncorefiles, "write",
+	    write_core_files ? "y" : "n");
+	if (rc != EOK)
+		goto error;
+
+	rc = sif_save(doc, cfgpath);
+	if (rc != EOK)
+		goto error;
+
+	sif_delete(doc);
+	return EOK;
+error:
+	if (doc != NULL)
+		sif_delete(doc);
+	return rc;
+}
+
 int main(int argc, char *argv[])
 {
@@ -145,4 +241,6 @@
 	write_core_files = false;
 #endif
+	(void) taskmon_load_cfg(taskmon_cfg_path);
+
 	if (async_event_subscribe(EVENT_FAULT, fault_event, NULL) != EOK) {
 		printf("%s: Error registering fault notifications.\n", NAME);
