Index: b/scripts/murmur.ini
===================================================================
--- a/scripts/murmur.ini
+++ b/scripts/murmur.ini
@@ -86,6 +86,10 @@
 # Maximum number of concurrent clients allowed.
 users=100
 
+# Amount of users with Opus support needed to force Opus usage, in percent.
+# 0 = Always enable Opus, 100 = enable Opus if it's supported by all clients.
+#opusthreshold=1
+
 # Regular expression used to validate channel names
 # (note that you have to escape backslashes with \ )
 #channelname=[ \\-=\\w\\#\\[\\]\\{\\}\\(\\)\\@\\|]+
Index: b/src/murmur/Messages.cpp
===================================================================
--- a/src/murmur/Messages.cpp
+++ b/src/murmur/Messages.cpp
@@ -393,7 +393,9 @@
 		mpsug.set_positional(qvSuggestPositional.toBool());
 	if (! qvSuggestPushToTalk.isNull())
 		mpsug.set_push_to_talk(qvSuggestPushToTalk.toBool());
-	sendMessage(uSource, mpsug);
+	if (mpsug.ByteSize() > 0) {
+		sendMessage(uSource, mpsug);
+	}
 
 	log(uSource, "Authenticated");
 
Index: b/src/murmur/Meta.cpp
===================================================================
--- a/src/murmur/Meta.cpp
+++ b/src/murmur/Meta.cpp
@@ -81,6 +81,8 @@
 	uiUid = uiGid = 0;
 #endif
 
+	iOpusThreshold = 1;
+
 	qrUserName = QRegExp(QLatin1String("[-=\\w\\[\\]\\{\\}\\(\\)\\@\\|\\.]+"));
 	qrChannelName = QRegExp(QLatin1String("[ \\-=\\w\\#\\[\\]\\{\\}\\(\\)\\@\\|]+"));
 
@@ -283,6 +285,8 @@
 	if (qvSuggestPushToTalk.toString().trimmed().isEmpty())
 		qvSuggestPushToTalk = QVariant();
 
+	iOpusThreshold = qsSettings->value("opusthreshold", iOpusThreshold).toInt();
+
 #ifdef Q_OS_UNIX
 	qsName = qsSettings->value("uname").toString();
 	if (geteuid() == 0) {
@@ -441,6 +445,7 @@
 	qmConfig.insert(QLatin1String("suggestversion"), qvSuggestVersion.isNull() ? QString() : qvSuggestVersion.toString());
 	qmConfig.insert(QLatin1String("suggestpositional"), qvSuggestPositional.isNull() ? QString() : qvSuggestPositional.toString());
 	qmConfig.insert(QLatin1String("suggestpushtotalk"), qvSuggestPushToTalk.isNull() ? QString() : qvSuggestPushToTalk.toString());
+	qmConfig.insert(QLatin1String("opusthreshold"), QString::number(iOpusThreshold));
 }
 
 Meta::Meta() {
Index: b/src/murmur/Meta.h
===================================================================
--- a/src/murmur/Meta.h
+++ b/src/murmur/Meta.h
@@ -60,6 +60,7 @@
 	bool bRememberChan;
 	int iMaxTextMessageLength;
 	int iMaxImageMessageLength;
+	int iOpusThreshold;
 	bool bAllowHTML;
 	QString qsPassword;
 	QString qsWelcomeText;
Index: b/src/murmur/Server.cpp
===================================================================
--- a/src/murmur/Server.cpp
+++ b/src/murmur/Server.cpp
@@ -331,6 +331,7 @@
 	qvSuggestVersion = Meta::mp.qvSuggestVersion;
 	qvSuggestPositional = Meta::mp.qvSuggestPositional;
 	qvSuggestPushToTalk = Meta::mp.qvSuggestPushToTalk;
+	iOpusThreshold = Meta::mp.iOpusThreshold;
 
 	QString qsHost = getConf("host", QString()).toString();
 	if (! qsHost.isEmpty()) {
@@ -393,6 +394,8 @@
 	if (qvSuggestPushToTalk.toString().trimmed().isEmpty())
 		qvSuggestPushToTalk = QVariant();
 
+	iOpusThreshold = getConf("opusthreshold", iOpusThreshold).toInt();
+
 	qrUserName=QRegExp(getConf("username", qrUserName.pattern()).toString());
 	qrChannelName=QRegExp(getConf("channelname", qrChannelName.pattern()).toString());
 }
@@ -503,6 +506,8 @@
 		qvSuggestPositional = ! v.isNull() ? (v.isEmpty() ? QVariant() : v) : Meta::mp.qvSuggestPositional;
 	else if (key == "suggestpushtotalk")
 		qvSuggestPushToTalk = ! v.isNull() ? (v.isEmpty() ? QVariant() : v) : Meta::mp.qvSuggestPushToTalk;
+	else if (key == "opusthreshold")
+		iOpusThreshold = i ? i : Meta::mp.iOpusThreshold;
 }
 
 #ifdef USE_BONJOUR
@@ -1648,8 +1653,9 @@
 
 	if (! users)
 		return;
-		
-	bool allHasOpus = (opus == users);
+
+	// Enable Opus if the number of users with Opus is higher than the threshold
+	bool enableOpus = ((opus * 100 / users) >= iOpusThreshold);
 
 	// Find the best possible codec most users support
 	int version = 0;
@@ -1680,17 +1686,17 @@
 			iCodecAlpha = version;
 		else
 			iCodecBeta = version;
-	} else if (bOpus == allHasOpus) {
+	} else if (bOpus == enableOpus) {
 		return;
 	}
-	
-	bOpus = allHasOpus;
-	
+
+	bOpus = enableOpus;
+
 	MumbleProto::CodecVersion mpcv;
 	mpcv.set_alpha(iCodecAlpha);
 	mpcv.set_beta(iCodecBeta);
 	mpcv.set_prefer_alpha(bPreferAlpha);
-	mpcv.set_opus(allHasOpus);
+	mpcv.set_opus(bOpus);
 	sendAll(mpcv);
 
 	log(QString::fromLatin1("CELT codec switch %1 %2 (prefer %3) (Opus %4)").arg(iCodecAlpha,0,16).arg(iCodecBeta,0,16).arg(bPreferAlpha ? iCodecAlpha : iCodecBeta,0,16).arg(bOpus));
Index: b/src/murmur/Server.h
===================================================================
--- a/src/murmur/Server.h
+++ b/src/murmur/Server.h
@@ -132,6 +132,7 @@
 		bool bRememberChan;
 		int iMaxTextMessageLength;
 		int iMaxImageMessageLength;
+		int iOpusThreshold;
 		bool bAllowHTML;
 		QString qsPassword;
 		QString qsWelcomeText;
