diff -u -rN taglib-sharp/src/TagLib/FileTypes.cs taglib-sharp-new/src/TagLib/FileTypes.cs
--- taglib-sharp/src/TagLib/FileTypes.cs	2011-03-23 15:23:42.585311186 +0100
+++ taglib-sharp-new/src/TagLib/FileTypes.cs	2011-03-23 12:51:19.051988217 +0100
@@ -75,6 +75,7 @@
 			typeof(TagLib.Png.File),
 			typeof(TagLib.Riff.File),
 			typeof(TagLib.Tiff.Arw.File),
+			typeof(TagLib.Tiff.Orf.File),
 			typeof(TagLib.Tiff.Cr2.File),
 			typeof(TagLib.Tiff.Dng.File),
 			typeof(TagLib.Tiff.File),
diff -u -rN taglib-sharp/src/TagLib/Image/NoMetadata/File.cs taglib-sharp-new/src/TagLib/Image/NoMetadata/File.cs
--- taglib-sharp/src/TagLib/Image/NoMetadata/File.cs	2011-03-23 15:23:42.607309195 +0100
+++ taglib-sharp-new/src/TagLib/Image/NoMetadata/File.cs	2011-03-23 13:07:31.562852448 +0100
@@ -48,7 +48,6 @@
 	[SupportedMimeType("taglib/svgz", "svgz")]
 	[SupportedMimeType("image/svg+xml")]
 	[SupportedMimeType("taglib/kdc", "kdc")]    // FIXME: Not supported yet!
-	[SupportedMimeType("taglib/orf", "orf")]    // FIXME: Not supported yet!
 	[SupportedMimeType("taglib/srf", "srf")]    // FIXME: Not supported yet!
 	[SupportedMimeType("taglib/crw", "crw")]    // FIXME: Not supported yet!
 	[SupportedMimeType("taglib/mrw", "mrw")]    // FIXME: Not supported yet!
diff -u -rN taglib-sharp/src/TagLib/Tiff/Orf/File.cs taglib-sharp-new/src/TagLib/Tiff/Orf/File.cs
--- taglib-sharp/src/TagLib/Tiff/Orf/File.cs	1970-01-01 01:00:00.000000000 +0100
+++ taglib-sharp-new/src/TagLib/Tiff/Orf/File.cs	2011-03-23 15:10:45.622157544 +0100
@@ -0,0 +1,304 @@
+//
+// File.cs: Provides tagging for ORF files
+//
+// Author:
+//   Klaus Lichtenwalder (lichtenwalder@acm.org)
+//
+// Copyright (C) 2011 Klaus Lichtenwalder
+//
+// This library is free software; you can redistribute it and/or modify
+// it  under the terms of the GNU Lesser General Public License version
+// 2.1 as published by the Free Software Foundation.
+//
+// This library is distributed in the hope that it will be useful, but
+// WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+// Lesser General Public License for more details.
+//
+// You should have received a copy of the GNU Lesser General Public
+// License along with this library; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307
+// USA
+//
+
+using System;
+using System.Collections.Generic;
+
+using TagLib;
+using TagLib.Image;
+using TagLib.IFD;
+using TagLib.IFD.Tags;
+
+namespace TagLib.Tiff.Orf
+{
+
+	/// <summary>
+	///    This class extends <see cref="TagLib.Tiff.BaseTiffFile" /> to provide tagging
+	///    for ORF image files.
+	/// </summary>
+	[SupportedMimeType("taglib/orf", "orf")]
+	[SupportedMimeType("image/orf")]
+	[SupportedMimeType("image/x-olympus-orf")]
+	public class File : TagLib.Tiff.BaseTiffFile
+	{
+#region private fields
+
+		/// <summary>
+		///    The Properties of the image
+		/// </summary>
+		private Properties properties;
+		/// <summary>
+		///    Indicates if the current file is in big endian or little endian format.
+		/// </summary>
+		/// <remarks>
+		///    The method <see cref="ReadHeader()"/> must be called from a subclass to
+		///    properly initialize this property.
+		/// </remarks>
+		public new bool IsBigEndian {
+			get; private set;
+		}
+
+#endregion
+
+#region public Properties
+
+		/// <summary>
+		///    Gets the media properties of the file represented by the
+		///    current instance.
+		/// </summary>
+		/// <value>
+		///    A <see cref="TagLib.Properties" /> object containing the
+		///    media properties of the file represented by the current
+		///    instance.
+		/// </value>
+		public override TagLib.Properties Properties {
+			get { return properties; }
+		}
+
+		/// <summary>
+		///    Indicates if tags can be written back to the current file or not
+		/// </summary>
+		/// <value>
+		///    A <see cref="bool" /> which is true if tags can be written to the
+		///    current file, otherwise false.
+		/// </value>
+		public override bool Writeable {
+			get { return false; }
+		}
+
+
+#endregion
+
+#region constructors
+
+		/// <summary>
+		///    Constructs and initializes a new instance of <see
+		///    cref="File" /> for a specified path in the local file
+		///    system and specified read style.
+		/// </summary>
+		/// <param name="path">
+		///    A <see cref="string" /> object containing the path of the
+		///    file to use in the new instance.
+		/// </param>
+		/// <param name="propertiesStyle">
+		///    A <see cref="ReadStyle" /> value specifying at what level
+		///    of accuracy to read the media properties, or <see
+		///    cref="ReadStyle.None" /> to ignore the properties.
+		/// </param>
+		/// <exception cref="ArgumentNullException">
+		///    <paramref name="path" /> is <see langword="null" />.
+		/// </exception>
+		public File (string path, ReadStyle propertiesStyle)
+			: this (new File.LocalFileAbstraction (path),
+				propertiesStyle)
+		{
+		}
+
+		/// <summary>
+		///    Constructs and initializes a new instance of <see
+		///    cref="File" /> for a specified path in the local file
+		///    system.
+		/// </summary>
+		/// <param name="path">
+		///    A <see cref="string" /> object containing the path of the
+		///    file to use in the new instance.
+		/// </param>
+		/// <exception cref="ArgumentNullException">
+		///    <paramref name="path" /> is <see langword="null" />.
+		/// </exception>
+		public File (string path) : this (path, ReadStyle.Average)
+		{
+		}
+
+		/// <summary>
+		///    Constructs and initializes a new instance of <see
+		///    cref="File" /> for a specified file abstraction and
+		///    specified read style.
+		/// </summary>
+		/// <param name="abstraction">
+		///    A <see cref="IFileAbstraction" /> object to use when
+		///    reading from and writing to the file.
+		/// </param>
+		/// <param name="propertiesStyle">
+		///    A <see cref="ReadStyle" /> value specifying at what level
+		///    of accuracy to read the media properties, or <see
+		///    cref="ReadStyle.None" /> to ignore the properties.
+		/// </param>
+		/// <exception cref="ArgumentNullException">
+		///    <paramref name="abstraction" /> is <see langword="null"
+		///    />.
+		/// </exception>
+		public File (File.IFileAbstraction abstraction,
+		             ReadStyle propertiesStyle) : base (abstraction)
+		{
+			Read (propertiesStyle);
+		}
+
+		/// <summary>
+		///    Constructs and initializes a new instance of <see
+		///    cref="File" /> for a specified file abstraction.
+		/// </summary>
+		/// <param name="abstraction">
+		///    A <see cref="IFileAbstraction" /> object to use when
+		///    reading from and writing to the file.
+		/// </param>
+		/// <exception cref="ArgumentNullException">
+		///    <paramref name="abstraction" /> is <see langword="null"
+		///    />.
+		/// </exception>
+		protected File (IFileAbstraction abstraction)
+			: this (abstraction, ReadStyle.Average)
+		{
+		}
+
+#endregion
+
+#region Public Methods
+
+		/// <summary>
+		///    Saves the changes made in the current instance to the
+		///    file it represents.
+		/// </summary>
+		public override void Save ()
+		{
+			throw new NotSupportedException ();
+		}
+
+#endregion
+
+
+#region private methods
+
+		/// <summary>
+		///    Reads the information from file with a specified read style.
+		/// </summary>
+		/// <param name="propertiesStyle">
+		///    A <see cref="ReadStyle" /> value specifying at what level
+		///    of accuracy to read the media properties, or <see
+		///    cref="ReadStyle.None" /> to ignore the properties.
+		/// </param>
+		private void Read (ReadStyle propertiesStyle)
+		{
+			Mode = AccessMode.Read;
+			try {
+				ImageTag = new CombinedImageTag (TagTypes.TiffIFD);
+
+				ReadFile ();
+
+				TagTypesOnDisk = TagTypes;
+
+				if (propertiesStyle != ReadStyle.None)
+					properties = ExtractProperties ();
+
+			} finally {
+				Mode = AccessMode.Closed;
+			}
+		}
+
+		/// <summary>
+		///    Parses the ORF file
+		/// </summary>
+		private void ReadFile ()
+		{
+			// A RW2 file starts with a Tiff header followed by a RW2 header
+			uint first_ifd_offset = ReadOrfHeader ();
+
+			ReadIFD (first_ifd_offset, -1);
+		}
+
+
+		/// <summary>
+		///    Attempts to extract the media properties of the main
+		///    photo.
+		/// </summary>
+		/// <returns>
+		///    A <see cref="Properties" /> object with a best effort guess
+		///    at the right values. When no guess at all can be made,
+		///    <see langword="null" /> is returned.
+		/// </returns>
+		private Properties ExtractProperties ()
+		{
+			int width = 0, height = 0;
+
+			IFDTag tag = GetTag (TagTypes.TiffIFD) as IFDTag;
+			IFDStructure structure = tag.Structure;
+
+			width = (int) (structure.GetLongValue (0, (ushort) IFDEntryTag.ImageWidth) ?? 0);
+			height = (int) (structure.GetLongValue (0, (ushort) IFDEntryTag.ImageLength) ?? 0);
+
+			var vendor = ImageTag.Make;
+			var desc = String.Format ("{0} RAW File", vendor);
+
+			if (width > 0 && height > 0) {
+				return new Properties (TimeSpan.Zero, new Codec (width, height, desc));
+			}
+
+			return null;
+		}
+
+		/// <summary>
+		///    Reads and validates the ORF header at the current position.
+		/// </summary>
+		/// <returns>
+		///    A <see cref="System.UInt32"/> with the offset value to the first
+		///    IFD contained in the file.
+		/// </returns>
+		/// <remarks>
+		///    This method should only be called, when the current read position is
+		///    the beginning of the file.
+		/// </remarks>
+		protected  uint ReadOrfHeader ()
+		{
+			// TIFF header:
+			//
+			// 2 bytes         Indicating the endianess (II or MM)
+			// 2 bytes         Tiff Magic word (usually 21330 or 20306)
+			// 4 bytes         Offset to first IFD
+
+			ByteVector header = ReadBlock (8);
+
+			if (header.Count != 8)
+				throw new CorruptFileException ("Unexpected end of header");
+
+			string order = header.Mid (0, 2).ToString ();
+
+			if (order == "II") {
+				IsBigEndian = false;
+			} else if (order == "MM") {
+				IsBigEndian = true;
+			} else {
+				throw new CorruptFileException ("Unknown Byte Order");
+			}
+
+			if (header.Mid (2, 2).ToUShort (IsBigEndian) != 21330
+			  && header.Mid (2, 2).ToUShort (IsBigEndian) != 20306)
+				throw new CorruptFileException (String.Format ("ORF Magic expected, is {0}", header.Mid(2,2).ToUShort(IsBigEndian)));
+
+			uint first_ifd_offset = header.Mid (4, 4).ToUInt (IsBigEndian);
+
+			return first_ifd_offset;
+		}
+
+#endregion
+	}
+}
