diff --git a/CSharp/Plugins/UniversalEditor.Plugins.FileSystem/DataFormats/FileSystem/MFD/MFDDataFormat.cs b/CSharp/Plugins/UniversalEditor.Plugins.FileSystem/DataFormats/FileSystem/MFD/MFDDataFormat.cs
new file mode 100644
index 00000000..6f359dbf
--- /dev/null
+++ b/CSharp/Plugins/UniversalEditor.Plugins.FileSystem/DataFormats/FileSystem/MFD/MFDDataFormat.cs
@@ -0,0 +1,90 @@
+using System;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+using UniversalEditor.IO;
+using UniversalEditor.ObjectModels.FileSystem;
+
+namespace UniversalEditor.DataFormats.FileSystem.MFD
+{
+ public class MFDDataFormat : DataFormat
+ {
+ private static DataFormatReference _dfr = null;
+ public override DataFormatReference MakeReference()
+ {
+ if (_dfr == null)
+ {
+ _dfr = base.MakeReference();
+ _dfr.Capabilities.Add(typeof(FileSystemObjectModel), DataFormatCapabilities.All);
+ _dfr.Filters.Add("187 Ride or Die MFD archive", new string[] { "*.mfd" });
+ _dfr.Sources.Add("http://wiki.xentax.com/index.php?title=GRAF:187_Ride_Or_Die_MFD");
+ }
+ return _dfr;
+ }
+
+ protected override void LoadInternal(ref ObjectModel objectModel)
+ {
+ FileSystemObjectModel fsom = (objectModel as FileSystemObjectModel);
+ if (fsom == null) throw new ObjectModelNotSupportedException();
+
+ Reader reader = base.Accessor.Reader;
+ uint fileCount = reader.ReadUInt32();
+ for (uint i = 0; i < fileCount; i++)
+ {
+ uint fileID = reader.ReadUInt32();
+ uint offset = reader.ReadUInt32();
+ uint length = reader.ReadUInt32();
+
+ File file = new File();
+ file.Name = i.ToString().PadLeft(8, '0');
+ file.Size = length;
+ file.DataRequest += file_DataRequest;
+ file.Properties.Add("reader", reader);
+ file.Properties.Add("offset", offset);
+ file.Properties.Add("length", length);
+ fsom.Files.Add(file);
+ }
+ }
+
+ private void file_DataRequest(object sender, DataRequestEventArgs e)
+ {
+ File file = (sender as File);
+ Reader reader = (Reader)file.Properties["reader"];
+ uint offset = (uint)file.Properties["offset"];
+ uint length = (uint)file.Properties["length"];
+
+ reader.Seek(offset, SeekOrigin.Begin);
+ e.Data = reader.ReadBytes(length);
+ }
+
+ protected override void SaveInternal(ObjectModel objectModel)
+ {
+ FileSystemObjectModel fsom = (objectModel as FileSystemObjectModel);
+ if (fsom == null) throw new ObjectModelNotSupportedException();
+
+ File[] files = fsom.GetAllFiles();
+
+ Writer writer = base.Accessor.Writer;
+ writer.WriteUInt32((uint)files.Length);
+
+ uint offset = (uint)(4 + (12 * files.Length));
+ foreach (File file in files)
+ {
+ uint fileID = (uint)Array.IndexOf(files, file);
+ writer.WriteUInt32(fileID);
+
+ uint length = (uint)file.Size;
+ writer.WriteUInt32(offset);
+ writer.WriteUInt32(length);
+
+ offset += length + (length % 4);
+ }
+ foreach (File file in files)
+ {
+ writer.WriteBytes(file.GetDataAsByteArray());
+ writer.Align(4);
+ }
+ writer.Flush();
+ }
+ }
+}
diff --git a/CSharp/Plugins/UniversalEditor.Plugins.FileSystem/UniversalEditor.Plugins.FileSystem.csproj b/CSharp/Plugins/UniversalEditor.Plugins.FileSystem/UniversalEditor.Plugins.FileSystem.csproj
index c725c156..7deda0ea 100644
--- a/CSharp/Plugins/UniversalEditor.Plugins.FileSystem/UniversalEditor.Plugins.FileSystem.csproj
+++ b/CSharp/Plugins/UniversalEditor.Plugins.FileSystem/UniversalEditor.Plugins.FileSystem.csproj
@@ -96,6 +96,7 @@
+