Index: PhotoStore.cs
===================================================================
--- PhotoStore.cs	(revision 2928)
+++ PhotoStore.cs	(working copy)
@@ -614,12 +614,12 @@
 
 	public static Pixbuf GenerateThumbnail (Uri uri)
 	{
-		FSpot.ImageFile img = FSpot.ImageFile.Create (uri);
+		FSpot.MediaFile img = FSpot.MediaFile.Create (uri);
 		
 		return GenerateThumbnail (uri, img);
 	}
 
-	public static Pixbuf GenerateThumbnail (Uri uri, ImageFile img)
+	public static Pixbuf GenerateThumbnail (Uri uri, MediaFile img)
 	{
 		Pixbuf thumbnail = null;
 
@@ -716,7 +716,7 @@
 
 	public Photo Create (string newPath, string origPath, out Pixbuf thumbnail)
 	{
-		FSpot.ImageFile img = FSpot.ImageFile.Create (origPath);
+		FSpot.MediaFile img = FSpot.MediaFile.Create (origPath);
 		long unix_time = DbUtils.UnixTimeFromDateTime (img.Date);
 		string description = img.Description != null  ? img.Description.Split ('\0') [0] : "";
 		SqliteCommand command = new SqliteCommand ();
Index: FileImportBackend.cs
===================================================================
--- FileImportBackend.cs	(revision 2928)
+++ FileImportBackend.cs	(working copy)
@@ -53,7 +53,7 @@
 	
 	private void AddPath (string path)
 	{
-		if (FSpot.ImageFile.HasLoader (path))
+		if (FSpot.MediaFile.HasLoader (path))
 			import_info.Add (new ImportInfo (path));
 	}
 
@@ -149,7 +149,7 @@
 	public static string ChooseLocation (string path, Stack created_directories)
 	{
 		string name = System.IO.Path.GetFileName (path);
-		FSpot.ImageFile img = FSpot.ImageFile.Create (path);
+		FSpot.MediaFile img = FSpot.MediaFile.Create (path);
 		DateTime time = img.Date;
 		
 		string dest_dir = String.Format ("{0}{1}{2}{1}{3:D2}{1}{4:D2}",
Index: PhotoLoader.cs
===================================================================
--- PhotoLoader.cs	(revision 2928)
+++ PhotoLoader.cs	(working copy)
@@ -14,7 +14,7 @@
 
 		static public Gdk.Pixbuf Load (IBrowsableItem item) 
 		{
-			ImageFile img = ImageFile.Create (item.DefaultVersionUri);
+			MediaFile img = MediaFile.Create (item.DefaultVersionUri);
 			Gdk.Pixbuf pixbuf = img.Load ();
 			ValidateThumbnail (item, pixbuf);
 			return pixbuf;
@@ -22,7 +22,7 @@
 
 		static public Gdk.Pixbuf LoadAtMaxSize (IBrowsableItem item, int width, int height) 
 		{
-			ImageFile img = ImageFile.Create (item.DefaultVersionUri);
+			MediaFile img = MediaFile.Create (item.DefaultVersionUri);
 			Gdk.Pixbuf pixbuf = img.Load (width, height);
 			ValidateThumbnail (item.DefaultVersionUri, pixbuf);
 			return pixbuf;
Index: Makefile.am
===================================================================
--- Makefile.am	(revision 2928)
+++ Makefile.am	(working copy)
@@ -112,6 +112,8 @@
 	$(srcdir)/IOChannel.cs			\
 	$(srcdir)/ItemAction.cs			\
 	$(srcdir)/Ciff.cs			\
+	$(srcdir)/Imaging/MediaFile.cs	\
+	$(srcdir)/Imaging/VideoFile.cs	\
 	$(srcdir)/Imaging/DCRawFile.cs		\
 	$(srcdir)/Imaging/Bim.cs		\
 	$(srcdir)/Imaging/Exif.cs		\
Index: XmpTagsImporter.cs
===================================================================
--- XmpTagsImporter.cs	(revision 2928)
+++ XmpTagsImporter.cs	(working copy)
@@ -236,7 +236,7 @@
 				xmp = new XmpFile ();
 			}
 			
-			ImageFile img = ImageFile.Create (path);
+			MediaFile img = MediaFile.Create (path);
 			StatementSource source = img as StatementSource;
 			if (source != null) {
 				source.Select (xmp);
Index: FolderExport.cs
===================================================================
--- FolderExport.cs	(revision 2928)
+++ FolderExport.cs	(working copy)
@@ -479,7 +479,7 @@
 							continue;
 					
 						if (img == null) {
-							ImageFile imgf = ImageFile.Create (photo.DefaultVersionUri);
+							MediaFile imgf = MediaFile.Create (photo.DefaultVersionUri);
 							scaled = imgf.Load (req.Width, req.Height);
 						} else
 							scaled = PixbufUtils.ScaleToMaxSize (img, req.Width, req.Height, false);
Index: AsyncPixbufLoader.cs
===================================================================
--- AsyncPixbufLoader.cs	(revision 2928)
+++ AsyncPixbufLoader.cs	(working copy)
@@ -92,7 +92,7 @@
 			get { return loader; }
 		}
 		
-		private void FileLoad (ImageFile img)
+		private void FileLoad (MediaFile img)
 		{
 			pixbuf = img.Load ();
 			done_reading = true;
@@ -113,7 +113,7 @@
 			area_prepared = false;
 			damage = Gdk.Rectangle.Zero;
 
-			ImageFile img = ImageFile.Create (uri);
+			MediaFile img = MediaFile.Create (uri);
 			orientation = Accelerometer.GetViewOrientation (img.Orientation);
 			
 			try {
Index: ThumbnailGenerator.cs
===================================================================
--- ThumbnailGenerator.cs	(revision 2928)
+++ ThumbnailGenerator.cs	(working copy)
@@ -23,7 +23,7 @@
 		public static Gdk.Pixbuf Create (Uri uri)
 		{
 			try {
-				ImageFile img = ImageFile.Create (uri);
+				MediaFile img = MediaFile.Create (uri);
 				Gdk.Pixbuf thumb = img.Load (256, 256);
 
 				if (thumb != null)
Index: PixbufLoader.cs
===================================================================
--- PixbufLoader.cs	(revision 2928)
+++ PixbufLoader.cs	(working copy)
@@ -145,12 +145,12 @@
 	{
 		Pixbuf orig_image;
 		try {
-			FSpot.ImageFile img;
+			FSpot.MediaFile img;
 
 			if (System.IO.File.Exists (request.path))
-				img = FSpot.ImageFile.Create (request.path);
+				img = FSpot.MediaFile.Create (request.path);
 		        else
-				img = FSpot.ImageFile.Create (new Uri (request.path));
+				img = FSpot.MediaFile.Create (new Uri (request.path));
 
 			if (request.width > 0) {
 				orig_image = img.Load (request.width, request.height);
Index: ItemAction.cs
===================================================================
--- ItemAction.cs	(revision 2928)
+++ ItemAction.cs	(working copy)
@@ -33,7 +33,8 @@
 	        protected virtual void ItemChanged (BrowsablePointer sender, 
 						    BrowsablePointerChangedArgs args)
 		{
-			Sensitive = item.IsValid;
+			bool editable = !item.Current.DefaultVersionUri.ToString().EndsWith(".avi");
+			Sensitive = item.IsValid & editable;
 		}
 
 		public Widget GetToolButton (bool label)
@@ -329,7 +330,8 @@
 		protected override void ItemChanged (BrowsablePointer p,
 						     BrowsablePointerChangedArgs args)
 		{
-			Sensitive = item.IsValid && view.Editor == null;
+			bool editable = !item.Current.DefaultVersionUri.ToString().EndsWith(".avi");
+			Sensitive = (item.IsValid && view.Editor == null) & editable;
 		}
 	}
 
Index: Imaging/MediaFile.cs
===================================================================
--- Imaging/MediaFile.cs	(revision 0)
+++ Imaging/MediaFile.cs	(revision 0)
@@ -0,0 +1,151 @@
+using System;
+using System.IO;
+
+namespace FSpot {
+	public class MediaFile {
+		protected Uri uri;
+		protected static System.Collections.Hashtable name_table;
+
+		public MediaFile (string path)
+		{
+			this.uri = UriList.PathToFileUri(path);
+		}
+
+		public MediaFile (Uri uri)
+		{
+			this.uri = uri;
+		}
+
+		static MediaFile()
+		{
+			name_table = new System.Collections.Hashtable ();
+			name_table [".svg"] = typeof (FSpot.Svg.SvgFile);
+			name_table [".gif"] = typeof (ImageFile);
+			name_table [".bmp"] = typeof (ImageFile);
+			name_table [".jpeg"] = typeof (JpegFile);
+			name_table [".jpg"] = typeof (JpegFile);
+			name_table [".png"] = typeof (FSpot.Png.PngFile);
+			name_table [".cr2"] = typeof (FSpot.Tiff.Cr2File);
+			name_table [".nef"] = typeof (FSpot.Tiff.NefFile);
+			name_table [".pef"] = typeof (FSpot.Tiff.NefFile);
+			name_table [".raw"] = typeof (FSpot.Tiff.NefFile);
+			name_table [".tiff"] = typeof (FSpot.Tiff.TiffFile);
+			name_table [".tif"] = typeof (FSpot.Tiff.TiffFile);
+			name_table [".orf"] =  typeof (FSpot.Tiff.NefFile);
+			name_table [".srf"] = typeof (FSpot.Tiff.NefFile);
+			name_table [".dng"] = typeof (FSpot.Tiff.DngFile);
+			name_table [".crw"] = typeof (FSpot.Ciff.CiffFile);
+			name_table [".ppm"] = typeof (FSpot.Pnm.PnmFile);
+			name_table [".mrw"] = typeof (FSpot.Mrw.MrwFile);
+			name_table [".raf"] = typeof (FSpot.Raf.RafFile);
+			name_table [".x3f"] = typeof (FSpot.X3f.X3fFile);
+            name_table [".avi"] = typeof (VideoFile);
+		}
+
+		public static MediaFile Create (string path)
+		{
+			return Create (UriList.PathToFileUri (path));
+		}
+
+		public static MediaFile Create (Uri uri)
+		{
+			string path = uri.AbsolutePath;
+			string extension = System.IO.Path.GetExtension (path).ToLower ();
+			System.Type t = (System.Type) name_table [extension];
+			MediaFile med;
+
+			if (t != null)
+				med = (MediaFile) System.Activator.CreateInstance (t, new object[] { uri });
+			else 
+				med = new MediaFile (uri);
+
+			return med;
+		}
+
+		protected Stream Open ()
+		{
+			//Gnome.Vfs.Uri vfs = new Gnome.Vfs.Uri (uri.ToString ());
+			// FIXME, this seems like the sane thing to do, but vfs streams seem to 
+			// actually be faster and they need more testing.
+			//if (vfs.IsLocal)
+			//	return File.OpenRead (uri.LocalPath);
+
+			return new Gnome.Vfs.VfsStream (uri.ToString (), FileMode.Open);
+		}
+
+		public virtual Stream PixbufStream ()
+		{
+			return Open ();
+		}
+
+		public Uri Uri {
+			get { return this.uri; }
+		}
+
+		public virtual string Description
+		{
+			get { return null; }
+		}
+
+		public virtual void Save (Gdk.Pixbuf pixbuf, System.IO.Stream stream)
+		{
+			throw new NotImplementedException ();
+		}
+
+		public virtual Gdk.Pixbuf Load ()
+		{
+			return null;
+		}
+		
+		public virtual Gdk.Pixbuf Load (int max_width, int max_height)
+		{
+			return null;
+		}
+
+		public virtual PixbufOrientation GetOrientation () 
+		{
+			return PixbufOrientation.TopLeft;
+		}
+
+		public PixbufOrientation Orientation {
+			get { return GetOrientation (); }
+		}
+
+		// FIXME this need to have an intent just like the loading stuff.
+		public virtual Cms.Profile GetProfile ()
+		{
+			return null;
+		}
+
+		public virtual System.DateTime Date 
+		{
+			get {
+				// FIXME mono uses the file change time (ctime) incorrectly
+				// as the creation time so we try to work around that slightly
+				Gnome.Vfs.FileInfo info = new Gnome.Vfs.FileInfo (uri.ToString ());
+
+				DateTime create = info.Ctime;
+				DateTime write = info.Mtime;
+
+				if (create < write)
+					return create;
+				else 
+					return write;
+			}
+		}
+
+		public static bool HasLoader (string path)
+		{
+			return HasLoader (UriList.PathToFileUri (path));
+		}
+		
+		public static bool HasLoader (Uri uri)
+		{
+			string path = uri.AbsolutePath;
+			string extension = System.IO.Path.GetExtension (path).ToLower ();
+			System.Type t = (System.Type) name_table [extension];
+			
+			return (t != null);
+		}
+	}
+}
Index: Imaging/ImageFile.cs
===================================================================
--- Imaging/ImageFile.cs	(revision 2928)
+++ Imaging/ImageFile.cs	(working copy)
@@ -8,81 +8,15 @@
 		}
 	}
 
-	public class ImageFile {
-		protected Uri uri;
-
-		static System.Collections.Hashtable name_table;
-
-		public ImageFile (string path) 
+	public class ImageFile : MediaFile {
+		public ImageFile (Uri uri) : base (uri)
 		{
-			this.uri = UriList.PathToFileUri (path);
 		}
-		
-		public ImageFile (Uri uri)
-		{
-			this.uri = uri;
-		}
-		
-		protected Stream Open ()
-		{
-			//Gnome.Vfs.Uri vfs = new Gnome.Vfs.Uri (uri.ToString ());
-			// FIXME, this seems like the sane thing to do, but vfs streams seem to 
-			// actually be faster and they need more testing.
-			//if (vfs.IsLocal)
-			//	return File.OpenRead (uri.LocalPath);
 
-			System.Console.WriteLine ("open uri = {0}", uri.ToString ());
-			return new Gnome.Vfs.VfsStream (uri.ToString (), FileMode.Open);
-		}
-
-		public virtual Stream PixbufStream ()
+		public ImageFile (string path) : base (path) 
 		{
-			return Open ();
 		}
 
-		static ImageFile ()
-		{
-			name_table = new System.Collections.Hashtable ();
-			name_table [".svg"] = typeof (FSpot.Svg.SvgFile);
-			name_table [".gif"] = typeof (ImageFile);
-			name_table [".bmp"] = typeof (ImageFile);
-			name_table [".jpeg"] = typeof (JpegFile);
-			name_table [".jpg"] = typeof (JpegFile);
-			name_table [".png"] = typeof (FSpot.Png.PngFile);
-			name_table [".cr2"] = typeof (FSpot.Tiff.Cr2File);
-			name_table [".nef"] = typeof (FSpot.Tiff.NefFile);
-			name_table [".pef"] = typeof (FSpot.Tiff.NefFile);
-			name_table [".raw"] = typeof (FSpot.Tiff.NefFile);
-			name_table [".tiff"] = typeof (FSpot.Tiff.TiffFile);
-			name_table [".tif"] = typeof (FSpot.Tiff.TiffFile);
-			name_table [".orf"] =  typeof (FSpot.Tiff.NefFile);
-			name_table [".srf"] = typeof (FSpot.Tiff.NefFile);
-			name_table [".dng"] = typeof (FSpot.Tiff.DngFile);
-			name_table [".crw"] = typeof (FSpot.Ciff.CiffFile);
-			name_table [".ppm"] = typeof (FSpot.Pnm.PnmFile);
-			name_table [".mrw"] = typeof (FSpot.Mrw.MrwFile);
-			name_table [".raf"] = typeof (FSpot.Raf.RafFile);
-			name_table [".x3f"] = typeof (FSpot.X3f.X3fFile);
-		}
-
-		public Uri Uri {
-			get { return this.uri; }
-		}
-
-		public PixbufOrientation Orientation {
-			get { return GetOrientation (); }
-		}
-
-		public virtual string Description
-		{
-			get { return null; }
-		}
-		
-		public virtual void Save (Gdk.Pixbuf pixbuf, System.IO.Stream stream)
-		{
-			throw new NotImplementedException ();
-		}
-
 		protected Gdk.Pixbuf TransformAndDispose (Gdk.Pixbuf orig)
 		{
 			if (orig == null)
@@ -96,7 +30,7 @@
 			return rotated;
 		}
 		
-		public virtual Gdk.Pixbuf Load ()
+		public override Gdk.Pixbuf Load ()
 		{
 			using (Stream stream = PixbufStream ()) {
 				Gdk.Pixbuf orig = new Gdk.Pixbuf (stream);
@@ -104,7 +38,7 @@
 			}
 		}
 		
-		public virtual Gdk.Pixbuf Load (int max_width, int max_height)
+		public override Gdk.Pixbuf Load (int max_width, int max_height)
 		{
 			System.IO.Stream stream = PixbufStream ();
 			if (stream == null) {
@@ -120,68 +54,16 @@
 			}	
 		}
 	
-		public virtual PixbufOrientation GetOrientation () 
+		public static new ImageFile Create (string path)
 		{
-			return PixbufOrientation.TopLeft;
-		}
-		
-		// FIXME this need to have an intent just like the loading stuff.
-		public virtual Cms.Profile GetProfile ()
-		{
-			return null;
-		}
-		
-		public virtual System.DateTime Date 
-		{
-			get {
-				// FIXME mono uses the file change time (ctime) incorrectly
-				// as the creation time so we try to work around that slightly
-				Gnome.Vfs.FileInfo info = new Gnome.Vfs.FileInfo (uri.ToString ());
-
-				DateTime create = info.Ctime;
-				DateTime write = info.Mtime;
-
-				if (create < write)
-					return create;
-				else 
-					return write;
-			}
-		}
-
-		public static bool HasLoader (string path)
-		{
-			return HasLoader (UriList.PathToFileUri (path));
-		}
-		
-		public static bool HasLoader (Uri uri)
-		{
-			string path = uri.AbsolutePath;
-			string extension = System.IO.Path.GetExtension (path).ToLower ();
-			System.Type t = (System.Type) name_table [extension];
-			
-			return (t != null);
-		}
-
-		public static ImageFile Create (string path)
-		{
 			return Create (UriList.PathToFileUri (path));
 		}
 
-		public static ImageFile Create (Uri uri)
+		public static new ImageFile Create (Uri uri)
 		{
-			string path = uri.AbsolutePath;
-			string extension = System.IO.Path.GetExtension (path).ToLower ();
-			System.Type t = (System.Type) name_table [extension];
-			ImageFile img;
-
-			if (t != null)
-				img = (ImageFile) System.Activator.CreateInstance (t, new object[] { uri });
-			else 
-				img = new ImageFile (uri);
-
-			return img;
+			return (ImageFile)MediaFile.Create(uri);
 		}
-		
+	
 		// FIXME these are horrible hacks to get a temporary name
 		// with the right extension for ImageFile until we use the mime data
 		// properly.  It is here to make sure we can find the places that use
Index: Imaging/VideoFile.cs
===================================================================
--- Imaging/VideoFile.cs	(revision 0)
+++ Imaging/VideoFile.cs	(revision 0)
@@ -0,0 +1,143 @@
+using System;
+using System.IO;
+
+namespace FSpot {
+	public class VideoFormatException : ApplicationException {
+		public VideoFormatException (string msg) : base (msg)
+		{
+		}
+	}
+
+	public class VideoFile : MediaFile {	
+		private const int TIMEOUT = 5000; // Timeout for thumbnailer process is 5 seconds
+		
+		public VideoFile (Uri uri) : base (uri)
+		{
+		}
+
+		public VideoFile (string path) : base (path)
+		{
+		}
+
+		public static new VideoFile Create (string path)
+		{
+			return Create (UriList.PathToFileUri (path));
+		}
+
+		public static new VideoFile Create (Uri uri)
+		{
+			return (VideoFile)MediaFile.Create(uri);
+		}
+
+
+		///<summary>Returns a full-size "thumbnail", or screen capture, of the video</summary>
+		///<returns>A Gdk.Pixbuf image of the screen capture</returns>
+		///NOTE: the current implementation only returns a still image.  Later versions should
+		/// set up GStreamer for playback and do the appropriate handling here
+		public override Gdk.Pixbuf Load ()
+		{
+			Gdk.Pixbuf pixbuf = null;
+			try {
+				string tempPath = GenerateTempPath();
+				// The string returned by GetThumbnailerCommand should be able to be
+				// formatted with our variables.
+				string scCommand = GetScreenCaptureCommand();
+				scCommand = String.Format(scCommand,
+					this.Uri.AbsolutePath, tempPath);
+				
+				// Create a new process to run the external thumbnailer in, let it run until it
+				// ends or until TIMEOUT milliseconds elapse.
+				System.Diagnostics.Process thumbnailerProcess= new System.Diagnostics.Process();
+				thumbnailerProcess.StartInfo.FileName=scCommand;
+				thumbnailerProcess.Start();
+				thumbnailerProcess.WaitForExit(TIMEOUT);
+
+				pixbuf = new Gdk.Pixbuf (tempPath);
+				System.IO.File.Delete(tempPath);
+			}
+			catch (System.Exception e) {
+				System.Console.WriteLine (e.ToString ());
+			}
+			return pixbuf;
+		}
+
+		///<summary>Loads a thumbnail of the .avi video file using an external thumbnailer</summary>
+		///<param name="max_width">Width of the thumbnail in pixels</param>
+		///<param name="max_height">Height of the thumbnail in pixels</param>
+		///<returns>A Gdk.Pixbuf of the thumbnail image extracted from the video file</returns>
+		public override Gdk.Pixbuf Load (int max_width, int max_height)
+		{
+			Gdk.Pixbuf pixbuf = null;
+			try {
+				string tempPath = GenerateTempPath();
+				// The string returned by GetThumbnailerCommand should be able to be
+				// formatted with our variables.
+				string thumbnailerCommand = GetThumbnailerCommand();
+				thumbnailerCommand = String.Format(thumbnailerCommand,
+					this.Uri.AbsolutePath, tempPath, max_width, max_height);
+				
+				// Create a new process to run the external thumbnailer in, let it run until it
+				// ends or until TIMEOUT milliseconds elapse.
+				System.Diagnostics.Process thumbnailerProcess= new System.Diagnostics.Process();
+				thumbnailerProcess.StartInfo.FileName=thumbnailerCommand;
+				thumbnailerProcess.Start();
+				thumbnailerProcess.WaitForExit(TIMEOUT);
+
+				pixbuf = new Gdk.Pixbuf (tempPath);
+				System.IO.File.Delete(tempPath);
+			}
+			catch (System.Exception e) {
+				System.Console.WriteLine (e.ToString ());
+			}
+			return pixbuf;
+		}
+
+		///<summary>Uses the given Uri to generate a temporary, unique filename</summary>
+		///<returns>String of the absolute path for the temporary filename</returns>
+		private string GenerateTempPath()
+		{
+			string result = null;
+			try
+			{
+				result = "." + System.IO.Path.GetFileNameWithoutExtension(this.Uri.AbsolutePath) + ".png";
+				result = FileImportBackend.UniqueName(FSpot.Global.PhotoDirectory, result);
+			}
+			catch (System.Exception e) {
+				System.Console.WriteLine (e.ToString ());
+			}
+			return result;
+		}
+
+		//FIXME: this method should be extracted to a more general utility class
+		// (only if this can be used for all video file types)
+		private string GetThumbnailerCommand()
+		{
+			// Use the following for string formatting:
+			// {0) = input file (eg. "video1.avi")
+			// {1} = output file (eg. "thumb1.png")
+			// {2} = width of thumbnail
+			// {3} = height of thumbnail
+
+			string result = null;
+			//FIXME: Add code to check for the existence of totem-video-thumbnailer.
+			// Use an alternative (if available) or return null if it does not exist.
+			result = "totem-video-thumbnailer -s {2}x{3} {0} {1}";
+			return result;
+		}
+		
+		//WARNING: this method will become depracated and should be removed when
+		// proper GStreamer video playback support is added
+		private string GetScreenCaptureCommand()
+		{
+			// Use the following for string formatting:
+			// {0) = input file (eg. "video1.avi")
+			// {1} = output file (eg. "thumb1.png")
+
+			string result = null;
+			//FIXME: Add code to check for the existence of totem-video-thumbnailer.
+			// Use an alternative (if available) or return null if it does not exist.
+			result = "totem-video-thumbnailer {0} {1}";
+			return result;
+		}
+	}
+}
Index: MainWindow.cs
===================================================================
--- MainWindow.cs	(revision 2928)
+++ MainWindow.cs	(working copy)
@@ -2693,6 +2693,7 @@
 		bool tag_sensitive = tags_selected > 0;
 		bool active_selection = selection.Count > 0;
 		bool single_active = CurrentPhoto != null;
+		bool editable = false;
 		
 		if (!single_active) {
 			version_menu_item.Sensitive = false;
@@ -2703,15 +2704,16 @@
 			rename_version_menu_item.Sensitive = false;
 
 		} else {
-			version_menu_item.Sensitive = true;
-			create_version_menu_item.Sensitive = true;
+			editable = !photo_view.Item.Current.DefaultVersionUri.ToString().EndsWith(".avi");
+			version_menu_item.Sensitive = true & editable;
+			create_version_menu_item.Sensitive = true & editable;
 			
 			if (CurrentPhoto.DefaultVersionId == Photo.OriginalVersionId) {
-				delete_version_menu_item.Sensitive = false;
-				rename_version_menu_item.Sensitive = false;
+				delete_version_menu_item.Sensitive = false & editable;
+				rename_version_menu_item.Sensitive = false & editable;
 			} else {
-				delete_version_menu_item.Sensitive = true;
-				rename_version_menu_item.Sensitive = true;
+				delete_version_menu_item.Sensitive = true & editable;
+				rename_version_menu_item.Sensitive = true & editable;
 			}
 
 			versions_submenu = new PhotoVersionMenu (CurrentPhoto);
@@ -2719,25 +2721,25 @@
 			version_menu_item.Submenu = versions_submenu;
 		}
 
-		set_as_background.Sensitive = single_active;
-		adjust_color.Sensitive = single_active;
-		adjust_time.Sensitive = active_selection;
+		set_as_background.Sensitive = single_active & editable;
+		adjust_color.Sensitive = single_active & editable;
+		adjust_time.Sensitive = active_selection & editable;
 
 		attach_tag.Sensitive = active_selection;
 		remove_tag.Sensitive = active_selection;
 
-		rotate_left.Sensitive = active_selection;
-		rotate_right.Sensitive = active_selection;
+		rotate_left.Sensitive = active_selection & editable;
+		rotate_right.Sensitive = active_selection & editable;
 		update_thumbnail.Sensitive = active_selection;
 		delete_from_drive.Sensitive = active_selection;
 		
 		send_mail.Sensitive = active_selection;
-		print.Sensitive = active_selection;
-		export.Sensitive = active_selection;
+		print.Sensitive = active_selection & editable;
+		export.Sensitive = active_selection & editable;
 		select_none.Sensitive = active_selection;
 		copy_location.Sensitive = active_selection;
 		exif_data.Sensitive = active_selection;
-		sharpen.Sensitive = active_selection;
+		sharpen.Sensitive = active_selection & editable;
 		remove_from_catalog.Sensitive = active_selection;
 
 		delete_selected_tag.Sensitive = tag_sensitive;
@@ -2752,7 +2754,7 @@
 				rl_button.Sensitive = false;
 				SetTip (rl_button, "");
 			} else {
-				rl_button.Sensitive = true;
+				rl_button.Sensitive = true & editable;
 
 				string msg = Catalog.GetPluralString ("Rotate selected photo left",
 								      "Rotate selected photos left", selection.Count);
@@ -2765,7 +2767,7 @@
 				rr_button.Sensitive = false;
 				SetTip (rr_button, "");
 			} else {
-				rr_button.Sensitive = true;
+				rr_button.Sensitive = true & editable;
 
 				string msg = Catalog.GetPluralString ("Rotate selected photo right",
 				    "Rotate selected photos right", selection.Count);
Index: PhotoView.cs
===================================================================
--- PhotoView.cs	(revision 2928)
+++ PhotoView.cs	(working copy)
@@ -137,12 +137,14 @@
 	private void UpdateButtonSensitivity ()
 	{
 		bool valid = photo_view.Item.IsValid;
+		bool editable = false;
 		bool prev = valid && Item.Index > 0;
 		bool next = valid && Item.Index < query.Count - 1;
 
 		if (valid) {
 			Gnome.Vfs.Uri vfs = new Gnome.Vfs.Uri (photo_view.Item.Current.DefaultVersionUri.ToString ());
 			valid = vfs.IsLocal;
+			editable = !photo_view.Item.Current.DefaultVersionUri.ToString().EndsWith(".avi");
 		}
 
 		display_previous_button.Sensitive = prev;
@@ -156,11 +158,11 @@
 			tips.SetTip (redeye_button, Catalog.GetString ("Select an area to remove redeye"), null);
 		}
 		
-		crop_button.Sensitive = valid;
-		redeye_button.Sensitive = valid;
-		color_button.Sensitive = valid;
-		desaturate_button.Sensitive = valid;
-		sepia_button.Sensitive = valid;
+		crop_button.Sensitive = valid & editable;
+		redeye_button.Sensitive = valid & editable;
+		color_button.Sensitive = valid & editable;
+		desaturate_button.Sensitive = valid & editable;
+		sepia_button.Sensitive = valid & editable;
 	}
 
 	private void UpdateCountLabel ()
Index: DirectoryCollection.cs
===================================================================
--- DirectoryCollection.cs	(revision 2928)
+++ DirectoryCollection.cs	(working copy)
@@ -56,7 +56,7 @@
 		
 		public void Add (Uri uri)
 		{
-			if (FSpot.ImageFile.HasLoader (uri)) {
+			if (FSpot.MediaFile.HasLoader (uri)) {
 				//Console.WriteLine ("using image loader {0}", uri.ToString ());
 				Add (new FileBrowsableItem (uri));
 			} else {
@@ -156,7 +156,7 @@
 					Uri file = new Uri (vfs.ToString ());
 					System.Console.WriteLine ("tesing uri = {0}", file.ToString ());
 					
-					if (FSpot.ImageFile.HasLoader (file))
+					if (FSpot.MediaFile.HasLoader (file))
 						items.Add (new FileBrowsableItem (file));
 				}
 
@@ -170,7 +170,7 @@
 		{
 			ArrayList items = new ArrayList ();
 			foreach (FileInfo f in files) {
-				if (FSpot.ImageFile.HasLoader (f.FullName)) {
+				if (FSpot.MediaFile.HasLoader (f.FullName)) {
 					Console.WriteLine (f.FullName);
 					items.Add (new FileBrowsableItem (f.FullName));
 				}
@@ -182,7 +182,7 @@
 	}
 
 	public class FileBrowsableItem : IBrowsableItem {
-		ImageFile img;
+		MediaFile img;
 		Uri uri;
 		bool attempted;
 		
@@ -196,10 +196,10 @@
 			this.uri = UriList.PathToFileUri (path);
 		}
 		
-		protected ImageFile Image {
+		protected MediaFile Image {
 			get {
 				if (!attempted) {
-					img = ImageFile.Create (uri);
+					img = MediaFile.Create (uri);
 					attempted = true;
 				}
 
Index: InfoBox.cs
===================================================================
--- InfoBox.cs	(revision 2928)
+++ InfoBox.cs	(working copy)
@@ -133,7 +133,7 @@
 #if USE_EXIF_DATE
 		DateTime date;
 #endif
-		public ImageInfo (ImageFile img) 
+		public ImageInfo (MediaFile img) 
 		{
 			// FIXME We use the memory store to hold the anonymous statements
 			// as they are added so that we can query for them later to 
@@ -248,7 +248,7 @@
 
 	public bool Update ()
 	{
-		ImageFile img;
+		MediaFile img;
 		ImageInfo info;
 
 		if (photo == null) {
@@ -259,7 +259,7 @@
 		name_entry.Text = photo.Name != null ? photo.Name : String.Empty;
 		try {
 			//using (new Timer ("building info")) {
-				img = ImageFile.Create (photo.DefaultVersionUri);
+				img = MediaFile.Create (photo.DefaultVersionUri);
 				info = new ImageInfo (img);
 				//}
 		} catch (System.Exception e) {
