diff --git a/scripts/murmur.ini b/scripts/murmur.ini
index f941531..87d49fd 100644
--- a/scripts/murmur.ini
+++ b/scripts/murmur.ini
@@ -86,6 +86,10 @@ bandwidth=72000
 # 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=100
+
 # Regular expression used to validate channel names
 # (note that you have to escape backslashes with \ )
 #channelname=[ \\-=\\w\\#\\[\\]\\{\\}\\(\\)\\@\\|]+
diff --git a/src/murmur/Messages.cpp b/src/murmur/Messages.cpp
index 0d7a5ed..4b6be72 100644
--- a/src/murmur/Messages.cpp
+++ b/src/murmur/Messages.cpp
@@ -391,7 +391,9 @@ void Server::msgAuthenticate(ServerUser *uSource, MumbleProto::Authenticate &msg
 		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");
 
diff --git a/src/murmur/Meta.cpp b/src/murmur/Meta.cpp
index dc55b3a..4333ae2 100644
--- a/src/murmur/Meta.cpp
+++ b/src/murmur/Meta.cpp
@@ -81,6 +81,8 @@ MetaParams::MetaParams() {
 	uiUid = uiGid = 0;
 #endif
 
+	iOpusThreshold = 100;
+
 	qrUserName = QRegExp(QLatin1String("[-=\\w\\[\\]\\{\\}\\(\\)\\@\\|\\.]+"));
 	qrChannelName = QRegExp(QLatin1String("[ \\-=\\w\\#\\[\\]\\{\\}\\(\\)\\@\\|]+"));
 
@@ -283,6 +285,8 @@ void MetaParams::read(QString fname) {
 	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 @@ void MetaParams::read(QString fname) {
 	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() {
diff --git a/src/murmur/Meta.h b/src/murmur/Meta.h
index 7ed0595..669e76c 100644
--- a/src/murmur/Meta.h
+++ b/src/murmur/Meta.h
@@ -60,6 +60,7 @@ struct MetaParams {
 	bool bRememberChan;
 	int iMaxTextMessageLength;
 	int iMaxImageMessageLength;
+	int iOpusThreshold;
 	bool bAllowHTML;
 	QString qsPassword;
 	QString qsWelcomeText;
diff --git a/src/murmur/Server.cpp b/src/murmur/Server.cpp
index 547d699..f015bac 100644
--- a/src/murmur/Server.cpp
+++ b/src/murmur/Server.cpp
@@ -331,6 +331,7 @@ void Server::readParams() {
 	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 @@ void Server::readParams() {
 	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 @@ void Server::setLiveConf(const QString &key, const QString &value) {
 		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 @@ void Server::recheckCodecVersions() {
 
 	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 @@ void Server::recheckCodecVersions() {
 			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));
diff --git a/src/murmur/Server.h b/src/murmur/Server.h
index 788eb89..66025de 100644
--- a/src/murmur/Server.h
+++ b/src/murmur/Server.h
@@ -132,6 +132,7 @@ class Server : public QThread {
 		bool bRememberChan;
 		int iMaxTextMessageLength;
 		int iMaxImageMessageLength;
+		int iOpusThreshold;
 		bool bAllowHTML;
 		QString qsPassword;
 		QString qsWelcomeText;
--- a/scripts/murmur.ini.system
+++ b/scripts/murmur.ini.system
@@ -86,6 +86,10 @@ bandwidth=72000
 # 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=100
+
 # Regular expression used to validate channel names
 # (note that you have to escape backslashes with \ )
 #channelname=[ \\-=\\w\\#\\[\\]\\{\\}\\(\\)\\@\\|]+
