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

    //@include lib_Class.js
    //@include lib_sol.common.JsonUtils.js
    //@include lib_sol.common.IxUtils.js
    //@include lib_sol.common.ix.RfUtils.js
    //@include lib_sol.common.ix.ServiceBase.js
    //@include lib_sol.common.UserUtils.js

    /**
     * Given an array of user and groupnames, returns an object of users expanded from groups
     *
     *     { "Karl Tester": ["HR", "Management"] }
     *
     * If an object as returned by this service is passed to the service as `history` parameter, it will
     * return a new set containing all old users and new users combined.
     *
     * If the parameter `diff: true` is passed, only the diff from the object passed as `history` and
     * the new users objects will be returned.
     *
     * @author ESt, ELO Digital Office GmbH
     *
     * @eloix
     * @requires sol.common.JsonUtils
     * @requires sol.common.IxUtils
     * @requires sol.common.ix.RfUtils
     * @requires sol.common.ix.ServiceBase
     * @requires sol.common.UserUtils
     */
    sol.define("sol.common.ix.services.GetUsers", {
      extend: "sol.common.ix.ServiceBase",

      getGroupMembers: function (group) {
        var members;
        members = ixConnect.ix().getUserNames([group], CheckoutUsersC.MEMBERS_OF_GROUP);
        return Array.prototype.slice.call(members)
          .map(function (member) {
            return String((typeof member === "object" ? member : {}).name || "");
          });
      },

      expandGroup: function (group, users) {
        var me = this, members;
        members = me.getGroupMembers(group);
        me.collectUsers(members, users, group); // recursive
      },

      addUser: function (users, name, group) {
        var groups = users[name] || (users[name] = []);
        group && !~groups.indexOf(group) && groups.push(group);
      },

      collectUsers: function (requested, users, group) {
        var me = this, userInfos;
        userInfos = sol.common.UserUtils.getUserInfos(requested);
        (Array.prototype.slice.call(userInfos))
          .forEach(function (userInfo) {
            var info = typeof userInfo === "object" ? userInfo : {},
                name = String(info.name || ""),
                isGroup = info.type === UserInfoC.TYPE_GROUP;

            isGroup ? me.expandGroup(name, users) : me.addUser(users, name, group);
          });
      },

      diffUsers: function (users, history) {
        function arraysEqual(a, b) {
          function arrayElementPresent(el) {
            return ~b.indexOf(el);
          }
          return (a.length === b.length) && a.every(arrayElementPresent);
        }
        function combineArrays(a, b) {
          var small = (a.length > b.length ? b : a), big = (small === a ? b : a);
          small
            .forEach(function (el) {
              ~big.indexOf(el) || big.push(el);
            });
          return big;
        }
        var filtered = {};
        Object.keys(users)
          .forEach(function (user) {
            if (history[user]) {
              if (!arraysEqual(history[user], users[user]) && users[user].length) {
                filtered[user] = combineArrays(history[user], users[user]);
              }
            } else {
              filtered[user] = users[user];
            }
          });
        return filtered;
      },

      process: function () {
        var me = this, expandedUsers = JSON.parse(sol.common.JsonUtils.stringifyQuick(me.history || {}));
        me.collectUsers(Array.isArray(me.users) ? me.users : [me.users], expandedUsers);
        return me.diff ? me.diffUsers(expandedUsers, me.history) : expandedUsers;
      }
    });

    /**
     * @member sol.common.ix.services.GetUsers
     * @method RF_sol_common_service_GetUsers
     * @static
     * @inheritdoc sol.common.ix.ServiceBase#RF_ServiceBaseName
     */
    function RF_sol_common_service_GetUsers(iXSEContext, args) {
      var rfParams, result;

      rfParams = sol.common.ix.RfUtils.parseAndCheckParams(iXSEContext, arguments.callee.name, args);
      result = (sol.create("sol.common.ix.services.GetUsers", rfParams)).process();
      return sol.common.JsonUtils.stringifyQuick(result);
    }