diff --git a/src/dehacked.c b/src/dehacked.c
index 9529486ae3dd239791490287df7a45ad4fd446a7..a15d4cea1698da3eefb4990e43e79f8131273506 100644
--- a/src/dehacked.c
+++ b/src/dehacked.c
@@ -627,6 +627,8 @@ static void readfreeslots(MYFILE *f)
 			// TODO: Name too long (truncated) warnings.
 			if (fastcmp(type, "SFX"))
 				S_AddSoundFx(word, false, 0, false);
+			else if (fastcmp(type, "MUS")) 
+                S_AddMusic(word, -1);	
 			else if (fastcmp(type, "SPR"))
 			{
 				for (i = SPR_FIRSTFREESLOT; i <= SPR_LASTFREESLOT; i++)
@@ -3454,6 +3456,19 @@ static void DEH_LoadDehackedFile(MYFILE *f, UINT16 wad)
 					}
 					DEH_WriteUndoline(word, word2, UNDO_HEADER);
 				}
+				else if (fastcmp(word, "MUSIC"))
+				{
+					if (i == 0 && word2[0] != '0') // If word2 isn't a number
+						i = get_mus(word2); // find a sound by name
+					if (i < NUMMUSIC && i >= 0)
+						readmusic(f, i, savemusicnames);
+					else
+					{
+						deh_warning("Music %d out of range (0 - %d)", i, NUMMUSIC-1);
+						ignorelines(f);
+					}
+					DEH_WriteUndoline(word, word2, UNDO_HEADER);
+				}
 /*				else if (fastcmp(word, "SPRITE"))
 				{
 					if (i < NUMSPRITES && i >= 0)
@@ -8191,6 +8206,17 @@ static inline int lib_freeslot(lua_State *L)
 			} else
 				return r;
 		}
+		else if (fastcmp(type, "MUS")) {
+			musicenum_t music;
+			strlwr(word);
+			CONS_Printf("Music mus_%s allocated.\n",word);
+			music = S_AddMusic(word, -1);
+			if (music != mus_None) {
+				lua_pushinteger(L, music);
+				r++;
+			} else
+				return r;
+		}
 		else if (fastcmp(type, "SPR"))
 		{
 			char wad;
diff --git a/src/sounds.h b/src/sounds.h
index a2650b378b9cff5cabcd4a95f02c54a67a4ce72d..04e729db835ca4b895618bf018bca4e468a82cc5 100644
--- a/src/sounds.h
+++ b/src/sounds.h
@@ -1647,6 +1647,7 @@ typedef enum
 
 void S_InitRuntimeSounds(void);
 sfxenum_t S_AddSoundFx(const char *name, boolean singular, INT32 flags, boolean skinsound);
+musicenum_t S_AddMusic(const char *name, INT32 dummyval);
 void S_RemoveSoundFx(sfxenum_t id);
 
 #endif