def METHOD_NAME(form, question_ids):
    message = ""
    xform = form.wrapped_xform()
    # Get the questions specified in question_ids
    question_dict = {q["value"].split("/")[-1]: FormQuestion.wrap(q) for q in form.get_questions(["en"])}
    question_ids = {q for q in question_ids}.intersection(list(question_dict.keys()))
    questions = [question_dict[k] for k in question_ids]
    # Get the existing subcases
    existing_subcases = {c.name_update.question_path: c for c in form.actions.subcases}
    message += "Found %s questions.\n" % len(questions)
    for question in questions:
        for option in question.options:
            hidden_value_tag = question.value.split("/")[-1] + "-" + option.value
            hidden_value_path = "/data/" + hidden_value_tag
            hidden_value_text = option.label
            # Create new hidden values for each question option if they don't already exist:
            if hidden_value_tag not in question_dict:
                # Add data element
                tag = "{x}%s" % hidden_value_tag
                element = etree.Element(tag.format(**namespaces))
                xform.data_node.append(element)
                # Add bind
                xform.itext_node.addprevious(_make_elem("bind", {
                    "nodeset": xform.resolve_path(hidden_value_path),
                    "calculate": '"'+hidden_value_text+'"'
                }))
                message += "Node " + hidden_value_path + " created!\n"
            else:
                message += "Node " + hidden_value_path + " already exists, skipping.\n"
            # Create FormActions for opening subcases
            if hidden_value_path not in existing_subcases:
                action = OpenSubCaseAction(
                    condition=FormActionCondition(
                        type='if',
                        question=question.value,
                        operator='selected',
                        answer=option.value,
                    ),
                    name_update=ConditionalCaseUpdate(question_path=hidden_value_path),
                    case_type='task',
                    # Note, the case properties will not necessarily be created in the order given.
                    case_properties={
                        'task_responsible': ConditionalCaseUpdate(question_path='/data/task_responsible'),
                        'task_due': ConditionalCaseUpdate(question_path='/data/task_due'),
                        'owner_id': ConditionalCaseUpdate(question_path='/data/owner_id'),
                        'task_risk_factor': ConditionalCaseUpdate(question_path='/data/task_risk_factor'),
                        'study_id': ConditionalCaseUpdate(question_path='/data/study_id'),
                        'patient_name': ConditionalCaseUpdate(question_path='/data/patient_name')
                    },
                    close_condition=FormActionCondition(
                        answer=None,
                        operator=None,
                        question=None,
                        type='never'
                    )
                )
                form.actions.subcases.append(action)
                message += "OpenSubCaseAction " + hidden_value_path + " created!\n"
            else:
                message += "OpenSubCaseAction " + hidden_value_path + " already exists, skipping.\n"
    app = form.get_app()
    # Save the xform modifications
    save_xform(app, form, etree.tostring(xform.xml, encoding='utf-8'))
    # save the action modifications
    app.save()
    message += "Form saved.\n"
    return message