    /**
     * File upload
     *
     * @author ELO Digital Office GmbH
     * @version 1.03.006
     *
     */
    sol.define("sol.common.forms.FileUpload", {

      /**
       * @cfg {String} buttonName
       * Button name
       */
      buttonName: undefined,

      /**
       * @cfg {String} maskName
       * Mask name
       */
      maskName: undefined,

      /**
       * @cfg {String} dialogTitle
       * Dialog title
       */
      dialogTitle: undefined,

      /**
       * @cfg {String} sordName
       * Sord name
       */
      sordName: "Element",

      /**
       * @cfg {String} extension
       * Extension
       */
      extension: "",

      /**
       * @cfg {function} onload
       * Callback
       */
      onload: undefined,

      /**
       * Initialize file upload
       * @param {Object} config Configuration
       */
      initialize: function (config) {
        var me = this;

        sol.common.forms.Utils.initializeIxSession();
        me.$super("sol.Base", "initialize", [config]);

        if (!me.buttonName) {
          throw "Button name is empty";
        }

        me.button = $var(me.buttonName);

        if (!me.button) {
          throw "Can't find button '" + me.buttonName + "'";
        }

        me.fileInputId = me.fileInputId || "file-input";

        me.fileInput = document.createElement("input");
        me.fileInput.id = me.fileInputId;
        me.fileInput.type = "file";
        me.fileInput.style = "display:none";
        me.fileInput.addEventListener("change", me.fileInputChangedInBrowser.bind(me)); // will only be called in Browser
        me.button.addEventListener("click", me.buttonClicked.bind(me));
      },

      fileInputChangedInBrowser: function (event) {
        var me = this,
            fileReader, file;

        fileReader = new FileReader();
        fileReader.onload = function () {
          me.uploadContent(fileReader.result);
        };
        if (event.target.files && (event.target.files.length > 0)) {
          file = event.target.files[0];
          if (file.name) {
            me.sordName = file.name.split(".").shift();
            me.extension = file.name.split(".").pop();
          }
          fileReader.readAsDataURL(file);
        }
      },

      isJavaFxBrowser: function () {
        var javaFxBrowser;
        javaFxBrowser = (navigator.userAgent.indexOf("JavaFX") > -1);
        return javaFxBrowser;
      },

      uploadContent: function (content) {
        var me = this,
            result = {},
            base64Content;

        try {
          ELOF.showLoadingDiv();
          if (content) {

            base64Content = content.replace(/^data:.+;base64,/, "");

            result = sol.common.IxUtils.execute("RF_sol_common_document_service_UploadFile", {
              objId: ELO_PARAMS.ELO_OBJID,
              base64Content: base64Content,
              extension: me.extension,
              cfg: {
                mask: me.maskName,
                pictureName: me.sordName
              }
            });

            if (result && result.objId && me.onload) {
              me.onload(result.objId);
            }
          }
        } catch (ex) {
          console.error("Exception: " + ex);
        } finally {
          ELOF.hideLoadingDiv();
        }
        return result;
      },

      buttonClicked: function (e) {
        var me = this, params;
        if (navigator.userAgent.indexOf("JavaFX") === -1) { // Web-Client
          if (me.fileInput) {
            me.fileInput.value = null;
            me.fileInput.click(); // this executes the actual handler for opening the file selection dialog. This trick is required, because I did not want to use the standard filepicker Button. (it would not look like an ELO Button)
          }
        } else { // Java-Client
          params = { objId: ELO_PARAMS.ELO_OBJID, dialogTitle: me.dialogTitle };
          api.communication.Parent.sendCustomMessage("workspace.showFileChooserDialog_", params, function (data, event) {
            console.info("data=" + JSON.stringify(data));
            me.sordName = data.response.name;
            me.extension = data.response.extension;
            me.uploadContent(data.response.base64);
          });
        }
      }
    });