commit f5d0189ec787df395568d7aa22fdf4a9d9a76cbe
Author: Pavel Fidranský <fidransky@outlook.com>
Date:   Sun Aug 19 08:48:27 2018 +0200

    dropped unused functionality

diff --git a/sources/src/main/webapp/js/app.js b/sources/src/main/webapp/js/app.js
index 490fcd8..6717ce6 100644
--- a/sources/src/main/webapp/js/app.js
+++ b/sources/src/main/webapp/js/app.js
@@ -11,8 +11,6 @@ function App() {
 	this.graphExporter = new GraphExporter;
 	/** @prop {GraphHistory} graphHistory */
 	this.graphHistory = new GraphHistory;
-	/** @prop {JavaComponentChanger} componentChanger */
-	this.componentChanger = new JavaComponentChanger;
 	/** @prop {Loader} loader */
 	this.loader = new Loader;
 	/** @prop {Zoom} zoom */
diff --git a/sources/src/main/webapp/js/components/change.js b/sources/src/main/webapp/js/components/change.js
deleted file mode 100644
index 0c6ceaa..0000000
--- a/sources/src/main/webapp/js/components/change.js
+++ /dev/null
@@ -1,703 +0,0 @@
-/**
- * Class representing a change. In a single change, lists of components to be changed and proposals are stored. 
- * Changes can be postponed and back activated.
- * @constructor
- */
-function Change() {
-	var rootElement;
-	var buttonGroup;
-	var includeNotFoundCheckbox;
-	var replaceComponentsCheckbox;
-	var triggerChangeButton;
-	var oldVertexListComponent;
-	var newVertexListComponent;
-
-	var oldVertexList = [];
-	var newVertexList = [];
-
-	var postponed = false;
-	var triggered = false;
-	var detailsLoaded = false;
-
-	/* TODO: display change in modal window
-	app.changeModalWindow.setChange(this);
-	app.changeModalWindow.open();
-	*/
-
-	/**
-	 * Adds a new vertex to the list of components to be changed. The vertex is set as excluded and its DOM element 
-	 * is removed from document. Its edges are moved so that they end at the group.
-	 * @param {Vertex} vertex Vertex to be added to the change.
-	 */
-	this.addVertex = function(vertex) {
-		if (!(vertex instanceof Vertex)) {
-			throw new TypeError(vertex.toString() + 'is not instance of Vertex');
-		}
-
-		// set remove hook
-		vertex.removeFromSidebarList = this.removeVertex.bind(this, vertex);
-
-		oldVertexList.push(vertex);
-		oldVertexListComponent.appendChild(vertex);
-
-		app.redrawEdges();
-
-		// vertex list changed so different results could be retrieved when triggered again
-		this.setTriggered(false);
-		this.setDetailsLoaded(false);
-
-		toggleButtonGroup.call(this);
-	};
-
-	/**
-	 * Removes a vertex from the list of component to be changed. The vertex is returned back to the viewport and 
-	 * its edges are moved to it.
-	 * @param {Vertex} vertex Vertex to be removed from the change.
-	 */
-	this.removeVertex = function(vertex) {
-		if (!(vertex instanceof Vertex)) {
-			throw new TypeError(vertex.toString() + 'is not instance of Vertex');
-		}
-
-		// unset remove hook
-		vertex.removeFromSidebarList = app.utils.noop;
-
-		oldVertexList.splice(oldVertexList.indexOf(vertex), 1);
-		oldVertexListComponent.removeChild(vertex);
-
-		app.redrawEdges();
-
-		// vertex list changed so different results could be retrieved when triggered again
-		this.setTriggered(false);
-		this.setDetailsLoaded(false);
-
-		toggleButtonGroup.call(this);
-	};
-
-	/**
-	 * @returns {array<Vertex>} List of components to be changed.
-	 */
-	this.getOldVertexList = function() {
-		return oldVertexList;
-	};
-
-	/**
-	 * @returns {boolean} True if the change was already triggered, otherwise false.
-	 */
-	this.isTriggered = function() {
-		return triggered;
-	};
-
-	/**
-	 * Sets the change as triggered.
-	 * @param {boolean} newValue True to set the change as trigger, otherwise false.
-	 */
-	this.setTriggered = function(newValue) {
-		triggered = newValue;
-
-		if (newValue) {
-			rootElement.classList.add('change--triggered');
-		} else {
-			rootElement.classList.remove('change--triggered');
-		}
-	};
-
-	/**
-	 * @returns {boolean} True if the details of proposed component were loaded, otherwise false.
-	 */
-	this.isDetailsLoaded = function() {
-		return detailsLoaded;
-	};
-
-	/**
-	 * Sets the change details as loaded.
-	 * @param {boolean} newValue True to set the change as it has details loaded, otherwise false.
-	 */
-	this.setDetailsLoaded = function(newValue) {
-		detailsLoaded = newValue;
-
-		if (newValue) {
-			rootElement.classList.add('change--details-loaded');
-		} else {
-			rootElement.classList.remove('change--details-loaded');
-		}
-	};
-
-	/**
-	 * @returns {boolean} True if the change is currently postponed, otherwise false.
-	 */
-	this.isPostponed = function() {
-		return postponed;
-	};
-
-	/**
-	 * Sets the change postponed.
-	 * @param {boolean} newValue True to set the change as postponed, otherwise false.
-	 */
-	this.setPostponed = function(newValue) {
-		postponed = newValue;
-
-		if (newValue) {
-			rootElement.classList.add('change--postponed');
-		} else {
-			rootElement.classList.remove('change--postponed');
-		}
-	};
-
-	/**
-	 * Postpones the change. Removes its current DOM element from document.
-	 */
-	this.postpone = function() {
-		this.setPostponed(true);
-		this.remove();
-	};
-
-	/**
-	 * Activates the change. Removes its current DOM element from document.
-	 */
-	this.activate = function() {
-		this.setPostponed(false);
-		this.remove();
-	};
-
-	/**
-	 * Creates a new DOM element representing the change in memory. The element being created depends on whether the change
-	 * is postponed at the moment. Binds user interactions to local handler functions.
-	 * @returns {Element} HTML or SVG DOM element depending on whether the change is postponed.
-	 */
-	this.render = function() {
-		rootElement = postponed ? renderPostponed.call(this) : renderActive.call(this);
-
-		this.setPostponed(postponed);
-		this.setDetailsLoaded(detailsLoaded);
-		this.setTriggered(triggered);
-		toggleButtonGroup.call(this);
-
-		return rootElement;
-	};
-
-	/**
-	 * Removes the DOM element representing the change from document.
-	 */
-	this.remove = function() {
-		rootElement.remove();
-	};
-
-	function renderActive() {
-		rootElement = app.utils.createHtmlElement('div', {
-			'class': 'change',
-		});
-
-		// buttons
-		buttonGroup = app.utils.createHtmlElement('div', {
-			'class': 'button-group hidden',
-		});
-		rootElement.appendChild(buttonGroup);
-
-		// include not found classes checkbox
-		includeNotFoundCheckbox = app.utils.createHtmlElement('input', {
-			'type': 'checkbox',
-			'name': 'includeNotFoundClasses',
-			'class': 'include-not-found-checkbox',
-			'title': 'Include not found classes in the change',
-			'data-tooltip': 'left',
-		});
-		buttonGroup.appendChild(includeNotFoundCheckbox);
-
-		// trigger change button
-		triggerChangeButton = app.utils.createHtmlElement('button', {
-			'class': 'trigger-change-button button',
-			'title': 'Change components',
-		});
-		triggerChangeButton.appendChild(app.utils.createHtmlElement('img', {
-			'src': 'images/tochange/crce-call-trans.gif',
-			'alt': 'Icon of "change components" action',
-		}));
-		triggerChangeButton.addEventListener('click', triggerChange.bind(this));
-		buttonGroup.appendChild(triggerChangeButton);
-
-		// postpone button
-		var postponeButton = app.utils.createHtmlElement('button', {
-			'class': 'postpone-button button',
-			'title': 'Postpone change',
-		});
-		postponeButton.appendChild(app.utils.createHtmlElement('img', {
-			'src': 'images/tochange/postpone-trans.gif',
-			'alt': 'Icon of "postpone current change" action',
-		}));
-		postponeButton.addEventListener('click', moveToPostponed.bind(this));
-		buttonGroup.appendChild(postponeButton);
-
-
-		// old vertex list
-		oldVertexListComponent = new ChangeVertexList(this);
-		rootElement.appendChild(oldVertexListComponent.render());
-
-		oldVertexList.forEach(function(vertex) {
-			oldVertexListComponent.appendChild(vertex);
-		}, this);
-
-
-		// controls
-		var changeControls = app.utils.createHtmlElement('div', {
-			'class': 'change-controls',
-		});
-		rootElement.appendChild(changeControls);
-
-		// transition arrow
-		var arrow = app.utils.createHtmlElement('span', {
-			'class': 'transition-arrow',
-		});
-		arrow.appendChild(app.utils.createTextElement('🡻'));
-		changeControls.appendChild(arrow);
-
-		// control buttons
-		var controlButtonGroup = app.utils.createHtmlElement('div', {
-			'class': 'button-group',
-		});
-		changeControls.appendChild(controlButtonGroup);
-
-		// load change details button
-		var loadDetailsButton = app.utils.createHtmlElement('button', {
-			'class': 'load-details-button button',
-			'title': 'Load change details',
-		});
-		loadDetailsButton.appendChild(app.utils.createTextElement('…'));
-		loadDetailsButton.addEventListener('click', loadChangeDetails.bind(this));
-		controlButtonGroup.appendChild(loadDetailsButton);
-
-		// replace old components by new ones checkbox
-		replaceComponentsCheckbox = app.utils.createHtmlElement('input', {
-			'type': 'checkbox',
-			'name': 'replaceComponents',
-			'class': 'replace-components-checkbox',
-			'title': 'Replace old components by new ones',
-			'checked': 'checked',
-			'data-tooltip': 'left',
-		});
-		controlButtonGroup.appendChild(replaceComponentsCheckbox);
-
-		// accept change button
-		var acceptButton = app.utils.createHtmlElement('button', {
-			'class': 'accept-button button',
-			'title': 'Accept proposed change',
-		});
-		acceptButton.appendChild(app.utils.createHtmlElement('img', {
-			'src': 'images/tochange/accept-trans.gif',
-			'alt': 'Icon of "accept proposed change" action',
-		}));
-		acceptButton.addEventListener('click', acceptChange.bind(this));
-		controlButtonGroup.appendChild(acceptButton);
-
-		// revoke change button
-		var revokeButton = app.utils.createHtmlElement('button', {
-			'class': 'revoke-button button',
-			'title': 'Revoke proposed change',
-		});
-		revokeButton.appendChild(app.utils.createHtmlElement('img', {
-			'src': 'images/button_cancel.png',
-			'alt': 'Icon of "revoke proposed change" action',
-		}));
-		revokeButton.addEventListener('click', revokeChange.bind(this));
-		controlButtonGroup.appendChild(revokeButton);
-
-
-		// new vertex list
-		newVertexListComponent = new ChangeVertexList(this);
-		rootElement.appendChild(newVertexListComponent.render());
-
-		newVertexList.forEach(function(vertex) {
-			newVertexListComponent.appendChild(vertex);
-		}, this);
-
-		return rootElement;
-	}
-
-	function renderPostponed() {
-		rootElement = app.utils.createHtmlElement('li', {
-			'class': 'change',
-		});
-
-
-		// buttons
-		var buttonGroup = app.utils.createHtmlElement('div', {
-			'class': 'button-group',
-		});
-		rootElement.appendChild(buttonGroup);
-
-		// activate change button
-		var activateButton = app.utils.createHtmlElement('button', {
-			'class': 'activate-button button',
-			'title': 'Set change active',
-		});
-		activateButton.appendChild(app.utils.createHtmlElement('img', {
-			'src': 'images/tochange/tochange-trans.gif',
-			'alt': 'Icon of "set change active" action',
-		}));
-		activateButton.addEventListener('click', moveToActive.bind(this));
-		buttonGroup.appendChild(activateButton);
-
-
-		// original vertex list
-		oldVertexListComponent = new ChangeVertexList(this);
-		rootElement.appendChild(oldVertexListComponent.render());
-
-		oldVertexList.forEach(function(vertex) {
-			oldVertexListComponent.appendChild(vertex);
-		}, this);
-
-
-		// new vertex list
-		newVertexListComponent = new ChangeVertexList(this);
-		rootElement.appendChild(newVertexListComponent.render());
-
-		newVertexList.forEach(function(vertex) {
-			newVertexListComponent.appendChild(vertex);
-		}, this);
-
-
-		return rootElement;
-	}
-
-	function triggerChange() {
-		var self = this;
-		var includeNotFound = includeNotFoundCheckbox.checked;
-
-		app.loader.enable();
-
-		app.componentChanger.run(oldVertexList, includeNotFound).then(function(data) {
-			self.setTriggered(true);
-
-			data.forEach(function(component) {
-				var vertex = new VertexLight(component);
-
-				newVertexList.push(vertex);
-				newVertexListComponent.appendChild(vertex);
-			});
-
-		}, function(reason) {
-			if (typeof reason === 'string') {
-				alert(reason);
-			} else {
-				alert('Error occurred while querying CRCE. See JS console for more details.');
-				console.error(reason);
-			}
-
-		}).always(function() {
-			app.loader.disable();
-		});
-	}
-
-	function loadChangeDetails() {
-		var self = this;
-		var graphVersion = parseInt(app.cookies.get('graphVersion'));
-		var uuidToNameMap = {};
-
-		app.loader.enable();
-
-		downloadComponents(graphVersion + 1, newVertexList).then(function(responses) {
-			// get map with component's UUID as key and its filename as value
-			uuidToNameMap = responses.map(function(response) {
-				return response[0];
-			}).reduce(function(map, component) {
-				map[component.uuid] = component.name;
-				return map;
-			}, {});
-
-			return copyComponents(app.vertexList);
-
-		}).then(function() {
-			return loadGraphData(graphVersion + 1);
-
-		}).then(function(data) {
-			// vertices
-			data.vertices.forEach(function(component) {
-				var vertex = app.findVertexByName(component.name);
-
-				if (app.utils.isDefined(vertex)) {
-					// vertex already exists in graph
-					return;
-
-				} else {
-					// create a new vertex
-					var vertex = new Vertex(component);
-					vertex.setPosition(new Coordinates(0, 0));
-
-					app.nodeList.push(vertex);
-					app.vertexList.push(vertex);
-
-					app.viewportComponent.addVertex(vertex);
-				}
-
-				// replace light vertex placeholder by vertex component
-				var placeholdingVertex = newVertexList.find(function(newVertex) {
-					return uuidToNameMap[newVertex.id] == this.name;
-				}, vertex);
-
-				if (app.utils.isDefined(placeholdingVertex)) {
-					newVertexList.splice(newVertexList.indexOf(placeholdingVertex), 1);
-					newVertexListComponent.removeChild(placeholdingVertex);
-				}
-
-				newVertexList.push(vertex);
-			});
-
-			var newVertexNameList = newVertexList.map(function(vertex) {
-				return vertex.name;
-			});
-
-			// edges
-			data.edges.forEach(function(component) {
-				// vertex names are prefixed by "vertex_" string, cut it off
-				var fromNodeName = component.from.substring(7);
-				var toNodeName = component.to.substring(7);
-
-				// neither end of the edge is a newly added vertex
-				if (newVertexNameList.indexOf(fromNodeName) < 0 && newVertexNameList.indexOf(toNodeName) < 0) return;
-
-				var edge = new Edge(component);
-
-				var fromNode = app.findVertexByName(fromNodeName);
-				if (fromNode) {
-					fromNode.addOutEdge(edge);
-				}
-
-				var toNode = app.findVertexByName(toNodeName);
-				if (toNode) {
-					toNode.addInEdge(edge);
-				}
-
-				app.edgeList.push(edge);
-
-				app.viewportComponent.addEdge(edge);
-			});
-
-
-			newVertexList.forEach(function(vertex) {
-				vertex.exclude();
-
-				newVertexListComponent.appendChild(vertex);
-			});
-
-			app.redrawEdges();
-
-			self.setDetailsLoaded(true);
-
-		}).always(function() {
-			app.loader.disable();
-		});
-	}
-
-	function downloadComponents(graphVersion, vertexList) {
-		var downloadPromises = [];
-		vertexList.forEach(function(vertex) {
-			var downloadPromise = $.ajax({
-				type: 'POST',
-				url: 'api/download-component?graphVersion=' + graphVersion + '&uuid=' + encodeURIComponent(vertex.id),
-				contentType: 'application/json',
-				timeout: 180 * 1000,	// in milliseconds
-			});
-
-			downloadPromises.push(downloadPromise);
-		});
-
-		return app.utils.promiseAll(downloadPromises);
-	}
-
-	function deleteComponents(graphVersion, vertexList) {
-		var deletePromises = [];
-		vertexList.forEach(function(vertex) {
-			var deletePromise = $.ajax({
-				type: 'GET',
-				url: 'delete-component?graphVersion=' + graphVersion + '&name=' + encodeURIComponent(vertex.name),
-				timeout: 180 * 1000,	// in milliseconds
-			});
-
-			deletePromises.push(deletePromise);
-		});
-
-		return app.utils.promiseAll(deletePromises);
-	}
-
-	function copyComponents(vertexList) {
-		var involvedComponents = vertexList.filter(function(vertex) {
-			return vertex.name !== app.constants.notFoundVertexName;
-		}).map(function(vertex) {
-			return {
-				'id': vertex.id,
-				'name': vertex.name,
-			};
-		});
-
-		return $.ajax({
-			type: 'POST',
-			url: 'api/copy-components',
-			data: JSON.stringify({
-				'components': involvedComponents,
-			}),
-			contentType: 'application/json',
-			timeout: 180 * 1000,	// in milliseconds
-		});
-	}
-
-	function loadGraphData(graphVersion) {
-		return $.getJSON(app.API.loadGraph + '?graphVersion=' + graphVersion);
-	}
-
-	function acceptChange() {
-		var self = this;
-		var graphVersion = parseInt(app.cookies.get('graphVersion'));
-		var replaceComponents = replaceComponentsCheckbox.checked;
-
-		app.loader.enable();
-
-		var promise;
-		if (this.isDetailsLoaded()) {
-			var deleteComponentsPromise;
-			if (replaceComponents) {
-				deleteComponentsPromise = deleteComponents(graphVersion + 1, oldVertexList);
-			} else {
-				deleteComponentsPromise = $.when();
-			}
-
-			promise = deleteComponentsPromise.then(function() {
-				return loadGraphData(graphVersion + 1);
-			});
-
-		} else {
-			// download and copy components on the server side and then load the graph
-			promise = downloadComponents(graphVersion + 1, newVertexList).then(function(responses) {
-				var involvedVertexList = app.vertexList;
-
-				if (replaceComponents) {
-					involvedVertexList = involvedVertexList.filter(function(vertex) {
-						return oldVertexList.some(function(oldVertex) {
-							return oldVertex.name !== vertex.name;
-						});
-					});
-				}
-
-				return copyComponents(involvedVertexList);
-
-			}).then(function() {
-				return loadGraphData(graphVersion + 1);
-			});
-		}
-
-		promise.then(function(data) {
-			// increment graph version number
-			app.cookies.set('graphVersion', graphVersion + 1);
-
-			var graphExportData = app.graphExporter.run();
-
-			app.reset();
-			app.graphLoader.run(data, graphExportData);
-
-		}).always(function() {
-			app.loader.disable();
-		});
-	}
-
-	function revokeChange() {
-		var self = this;
-		var graphVersion = parseInt(app.cookies.get('graphVersion'));
-
-		app.loader.enable();
-
-		var deleteComponentsPromise;
-		if (this.isDetailsLoaded()) {
-			// delete components on the server side
-			deleteComponentsPromise = deleteComponents(graphVersion + 1, newVertexList);
-		} else {
-			deleteComponentsPromise = $.when();
-		}
-
-		deleteComponentsPromise.then(function() {
-			newVertexList.forEach(function(vertex) {
-				// change details were loaded
-				if (self.isDetailsLoaded()) {
-					// remove edges connected with the vertex
-					vertex.getInEdgeList().forEach(function(edge) {
-						edge.remove();
-					});
-					vertex.getOutEdgeList().forEach(function(edge) {
-						edge.remove();
-					});
-
-					var existingVertex = app.findVertexByName(vertex.name);
-					if (app.utils.isDefined(existingVertex)) {
-						// remove vertex from app
-						app.nodeList.splice(app.nodeList.indexOf(existingVertex), 1);
-						app.vertexList.splice(app.vertexList.indexOf(existingVertex), 1);
-					}
-				}
-
-				// remove vertex from this change
-				newVertexListComponent.removeChild(vertex);
-			});
-
-			newVertexList = [];
-
-			self.setTriggered(false);
-			self.setDetailsLoaded(false);
-
-		}).always(function() {
-			app.loader.disable();
-		});
-	}
-
-	function moveToPostponed() {
-		if (oldVertexList.length === 0) return;
-		
-		newVertexList.forEach(function(vertex) {
-			// remove vertex from app
-			var existingVertex = app.findVertexByName(vertex.name);
-			if (app.utils.isDefined(existingVertex)) {
-				app.nodeList.splice(app.nodeList.indexOf(existingVertex), 1);
-				app.vertexList.splice(app.vertexList.indexOf(existingVertex), 1);
-			}
-		});
-
-		this.setPostponed(true);
-		this.remove();
-
-		app.sidebarComponent.setChangePostponed(this);
-	}
-
-	function moveToActive() {
-		newVertexList.forEach(function(vertex) {
-			// add vertex to app
-			app.nodeList.push(vertex);
-			app.vertexList.push(vertex);
-		});
-
-		this.setPostponed(false);
-		this.remove();
-
-		app.sidebarComponent.setChangeActive(this);
-	}
-
-	function toggleButtonGroup() {
-		if (oldVertexList.length > 0) {
-			buttonGroup.classList.remove('hidden');
-		} else {
-			buttonGroup.classList.add('hidden');
-		}
-	}
-
-	function getInvolvedComponents() {
-		var involvedComponents = [];
-
-		oldVertexList.forEach(function(vertex) {
-			vertex.getInEdgeList().forEach(function(edge) {
-				involvedComponents.push(edge.getFrom());
-			});
-
-			vertex.getOutEdgeList().forEach(function(edge) {
-				involvedComponents.push(edge.getTo());
-			});
-		});
-
-		return involvedComponents;
-	}
-}
diff --git a/sources/src/main/webapp/js/components/changeModalWindow.js b/sources/src/main/webapp/js/components/changeModalWindow.js
deleted file mode 100644
index 18dcbbd..0000000
--- a/sources/src/main/webapp/js/components/changeModalWindow.js
+++ /dev/null
@@ -1,62 +0,0 @@
-/**
- * Class representing a modal window displaying a change separately from viewport and sidebar.
- * @see Change
- * @constructor
- * @param {Change} change Change to be displayed in the modal window.
- */
-function ChangeModalWindow(change) {
-	var rootElement;
-
-	var change;
-
-	/**
-	 * Sets a change to be displayed in the modal window.
-	 * @param {Change} newValue Change to be displayed in this modal window.
-	 */
-	this.setChange = function(newValue) {
-		change = newValue;
-	};
-
-	this.open = function() {
-		rootElement.classList.remove('hidden');
-	};
-
-	/**
-	 * Closes this modal window.
-	 */
-	this.close = function() {
-		rootElement.classList.add('hidden');
-	};
-
-	/**
-	 * Creates a new HTML DOM element representing the modal window in memory. Binds user interactions to local handler functions.
-	 * @returns {Element} HTML DOM element.
-	 */
-	this.render = function() {
-		rootElement = app.utils.createHtmlElement('div', {
-			'class': 'change-modal modal hidden',
-		});
-
-		var modalContent = app.utils.createHtmlElement('div', {
-			'class': 'modal-content',
-		});
-		rootElement.appendChild(modalContent);
-
-		var closeButton = app.utils.createHtmlElement('button', {
-			'class': 'close-button button',
-		});
-		closeButton.appendChild(app.utils.createTextElement('×'));
-		closeButton.addEventListener('click', closeButtonClick.bind(this));
-		modalContent.appendChild(closeButton);
-
-		return rootElement;
-	};
-
-	/**
-	 * Close button click interaction. Closes the modal window.
-	 * @param {Event} e Click event.
-	 */
-	function closeButtonClick(e) {
-		this.close();
-	}
-}
diff --git a/sources/src/main/webapp/js/components/changeVertexList.js b/sources/src/main/webapp/js/components/changeVertexList.js
deleted file mode 100644
index 9d09453..0000000
--- a/sources/src/main/webapp/js/components/changeVertexList.js
+++ /dev/null
@@ -1,49 +0,0 @@
-/**
- * Class representing a list of vertices in a change. It can be either the list of components to be changed or the list of proposals.
- * @see Change
- * @constructor
- * @param {Change} parentalChange Change this vertex list is bound to.
- */
-function ChangeVertexList(parentalChange) {
-	var rootElement;
-
-	/**
-	 * Adds a new vertex to the list.
-	 * @param {vertex} vertex Vertex to be added to this list.
-	 */
-	this.appendChild = function(vertex) {
-		if (parentalChange.isPostponed()) {
-			var listItemElement = app.utils.createHtmlElement('li', {
-				'class': 'node vertex',
-				'data-id': vertex.id,
-			});
-			listItemElement.appendChild(document.createTextNode(vertex.name));
-
-		} else {
-			listItemElement = vertex.render();
-		}
-
-		rootElement.appendChild(listItemElement);
-	};
-
-	/**
-	 * Removes a vertex from the list.
-	 * @param {vertex} vertex Vertex to be removed from this list.
-	 */
-	this.removeChild = function(vertex) {
-		var listItemElement = rootElement.querySelector('[data-id="' + vertex.id + '"]');
-
-		listItemElement.remove();
-	};
-
-	/**
-	 * Creates a new DOM element representing the list in memory.
-	 * @returns {Element} HTML DOM element.
-	 */
-	this.render = function() {
-		rootElement = app.utils.createHtmlElement('ul', {});
-		rootElement.setAttribute('class', 'node-list');
-
-		return rootElement;
-	};
-}
diff --git a/sources/src/main/webapp/js/components/edge.js b/sources/src/main/webapp/js/components/edge.js
index 6b9ad2d..1393672 100644
--- a/sources/src/main/webapp/js/components/edge.js
+++ b/sources/src/main/webapp/js/components/edge.js
@@ -9,9 +9,6 @@ function Edge(props) {
 
 	var rootElement;
 
-	var compatible = props.isCompatible;
-	var compatibilityInfo = props.compInfoJSON ? JSON.parse(props.compInfoJSON) : [];
-
 	var hidden = false;
 	var dimmed = false;
 	var highlighted = false;
@@ -108,20 +105,6 @@ function Edge(props) {
 		lollipop.setAttribute('transform', `rotate(${rotation}, ${position.x},${position.y}) translate(${position.x},${position.y})`);
 	};
 
-	/**
-	 * @returns {boolean} True if the edge is compatible, otherwise false.
-	 */
-	this.isCompatible = function() {
-		return compatible;
-	};
-
-	/**
-	 * @returns {object} Information on compatibility of the two vertices this edge is connecting.
-	 */
-	this.getCompatibilityInfo = function() {
-		return compatibilityInfo;
-	};
-
 	/**
 	 * Toggles visibility of the edge.
 	 * @param {boolean} newValue True to hide the edge, false to display it.
@@ -294,11 +277,6 @@ function Edge(props) {
 	 * @param {Event} e Click event.
 	 */
 	function click(e) {
-		if (compatibilityInfo.length > 0) {
-			app.viewportComponent.edgePopoverComponent.setContent(compatibilityInfo);
-			app.viewportComponent.edgePopoverComponent.setPosition(new Coordinates(e.clientX, e.clientY));
-			app.viewportComponent.edgePopoverComponent.open();
-		}
 
 		// unhighlight other edges
 		app.edgeList.filter(function(edge) {
diff --git a/sources/src/main/webapp/js/components/sidebar.js b/sources/src/main/webapp/js/components/sidebar.js
index 1c927fe..1ad6358 100644
--- a/sources/src/main/webapp/js/components/sidebar.js
+++ b/sources/src/main/webapp/js/components/sidebar.js
@@ -5,18 +5,13 @@ function Sidebar() {
 	var rootElement;
 	var activeChangeElement;
 
-	/** @prop {SidebarPostponedChangeList} postponedChangeListComponent */
-	this.postponedChangeListComponent = null;
 	/** @prop {SidebarUnconnectedNodeList} unconnectedNodeListComponent */
 	this.unconnectedNodeListComponent = null;
-	/** @prop {SidebarMissingClassList} missingClassListComponent */
-	this.missingClassListComponent = null;
 	/** @prop {SidebarExcludedNodeList} excludedNodeListComponent */
 	this.excludedNodeListComponent = null;
 	/** @prop {StatusBar} statusBarComponent */
 	this.statusBarComponent = null;
 
-	var activeChange = new Change;
 	var floaterList = [];
 
 	this.getFloaters = function() {
@@ -37,38 +32,6 @@ function Sidebar() {
 		floaterList.splice(floaterList.indexOf(floater), 1);
 	};
 
-	this.addToChange = function(node) {
-		node.removeFromSidebarList();
-		node.remove(true);
-
-		activeChange.addVertex(node);
-	};
-
-	this.setChangeActive = function(change) {
-		// postpone currently active change
-		if (activeChange.getOldVertexList().length > 0) {
-			activeChange.postpone();
-			this.postponedChangeListComponent.add(activeChange);
-		} else {
-			activeChange.remove();
-		}
-
-		change.activate();
-		activeChange = change;
-		activeChangeElement.appendChild(activeChange.render());
-	};
-
-	this.setChangePostponed = function(change) {
-		// postpone currently active change if there are some vertices in it
-		if (change.getOldVertexList().length > 0) {
-			this.postponedChangeListComponent.add(change);
-		}
-
-		// set a new active change
-		activeChange = new Change;
-		activeChangeElement.appendChild(activeChange.render());
-	};
-
 	this.render = function() {
 		rootElement = app.utils.createHtmlElement('div', {
 			'class': 'sidebar',
@@ -82,42 +45,6 @@ function Sidebar() {
 		});
 		rootElement.appendChild(sidebarNav);
 
-		// change
-		var changeButton = app.utils.createHtmlElement('button', {
-			'class': 'button',
-			'id': 'changeButton',
-			'title': 'Active change',
-			'data-tooltip': 'top',
-		});
-		changeButton.appendChild(app.dom.createHtmlElement('img', {
-			'src': 'images/tochange/crce-call-trans.gif',
-			'alt': 'Icon of "toggle active change" action',
-		}));
-		changeButton.appendChild(app.dom.createTextElement('List'));
-		changeButton.addEventListener('click', function() {
-			document.getElementById('activeChange').classList.toggle('hidden');
-			app.redrawEdges();
-		});
-		sidebarNav.appendChild(changeButton);
-
-		// postponed
-		var postponedButton = app.utils.createHtmlElement('button', {
-			'class': 'button',
-			'id': 'postponedButton',
-			'title': 'Postponed changes',
-			'data-tooltip': 'top',
-		});
-		postponedButton.appendChild(app.dom.createHtmlElement('img', {
-			'src': 'images/tochange/postpone-trans.gif',
-			'alt': 'Icon of "toggle postponed changes list" action',
-		}));
-		postponedButton.appendChild(app.dom.createTextElement('List'));
-		postponedButton.addEventListener('click', function() {
-			document.getElementById('postponedChangeListComponent').classList.toggle('hidden');
-			app.redrawEdges();
-		});
-		sidebarNav.appendChild(postponedButton);
-		
 		// unconnected
 		var unconnectedButton = app.utils.createHtmlElement('button', {
 			'class': 'button',
@@ -136,47 +63,12 @@ function Sidebar() {
 		});
 		sidebarNav.appendChild(unconnectedButton);
 		
-		// missing
-		var missingButton = app.utils.createHtmlElement('button', {
-			'class': 'button',
-			'id': 'missingButton',
-			'title': 'Missing classes',
-			'data-tooltip': 'top-left',
-		});
-		missingButton.appendChild(app.dom.createHtmlElement('img', {
-			'src': 'images/tochange/accept-trans.gif',
-			'alt': 'Icon of "toggle missing classes list" action',
-		}));
-		missingButton.appendChild(app.dom.createTextElement('List'));
-		missingButton.addEventListener('click', function() {
-			document.getElementById('missingClassListComponent').classList.toggle('hidden');
-			app.redrawEdges();
-		});
-		sidebarNav.appendChild(missingButton);
-
 
 		var sidebarContainer = app.utils.createHtmlElement('div', {
 			'class': 'sidebar-container',
 		});
 		rootElement.appendChild(sidebarContainer);
 
-		// active change
-		activeChangeElement = app.utils.createHtmlElement('div', {
-			'id': 'activeChange',
-			'class': 'node-container change-nodes',
-		});
-		activeChangeElement.appendChild(app.dom.htmlStringToElement('<h2 class="node-container-title">Active change</h2>'));
-		activeChangeElement.appendChild(activeChange.render());
-
-		sidebarContainer.appendChild(activeChangeElement);
-
-		// postponed changes
-		this.postponedChangeListComponent = new SidebarPostponedChangeList({
-			'id': 'postponedChangeListComponent',
-			'class': 'hidden',
-		});
-		sidebarContainer.appendChild(this.postponedChangeListComponent.render());
-
 		// unconnected components
 		this.unconnectedNodeListComponent = new SidebarUnconnectedNodeList({
 			'id': 'unconnectedNodeListComponent',
@@ -184,13 +76,6 @@ function Sidebar() {
 		});
 		sidebarContainer.appendChild(this.unconnectedNodeListComponent.render());
 
-		// missing classes
-		this.missingClassListComponent = new SidebarMissingComponentList({
-			'id': 'missingClassListComponent',
-			'class': 'hidden',
-		});
-		sidebarContainer.appendChild(this.missingClassListComponent.render());
-
 
 		// excluded nodes
 		this.excludedNodeListComponent = new SidebarExcludedNodeList({
@@ -208,17 +93,8 @@ function Sidebar() {
 	};
 
 	this.reset = function() {
-		// remove active change
-		activeChange.remove();
-
-		// set a new active change
-		activeChange = new Change;
-		activeChangeElement.appendChild(activeChange.render());
-
 		// reset lists
-		this.postponedChangeListComponent.reset();
 		this.unconnectedNodeListComponent.reset();
-		this.missingClassListComponent.reset();
 		this.excludedNodeListComponent.reset();
 
 		// reset status bar
diff --git a/sources/src/main/webapp/js/components/sidebarMissingComponentList.js b/sources/src/main/webapp/js/components/sidebarMissingComponentList.js
deleted file mode 100644
index 5c387e1..0000000
--- a/sources/src/main/webapp/js/components/sidebarMissingComponentList.js
+++ /dev/null
@@ -1,56 +0,0 @@
-/**
- * @constructor
- * @param {object} props Properties of the components list.
- */
-function SidebarMissingComponentList(props) {
-	/** @prop {string} id Identifier of the component. */
-	this.id = props.id;
-
-	var rootElement;
-	var componentListElement;
-
-	var componentList = [];
-
-	this.getComponentList = function() {
-		return componentList;
-	};
-
-	this.add = function(componentName) {
-		if (componentList.indexOf(componentName) > -1) return;
-
-		componentList.push(componentName);
-
-		var listItem = app.utils.createHtmlElement('li', {
-			'title': componentName,
-		});
-		listItem.appendChild(document.createTextNode(componentName));
-		componentListElement.appendChild(listItem);
-	};
-
-	this.render = function() {
-		rootElement = app.utils.createHtmlElement('div', {
-			'id': props.id,
-			'class': 'node-container missing-components ' + (props.class ? props.class : ''),
-		});
-		rootElement.addEventListener('scroll', function() {
-			app.redrawEdges();
-		});
-
-		// title
-		rootElement.appendChild(app.dom.htmlStringToElement('<h2 class="node-container-title">Missing classes</h2>'));
-
-		// component list
-		componentListElement = app.utils.createHtmlElement('ul', {
-			'class': 'node-list',
-		});
-		rootElement.appendChild(componentListElement);
-
-		return rootElement;
-	};
-
-	this.reset = function() {
-		componentList = [];
-
-		$(componentListElement).empty();
-	};
-}
diff --git a/sources/src/main/webapp/js/components/sidebarPostponedChangeList.js b/sources/src/main/webapp/js/components/sidebarPostponedChangeList.js
deleted file mode 100644
index 2653033..0000000
--- a/sources/src/main/webapp/js/components/sidebarPostponedChangeList.js
+++ /dev/null
@@ -1,86 +0,0 @@
-/**
- * @constructor
- * @param {object} props Properties of the change list.
- */
-function SidebarPostponedChangeList(props) {
-	/** @prop {string} id Identifier of the component. */
-	this.id = props.id;
-
-	var rootElement;
-	var buttonGroup;
-	var changeListElement;
-
-	var changeList = [];
-
-	this.getChangeList = function() {
-		return changeList;
-	};
-
-	this.add = function(change) {
-		if (!(change instanceof Change)) {
-			throw new TypeError(change.toString() + 'is not instance of Change');
-		}
-
-		change.setPostponed(true);
-
-		changeList.push(change);
-		changeListElement.appendChild(change.render());
-
-		app.redrawEdges();
-	};
-
-	this.remove = function(change) {
-		if (!(change instanceof Change)) {
-			throw new TypeError(change.toString() + 'is not instance of Change');
-		}
-
-		change.setPostponed(false);
-
-		changeList.splice(changeList.indexOf(change), 1);
-		change.remove();
-
-		app.redrawEdges();
-	};
-
-	this.render = function() {
-		rootElement = app.utils.createHtmlElement('div', {
-			'id': props.id,
-			'class': 'node-container postponed-nodes ' + (props.class ? props.class : ''),
-		});
-		rootElement.addEventListener('scroll', function() {
-			app.redrawEdges();
-		});
-
-		// title
-		rootElement.appendChild(app.dom.htmlStringToElement('<h2 class="node-container-title">Postponed changes</h2>'));
-
-		// list
-		changeListElement = app.utils.createHtmlElement('ul', {
-			'class': 'change-list',
-		});
-		rootElement.appendChild(changeListElement);
-
-		return rootElement;
-	};
-
-	this.reset = function() {
-		console.log('TODO: should SidebarPostponedChangeList.reset() method do something?');
-	};
-
-	function includeAll() {
-		var nodeListCopy = nodeList.slice(0);
-		nodeListCopy.forEach(function(node) {
-			node.include();
-		}, this);
-
-		toggleButtonGroup.call(this);
-	}
-
-	function toggleButtonGroup() {
-		if (nodeList.length > 0) {
-			buttonGroup.classList.remove('hidden');
-		} else {
-			buttonGroup.classList.add('hidden');
-		}
-	}
-}
diff --git a/sources/src/main/webapp/js/components/statusBar.js b/sources/src/main/webapp/js/components/statusBar.js
index fd4d425..bb8f879 100644
--- a/sources/src/main/webapp/js/components/statusBar.js
+++ b/sources/src/main/webapp/js/components/statusBar.js
@@ -1,11 +1,10 @@
 /**
- * Class representing the sidebar status bar. It displays number of components loaded in the diagram and the current graph version.
+ * Class representing the sidebar status bar. It displays number of components loaded in the diagram.
  * @constructor
  */
 function StatusBar() {
 	var rootElement;
 	var componentCounterElement;
-	var graphVersionElement;
 
 	/**
 	 * Sets a new count of components loaded in the diagram.
@@ -16,15 +15,6 @@ function StatusBar() {
 		componentCounterElement.appendChild(app.utils.createTextElement('loaded components: ' + componentCount));
 	};
 
-	/**
-	 * Sets a new graph version.
-	 * @param {string|integer} graphVersion New graph version.
-	 */
-	this.setGraphVersion = function(graphVersion) {
-		graphVersionElement.innerHTML = '';
-		graphVersionElement.appendChild(app.utils.createTextElement('graph version: ' + graphVersion));
-	};
-
 	/**
 	 * Creates a new DOM element representing the status bar in memory.
 	 * @returns {Element} HTML DOM element.
@@ -39,11 +29,6 @@ function StatusBar() {
 		});
 		rootElement.appendChild(componentCounterElement);
 
-		graphVersionElement = app.utils.createHtmlElement('span', {
-			'class': 'graph-version',
-		});
-		rootElement.appendChild(graphVersionElement);
-
 		return rootElement;
 	};
 
@@ -52,6 +37,5 @@ function StatusBar() {
 	 */
 	this.reset = function() {
 		componentCounterElement.innerHTML = '';
-		graphVersionElement.innerHTML = '';
 	};
 }
\ No newline at end of file
diff --git a/sources/src/main/webapp/js/constants.js b/sources/src/main/webapp/js/constants.js
index ae0da00..2431101 100644
--- a/sources/src/main/webapp/js/constants.js
+++ b/sources/src/main/webapp/js/constants.js
@@ -3,8 +3,6 @@
  * @constructor
  */
 function Constants() {
-	/** @prop {string} crceApiBase CRCE API base path. */
-	this.crceApiBase = 'http://localhost:8081/rest/v2';
 	/** @prop {string} notFoundVertexName Name of the vertex that groups all components that were not found while constructing graph. */
 	this.notFoundVertexName = 'NOT_FOUND';
 }
diff --git a/sources/src/main/webapp/js/graphLoader.js b/sources/src/main/webapp/js/graphLoader.js
index a7ccb45..e94d769 100644
--- a/sources/src/main/webapp/js/graphLoader.js
+++ b/sources/src/main/webapp/js/graphLoader.js
@@ -87,25 +87,8 @@ function GraphLoader() {
 			app.sidebarComponent.unconnectedNodeListComponent.add(vertex);
 		});
 
-		// find missing components
-		app.edgeList.filter(function(edge) {
-			return edge.getFrom().name === app.constants.notFoundVertexName;
-		}).forEach(function(edge) {
-			var compatibilityInfoList = edge.getCompatibilityInfo();
-			compatibilityInfoList.forEach(function(compatibilityInfo) {
-				if (compatibilityInfo.incomps.length === 0) return;
-
-				compatibilityInfo.incomps.forEach(function(incompatibility) {
-					if (!incompatibility.desc.isIncompCause) return;
-
-					app.sidebarComponent.missingClassListComponent.add(incompatibility.desc.name);
-				});
-			});
-		});
-
 		// update status bar
 		app.sidebarComponent.statusBarComponent.setComponentCount(data.vertices.length);
-		app.sidebarComponent.statusBarComponent.setGraphVersion(app.cookies.get('graphVersion'));
 	};
 
 }
\ No newline at end of file
diff --git a/sources/src/main/webapp/js/javaComponentChanger.js b/sources/src/main/webapp/js/javaComponentChanger.js
deleted file mode 100644
index 1f52937..0000000
--- a/sources/src/main/webapp/js/javaComponentChanger.js
+++ /dev/null
@@ -1,211 +0,0 @@
-/**
- * @constructor
- */
-function JavaComponentChanger() {
-	var javaClasses = {
-		boolean: 'java.lang.Boolean',
-		string: 'java.lang.String',
-		list: 'java.util.List',
-		set: 'java.util.Set',
-	};
-
-	var crceClasses = {
-		package: 'crce.api.java.package',
-		class: 'crce.api.java.class',
-		method: 'crce.api.java.method',
-		property: 'crce.api.java.property',
-	};
-
-	var ns = '';	// http://relisa.kiv.zcu.cz
-	var xsi = 'http://www.w3.org/2001/XMLSchema-instance';
-	var xsd = 'crce.xsd';
-
-	var xmlDocument;
-	var nodeCounter;
-
-	var xmlParser = new DOMParser();
-	var xmlSerializer = new XMLSerializer();
-
-	/**
-	 * Sends change requirements to CRCE.
-	 * @param {array} components Components to be changed.
-	 * @param {boolean} includeNotFound True if not found classes should be added as change requirements, otherwise false.
-	 */
-	this.run = function(components, includeNotFound) {
-		if (components.length === 0) return;
-
-		// initialize requirements XML to be sent to CRCE
-		xmlDocument = constructXmlDocument(components, includeNotFound);
-
-		console.log('CRCE request:', xmlDocument);
-
-		// trigger change
-		return $.ajax({
-			type: 'POST',	// jQuery docs tells to use "method" but it doesn't work and always sends GET -> use "type" instead
-			url: app.constants.crceApiBase + '/metadata/catalogue/',
-			data: xmlSerializer.serializeToString(xmlDocument),
-			contentType: 'application/xml',
-			timeout: 180 * 1000,	// in milliseconds
-
-		}).then(function(data, textStatus, jqXHR) {
-			console.log('CRCE response:', data);
-
-			var resourcesEl = data.childNodes[0];
-			if (resourcesEl.childNodes.length === 0) {
-				return $.Deferred().reject('CRCE did not find any resources fitting your requirements.').promise();
-			}
-
-			var proposals = [];
-
-			resourcesEl.childNodes.forEach(function(resourceEl, index) {
-				var proposal = {
-					uuid: resourceEl.getAttribute('uuid'),
-				};
-
-				var capabilityEl = resourceEl.childNodes[0];
-				capabilityEl.childNodes.forEach(function(attributeEl) {
-					if (['name', 'external-id', 'version'].includes(attributeEl.getAttribute('name'))) {
-						proposal[attributeEl.getAttribute('name')] = attributeEl.getAttribute('value');
-					}
-				});
-				proposals.push(proposal);
-			});
-
-			return proposals;
-		});
-	};
-
-	function constructXmlDocument(components, includeNotFound) {
-		// initialize requirements XML to be sent to CRCE
-		xmlDocument = document.implementation.createDocument(ns, 'requirements', null);
-		//xmlDocument.documentElement.setAttributeNS(xsi, 'xsi:schemaLocation', ns + ' ' + xsd);
-
-		nodeCounter = 0;
-
-		// optimize returned results
-		var optimizeByRequirementEl = xmlDocument.createElementNS(ns, 'requirement');
-		optimizeByRequirementEl.setAttribute('namespace', 'result.optimize-by');
-
-		var optimizeByFunctionAttributeEl = xmlDocument.createElementNS(ns, 'attribute');
-		optimizeByFunctionAttributeEl.setAttribute('name', 'function-ID');
-		optimizeByFunctionAttributeEl.setAttribute('type', javaClasses.string);
-		optimizeByFunctionAttributeEl.setAttribute('value', 'cf-equal-cost');
-
-		var optimizeByMethodAttributeEl = xmlDocument.createElementNS(ns, 'attribute');
-		optimizeByMethodAttributeEl.setAttribute('name', 'method-ID');
-		optimizeByMethodAttributeEl.setAttribute('type', javaClasses.string);
-		optimizeByMethodAttributeEl.setAttribute('value', 'ro-ilp-direct-dependencies');
-
-		optimizeByRequirementEl.appendChild(optimizeByFunctionAttributeEl);
-		optimizeByRequirementEl.appendChild(optimizeByMethodAttributeEl);
-
-		xmlDocument.documentElement.appendChild(optimizeByRequirementEl);
-
-		// component does not have to fulfill all requirements
-		var directiveEl = xmlDocument.createElementNS(ns, 'directive');
-		directiveEl.setAttribute('name', 'operator');
-		directiveEl.setAttribute('value', 'or');
-
-		xmlDocument.documentElement.appendChild(directiveEl);
-
-		// component requirements
-		components.forEach(function(component) {
-			var inEdgeList = component.getInEdgeList();
-			if (!includeNotFound) {
-				inEdgeList = inEdgeList.filter(function(edge) {
-					return edge.getFrom().name !== app.constants.notFoundVertexName;
-				});
-			}
-
-			if (inEdgeList.length === 0) return;
-
-			// construct functionality requirements tree
-			inEdgeList.forEach(function(edge) {
-				var compatibilityInfoList = edge.getCompatibilityInfo();
-
-				compatibilityInfoList.forEach(function(compatibilityInfo) {
-					compatibilityInfo.incomps.forEach(function(incompatibility) {
-						appendRequirementTree(xmlDocument.documentElement, incompatibility);
-					});
-				});
-			});
-		});
-
-		return xmlDocument;
-	}
-
-	function appendRequirementTree(element, incompatibility) {
-		var type = incompatibility.desc.type;
-
-		if (app.utils.isUndefined(type)) {
-			incompatibility.subtree.forEach(function(incompatibility) {
-				appendRequirementTree(element, incompatibility);
-			});
-
-		} else {
-			// add package for classes
-			if (type === 'class') {
-				var packageRequirementEl = xmlDocument.createElementNS(ns, 'requirement');
-				packageRequirementEl.setAttribute('uuid', nodeCounter++);
-				packageRequirementEl.setAttribute('namespace', crceClasses['package']);
-
-				var packageAttributeEl = xmlDocument.createElementNS(ns, 'attribute');
-				packageAttributeEl.setAttribute('name', 'name');
-				packageAttributeEl.setAttribute('type', javaClasses.string);
-				packageAttributeEl.setAttribute('value', incompatibility.desc.details.package);
-
-				packageRequirementEl.appendChild(packageAttributeEl);
-			}
-
-			var requirementEl = xmlDocument.createElementNS(ns, 'requirement');
-			requirementEl.setAttribute('uuid', nodeCounter++);
-			requirementEl.setAttribute('namespace', crceClasses[type]);
-
-			// attributes
-			var details = incompatibility.desc.details;
-			for (var key in details) {
-				if (!details.hasOwnProperty(key)) continue;
-				if (key === 'package') continue;
-
-				var value = details[key];
-
-				// TODO: fix for JaCC not returning correct values for abstract classes and interfaces
-				if (key === 'abstract' || key === 'interface') continue;
-
-				var attributeType;
-				switch (typeof value) {
-					case 'boolean':
-						attributeType = javaClasses.boolean;
-						break;
-					case 'object':
-						if (value.constructor.name === 'Array') {
-							attributeType = javaClasses.list;
-							break;
-						}
-					default:
-						attributeType = javaClasses.string;
-				}
-
-				var attributeEl = xmlDocument.createElementNS(ns, 'attribute');
-				attributeEl.setAttribute('name', key);
-				attributeEl.setAttribute('type', attributeType);
-				attributeEl.setAttribute('value', value);
-	
-				requirementEl.appendChild(attributeEl);
-			}
-
-			// children
-			incompatibility.subtree.forEach(function(incompatibility) {
-				appendRequirementTree(requirementEl, incompatibility);
-			});
-
-			// add package for classes
-			if (type === 'class') {
-				packageRequirementEl.appendChild(requirementEl);
-				element.appendChild(packageRequirementEl);
-			} else {
-				element.appendChild(requirementEl);
-			}
-		}
-	}
-}
\ No newline at end of file
diff --git a/sources/src/main/webapp/showGraph.jsp b/sources/src/main/webapp/showGraph.jsp
index aac3630..6239961 100644
--- a/sources/src/main/webapp/showGraph.jsp
+++ b/sources/src/main/webapp/showGraph.jsp
@@ -28,13 +28,8 @@
 		<script src="js/components/floatingPoint.js"></script>
 		<script src="js/components/group.js"></script>
 		<script src="js/components/groupVertexList.js"></script>
-		<script src="js/components/change.js"></script>
-		<script src="js/components/changeModalWindow.js"></script>
-		<script src="js/components/changeVertexList.js"></script>
 		<script src="js/components/sidebar.js"></script>
 		<script src="js/components/sidebarExcludedNodeList.js"></script>
-		<script src="js/components/sidebarMissingComponentList.js"></script>
-		<script src="js/components/sidebarPostponedChangeList.js"></script>
 		<script src="js/components/sidebarUnconnectedNodeList.js"></script>
 		<script src="js/components/statusBar.js"></script>
 		<script src="js/components/vertex.js"></script>
@@ -52,7 +47,6 @@
 		<script src="js/graphLoader.js"></script>
 		<script src="js/graphExporter.js"></script>
 		<script src="js/graphHistory.js"></script>
-		<script src="js/javaComponentChanger.js"></script>
 		<script src="js/loader.js"></script>
 		<script src="js/markSymbol.js"></script>
 		<script src="js/utils/cookies.js"></script>
