private boolean pasteMoleculeAt(int x, int y) {

		Molecule oldMol = (Molecule) pasteBuffer;
		int oldNOA = nAtom;
		Molecule mol = oldMol.duplicate();
		if (mol == null)
			return false;
		nAtom += mol.size();
		mol.translateTo(x, y);

		if (mol.isOutside(boundary)) {
			errorReminder.show(ErrorReminder.OUT_OF_BOUND);
			nAtom = oldNOA;
			bonds.removeAll(mol.getBonds());
			bends.removeAll(mol.getBends());
			return false;
		}

		if (intersects(mol)) {
			errorReminder.show(ErrorReminder.OBJECT_OVERLAP);
			nAtom = oldNOA;
			bonds.removeAll(mol.getBonds());
			bends.removeAll(mol.getBends());
			return false;
		}

		/* move the index to the latest */
		if (oldMol instanceof MolecularObject) {
			if (oldMol instanceof CurvedSurface) {
				CurvedSurface cs = new CurvedSurface(mol);
				cs.setModel(model);
				cs.setSelected(true);
				molecules.add(cs);
			} else if (oldMol instanceof CurvedRibbon) {
				CurvedRibbon cr = new CurvedRibbon(mol);
				cr.setModel(model);
				cr.setSelected(true);
				molecules.add(cr);
			}
		} else {
			mol.setSelected(true);
			molecules.add(mol);
		}
		if (!model.getRecorderDisabled()) {
			int n = model.getMovie().getCapacity();
			for (int i = oldNOA; i < nAtom; i++)
				atom[i].initializeMovieQ(n);
		}
		model.setNumberOfParticles(nAtom);
		model.notifyChange();
		repaint();
		return true;

	}