    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.CreateContact" });

    /**
     * Creates a new contact.
     *
     * # Sequence
     *
     * - Copy the template structure
     * - Start the workflow defined by the mask
     *
     * # Configuration
     *
     * |Property|Description|
     * |:------|:------|
     * |contactlist.referenceField|Reference field to the contact list|
     * |company.referenceField|Reference field to the company|
     * |contact.templateFolderId|Path or ID to the contact template folder|
     * |contact.createWorkflowNameTemplate|The template for the workflow name (in Handlebars syntax)|
     *
     * # Workflow name template
     * Usable variables in the template for the workflow name
     *
     * - contactType {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.CreateContact", {
      extend: "sol.common.ix.ActionBase",

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

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

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

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

      /**
       * @cfg {String} targetId (optional)
       * If configured, this will be used to determine if a target inside a contact list or company was selected.
       * If that's the case, the contact list (and/or company) 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 "CreateContact";
      },

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

        result = sol.contact.Utils.createContact(me.contactType, { 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);
        }
      },

      prefillMetadata: function (objId) {
        var me = this,
            sord = ixConnect.ix().checkoutSord(objId, SordC.mbAllIndex, LockC.NO),
            dirty = false,
            contactlist, company, contactlistRef, companyRef;

        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;
          }
        }

        company = sol.contact.Utils.getParentCompany(me.targetId);
        if (company) {
          companyRef = sol.common.SordUtils.getObjKeyValue(company, me.config.company.referenceField);
          if (companyRef) {
            sol.common.SordUtils.setObjKeyValue(sord, me.config.company.referenceField, companyRef);
            dirty = true;
          }
        }

        if (dirty) {
          ixConnect.ix().checkinSord(sord, SordC.mbAllIndex, LockC.NO);
        }
      }

    });

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

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

      createContact = sol.create("sol.contact.ix.actions.CreateContact", config);
      result = createContact.execute();
      logger.exit("RF_sol_contact_action_CreateContact", result);
      return result;
    }