diff --git a/code/ryzom/tools/client/ryzom_installer/src/utils.cpp b/code/ryzom/tools/client/ryzom_installer/src/utils.cpp
index e2b26a7bb..eef95553e 100644
--- a/code/ryzom/tools/client/ryzom_installer/src/utils.cpp
+++ b/code/ryzom/tools/client/ryzom_installer/src/utils.cpp
@@ -17,6 +17,10 @@
 #include "stdpch.h"
 #include "utils.h"
 
+#ifdef DEBUG_NEW
+	#define new DEBUG_NEW
+#endif
+
 QString qBytesToHumanReadable(qint64 bytes)
 {
 	static std::vector<std::string> units;
@@ -244,6 +248,66 @@ bool resolveLink(const QWidget &window, const QString &pathLink, QString &pathOb
 
 #endif
 
+QString getVersionFromExecutable(const QString &path)
+{
+	// launch executable with --version argument
+	QProcess process;
+	process.setProcessChannelMode(QProcess::MergedChannels);
+	process.start(path, QStringList() << "--version", QIODevice::ReadWrite);
+
+	if (!process.waitForStarted()) return "";
+
+	QByteArray data;
+
+	// read all output
+	while (process.waitForReadyRead()) data.append(process.readAll());
+
+	QString versionString = QString::fromUtf8(data);
+
+	// parse version from output (client)
+	QRegExp reg("([A-Za-z0-1_.]+) ((DEV|FV) ([0-9.]+))");
+	if (reg.indexIn(versionString) > -1) return reg.cap(2);
+
+	// parse version from output (other tools)
+	reg.setPattern("([A-Za-z_ ]+) ([0-9.]+)");
+	if (reg.indexIn(versionString) > -1) return reg.cap(2);
+
+#ifdef Q_OS_WIN
+	// try to parse version of executable in resources
+	DWORD verHandle = NULL;
+	uint size = 0;
+	VS_FIXEDFILEINFO *verInfo = NULL;
+
+	// get size to be allocated
+	uint32_t verSize = GetFileVersionInfoSizeW(qToWide(path), &verHandle);
+	if (!verSize) return "";
+
+	// allocate buffer
+	QScopedArrayPointer<char> verData(new char[verSize]);
+
+	// get pointer on version structure
+	if (!GetFileVersionInfoW(qToWide(path), verHandle, verSize, &verData[0])) return "";
+
+	// get pointer on version
+	if (!VerQueryValueA(&verData[0], "\\", (void**)&verInfo, &size)) return "";
+
+	// check if version is right
+	if (size && verInfo && verInfo->dwSignature == 0xfeef04bd)
+	{
+		// Doesn't matter if you are on 32 bit or 64 bit,
+		// DWORD is always 32 bits, so first two revision numbers
+		// come from dwFileVersionMS, last two come from dwFileVersionLS
+		return QString("%1.%2.%3.%4")
+			.arg((verInfo->dwFileVersionMS >> 16) & 0xffff)
+			.arg((verInfo->dwFileVersionMS >> 0) & 0xffff)
+			.arg((verInfo->dwFileVersionLS >> 16) & 0xffff)
+			.arg((verInfo->dwFileVersionLS >> 0) & 0xffff);
+	}
+#endif
+
+	return "";
+}
+
 CCOMHelper::CCOMHelper()
 {
 #ifdef Q_OS_WIN
diff --git a/code/ryzom/tools/client/ryzom_installer/src/utils.h b/code/ryzom/tools/client/ryzom_installer/src/utils.h
index c016ed8ba..1d6519a85 100644
--- a/code/ryzom/tools/client/ryzom_installer/src/utils.h
+++ b/code/ryzom/tools/client/ryzom_installer/src/utils.h
@@ -51,6 +51,8 @@ wchar_t* qToWide(const QString &str);
 bool createLink(const QString &link, const QString &name, const QString &executable, const QString &arguments, const QString &icon, const QString &workingDir);
 bool resolveLink(const QWidget &window, const QString &pathLink, QString &pathObj);
 
+QString getVersionFromExecutable(const QString &path);
+
 class CCOMHelper
 {
 	bool m_mustUninit;