private void duplicateMolecule() {
		if (!(selectedComponent instanceof Molecule))
			return;
		if (model.getAtomCount() + ((Molecule) selectedComponent).getAtomCount() > MolecularModel.SIZE) {
			errorReminder.show(ErrorReminder.EXCEED_CAPACITY);
			return;
		}
		int nRbond0 = model.getRBondCount();
		int nAbond0 = model.getABondCount();
		int nTbond0 = model.getTBondCount();
		newMolecule = ((Molecule) selectedComponent).duplicate(model);
		Atom a;
		String symbol;
		for (int i = 0; i < newMolecule.getAtomCount(); i++) {
			a = newMolecule.getAtom(i);
			symbol = a.getSymbol();
			viewer.addAtom(a, a.getElementNumber(), symbol, 0, a.getCharge(), a.getRx(), a.getRy(), a.getRz(), 0, 0, 0,
					a);
			if (a.isGenericParticle()) {
				viewer.setAtomSize(a.getIndex(), model.getElementSigma(symbol) * 1000);
				viewer.setAtomColor(a.getIndex(), getElementArgb(symbol));
			}
		}
		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());
			}
		}
		viewer.setTainted(true);
	}