diff --git a/libmueb.ini b/libmueb.ini
index ddf5847589263cab4becbf54b8cfd63f67313ac7..0acd1a44f9f6f5be0f832cef0bc3ee927edc46cf 100644
--- a/libmueb.ini
+++ b/libmueb.ini
@@ -14,10 +14,8 @@ color_depth=3
 
 ; Network protocol specific constants.
 [network]
-broadcast_animation_port=50001
-; Enables debug mode, sets target_address to localhost (127.0.0.1).
-debug_mode=false
-; Must be a broadcast or multicast address when debug_mode=false otherwise could be empty.
+animation_port=50001
+; Could be any valid IP(v4/v6) address: broadcast, multicast, unicast, localhost etc.
 target_address=10.6.255.255
 ; The number of windows divided by max_windows_per_datagram must be an integer.
 ; max_windows_per_datagram must be less than the number of windows.
diff --git a/src/configuration.cc b/src/configuration.cc
index 1ae26b22d864af42b2de224dcd0fcc99ab93594f..1277886d295d8dc5f791231e41d08f5a4d334c0e 100644
--- a/src/configuration.cc
+++ b/src/configuration.cc
@@ -52,6 +52,11 @@ Configuration::Configuration() {
   quint32 window_byte_size = (color_depth_ >= 3 && color_depth_ < 5)
                                  ? pixels_per_window * kRgbByteSize / 2
                                  : pixels_per_window * kRgbByteSize;
+  if (target_address_.isMulticast()) {
+    multicast_interface_ = QNetworkInterface::interfaceFromName(
+        settings.value("multicast_interface").toString());
+  }
+
   quint32 max_windows_per_datagram =
       settings.value("max_windows_per_datagram", windows).toUInt();
   packet_header_size_ = 2;
@@ -68,7 +73,12 @@ Configuration::Configuration() {
   if (settings.status() != QSettings::NoError || vertical_pixel_unit % 2 != 0 ||
       horizontal_pixel_unit % 2 != 0 || color_depth_ < 3 || color_depth_ > 8 ||
       animation_port_ < 0 || windows % max_windows_per_datagram != 0 ||
-      packet_size_ > 1472) {
+      packet_size_ > 1472 ||
+      (target_address_.isMulticast() && !multicast_interface_.isValid())) {
+    if (target_address_.isMulticast()) {
+      qInfo() << "[Configuration] Possible multicast interfaces:"
+              << QNetworkInterface::allInterfaces();
+    }
     qFatal("[Configuration] Configuration error aborting!");
   }
 }
@@ -109,4 +119,8 @@ quint8 Configuration::max_packet_number() const { return max_packet_number_; }
 
 quint8 Configuration::color_depth() const { return color_depth_; }
 
+QNetworkInterface Configuration::multicast_interface() const {
+  return multicast_interface_;
+}
+
 }  // namespace libmueb
diff --git a/src/configuration.h b/src/configuration.h
index e71fd7d5cdf0e2e2687a45e6fcc30b395e04ba62..3b8eeff78c3ce9c0519db656f384ba65faf1f61f 100644
--- a/src/configuration.h
+++ b/src/configuration.h
@@ -3,6 +3,7 @@
 
 #include <QHostAddress>
 #include <QImage>
+#include <QNetworkInterface>
 #include <QObject>
 #include <QSettings>
 #include <QtGlobal>
@@ -41,8 +42,11 @@ class Configuration final {
 
   quint8 color_depth() const;
 
+  QNetworkInterface multicast_interface() const;
+
  private:
   QImage frame_;
+  QNetworkInterface multicast_interface_;
   QHostAddress target_address_;
   quint32 pixels_;
   quint32 packet_header_size_;
diff --git a/src/muebreceiver.cc b/src/muebreceiver.cc
index 9092f13bd91f6d8d65fc83ce4a2b6263ca4316db..e85fe1863f6e44b5f6e3f25f01c8040b5a777a11 100644
--- a/src/muebreceiver.cc
+++ b/src/muebreceiver.cc
@@ -64,13 +64,9 @@ void MuebReceiver::ReadPendingDatagrams() {
       // Uncompress 1 byte into 2 color components
       if (d->configuration_.color_depth() < 5) {
         for (auto &i : data) {
-          *frame_begin = i & 0xf0;
-          *frame_begin <<=
-              Configuration::kFactor - d->configuration_.color_depth();
+          *frame_begin = (i & 0xf0) << Configuration::kFactor - d->configuration_.color_depth();
           frame_begin++;
-          *frame_begin = (i & 0x0f) << Configuration::kFactor;
-          *frame_begin <<=
-              Configuration::kFactor - d->configuration_.color_depth();
+          *frame_begin = (i & 0x0f) << (Configuration::kFactor + Configuration::kFactor - d->configuration_.color_depth());
           frame_begin++;
         }
         // No compression
diff --git a/src/muebreceiver_p.h b/src/muebreceiver_p.h
index 81a8448f86cb8065fcd88973e6de2d982113f151..4faaf8557010118ac508ce6560a45d3a03da4e62 100644
--- a/src/muebreceiver_p.h
+++ b/src/muebreceiver_p.h
@@ -27,7 +27,8 @@ class MuebReceiverPrivate {
         QAbstractSocket::ShareAddress | QAbstractSocket::ReuseAddressHint);
 
     if (configuration_.target_address().isMulticast()) {
-      socket_.joinMulticastGroup(configuration_.target_address());
+      socket_.joinMulticastGroup(configuration_.target_address(),
+                                 configuration_.multicast_interface());
     }
 
     QObject::connect(&socket_, &QUdpSocket::readyRead, receiver,
diff --git a/src/muebtransmitter_p.h b/src/muebtransmitter_p.h
index 648027842640c1d96e68fdc5bdf205b322937e50..b267616ab8b322ceadb577e83c4011a09e0c86b2 100644
--- a/src/muebtransmitter_p.h
+++ b/src/muebtransmitter_p.h
@@ -23,6 +23,8 @@ class MuebTransmitterPrivate {
         datagram_(QByteArray(), configuration_.target_address(),
                   configuration_.animation_port()),
         q_ptr(transmitter) {
+    socket_.setMulticastInterface(configuration_.multicast_interface());
+
     qInfo().noquote()
         << QString("[MuebTransmitter] UDP Socket will send frame to %2:%3")
                .arg(configuration_.target_address().toString())