    //@include lib_sol.common.Instance.js
    //@include lib_sol.common.Template.js

    /**
     * @class sol.common.instance.mixins.create
     * @extends sol.common.instance.base
     * @eloall
     * @experimental
     * This is an experimental new functionality, which may be removed in future versions.
     *
     * Please be aware that this class does not use sol.define  but sol.common.instance.define
     * and may be working slightly different.
     */
    sol.common.instance.define("sol.common.instance.mixins.create", {
      initialize: function (config) {
        var me = this,
            // split into 2 classes to hide implementation details from base clase
            module = sol.common.instance.create("sol.common.instance.mixins.create.applyInstances", {});
        module.applyInstances(me, config, me.$create);
      }
    });

    sol.common.instance.define("sol.common.instance.mixins.create.applyInstances", {
      applyInstances: function (baseInstance, config, instanceDefinitions) {
        var me = this;

        (instanceDefinitions || [])
          .forEach(me.applyInstance.bind(me, baseInstance, config));
      },
      applyInstance: function (baseInstance, config, instanceDescription) {
        var me = this,
            getInstanceConfig = function () {
              var anInstanceConfig;
              // TODO template instanceDescription.config with config an me
              if (instanceDescription.config) {
                anInstanceConfig = sol.common.TemplateUtils.render(instanceDescription.config, {
                  instance: baseInstance,
                  config: config
                });
              } else {
                // todo clone
                anInstanceConfig = sol.common.instance.clone(config || {});
              }
              return anInstanceConfig;
            },
            instanceConfig = getInstanceConfig(),
            instance;

        instance = sol.common.instance.create(instanceDescription.name, instanceConfig);

        if (instanceDescription.key) {
          me.setProperty(
            baseInstance,
            instanceDescription.key,
            instance
          );
        }
      },
      setProperty: function (obj, path, value) {
        var me = this;

        path = Array.isArray(path) ? path : path.split(".");
        if (path.length == 1) {
          obj[path[0]] = value;
        } else {
          obj[path[0]] = obj[path[0]] || {};
          me.setProperty(obj[path[0]], path.slice(1), value);
        }
      }
    });