diff --git a/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java b/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java
index 446b17610..432af0302 100644
--- a/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java
+++ b/Essentials/src/com/earth2me/essentials/EssentialsPlayerListener.java
@@ -77,7 +77,7 @@ public class EssentialsPlayerListener implements Listener {
         if (user.isMuted()) {
             event.setCancelled(true);
             user.sendMessage(tl("voiceSilenced"));
-            LOGGER.info(tl("mutedUserSpeaks", user.getName()));
+            LOGGER.info(tl("mutedUserSpeaks", user.getName(), event.getMessage()));
         }
         try {
             final Iterator<Player> it = event.getRecipients().iterator();
@@ -408,28 +408,34 @@ public class EssentialsPlayerListener implements Listener {
     public void onPlayerCommandPreprocess(final PlayerCommandPreprocessEvent event) {
         final Player player = event.getPlayer();
         final String cmd = event.getMessage().toLowerCase(Locale.ENGLISH).split(" ")[0].replace("/", "").toLowerCase(Locale.ENGLISH);
-        if (ess.getUser(player).isMuted() && (ess.getSettings().getMuteCommands().contains(cmd) || ess.getSettings().getMuteCommands().contains("*"))) {
-            event.setCancelled(true);
-            player.sendMessage(tl("voiceSilenced"));
-            LOGGER.info(tl("mutedUserSpeaks", player.getName()));
-            return;
-        }
-        
+
         PluginCommand pluginCommand = ess.getServer().getPluginCommand(cmd);
-        
+
         if (ess.getSettings().getSocialSpyCommands().contains(cmd) || ess.getSettings().getSocialSpyCommands().contains("*")) {
             if (pluginCommand == null
-                || (!pluginCommand.getName().equals("msg") && !pluginCommand.getName().equals("r"))) { // /msg and /r are handled in SimpleMessageRecipient
+                    || (!pluginCommand.getName().equals("msg") && !pluginCommand.getName().equals("r"))) { // /msg and /r are handled in SimpleMessageRecipient
                 User user = ess.getUser(player);
                 if (!user.isAuthorized("essentials.chat.spy.exempt")) {
                     for (User spyer : ess.getOnlineUsers()) {
                         if (spyer.isSocialSpyEnabled() && !player.equals(spyer.getBase())) {
-                            spyer.sendMessage(tl("socialSpyPrefix") + player.getDisplayName() + ": " + event.getMessage());
+                            if (user.isMuted() && ess.getSettings().getSocialSpyListenMutedPlayers()) {
+                                spyer.sendMessage(tl("socialSpyMutedPrefix") + player.getDisplayName() + ": " + event.getMessage());
+                            }
+                            else {
+                                spyer.sendMessage(tl("socialSpyPrefix") + player.getDisplayName() + ": " + event.getMessage());
+                            }
                         }
                     }
                 }
             }
         }
+
+        if (ess.getUser(player).isMuted() && (ess.getSettings().getMuteCommands().contains(cmd) || ess.getSettings().getMuteCommands().contains("*"))) {
+            event.setCancelled(true);
+            player.sendMessage(tl("voiceSilenced"));
+            LOGGER.info(tl("mutedUserSpeaks", player.getName(), event.getMessage()));
+            return;
+        }
         
         boolean broadcast = true; // whether to broadcast the updated activity
         boolean update = true; // Only modified when the command is afk
diff --git a/Essentials/src/com/earth2me/essentials/ISettings.java b/Essentials/src/com/earth2me/essentials/ISettings.java
index 4e3376370..bad107486 100644
--- a/Essentials/src/com/earth2me/essentials/ISettings.java
+++ b/Essentials/src/com/earth2me/essentials/ISettings.java
@@ -54,6 +54,8 @@ public interface ISettings extends IConf {
 
     Set<String> getSocialSpyCommands();
 
+    boolean getSocialSpyListenMutedPlayers();
+
     Set<String> getMuteCommands();
 
     Map<String, Object> getKit(String name);
diff --git a/Essentials/src/com/earth2me/essentials/Settings.java b/Essentials/src/com/earth2me/essentials/Settings.java
index 39b41403f..05f0239ac 100644
--- a/Essentials/src/com/earth2me/essentials/Settings.java
+++ b/Essentials/src/com/earth2me/essentials/Settings.java
@@ -281,6 +281,11 @@ public class Settings implements net.ess3.api.ISettings {
         return socialSpyCommands;
     }
 
+    @Override
+    public boolean getSocialSpyListenMutedPlayers() {
+        return config.getBoolean("socialspy-listen-muted-players", true);
+    }
+
     private Set<String> muteCommands = new HashSet<String>();
 
     private Set<String> _getMuteCommands() {
diff --git a/Essentials/src/com/earth2me/essentials/messaging/SimpleMessageRecipient.java b/Essentials/src/com/earth2me/essentials/messaging/SimpleMessageRecipient.java
index a85dda074..865adb4e4 100644
--- a/Essentials/src/com/earth2me/essentials/messaging/SimpleMessageRecipient.java
+++ b/Essentials/src/com/earth2me/essentials/messaging/SimpleMessageRecipient.java
@@ -95,8 +95,12 @@ public class SimpleMessageRecipient implements IMessageRecipient {
                         if (onlineUser.isSocialSpyEnabled()
                             // Don't send socialspy messages to message sender/receiver to prevent spam
                             && !onlineUser.equals(senderUser)
-                            && !onlineUser.equals(recipient)) {  
-                            onlineUser.sendMessage(tl("socialSpyPrefix") + tl("msgFormat", getDisplayName(), recipient.getDisplayName(), message));
+                            && !onlineUser.equals(recipient)) {
+                            if (senderUser.isMuted() && ess.getSettings().getSocialSpyListenMutedPlayers()) {
+                                onlineUser.sendMessage(tl("socialMutedSpyPrefix") + tl("msgFormat", getDisplayName(), recipient.getDisplayName(), message));
+                            } else {
+                                onlineUser.sendMessage(tl("socialSpyPrefix") + tl("msgFormat", getDisplayName(), recipient.getDisplayName(), message));
+                            }
                         }
                     }
                 }
diff --git a/Essentials/src/config.yml b/Essentials/src/config.yml
index 3834950c5..31bfa19ad 100644
--- a/Essentials/src/config.yml
+++ b/Essentials/src/config.yml
@@ -171,6 +171,10 @@ socialspy-commands:
   - ewhisper
   - pm
 
+# Whether the private and public messages from muted players should appear in the social spy.
+# If so, they will be differentiated from those sent by normal players.
+socialspy-listen-muted-players: true
+
 # Mute Commands
 # These commands will be disabled when a player is muted.
 # Use '*' to disable every command.
diff --git a/Essentials/src/messages.properties b/Essentials/src/messages.properties
index 4ccbee0ae..02e0accd4 100644
--- a/Essentials/src/messages.properties
+++ b/Essentials/src/messages.properties
@@ -257,7 +257,7 @@ muteNotify=\u00a7c{0} \u00a76has muted player \u00a7c{1}\u00a76.
 muteNotifyFor=\u00a7c{0} \u00a76has muted player \u00a7c{1}\u00a76 for\u00a7c {2}\u00a76.
 mutedPlayer=\u00a76Player\u00a7c {0} \u00a76muted.
 mutedPlayerFor=\u00a76Player\u00a7c {0} \u00a76muted for\u00a7c {1}\u00a76.
-mutedUserSpeaks={0} tried to speak, but is muted.
+mutedUserSpeaks={0} tried to speak, but is muted: {1}
 nearbyPlayers=\u00a76Players nearby\:\u00a7r {0}
 negativeBalanceError=\u00a74User is not allowed to have a negative balance.
 nickChanged=\u00a76Nickname changed.
@@ -414,6 +414,7 @@ similarWarpExist=\u00a74A warp with a similar name already exists.
 slimeMalformedSize=\u00a74Malformed size.
 socialSpy=\u00a76SocialSpy for \u00a7c{0}\u00a76\: \u00a7c{1}
 socialSpyPrefix=\u00a7f[\u00a76SS\u00a7f] \u00a7r
+socialSpyMutedPrefix==\u00a7f[\u00a76SS\u00a7f] \u00a77(muted) \u00a7r
 soloMob=\u00a74That mob likes to be alone.
 spawnSet=\u00a76Spawn location set for group\u00a7c {0}\u00a76.
 spawned=spawned