diff --git a/src/ctrl/fsm_ctrl_commands.c b/src/ctrl/fsm_ctrl_commands.c
new file mode 100644
index 0000000..0dfc396
--- /dev/null
+++ b/src/ctrl/fsm_ctrl_commands.c
@@ -0,0 +1,175 @@
+#include <string.h>
+#include <errno.h>
+
+#include <osmocom/core/fsm.h>
+
+#include <osmocom/ctrl/control_cmd.h>
+#include <osmocom/ctrl/control_if.h>
+
+/*! \brief control interface lookup function for FSM's
+ * \param[in] data Private data passed to controlif_setup()
+ * \param[in] vline Vector of the line holding the command string
+ * \param[out] node_type type (CTRL_NODE_) that was determined
+ * \param[out] node_data private data of node that was determined
+ * \param i Current index into vline, up to which it is parsed
+ */
+static int fsm_ctrl_node_lookup(void *data, vector vline, int *node_type,
+				void **node_data, int *i)
+{
+	struct osmo_fsm *fsm = NULL;
+	struct osmo_fsm_inst *fi = NULL;;
+	const char *token = vector_slot(vline, *i);
+
+	switch (*node_type) {
+	case CTRL_NODE_ROOT:
+		if (!strcmp(token, "fsm")) {
+			const char *fsm_name;
+			(*i)++;
+			fsm_name = vector_lookup(vline, *i);
+			if (!fsm_name)
+				goto err_index;
+			fsm = osmo_fsm_find_by_name(fsm_name);
+			if (!fsm)
+				goto err_missing;
+			*node_data = fsm;
+			*node_type = CTRL_NODE_FSM;
+		}
+		break;
+	case CTRL_NODE_FSM:
+		fsm = *node_data;
+		if (!strcmp(token, "name")) {
+			const char *inst_name;
+			(*i)++;
+			inst_name = vector_lookup(vline, *i);
+			if (!inst_name)
+				goto err_index;
+			fi = osmo_fsm_inst_find_by_name(fsm, inst_name);
+			if (!fi)
+				goto err_missing;
+			*node_data = fi;
+			*node_type = CTRL_NODE_FSM_INST;
+		} else if (!strcmp(token, "id")) {
+			const char *inst_id;
+			(*i)++;
+			inst_id = vector_lookup(vline, *i);
+			if (!inst_id)
+				goto err_index;
+			fi = osmo_fsm_inst_find_by_id(fsm, inst_id);
+			if (!fi)
+				goto err_missing;
+			*node_data = fi;
+			*node_type = CTRL_NODE_FSM_INST;
+		}
+		break;
+	default:
+		return 0;
+	}
+
+	return 1;
+
+err_index:
+	return -ERANGE;
+err_missing:
+	return -ENODEV;
+}
+
+static int get_fsm_inst_state(struct ctrl_cmd *cmd, void *data)
+{
+	struct osmo_fsm_inst *fi = cmd->node;
+
+	if (!fi) {
+		cmd->reply = "No such FSM found";
+		return CTRL_CMD_ERROR;
+	}
+
+	cmd->reply = talloc_strdup(cmd, osmo_fsm_state_name(fi->fsm, fi->state));
+	return CTRL_CMD_REPLY;
+}
+CTRL_CMD_DEFINE_RO(fsm_inst_state, "state");
+
+static int get_fsm_inst_parent_name(struct ctrl_cmd *cmd, void *data)
+{
+	struct osmo_fsm_inst *fi = cmd->node;
+
+	if (!fi) {
+		cmd->reply = "No such FSM found";
+		return CTRL_CMD_ERROR;
+	}
+	if (!fi->proc.parent) {
+		cmd->reply = "No parent";
+		return CTRL_CMD_ERROR;
+	}
+	cmd->reply = talloc_strdup(cmd, fi->proc.parent->name);
+	return CTRL_CMD_REPLY;
+}
+CTRL_CMD_DEFINE_RO(fsm_inst_parent_name, "parent-name");
+
+static int get_fsm_inst_timer(struct ctrl_cmd *cmd, void *data)
+{
+	struct osmo_fsm_inst *fi = cmd->node;
+	struct timeval remaining;
+
+	if (!fi) {
+		cmd->reply = "No such FSM found";
+		return CTRL_CMD_ERROR;
+	}
+	if (osmo_timer_remaining(&fi->timer, NULL, &remaining) < 0)
+		cmd->reply = "0,0,0";
+	else
+		cmd->reply = talloc_asprintf(cmd, "%u,%ld,%ld", fi->T, remaining.tv_sec, remaining.tv_usec);
+
+	return CTRL_CMD_REPLY;
+}
+CTRL_CMD_DEFINE_RO(fsm_inst_timer, "timer");
+
+
+static int get_fsm_inst_dump(struct ctrl_cmd *cmd, void *data)
+{
+	struct osmo_fsm_inst *fi = cmd->node;
+	struct osmo_fsm_inst *child;
+
+	if (!fi) {
+		cmd->reply = "No such FSM found";
+		return CTRL_CMD_ERROR;
+	}
+
+	/* Fixed Part: Name, ID, log_level, state, timer number */
+	cmd->reply = talloc_asprintf(cmd, "'%s','%s','%s','%s',%u", fi->name, fi->id,
+				log_level_str(fi->log_level),
+				osmo_fsm_state_name(fi->fsm, fi->state), fi->T);
+
+	/* Variable Parts below */
+	if (fi->T) {
+		struct timeval remaining;
+		int rc;
+		rc = osmo_timer_remaining(&fi->timer, NULL, &remaining);
+		if (rc == 0) {
+			cmd->reply = talloc_asprintf_append(cmd->reply, ",timeout_sec=%ld,timeout_usec=%ld",
+							    remaining.tv_sec, remaining.tv_usec);
+		}
+	}
+
+	if (fi->proc.parent)
+		cmd->reply = talloc_asprintf_append(cmd->reply, ",parent='%s'", fi->proc.parent->name);
+
+	llist_for_each_entry(child, &fi->proc.children, list) {
+		cmd->reply = talloc_asprintf_append(cmd->reply, ",child='%s'", child->name);
+	}
+
+	return CTRL_CMD_REPLY;
+}
+
+CTRL_CMD_DEFINE_RO(fsm_inst_dump, "dump");
+
+int osmo_fsm_ctrl_cmds_install(void)
+{
+	int rc = 0;
+
+	rc |= ctrl_cmd_install(CTRL_NODE_FSM_INST, &cmd_fsm_inst_dump);
+	rc |= ctrl_cmd_install(CTRL_NODE_FSM_INST, &cmd_fsm_inst_state);
+	rc |= ctrl_cmd_install(CTRL_NODE_FSM_INST, &cmd_fsm_inst_parent_name);
+	rc |= ctrl_cmd_install(CTRL_NODE_FSM_INST, &cmd_fsm_inst_timer);
+	rc |= ctrl_lookup_register(fsm_ctrl_node_lookup);
+
+	return rc;
+}
