public void MDeleteDirectory(Message msg, int opID) {
		String filePath = msg.filePath;
		if (NamespaceMap.containsKey(filePath)) {
			// now that have the node in the NamespaceTree, you iterate through
			// it's children
			if(AddExclusiveParentLocks(filePath, opID))
			{
				if (NamespaceMap.get(filePath).children.size() > 0) {
					// recursively going through the tree and deleting all
					// files/directories below
					deleteAllChildNodes(filePath, msg);
				}

				String[] tokens = filePath.split(File.pathSeparator);
				String parentPath = tokens[0];
				for(int i=1;i<tokens.length-1;i++)
				{
					parentPath = parentPath + "\\" + tokens[i]; 
				}

				for (Map.Entry<String, NamespaceNode> entry : NamespaceMap.entrySet())
				{
					for(int i=0;i<entry.getValue().children.size();i++)
					{
						if(entry.getValue().children.get(i).contains(parentPath))
						{
							entry.getValue().children.remove(i);
						}
					}
				}

				// finally delete directory wanted to delete
				NamespaceMap.remove(filePath);


				tfsLogger.LogMsg("Deleted directory and all directories/files below " + filePath);

				ClearChunkServerMapFile();
				ClearNamespaceMapFile();

				synchronized(chunkServerMap) {
					for (Map.Entry<String, ChunkMetadata> entry : chunkServerMap.entrySet())
					{
						WritePersistentChunkServerMap(entry.getKey(),entry.getValue());
					}
				}
				synchronized(NamespaceMap) {
					for (Map.Entry<String, NamespaceNode> entry : NamespaceMap.entrySet())
					{
						WritePersistentNamespaceMap(entry.getKey(),entry.getValue());
					}
				}
				SendSuccessMessageToClient(msg);
			}
			else
			{
				SendErrorMessageToClient(msg);
				return;
			}

		}
	}