getVisOptions() {

    // merge options
    const globalOptions = $tm.config.vis;
    const localOptions = utils.parseJSON(this.view.getConfig('vis')) || {};

    const { hierarchical } = (localOptions.layout || {})
    const corrections = {
      layout: {
        hierarchical: {
          enabled: (
            hierarchical === undefined || hierarchical === null
              ? false
              : typeof hierarchical === 'boolean'
                ? hierarchical
                : hierarchical.enabled !== false
          )
        }
      }
    };

    // we need to first merge local options with corrections to prevent that
    // global options are overridden by e.g. "hierarchical" being a non-object
    const options = utils.merge({}, globalOptions, utils.merge(localOptions, corrections));

    options.clickToUse = this.clickToUse;
    options.manipulation.enabled = !!this.editorMode;

    options.manipulation.deleteNode = (data, callback) => {
      this.handleRemoveElements(data);
      this.resetVisManipulationBar(callback);
    };

    options.manipulation.deleteEdge = (data, callback) => {
      this.handleRemoveElements(data);
      this.resetVisManipulationBar(callback);
    };

    options.manipulation.addEdge = (data, callback) => {
      this.handleConnectionEvent(data);
      this.resetVisManipulationBar(callback);
    };

    options.manipulation.addNode = (data, callback) => {
      this.handleInsertNode(data);
      this.resetVisManipulationBar(callback);
    };

    options.manipulation.editNode = (data, callback) => {
      this.handleEditNode(data);
      this.resetVisManipulationBar(callback);
    };

    options.interaction.zoomView = !!(this.isInSidebar || this.enlargedMode);

    // not allowed
    options.manipulation.editEdge = false;

    // make sure the actual solver is an object
    const physics = options.physics;
    physics[physics.solver] = physics[physics.solver] || {};

    physics.stabilization.iterations = 1000;

    this.logger('debug', 'Loaded graph options', options);

    return options;

  }
@todo Instead of redrawing the whole graph when an edge or node is
added it may be worth considering only getting the element from the
adapter and directly inserting it into the graph and *avoid* a
reload of the graph via `rebuildGraph`!

@todo: too much recomputation -> outsource