void removeSelectedArea() {

		super.removeSelectedArea();

		List lay = removeSelectedLayeredComponents();
		List obs = removeSelectedObstacles();
		List<Integer> atm = null;
		List<RadialBond> rbd = null;

		// remove any atoms in the selected area
		for (int k = 0; k < nAtom; k++) {
			if (selectedArea.contains(atom[k].getRx(), atom[k].getRy())) {
				if (atm == null)
					atm = new ArrayList<Integer>();
				atm.add(k);
			}
		}

		// remove any molecular surfaces intersecting the selected area
		Molecule mol;
		Integer i;
		synchronized (molecules.getSynchronizationLock()) {
			for (Iterator it = molecules.iterator(); it.hasNext();) {
				mol = (Molecule) it.next();
				if (mol instanceof MolecularObject) {
					if (mol.intersects(selectedArea)) {
						for (Iterator i2 = mol.iterator(); i2.hasNext();) {
							i = ((Atom) i2.next()).getIndex();
							if (atm == null)
								atm = new ArrayList<Integer>();
							if (!atm.contains(i))
								atm.add(i);
						}
					}
				}
			}
		}

		boolean atomRemoved = atm != null && !atm.isEmpty();
		boolean obstacleRemoved = obs != null && !obs.isEmpty();
		boolean layerRemoved = lay != null && !lay.isEmpty();

		if (atomRemoved) {
			removeMarkedAtoms(atm);
			model.setNumberOfParticles(nAtom); // is this needed?
		}

		// remove any radial bond that intersects with the area
		RadialBond rBond;
		synchronized (bonds.getSynchronizationLock()) {
			for (Iterator it = bonds.iterator(); it.hasNext();) {
				rBond = (RadialBond) it.next();
				if (rBond.intersects(selectedArea)) {
					if (rbd == null)
						rbd = new ArrayList<RadialBond>();
					rbd.add(rBond);
					it.remove();
					removeAssociatedBends(rBond);
				}
			}
		}
		boolean rbondRemoved = rbd != null && !rbd.isEmpty();
		if (!atomRemoved && rbondRemoved) {
			MoleculeCollection.sort(model);
		}

		// if anything is removed, notify Page and UndoManager
		if (atomRemoved || obstacleRemoved || layerRemoved || rbondRemoved) {
			model.notifyChange();
			if (!doNotFireUndoEvent) {
				RectangularObstacle[] r2 = null;
				if (obstacleRemoved && obs != null) {
					int n = obs.size();
					if (n > 0) {
						r2 = new RectangularObstacle[n];
						for (int j = 0; j < n; j++)
							r2[j] = (RectangularObstacle) obs.get(j);
					}
				}
				Layered[] i2 = null;
				if (layerRemoved && lay != null) {
					int n = lay.size();
					if (n > 0) {
						i2 = new Layered[n];
						for (int j = 0; j < n; j++)
							i2[j] = (Layered) lay.get(j);
					}
				}
				model.getUndoManager().undoableEditHappened(new UndoableEditEvent(model, new UndoableDeletion(UndoAction.BLOCK_REMOVE, atm != null ? atm.size() : 0, r2, i2)));
				updateUndoUIComponents();
			}
		}
		selectedArea.setSize(0, 0);
		repaint();

	}