private static Product getProduct(Serializable productID)
	{
		final Serializable productIDCopy = productID;
		Product result;
		synchronized (AutoAppro.products)
		{
			if ((result = AutoAppro.products.get(productID)) == null)
			{
				/* Try to find another that has a similar name */
				for (Product p : AutoAppro.products.values())
				{
					if (SimilarityChecker.isSimilarDel(productID.toString(), p.toString(), SIMILARITY_CHECK_ERROR))
					{
						msgStr = lang("sim_content1") + " " + productID.toString() + "\n" +
								lang("sim_content2") + " " + p.toString();
						while ((msgStr != null) && (!msgStr.equals("yes")))
						{
							try {
								SwingUtilities.invokeAndWait(askSimilar);
							} catch (Exception e) {}
						}
						if (msgStr != null)
						{
							Product newProduct = new Product();
							newProduct.supplierID = productID;
							newProduct.type = p.type;
							newProduct.barID = p.barID;
							newProduct.mult = p.mult;
							AutoAppro.products.put(productID, newProduct);
							AutoAppro.productsModified = true;
							try {
								SwingUtilities.invokeAndWait(new Runnable() {
									@Override
									public void run()
									{
										updateProducts();
									}
								});
							} catch (Exception e) {
								e.printStackTrace();
							}
							return newProduct;
						}
					}
				}
				/* Else, ask */
				SwingUtilities.invokeLater(new Runnable() {
					@Override
					public void run()
					{
						editProduct(productIDCopy, null);
					}
				});
				productEditLock.lock();
				productEditCondition.awaitUninterruptibly();
				productEditLock.unlock();
				try {
					SwingUtilities.invokeAndWait(new Runnable() {
						@Override
						public void run()
						{
							updateProducts();
						}
					});
				} catch (Exception e) {
					e.printStackTrace();
				}
				result = AutoAppro.products.get(productID);
			}
		}
		return result;
	}