    importPackage(Packages.de.elo.ix.client);
    importPackage(Packages.de.elo.ix.jscript);

    //@include lib_Class.js
    //@include lib_sol.common.Config.js
    //@include lib_sol.common.JsonUtils.js
    //@include lib_sol.common.SordUtils.js
    //@include lib_sol.common.IxUtils.js
    //@include lib_sol.common.WfUtils.js
    //@include lib_sol.common.CounterUtils.js
    //@include lib_sol.common.AclUtils.js
    //@include lib_sol.common.RepoUtils.js
    //@include lib_sol.common.Template.js
    //@include lib_sol.common.TranslateTerms.js
    //@include lib_sol.common.ix.RfUtils.js
    //@include lib_sol.common.ix.ActionBase.js
    //@include lib_sol.common.ix.FunctionBase.js
    //@include lib_sol.contact.Utils.js

    var logger = sol.create("sol.Logger", { scope: "sol.contact.ix.actions.CreateCompany" });

    /**
     * Creates a new company.
     *
     * # Sequence
     *
     * - Copy the template structure
     * - Start the workflow defined by the mask
     *
     * # Configuration
     *
     * |Property|Description|
     * |:------|:------|
     * |contactlist.referenceField|Reference field to the contact list|
     * |company.templateFolderId|Path or ID to the company template folder|
     * |company.createWorkflowNameTemplate|The template for the workflow name (in Handlebars syntax)|
     *
     * # Workflow name template
     * Usable variables in the template for the workflow name
     *
     * - companyType {String}
     *
     * @author JHR, ELO Digital Office GmbH
     * @version 1.1
     *
     * @eloix
     *
     * @requires sol.common.Config
     * @requires sol.common.JsonUtils
     * @requires sol.common.SordUtils
     * @requires sol.common.IxUtils
     * @requires sol.common.CounterUtils
     * @requires sol.common.AclUtils
     * @requires sol.common.RepoUtils
     * @requires sol.common.Template
     * @requires sol.common.TranslateTerms
     * @requires sol.common.WfUtils
     * @requires sol.common.ix.RfUtils
     * @requires sol.common.ix.ActionBase
     * @requires sol.common.ix.FunctionBase
     * @requires sol.contact.Utils
     */
    sol.define("sol.contact.ix.actions.CreateCompany", {
      extend: "sol.common.ix.ActionBase",

      requiredConfig: ["ci", "user", "companyType"],

      /**
       * @cfg {de.elo.ix.client.ClientInfo} ci (required)
       */

      /**
       * @cfg {de.elo.ix.client.UserInfo} user (required)
       */

      /**
       * @cfg {String} companyType (required)
       * The company template which should be copied
       */

      /**
       * @cfg {String} targetId (optional)
       * If configured, this will be used to determine if a target inside a contact list was selected.
       * If that's the case, the contact list reference will be pre-filled.
       */

      initialize: function (config) {
        var me = this;
        me.$super("sol.common.ix.ActionBase", "initialize", [config]);
        me.config = sol.contact.Utils.loadConfig();
      },

      /**
       * @inheritdoc sol.common.ix.ActionBase#getName
       */
      getName: function () {
        return "CreateCompany";
      },

      /**
       * Creates a new company in the chaos cabinet and starts the standard workflow.
       */
      process: function () {
        var me = this,
            result, flowId;

        result = sol.contact.Utils.createCompany(me.companyType, { owner: me.user });

        me.prefillMetadata(result.objId);

        flowId = me.startMaskStandardWorkflow(result.objId, { name: result.name, field: "STANDARD_WORKFLOW" });
        if (flowId) {
          me.addWfDialogEvent(flowId, { objId: result.objId, title: result.name, dialogId: me.getName() });

          me.addGotoIdEvent(result.objId, null, {
            type: "WF_STATUS",
            value: "CREATE",
            flowId: flowId
          });
        } else {
          me.addGotoIdEvent(result.objId);
        }
      },

      /**
       * Initializes the contactlist reference.
       * @param {String} objId
       */
      prefillMetadata: function (objId) {
        var me = this,
            sord = ixConnect.ix().checkoutSord(objId, SordC.mbAllIndex, LockC.NO),
            dirty = false,
            contactlist, contactlistRef;
        if (!me.targetId) {
          return;
        }
        contactlist = sol.contact.Utils.getParentContactList(me.targetId);
        if (contactlist) {
          contactlistRef = sol.common.SordUtils.getObjKeyValue(contactlist, me.config.contactlist.referenceField);
          if (contactlistRef) {
            sol.common.SordUtils.setObjKeyValue(sord, me.config.contactlist.referenceField, contactlistRef);
            dirty = true;
          }
        }
        if (dirty) {
          ixConnect.ix().checkinSord(sord, SordC.mbAllIndex, LockC.NO);
        }
      }

    });

    /**
     * @member sol.contact.ix.actions.CreateCompany
     * @method RF_sol_contact_action_CreateCompany
     * @static
     * @inheritdoc sol.common.ix.FunctionBase#RF_FunctionName
     */
    function RF_sol_contact_action_CreateCompany(ec, configAny) {
      logger.enter("RF_sol_contact_action_CreateCompany", configAny);
      var rfUtils = sol.common.ix.RfUtils,
          config = rfUtils.parseAndCheckParams(ec, arguments.callee.name, configAny, "companyType"),
          createCompany, result;

      config.ci = ec.ci;
      config.user = ec.user;

      createCompany = sol.create("sol.contact.ix.actions.CreateCompany", config);
      result = createCompany.execute();
      logger.exit("RF_sol_contact_action_CreateCompany", result);
      return result;
    }