private boolean addMolecule(Point3f p) {
		if (!model.contains(p))
			return false;
		int n0 = model.getAtomCount();
		int nRbond0 = model.getRBondCount();
		int nAbond0 = model.getABondCount();
		int nTbond0 = model.getTBondCount();
		if (!model.importMolecule(currentMoleculeToAdd, p)) {
			errorReminder.show(ErrorReminder.OBJECT_OVERLAP);
			return false;
		}
		int n1 = model.getAtomCount();
		Atom a;
		for (int i = n0; i < n1; i++) {
			a = model.getAtom(i);
			viewer.addAtom(a, a.getElementNumber(), a.getSymbol(), 0, a.getCharge(), a.getRx(), a.getRy(), a.getRz(),
					0, 0, 0, a);
		}
		int nRbond1 = model.getRBondCount();
		if (nRbond1 > nRbond0) {
			RBond rbond;
			for (int i = nRbond0; i < nRbond1; i++) {
				rbond = model.getRBond(i);
				viewer.addRBond(rbond.getAtom1(), rbond.getAtom2());
			}
		}
		int nAbond1 = model.getABondCount();
		if (nAbond1 > nAbond0) {
			ABond abond;
			for (int i = nAbond0; i < nAbond1; i++) {
				abond = model.getABond(i);
				viewer.addABond(abond.getAtom1().getIndex(), abond.getAtom2().getIndex(), abond.getAtom3().getIndex());
			}
		}
		int nTbond1 = model.getTBondCount();
		if (nTbond1 > nTbond0) {
			TBond tbond;
			for (int i = nTbond0; i < nTbond1; i++) {
				tbond = model.getTBond(i);
				viewer.addTBond(tbond.getAtom1().getIndex(), tbond.getAtom2().getIndex(), tbond.getAtom3().getIndex(),
						tbond.getAtom4().getIndex());
			}
		}
		if (n0 == 0) {
			storeCurrentOrientation();
			renderModel(false);
		}
		else {
			viewer.setTainted(true);
		}
		model.notifyChange();
		return true;
	}