OSDN Git Service

MacGui: Fix a crash in calculateBitrate:
[handbrake-jp/handbrake-jp-git.git] / macosx / Controller.mm
index 39b1f11..4e30273 100644 (file)
@@ -8,6 +8,12 @@
 #include "a52dec/a52.h"
 #import "HBOutputPanelController.h"
 #import "HBPreferencesController.h"
+/* Added to integrate scanning into HBController */
+#include <IOKit/IOKitLib.h>
+#include <IOKit/storage/IOMedia.h>
+#include <IOKit/storage/IODVDMedia.h>
+#include "HBDVDDetector.h"
+#include "dvdread/dvd_reader.h"
 
 #define _(a) NSLocalizedString(a,NULL)
 
@@ -35,16 +41,16 @@ static int FormatSettings[4][10] =
          0,
          0 } };
 
+
 /* We setup the toolbar values here */
-static NSString*       MyDocToolbarIdentifier          = @"My Document Toolbar Identifier";
-static NSString*       ToggleDrawerIdentifier  = @"Toggle Drawer Item Identifier";
-//static NSString*       ToggleDrawerIdentifier  = @"Toggle Presets Item Identifier";
-static NSString*       StartEncodingIdentifier         = @"Start Encoding Item Identifier";
-static NSString*       PauseEncodingIdentifier         = @"Pause Encoding Item Identifier";
-static NSString*       ShowQueueIdentifier     = @"Show Queue Item Identifier";
-static NSString*       AddToQueueIdentifier    = @"Add to Queue Item Identifier";
-static NSString*       DebugOutputIdentifier   = @"Debug Output Item Identifier";
-static NSString*       ChooseSourceIdentifier   = @"Choose Source Item Identifier";
+static NSString *        ToggleDrawerIdentifier             = @"Toggle Drawer Item Identifier";
+static NSString *        StartEncodingIdentifier            = @"Start Encoding Item Identifier";
+static NSString *        PauseEncodingIdentifier            = @"Pause Encoding Item Identifier";
+static NSString *        ShowQueueIdentifier                = @"Show Queue Item Identifier";
+static NSString *        AddToQueueIdentifier               = @"Add to Queue Item Identifier";
+static NSString *        ShowActivityIdentifier             = @"Debug Output Item Identifier";
+static NSString *        ChooseSourceIdentifier             = @"Choose Source Item Identifier";
+
 
 /*******************************
  * HBController implementation *
@@ -57,6 +63,10 @@ static NSString*       ChooseSourceIdentifier   = @"Choose Source Item Identifie
     [HBPreferencesController registerUserDefaults];
     fHandle = NULL;
     outputPanel = [[HBOutputPanelController alloc] init];
+    fPictureController = [[PictureController alloc] initWithDelegate:self];
+    fQueueController = [[HBQueueController alloc] init];
+    fAdvancedOptions = [[HBAdvancedController alloc] init];
+    fPreferencesController = [[HBPreferencesController alloc] init];
     return self;
 }
 
@@ -65,30 +75,25 @@ static NSString*       ChooseSourceIdentifier   = @"Choose Source Item Identifie
     int    build;
     char * version;
 
-    // Open debug output window now if it was visible when HB was closed
-    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"OutputPanelIsOpen"])
-        [self showDebugOutputPanel:nil];
-
     // Init libhb
        int debugLevel = [[NSUserDefaults standardUserDefaults] boolForKey:@"ShowVerboseOutput"] ? HB_DEBUG_ALL : HB_DEBUG_NONE;
     fHandle = hb_init(debugLevel, [[NSUserDefaults standardUserDefaults] boolForKey:@"CheckForUpdates"]);
 
        // Set the Growl Delegate
-       HBController *hbGrowlDelegate = [[HBController alloc] init];
-       [GrowlApplicationBridge setGrowlDelegate: hbGrowlDelegate];    
+    [GrowlApplicationBridge setGrowlDelegate: self];    
     /* Init others controllers */
-    [fScanController    SetHandle: fHandle];
     [fPictureController SetHandle: fHandle];
-    [fQueueController   SetHandle: fHandle];
+    [fQueueController   setHandle: fHandle];
+    [fQueueController   setHBController: self];
        
     fChapterTitlesDelegate = [[ChapterTitles alloc] init];
     [fChapterTable setDataSource:fChapterTitlesDelegate];
 
-     /* Call UpdateUI every 2/10 sec */
+     /* Call UpdateUI every 1/2 sec */
     [[NSRunLoop currentRunLoop] addTimer: [NSTimer
-        scheduledTimerWithTimeInterval: 0.2 target: self
-        selector: @selector( UpdateUI: ) userInfo: NULL repeats: FALSE]
-        forMode: NSModalPanelRunLoopMode];
+        scheduledTimerWithTimeInterval: 0.5 target: self
+        selector: @selector( updateUI: ) userInfo: NULL repeats: YES]
+        forMode: NSEventTrackingRunLoopMode];
 
     if( ( build = hb_check_update( fHandle, &version ) ) > -1 )
     {
@@ -96,7 +101,7 @@ static NSString*       ChooseSourceIdentifier   = @"Choose Source Item Identifie
        
         NSBeginInformationalAlertSheet( _( @"Update is available" ),
             _( @"Go get it!" ), _( @"Discard" ), NULL, fWindow, self,
-            @selector( UpdateAlertDone:returnCode:contextInfo: ),
+            @selector( updateAlertDone:returnCode:contextInfo: ),
             NULL, NULL, [NSString stringWithFormat:
             _( @"HandBrake %s (build %d) is now available for download." ),
             version, build] );
@@ -104,15 +109,27 @@ static NSString*       ChooseSourceIdentifier   = @"Choose Source Item Identifie
 
     }
 
+    // Open debug output window now if it was visible when HB was closed
+    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"OutputPanelIsOpen"])
+        [self showDebugOutputPanel:nil];
+
+    // Open queue window now if it was visible when HB was closed
+    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"QueueWindowIsOpen"])
+        [self showQueueWindow:nil];
+
+       [self openMainWindow:nil];
+       
     /* Show scan panel ASAP */
-    [self performSelectorOnMainThread: @selector(ShowScanPanel:)
+    [self performSelectorOnMainThread: @selector(showScanPanel:)
         withObject: NULL waitUntilDone: NO];
 }
 
 - (NSApplicationTerminateReply) applicationShouldTerminate:
     (NSApplication *) app
 {
-    if( [[fRipButton title] isEqualToString: _( @"Cancel" )] )
+    hb_state_t s;
+    hb_get_state2( fHandle, &s );
+    if ( s.state ==  HB_STATE_WORKING )    
     {
         [self Cancel: NULL];
         return NSTerminateCancel;
@@ -123,6 +140,7 @@ static NSString*       ChooseSourceIdentifier   = @"Choose Source Item Identifie
 - (void)applicationWillTerminate:(NSNotification *)aNotification
 {
        [outputPanel release];
+       [fQueueController release];
        hb_close(&fHandle);
 }
 
@@ -130,65 +148,26 @@ static NSString*       ChooseSourceIdentifier   = @"Choose Source Item Identifie
 - (void) awakeFromNib
 {
     [fWindow center];
+    [fWindow setExcludedFromWindowsMenu:YES];
+    [fAdvancedOptions setView:fAdvancedView];
 
-    [self TranslateStrings];
-    currentScanCount = 0;
-
-//[self registrationDictionaryForGrowl];
-/* Init User Presets .plist */
-       /* We declare the default NSFileManager into fileManager */
-       NSFileManager * fileManager = [NSFileManager defaultManager];
-       //presetPrefs = [[NSUserDefaults standardUserDefaults] retain];
-       /* we set the files and support paths here */
-       AppSupportDirectory = @"~/Library/Application Support/HandBrake";
-    AppSupportDirectory = [AppSupportDirectory stringByExpandingTildeInPath];
-    
-       UserPresetsFile = @"~/Library/Application Support/HandBrake/UserPresets.plist";
-    UserPresetsFile = [UserPresetsFile stringByExpandingTildeInPath];
-       
-       x264ProfilesFile = @"~/Library/Application Support/HandBrake/x264Profiles.plist";
-    x264ProfilesFile = [x264ProfilesFile stringByExpandingTildeInPath];
-       /* We check for the app support directory for media fork */
-       if ([fileManager fileExistsAtPath:AppSupportDirectory] == 0) 
-       {
-               // If it doesnt exist yet, we create it here 
-               [fileManager createDirectoryAtPath:AppSupportDirectory attributes:nil];
-       }
-       // We check for the presets.plist here
+    /* Initialize currentScanCount so HB can use it to
+               evaluate successive scans */
+       currentScanCount = 0;
        
-       if ([fileManager fileExistsAtPath:UserPresetsFile] == 0) 
-       {
-
-               [fileManager createFileAtPath:UserPresetsFile contents:nil attributes:nil];
+    /* Init UserPresets .plist */
+       [self loadPresets];
                
-       }
-       // We check for the x264profiles.plist here
-        
-       if ([fileManager fileExistsAtPath:x264ProfilesFile] == 0) 
+       fRipIndicatorShown = NO;  // initially out of view in the nib
+       
+       /* Show/Dont Show Presets drawer upon launch based
+               on user preference DefaultPresetsDrawerShow*/
+       if ([[NSUserDefaults standardUserDefaults] boolForKey:@"DefaultPresetsDrawerShow"] > 0)
        {
-        
-               [fileManager createFileAtPath:x264ProfilesFile contents:nil attributes:nil];
+               [fPresetDrawer open];
        }
-    
        
-  UserPresetsFile = @"~/Library/Application Support/HandBrake/UserPresets.plist";
-  UserPresetsFile = [[UserPresetsFile stringByExpandingTildeInPath]retain];
-
-  UserPresets = [[NSMutableArray alloc] initWithContentsOfFile:UserPresetsFile];
-  if (nil == UserPresets) 
-  {
-    UserPresets = [[NSMutableArray alloc] init];
-       [self AddFactoryPresets:NULL];
-  }
-  /* Show/Dont Show Presets drawer upon launch based
-  on user preference DefaultPresetsDrawerShow*/
-  if ([[NSUserDefaults standardUserDefaults] boolForKey:@"DefaultPresetsDrawerShow"] > 0)
-               {
-         [fPresetDrawer open];
-               }
-
-
-
+       
     /* Destination box*/
     [fDstFormatPopUp removeAllItems];
     [fDstFormatPopUp addItemWithTitle: _( @"MP4 file" )];
@@ -196,8 +175,8 @@ static NSString*       ChooseSourceIdentifier   = @"Choose Source Item Identifie
     [fDstFormatPopUp addItemWithTitle: _( @"OGM file" )];
        [fDstFormatPopUp addItemWithTitle: _( @"MKV file" )];
     [fDstFormatPopUp selectItemAtIndex: 0];
-
-    [self FormatPopUpChanged: NULL];
+       
+    [self formatPopUpChanged: NULL];
     
        /* We enable the create chapters checkbox here since we are .mp4 */     
        [fCreateChapterMarkers setEnabled: YES];
@@ -206,51 +185,72 @@ static NSString*       ChooseSourceIdentifier   = @"Choose Source Item Identifie
                [fCreateChapterMarkers setState: NSOnState];
        }
        
-
+       
        
        
     [fDstFile2Field setStringValue: [NSString stringWithFormat:
         @"%@/Desktop/Movie.mp4", NSHomeDirectory()]];
-
+       
     /* Video encoder */
     [fVidEncoderPopUp removeAllItems];
     [fVidEncoderPopUp addItemWithTitle: @"FFmpeg"];
     [fVidEncoderPopUp addItemWithTitle: @"XviD"];
-
+       
     
        
     /* Video quality */
     [fVidTargetSizeField setIntValue: 700];
        [fVidBitrateField    setIntValue: 1000];
-
+       
     [fVidQualityMatrix   selectCell: fVidBitrateCell];
-    [self VideoMatrixChanged: NULL];
-
+    [self videoMatrixChanged: NULL];
+       
     /* Video framerate */
     [fVidRatePopUp removeAllItems];
        [fVidRatePopUp addItemWithTitle: _( @"Same as source" )];
     for( int i = 0; i < hb_video_rates_count; i++ )
     {
-        [fVidRatePopUp addItemWithTitle:
-            [NSString stringWithCString: hb_video_rates[i].string]];
+        if ([[NSString stringWithCString: hb_video_rates[i].string] isEqualToString: [NSString stringWithFormat: @"%.3f",23.976]])
+               {
+                       [fVidRatePopUp addItemWithTitle:[NSString stringWithFormat: @"%@%@",
+                               [NSString stringWithCString: hb_video_rates[i].string], @" (NTSC Film)"]];
+               }
+               else if ([[NSString stringWithCString: hb_video_rates[i].string] isEqualToString: [NSString stringWithFormat: @"%d",25]])
+               {
+                       [fVidRatePopUp addItemWithTitle:[NSString stringWithFormat: @"%@%@",
+                               [NSString stringWithCString: hb_video_rates[i].string], @" (PAL Film/Video)"]];
+               }
+               else if ([[NSString stringWithCString: hb_video_rates[i].string] isEqualToString: [NSString stringWithFormat: @"%.2f",29.97]])
+               {
+                       [fVidRatePopUp addItemWithTitle:[NSString stringWithFormat: @"%@%@",
+                               [NSString stringWithCString: hb_video_rates[i].string], @" (NTSC Video)"]];
+               }
+               else
+               {
+                       [fVidRatePopUp addItemWithTitle:
+                               [NSString stringWithCString: hb_video_rates[i].string]];
+               }
     }
     [fVidRatePopUp selectItemAtIndex: 0];
        
        /* Picture Settings */
-       [fPicLabelPAROutp setStringValue: @""];
        [fPicLabelPAROutputX setStringValue: @""];
        [fPicSettingPARWidth setStringValue: @""];
        [fPicSettingPARHeight setStringValue:  @""];
        
-    /* Audio bitrate */
+       /* Set Auto Crop to On at launch */
+    [fPictureController setAutoCrop:YES];
+       
+       /* Audio bitrate */
     [fAudBitratePopUp removeAllItems];
     for( int i = 0; i < hb_audio_bitrates_count; i++ )
     {
         [fAudBitratePopUp addItemWithTitle:
-            [NSString stringWithCString: hb_audio_bitrates[i].string]];
+                               [NSString stringWithCString: hb_audio_bitrates[i].string]];
+
     }
     [fAudBitratePopUp selectItemAtIndex: hb_audio_bitrates_default];
-
+       
     /* Audio samplerate */
     [fAudRatePopUp removeAllItems];
     for( int i = 0; i < hb_audio_rates_count; i++ )
@@ -259,29 +259,56 @@ static NSString*       ChooseSourceIdentifier   = @"Choose Source Item Identifie
             [NSString stringWithCString: hb_audio_rates[i].string]];
     }
     [fAudRatePopUp selectItemAtIndex: hb_audio_rates_default];
-
+       
     /* Bottom */
     [fStatusField setStringValue: @""];
-
-    [self EnableUI: NO];
-    //[fPauseButton setEnabled: NO];
-    //[fRipButton setEnabled: NO];
-       /* Use new Toolbar start and pause here */
-       
-       pauseButtonEnabled = NO;
-       startButtonEnabled = NO;
-       [self setupToolbar];
-       /* In Ritsuka's patch, this goes below the Turbo stuff below
-          Lets try to keep it all together */
-       startButtonEnabled = NO;
-       stopOrStart = NO;
-       AddToQueueButtonEnabled = NO;
-       pauseButtonEnabled = NO;
-       resumeOrPause = NO;
-
+       
+    [self enableUI: NO];
+       [self setupToolbar];
+       
+       [fPresetsActionButton setMenu:fPresetsActionMenu];
+       
        /* We disable the Turbo 1st pass checkbox since we are not x264 */
        [fVidTurboPassCheck setEnabled: NO];
        [fVidTurboPassCheck setState: NSOffState];
+       
+       
+       /* lets get our default prefs here */
+       [self getDefaultPresets: NULL];
+       /* lets initialize the current successful scancount here to 0 */
+       currentSuccessfulScanCount = 0;
+    
+}
+
+- (void) loadPresets {
+       /* We declare the default NSFileManager into fileManager */
+       NSFileManager * fileManager = [NSFileManager defaultManager];
+       /* we set the files and support paths here */
+       AppSupportDirectory = @"~/Library/Application Support/HandBrake";
+    AppSupportDirectory = [AppSupportDirectory stringByExpandingTildeInPath];
+    //UserPresetsFile = @"~/Library/Application Support/HandBrake/UserPresets.plist";
+    //UserPresetsFile = [UserPresetsFile stringByExpandingTildeInPath];
+       /* We check for the app support directory for handbrake */
+       if ([fileManager fileExistsAtPath:AppSupportDirectory] == 0) 
+       {
+               // If it doesnt exist yet, we create it here 
+               [fileManager createDirectoryAtPath:AppSupportDirectory attributes:nil];
+       }
+       /* We check for the presets.plist here */
+       if ([fileManager fileExistsAtPath:UserPresetsFile] == 0) 
+       {
+               [fileManager createFileAtPath:UserPresetsFile contents:nil attributes:nil];
+       }
+       UserPresetsFile = @"~/Library/Application Support/HandBrake/UserPresets.plist";
+       UserPresetsFile = [[UserPresetsFile stringByExpandingTildeInPath]retain];
+       
+       UserPresets = [[NSMutableArray alloc] initWithContentsOfFile:UserPresetsFile];
+       if (nil == UserPresets) 
+       {
+               UserPresets = [[NSMutableArray alloc] init];
+               [self addFactoryPresets:NULL];
+       }
+       
 }
 
 // ============================================================
@@ -289,240 +316,270 @@ static NSString*       ChooseSourceIdentifier   = @"Choose Source Item Identifie
 // ============================================================
 
 - (void) setupToolbar {
-    // Create a new toolbar instance, and attach it to our document window 
-    NSToolbar *toolbar = [[[NSToolbar alloc] initWithIdentifier: MyDocToolbarIdentifier] autorelease];
+    toolbar = [[[NSToolbar alloc] initWithIdentifier: @"HandBrake Toolbar"] autorelease];
     
-    // Set up toolbar properties: Allow customization, give a default display mode, and remember state in user defaults 
     [toolbar setAllowsUserCustomization: YES];
     [toolbar setAutosavesConfiguration: YES];
     [toolbar setDisplayMode: NSToolbarDisplayModeIconAndLabel];
     
-    // We are the delegate
     [toolbar setDelegate: self];
     
-    // Attach the toolbar to the document window 
     [fWindow setToolbar: toolbar];
 }
 
-- (NSToolbarItem *) toolbar: (NSToolbar *)toolbar itemForItemIdentifier: (NSString *) itemIdent willBeInsertedIntoToolbar:(BOOL) willBeInserted {
-    // Required delegate method:  Given an item identifier, this method returns an item 
-    // The toolbar will use this method to obtain toolbar items that can be displayed in the customization sheet, or in the toolbar itself 
-    NSToolbarItem *toolbarItem = nil;
+- (NSToolbarItem *) toolbar: (NSToolbar *)toolbar itemForItemIdentifier:
+    (NSString *) itemIdent willBeInsertedIntoToolbar:(BOOL) willBeInserted {
+    NSToolbarItem * item = [[NSToolbarItem alloc] initWithItemIdentifier: itemIdent];
     
-    if ([itemIdent isEqual: ToggleDrawerIdentifier]) {
-        toolbarItem = [[[NSToolbarItem alloc] initWithItemIdentifier: itemIdent] autorelease];
-               
-        // Set the text label to be displayed in the toolbar and customization palette 
-               [toolbarItem setLabel: @"Toggle Presets"];
-               [toolbarItem setPaletteLabel: @"Toggler Presets"];
-               
-               // Set up a reasonable tooltip, and image   Note, these aren't localized, but you will likely want to localize many of the item's properties 
-               [toolbarItem setToolTip: @"Open/Close Preset Drawer"];
-               [toolbarItem setImage: [NSImage imageNamed: @"Drawer-List2"]];
-               
-               // Tell the item what message to send when it is clicked 
-               [toolbarItem setTarget: self];
-               [toolbarItem setAction: @selector(toggleDrawer)];
-               
-       } else if ([itemIdent isEqual: StartEncodingIdentifier]) {
-        toolbarItem = [[[NSToolbarItem alloc] initWithItemIdentifier: itemIdent] autorelease];
-               
-        // Set the text label to be displayed in the toolbar and customization palette 
-               [toolbarItem setLabel: @"Start"];
-               [toolbarItem setPaletteLabel: @"Start Encoding"];
-               
-               // Set up a reasonable tooltip, and image   Note, these aren't localized, but you will likely want to localize many of the item's properties 
-               [toolbarItem setToolTip: @"Start Encoding"];
-               [toolbarItem setImage: [NSImage imageNamed: @"Play"]];
-               
-               // Tell the item what message to send when it is clicked 
-               [toolbarItem setTarget: self];
-               [toolbarItem setAction: @selector(Rip:)];
-               
-               
-               
-       } else if ([itemIdent isEqual: ShowQueueIdentifier]) {
-        toolbarItem = [[[NSToolbarItem alloc] initWithItemIdentifier: itemIdent] autorelease];
-               
-        // Set the text label to be displayed in the toolbar and customization palette 
-               [toolbarItem setLabel: @"Show Queue"];
-               [toolbarItem setPaletteLabel: @"Show Queue"];
-               
-               // Set up a reasonable tooltip, and image   Note, these aren't localized, but you will likely want to localize many of the item's properties 
-               [toolbarItem setToolTip: @"Show Queue"];
-               [toolbarItem setImage: [NSImage imageNamed: @"Brushed Window"]];
-               
-               // Tell the item what message to send when it is clicked 
-               [toolbarItem setTarget: self];
-               [toolbarItem setAction: @selector(ShowQueuePanel:)];
-               
-       } else if ([itemIdent isEqual: AddToQueueIdentifier]) {
-        toolbarItem = [[[NSToolbarItem alloc] initWithItemIdentifier: itemIdent] autorelease];
-               
-        // Set the text label to be displayed in the toolbar and customization palette 
-               [toolbarItem setLabel: @"Add to Queue"];
-               [toolbarItem setPaletteLabel: @"Add to Queue"];
-               
-               // Set up a reasonable tooltip, and image   Note, these aren't localized, but you will likely want to localize many of the item's properties 
-               [toolbarItem setToolTip: @"Add to Queue"];
-               [toolbarItem setImage: [NSImage imageNamed: @"Add"]];
-               
-               // Tell the item what message to send when it is clicked 
-               [toolbarItem setTarget: self];
-               [toolbarItem setAction: @selector(AddToQueue:)];
-               
-               
-       } else if ([itemIdent isEqual: PauseEncodingIdentifier]) {
-        toolbarItem = [[[NSToolbarItem alloc] initWithItemIdentifier: itemIdent] autorelease];
-               
-        // Set the text label to be displayed in the toolbar and customization palette 
-               [toolbarItem setLabel: @"Pause"];
-               [toolbarItem setPaletteLabel: @"Pause Encoding"];
-               
-               // Set up a reasonable tooltip, and image   Note, these aren't localized, but you will likely want to localize many of the item's properties 
-               [toolbarItem setToolTip: @"Pause Encoding"];
-               [toolbarItem setImage: [NSImage imageNamed: @"Pause"]];
-               
-               // Tell the item what message to send when it is clicked 
-               [toolbarItem setTarget: self];
-               [toolbarItem setAction: @selector(Pause:)];
-               
-       } else if ([itemIdent isEqual: DebugOutputIdentifier]) {
-        toolbarItem = [[[NSToolbarItem alloc] initWithItemIdentifier: itemIdent] autorelease];
-               
-        // Set the text label to be displayed in the toolbar and customization palette 
-               [toolbarItem setLabel: @"Activity Window"];
-               [toolbarItem setPaletteLabel: @"Show Activity Window"];
-               
-               // Set up a reasonable tooltip, and image   Note, these aren't localized, but you will likely want to localize many of the item's properties 
-               [toolbarItem setToolTip: @"Show Activity Window"];
-               [toolbarItem setImage: [NSImage imageNamed: @"Terminal"]];
-               
-               // Tell the item what message to send when it is clicked 
-               [toolbarItem setTarget: self];
-               [toolbarItem setAction: @selector(showDebugOutputPanel:)];
-        
-               } else if ([itemIdent isEqual: ChooseSourceIdentifier]) {
-         toolbarItem = [[[NSToolbarItem alloc] initWithItemIdentifier: itemIdent] autorelease];
-
-         // Set the text label to be displayed in the toolbar and customization palette 
-                [toolbarItem setLabel: @"Source"];
-                [toolbarItem setPaletteLabel: @"Source"];
-                // Set up a reasonable tooltip, and image   Note, these aren't localized, but you will likely want to localize many of the item's properties 
-                [toolbarItem setToolTip: @"Choose Video Source"];
-                [toolbarItem setImage: [NSImage imageNamed: @"Disc"]];
-                // Tell the item what message to send when it is clicked 
-                [toolbarItem setTarget: self];
-                [toolbarItem setAction: @selector(ShowScanPanel:)];
-       
-    } else {
-        //itemIdent refered to a toolbar item that is not provide or supported by us or cocoa 
-        //Returning nil will inform the toolbar this kind of item is not supported 
-               toolbarItem = nil;
+    if ([itemIdent isEqualToString: ToggleDrawerIdentifier])
+    {
+        [item setLabel: @"Toggle Presets"];
+        [item setPaletteLabel: @"Toggler Presets"];
+        [item setToolTip: @"Open/Close Preset Drawer"];
+        [item setImage: [NSImage imageNamed: @"Drawer-List2"]];
+        [item setTarget: self];
+        [item setAction: @selector(toggleDrawer:)];
+        [item setAutovalidates: NO];
     }
-       
-    return toolbarItem;
+    else if ([itemIdent isEqualToString: StartEncodingIdentifier])
+    {
+        [item setLabel: @"Start"];
+        [item setPaletteLabel: @"Start Encoding"];
+        [item setToolTip: @"Start Encoding"];
+        [item setImage: [NSImage imageNamed: @"Play"]];
+        [item setTarget: self];
+        [item setAction: @selector(Rip:)];
+    }
+    else if ([itemIdent isEqualToString: ShowQueueIdentifier])
+    {
+        [item setLabel: @"Show Queue"];
+        [item setPaletteLabel: @"Show Queue"];
+        [item setToolTip: @"Show Queue"];
+        [item setImage: [NSImage imageNamed: @"Brushed Window"]];
+        [item setTarget: self];
+        [item setAction: @selector(showQueueWindow:)];
+        [item setAutovalidates: NO];
+    }
+    else if ([itemIdent isEqualToString: AddToQueueIdentifier])
+    {
+        [item setLabel: @"Add to Queue"];
+        [item setPaletteLabel: @"Add to Queue"];
+        [item setToolTip: @"Add to Queue"];
+        [item setImage: [NSImage imageNamed: @"Add"]];
+        [item setTarget: self];
+        [item setAction: @selector(addToQueue:)];
+    }
+    else if ([itemIdent isEqualToString: PauseEncodingIdentifier])
+    {
+        [item setLabel: @"Pause"];
+        [item setPaletteLabel: @"Pause Encoding"];
+        [item setToolTip: @"Pause Encoding"];
+        [item setImage: [NSImage imageNamed: @"Pause"]];
+        [item setTarget: self];
+        [item setAction: @selector(Pause:)];
+    }
+    else if ([itemIdent isEqualToString: ShowActivityIdentifier]) {
+        [item setLabel: @"Activity Window"];
+        [item setPaletteLabel: @"Show Activity Window"];
+        [item setToolTip: @"Show Activity Window"];
+        [item setImage: [NSImage imageNamed: @"Terminal"]];
+        [item setTarget: self];
+        [item setAction: @selector(showDebugOutputPanel:)];
+        [item setAutovalidates: NO];
+    }
+    else if ([itemIdent isEqualToString: ChooseSourceIdentifier])
+    {
+        [item setLabel: @"Source"];
+        [item setPaletteLabel: @"Source"];
+        [item setToolTip: @"Choose Video Source"];
+        [item setImage: [NSImage imageNamed: @"Disc"]];
+        [item setTarget: self];
+        [item setAction: @selector(showScanPanel:)];
+        [item setAutovalidates: NO];
+    }
+    else
+    {
+        [item release];
+        return nil;
+    }
+
+    return item;
 }
 
-- (void) toggleDrawer {
-    [fPresetDrawer toggle:self];
+- (NSArray *) toolbarDefaultItemIdentifiers: (NSToolbar *) toolbar
+{
+    return [NSArray arrayWithObjects: ChooseSourceIdentifier, NSToolbarSeparatorItemIdentifier, StartEncodingIdentifier,
+        PauseEncodingIdentifier, AddToQueueIdentifier, ShowQueueIdentifier, NSToolbarFlexibleSpaceItemIdentifier, 
+               NSToolbarSpaceItemIdentifier, ShowActivityIdentifier, ToggleDrawerIdentifier, nil];
 }
 
-- (NSArray *) toolbarDefaultItemIdentifiers: (NSToolbar *) toolbar {
-    // Required delegate method:  Returns the ordered list of items to be shown in the toolbar by default    
-    // If during the toolbar's initialization, no overriding values are found in the user defaults, or if the
-    // user chooses to revert to the default items this set will be used 
-    return [NSArray arrayWithObjects: ChooseSourceIdentifier, NSToolbarSeparatorItemIdentifier, StartEncodingIdentifier, PauseEncodingIdentifier,
-               AddToQueueIdentifier, ShowQueueIdentifier,
-               NSToolbarFlexibleSpaceItemIdentifier, 
-               NSToolbarSpaceItemIdentifier, DebugOutputIdentifier, ToggleDrawerIdentifier, nil];
+- (NSArray *) toolbarAllowedItemIdentifiers: (NSToolbar *) toolbar
+{
+    return [NSArray arrayWithObjects:  StartEncodingIdentifier, PauseEncodingIdentifier, AddToQueueIdentifier,
+        ChooseSourceIdentifier, ShowQueueIdentifier, ShowActivityIdentifier, ToggleDrawerIdentifier,
+        NSToolbarCustomizeToolbarItemIdentifier, NSToolbarFlexibleSpaceItemIdentifier,
+        NSToolbarSpaceItemIdentifier, NSToolbarSeparatorItemIdentifier, nil];
 }
 
-- (NSArray *) toolbarAllowedItemIdentifiers: (NSToolbar *) toolbar {
-    // Required delegate method:  Returns the list of all allowed items by identifier.  By default, the toolbar 
-    // does not assume any items are allowed, even the separator.  So, every allowed item must be explicitly listed   
-    // The set of allowed items is used to construct the customization palette 
-    return [NSArray arrayWithObjects:  StartEncodingIdentifier, PauseEncodingIdentifier, AddToQueueIdentifier, ShowQueueIdentifier,
-               DebugOutputIdentifier, NSToolbarCustomizeToolbarItemIdentifier,
-               NSToolbarFlexibleSpaceItemIdentifier, NSToolbarSpaceItemIdentifier, NSToolbarSpaceItemIdentifier, ChooseSourceIdentifier,
-               NSToolbarSeparatorItemIdentifier,ToggleDrawerIdentifier, nil];
+- (BOOL) validateToolbarItem: (NSToolbarItem *) toolbarItem
+{
+    NSString * ident = [toolbarItem itemIdentifier];
+        
+    if (fHandle)
+    {
+        hb_state_t s;
+        hb_get_state2( fHandle, &s );
+        
+        if (s.state == HB_STATE_WORKING || s.state == HB_STATE_MUXING)
+        {
+            if ([ident isEqualToString: StartEncodingIdentifier])
+            {
+                [toolbarItem setImage: [NSImage imageNamed: @"Stop"]];
+                [toolbarItem setLabel: @"Stop"];
+                [toolbarItem setPaletteLabel: @"Stop"];
+                [toolbarItem setToolTip: @"Stop Encoding"];
+                return YES;
+            }
+            if ([ident isEqualToString: PauseEncodingIdentifier])
+            {
+                [toolbarItem setImage: [NSImage imageNamed: @"Pause"]];
+                [toolbarItem setLabel: @"Pause"];
+                [toolbarItem setPaletteLabel: @"Pause Encoding"];
+                [toolbarItem setToolTip: @"Pause Encoding"];
+                return YES;
+            }
+            if (SuccessfulScan)
+                if ([ident isEqualToString: AddToQueueIdentifier])
+                    return YES;
+        }
+        else if (s.state == HB_STATE_PAUSED)
+        {
+            if ([ident isEqualToString: PauseEncodingIdentifier])
+            {
+                [toolbarItem setImage: [NSImage imageNamed: @"Play"]];
+                [toolbarItem setLabel: @"Resume"];
+                [toolbarItem setPaletteLabel: @"Resume Encoding"];
+                [toolbarItem setToolTip: @"Resume Encoding"];
+                return YES;
+            }
+            if ([ident isEqualToString: StartEncodingIdentifier])
+                return YES;
+            if ([ident isEqualToString: AddToQueueIdentifier])
+                return YES;
+        }
+        else if (s.state == HB_STATE_SCANNING)
+            return NO;
+        else if (s.state == HB_STATE_WORKDONE || s.state == HB_STATE_SCANDONE || SuccessfulScan)
+        {
+            if ([ident isEqualToString: StartEncodingIdentifier])
+            {
+                [toolbarItem setImage: [NSImage imageNamed: @"Play"]];
+                if (hb_count(fHandle) > 0)
+                    [toolbarItem setLabel: @"Start Queue"];
+                else
+                    [toolbarItem setLabel: @"Start"];
+                [toolbarItem setPaletteLabel: @"Start Encoding"];
+                [toolbarItem setToolTip: @"Start Encoding"];
+                return YES;
+            }
+            if ([ident isEqualToString: AddToQueueIdentifier])
+                return YES;
+        }
+
+    }
+    
+    if ([ident isEqualToString: ShowQueueIdentifier])
+        return YES;
+    if ([ident isEqualToString: ToggleDrawerIdentifier])
+        return YES;
+    if ([ident isEqualToString: ChooseSourceIdentifier])
+        return YES;
+    if ([ident isEqualToString: ShowActivityIdentifier])
+        return YES;
+    
+    return NO;
 }
 
-- (BOOL) validateToolbarItem: (NSToolbarItem *) toolbarItem {
-    // Optional method:  This message is sent to us since we are the target of some toolbar item actions 
-    BOOL enable = NO;
-    if ([[toolbarItem itemIdentifier] isEqual: ToggleDrawerIdentifier]) {
-               enable = YES;
-       }
-       if ([[toolbarItem itemIdentifier] isEqual: StartEncodingIdentifier]) {
-               enable = startButtonEnabled;
-               if(stopOrStart) {
-                       [toolbarItem setImage: [NSImage imageNamed: @"Stop"]];
-                       [toolbarItem setLabel: @"Cancel"];
-                       [toolbarItem setPaletteLabel: @"Cancel"];
-                       [toolbarItem setToolTip: @"Cancel Encoding"];
-               }
-               else {
-                       [toolbarItem setImage: [NSImage imageNamed: @"Play"]];
-                       [toolbarItem setLabel: @"Start"];
-                       [toolbarItem setPaletteLabel: @"Start Encoding"];
-                       [toolbarItem setToolTip: @"Start Encoding"];
-               }
-               
-       }
-       if ([[toolbarItem itemIdentifier] isEqual: PauseEncodingIdentifier]) {
-               enable = pauseButtonEnabled;
-               if(resumeOrPause) {
-                       [toolbarItem setImage: [NSImage imageNamed: @"Play"]];
-                       [toolbarItem setLabel: @"Resume"];
-                       [toolbarItem setPaletteLabel: @"Resume Encoding"];
-                       [toolbarItem setToolTip: @"Resume Encoding"];
-               }
-               else {
-                       [toolbarItem setImage: [NSImage imageNamed: @"Pause"]];
-                       [toolbarItem setLabel: @"Pause"];
-                       [toolbarItem setPaletteLabel: @"Pause Encoding"];
-                       [toolbarItem setToolTip: @"Pause Encoding"];
-               }
-       }
-       if ([[toolbarItem itemIdentifier] isEqual: DebugOutputIdentifier]) {
-               enable = YES;
-       }
-       if ([[toolbarItem itemIdentifier] isEqual: ShowQueueIdentifier]) {
-               enable = YES;
-       }
-       if ([[toolbarItem itemIdentifier] isEqual: AddToQueueIdentifier]) {
-               enable = AddToQueueButtonEnabled;
-       }
-       if ([[toolbarItem itemIdentifier] isEqual: ChooseSourceIdentifier]) {
-        enable = YES;
-    }    
-       return enable;
+- (BOOL) validateMenuItem: (NSMenuItem *) menuItem
+{
+    SEL action = [menuItem action];
+    
+    hb_state_t s;
+    hb_get_state2( fHandle, &s );
+    
+    if (fHandle)
+    {
+        if (action == @selector(addToQueue:) || action == @selector(showPicturePanel:) || action == @selector(showAddPresetPanel:))
+            return SuccessfulScan && [fWindow attachedSheet] == nil;
+        
+        if (action == @selector(showScanPanel:))
+        {
+            if (s.state == HB_STATE_SCANNING)
+                return NO;
+            else
+                return [fWindow attachedSheet] == nil;
+        }
+        if (action == @selector(selectDefaultPreset:))
+            return [tableView selectedRow] >= 0 && [fWindow attachedSheet] == nil;
+        if (action == @selector(Pause:))
+        {
+            if (s.state == HB_STATE_WORKING)
+            {
+                if(![[menuItem title] isEqualToString:@"Pause Encoding"])
+                    [menuItem setTitle:@"Pause Encoding"];
+                return YES;
+            }
+            else if (s.state == HB_STATE_PAUSED)
+            {
+                if(![[menuItem title] isEqualToString:@"Resume Encoding"])
+                    [menuItem setTitle:@"Resume Encoding"];
+                return YES;
+            }
+            else
+                return NO;
+        }
+        if (action == @selector(Rip:))
+            if (s.state == HB_STATE_WORKING || s.state == HB_STATE_MUXING || s.state == HB_STATE_PAUSED)
+            {
+                if(![[menuItem title] isEqualToString:@"Stop Encoding"])
+                    [menuItem setTitle:@"Stop Encoding"];
+                return YES;
+            }
+            else if (SuccessfulScan)
+            {
+                if(![[menuItem title] isEqualToString:@"Start Encoding"])
+                    [menuItem setTitle:@"Start Encoding"];
+                return [fWindow attachedSheet] == nil;
+            }
+            else
+                return NO;
+        }
+    
+    return YES;
 }
 
+
 // register a test notification and make
 // it enabled by default
 #define SERVICE_NAME @"Encode Done"
 - (NSDictionary *)registrationDictionaryForGrowl 
 { 
-NSDictionary *registrationDictionary = [NSDictionary dictionaryWithObjectsAndKeys: 
-[NSArray arrayWithObjects:SERVICE_NAME,nil], GROWL_NOTIFICATIONS_ALL, 
-[NSArray arrayWithObjects:SERVICE_NAME,nil], GROWL_NOTIFICATIONS_DEFAULT, 
-nil]; 
+    NSDictionary *registrationDictionary = [NSDictionary dictionaryWithObjectsAndKeys: 
+    [NSArray arrayWithObjects:SERVICE_NAME,nil], GROWL_NOTIFICATIONS_ALL, 
+    [NSArray arrayWithObjects:SERVICE_NAME,nil], GROWL_NOTIFICATIONS_DEFAULT, 
+    nil]; 
 
-return registrationDictionary; 
+    return registrationDictionary; 
 } 
+
 - (void) TranslateStrings
 {
-    [fSrcDVD1Field      setStringValue: _( @"DVD:" )];
     [fSrcTitleField     setStringValue: _( @"Title:" )];
     [fSrcChapterField   setStringValue: _( @"Chapters:" )];
     [fSrcChapterToField setStringValue: _( @"to" )];
     [fSrcDuration1Field setStringValue: _( @"Duration:" )];
 
-    [fDstFormatField    setStringValue: _( @"File format:" )];
+    [fDstFormatField    setStringValue: _( @"Format:" )];
     [fDstCodecsField    setStringValue: _( @"Codecs:" )];
     [fDstFile1Field     setStringValue: _( @"File:" )];
     [fDstBrowseButton   setTitle:       _( @"Browse" )];
@@ -616,39 +673,27 @@ return registrationDictionary;
     [icon release];
 }
 
-- (void) UpdateUI: (NSTimer *) timer
+- (void) updateUI: (NSTimer *) timer
 {
 
-hb_list_t  * list;
-list = hb_get_titles( fHandle );       
+    hb_list_t  * list;
+    list = hb_get_titles( fHandle );   
     /* check to see if there has been a new scan done
        this bypasses the constraints of HB_STATE_WORKING
        not allowing setting a newly scanned source */
        int checkScanCount = hb_get_scancount( fHandle );
        if (checkScanCount > currentScanCount)
        {
-
+               
                currentScanCount = checkScanCount;
-                       [fScanController Cancel: NULL];
-                   [fScanIndicator setIndeterminate: NO];
-            [fScanIndicator setDoubleValue: 0.0];
-                       [fScanIndicator setHidden: YES];
-                       [fScanController Cancel: NULL];
-                       if( !hb_list_count( list ) )
-            {
-                       /* We display a message if a valid dvd source was not chosen */
-                       [fSrcDVD2Field setStringValue: @"No Valid DVD Source Chosen"];
-            currentSource = [fSrcDVD2Field stringValue];
-            }
-                       else
-                       {
-                       [self ShowNewScan: NULL];
-                       }
+               //[fScanController Cancel: NULL];
+               [fScanIndicator setIndeterminate: NO];
+               [fScanIndicator setDoubleValue: 0.0];
+               [fScanIndicator setHidden: YES];
+
+               [self showNewScan: NULL];
        }
        
-       
-       
-       
     hb_state_t s;
     hb_get_state( fHandle, &s );
        
@@ -656,7 +701,7 @@ list = hb_get_titles( fHandle );
     switch( s.state )
     {
         case HB_STATE_IDLE:
-            break;
+               break;
 #define p s.param.scanning                     
         case HB_STATE_SCANNING:
                {
@@ -677,18 +722,9 @@ list = hb_get_titles( fHandle );
                        [fScanIndicator setIndeterminate: NO];
             [fScanIndicator setDoubleValue: 0.0];
                        [fScanIndicator setHidden: YES];
-                       [fScanController Cancel: NULL];
-                       if( !hb_list_count( list ) )
-            {
-                       /* We display a message if a valid dvd source was not chosen */
-                       [fSrcDVD2Field setStringValue: @"No Valid DVD Source Chosen"];
-            currentSource = [fSrcDVD2Field stringValue];
-            }
-                       else
-                       {
-                       [self ShowNewScan: NULL];
-                       }
-            break;
+                       [self showNewScan: NULL];
+            [toolbar validateVisibleItems];
+                       break;
         }
 #undef p
                        
@@ -716,15 +752,33 @@ list = hb_get_titles( fHandle );
             [fRipIndicator setIndeterminate: NO];
             [fRipIndicator setDoubleValue: 100.0 * progress_total];
                        
+            // If progress bar hasn't been revealed at the bottom of the window, do
+            // that now. This code used to be in doRip. I moved it to here to handle
+            // the case where hb_start is called by HBQueueController and not from
+            // HBController.
+            if (!fRipIndicatorShown)
+            {
+                NSRect frame = [fWindow frame];
+                if (frame.size.width <= 591)
+                    frame.size.width = 591;
+                frame.size.height += 36;
+                frame.origin.y -= 36;
+                [fWindow setFrame:frame display:YES animate:YES];
+                fRipIndicatorShown = YES;
+            }
+
             /* Update dock icon */
             [self UpdateDockIcon: progress_total];
                        
-            /* new toolbar controls */
-            pauseButtonEnabled = YES;
-            resumeOrPause = NO;
-            startButtonEnabled = YES;
-            stopOrStart = YES;                 
-                       
+            // Has current job changed? That means the queue has probably changed as
+                       // well so update it
+            if (fLastKnownCurrentJob != hb_current_job(fHandle))
+            {
+                fLastKnownCurrentJob = hb_current_job(fHandle);
+                [fQueueController updateQueueUI];
+            }
+            [fQueueController updateCurrentJobUI];
+            
             break;
         }
 #undef p
@@ -746,59 +800,68 @@ list = hb_get_titles( fHandle );
             /* Update dock icon */
             [self UpdateDockIcon: 1.0];
                        
-            //[fPauseButton setEnabled: YES];
-            //[fPauseButton setTitle: _( @"Pause" )];
-            //[fRipButton setEnabled: YES];
-                       // [fRipButton setTitle: _( @"Cancel" )];
+                       // Pass along the info to HBQueueController
+            [fQueueController updateCurrentJobUI];
+                       
             break;
         }
 #undef p
                        
         case HB_STATE_PAUSED:
-                   //[fStatusField setStringValue: _( @"Paused" )];
-            //[fPauseButton setEnabled: YES];
-            //[fPauseButton setTitle: _( @"Resume" )];
-            //[fRipButton setEnabled: YES];
-            //[fRipButton setTitle: _( @"Cancel" )];
-                       /* new toolbar controls */
-            pauseButtonEnabled = YES;
-            resumeOrPause = YES;
-            startButtonEnabled = YES;
-            stopOrStart = YES;
+                   [fStatusField setStringValue: _( @"Paused" )];
+            
+                       // Pass along the info to HBQueueController
+            [fQueueController updateCurrentJobUI];
+
             break;
                        
         case HB_STATE_WORKDONE:
         {
+            // HB_STATE_WORKDONE happpens as a result of hblib finishing all its jobs
+            // or someone calling hb_stop. In the latter case, hb_stop does not clear
+            // out the remaining passes/jobs in the queue. We'll do that here.
+                        
+            // Delete all remaining scans of this job, ie, delete whole encodes.
+            hb_job_t * job;
+            while( ( job = hb_job( fHandle, 0 ) ) && (job->sequence_id != 0) )
+                hb_rem( fHandle, job );
+
+            // Start processing back up if jobs still left in queue
+            if (hb_count(fHandle) > 0)
+            {
+                hb_start(fHandle);
+                fEncodeState = 1;
+                // Validate the toolbar (hack). The toolbar will usually get autovalidated
+                // before we had the chance to restart the queue, hence it will now be in
+                // the wrong state.
+                [toolbar validateVisibleItems];
+                break;
+            }
+
             [fStatusField setStringValue: _( @"Done." )];
             [fRipIndicator setIndeterminate: NO];
             [fRipIndicator setDoubleValue: 0.0];
-            //[fRipButton setTitle: _( @"Start" )];
-                       
+            [toolbar validateVisibleItems];
+
             /* Restore dock icon */
             [self UpdateDockIcon: -1.0];
+
+            if (fRipIndicatorShown)
+            {
+                NSRect frame = [fWindow frame];
+                if (frame.size.width <= 591)
+                                   frame.size.width = 591;
+                frame.size.height += -36;
+                frame.origin.y -= -36;
+                [fWindow setFrame:frame display:YES animate:YES];
+                               fRipIndicatorShown = NO;
+                       }
                        
-            //[fPauseButton setEnabled: NO];
-            //[fPauseButton setTitle: _( @"Pause" )];
-                       // [fRipButton setEnabled: YES];
-                       // [fRipButton setTitle: _( @"Start" )];
-                       /* new toolbar controls */
-            pauseButtonEnabled = NO;
-            resumeOrPause = NO;
-            startButtonEnabled = YES;
-            stopOrStart = NO;
-                       NSRect frame = [fWindow frame];
-                       if (frame.size.width <= 591)
-                               frame.size.width = 591;
-                       frame.size.height += -44;
-                       frame.origin.y -= -44;
-                       [fWindow setFrame:frame display:YES animate:YES];
+            // Queue has been modified so update the UI
+                       fLastKnownCurrentJob = nil;
+            [fQueueController updateQueueUI];
+            [fQueueController updateCurrentJobUI];
                        
-            /* FIXME */
-            hb_job_t * job;
-            while( ( job = hb_job( fHandle, 0 ) ) )
-            {
-                hb_rem( fHandle, job );
-            }
             /* Check to see if the encode state has not been cancelled
                                to determine if we should check for encode done notifications */
                        if (fEncodeState != 2)                  {
@@ -816,168 +879,215 @@ list = hb_get_titles( fHandle );
                                        /*On Screen Notification*/
                                        int status;
                                        NSBeep();
-                                       status = NSRunAlertPanel(@"Put down that cocktail...",@"your HandBrake encode is done!", @"OK", nil, nil);
+                                       status = NSRunAlertPanel(@"Put down that cocktail...",@"Your HandBrake encode is done!", @"OK", nil, nil);
                                        [NSApp requestUserAttention:NSCriticalRequest];
                                        if ( status == NSAlertDefaultReturn ) 
                                        {
-                                               [self EnableUI: YES];
+                                               [self enableUI: YES];
                                        }
                 }
                                else
                                {
-                                       [self EnableUI: YES];
+                                       [self enableUI: YES];
                                }
+                                  /* If sleep has been selected */ 
+            if ([[[NSUserDefaults standardUserDefaults] stringForKey:@"AlertWhenDone"] isEqualToString: @"Put Computer To Sleep"]) 
+                { 
+               /* Sleep */ 
+               NSDictionary* errorDict; 
+               NSAppleEventDescriptor* returnDescriptor = NULL; 
+               NSAppleScript* scriptObject = [[NSAppleScript alloc] initWithSource: 
+                        @"tell application \"Finder\" to sleep"]; 
+               returnDescriptor = [scriptObject executeAndReturnError: &errorDict]; 
+               [scriptObject release]; 
+               [self enableUI: YES]; 
+                } 
+            /* If Shutdown has been selected */ 
+            if ([[[NSUserDefaults standardUserDefaults] stringForKey:@"AlertWhenDone"] isEqualToString: @"Shut Down Computer"]) 
+                { 
+               /* Shut Down */ 
+               NSDictionary* errorDict; 
+               NSAppleEventDescriptor* returnDescriptor = NULL; 
+               NSAppleScript* scriptObject = [[NSAppleScript alloc] initWithSource: 
+                        @"tell application \"Finder\" to shut down"]; 
+               returnDescriptor = [scriptObject executeAndReturnError: &errorDict]; 
+               [scriptObject release]; 
+               [self enableUI: YES]; 
+                }
+                       
+                                               // MetaX insertion via AppleScript
+                       if([[NSUserDefaults standardUserDefaults] boolForKey: @"sendToMetaX"] == YES)
+                       {
+                       NSAppleScript *myScript = [[NSAppleScript alloc] initWithSource: [NSString stringWithFormat: @"%@%@%@", @"tell application \"MetaX\" to open (POSIX file \"", [fDstFile2Field stringValue], @"\")"]];
+                       [myScript executeAndReturnError: nil];
+                       [myScript release];
+                       }
+                       
+                       
                        }
                        else
                        {
-                               [self EnableUI: YES];
+                               [self enableUI: YES];
                        }
             break;
         }
     }
        
-    /* Lets show the queue status
-               here in the main window*/
+    /* Lets show the queue status here in the main window */
        int queue_count = hb_count( fHandle );
        if( queue_count )
        {
                [fQueueStatus setStringValue: [NSString stringWithFormat:
-                       @"%d task%s in the queue",
-                                                queue_count, ( queue_count > 1 ) ? "s" : ""]];
+                       @"%d pass%s in the queue",
+                                                queue_count, ( queue_count > 1 ) ? "es" : ""]];
        }
        else
        {
                [fQueueStatus setStringValue: @""];
        }
-       
-    [[NSRunLoop currentRunLoop] addTimer: [NSTimer
-        scheduledTimerWithTimeInterval: 0.5 target: self
-                                                         selector: @selector( UpdateUI: ) userInfo: NULL repeats: FALSE]
-                                                                forMode: NSModalPanelRunLoopMode];
 }
-- (IBAction) ShowNewScan:(id)sender
-{
-            hb_list_t  * list;
-            hb_title_t * title;
-                       int indxpri=0;    // Used to search the longuest title (default in combobox)
-                       int longuestpri=0; // Used to search the longuest title (default in combobox)
-
-            //[fScanController UpdateUI: &s];
 
-            list = hb_get_titles( fHandle );
-
-            if( !hb_list_count( list ) )
-            {
-                       /* We display a message if a valid dvd source was not chosen */
-                       [fSrcDVD2Field setStringValue: @"No Valid DVD Source Chosen"];
-            currentSource = [fSrcDVD2Field stringValue];
-            }
+- (IBAction) showNewScan:(id)sender
+{
+       hb_list_t  * list;
+       hb_title_t * title;
+       int indxpri=0;    // Used to search the longuest title (default in combobox)
+       int longuestpri=0; // Used to search the longuest title (default in combobox)
+       
+       list = hb_get_titles( fHandle );
+       
+       if( !hb_list_count( list ) )
+       {
+               /* We display a message if a valid dvd source was not chosen */
+               [fSrcDVD2Field setStringValue: @"No Valid Title Found"];
+        SuccessfulScan = 0;
+       }
+       else
+       {
+     /* We increment the successful scancount here by one,
+                  which we use at the end of this function to tell the gui
+                  if this is the first successful scan since launch and whether
+                  or not we should set all settings to the defaults */
+               
+        SuccessfulScan = 1;
+        currentSuccessfulScanCount++;
 
+               [self enableUI: YES];
 
-            [fSrcTitlePopUp removeAllItems];
-            for( int i = 0; i < hb_list_count( list ); i++ )
-            {
-                title = (hb_title_t *) hb_list_item( list, i );
-                /*Set DVD Name at top of window*/
-                               [fSrcDVD2Field setStringValue:[NSString stringWithUTF8String: title->name]];
-                               currentSource = [NSString stringWithUTF8String: title->dvd];
-                               sourceDisplayName = [NSString stringWithUTF8String: title->name];
-                               /* Use the dvd name in the default output field here 
+        [toolbar validateVisibleItems];
+               
+               [fSrcTitlePopUp removeAllItems];
+               for( int i = 0; i < hb_list_count( list ); i++ )
+               {
+                       title = (hb_title_t *) hb_list_item( list, i );
+                       /*Set DVD Name at top of window*/
+                       [fSrcDVD2Field setStringValue:[NSString stringWithUTF8String: title->name]];
+                       
+                       currentSource = [NSString stringWithUTF8String: title->dvd];
+                       
+                       
+                       /* Use the dvd name in the default output field here 
                                May want to add code to remove blank spaces for some dvd names*/
-                               /* Check to see if the last destination has been set,use if so, if not, use Desktop */
-                               if ([[NSUserDefaults standardUserDefaults] stringForKey:@"LastDestinationDirectory"])
-                               {
+                       /* Check to see if the last destination has been set,use if so, if not, use Desktop */
+                       if ([[NSUserDefaults standardUserDefaults] stringForKey:@"LastDestinationDirectory"])
+                       {
                                [fDstFile2Field setStringValue: [NSString stringWithFormat:
-                @"%@/%@.mp4", [[NSUserDefaults standardUserDefaults] stringForKey:@"LastDestinationDirectory"],[NSString
+                                       @"%@/%@.mp4", [[NSUserDefaults standardUserDefaults] stringForKey:@"LastDestinationDirectory"],[NSString
                   stringWithUTF8String: title->name]]];
-                               }
-                               else
-                               {
+                       }
+                       else
+                       {
                                [fDstFile2Field setStringValue: [NSString stringWithFormat:
-                @"%@/Desktop/%@.mp4", NSHomeDirectory(),[NSString
+                                       @"%@/Desktop/%@.mp4", NSHomeDirectory(),[NSString
                   stringWithUTF8String: title->name]]];
-                               }
-
-                  
-                if (longuestpri < title->hours*60*60 + title->minutes *60 + title->seconds)
-                {
-                       longuestpri=title->hours*60*60 + title->minutes *60 + title->seconds;
-                       indxpri=i;
-                }
-                
-                               
-                int format = [fDstFormatPopUp indexOfSelectedItem];
-                               char * ext = NULL;
-                               switch( format )
-                {
-                 case 0:
-                                        
-                                        /*Get Default MP4 File Extension for mpeg4 (.mp4 or .m4v) from prefs*/
-                                        if ([[NSUserDefaults standardUserDefaults] boolForKey:@"DefaultMpegName"] > 0)
-                                        {
-                                        ext = "m4v";
-                                        }
-                                    else
-                                    {
-                                        ext = "mp4";
-                                        }
+                       }
+                       
+                       
+                       if (longuestpri < title->hours*60*60 + title->minutes *60 + title->seconds)
+                       {
+                               longuestpri=title->hours*60*60 + title->minutes *60 + title->seconds;
+                               indxpri=i;
+                       }
+                       
+                       
+                       int format = [fDstFormatPopUp indexOfSelectedItem];
+                       char * ext = NULL;
+                       switch( format )
+                       {
+                               case 0:
+                                       
+                                       /*Get Default MP4 File Extension for mpeg4 (.mp4 or .m4v) from prefs*/
+                                       if ([[NSUserDefaults standardUserDefaults] boolForKey:@"DefaultMpegName"] > 0)
+                                       {
+                                               ext = "m4v";
+                                       }
+                                       else
+                                       {
+                                               ext = "mp4";
+                                       }
                                        break;
                                case 1: 
-                     ext = "avi";
-                     break;
+                                       ext = "avi";
+                                       break;
                                case 2:
-                     ext = "ogm";
-                                break;
-                                  }
-                               
-                               
-                               NSString * string = [fDstFile2Field stringValue];
-                               /* Add/replace File Output name to the correct extension*/
-                               if( [string characterAtIndex: [string length] - 4] == '.' )
-                               {
-                                       [fDstFile2Field setStringValue: [NSString stringWithFormat:
-                                               @"%@.%s", [string substringToIndex: [string length] - 4],
-                                               ext]];
-                               }
-                               else
-                               {
-                                       [fDstFile2Field setStringValue: [NSString stringWithFormat:
-                                               @"%@.%s", string, ext]];
-                               }
-
-                               
-                           [fSrcTitlePopUp addItemWithTitle: [NSString
-                    stringWithFormat: @"%d - %02dh%02dm%02ds",
-                    title->index, title->hours, title->minutes,
-                    title->seconds]];
+                                       ext = "ogm";
+                                       break;
+                               case 3:
+                                       ext = "mkv";
+                                       break;
+                       }
+                       
+                       
+                       NSString * string = [fDstFile2Field stringValue];
+                       /* Add/replace File Output name to the correct extension*/
+                       if( [string characterAtIndex: [string length] - 4] == '.' )
+                       {
+                               [fDstFile2Field setStringValue: [NSString stringWithFormat:
+                                       @"%@.%s", [string substringToIndex: [string length] - 4],
+                                       ext]];
+                       }
+                       else
+                       {
+                               [fDstFile2Field setStringValue: [NSString stringWithFormat:
+                                       @"%@.%s", string, ext]];
+                       }
                        
-            }
-            // Select the longuest title
-                       [fSrcTitlePopUp selectItemAtIndex: indxpri];
-            /* We set the Settings Display to "Default" here
-                               until we get default presets implemented */
-                       [fPresetSelectedDisplay setStringValue: @"Default"];
-                       /* We set the auto crop in the main window to value "1" just as in PictureController,
-                        as it does not seem to be taken from any job-> variable */
-                       [fPicSettingAutoCrop setStringValue: [NSString stringWithFormat:
-                               @"%d", 1]];
                        
-            [self TitlePopUpChanged: NULL];
-            [self EnableUI: YES];
-            //[fPauseButton setEnabled: NO];
-            //[fRipButton   setEnabled: YES];
-               startButtonEnabled = YES;
-       stopOrStart = NO;
-       AddToQueueButtonEnabled = YES;
-       pauseButtonEnabled = NO;
-       resumeOrPause = NO;
+                       [fSrcTitlePopUp addItemWithTitle: [NSString
+                    stringWithFormat: @"%d - %02dh%02dm%02ds",
+                               title->index, title->hours, title->minutes,
+                               title->seconds]];
+                       
+               }
+               // Select the longuest title
+               [fSrcTitlePopUp selectItemAtIndex: indxpri];
+               [self titlePopUpChanged: NULL];
+               
+               
+               
+               [self enableUI: YES];
+               
+               /* we record the current source name here in case the next scan is unsuccessful,
+                               then we can replace the scan progress with the old name if necessary */
+       sourceDisplayName = [NSString stringWithFormat:[fSrcDVD2Field stringValue]];
+       
+       /* if its the initial successful scan after awakeFromNib */
+          if (currentSuccessfulScanCount == 1)
+          {
+           [self selectDefaultPreset: NULL];
+           /* if Deinterlace upon launch is specified in the prefs, then set to 1 for "Fast",
+           if not, then set to 0 for none */
+           if ([[NSUserDefaults standardUserDefaults] boolForKey:@"DefaultDeinterlaceOn"] > 0)
+               [fPictureController setDeinterlace:1];
+           else
+               [fPictureController setDeinterlace:0];
+          }
+       
+       }
 }
 
-
 -(IBAction)showGrowlDoneNotification:(id)sender
 {
-
-  
   [GrowlApplicationBridge 
           notifyWithTitle:@"Put down that cocktail..." 
               description:@"your HandBrake encode is done!" 
@@ -987,10 +1097,11 @@ list = hb_get_titles( fHandle );
                  isSticky:1 
              clickContext:nil];
 }
-- (void) EnableUI: (bool) b
+
+- (void) enableUI: (bool) b
 {
     NSControl * controls[] =
-      { fSrcDVD1Field, fSrcTitleField, fSrcTitlePopUp,
+      { fSrcTitleField, fSrcTitlePopUp,
         fSrcChapterField, fSrcChapterStartPopUp, fSrcChapterToField,
         fSrcChapterEndPopUp, fSrcDuration1Field, fSrcDuration2Field,
         fDstFormatField, fDstFormatPopUp, fDstCodecsField,
@@ -1002,23 +1113,13 @@ list = hb_get_titles( fHandle );
         fAudTrack1MixLabel, fAudTrack1MixPopUp, fAudTrack2MixLabel, fAudTrack2MixPopUp,
         fAudRateField, fAudRatePopUp, fAudBitrateField,
         fAudBitratePopUp, fPictureButton,fQueueStatus, 
-               fPicSrcWidth,fPicSrcHeight,fPicSettingWidth,fPicSettingHeight,
-               fPicSettingARkeep,fPicSettingDeinterlace,fPicSettingARkeepDsply,
-               fPicSettingDeinterlaceDsply,fPicLabelSettings,fPicLabelSrc,fPicLabelOutp,
-               fPicLabelAr,fPicLabelDeinter,fPicLabelSrcX,fPicLabelOutputX,
-               fPicLabelPAROutp,fPicLabelPAROutputX,fPicSettingPARWidth,fPicSettingPARHeight,
-               fPicSettingPARDsply,fPicLabelAnamorphic,tableView,fPresetsAdd,fPresetsDelete,
-               fCreateChapterMarkers,fX264optViewTitleLabel,fDisplayX264Options,fDisplayX264OptionsLabel,fX264optBframesLabel,
-               fX264optBframesPopUp,fX264optRefLabel,fX264optRefPopUp,fX264optNfpskipLabel,fX264optNfpskipSwitch,
-               fX264optNodctdcmtLabel,fX264optNodctdcmtSwitch,fX264optSubmeLabel,fX264optSubmePopUp,
-               fX264optTrellisLabel,fX264optTrellisPopUp,fX264optMixedRefsLabel,fX264optMixedRefsSwitch,
-               fX264optMotionEstLabel,fX264optMotionEstPopUp,fX264optMERangeLabel,fX264optMERangePopUp,
-               fX264optWeightBLabel,fX264optWeightBSwitch,fX264optBRDOLabel,fX264optBRDOSwitch,
-               fX264optBPyramidLabel,fX264optBPyramidSwitch,fX264optBiMELabel,fX264optBiMESwitch,
-               fX264optDirectPredLabel,fX264optDirectPredPopUp,fX264optDeblockLabel,fX264optAnalyseLabel,
-               fX264optAnalysePopUp,fX264opt8x8dctLabel,fX264opt8x8dctSwitch,fX264optCabacLabel,fX264optCabacSwitch,
-               fX264optAlphaDeblockPopUp,fX264optBetaDeblockPopUp,fVidTurboPassCheck,fDstMpgLargeFileCheck,fPicSettingAutoCropLabel,
-               fPicSettingAutoCropDsply};
+               fPicSrcWidth,fPicSrcHeight,fPicSettingWidth,fPicSettingHeight,fPicSettingARkeep,
+               fPicSettingDeinterlace,fPicLabelSettings,fPicLabelSrc,fPicLabelOutp,
+               fPicLabelAr,fPicLabelDeinterlace,fPicLabelSrcX,fPicLabelOutputX,
+               fPicLabelPAROutputX,fPicSettingPARWidth,fPicSettingPARHeight,
+               fPicSettingPAR,fPicLabelAnamorphic,tableView,fPresetsAdd,fPresetsDelete,
+               fCreateChapterMarkers,fVidTurboPassCheck,fDstMpgLargeFileCheck,fPicLabelAutoCrop,
+               fPicSettingAutoCrop,fPicSettingDetelecine,fPicLabelDetelecine,fPicLabelDenoise,fPicSettingDenoise,fSubForcedCheck,};
 
     for( unsigned i = 0;
          i < sizeof( controls ) / sizeof( NSControl * ); i++ )
@@ -1041,7 +1142,7 @@ list = hb_get_titles( fHandle );
 
         /* if we're enabling the interface, check if the audio mixdown controls need to be enabled or not */
         /* these will have been enabled by the mass control enablement above anyway, so we're sense-checking it here */
-        [self SetEnabledStateOfAudioMixdownControls: NULL];
+        [self setEnabledStateOfAudioMixdownControls: NULL];
        
        } else {
 
@@ -1049,42 +1150,102 @@ list = hb_get_titles( fHandle );
        
        }
 
-    [self VideoMatrixChanged: NULL];
+    [self videoMatrixChanged: NULL];
+    [fAdvancedOptions enableUI:b];
 }
 
-- (IBAction) ShowScanPanel: (id) sender
+- (IBAction) showScanPanel: (id) sender
 {
-    [fScanController Show];
+    [self enableUI: NO];
+       
+       [self browseSources:NULL];
 }
 
-- (IBAction) OpenMainWindow: (id) sender
+- (void) browseSources: (id) sender
 {
-[fWindow  makeKeyAndOrderFront:nil];
-[fWindow setReleasedWhenClosed: YES];
-}
-- (BOOL) windowShouldClose: (id) sender
-{
-
-       /* See if we are currently running */
-       hb_state_t s;
-       hb_get_state( fHandle, &s );
-       if ( s.state ==  HB_STATE_WORKING)
+    NSOpenPanel * panel;
+       
+    panel = [NSOpenPanel openPanel];
+    [panel setAllowsMultipleSelection: NO];
+    [panel setCanChooseFiles: YES];
+    [panel setCanChooseDirectories: YES ];
+    NSString * sourceDirectory;
+       if ([[NSUserDefaults standardUserDefaults] stringForKey:@"LastSourceDirectory"])
        {
-          /* If we are running, leave in memory when closing main window */
-          [fWindow setReleasedWhenClosed: NO];
-          return YES;
-
+               sourceDirectory = [[NSUserDefaults standardUserDefaults] stringForKey:@"LastSourceDirectory"];
        }
        else
        {
-               /* Stop the application when the user closes the window */
-               [NSApp terminate: self];
-               return YES;
+               sourceDirectory = @"~/Desktop";
+               sourceDirectory = [sourceDirectory stringByExpandingTildeInPath];
        }
-       
+   [panel beginSheetForDirectory: sourceDirectory file: nil types: nil
+                                  modalForWindow: fWindow modalDelegate: self
+                                  didEndSelector: @selector( browseSourcesDone:returnCode:contextInfo: )
+                                         contextInfo: nil];
 }
 
-- (IBAction) VideoMatrixChanged: (id) sender;
+- (void) browseSourcesDone: (NSOpenPanel *) sheet
+                returnCode: (int) returnCode contextInfo: (void *) contextInfo
+{
+    /* User selected a file to open */
+       if( returnCode == NSOKButton )
+    {
+        [fSrcDVD2Field setStringValue: _( @"Opening a new source ..." )];
+               [fScanIndicator setHidden: NO];
+           [fScanIndicator setIndeterminate: YES];
+        [fScanIndicator startAnimation: nil];
+               
+               /* we set the last source directory in the prefs here */
+               NSString *sourceDirectory = [[[sheet filenames] objectAtIndex: 0] stringByDeletingLastPathComponent];
+               [[NSUserDefaults standardUserDefaults] setObject:sourceDirectory forKey:@"LastSourceDirectory"];
+               
+        NSString *path = [[sheet filenames] objectAtIndex: 0];
+        HBDVDDetector *detector = [HBDVDDetector detectorForPath:path];
+        if( [detector isVideoDVD] )
+        {
+            // The chosen path was actually on a DVD, so use the raw block
+            // device path instead.
+            path = [detector devicePath];
+        }
+               
+               hb_scan( fHandle, [path UTF8String], 0 );
+       }
+       else // User clicked Cancel in browse window
+       {
+               /* if we have a title loaded up */
+               if ([[fSrcDVD2Field stringValue] length] > 0)
+               {
+            [self enableUI: YES];
+        }
+       }
+}
+
+- (IBAction) openMainWindow: (id) sender
+{
+    [fWindow  makeKeyAndOrderFront:nil];
+    [fWindow setReleasedWhenClosed: YES];
+}
+
+- (BOOL) windowShouldClose: (id) sender
+{
+    [fWindow setReleasedWhenClosed: NO];
+    return YES;
+}
+
+- (BOOL)applicationShouldHandleReopen:(NSApplication *)theApplication hasVisibleWindows:(BOOL)flag
+{
+    if( !flag ) {
+        [fWindow  makeKeyAndOrderFront:nil];
+        [fWindow setReleasedWhenClosed: YES];
+        
+        return YES;
+    }
+    
+    return NO;
+}
+
+- (IBAction) videoMatrixChanged: (id) sender;
 {
     bool target, bitrate, quality;
 
@@ -1112,75 +1273,53 @@ list = hb_get_titles( fHandle );
     if( quality )
     {
         [fVidTwoPassCheck setState: NSOffState];
+               [fVidTurboPassCheck setHidden: YES];
+               [fVidTurboPassCheck setState: NSOffState];
     }
 
-    [self QualitySliderChanged: sender];
-    [self CalculateBitrate:     sender];
-       [self CustomSettingUsed: sender];
+    [self qualitySliderChanged: sender];
+    [self calculateBitrate: sender];
+       [self customSettingUsed: sender];
 }
 
-- (IBAction) QualitySliderChanged: (id) sender
+- (IBAction) qualitySliderChanged: (id) sender
 {
     [fVidConstantCell setTitle: [NSString stringWithFormat:
         _( @"Constant quality: %.0f %%" ), 100.0 *
         [fVidQualitySlider floatValue]]];
-               [self CustomSettingUsed: sender];
+               [self customSettingUsed: sender];
 }
 
-- (IBAction) BrowseFile: (id) sender
+- (IBAction) browseFile: (id) sender
 {
     /* Open a panel to let the user choose and update the text field */
     NSSavePanel * panel = [NSSavePanel savePanel];
        /* We get the current file name and path from the destination field here */
        [panel beginSheetForDirectory: [[fDstFile2Field stringValue] stringByDeletingLastPathComponent] file: [[fDstFile2Field stringValue] lastPathComponent]
                                   modalForWindow: fWindow modalDelegate: self
-                                  didEndSelector: @selector( BrowseFileDone:returnCode:contextInfo: )
+                                  didEndSelector: @selector( browseFileDone:returnCode:contextInfo: )
                                          contextInfo: NULL];
 }
 
-- (void) BrowseFileDone: (NSSavePanel *) sheet
+- (void) browseFileDone: (NSSavePanel *) sheet
     returnCode: (int) returnCode contextInfo: (void *) contextInfo
 {
     if( returnCode == NSOKButton )
     {
         [fDstFile2Field setStringValue: [sheet filename]];
-               
     }
 }
 
-- (IBAction) ShowPicturePanel: (id) sender
+- (IBAction) showPicturePanel: (id) sender
 {
-    hb_list_t  * list  = hb_get_titles( fHandle );
+       hb_list_t  * list  = hb_get_titles( fHandle );
     hb_title_t * title = (hb_title_t *) hb_list_item( list,
             [fSrcTitlePopUp indexOfSelectedItem] );
-
-    /* Resize the panel */
-    NSSize newSize;
-    newSize.width  = 246 + title->width;
-    newSize.height = 80 + title->height;
-    [fPicturePanel setContentSize: newSize];
-
-    [fPictureController SetTitle: title];
-
-    [NSApp beginSheet: fPicturePanel modalForWindow: fWindow
-        modalDelegate: NULL didEndSelector: NULL contextInfo: NULL];
-    [NSApp runModalForWindow: fPicturePanel];
-    [NSApp endSheet: fPicturePanel];
-    [fPicturePanel orderOut: self];
-       [self CalculatePictureSizing: sender];
+    [fPictureController showPanelInWindow:fWindow forTitle:title];
 }
 
-- (IBAction) ShowQueuePanel: (id) sender
-{
-    /* Update the OutlineView */
-    [fQueueController Update: sender];
-
-    /* Show the panel */
-    [NSApp beginSheet: fQueuePanel modalForWindow: fWindow
-        modalDelegate: NULL didEndSelector: NULL contextInfo: NULL];
-    [NSApp runModalForWindow: fQueuePanel];
-    [NSApp endSheet: fQueuePanel];
-    [fQueuePanel orderOut: self];
+- (void)pictureSettingsDidChange {
+       [self calculatePictureSizing: NULL];
 }
 
 - (void) PrepareJob
@@ -1204,17 +1343,7 @@ list = hb_get_titles( fHandle );
     /* If mpeg-4, then set mpeg-4 specific options like chapters and > 4gb file sizes */
        if ([fDstFormatPopUp indexOfSelectedItem] == 0)
        {
-        /* We set the chapter marker extraction here based on the format being
-               mpeg4 and the checkbox being checked */
-               if ([fCreateChapterMarkers state] == NSOnState)
-               {
-                       job->chapter_markers = 1;
-               }
-               else
-               {
-                       job->chapter_markers = 0;
-               }
-               /* We set the largeFileSize (64 bit formatting) variable here to allow for > 4gb files based on the format being
+        /* We set the largeFileSize (64 bit formatting) variable here to allow for > 4gb files based on the format being
                mpeg4 and the checkbox being checked 
                *Note: this will break compatibility with some target devices like iPod, etc.!!!!*/
                if ([[NSUserDefaults standardUserDefaults] boolForKey:@"AllowLargeFiles"] > 0 && [fDstMpgLargeFileCheck state] == NSOnState)
@@ -1226,8 +1355,19 @@ list = hb_get_titles( fHandle );
                        job->largeFileSize = 0;
                }
        }
-       
-       
+       if ([fDstFormatPopUp indexOfSelectedItem] == 0 || [fDstFormatPopUp indexOfSelectedItem] == 3)
+       {
+         /* We set the chapter marker extraction here based on the format being
+               mpeg4 or mkv and the checkbox being checked */
+               if ([fCreateChapterMarkers state] == NSOnState)
+               {
+                       job->chapter_markers = 1;
+               }
+               else
+               {
+                       job->chapter_markers = 0;
+               }
+       }
        if( ( job->vcodec & HB_VCODEC_FFMPEG ) &&
         [fVidEncoderPopUp indexOfSelectedItem] > 0 )
     {
@@ -1260,15 +1400,15 @@ list = hb_get_titles( fHandle );
                if( [fVidTwoPassCheck state] == NSOnState && [fVidTurboPassCheck state] == NSOnState )
                {
                        /* pass the "Turbo" string to be appended to the existing x264 opts string into a variable for the first pass */
-                       NSString *firstPassOptStringTurbo = @":ref=1:subme=1:me=dia:analyse=none:weightb=0:trellis=0:no-fast-pskip=0:8x8dct=0";
+                       NSString *firstPassOptStringTurbo = @":ref=1:subme=1:me=dia:analyse=none:trellis=0:no-fast-pskip=0:8x8dct=0";
                        /* append the "Turbo" string variable to the existing opts string.
                        Note: the "Turbo" string must be appended, not prepended to work properly*/
-                       NSString *firstPassOptStringCombined = [[fDisplayX264Options stringValue] stringByAppendingString:firstPassOptStringTurbo];
+                       NSString *firstPassOptStringCombined = [[fAdvancedOptions optionsString] stringByAppendingString:firstPassOptStringTurbo];
                        strcpy(job->x264opts, [firstPassOptStringCombined UTF8String]);
                }
                else
                {
-                       strcpy(job->x264opts, [[fDisplayX264Options stringValue] UTF8String]);
+                       strcpy(job->x264opts, [[fAdvancedOptions optionsString] UTF8String]);
                }
                
         job->h264_13 = [fVidEncoderPopUp indexOfSelectedItem];
@@ -1304,11 +1444,9 @@ list = hb_get_titles( fHandle );
     }
 
     job->grayscale = ( [fVidGrayscaleCheck state] == NSOnState );
-    
-
 
     /* Subtitle settings */
-    job->subtitle = [fSubPopUp indexOfSelectedItem] - 1;
+    job->subtitle = [fSubPopUp indexOfSelectedItem] - 2;
 
     /* Audio tracks and mixdowns */
     /* check for the condition where track 2 has an audio selected, but track 1 does not */
@@ -1337,214 +1475,389 @@ list = hb_get_titles( fHandle );
                      indexOfSelectedItem]].rate;
     job->abitrate = [[fAudBitratePopUp selectedItem] tag];
     
-    /* TODO: Filter settings */ 
     job->filters = hb_list_init();
-#if 1
-    /* Run old deinterlacer if deinterlacing specified */
-    if( job->deinterlace )
-    {        
+   
+       /* Detelecine */
+    if ([fPictureController detelecine])
+    {
+        hb_list_add( job->filters, &hb_filter_detelecine );
+    }
+   
+    /* Deinterlace */
+    if ([fPictureController deinterlace] == 1)
+    {
+        /* Run old deinterlacer by default */
         hb_filter_deinterlace.settings = "-1"; 
         hb_list_add( job->filters, &hb_filter_deinterlace );
     }
-#else
-    /* Choose your own filters! Here's some examples... */
-    hb_filter_detelecine.settings = "1:1:4:4:0:0";
-    hb_list_add( job->filters, &hb_filter_detelecine );
-
-    hb_filter_deinterlace.settings = "3:-1:2:10";
-    hb_list_add( job->filters, &hb_filter_deinterlace );
-
-    hb_filter_deblock.settings = "4:2";
-    hb_list_add( job->filters, &hb_filter_deblock );
+    else if ([fPictureController deinterlace] == 2)
+    {
+        /* Yadif mode 0 (1-pass with spatial deinterlacing.) */
+        hb_filter_deinterlace.settings = "0"; 
+        hb_list_add( job->filters, &hb_filter_deinterlace );            
+    }
+    else if ([fPictureController deinterlace] == 3)
+    {
+        /* Yadif (1-pass w/o spatial deinterlacing) and Mcdeint */
+        hb_filter_deinterlace.settings = "2:-1:1"; 
+        hb_list_add( job->filters, &hb_filter_deinterlace );            
+    }
+    else if ([fPictureController deinterlace] == 4)
+    {
+        /* Yadif (2-pass w/ spatial deinterlacing) and Mcdeint*/
+        hb_filter_deinterlace.settings = "1:-1:1"; 
+        hb_list_add( job->filters, &hb_filter_deinterlace );            
+    }
+       
+       /* Denoise */
+       
+       if ([fPictureController denoise] == 1) // Weak in popup
+       {
+               hb_filter_denoise.settings = "2:1:2:3"; 
+        hb_list_add( job->filters, &hb_filter_denoise );       
+       }
+       else if ([fPictureController denoise] == 2) // Medium in popup
+       {
+               hb_filter_denoise.settings = "3:2:2:3"; 
+        hb_list_add( job->filters, &hb_filter_denoise );       
+       }
+       else if ([fPictureController denoise] == 3) // Strong in popup
+       {
+               hb_filter_denoise.settings = "7:7:5:5"; 
+        hb_list_add( job->filters, &hb_filter_denoise );       
+       }
 
-    hb_filter_denoise.settings = "3:2:3:3";
-    hb_list_add( job->filters, &hb_filter_denoise );
-#endif     
 }
 
 
 
-- (IBAction) AddToQueue: (id) sender
+/* addToQueue: puts up an alert before ultimately calling doAddToQueue
+*/
+- (IBAction) addToQueue: (id) sender
 {
-/* We get the destination directory from the destingation field here */
+       /* We get the destination directory from the destination field here */
        NSString *destinationDirectory = [[fDstFile2Field stringValue] stringByDeletingLastPathComponent];
        /* We check for a valid destination here */
        if ([[NSFileManager defaultManager] fileExistsAtPath:destinationDirectory] == 0) 
        {
                NSRunAlertPanel(@"Warning!", @"This is not a valid destination directory!", @"OK", nil, nil);
+        return;
        }
-       else
-       {
-               
-               hb_list_t  * list  = hb_get_titles( fHandle );
-               hb_title_t * title = (hb_title_t *) hb_list_item( list,
-                                                                                                                 [fSrcTitlePopUp indexOfSelectedItem] );
-               hb_job_t * job = title->job;
-               
-               [self PrepareJob];
-               
-               /* Destination file */
-               job->file = [[fDstFile2Field stringValue] UTF8String];
-               
-               if( [fVidTwoPassCheck state] == NSOnState )
-               {
-                       job->pass = 1;
-                       hb_add( fHandle, job );
-                       job->pass = 2;
-                       
-                       job->x264opts = (char *)calloc(1024, 1); /* Fixme, this just leaks */  
-                       strcpy(job->x264opts, [[fDisplayX264Options stringValue] UTF8String]);
-                       
-                       hb_add( fHandle, job );
-               }
-               else
-               {
-                       job->pass = 0;
-                       hb_add( fHandle, job );
-               }
-       
-       [[NSUserDefaults standardUserDefaults] setObject:destinationDirectory forKey:@"LastDestinationDirectory"];
-       /* Lets try to update stuff, taken from remove in the queue controller */
-       [fQueueController performSelectorOnMainThread: @selector( Update: )
-        withObject: sender waitUntilDone: NO];
-       }
-}
 
-- (IBAction) Rip: (id) sender
-{
-    /* Rip or Cancel ? */
- //   if( [[fRipButton title] isEqualToString: _( @"Cancel" )] )
-    if(stopOrStart)
-       {
-        [self Cancel: sender];
-        return;
-    }
-       /* if there is no job in the queue, then add it to the queue and rip 
-       otherwise, there are already jobs in queue, so just rip the queue */
-       int count = hb_count( fHandle );
-       if( count < 1 )
-        {
-               [self AddToQueue: sender];
-               }
-    
-           /* We check for duplicate name here */
+    /* We check for duplicate name here */
        if( [[NSFileManager defaultManager] fileExistsAtPath:
             [fDstFile2Field stringValue]] )
     {
         NSBeginCriticalAlertSheet( _( @"File already exists" ),
             _( @"Cancel" ), _( @"Overwrite" ), NULL, fWindow, self,
-            @selector( OverwriteAlertDone:returnCode:contextInfo: ),
+            @selector( overwriteAddToQueueAlertDone:returnCode:contextInfo: ),
             NULL, NULL, [NSString stringWithFormat:
             _( @"Do you want to overwrite %@?" ),
             [fDstFile2Field stringValue]] );
-        return;
+        // overwriteAddToQueueAlertDone: will be called when the alert is dismissed.
     }
-       /* We get the destination directory from the destination field here */
-       NSString *destinationDirectory = [[fDstFile2Field stringValue] stringByDeletingLastPathComponent];
-       /* We check for a valid destination here */
-       if ([[NSFileManager defaultManager] fileExistsAtPath:destinationDirectory] == 0) 
-       {
-               NSRunAlertPanel(@"Warning!", @"This is not a valid destination directory!", @"OK", nil, nil);
-       }
-       else
-       {
-       [[NSUserDefaults standardUserDefaults] setObject:destinationDirectory forKey:@"LastDestinationDirectory"];
-               [self _Rip];
-       }
-       
-
-
-}
-
-- (void) OverwriteAlertDone: (NSWindow *) sheet
-    returnCode: (int) returnCode contextInfo: (void *) contextInfo
-{
-    if( returnCode == NSAlertAlternateReturn )
+    else
     {
-        [self _Rip];
+        [self doAddToQueue];
     }
 }
 
-- (void) UpdateAlertDone: (NSWindow *) sheet
+/* overwriteAddToQueueAlertDone: called from the alert posted by addToQueue that asks
+   the user if they want to overwrite an exiting movie file.
+*/
+- (void) overwriteAddToQueueAlertDone: (NSWindow *) sheet
     returnCode: (int) returnCode contextInfo: (void *) contextInfo
 {
     if( returnCode == NSAlertAlternateReturn )
-    {
-        /* Show scan panel */
-        [self performSelectorOnMainThread: @selector(ShowScanPanel:)
-            withObject: NULL waitUntilDone: NO];
-        return;
-    }
-
-    /* Go to HandBrake homepage and exit */
-    [self OpenHomepage: NULL];
-    [NSApp terminate: self];
-}
-
-- (void) _Rip
-{
-    /* Let libhb do the job */
-    hb_start( fHandle );
-       /*set the fEncodeState State */
-       fEncodeState = 1;
-       
-    /* Disable interface */
-       //[self EnableUI: NO];
-       // [fPauseButton setEnabled: NO];
-       // [fRipButton   setEnabled: NO];
-       pauseButtonEnabled = NO;
-       startButtonEnabled = NO;
-       NSRect frame = [fWindow frame];
-    if (frame.size.width <= 591)
-        frame.size.width = 591;
-    frame.size.height += 44;
-    frame.origin.y -= 44;
-    [fWindow setFrame:frame display:YES animate:YES];
+        [self doAddToQueue];
 }
 
-- (IBAction) Cancel: (id) sender
+- (void) doAddToQueue
 {
-    NSBeginCriticalAlertSheet( _( @"Cancel - Are you sure?" ),
-        _( @"Keep working" ), _( @"Cancel encoding" ), NULL, fWindow, self,
-        @selector( _Cancel:returnCode:contextInfo: ), NULL, NULL,
-        _( @"Encoding won't be recoverable." ) );
-}
+    hb_list_t  * list  = hb_get_titles( fHandle );
+    hb_title_t * title = (hb_title_t *) hb_list_item( list, [fSrcTitlePopUp indexOfSelectedItem] );
+    hb_job_t * job = title->job;
 
-- (void) _Cancel: (NSWindow *) sheet
-    returnCode: (int) returnCode contextInfo: (void *) contextInfo
-{
-    if( returnCode == NSAlertAlternateReturn )
-    {
-        hb_stop( fHandle );
-       // [fPauseButton setEnabled: NO];
-       // [fRipButton   setEnabled: NO];
-          pauseButtonEnabled = NO;
-       startButtonEnabled = NO;
-               /*set the fEncodeState State */
-            fEncodeState = 2;
-    }
-}
+    // Assign a sequence number, starting at zero, to each job added so they can
+    // be lumped together in the UI.
+    job->sequence_id = -1;
 
-- (IBAction) Pause: (id) sender
-{
-   // [fPauseButton setEnabled: NO];
-   // [fRipButton   setEnabled: NO];
+    [self PrepareJob];
 
-   // if( [[fPauseButton title] isEqualToString: _( @"Resume" )] )
-          pauseButtonEnabled = NO;
-       startButtonEnabled = NO;
+    /* Destination file */
+    job->file = [[fDstFile2Field stringValue] UTF8String];
 
-    if(resumeOrPause)
-    {
-        hb_resume( fHandle );
-    }
+    if( [fSubForcedCheck state] == NSOnState )
+        job->subtitle_force = 1;
+    else
+        job->subtitle_force = 0;
+
+    /*
+    * subtitle of -1 is a scan
+    */
+    if( job->subtitle == -1 )
+    {
+        char *x264opts_tmp;
+
+        /*
+        * When subtitle scan is enabled do a fast pre-scan job
+        * which will determine which subtitles to enable, if any.
+        */
+        job->pass = -1;
+        x264opts_tmp = job->x264opts;
+        job->subtitle = -1;
+
+        job->x264opts = NULL;
+
+        job->indepth_scan = 1;  
+
+        job->select_subtitle = (hb_subtitle_t**)malloc(sizeof(hb_subtitle_t*));
+        *(job->select_subtitle) = NULL;
+
+        /*
+        * Add the pre-scan job
+        */
+        job->sequence_id++; // for job grouping
+        hb_add( fHandle, job );
+
+        job->x264opts = x264opts_tmp;
+    }
+    else
+        job->select_subtitle = NULL;
+
+    /* No subtitle were selected, so reset the subtitle to -1 (which before
+    * this point meant we were scanning
+    */
+    if( job->subtitle == -2 )
+        job->subtitle = -1;
+
+    if( [fVidTwoPassCheck state] == NSOnState )
+    {
+        hb_subtitle_t **subtitle_tmp = job->select_subtitle;
+        job->indepth_scan = 0;
+
+        job->pass = 1;
+        job->sequence_id++; // for job grouping
+        hb_add( fHandle, job );
+
+        job->pass = 2;
+        job->sequence_id++; // for job grouping
+
+        job->x264opts = (char *)calloc(1024, 1); /* Fixme, this just leaks */  
+        strcpy(job->x264opts, [[fAdvancedOptions optionsString] UTF8String]);
+
+        job->select_subtitle = subtitle_tmp;
+
+        hb_add( fHandle, job );
+    }
+    else
+    {
+        job->indepth_scan = 0;
+        job->pass = 0;
+        job->sequence_id++; // for job grouping
+        hb_add( fHandle, job );
+    }
+       
+    NSString *destinationDirectory = [[fDstFile2Field stringValue] stringByDeletingLastPathComponent];
+       [[NSUserDefaults standardUserDefaults] setObject:destinationDirectory forKey:@"LastDestinationDirectory"];
+       /* Lets try to update stuff, taken from remove in the queue controller */
+       [fQueueController performSelectorOnMainThread: @selector( updateQueueUI )
+        withObject: NULL waitUntilDone: NO];
+}
+
+/* Rip: puts up an alert before ultimately calling doRip
+*/
+- (IBAction) Rip: (id) sender
+{
+    /* Rip or Cancel ? */
+    hb_state_t s;
+    hb_get_state2( fHandle, &s );
+
+    if(s.state == HB_STATE_WORKING || s.state == HB_STATE_PAUSED)
+       {
+        [self Cancel: sender];
+        return;
+    }
+    
+    // If there are jobs in the queue, then this is a rip the queue
+    
+    if (hb_count( fHandle ) > 0)
+    {
+        [self doRip];
+        return;
+    }
+
+    // Before adding jobs to the queue, check for a valid destination.
+
+    NSString *destinationDirectory = [[fDstFile2Field stringValue] stringByDeletingLastPathComponent];
+    if ([[NSFileManager defaultManager] fileExistsAtPath:destinationDirectory] == 0) 
+    {
+        NSRunAlertPanel(@"Warning!", @"This is not a valid destination directory!", @"OK", nil, nil);
+        return;
+    }
+
+    /* We check for duplicate name here */
+    if( [[NSFileManager defaultManager] fileExistsAtPath:[fDstFile2Field stringValue]] )
+    {
+        NSBeginCriticalAlertSheet( _( @"File already exists" ),
+            _( @"Cancel" ), _( @"Overwrite" ), NULL, fWindow, self,
+            @selector( overWriteAlertDone:returnCode:contextInfo: ),
+            NULL, NULL, [NSString stringWithFormat:
+            _( @"Do you want to overwrite %@?" ),
+            [fDstFile2Field stringValue]] );
+            
+        // overWriteAlertDone: will be called when the alert is dismissed. It will call doRip.
+    }
+    else
+    {
+        /* We add a the encode to the queue if there is nothing in it and then start our encode.
+           This should be reviewed by travistex to verify queue sync, etc.*/
+        if( hb_count( fHandle ) == 0)
+        {
+            [self doAddToQueue]; 
+        }
+        [self doRip];
+    }
+} 
+
+/* overWriteAlertDone: called from the alert posted by Rip: that asks the user if they
+   want to overwrite an exiting movie file.
+*/
+- (void) overWriteAlertDone: (NSWindow *) sheet
+    returnCode: (int) returnCode contextInfo: (void *) contextInfo
+{
+    if( returnCode == NSAlertAlternateReturn )
+    {
+        /* if there is no job in the queue, then add it to the queue and rip 
+        otherwise, there are already jobs in queue, so just rip the queue */
+        int count = hb_count( fHandle );
+        if( count == 0 )
+        {
+            [self doAddToQueue];
+        }
+
+        NSString *destinationDirectory = [[fDstFile2Field stringValue] stringByDeletingLastPathComponent];
+        [[NSUserDefaults standardUserDefaults] setObject:destinationDirectory forKey:@"LastDestinationDirectory"];
+        [self doRip];
+    }
+}
+
+- (void) updateAlertDone: (NSWindow *) sheet
+    returnCode: (int) returnCode contextInfo: (void *) contextInfo
+{
+    if( returnCode == NSAlertAlternateReturn )
+    {
+        /* Show scan panel */
+        [self performSelectorOnMainThread: @selector(showScanPanel:)
+            withObject: NULL waitUntilDone: NO];
+        return;
+    }
+
+    /* Go to HandBrake homepage and exit */
+    [self openHomepage: NULL];
+    [NSApp terminate: self];
+}
+
+- (void) doRip
+{
+    /* Let libhb do the job */
+    hb_start( fHandle );
+       /*set the fEncodeState State */
+       fEncodeState = 1;
+}
+
+
+
+
+
+//------------------------------------------------------------------------------------
+// Cancels the current job and proceeds with the next one in the queue.
+//------------------------------------------------------------------------------------
+- (void) doCancelCurrentJob
+{
+    // Stop the current job. hb_stop will only cancel the current pass and then set
+    // its state to HB_STATE_WORKDONE. It also does this asynchronously. So when we
+    // see the state has changed to HB_STATE_WORKDONE (in updateUI), we'll delete the
+    // remaining passes of the job and then start the queue back up if there are any
+    // remaining jobs.
+     
+    hb_stop( fHandle );
+    fEncodeState = 2;   // don't alert at end of processing since this was a cancel
+    
+}
+
+//------------------------------------------------------------------------------------
+// Displays an alert asking user if the want to cancel encoding of current job.
+// Cancel: returns immediately after posting the alert. Later, when the user
+// acknowledges the alert, doCancelCurrentJob is called.
+//------------------------------------------------------------------------------------
+- (IBAction)Cancel: (id)sender
+{
+    if (!fHandle) return;
+    
+    hb_job_t * job = hb_current_job(fHandle);
+    if (!job) return;
+
+    // If command key is down, don't prompt
+    BOOL hasCmdKeyMask = ([[NSApp currentEvent] modifierFlags] & NSCommandKeyMask) != 0;
+    if (hasCmdKeyMask)
+        [self doCancelCurrentJob];
+    else
+    {
+        NSString * alertTitle = [NSString stringWithFormat:NSLocalizedString(@"Do you want to stop encoding of %@?", nil),
+                [NSString stringWithUTF8String:job->title->name]];
+        
+        // Which window to attach the sheet to?
+        NSWindow * docWindow;
+        if ([sender respondsToSelector: @selector(window)])
+            docWindow = [sender window];
+        else
+            docWindow = fWindow;
+            
+        NSBeginCriticalAlertSheet(
+                alertTitle,
+                NSLocalizedString(@"Keep Encoding", nil), NSLocalizedString(@"Stop Encoding", nil), nil, docWindow, self,
+                nil, @selector(didDimissCancelCurrentJob:returnCode:contextInfo:), nil,
+                NSLocalizedString(@"Your movie will be lost if you don't continue encoding.", nil),
+                [NSString stringWithUTF8String:job->title->name]);
+        
+        // didDimissCancelCurrentJob:returnCode:contextInfo: will be called when the dialog is dismissed
+
+        // N.B.: didDimissCancelCurrentJob:returnCode:contextInfo: is designated as the dismiss
+        // selector to prevent a crash. As a dismiss selector, the alert window will
+        // have already be dismissed. If we don't do it this way, the dismissing of
+        // the alert window will cause the table view to be redrawn at a point where
+        // current job has been deleted by hblib but we don't know about it yet. This
+        // is a prime example of wy we need to NOT be relying on hb_current_job!!!!
+    }
+}
+
+- (void) didDimissCancelCurrentJob: (NSWindow *)sheet returnCode: (int)returnCode contextInfo: (void *)contextInfo
+{
+    if (returnCode == NSAlertAlternateReturn)
+        [self doCancelCurrentJob];
+}
+
+
+
+
+
+- (IBAction) Pause: (id) sender
+{
+    hb_state_t s;
+    hb_get_state2( fHandle, &s );
+
+    if( s.state == HB_STATE_PAUSED )
+    {
+        hb_resume( fHandle );
+    }
     else
     {
         hb_pause( fHandle );
     }
 }
 
-- (IBAction) TitlePopUpChanged: (id) sender
+- (IBAction) titlePopUpChanged: (id) sender
 {
     hb_list_t  * list  = hb_get_titles( fHandle );
     hb_title_t * title = (hb_title_t*)
@@ -1557,7 +1870,7 @@ list = hb_get_titles( fHandle );
                [fDstFile2Field setStringValue: [NSString stringWithFormat:
                        @"%@/%@-%d.%@", [[fDstFile2Field stringValue] stringByDeletingLastPathComponent],
                        [NSString stringWithUTF8String: title->name],
-                       [fSrcTitlePopUp indexOfSelectedItem] + 1,
+                         title->index,
                        [[fDstFile2Field stringValue] pathExtension]]]; 
        }
 
@@ -1574,7 +1887,7 @@ list = hb_get_titles( fHandle );
     [fSrcChapterStartPopUp selectItemAtIndex: 0];
     [fSrcChapterEndPopUp   selectItemAtIndex:
         hb_list_count( title->list_chapter ) - 1];
-    [self ChapterPopUpChanged: NULL];
+    [self chapterPopUpChanged: NULL];
 
 /* Start Get and set the initial pic size for display */
        hb_job_t * job = title->job;
@@ -1582,17 +1895,16 @@ list = hb_get_titles( fHandle );
        /* Turn Deinterlace on/off depending on the preference */
        if ([[NSUserDefaults standardUserDefaults] boolForKey:@"DefaultDeinterlaceOn"] > 0)
        {
-               job->deinterlace = 1;
+               [fPictureController setDeinterlace:1];
        }
        else
        {
-               job->deinterlace = 0;
+               [fPictureController setDeinterlace:0];
        }
        
        /* Pixel Ratio Setting */
        if ([[NSUserDefaults standardUserDefaults] boolForKey:@"PixelRatio"])
     {
-
                job->pixel_ratio = 1 ;
        }
        else
@@ -1604,28 +1916,37 @@ list = hb_get_titles( fHandle );
                                                         @"%d", fTitle->width]];
        [fPicSrcHeight setStringValue: [NSString stringWithFormat:
                                                         @"%d", fTitle->height]];
+                                                        
+       /* Set Auto Crop to on upon selecting a new title */
+    [fPictureController setAutoCrop:YES];
+    
        /* We get the originial output picture width and height and put them
        in variables for use with some presets later on */
        PicOrigOutputWidth = job->width;
        PicOrigOutputHeight = job->height;
+       AutoCropTop = job->crop[0];
+       AutoCropBottom = job->crop[1];
+       AutoCropLeft = job->crop[2];
+       AutoCropRight = job->crop[3];
        /* we test getting the max output value for pic sizing here to be used later*/
        [fPicSettingWidth setStringValue: [NSString stringWithFormat:
                @"%d", PicOrigOutputWidth]];
        [fPicSettingHeight setStringValue: [NSString stringWithFormat:
                @"%d", PicOrigOutputHeight]];
        /* we run the picture size values through
-       CalculatePictureSizing to get all picture size
+       calculatePictureSizing to get all picture size
        information*/
-       [self CalculatePictureSizing: NULL];
-       /* Run Through EncoderPopUpChanged to see if there
+       [self calculatePictureSizing: NULL];
+       /* Run Through encoderPopUpChanged to see if there
                needs to be any pic value modifications based on encoder settings */
-       //[self EncoderPopUpChanged: NULL];
+       //[self encoderPopUpChanged: NULL];
        /* END Get and set the initial pic size for display */ 
 
     /* Update subtitle popups */
     hb_subtitle_t * subtitle;
     [fSubPopUp removeAllItems];
     [fSubPopUp addItemWithTitle: @"None"];
+    [fSubPopUp addItemWithTitle: @"Autoselect"];
     for( int i = 0; i < hb_list_count( title->list_subtitle ); i++ )
     {
         subtitle = (hb_subtitle_t *) hb_list_item( title->list_subtitle, i );
@@ -1636,27 +1957,30 @@ list = hb_get_titles( fHandle );
             subtitle->lang] action: NULL keyEquivalent: @""];
     }
     [fSubPopUp selectItemAtIndex: 0];
+       
+       [self subtitleSelectionChanged: NULL];
     
     /* Update chapter table */
     [fChapterTitlesDelegate resetWithTitle:title];
     [fChapterTable reloadData];
 
     /* Update audio popups */
-    [self AddAllAudioTracksToPopUp: fAudLang1PopUp];
-    [self AddAllAudioTracksToPopUp: fAudLang2PopUp];
+    [self addAllAudioTracksToPopUp: fAudLang1PopUp];
+    [self addAllAudioTracksToPopUp: fAudLang2PopUp];
     /* search for the first instance of our prefs default language for track 1, and set track 2 to "none" */
        NSString * audioSearchPrefix = [[NSUserDefaults standardUserDefaults] stringForKey:@"DefaultLanguage"];
-    [self SelectAudioTrackInPopUp: fAudLang1PopUp searchPrefixString: audioSearchPrefix selectIndexIfNotFound: 1];
-    [self SelectAudioTrackInPopUp: fAudLang2PopUp searchPrefixString: NULL selectIndexIfNotFound: 0];
+        [self selectAudioTrackInPopUp: fAudLang1PopUp searchPrefixString: audioSearchPrefix selectIndexIfNotFound: 1];
+    [self selectAudioTrackInPopUp: fAudLang2PopUp searchPrefixString: NULL selectIndexIfNotFound: 0];
        
        /* changing the title may have changed the audio channels on offer, */
-       /* so call AudioTrackPopUpChanged for both audio tracks to update the mixdown popups */
-       [self AudioTrackPopUpChanged: fAudLang1PopUp];
-       [self AudioTrackPopUpChanged: fAudLang2PopUp];
-
+       /* so call audioTrackPopUpChanged for both audio tracks to update the mixdown popups */
+       [self audioTrackPopUpChanged: fAudLang1PopUp];
+       [self audioTrackPopUpChanged: fAudLang2PopUp];
+       /* lets call tableViewSelected to make sure that any preset we have selected is enforced after a title change */
+       [self tableViewSelected:NULL];
 }
 
-- (IBAction) ChapterPopUpChanged: (id) sender
+- (IBAction) chapterPopUpChanged: (id) sender
 {
     
        /* If start chapter popup is greater than end chapter popup,
@@ -1667,7 +1991,6 @@ list = hb_get_titles( fHandle );
     }
 
                
-       
        hb_list_t  * list  = hb_get_titles( fHandle );
     hb_title_t * title = (hb_title_t *)
         hb_list_item( list, [fSrcTitlePopUp indexOfSelectedItem] );
@@ -1686,10 +2009,10 @@ list = hb_get_titles( fHandle );
         @"%02lld:%02lld:%02lld", duration / 3600, ( duration / 60 ) % 60,
         duration % 60]];
 
-    [self CalculateBitrate: sender];
+    [self calculateBitrate: sender];
 }
 
-- (IBAction) FormatPopUpChanged: (id) sender
+- (IBAction) formatPopUpChanged: (id) sender
 {
     NSString * string = [fDstFile2Field stringValue];
     int format = [fDstFormatPopUp indexOfSelectedItem];
@@ -1774,12 +2097,11 @@ list = hb_get_titles( fHandle );
                 _( @"AVC/H.264 Video / MP3 Audio" )];
                        [fDstCodecsPopUp addItemWithTitle:
                 _( @"AVC/H.264 Video / Vorbis Audio" )];
-            /* We disable the create chapters checkbox here since we are NOT .mp4 
-                       and make sure it is unchecked*/
+            /* We enable the create chapters checkbox here since */
                        [fCreateChapterMarkers setEnabled: YES];
                        break;
     }
-    [self CodecsPopUpChanged: NULL];
+    [self codecsPopUpChanged: NULL];
 
     /* Add/replace to the correct extension */
     if( [string characterAtIndex: [string length] - 4] == '.' )
@@ -1795,23 +2117,22 @@ list = hb_get_titles( fHandle );
     }
 
        /* changing the format may mean that we can / can't offer mono or 6ch, */
-       /* so call AudioTrackPopUpChanged for both audio tracks to update the mixdown popups */
-       [self AudioTrackPopUpChanged: fAudLang1PopUp];
-       [self AudioTrackPopUpChanged: fAudLang2PopUp];
+       /* so call audioTrackPopUpChanged for both audio tracks to update the mixdown popups */
+       [self audioTrackPopUpChanged: fAudLang1PopUp];
+       [self audioTrackPopUpChanged: fAudLang2PopUp];
        /* We call the method to properly enable/disable turbo 2 pass */
-       [self TwoPassCheckboxChanged: sender];
+       [self twoPassCheckboxChanged: sender];
        /* We call method method to change UI to reflect whether a preset is used or not*/
-       [self CustomSettingUsed: sender];       
+       [self customSettingUsed: sender];       
        
 }
 
-- (IBAction) CodecsPopUpChanged: (id) sender
+- (IBAction) codecsPopUpChanged: (id) sender
 {
     int format = [fDstFormatPopUp indexOfSelectedItem];
     int codecs = [fDstCodecsPopUp indexOfSelectedItem];
-       [fX264optView setHidden: YES];
-       [fX264optViewTitleLabel setStringValue: @"Only Used With The x264 (H.264) Codec"];
-
+       
+    [fAdvancedOptions setHidden:YES];
 
     /* Update the encoder popup*/
     if( ( FormatSettings[format][codecs] & HB_VCODEC_X264 ) )
@@ -1821,12 +2142,9 @@ list = hb_get_titles( fHandle );
                [fVidEncoderPopUp addItemWithTitle: @"x264 (h.264 Main)"];
                [fVidEncoderPopUp addItemWithTitle: @"x264 (h.264 iPod)"];
                [fVidEncoderPopUp selectItemAtIndex: 0];
-        [fX264optView setHidden: NO];
-               [fX264optViewTitleLabel setStringValue: @""];
-
-
-               
+        [fAdvancedOptions setHidden:NO];
     }
+    
     else if( ( FormatSettings[format][codecs] & HB_VCODEC_FFMPEG ) )
     {
         /* H.264 -> MPEG-4 */
@@ -1849,15 +2167,15 @@ list = hb_get_titles( fHandle );
         [fAudBitratePopUp setEnabled: YES];
     }
     /* changing the codecs on offer may mean that we can / can't offer mono or 6ch, */
-       /* so call AudioTrackPopUpChanged for both audio tracks to update the mixdown popups */
-       [self AudioTrackPopUpChanged: fAudLang1PopUp];
-       [self AudioTrackPopUpChanged: fAudLang2PopUp];
+       /* so call audioTrackPopUpChanged for both audio tracks to update the mixdown popups */
+       [self audioTrackPopUpChanged: fAudLang1PopUp];
+       [self audioTrackPopUpChanged: fAudLang2PopUp];
 
-    [self CalculateBitrate: sender];
-    [self TwoPassCheckboxChanged: sender];
+    [self calculateBitrate: sender];
+    [self twoPassCheckboxChanged: sender];
 }
 
-- (IBAction) EncoderPopUpChanged: (id) sender
+- (IBAction) encoderPopUpChanged: (id) sender
 {
     
        /* Check to see if we need to modify the job pic values based on x264 (iPod) encoder selection */
@@ -1881,15 +2199,17 @@ list = hb_get_titles( fHandle );
                [fDstMpgLargeFileCheck setState: NSOffState];
        }
     
-       [self CalculatePictureSizing: sender];
-       [self TwoPassCheckboxChanged: sender];
+       [self calculatePictureSizing: sender];
+       [self twoPassCheckboxChanged: sender];
 }
 
-- (IBAction) TwoPassCheckboxChanged: (id) sender
+- (IBAction) twoPassCheckboxChanged: (id) sender
 {
        /* check to see if x264 is chosen */
-       if([fDstFormatPopUp indexOfSelectedItem] == 0 && [fDstCodecsPopUp indexOfSelectedItem] == 1)
-       {
+       int format = [fDstFormatPopUp indexOfSelectedItem];
+    int codecs = [fDstCodecsPopUp indexOfSelectedItem];
+       if( ( FormatSettings[format][codecs] & HB_VCODEC_X264 ) )
+    {
                if( [fVidTwoPassCheck state] == NSOnState)
                {
                        [fVidTurboPassCheck setHidden: NO];
@@ -1912,10 +2232,19 @@ list = hb_get_titles( fHandle );
        }
        
        /* We call method method to change UI to reflect whether a preset is used or not*/
-       [self CustomSettingUsed: sender];
+       [self customSettingUsed: sender];
+}
+
+- (IBAction ) videoFrameRateChanged: (id) sender
+{
+    /* We call method method to calculatePictureSizing to error check detelecine*/
+    [self calculatePictureSizing: sender];
+
+    /* We call method method to change UI to reflect whether a preset is used or not*/
+       [self customSettingUsed: sender];
 }
 
-- (IBAction) SetEnabledStateOfAudioMixdownControls: (id) sender
+- (IBAction) setEnabledStateOfAudioMixdownControls: (id) sender
 {
 
     /* enable/disable the mixdown text and popupbutton for audio track 1 */
@@ -1930,7 +2259,7 @@ list = hb_get_titles( fHandle );
 
 }
 
-- (IBAction) AddAllAudioTracksToPopUp: (id) sender
+- (IBAction) addAllAudioTracksToPopUp: (id) sender
 {
 
     hb_list_t  * list  = hb_get_titles( fHandle );
@@ -1952,7 +2281,7 @@ list = hb_get_titles( fHandle );
 
 }
 
-- (IBAction) SelectAudioTrackInPopUp: (id) sender searchPrefixString: (NSString *) searchPrefixString selectIndexIfNotFound: (int) selectIndexIfNotFound
+- (IBAction) selectAudioTrackInPopUp: (id) sender searchPrefixString: (NSString *) searchPrefixString selectIndexIfNotFound: (int) selectIndexIfNotFound
 {
 
     /* this method can be used to find a language, or a language-and-source-format combination, by passing in the appropriate string */
@@ -1985,13 +2314,13 @@ list = hb_get_titles( fHandle );
 
 }
 
-- (IBAction) AudioTrackPopUpChanged: (id) sender
+- (IBAction) audioTrackPopUpChanged: (id) sender
 {
-    /* utility function to call AudioTrackPopUpChanged without passing in a mixdown-to-use */
-    [self AudioTrackPopUpChanged: sender mixdownToUse: 0];
+    /* utility function to call audioTrackPopUpChanged without passing in a mixdown-to-use */
+    [self audioTrackPopUpChanged: sender mixdownToUse: 0];
 }
 
-- (IBAction) AudioTrackPopUpChanged: (id) sender mixdownToUse: (int) mixdownToUse
+- (IBAction) audioTrackPopUpChanged: (id) sender mixdownToUse: (int) mixdownToUse
 {
 
     /* make sure we have a selected title before continuing */
@@ -2013,7 +2342,7 @@ list = hb_get_titles( fHandle );
     /* unless, of course, both are selected as "none!" */
     if ([thisAudioPopUp indexOfSelectedItem] != 0 && [thisAudioPopUp indexOfSelectedItem] == [otherAudioPopUp indexOfSelectedItem]) {
         [otherAudioPopUp selectItemAtIndex: 0];
-        [self AudioTrackPopUpChanged: otherAudioPopUp];
+        [self audioTrackPopUpChanged: otherAudioPopUp];
     }
 
     /* pointer for the hb_audio_s struct we will use later on */
@@ -2044,7 +2373,7 @@ list = hb_get_titles( fHandle );
     [mixdownPopUp removeAllItems];
 
     /* check if the audio mixdown controls need their enabled state changing */
-    [self SetEnabledStateOfAudioMixdownControls: NULL];
+    [self setEnabledStateOfAudioMixdownControls: NULL];
 
     if (thisAudioIndex != -1)
     {
@@ -2162,8 +2491,8 @@ list = hb_get_titles( fHandle );
                 /* select the (possibly-amended) preferred mixdown */
                 [mixdownPopUp selectItemWithTag: useMixdown];
                                
-                               /* lets call the AudioTrackMixdownChanged method here to determine appropriate bitrates, etc. */
-                [self AudioTrackMixdownChanged: NULL];
+                               /* lets call the audioTrackMixdownChanged method here to determine appropriate bitrates, etc. */
+                [self audioTrackMixdownChanged: NULL];
             }
 
         }
@@ -2171,10 +2500,10 @@ list = hb_get_titles( fHandle );
     }
 
        /* see if the new audio track choice will change the bitrate we need */
-    [self CalculateBitrate: sender];   
+    [self calculateBitrate: sender];   
 
 }
-- (IBAction) AudioTrackMixdownChanged: (id) sender
+- (IBAction) audioTrackMixdownChanged: (id) sender
 {
 
     /* find out what the currently-selected output audio codec is */
@@ -2255,116 +2584,167 @@ list = hb_get_titles( fHandle );
     }
 
 }
+
+- (IBAction) subtitleSelectionChanged: (id) sender
+{
+       if ([fSubPopUp indexOfSelectedItem] == 0)
+       {
+        [fSubForcedCheck setState: NSOffState];
+        [fSubForcedCheck setEnabled: NO];      
+       }
+       else
+       {
+        [fSubForcedCheck setEnabled: YES];     
+       }
+       
+}
+
 /* lets set the picture size back to the max from right after title scan
    Lets use an IBAction here as down the road we could always use a checkbox
    in the gui to easily take the user back to max. Remember, the compiler
    resolves IBActions down to -(void) during compile anyway */
-- (IBAction) RevertPictureSizeToMax: (id) sender
+- (IBAction) revertPictureSizeToMax: (id) sender
 {
-        hb_job_t * job = fTitle->job;
+       hb_job_t * job = fTitle->job;
        /* We use the output picture width and height
        as calculated from libhb right after title is set
        in TitlePopUpChanged */
        job->width = PicOrigOutputWidth;
        job->height = PicOrigOutputHeight;
-
-
-    
-       [self CalculatePictureSizing: sender];
-       /* We call method method to change UI to reflect whether a preset is used or not*/    
-    [self CustomSettingUsed: sender];
+    [fPictureController setAutoCrop:YES];
+       /* Here we use the auto crop values determined right after scan */
+       job->crop[0] = AutoCropTop;
+       job->crop[1] = AutoCropBottom;
+       job->crop[2] = AutoCropLeft;
+       job->crop[3] = AutoCropRight;
+                               
+                               
+                               [self calculatePictureSizing: sender];
+                               /* We call method method to change UI to reflect whether a preset is used or not*/    
+                               [self customSettingUsed: sender];
 }
 
 
 /* Get and Display Current Pic Settings in main window */
-- (IBAction) CalculatePictureSizing: (id) sender
+- (IBAction) calculatePictureSizing: (id) sender
 {
-       
-
-       [fPicSettingWidth setStringValue: [NSString stringWithFormat:
-               @"%d", fTitle->job->width]];
-       [fPicSettingHeight setStringValue: [NSString stringWithFormat:
-               @"%d", fTitle->job->height]];
-       [fPicSettingARkeep setStringValue: [NSString stringWithFormat:
-               @"%d", fTitle->job->keep_ratio]];                
-       [fPicSettingDeinterlace setStringValue: [NSString stringWithFormat:
-               @"%d", fTitle->job->deinterlace]];
-       [fPicSettingPAR setStringValue: [NSString stringWithFormat:
-               @"%d", fTitle->job->pixel_ratio]];
+       [fPicSettingWidth setStringValue: [NSString stringWithFormat:@"%d", fTitle->job->width]];
+       [fPicSettingHeight setStringValue: [NSString stringWithFormat:@"%d", fTitle->job->height]];
                
        if (fTitle->job->pixel_ratio == 1)
        {
-       int titlewidth = fTitle->width-fTitle->job->crop[2]-fTitle->job->crop[3];
-       int arpwidth = fTitle->job->pixel_aspect_width;
-       int arpheight = fTitle->job->pixel_aspect_height;
-       int displayparwidth = titlewidth * arpwidth / arpheight;
-       int displayparheight = fTitle->height-fTitle->job->crop[0]-fTitle->job->crop[1];
-       [fPicSettingWidth setStringValue: [NSString stringWithFormat:
-               @"%d", titlewidth]];
-       [fPicSettingHeight setStringValue: [NSString stringWithFormat:
-               @"%d", displayparheight]];
-       [fPicLabelPAROutp setStringValue: @"Anamorphic Output:"];
-       [fPicLabelPAROutputX setStringValue: @"x"];
-    [fPicSettingPARWidth setStringValue: [NSString stringWithFormat:
-        @"%d", displayparwidth]];
-       [fPicSettingPARHeight setStringValue: [NSString stringWithFormat:
-        @"%d", displayparheight]];
-
-       fTitle->job->keep_ratio = 0;
+        int titlewidth = fTitle->width-fTitle->job->crop[2]-fTitle->job->crop[3];
+        int arpwidth = fTitle->job->pixel_aspect_width;
+        int arpheight = fTitle->job->pixel_aspect_height;
+        int displayparwidth = titlewidth * arpwidth / arpheight;
+        int displayparheight = fTitle->height-fTitle->job->crop[0]-fTitle->job->crop[1];
+        
+        [fPicSettingWidth setStringValue: [NSString stringWithFormat:@"%d", titlewidth]];
+        [fPicSettingHeight setStringValue: [NSString stringWithFormat:@"%d", displayparheight]];
+        [fPicLabelPAROutputX setStringValue: @"x"];
+        [fPicSettingPARWidth setStringValue: [NSString stringWithFormat:@"%d", displayparwidth]];
+        [fPicSettingPARHeight setStringValue: [NSString stringWithFormat:@"%d", displayparheight]];
+        
+        fTitle->job->keep_ratio = 0;
        }
        else
        {
-       [fPicLabelPAROutp setStringValue: @""];
-       [fPicLabelPAROutputX setStringValue: @""];
-       [fPicSettingPARWidth setStringValue: @""];
-       [fPicSettingPARHeight setStringValue:  @""];
+        [fPicLabelPAROutputX setStringValue: @""];
+        [fPicSettingPARWidth setStringValue: @""];
+        [fPicSettingPARHeight setStringValue:  @""];
        }
-               
+                               
        /* Set ON/Off values for the deinterlace/keep aspect ratio according to boolean */      
        if (fTitle->job->keep_ratio > 0)
        {
-               [fPicSettingARkeepDsply setStringValue: @"On"];
+               [fPicSettingARkeep setStringValue: @"On"];
        }
        else
        {
-               [fPicSettingARkeepDsply setStringValue: @"Off"];
+               [fPicSettingARkeep setStringValue: @"Off"];
        }       
-       if (fTitle->job->deinterlace > 0)
+    /* Detelecine */
+    if ([fPictureController detelecine]) {
+        [fPicSettingDetelecine setStringValue: @"Yes"];
+    }
+    else {
+        [fPicSettingDetelecine setStringValue: @"No"];
+    }
+
+       /* Deinterlace */
+       if ([fPictureController deinterlace] == 0)
        {
-               [fPicSettingDeinterlaceDsply setStringValue: @"On"];
+               [fPicSettingDeinterlace setStringValue: @"Off"];
        }
-       else
+       else if ([fPictureController deinterlace] == 1)
+       {
+               [fPicSettingDeinterlace setStringValue: @"Fast"];
+       }
+       else if ([fPictureController deinterlace] == 2)
+       {
+               [fPicSettingDeinterlace setStringValue: @"Slow"];
+       }
+       else if ([fPictureController deinterlace] == 3)
+       {
+               [fPicSettingDeinterlace setStringValue: @"Slower"];
+       }
+       else if ([fPictureController deinterlace] ==4)
+       {
+               [fPicSettingDeinterlace setStringValue: @"Slowest"];
+       }
+       /* Denoise */
+       if ([fPictureController denoise] == 0)
+       {
+               [fPicSettingDenoise setStringValue: @"Off"];
+       }
+       else if ([fPictureController denoise] == 1)
+       {
+               [fPicSettingDenoise setStringValue: @"Weak"];
+       }
+       else if ([fPictureController denoise] == 2)
        {
-               [fPicSettingDeinterlaceDsply setStringValue: @"Off"];
+               [fPicSettingDenoise setStringValue: @"Medium"];
        }
+       else if ([fPictureController denoise] == 3)
+       {
+               [fPicSettingDenoise setStringValue: @"Strong"];
+       }
+       
        if (fTitle->job->pixel_ratio > 0)
        {
-               [fPicSettingPARDsply setStringValue: @"On"];
+               [fPicSettingPAR setStringValue: @""];
        }
        else
        {
-               [fPicSettingPARDsply setStringValue: @"Off"];
+               [fPicSettingPAR setStringValue: @"Off"];
        }
        /* Set the display field for crop as per boolean */
-       if ([[fPicSettingAutoCrop stringValue] isEqualToString: @"0"])
+       if (![fPictureController autoCrop])
        {
-           [fPicSettingAutoCropDsply setStringValue: @"Custom"];
+           [fPicSettingAutoCrop setStringValue: @"Custom"];
        }
        else
        {
-               [fPicSettingAutoCropDsply setStringValue: @"Auto"];
+               [fPicSettingAutoCrop setStringValue: @"Auto"];
        }       
+       /* check video framerate and turn off detelecine if necessary */
+       if (fTitle->rate_base == 1126125 || [[fVidRatePopUp titleOfSelectedItem] isEqualToString: @"23.976 (NTSC Film)"])
+       {
+               [fPictureController setDetelecine:0];
+       }
+       
+       
        
        /* below will trigger the preset, if selected, to be
        changed to "Custom". Lets comment out for now until
        we figure out a way to determine if the picture values
        changed modify the preset values */     
-       //[self CustomSettingUsed: sender];
+       //[self customSettingUsed: sender];
 }
 
-- (IBAction) CalculateBitrate: (id) sender
+- (IBAction) calculateBitrate: (id) sender
 {
-    if( !fHandle || [fVidQualityMatrix selectedRow] != 0 )
+    if( !fHandle || [fVidQualityMatrix selectedRow] != 0 || !SuccessfulScan )
     {
         return;
     }
@@ -2378,1210 +2758,526 @@ list = hb_get_titles( fHandle );
 
     [fVidBitrateField setIntValue: hb_calc_bitrate( job,
             [fVidTargetSizeField intValue] )];
-                       
-                       
 }
 
 /* Method to determine if we should change the UI
 To reflect whether or not a Preset is being used or if
 the user is using "Custom" settings by determining the sender*/
-- (IBAction) CustomSettingUsed: (id) sender
+- (IBAction) customSettingUsed: (id) sender
 {
        if ([sender stringValue] != NULL)
        {
                /* Deselect the currently selected Preset if there is one*/
                [tableView deselectRow:[tableView selectedRow]];
+               [[fPresetsActionMenu itemAtIndex:0] setEnabled: NO];
                /* Change UI to show "Custom" settings are being used */
                [fPresetSelectedDisplay setStringValue: @"Custom"];
                
                curUserPresetChosenNum = nil;
-
-               
        }
 
 }
 
-- (IBAction) X264AdvancedOptionsSet: (id) sender
+   /* We use this method to recreate new, updated factory
+   presets */
+- (IBAction)addFactoryPresets:(id)sender
 {
-    /*Set opt widget values here*/
-    
-    /*B-Frames fX264optBframesPopUp*/
-    int i;
-    [fX264optBframesPopUp removeAllItems];
-    [fX264optBframesPopUp addItemWithTitle:@"Default (0)"];
-    for (i=0; i<17;i++)
-    {
-        [fX264optBframesPopUp addItemWithTitle:[NSString stringWithFormat:@"%d",i]];
-    }
-    
-    /*Reference Frames fX264optRefPopUp*/
-    [fX264optRefPopUp removeAllItems];
-    [fX264optRefPopUp addItemWithTitle:@"Default (1)"];
-    for (i=0; i<17;i++)
-    {
-        [fX264optRefPopUp addItemWithTitle:[NSString stringWithFormat:@"%d",i]];
-    }
+    /* First, we delete any existing built in presets */
+    [self deleteFactoryPresets: sender];
+    /* Then, we re-create new built in presets programmatically CreateIpodOnlyPreset*/
+    [UserPresets addObject:[self createNormalPreset]];
+    [UserPresets addObject:[self createClassicPreset]];
+    [UserPresets addObject:[self createQuickTimePreset]];
+       [UserPresets addObject:[self createIpodLowPreset]];
+       [UserPresets addObject:[self createIpodHighPreset]];
+       [UserPresets addObject:[self createAppleTVPreset]];
+    [UserPresets addObject:[self createiPhonePreset]];
+       [UserPresets addObject:[self createPSThreePreset]];
+       [UserPresets addObject:[self createPSPPreset]];
+       [UserPresets addObject:[self createFilmPreset]];
+    [UserPresets addObject:[self createTelevisionPreset]];
+    [UserPresets addObject:[self createAnimationPreset]];
+    [UserPresets addObject:[self createBedlamPreset]];
+    [UserPresets addObject:[self createDeuxSixQuatrePreset]];
+    [UserPresets addObject:[self createBrokePreset]];
+    [UserPresets addObject:[self createBlindPreset]];
+    [UserPresets addObject:[self createCRFPreset]];
     
-    /*No Fast P-Skip fX264optNfpskipSwitch BOOLEAN*/
-    [fX264optNfpskipSwitch setState:0];
+    [self addPreset];
+}
+- (IBAction)deleteFactoryPresets:(id)sender
+{
+    //int status;
+    NSEnumerator *enumerator = [UserPresets objectEnumerator];
+       id tempObject;
     
-    /*No Dict Decimate fX264optNodctdcmtSwitch BOOLEAN*/
-    [fX264optNodctdcmtSwitch setState:0];    
+       //NSNumber *index;
+    NSMutableArray *tempArray;
+
+
+        tempArray = [NSMutableArray array];
+        /* we look here to see if the preset is we move on to the next one */
+        while ( tempObject = [enumerator nextObject] )  
+               {
+                       /* if the preset is "Factory" then we put it in the array of
+                       presets to delete */
+                       if ([[tempObject objectForKey:@"Type"] intValue] == 0)
+                       {
+                               [tempArray addObject:tempObject];
+                       }
+        }
+        
+        [UserPresets removeObjectsInArray:tempArray];
+        [tableView reloadData];
+        [self savePreset];   
+
+}
+
+- (IBAction) showAddPresetPanel: (id) sender
+{
+    /* Deselect the currently selected Preset if there is one*/
+    [tableView deselectRow:[tableView selectedRow]];
+
+    /* Populate the preset picture settings popup here */
+    [fPresetNewPicSettingsPopUp removeAllItems];
+    [fPresetNewPicSettingsPopUp addItemWithTitle:@"None"];
+    [fPresetNewPicSettingsPopUp addItemWithTitle:@"Current"];
+    [fPresetNewPicSettingsPopUp addItemWithTitle:@"Source Maximum (post source scan)"];
+    [fPresetNewPicSettingsPopUp selectItemAtIndex: 0]; 
+       
+    /* Erase info from the input fields fPresetNewDesc*/
+       [fPresetNewName setStringValue: @""];
+       [fPresetNewDesc setStringValue: @""];
+       /* Show the panel */
+       [NSApp beginSheet: fAddPresetPanel modalForWindow: fWindow modalDelegate: NULL didEndSelector: NULL contextInfo: NULL];
+}
+
+- (IBAction) closeAddPresetPanel: (id) sender
+{
+    [NSApp endSheet: fAddPresetPanel];
+    [fAddPresetPanel orderOut: self];
+}
 
-    /*Sub Me fX264optSubmePopUp*/
-    [fX264optSubmePopUp removeAllItems];
-    [fX264optSubmePopUp addItemWithTitle:@"Default (4)"];
-    for (i=0; i<8;i++)
+- (IBAction)addUserPreset:(id)sender
+{
+    if (![[fPresetNewName stringValue] length])
+            NSRunAlertPanel(@"Warning!", @"You need to insert a name for the preset.", @"OK", nil , nil);
+    else
     {
-        [fX264optSubmePopUp addItemWithTitle:[NSString stringWithFormat:@"%d",i]];
+        /* Here we create a custom user preset */
+        [UserPresets addObject:[self createPreset]];
+        [self addPreset];
+        
+        [self closeAddPresetPanel:NULL];
     }
-    
-    /*Trellis fX264optTrellisPopUp*/
-    [fX264optTrellisPopUp removeAllItems];
-    [fX264optTrellisPopUp addItemWithTitle:@"Default (0)"];
-    for (i=0; i<3;i++)
-    {
-        [fX264optTrellisPopUp addItemWithTitle:[NSString stringWithFormat:@"%d",i]];
-    }
-    
-    /*Mixed-references fX264optMixedRefsSwitch BOOLEAN*/
-    [fX264optMixedRefsSwitch setState:0];
-    
-    /*Motion Estimation fX264optMotionEstPopUp*/
-    [fX264optMotionEstPopUp removeAllItems];
-    [fX264optMotionEstPopUp addItemWithTitle:@"Default (Hexagon)"];
-    [fX264optMotionEstPopUp addItemWithTitle:@"Diamond"];
-    [fX264optMotionEstPopUp addItemWithTitle:@"Hexagon"];
-    [fX264optMotionEstPopUp addItemWithTitle:@"Uneven Multi-Hexagon"];
-    [fX264optMotionEstPopUp addItemWithTitle:@"Exhaustive"];
-    
-    /*Motion Estimation range fX264optMERangePopUp*/
-    [fX264optMERangePopUp removeAllItems];
-    [fX264optMERangePopUp addItemWithTitle:@"Default (16)"];
-    for (i=4; i<65;i++)
-    {
-        [fX264optMERangePopUp addItemWithTitle:[NSString stringWithFormat:@"%d",i]];
-    }
-    
-    /*Weighted B-Frame Prediction fX264optWeightBSwitch BOOLEAN*/
-    [fX264optWeightBSwitch setState:0];
-    
-    /*B-Frame Rate Distortion Optimization fX264optBRDOSwitch BOOLEAN*/
-    [fX264optBRDOSwitch setState:0];
-    
-    /*B-frame Pyramids fX264optBPyramidSwitch BOOLEAN*/
-    [fX264optBPyramidSwitch setState:0];
-    
-    /*Bidirectional Motion Estimation Refinement fX264optBiMESwitch BOOLEAN*/
-    [fX264optBiMESwitch setState:0];
-    
-    /*Direct B-Frame Prediction Mode fX264optDirectPredPopUp*/
-    [fX264optDirectPredPopUp removeAllItems];
-    [fX264optDirectPredPopUp addItemWithTitle:@"Default (Spatial)"];
-    [fX264optDirectPredPopUp addItemWithTitle:@"None"];
-    [fX264optDirectPredPopUp addItemWithTitle:@"Spatial"];
-    [fX264optDirectPredPopUp addItemWithTitle:@"Temporal"];
-    [fX264optDirectPredPopUp addItemWithTitle:@"Automatic"];
-    
-    /*Alpha Deblock*/
-    [fX264optAlphaDeblockPopUp removeAllItems];
-    [fX264optAlphaDeblockPopUp addItemWithTitle:@"Default (0)"];
-    for (i=-6; i<7;i++)
-    {
-        [fX264optAlphaDeblockPopUp addItemWithTitle:[NSString stringWithFormat:@"%d",i]];
-    }
-    
-    /*Beta Deblock*/
-    [fX264optBetaDeblockPopUp removeAllItems];
-    [fX264optBetaDeblockPopUp addItemWithTitle:@"Default (0)"];
-    for (i=-6; i<7;i++)
-    {
-        [fX264optBetaDeblockPopUp addItemWithTitle:[NSString stringWithFormat:@"%d",i]];
-    }     
-    
-    /* Analysis fX264optAnalysePopUp */
-    [fX264optAnalysePopUp removeAllItems];
-    [fX264optAnalysePopUp addItemWithTitle:@"Default (some)"]; /* 0=default */
-    [fX264optAnalysePopUp addItemWithTitle:[NSString stringWithFormat:@"None"]]; /* 1=none */
-    [fX264optAnalysePopUp addItemWithTitle:[NSString stringWithFormat:@"All"]]; /* 2=all */
-    
-    /* 8x8 DCT fX264op8x8dctSwitch */
-    [fX264opt8x8dctSwitch setState:0];
-    
-    /* CABAC fX264opCabacSwitch */
-    [fX264optCabacSwitch setState:1];
-
-    /* Standardize the option string */
-    [self X264AdvancedOptionsStandardizeOptString: NULL];
-    /* Set Current GUI Settings based on newly standardized string */
-    [self X264AdvancedOptionsSetCurrentSettings: NULL];
 }
-
-- (IBAction) X264AdvancedOptionsStandardizeOptString: (id) sender
+- (void)addPreset
 {
-    /* Set widgets depending on the opt string in field */
-    NSString * thisOpt; // The separated option such as "bframes=3"
-    NSString * optName = @""; // The option name such as "bframes"
-    NSString * optValue = @"";// The option value such as "3"
-    NSString * changedOptString = @"";
-    NSArray *currentOptsArray;
-
-    /*First, we get an opt string to process */
-    NSString *currentOptString = [fDisplayX264Options stringValue];
-
-    /*verify there is an opt string to process */
-    NSRange currentOptRange = [currentOptString rangeOfString:@"="];
-    if (currentOptRange.location != NSNotFound)
-    {
-        /*Put individual options into an array based on the ":" separator for processing, result is "<opt>=<value>"*/
-        currentOptsArray = [currentOptString componentsSeparatedByString:@":"];
-
-        /*iterate through the array and get <opts> and <values*/
-        //NSEnumerator * enumerator = [currentOptsArray objectEnumerator];
-        int loopcounter;
-        int currentOptsArrayCount = [currentOptsArray count];
-        for (loopcounter = 0; loopcounter < currentOptsArrayCount; loopcounter++)
-        {
-            thisOpt = [currentOptsArray objectAtIndex:loopcounter];
-            
-            NSRange splitOptRange = [thisOpt rangeOfString:@"="];
-            if (splitOptRange.location != NSNotFound)
-            {
-                optName = [thisOpt substringToIndex:splitOptRange.location];
-                optValue = [thisOpt substringFromIndex:splitOptRange.location + 1];
-                
-                /* Standardize the names here depending on whats in the string */
-                optName = [self X264AdvancedOptionsStandardizeOptNames:optName];
-                thisOpt = [NSString stringWithFormat:@"%@=%@",optName,optValue];       
-            }
-            else // No value given so we use a default of "1"
-            {
-                optName = thisOpt;
-                /* Standardize the names here depending on whats in the string */
-                optName = [self X264AdvancedOptionsStandardizeOptNames:optName];
-                thisOpt = [NSString stringWithFormat:@"%@=%d",optName,1];
-            }
-            
-            /* Construct New String for opts here */
-            if ([thisOpt isEqualToString:@""])
-            {
-                changedOptString = [NSString stringWithFormat:@"%@%@",changedOptString,thisOpt];
-            }
-            else
-            {
-                if ([changedOptString isEqualToString:@""])
-                {
-                    changedOptString = [NSString stringWithFormat:@"%@",thisOpt];
-                }
-                else
-                {
-                    changedOptString = [NSString stringWithFormat:@"%@:%@",changedOptString,thisOpt];
-                }
-            }
-        }
-    }
-    
-    /* Change the option string to reflect the new standardized option string */
-    [fDisplayX264Options setStringValue:[NSString stringWithFormat:changedOptString]];
-}
 
-- (NSString *) X264AdvancedOptionsStandardizeOptNames:(NSString *) cleanOptNameString
-{
-    if ([cleanOptNameString isEqualToString:@"ref"] || [cleanOptNameString isEqualToString:@"frameref"])
-    {
-        cleanOptNameString = @"ref";
-    }
-    
-    /*No Fast PSkip nofast_pskip*/
-    if ([cleanOptNameString isEqualToString:@"no-fast-pskip"] || [cleanOptNameString isEqualToString:@"no_fast_pskip"] || [cleanOptNameString isEqualToString:@"nofast_pskip"])
-    {
-        cleanOptNameString = @"no-fast-pskip";
-    }
-    
-    /*No Dict Decimate*/
-    if ([cleanOptNameString isEqualToString:@"no-dct-decimate"] || [cleanOptNameString isEqualToString:@"no_dct_decimate"] || [cleanOptNameString isEqualToString:@"nodct_decimate"])
-    {
-        cleanOptNameString = @"no-dct-decimate";
-    }
-    
-    /*Subme*/
-    if ([cleanOptNameString isEqualToString:@"subme"])
-    {
-        cleanOptNameString = @"subq";
-    }
-    
-    /*ME Range*/
-    if ([cleanOptNameString isEqualToString:@"me-range"] || [cleanOptNameString isEqualToString:@"me_range"])
-        cleanOptNameString = @"merange";
-    
-    /*WeightB*/
-    if ([cleanOptNameString isEqualToString:@"weight-b"] || [cleanOptNameString isEqualToString:@"weight_b"])
-    {
-        cleanOptNameString = @"weightb";
-    }
-    
-    /*BRDO*/
-    if ([cleanOptNameString isEqualToString:@"b-rdo"] || [cleanOptNameString isEqualToString:@"b_rdo"])
-    {
-        cleanOptNameString = @"brdo";
-    }
-    
-    /*B Pyramid*/
-    if ([cleanOptNameString isEqualToString:@"b_pyramid"])
-    {
-        cleanOptNameString = @"b-pyramid";
-    }
-    
-    /*Direct Prediction*/
-    if ([cleanOptNameString isEqualToString:@"direct-pred"] || [cleanOptNameString isEqualToString:@"direct_pred"])
-    {
-        cleanOptNameString = @"direct";
-    }
-    
-    /*Deblocking*/
-    if ([cleanOptNameString isEqualToString:@"filter"])
-    {
-        cleanOptNameString = @"deblock";
-    }
-
-    /*Analysis*/
-    if ([cleanOptNameString isEqualToString:@"partitions"])
-    {
-        cleanOptNameString = @"analyse";
-    }
-
-        
-    return cleanOptNameString; 
+       
+       /* We Sort the Presets By Factory or Custom */
+       NSSortDescriptor * presetTypeDescriptor=[[[NSSortDescriptor alloc] initWithKey:@"Type" 
+                                                    ascending:YES] autorelease];
+       /* We Sort the Presets Alphabetically by name */
+       NSSortDescriptor * presetNameDescriptor=[[[NSSortDescriptor alloc] initWithKey:@"PresetName" 
+                                                    ascending:YES selector:@selector(caseInsensitiveCompare:)] autorelease];
+       NSArray *sortDescriptors=[NSArray arrayWithObjects:presetTypeDescriptor,presetNameDescriptor,nil];
+       NSArray *sortedArray=[UserPresets sortedArrayUsingDescriptors:sortDescriptors];
+       [UserPresets setArray:sortedArray];
+       
+       
+       /* We Reload the New Table data for presets */
+    [tableView reloadData];
+   /* We save all of the preset data here */
+    [self savePreset];
 }
 
-- (IBAction) X264AdvancedOptionsSetCurrentSettings: (id) sender
+- (IBAction)insertPreset:(id)sender
 {
-    /* Set widgets depending on the opt string in field */
-    NSString * thisOpt; // The separated option such as "bframes=3"
-    NSString * optName = @""; // The option name such as "bframes"
-    NSString * optValue = @"";// The option value such as "3"
-    NSArray *currentOptsArray;
-    
-    /*First, we get an opt string to process */
-    //NSString *currentOptString = @"bframes=3:ref=1:subme=5:me=umh:no-fast-pskip=1:no-dct-decimate=1:trellis=2";
-    NSString *currentOptString = [fDisplayX264Options stringValue];
-    
-    /*verify there is an opt string to process */
-    NSRange currentOptRange = [currentOptString rangeOfString:@"="];
-    if (currentOptRange.location != NSNotFound)
-    {
-        /* lets clean the opt string here to standardize any names*/
-        /*Put individual options into an array based on the ":" separator for processing, result is "<opt>=<value>"*/
-        currentOptsArray = [currentOptString componentsSeparatedByString:@":"];
-        
-        /*iterate through the array and get <opts> and <values*/
-        //NSEnumerator * enumerator = [currentOptsArray objectEnumerator];
-        int loopcounter;
-        int currentOptsArrayCount = [currentOptsArray count];
-        
-        /*iterate through the array and get <opts> and <values*/
-        for (loopcounter = 0; loopcounter < currentOptsArrayCount; loopcounter++)
-        {
-            thisOpt = [currentOptsArray objectAtIndex:loopcounter];
-            NSRange splitOptRange = [thisOpt rangeOfString:@"="];
-            
-            if (splitOptRange.location != NSNotFound)
-            {
-                optName = [thisOpt substringToIndex:splitOptRange.location];
-                optValue = [thisOpt substringFromIndex:splitOptRange.location + 1];
-           
-                /*Run through the available widgets for x264 opts and set them, as you add widgets, 
-                they need to be added here. This should be moved to its own method probably*/
-           
-                /*bframes NSPopUpButton*/
-                if ([optName isEqualToString:@"bframes"])
-                {
-                    [fX264optBframesPopUp selectItemAtIndex:[optValue intValue]+1];
-                }
-                /*ref NSPopUpButton*/
-                if ([optName isEqualToString:@"ref"])
-                {
-                   [fX264optRefPopUp selectItemAtIndex:[optValue intValue]+1];
-                }
-                /*No Fast PSkip NSPopUpButton*/
-                if ([optName isEqualToString:@"no-fast-pskip"])
-                {
-                    [fX264optNfpskipSwitch setState:[optValue intValue]];
-                }
-                /*No Dict Decimate NSPopUpButton*/
-                if ([optName isEqualToString:@"no-dct-decimate"])
-                {
-                    [fX264optNodctdcmtSwitch setState:[optValue intValue]];
-                }
-                /*Sub Me NSPopUpButton*/
-                if ([optName isEqualToString:@"subq"])
-                {
-                    [fX264optSubmePopUp selectItemAtIndex:[optValue intValue]+1];
-                }
-                /*Trellis NSPopUpButton*/
-                if ([optName isEqualToString:@"trellis"])
-                {
-                    [fX264optTrellisPopUp selectItemAtIndex:[optValue intValue]+1];
-                }
-                /*Mixed Refs NSButton*/
-                if ([optName isEqualToString:@"mixed-refs"])
-                {
-                    [fX264optMixedRefsSwitch setState:[optValue intValue]];
-                }
-                /*Motion Estimation NSPopUpButton*/
-                if ([optName isEqualToString:@"me"])
-                {
-                    if ([optValue isEqualToString:@"dia"])
-                        [fX264optMotionEstPopUp selectItemAtIndex:1];
-                    else if ([optValue isEqualToString:@"hex"])
-                        [fX264optMotionEstPopUp selectItemAtIndex:2];
-                    else if ([optValue isEqualToString:@"umh"])
-                        [fX264optMotionEstPopUp selectItemAtIndex:3];
-                    else if ([optValue isEqualToString:@"esa"])
-                        [fX264optMotionEstPopUp selectItemAtIndex:4];                        
-                }
-                /*ME Range NSPopUpButton*/
-                if ([optName isEqualToString:@"merange"])
-                {
-                    [fX264optMERangePopUp selectItemAtIndex:[optValue intValue]-3];
-                }
-                /*Weighted B-Frames NSPopUpButton*/
-                if ([optName isEqualToString:@"weightb"])
-                {
-                    [fX264optWeightBSwitch setState:[optValue intValue]];
-                }
-                /*BRDO NSPopUpButton*/
-                if ([optName isEqualToString:@"brdo"])
-                {
-                    [fX264optBRDOSwitch setState:[optValue intValue]];
-                }
-                /*B Pyramid NSPopUpButton*/
-                if ([optName isEqualToString:@"b-pyramid"])
-                {
-                    [fX264optBPyramidSwitch setState:[optValue intValue]];
-                }
-                /*Bidirectional Motion Estimation Refinement NSPopUpButton*/
-                if ([optName isEqualToString:@"bime"])
-                {
-                    [fX264optBiMESwitch setState:[optValue intValue]];
-                }
-                /*Direct B-frame Prediction NSPopUpButton*/
-                if ([optName isEqualToString:@"direct"])
-                {
-                    if ([optValue isEqualToString:@"none"])
-                        [fX264optDirectPredPopUp selectItemAtIndex:1];
-                    else if ([optValue isEqualToString:@"spatial"])
-                        [fX264optDirectPredPopUp selectItemAtIndex:2];
-                    else if ([optValue isEqualToString:@"temporal"])
-                        [fX264optDirectPredPopUp selectItemAtIndex:3];
-                    else if ([optValue isEqualToString:@"auto"])
-                        [fX264optDirectPredPopUp selectItemAtIndex:4];                        
-                }
-                /*Deblocking NSPopUpButtons*/
-                if ([optName isEqualToString:@"deblock"])
-                {
-                    NSString * alphaDeblock = @"";
-                    NSString * betaDeblock = @"";
-                
-                    NSRange splitDeblock = [optValue rangeOfString:@","];
-                    alphaDeblock = [optValue substringToIndex:splitDeblock.location];
-                    betaDeblock = [optValue substringFromIndex:splitDeblock.location + 1];
-                    
-                    if ([alphaDeblock isEqualToString:@"0"] && [betaDeblock isEqualToString:@"0"])
-                    {
-                        [fX264optAlphaDeblockPopUp selectItemAtIndex:0];                        
-                        [fX264optBetaDeblockPopUp selectItemAtIndex:0];                               
-                    }
-                    else
-                    {
-                        if (![alphaDeblock isEqualToString:@"0"])
-                        {
-                            [fX264optAlphaDeblockPopUp selectItemAtIndex:[alphaDeblock intValue]+7];
-                        }
-                        else
-                        {
-                            [fX264optAlphaDeblockPopUp selectItemAtIndex:7];                        
-                        }
-                        
-                        if (![betaDeblock isEqualToString:@"0"])
-                        {
-                            [fX264optBetaDeblockPopUp selectItemAtIndex:[betaDeblock intValue]+7];
-                        }
-                        else
-                        {
-                            [fX264optBetaDeblockPopUp selectItemAtIndex:7];                        
-                        }
-                    }
-                }
-                /* Analysis NSPopUpButton */
-                if ([optName isEqualToString:@"analyse"])
-                {
-                    if ([optValue isEqualToString:@"p8x8,b8x8,i8x8,i4x4"])
-                    {
-                        [fX264optAnalysePopUp selectItemAtIndex:0];
-                    }
-                    if ([optValue isEqualToString:@"none"])
-                    {
-                        [fX264optAnalysePopUp selectItemAtIndex:1];
-                    }
-                    if ([optValue isEqualToString:@"all"])
-                    {
-                        [fX264optAnalysePopUp selectItemAtIndex:2];
-                    }
-                }
-                /* 8x8 DCT NSButton */
-                if ([optName isEqualToString:@"8x8dct"])
-                {
-                    [fX264opt8x8dctSwitch setState:[optValue intValue]];
-                }
-                /* CABAC NSButton */
-                if ([optName isEqualToString:@"cabac"])
-                {
-                    [fX264optCabacSwitch setState:[optValue intValue]];
-                }                                                                 
-            }
-        }
-    }
+    int index = [tableView selectedRow];
+    [UserPresets insertObject:[self createPreset] atIndex:index];
+    [tableView reloadData];
+    [self savePreset];
 }
 
-- (IBAction) X264AdvancedOptionsChanged: (id) sender
+- (NSDictionary *)createPreset
 {
-    /*Determine which outlet is being used and set optName to process accordingly */
-    NSString * optNameToChange = @""; // The option name such as "bframes"
-
-    if (sender == fX264optBframesPopUp)
-    {
-        optNameToChange = @"bframes";
-    }
-    if (sender == fX264optRefPopUp)
-    {
-        optNameToChange = @"ref";
-    }
-    if (sender == fX264optNfpskipSwitch)
-    {
-        optNameToChange = @"no-fast-pskip";
-    }
-    if (sender == fX264optNodctdcmtSwitch)
-    {
-        optNameToChange = @"no-dct-decimate";
-    }
-    if (sender == fX264optSubmePopUp)
-    {
-        optNameToChange = @"subq";
-    }
-    if (sender == fX264optTrellisPopUp)
-    {
-        optNameToChange = @"trellis";
-    }
-    if (sender == fX264optMixedRefsSwitch)
-    {
-        optNameToChange = @"mixed-refs";
-    }
-    if (sender == fX264optMotionEstPopUp)
-    {
-        optNameToChange = @"me";
-    }
-    if (sender == fX264optMERangePopUp)
-    {
-        optNameToChange = @"merange";
-    }
-    if (sender == fX264optWeightBSwitch)
-    {
-        optNameToChange = @"weightb";
-    }
-    if (sender == fX264optBRDOSwitch)
-    {
-        optNameToChange = @"brdo";
-    }
-    if (sender == fX264optBPyramidSwitch)
-    {
-        optNameToChange = @"b-pyramid";
-    }
-    if (sender == fX264optBiMESwitch)
-    {
-        optNameToChange = @"bime";
-    }
-    if (sender == fX264optDirectPredPopUp)
-    {
-        optNameToChange = @"direct";
-    }
-    if (sender == fX264optAlphaDeblockPopUp)
-    {
-        optNameToChange = @"deblock";
-    }
-    if (sender == fX264optBetaDeblockPopUp)
-    {
-        optNameToChange = @"deblock";
-    }        
-    if (sender == fX264optAnalysePopUp)
-    {
-        optNameToChange = @"analyse";
-    }
-    if (sender == fX264opt8x8dctSwitch)
-    {
-        optNameToChange = @"8x8dct";
-    }
-    if (sender == fX264optCabacSwitch)
-    {
-        optNameToChange = @"cabac";
-    }
-    
-    /* Set widgets depending on the opt string in field */
-    NSString * thisOpt; // The separated option such as "bframes=3"
-    NSString * optName = @""; // The option name such as "bframes"
-    NSString * optValue = @"";// The option value such as "3"
-    NSArray *currentOptsArray;
-
-    /*First, we get an opt string to process */
-    //EXAMPLE: NSString *currentOptString = @"bframes=3:ref=1:subme=5:me=umh:no-fast-pskip=1:no-dct-decimate=1:trellis=2";
-    NSString *currentOptString = [fDisplayX264Options stringValue];
-
-    /*verify there is an occurrence of the opt specified by the sender to change */
-    /*take care of any multi-value opt names here. This is extremely kludgy, but test for functionality
-    and worry about pretty later */
-       
-       /*First, we create a pattern to check for ":"optNameToChange"=" to modify the option if the name falls after
-       the first character of the opt string (hence the ":") */
-       NSString *checkOptNameToChange = [NSString stringWithFormat:@":%@=",optNameToChange];
-    NSRange currentOptRange = [currentOptString rangeOfString:checkOptNameToChange];
-       /*Then we create a pattern to check for "<beginning of line>"optNameToChange"=" to modify the option to
-       see if the name falls at the beginning of the line, where we would not have the ":" as a pattern to test against*/
-       NSString *checkOptNameToChangeBeginning = [NSString stringWithFormat:@"%@=",optNameToChange];
-    NSRange currentOptRangeBeginning = [currentOptString rangeOfString:checkOptNameToChangeBeginning];
-    if (currentOptRange.location != NSNotFound || currentOptRangeBeginning.location == 0)
-    {
-        /* Create new empty opt string*/
-        NSString *changedOptString = @"";
-
-        /*Put individual options into an array based on the ":" separator for processing, result is "<opt>=<value>"*/
-        currentOptsArray = [currentOptString componentsSeparatedByString:@":"];
-
-        /*iterate through the array and get <opts> and <values*/
-        int loopcounter;
-        int currentOptsArrayCount = [currentOptsArray count];
-        for (loopcounter = 0; loopcounter < currentOptsArrayCount; loopcounter++)
-        {
-            thisOpt = [currentOptsArray objectAtIndex:loopcounter];
-            NSRange splitOptRange = [thisOpt rangeOfString:@"="];
-
-            if (splitOptRange.location != NSNotFound)
-            {
-                optName = [thisOpt substringToIndex:splitOptRange.location];
-                optValue = [thisOpt substringFromIndex:splitOptRange.location + 1];
-                
-                /*Run through the available widgets for x264 opts and set them, as you add widgets, 
-                they need to be added here. This should be moved to its own method probably*/
-                
-                /*If the optNameToChange is found, appropriately change the value or delete it if
-                "Unspecified" is set.*/
-                if ([optName isEqualToString:optNameToChange])
-                {
-                    if ([optNameToChange isEqualToString:@"deblock"])
-                    {
-                        if ((([fX264optAlphaDeblockPopUp indexOfSelectedItem] == 0) || ([fX264optAlphaDeblockPopUp indexOfSelectedItem] == 7)) && (([fX264optBetaDeblockPopUp indexOfSelectedItem] == 0) || ([fX264optBetaDeblockPopUp indexOfSelectedItem] == 7)))
-                        {
-                            thisOpt = @"";                                
-                        }
-                        else
-                        {
-                            thisOpt = [NSString stringWithFormat:@"%@=%d,%d",optName, ([fX264optAlphaDeblockPopUp indexOfSelectedItem] != 0) ? [fX264optAlphaDeblockPopUp indexOfSelectedItem]-7 : 0,([fX264optBetaDeblockPopUp indexOfSelectedItem] != 0) ? [fX264optBetaDeblockPopUp indexOfSelectedItem]-7 : 0];
-                        }
-                    }
-                    else if /*Boolean Switches*/ ([optNameToChange isEqualToString:@"mixed-refs"] || [optNameToChange isEqualToString:@"weightb"] || [optNameToChange isEqualToString:@"brdo"] || [optNameToChange isEqualToString:@"bime"] || [optNameToChange isEqualToString:@"b-pyramid"] || [optNameToChange isEqualToString:@"no-fast-pskip"] || [optNameToChange isEqualToString:@"no-dct-decimate"] || [optNameToChange isEqualToString:@"8x8dct"] )
-                    {
-                        if ([sender state] == 0)
-                        {
-                            thisOpt = @"";
-                        }
-                        else
-                        {
-                            thisOpt = [NSString stringWithFormat:@"%@=%d",optName,1];
-                        }
-                    }
-                    else if ([optNameToChange isEqualToString:@"cabac"])
-                    {
-                        if ([sender state] == 1)
-                        {
-                            thisOpt = @"";
-                        }
-                        else
-                        {
-                            thisOpt = [NSString stringWithFormat:@"%@=%d",optName,0];
-                        }
-                    }                                        
-                    else if (([sender indexOfSelectedItem] == 0) && (sender != fX264optAlphaDeblockPopUp) && (sender != fX264optBetaDeblockPopUp) ) // means that "unspecified" is chosen, lets then remove it from the string
-                    {
-                        thisOpt = @"";
-                    }
-                    else if ([optNameToChange isEqualToString:@"me"])
-                    {
-                        switch ([sender indexOfSelectedItem])
-                        {   
-                            case 1:
-                               thisOpt = [NSString stringWithFormat:@"%@=%@",optName,@"dia"];
-                               break;
-                            case 2:
-                               thisOpt = [NSString stringWithFormat:@"%@=%@",optName,@"hex"];
-                               break;
-                            case 3:
-                               thisOpt = [NSString stringWithFormat:@"%@=%@",optName,@"umh"];
-                               break;
-                            case 4:
-                               thisOpt = [NSString stringWithFormat:@"%@=%@",optName,@"esa"];
-                               break;
-                            
-                            default:
-                                break;
-                        }
-                    }
-                    else if ([optNameToChange isEqualToString:@"direct"])
-                    {
-                        switch ([sender indexOfSelectedItem])
-                        {   
-                            case 1:
-                               thisOpt = [NSString stringWithFormat:@"%@=%@",optName,@"none"];
-                               break;
-                            case 2:
-                               thisOpt = [NSString stringWithFormat:@"%@=%@",optName,@"spatial"];
-                               break;
-                            case 3:
-                               thisOpt = [NSString stringWithFormat:@"%@=%@",optName,@"temporal"];
-                               break;
-                            case 4:
-                               thisOpt = [NSString stringWithFormat:@"%@=%@",optName,@"auto"];
-                               break;
-                            
-                            default:
-                                break;
-                        }
-                    }
-                    else if ([optNameToChange isEqualToString:@"analyse"])
-                    {
-                        switch ([sender indexOfSelectedItem])
-                        {   
-                            case 1:
-                               thisOpt = [NSString stringWithFormat:@"%@=%@",optName,@"none"];
-                               break;
-                            case 2:
-                               thisOpt = [NSString stringWithFormat:@"%@=%@",optName,@"all"];
-                               break;
-                            
-                            default:
-                                break;
-                        }
-                    }
-                    else if ([optNameToChange isEqualToString:@"merange"])
-                    {
-                        thisOpt = [NSString stringWithFormat:@"%@=%d",optName,[sender indexOfSelectedItem]+3];
-                    }
-                    else // we have a valid value to change, so change it
-                    {
-                        thisOpt = [NSString stringWithFormat:@"%@=%d",optName,[sender indexOfSelectedItem]-1];
-                    }
-                }
-            }
-
-            /* Construct New String for opts here */
-            if ([thisOpt isEqualToString:@""])
-            {
-                changedOptString = [NSString stringWithFormat:@"%@%@",changedOptString,thisOpt];
-            }
-            else
-            {
-                if ([changedOptString isEqualToString:@""])
-                {
-                    changedOptString = [NSString stringWithFormat:@"%@",thisOpt];
-                }
-                else
-                {
-                    changedOptString = [NSString stringWithFormat:@"%@:%@",changedOptString,thisOpt];
-                }
-            }
-        }
-
-        /* Change the option string to reflect the new mod settings */
-        [fDisplayX264Options setStringValue:[NSString stringWithFormat:changedOptString]];     
-    }
-    else // if none exists, add it to the string
-    {
-        if ([[fDisplayX264Options stringValue] isEqualToString: @""])
-        {
-            if ([optNameToChange isEqualToString:@"me"])
-            {
-                switch ([sender indexOfSelectedItem])
-                {   
-                    case 1:
-                        [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@=%@", 
-                            [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"dia"]]];
-                        break;
-               
-                    case 2:
-                        [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@=%@", 
-                            [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"hex"]]];
-                        break;
-               
-                   case 3:
-                        [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@=%@", 
-                            [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"umh"]]];
-                        break;
-               
-                   case 4:
-                        [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@=%@", 
-                            [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"esa"]]];
-                        break;
-                   
-                   default:
-                        break;
-                }
-            }
-            else if ([optNameToChange isEqualToString:@"direct"])
-            {
-                switch ([sender indexOfSelectedItem])
-                {   
-                    case 1:
-                        [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@=%@", 
-                            [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"none"]]];
-                        break;
-               
-                    case 2:
-                        [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@=%@", 
-                            [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"spatial"]]];
-                        break;
-               
-                   case 3:
-                        [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@=%@", 
-                            [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"temporal"]]];
-                        break;
-               
-                   case 4:
-                        [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@=%@", 
-                            [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"auto"]]];
-                        break;
-                   
-                   default:
-                        break;
-                }
-            }
-            else if ([optNameToChange isEqualToString:@"analyse"])
-            {
-                switch ([sender indexOfSelectedItem])
-                {   
-                    case 1:
-                        [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@=%@", 
-                            [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"none"]]];
-                        break;
-               
-                    case 2:
-                        [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@=%@", 
-                            [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"all"]]];
-                        break;
-                   
-                   default:
-                        break;
-                }
-            }
+    NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
+       /* Get the New Preset Name from the field in the AddPresetPanel */
+    [preset setObject:[fPresetNewName stringValue] forKey:@"PresetName"];
+       /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"Type"];
+       /*Set whether or not this is default, at creation set to 0*/
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
+       /*Get the whether or not to apply pic settings in the AddPresetPanel*/
+       [preset setObject:[NSNumber numberWithInt:[fPresetNewPicSettingsPopUp indexOfSelectedItem]] forKey:@"UsesPictureSettings"];
+       /* Get New Preset Description from the field in the AddPresetPanel*/
+       [preset setObject:[fPresetNewDesc stringValue] forKey:@"PresetDescription"];
+       /* File Format */
+    [preset setObject:[fDstFormatPopUp titleOfSelectedItem] forKey:@"FileFormat"];
+       /* Chapter Markers fCreateChapterMarkers*/
+       [preset setObject:[NSNumber numberWithInt:[fCreateChapterMarkers state]] forKey:@"ChapterMarkers"];
+       /* Allow Mpeg4 64 bit formatting +4GB file sizes */
+       [preset setObject:[NSNumber numberWithInt:[fDstMpgLargeFileCheck state]] forKey:@"Mp4LargeFile"];
+       /* Codecs */
+       [preset setObject:[fDstCodecsPopUp titleOfSelectedItem] forKey:@"FileCodecs"];
+       /* Video encoder */
+       [preset setObject:[fVidEncoderPopUp titleOfSelectedItem] forKey:@"VideoEncoder"];
+       /* x264 Option String */
+       [preset setObject:[fAdvancedOptions optionsString] forKey:@"x264Option"];
+       
+       [preset setObject:[NSNumber numberWithInt:[fVidQualityMatrix selectedRow]] forKey:@"VideoQualityType"];
+       [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
+       [preset setObject:[fVidBitrateField stringValue] forKey:@"VideoAvgBitrate"];
+       [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
+       
+       /* Video framerate */
+       [preset setObject:[fVidRatePopUp titleOfSelectedItem] forKey:@"VideoFramerate"];
+       /* GrayScale */
+       [preset setObject:[NSNumber numberWithInt:[fVidGrayscaleCheck state]] forKey:@"VideoGrayScale"];
+       /* 2 Pass Encoding */
+       [preset setObject:[NSNumber numberWithInt:[fVidTwoPassCheck state]] forKey:@"VideoTwoPass"];
+       /* Turbo 2 pass Encoding fVidTurboPassCheck*/
+       [preset setObject:[NSNumber numberWithInt:[fVidTurboPassCheck state]] forKey:@"VideoTurboTwoPass"];
+       /*Picture Settings*/
+       hb_job_t * job = fTitle->job;
+       /* Basic Picture Settings */
+       /* Use Max Picture settings for whatever the dvd is.*/
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"UsesMaxPictureSettings"];
+       [preset setObject:[NSNumber numberWithInt:fTitle->job->width] forKey:@"PictureWidth"];
+       [preset setObject:[NSNumber numberWithInt:fTitle->job->height] forKey:@"PictureHeight"];
+       [preset setObject:[NSNumber numberWithInt:fTitle->job->keep_ratio] forKey:@"PictureKeepRatio"];
+       [preset setObject:[NSNumber numberWithInt:[fPictureController deinterlace]] forKey:@"PictureDeinterlace"];
+       [preset setObject:[NSNumber numberWithInt:fTitle->job->pixel_ratio] forKey:@"PicturePAR"];
+       [preset setObject:[NSNumber numberWithInt:[fPictureController detelecine]] forKey:@"PictureDetelecine"];
+       [preset setObject:[NSNumber numberWithInt:[fPictureController denoise]] forKey:@"PictureDenoise"]; 
+       /* Set crop settings here */
+       /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
+       [preset setObject:[NSNumber numberWithInt:[fPictureController autoCrop]] forKey:@"PictureAutoCrop"];
 
-            else if ([optNameToChange isEqualToString:@"merange"])
-            {
-                [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@=%@", 
-                    [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"%d",[sender indexOfSelectedItem]+3]]];
-            }
-            else if ([optNameToChange isEqualToString:@"deblock"])
-            {
-                [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@=%@", [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"%d,%d", ([fX264optAlphaDeblockPopUp indexOfSelectedItem] != 0) ? [fX264optAlphaDeblockPopUp indexOfSelectedItem]-7 : 0, ([fX264optBetaDeblockPopUp indexOfSelectedItem] != 0) ? [fX264optBetaDeblockPopUp indexOfSelectedItem]-7 : 0]]];                
-            }
-            else if /*Boolean Switches*/ ([optNameToChange isEqualToString:@"mixed-refs"] || [optNameToChange isEqualToString:@"weightb"] || [optNameToChange isEqualToString:@"brdo"] || [optNameToChange isEqualToString:@"bime"] || [optNameToChange isEqualToString:@"b-pyramid"] || [optNameToChange isEqualToString:@"no-fast-pskip"] || [optNameToChange isEqualToString:@"no-dct-decimate"] || [optNameToChange isEqualToString:@"8x8dct"] )            {
-                if ([sender state] == 0)
-                {
-                    [fDisplayX264Options setStringValue:[NSString stringWithFormat:@""]];                    
-                }
-                else
-                {
-                    [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@=%@", 
-                        [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"%d",[sender state]]]];
-                }
-            }
-            else if ([optNameToChange isEqualToString:@"cabac"])
-            {
-                if ([sender state] == 1)
-                {
-                    [fDisplayX264Options setStringValue:[NSString stringWithFormat:@""]];                                        
-                }
-                else
-                {
-                    [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@=%@", 
-                        [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"%d",[sender state]]]];                    
-                }
-            }            
-            else
-            {
-                [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@=%@", 
-                    [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"%d",[sender indexOfSelectedItem]-1]]];
-            }
-        }
-        else
-        {
-            if ([optNameToChange isEqualToString:@"me"])
-            {
-                switch ([sender indexOfSelectedItem])
-                {   
-                    case 1:
-                         [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@:%@=%@", 
-                             [NSString stringWithFormat:[fDisplayX264Options stringValue]],
-                             [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"dia"]]];
-                         break;
-
-                    case 2:
-                         [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@:%@=%@", 
-                             [NSString stringWithFormat:[fDisplayX264Options stringValue]],
-                             [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"hex"]]];
-                         break;
-
-                    case 3:
-                         [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@:%@=%@", 
-                             [NSString stringWithFormat:[fDisplayX264Options stringValue]],
-                             [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"umh"]]];
-                         break;
-
-                    case 4:
-                         [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@:%@=%@", 
-                             [NSString stringWithFormat:[fDisplayX264Options stringValue]],
-                             [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"esa"]]];
-                         break;
-
-                    default:
-                         break;
-                }
-            }
-            else if ([optNameToChange isEqualToString:@"direct"])
-            {
-                switch ([sender indexOfSelectedItem])
-                {   
-                    case 1:
-                         [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@:%@=%@", 
-                             [NSString stringWithFormat:[fDisplayX264Options stringValue]],
-                             [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"none"]]];
-                         break;
-
-                    case 2:
-                         [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@:%@=%@", 
-                             [NSString stringWithFormat:[fDisplayX264Options stringValue]],
-                             [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"spatial"]]];
-                         break;
-
-                    case 3:
-                         [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@:%@=%@", 
-                             [NSString stringWithFormat:[fDisplayX264Options stringValue]],
-                             [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"temporal"]]];
-                         break;
-
-                    case 4:
-                         [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@:%@=%@", 
-                             [NSString stringWithFormat:[fDisplayX264Options stringValue]],
-                             [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"auto"]]];
-                         break;
-
-                    default:
-                         break;
-                }
-            }
-            else if ([optNameToChange isEqualToString:@"analyse"])
-            {
-                switch ([sender indexOfSelectedItem])
-                {   
-                    case 1:
-                         [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@:%@=%@", 
-                             [NSString stringWithFormat:[fDisplayX264Options stringValue]],
-                             [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"none"]]];
-                         break;
-
-                    case 2:
-                         [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@:%@=%@", 
-                             [NSString stringWithFormat:[fDisplayX264Options stringValue]],
-                             [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"all"]]];
-                         break;
-
-                    default:
-                         break;
-                }
-            }
+       [preset setObject:[NSNumber numberWithInt:job->crop[0]] forKey:@"PictureTopCrop"];
+    [preset setObject:[NSNumber numberWithInt:job->crop[1]] forKey:@"PictureBottomCrop"];
+       [preset setObject:[NSNumber numberWithInt:job->crop[2]] forKey:@"PictureLeftCrop"];
+       [preset setObject:[NSNumber numberWithInt:job->crop[3]] forKey:@"PictureRightCrop"];
+       
+       /*Audio*/
+       /* Audio Sample Rate*/
+       [preset setObject:[fAudRatePopUp titleOfSelectedItem] forKey:@"AudioSampleRate"];
+       /* Audio Bitrate Rate*/
+       [preset setObject:[fAudBitratePopUp titleOfSelectedItem] forKey:@"AudioBitRate"];
+       /* Subtitles*/
+       [preset setObject:[fSubPopUp titleOfSelectedItem] forKey:@"Subtitles"];
+       
 
-            else if ([optNameToChange isEqualToString:@"merange"])
-            {
-                [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@:%@=%@",[NSString stringWithFormat:[fDisplayX264Options stringValue]], 
-                    [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"%d",[sender indexOfSelectedItem]+3]]];
-            }
-            else if ([optNameToChange isEqualToString:@"deblock"])
-            {
-                [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@:%@=%@", [NSString stringWithFormat:[fDisplayX264Options stringValue]], [NSString stringWithFormat:optNameToChange], [NSString stringWithFormat:@"%d,%d", ([fX264optAlphaDeblockPopUp indexOfSelectedItem] != 0) ? [fX264optAlphaDeblockPopUp indexOfSelectedItem]-7 : 0, ([fX264optBetaDeblockPopUp indexOfSelectedItem] != 0) ? [fX264optBetaDeblockPopUp indexOfSelectedItem]-7 : 0]]];                
-            }
-            else if /*Boolean Switches*/ ([optNameToChange isEqualToString:@"mixed-refs"] || [optNameToChange isEqualToString:@"weightb"] || [optNameToChange isEqualToString:@"brdo"] || [optNameToChange isEqualToString:@"bime"] || [optNameToChange isEqualToString:@"b-pyramid"] || [optNameToChange isEqualToString:@"no-fast-pskip"] || [optNameToChange isEqualToString:@"no-dct-decimate"] || [optNameToChange isEqualToString:@"8x8dct"] )
-            {
-                if ([sender state] == 0)
-                {
-                    [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@",[NSString stringWithFormat:[fDisplayX264Options stringValue]]]];                    
-                }
-                else
-                {
-                    [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@:%@=%@",[NSString stringWithFormat:[fDisplayX264Options stringValue]], 
-                        [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"%d",[sender state]]]];                
-                }
-            }
-            else if ([optNameToChange isEqualToString:@"cabac"])
-            {
-                if ([sender state] == 1)
-                {
-                    [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@",[NSString stringWithFormat:[fDisplayX264Options stringValue]]]];                    
-                }
-                else
-                {
-                    [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@:%@=%@",[NSString stringWithFormat:[fDisplayX264Options stringValue]], 
-                        [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"%d",[sender state]]]];
-                }
-            }
-            else
-            {
-                [fDisplayX264Options setStringValue:[NSString stringWithFormat:@"%@:%@=%@",[NSString stringWithFormat:[fDisplayX264Options stringValue]], 
-                    [NSString stringWithFormat:optNameToChange],[NSString stringWithFormat:@"%d",[sender indexOfSelectedItem]-1]]];
-            }
-        }
-    }
+    [preset autorelease];
+    return preset;
 
-    /* We now need to reset the opt widgets since we changed some stuff */             
-    [self X264AdvancedOptionsSet:NULL];                
 }
 
-
-   /* We use this method to recreate new, updated factory
-   presets */
-- (IBAction)AddFactoryPresets:(id)sender
+- (NSDictionary *)createIpodLowPreset
 {
-    /* First, we delete any existing built in presets */
-    [self DeleteFactoryPresets: sender];
-    /* Then, we re-create new built in presets programmatically CreateIpodOnlyPreset*/
-    [UserPresets addObject:[self CreateNormalPreset]];
-    [UserPresets addObject:[self CreateClassicPreset]];
-    [UserPresets addObject:[self CreateQuickTimePreset]];
-       [UserPresets addObject:[self CreateIpodLowPreset]];
-       [UserPresets addObject:[self CreateIpodHighPreset]];
-       [UserPresets addObject:[self CreateAppleTVPreset]];
-    [UserPresets addObject:[self CreateiPhonePreset]];
-       [UserPresets addObject:[self CreatePSThreePreset]];
-       [UserPresets addObject:[self CreatePSPPreset]];
-       [UserPresets addObject:[self CreateFilmPreset]];
-    [UserPresets addObject:[self CreateTelevisionPreset]];
-    [UserPresets addObject:[self CreateAnimationPreset]];
-    [UserPresets addObject:[self CreateBedlamPreset]];
-    
-    [self AddPreset];
+    NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
+       /* Get the New Preset Name from the field in the AddPresetPanel */
+    [preset setObject:@"iPod Low-Rez" forKey:@"PresetName"];
+       /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
+       /*Set whether or not this is default, at creation set to 0*/
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
+       /*Get the whether or not to apply pic settings in the AddPresetPanel*/
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
+       /* Get the New Preset Description from the field in the AddPresetPanel */
+    [preset setObject:@"HandBrake's low resolution settings for the iPod. Optimized for great playback on the iPod screen, with smaller file size." forKey:@"PresetDescription"];
+       /* File Format */
+    [preset setObject:@"MP4 file" forKey:@"FileFormat"];
+       /* Chapter Markers*/
+        [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
+    /* Codecs */
+       [preset setObject:@"AVC/H.264 Video / AAC Audio" forKey:@"FileCodecs"];
+       /* Video encoder */
+       [preset setObject:@"x264 (h.264 iPod)" forKey:@"VideoEncoder"];
+       /* x264 Option String */
+       [preset setObject:@"keyint=300:keyint-min=30:bframes=0:cabac=0:ref=1:vbv-maxrate=768:vbv-bufsize=2000:analyse=all:me=umh:subme=6:no-fast-pskip=1" forKey:@"x264Option"];
+       /* Video quality */
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
+       [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
+       [preset setObject:@"700" forKey:@"VideoAvgBitrate"];
+       [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
+       
+       /* Video framerate */
+       [preset setObject:@"Same as source" forKey:@"VideoFramerate"];
+       /* GrayScale */
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
+       /* 2 Pass Encoding */
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTwoPass"];
+       
+       /*Picture Settings*/
+       //hb_job_t * job = fTitle->job;
+       /* Basic Picture Settings */
+       /* Use Max Picture settings for whatever the dvd is.*/
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"UsesMaxPictureSettings"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
+       [preset setObject:[NSNumber numberWithInt:320] forKey:@"PictureWidth"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureKeepRatio"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PicturePAR"];
+       /* Set crop settings here */
+       /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureBottomCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureLeftCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureRightCrop"];
+       
+       /*Audio*/
+       /* Audio Sample Rate*/
+       [preset setObject:@"48" forKey:@"AudioSampleRate"];
+       /* Audio Bitrate Rate*/
+       [preset setObject:@"160" forKey:@"AudioBitRate"];
+       /* Subtitles*/
+       [preset setObject:@"None" forKey:@"Subtitles"];
+       
+
+    [preset autorelease];
+    return preset;
+
 }
-- (IBAction)DeleteFactoryPresets:(id)sender
-{
-    //int status;
-    NSEnumerator *enumerator = [UserPresets objectEnumerator];
-       id tempObject;
-    
-       //NSNumber *index;
-    NSMutableArray *tempArray;
 
 
-        tempArray = [NSMutableArray array];
-        /* we look here to see if the preset is we move on to the next one */
-        while ( tempObject = [enumerator nextObject] )  
-               {
-                       /* if the preset is "Factory" then we put it in the array of
-                       presets to delete */
-                       if ([[tempObject objectForKey:@"Type"] intValue] == 0)
-                       {
-                               [tempArray addObject:tempObject];
-                       }
-        }
-        
-        [UserPresets removeObjectsInArray:tempArray];
-        [tableView reloadData];
-        [self savePreset];   
+- (NSDictionary *)createIpodHighPreset
+{
+    NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
+       /* Get the New Preset Name from the field in the AddPresetPanel */
+    [preset setObject:@"iPod High-Rez" forKey:@"PresetName"];
+       /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
+       /*Set whether or not this is default, at creation set to 0*/
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
+       /*Get the whether or not to apply pic settings in the AddPresetPanel*/
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
+       /* Get the New Preset Description from the field in the AddPresetPanel */
+    [preset setObject:@"HandBrake's high resolution settings for the iPod. Good video quality, great for viewing on a TV using your iPod" forKey:@"PresetDescription"];
+       /* File Format */
+    [preset setObject:@"MP4 file" forKey:@"FileFormat"];
+       /* Chapter Markers*/
+        [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
+    /* Codecs */
+       [preset setObject:@"AVC/H.264 Video / AAC Audio" forKey:@"FileCodecs"];
+       /* Video encoder */
+       [preset setObject:@"x264 (h.264 iPod)" forKey:@"VideoEncoder"];
+       /* x264 Option String */
+       [preset setObject:@"keyint=300:keyint-min=30:bframes=0:cabac=0:ref=1:vbv-maxrate=1500:vbv-bufsize=2000:analyse=all:me=umh:subme=6:no-fast-pskip=1" forKey:@"x264Option"];
+       /* Video quality */
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
+       [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
+       [preset setObject:@"1500" forKey:@"VideoAvgBitrate"];
+       [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
+       
+       /* Video framerate */
+       [preset setObject:@"Same as source" forKey:@"VideoFramerate"];
+       /* GrayScale */
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
+       /* 2 Pass Encoding */
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTwoPass"];
+       
+       /*Picture Settings*/
+       //hb_job_t * job = fTitle->job;
+       /* Basic Picture Settings */
+       /* Use Max Picture settings for whatever the dvd is.*/
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"UsesMaxPictureSettings"];
+       [preset setObject:[NSNumber numberWithInt:640] forKey:@"PictureWidth"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureKeepRatio"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PicturePAR"];
+       /* Set crop settings here */
+       /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureBottomCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureLeftCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureRightCrop"];
+       
+       /*Audio*/
+       /* Audio Sample Rate*/
+       [preset setObject:@"48" forKey:@"AudioSampleRate"];
+       /* Audio Bitrate Rate*/
+       [preset setObject:@"160" forKey:@"AudioBitRate"];
+       /* Subtitles*/
+       [preset setObject:@"None" forKey:@"Subtitles"];
+       
+
+    [preset autorelease];
+    return preset;
 
 }
 
-- (IBAction) ShowAddPresetPanel: (id) sender
+- (NSDictionary *)createAppleTVPreset
 {
-    /* Deselect the currently selected Preset if there is one*/
-               [tableView deselectRow:[tableView selectedRow]];
-
-       /* Populate the preset picture settings popup here */
-       [fPresetNewPicSettingsPopUp removeAllItems];
-       [fPresetNewPicSettingsPopUp addItemWithTitle:@"None"];
-       [fPresetNewPicSettingsPopUp addItemWithTitle:@"Current"];
-       [fPresetNewPicSettingsPopUp addItemWithTitle:@"Source Maximum (post source scan)"];
-       [fPresetNewPicSettingsPopUp selectItemAtIndex: 0];      
+    NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
+       /* Get the New Preset Name from the field in the AddPresetPanel */
+    [preset setObject:@"AppleTV" forKey:@"PresetName"];
+       /*Set whether or not this is a user preset where 0 is factory, 1 is user*/
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
+       /*Set whether or not this is default, at creation set to 0*/
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
+       /*Get the whether or not to apply pic settings in the AddPresetPanel*/
+       [preset setObject:[NSNumber numberWithInt:2] forKey:@"UsesPictureSettings"];
+       /* Get the New Preset Description from the field in the AddPresetPanel */
+    [preset setObject:@"HandBrake's settings for the AppleTV. Provides a good balance between quality and file size, and optimizes performance." forKey:@"PresetDescription"];
+       /* File Format */
+    [preset setObject:@"MP4 file" forKey:@"FileFormat"];
+       /* Chapter Markers*/
+        [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
+       /* Codecs */
+       [preset setObject:@"AVC/H.264 Video / AAC Audio" forKey:@"FileCodecs"];
+       /* Video encoder */
+       [preset setObject:@"x264 (h.264 Main)" forKey:@"VideoEncoder"];
+       /* x264 Option String (We can use this to tweak the appleTV output)*/
+       [preset setObject:@"bframes=3:ref=1:subme=5:me=umh:no-fast-pskip=1:trellis=2:cabac=0" forKey:@"x264Option"];
+       /* Video quality */
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
+       [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
+       [preset setObject:@"2500" forKey:@"VideoAvgBitrate"];
+       [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
        
-               /* Erase info from the input fields fPresetNewDesc*/
-       [fPresetNewName setStringValue: @""];
-       [fPresetNewDesc setStringValue: @""];
-       /* Show the panel */
-       [NSApp beginSheet: fAddPresetPanel modalForWindow: fWindow
-        modalDelegate: NULL didEndSelector: NULL contextInfo: NULL];
-    [NSApp runModalForWindow: fAddPresetPanel];
-    [NSApp endSheet: fAddPresetPanel];
-    [fAddPresetPanel orderOut: self];
+       /* Video framerate */
+       [preset setObject:@"Same as source" forKey:@"VideoFramerate"];
+       /* GrayScale */
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
+       /* 2 Pass Encoding */
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTwoPass"];
        
+       /*Picture Settings*/
+       /* For AppleTV we only want to retain UsesMaxPictureSettings
+       which depend on the source dvd picture settings, so we don't
+       record the current dvd's picture info since it will vary from
+       source to source*/
+       //hb_job_t * job = fTitle->job;
+       //hb_job_t * job = title->job;
+       /* Basic Picture Settings */
+       /* Use Max Picture settings for whatever the dvd is.*/
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesMaxPictureSettings"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureWidth"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureKeepRatio"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PicturePAR"];
+       /* Set crop settings here */
+       /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureBottomCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureLeftCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureRightCrop"];
        
-}
-- (IBAction) CloseAddPresetPanel: (id) sender
-{
-       [NSApp stopModal];
-}
-
-
-- (IBAction)AddUserPreset:(id)sender
-{
-
-    /* Here we create a custom user preset */
-       [UserPresets addObject:[self CreatePreset]];
-       /* Erase info from the input fields */
-       [fPresetNewName setStringValue: @""];
-       [fPresetNewDesc setStringValue: @""];
-       /* We stop the modal window for the new preset */
-       [NSApp stopModal];
-    [self AddPreset];
+       /*Audio*/
+       /* Audio Sample Rate*/
+       [preset setObject:@"48" forKey:@"AudioSampleRate"];
+       /* Audio Bitrate Rate*/
+       [preset setObject:@"160" forKey:@"AudioBitRate"];
+       /* Subtitles*/
+       [preset setObject:@"None" forKey:@"Subtitles"];
        
 
-}
-- (void)AddPreset
-{
-
-       
-       /* We Sort the Presets By Factory or Custom */
-       NSSortDescriptor * presetTypeDescriptor=[[[NSSortDescriptor alloc] initWithKey:@"Type" 
-                                                    ascending:YES] autorelease];
-       /* We Sort the Presets Alphabetically by name */
-       NSSortDescriptor * presetNameDescriptor=[[[NSSortDescriptor alloc] initWithKey:@"PresetName" 
-                                                    ascending:YES selector:@selector(caseInsensitiveCompare:)] autorelease];
-       NSArray *sortDescriptors=[NSArray arrayWithObjects:presetTypeDescriptor,presetNameDescriptor,nil];
-       NSArray *sortedArray=[UserPresets sortedArrayUsingDescriptors:sortDescriptors];
-       [UserPresets setArray:sortedArray];
-       
-       
-       /* We Reload the New Table data for presets */
-    [tableView reloadData];
-   /* We save all of the preset data here */
-    [self savePreset];
-}
+    [preset autorelease];
+    return preset;
 
-- (IBAction)InsertPreset:(id)sender
-{
-    int index = [tableView selectedRow];
-    [UserPresets insertObject:[self CreatePreset] atIndex:index];
-    [tableView reloadData];
-    [self savePreset];
 }
 
-- (NSDictionary *)CreatePreset
+- (NSDictionary *)createPSThreePreset
 {
     NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
        /* Get the New Preset Name from the field in the AddPresetPanel */
-    [preset setObject:[fPresetNewName stringValue] forKey:@"PresetName"];
-       /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"Type"];
+    [preset setObject:@"PS3" forKey:@"PresetName"];
+       /*Set whether or not this is a user preset where 0 is factory, 1 is user*/
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
        /*Set whether or not this is default, at creation set to 0*/
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
        /*Get the whether or not to apply pic settings in the AddPresetPanel*/
-       [preset setObject:[NSNumber numberWithInt:[fPresetNewPicSettingsPopUp indexOfSelectedItem]] forKey:@"UsesPictureSettings"];
-       /* Get New Preset Description from the field in the AddPresetPanel*/
-       [preset setObject:[fPresetNewDesc stringValue] forKey:@"PresetDescription"];
+       [preset setObject:[NSNumber numberWithInt:2] forKey:@"UsesPictureSettings"];
+       /* Get the New Preset Description from the field in the AddPresetPanel */
+    [preset setObject:@"HandBrake's settings for the Sony PlayStation 3." forKey:@"PresetDescription"];
        /* File Format */
-    [preset setObject:[fDstFormatPopUp titleOfSelectedItem] forKey:@"FileFormat"];
-       /* Chapter Markers fCreateChapterMarkers*/
-       [preset setObject:[NSNumber numberWithInt:[fCreateChapterMarkers state]] forKey:@"ChapterMarkers"];
-       /* Allow Mpeg4 64 bit formatting +4GB file sizes */
-       [preset setObject:[NSNumber numberWithInt:[fDstMpgLargeFileCheck state]] forKey:@"Mp4LargeFile"];
+    [preset setObject:@"MP4 file" forKey:@"FileFormat"];
+       /* Chapter Markers*/
+        [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
        /* Codecs */
-       [preset setObject:[fDstCodecsPopUp titleOfSelectedItem] forKey:@"FileCodecs"];
+       [preset setObject:@"AVC/H.264 Video / AAC Audio" forKey:@"FileCodecs"];
        /* Video encoder */
-       [preset setObject:[fVidEncoderPopUp titleOfSelectedItem] forKey:@"VideoEncoder"];
-       /* x264 Option String */
-       [preset setObject:[fDisplayX264Options stringValue] forKey:@"x264Option"];
-       
-       [preset setObject:[NSNumber numberWithInt:[fVidQualityMatrix selectedRow]] forKey:@"VideoQualityType"];
+       [preset setObject:@"x264 (h.264 Main)" forKey:@"VideoEncoder"];
+       /* x264 Option String (We can use this to tweak the appleTV output)*/
+       [preset setObject:@"level=41:subme=5:me=umh" forKey:@"x264Option"];
+       /* Video quality */
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
        [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
-       [preset setObject:[fVidBitrateField stringValue] forKey:@"VideoAvgBitrate"];
+       [preset setObject:@"2500" forKey:@"VideoAvgBitrate"];
        [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
        
        /* Video framerate */
-       [preset setObject:[fVidRatePopUp titleOfSelectedItem] forKey:@"VideoFramerate"];
+       [preset setObject:@"Same as source" forKey:@"VideoFramerate"];
        /* GrayScale */
-       [preset setObject:[NSNumber numberWithInt:[fVidGrayscaleCheck state]] forKey:@"VideoGrayScale"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
        /* 2 Pass Encoding */
-       [preset setObject:[NSNumber numberWithInt:[fVidTwoPassCheck state]] forKey:@"VideoTwoPass"];
-       /* Turbo 2 pass Encoding fVidTurboPassCheck*/
-       [preset setObject:[NSNumber numberWithInt:[fVidTurboPassCheck state]] forKey:@"VideoTurboTwoPass"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTwoPass"];
+       
        /*Picture Settings*/
-       hb_job_t * job = fTitle->job;
-       /* Basic Picture Settings */
+       /* For PS3 we only want to retain UsesMaxPictureSettings
+       which depend on the source dvd picture settings, so we don't
+       record the current dvd's picture info since it will vary from
+       source to source*/
        /* Use Max Picture settings for whatever the dvd is.*/
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"UsesMaxPictureSettings"];
-       [preset setObject:[NSNumber numberWithInt:fTitle->job->width] forKey:@"PictureWidth"];
-       [preset setObject:[NSNumber numberWithInt:fTitle->job->height] forKey:@"PictureHeight"];
-       [preset setObject:[NSNumber numberWithInt:fTitle->job->keep_ratio] forKey:@"PictureKeepRatio"];
-       [preset setObject:[NSNumber numberWithInt:fTitle->job->deinterlace] forKey:@"PictureDeinterlace"];
-       [preset setObject:[NSNumber numberWithInt:fTitle->job->pixel_ratio] forKey:@"PicturePAR"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesMaxPictureSettings"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureWidth"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureKeepRatio"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PicturePAR"];
        /* Set crop settings here */
        /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
-       //[preset setObject:[NSNumber numberWithInt:[[fPictureController fCropMatrix] selectedRow]] forKey:@"PictureAutoCrop"];
-
-       [preset setObject:[NSNumber numberWithInt:job->crop[0]] forKey:@"PictureTopCrop"];
-    [preset setObject:[NSNumber numberWithInt:job->crop[1]] forKey:@"PictureBottomCrop"];
-       [preset setObject:[NSNumber numberWithInt:job->crop[2]] forKey:@"PictureLeftCrop"];
-       [preset setObject:[NSNumber numberWithInt:job->crop[3]] forKey:@"PictureRightCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
+    [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureBottomCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureLeftCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureRightCrop"];
        
        /*Audio*/
        /* Audio Sample Rate*/
-       [preset setObject:[fAudRatePopUp titleOfSelectedItem] forKey:@"AudioSampleRate"];
+       [preset setObject:@"48" forKey:@"AudioSampleRate"];
        /* Audio Bitrate Rate*/
-       [preset setObject:[fAudBitratePopUp titleOfSelectedItem] forKey:@"AudioBitRate"];
+       [preset setObject:@"160" forKey:@"AudioBitRate"];
        /* Subtitles*/
-       [preset setObject:[fSubPopUp titleOfSelectedItem] forKey:@"Subtitles"];
+       [preset setObject:@"None" forKey:@"Subtitles"];
        
 
     [preset autorelease];
     return preset;
 
 }
-
-- (NSDictionary *)CreateIpodLowPreset
+- (NSDictionary *)createPSPPreset
 {
     NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
        /* Get the New Preset Name from the field in the AddPresetPanel */
-    [preset setObject:@"HB-iPod Low-Res" forKey:@"PresetName"];
-       /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
+    [preset setObject:@"PSP" forKey:@"PresetName"];
+       /*Set whether or not this is a user preset where 0 is factory, 1 is user*/
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
        /*Set whether or not this is default, at creation set to 0*/
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
        /*Get the whether or not to apply pic settings in the AddPresetPanel*/
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
        /* Get the New Preset Description from the field in the AddPresetPanel */
-    [preset setObject:@"HandBrake's low resolution settings for the iPod. Optimized for great playback on the iPod screen, with smaller file size." forKey:@"PresetDescription"];
+    [preset setObject:@"HandBrake's settings for the Sony PlayStation Portable." forKey:@"PresetDescription"];
        /* File Format */
     [preset setObject:@"MP4 file" forKey:@"FileFormat"];
        /* Chapter Markers*/
         [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
-    /* Codecs */
-       [preset setObject:@"AVC/H.264 Video / AAC Audio" forKey:@"FileCodecs"];
+       /* Codecs */
+       [preset setObject:@"MPEG-4 Video / AAC Audio" forKey:@"FileCodecs"];
        /* Video encoder */
-       [preset setObject:@"x264 (h.264 iPod)" forKey:@"VideoEncoder"];
-       /* x264 Option String */
-       [preset setObject:@"keyint=300:keyint-min=30:bframes=0:cabac=0:ref=1:vbv-maxrate=768:vbv-bufsize=2000:analyse=all:me=umh:subme=6:no-fast-pskip=1" forKey:@"x264Option"];
+       [preset setObject:@"FFmpeg" forKey:@"VideoEncoder"];
+       /* x264 Option String (We can use this to tweak the appleTV output)*/
+       [preset setObject:@"" forKey:@"x264Option"];
        /* Video quality */
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
        [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
-       [preset setObject:@"700" forKey:@"VideoAvgBitrate"];
+       [preset setObject:@"1024" forKey:@"VideoAvgBitrate"];
        [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
        
        /* Video framerate */
@@ -3592,18 +3288,20 @@ the user is using "Custom" settings by determining the sender*/
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTwoPass"];
        
        /*Picture Settings*/
-       //hb_job_t * job = fTitle->job;
-       /* Basic Picture Settings */
+       /* For PS3 we only want to retain UsesMaxPictureSettings
+       which depend on the source dvd picture settings, so we don't
+       record the current dvd's picture info since it will vary from
+       source to source*/
        /* Use Max Picture settings for whatever the dvd is.*/
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"UsesMaxPictureSettings"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
-       [preset setObject:[NSNumber numberWithInt:320] forKey:@"PictureWidth"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
+       [preset setObject:@"368" forKey:@"PictureWidth"];
+       [preset setObject:@"208" forKey:@"PictureHeight"];
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureKeepRatio"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PicturePAR"];
        /* Set crop settings here */
        /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
     [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureBottomCrop"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureLeftCrop"];
@@ -3613,7 +3311,7 @@ the user is using "Custom" settings by determining the sender*/
        /* Audio Sample Rate*/
        [preset setObject:@"48" forKey:@"AudioSampleRate"];
        /* Audio Bitrate Rate*/
-       [preset setObject:@"160" forKey:@"AudioBitRate"];
+       [preset setObject:@"128" forKey:@"AudioBitRate"];
        /* Subtitles*/
        [preset setObject:@"None" forKey:@"Subtitles"];
        
@@ -3623,20 +3321,19 @@ the user is using "Custom" settings by determining the sender*/
 
 }
 
-
-- (NSDictionary *)CreateIpodHighPreset
+- (NSDictionary *)createNormalPreset
 {
     NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
        /* Get the New Preset Name from the field in the AddPresetPanel */
-    [preset setObject:@"HB-iPod High-Res" forKey:@"PresetName"];
+    [preset setObject:@"Normal" forKey:@"PresetName"];
        /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
        /*Set whether or not this is default, at creation set to 0*/
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"Default"];
        /*Get the whether or not to apply pic settings in the AddPresetPanel*/
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
        /* Get the New Preset Description from the field in the AddPresetPanel */
-    [preset setObject:@"HandBrake's high resolution settings for the iPod. Good video quality, great for viewing on a TV using your iPod" forKey:@"PresetDescription"];
+    [preset setObject:@"HandBrake's normal, default settings." forKey:@"PresetDescription"];
        /* File Format */
     [preset setObject:@"MP4 file" forKey:@"FileFormat"];
        /* Chapter Markers*/
@@ -3644,9 +3341,9 @@ the user is using "Custom" settings by determining the sender*/
     /* Codecs */
        [preset setObject:@"AVC/H.264 Video / AAC Audio" forKey:@"FileCodecs"];
        /* Video encoder */
-       [preset setObject:@"x264 (h.264 iPod)" forKey:@"VideoEncoder"];
+       [preset setObject:@"x264 (h.264 Main)" forKey:@"VideoEncoder"];
        /* x264 Option String */
-       [preset setObject:@"keyint=300:keyint-min=30:bframes=0:cabac=0:ref=1:vbv-maxrate=1500:vbv-bufsize=2000:analyse=all:me=umh:subme=6:no-fast-pskip=1" forKey:@"x264Option"];
+       [preset setObject:@"ref=2:bframes=2:subme=5:me=umh" forKey:@"x264Option"];
        /* Video quality */
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
        [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
@@ -3658,18 +3355,20 @@ the user is using "Custom" settings by determining the sender*/
        /* GrayScale */
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
        /* 2 Pass Encoding */
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTwoPass"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTwoPass"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTurboTwoPass"];
        
        /*Picture Settings*/
        //hb_job_t * job = fTitle->job;
        /* Basic Picture Settings */
        /* Use Max Picture settings for whatever the dvd is.*/
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"UsesMaxPictureSettings"];
-       [preset setObject:[NSNumber numberWithInt:640] forKey:@"PictureWidth"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesMaxPictureSettings"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureWidth"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureKeepRatio"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureKeepRatio"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PicturePAR"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PicturePAR"];
        /* Set crop settings here */
        /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
@@ -3691,33 +3390,33 @@ the user is using "Custom" settings by determining the sender*/
 
 }
 
-- (NSDictionary *)CreateAppleTVPreset
+- (NSDictionary *)createClassicPreset
 {
     NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
        /* Get the New Preset Name from the field in the AddPresetPanel */
-    [preset setObject:@"HB-AppleTV" forKey:@"PresetName"];
-       /*Set whether or not this is a user preset where 0 is factory, 1 is user*/
+    [preset setObject:@"Classic" forKey:@"PresetName"];
+       /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
        /*Set whether or not this is default, at creation set to 0*/
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
        /*Get the whether or not to apply pic settings in the AddPresetPanel*/
-       [preset setObject:[NSNumber numberWithInt:2] forKey:@"UsesPictureSettings"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
        /* Get the New Preset Description from the field in the AddPresetPanel */
-    [preset setObject:@"HandBrake's settings for the AppleTV. Provides a good balance between quality and file size, and optimizes performance." forKey:@"PresetDescription"];
+    [preset setObject:@"HandBrake's traditional, faster, lower-quality settings." forKey:@"PresetDescription"];
        /* File Format */
     [preset setObject:@"MP4 file" forKey:@"FileFormat"];
        /* Chapter Markers*/
-        [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
-       /* Codecs */
-       [preset setObject:@"AVC/H.264 Video / AAC Audio" forKey:@"FileCodecs"];
+        [preset setObject:[NSNumber numberWithInt:0] forKey:@"ChapterMarkers"];
+    /* Codecs */
+       [preset setObject:@"MPEG-4 Video / AAC Audio" forKey:@"FileCodecs"];
        /* Video encoder */
-       [preset setObject:@"x264 (h.264 Main)" forKey:@"VideoEncoder"];
-       /* x264 Option String (We can use this to tweak the appleTV output)*/
-       [preset setObject:@"bframes=3:ref=1:subme=5:me=umh:no-fast-pskip=1:trellis=2" forKey:@"x264Option"];
+       [preset setObject:@"FFmpeg" forKey:@"VideoEncoder"];
+       /* x264 Option String */
+       [preset setObject:@"" forKey:@"x264Option"];
        /* Video quality */
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
        [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
-       [preset setObject:@"2500" forKey:@"VideoAvgBitrate"];
+       [preset setObject:@"1000" forKey:@"VideoAvgBitrate"];
        [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
        
        /* Video framerate */
@@ -3728,20 +3427,16 @@ the user is using "Custom" settings by determining the sender*/
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTwoPass"];
        
        /*Picture Settings*/
-       /* For AppleTV we only want to retain UsesMaxPictureSettings
-       which depend on the source dvd picture settings, so we don't
-       record the current dvd's picture info since it will vary from
-       source to source*/
        //hb_job_t * job = fTitle->job;
-       //hb_job_t * job = title->job;
        /* Basic Picture Settings */
        /* Use Max Picture settings for whatever the dvd is.*/
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesMaxPictureSettings"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureWidth"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureKeepRatio"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureKeepRatio"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PicturePAR"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PicturePAR"];
        /* Set crop settings here */
        /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
@@ -3763,33 +3458,33 @@ the user is using "Custom" settings by determining the sender*/
 
 }
 
-- (NSDictionary *)CreatePSThreePreset
+- (NSDictionary *)createFilmPreset
 {
     NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
        /* Get the New Preset Name from the field in the AddPresetPanel */
-    [preset setObject:@"HB-PS3" forKey:@"PresetName"];
-       /*Set whether or not this is a user preset where 0 is factory, 1 is user*/
+    [preset setObject:@"Film" forKey:@"PresetName"];
+       /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
        /*Set whether or not this is default, at creation set to 0*/
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
        /*Get the whether or not to apply pic settings in the AddPresetPanel*/
-       [preset setObject:[NSNumber numberWithInt:2] forKey:@"UsesPictureSettings"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
        /* Get the New Preset Description from the field in the AddPresetPanel */
-    [preset setObject:@"HandBrake's settings for the Sony PlayStation 3." forKey:@"PresetDescription"];
+    [preset setObject:@"HandBrake's preset for feature films." forKey:@"PresetDescription"];
        /* File Format */
-    [preset setObject:@"MP4 file" forKey:@"FileFormat"];
+    [preset setObject:@"MKV file" forKey:@"FileFormat"];
        /* Chapter Markers*/
         [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
-       /* Codecs */
-       [preset setObject:@"AVC/H.264 Video / AAC Audio" forKey:@"FileCodecs"];
+    /* Codecs */
+       [preset setObject:@"AVC/H.264 Video / AC-3 Audio" forKey:@"FileCodecs"];
        /* Video encoder */
        [preset setObject:@"x264 (h.264 Main)" forKey:@"VideoEncoder"];
-       /* x264 Option String (We can use this to tweak the appleTV output)*/
-       [preset setObject:@"level=41:subme=5:me=umh" forKey:@"x264Option"];
+       /* x264 Option String */
+       [preset setObject:@"ref=3:mixed-refs:bframes=3:bime:weightb:b-rdo:direct=auto:b-pyramid:me=umh:subme=6:analyse=all:8x8dct:trellis=1:no-fast-pskip" forKey:@"x264Option"];
        /* Video quality */
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
        [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
-       [preset setObject:@"2500" forKey:@"VideoAvgBitrate"];
+       [preset setObject:@"2000" forKey:@"VideoAvgBitrate"];
        [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
        
        /* Video framerate */
@@ -3797,15 +3492,15 @@ the user is using "Custom" settings by determining the sender*/
        /* GrayScale */
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
        /* 2 Pass Encoding */
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTwoPass"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTwoPass"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTurboTwoPass"];
        
        /*Picture Settings*/
-       /* For PS3 we only want to retain UsesMaxPictureSettings
-       which depend on the source dvd picture settings, so we don't
-       record the current dvd's picture info since it will vary from
-       source to source*/
+       //hb_job_t * job = fTitle->job;
+       /* Basic Picture Settings */
        /* Use Max Picture settings for whatever the dvd is.*/
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesMaxPictureSettings"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureWidth"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureKeepRatio"];
@@ -3831,33 +3526,34 @@ the user is using "Custom" settings by determining the sender*/
     return preset;
 
 }
-- (NSDictionary *)CreatePSPPreset
+
+- (NSDictionary *)createTelevisionPreset
 {
     NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
        /* Get the New Preset Name from the field in the AddPresetPanel */
-    [preset setObject:@"HB-PSP" forKey:@"PresetName"];
-       /*Set whether or not this is a user preset where 0 is factory, 1 is user*/
+    [preset setObject:@"Television" forKey:@"PresetName"];
+       /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
        /*Set whether or not this is default, at creation set to 0*/
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
        /*Get the whether or not to apply pic settings in the AddPresetPanel*/
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
        /* Get the New Preset Description from the field in the AddPresetPanel */
-    [preset setObject:@"HandBrake's settings for the Sony PlayStation Portable." forKey:@"PresetDescription"];
+    [preset setObject:@"HandBrake's settings for video from television." forKey:@"PresetDescription"];
        /* File Format */
-    [preset setObject:@"MP4 file" forKey:@"FileFormat"];
+    [preset setObject:@"MKV file" forKey:@"FileFormat"];
        /* Chapter Markers*/
         [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
-       /* Codecs */
-       [preset setObject:@"MPEG-4 Video / AAC Audio" forKey:@"FileCodecs"];
+    /* Codecs */
+       [preset setObject:@"AVC/H.264 Video / AAC Audio" forKey:@"FileCodecs"];
        /* Video encoder */
-       [preset setObject:@"FFmpeg" forKey:@"VideoEncoder"];
-       /* x264 Option String (We can use this to tweak the appleTV output)*/
-       [preset setObject:@"" forKey:@"x264Option"];
+       [preset setObject:@"x264 (h.264 Main)" forKey:@"VideoEncoder"];
+       /* x264 Option String */
+       [preset setObject:@"ref=3:mixed-refs:bframes=6:bime:weightb:direct=auto:b-pyramid:me=umh:subme=6:analyse=all:8x8dct:trellis=1:nr=150:no-fast-pskip" forKey:@"x264Option"];
        /* Video quality */
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
        [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
-       [preset setObject:@"1024" forKey:@"VideoAvgBitrate"];
+       [preset setObject:@"1300" forKey:@"VideoAvgBitrate"];
        [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
        
        /* Video framerate */
@@ -3865,19 +3561,19 @@ the user is using "Custom" settings by determining the sender*/
        /* GrayScale */
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
        /* 2 Pass Encoding */
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTwoPass"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTwoPass"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTurboTwoPass"];
        
        /*Picture Settings*/
-       /* For PS3 we only want to retain UsesMaxPictureSettings
-       which depend on the source dvd picture settings, so we don't
-       record the current dvd's picture info since it will vary from
-       source to source*/
+       //hb_job_t * job = fTitle->job;
+       /* Basic Picture Settings */
        /* Use Max Picture settings for whatever the dvd is.*/
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"UsesMaxPictureSettings"];
-       [preset setObject:@"368" forKey:@"PictureWidth"];
-       [preset setObject:@"208" forKey:@"PictureHeight"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesMaxPictureSettings"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureWidth"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureKeepRatio"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureDeinterlace"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PicturePAR"];
        /* Set crop settings here */
        /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
@@ -3890,7 +3586,7 @@ the user is using "Custom" settings by determining the sender*/
        /* Audio Sample Rate*/
        [preset setObject:@"48" forKey:@"AudioSampleRate"];
        /* Audio Bitrate Rate*/
-       [preset setObject:@"128" forKey:@"AudioBitRate"];
+       [preset setObject:@"160" forKey:@"AudioBitRate"];
        /* Subtitles*/
        [preset setObject:@"None" forKey:@"Subtitles"];
        
@@ -3900,11 +3596,11 @@ the user is using "Custom" settings by determining the sender*/
 
 }
 
-- (NSDictionary *)CreateNormalPreset
+- (NSDictionary *)createAnimationPreset
 {
     NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
        /* Get the New Preset Name from the field in the AddPresetPanel */
-    [preset setObject:@"HB-Normal" forKey:@"PresetName"];
+    [preset setObject:@"Animation" forKey:@"PresetName"];
        /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
        /*Set whether or not this is default, at creation set to 0*/
@@ -3912,9 +3608,9 @@ the user is using "Custom" settings by determining the sender*/
        /*Get the whether or not to apply pic settings in the AddPresetPanel*/
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
        /* Get the New Preset Description from the field in the AddPresetPanel */
-    [preset setObject:@"HandBrake's normal, default settings." forKey:@"PresetDescription"];
+    [preset setObject:@"HandBrake's settings for cartoons, anime, and CGI." forKey:@"PresetDescription"];
        /* File Format */
-    [preset setObject:@"MP4 file" forKey:@"FileFormat"];
+    [preset setObject:@"MKV file" forKey:@"FileFormat"];
        /* Chapter Markers*/
         [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
     /* Codecs */
@@ -3922,11 +3618,11 @@ the user is using "Custom" settings by determining the sender*/
        /* Video encoder */
        [preset setObject:@"x264 (h.264 Main)" forKey:@"VideoEncoder"];
        /* x264 Option String */
-       [preset setObject:@"ref=2:mixed-refs:bframes=3:weightb:bime:direct=auto:subme=5:me=umh:trellis=1" forKey:@"x264Option"];
+       [preset setObject:@"ref=5:mixed-refs:bframes=6:bime:weightb:b-rdo:direct=auto:b-pyramid:me=umh:subme=5:analyse=all:8x8dct:trellis=1:nr=150:no-fast-pskip:filter=2,2" forKey:@"x264Option"];
        /* Video quality */
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
        [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
-       [preset setObject:@"1500" forKey:@"VideoAvgBitrate"];
+       [preset setObject:@"1000" forKey:@"VideoAvgBitrate"];
        [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
        
        /* Video framerate */
@@ -3935,6 +3631,7 @@ the user is using "Custom" settings by determining the sender*/
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
        /* 2 Pass Encoding */
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTwoPass"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTurboTwoPass"];
        
        /*Picture Settings*/
        //hb_job_t * job = fTitle->job;
@@ -3945,7 +3642,7 @@ the user is using "Custom" settings by determining the sender*/
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureWidth"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureKeepRatio"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureDeinterlace"];
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"PicturePAR"];
        /* Set crop settings here */
        /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
@@ -3968,11 +3665,11 @@ the user is using "Custom" settings by determining the sender*/
 
 }
 
-- (NSDictionary *)CreateClassicPreset
+- (NSDictionary *)createQuickTimePreset
 {
     NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
        /* Get the New Preset Name from the field in the AddPresetPanel */
-    [preset setObject:@"HB-Classic" forKey:@"PresetName"];
+    [preset setObject:@"QuickTime" forKey:@"PresetName"];
        /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
        /*Set whether or not this is default, at creation set to 0*/
@@ -3980,21 +3677,21 @@ the user is using "Custom" settings by determining the sender*/
        /*Get the whether or not to apply pic settings in the AddPresetPanel*/
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
        /* Get the New Preset Description from the field in the AddPresetPanel */
-    [preset setObject:@"HandBrake's traditional, faster, lower-quality settings." forKey:@"PresetDescription"];
+    [preset setObject:@"HandBrake's high quality settings for use with QuickTime. It can be slow, so use it when the Normal preset doesn't look good enough." forKey:@"PresetDescription"];
        /* File Format */
     [preset setObject:@"MP4 file" forKey:@"FileFormat"];
        /* Chapter Markers*/
-        [preset setObject:[NSNumber numberWithInt:0] forKey:@"ChapterMarkers"];
+        [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
     /* Codecs */
-       [preset setObject:@"MPEG-4 Video / AAC Audio" forKey:@"FileCodecs"];
+       [preset setObject:@"AVC/H.264 Video / AAC Audio" forKey:@"FileCodecs"];
        /* Video encoder */
-       [preset setObject:@"FFmpeg" forKey:@"VideoEncoder"];
+       [preset setObject:@"x264 (h.264 Main)" forKey:@"VideoEncoder"];
        /* x264 Option String */
-       [preset setObject:@"" forKey:@"x264Option"];
+       [preset setObject:@"ref=3:mixed-refs:bframes=3:bime:weightb:b-rdo:direct=auto:me=umh:subme=5:analyse=all:8x8dct:trellis=1:no-fast-pskip" forKey:@"x264Option"];
        /* Video quality */
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
        [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
-       [preset setObject:@"1000" forKey:@"VideoAvgBitrate"];
+       [preset setObject:@"2000" forKey:@"VideoAvgBitrate"];
        [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
        
        /* Video framerate */
@@ -4002,7 +3699,8 @@ the user is using "Custom" settings by determining the sender*/
        /* GrayScale */
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
        /* 2 Pass Encoding */
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTwoPass"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTwoPass"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTurboTwoPass"];
        
        /*Picture Settings*/
        //hb_job_t * job = fTitle->job;
@@ -4012,9 +3710,9 @@ the user is using "Custom" settings by determining the sender*/
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureWidth"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureKeepRatio"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureKeepRatio"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PicturePAR"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PicturePAR"];
        /* Set crop settings here */
        /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
@@ -4036,11 +3734,11 @@ the user is using "Custom" settings by determining the sender*/
 
 }
 
-- (NSDictionary *)CreateFilmPreset
+- (NSDictionary *)createBedlamPreset
 {
     NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
        /* Get the New Preset Name from the field in the AddPresetPanel */
-    [preset setObject:@"HB-Film" forKey:@"PresetName"];
+    [preset setObject:@"Bedlam" forKey:@"PresetName"];
        /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
        /*Set whether or not this is default, at creation set to 0*/
@@ -4048,7 +3746,7 @@ the user is using "Custom" settings by determining the sender*/
        /*Get the whether or not to apply pic settings in the AddPresetPanel*/
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
        /* Get the New Preset Description from the field in the AddPresetPanel */
-    [preset setObject:@"HandBrake's preset for feature films." forKey:@"PresetDescription"];
+    [preset setObject:@"HandBrake's settings maxed out for slowest encoding and highest quality. Use at your own risk. So slow it's not just insane...it's a trip to the looney bin." forKey:@"PresetDescription"];
        /* File Format */
     [preset setObject:@"MKV file" forKey:@"FileFormat"];
        /* Chapter Markers*/
@@ -4058,11 +3756,11 @@ the user is using "Custom" settings by determining the sender*/
        /* Video encoder */
        [preset setObject:@"x264 (h.264 Main)" forKey:@"VideoEncoder"];
        /* x264 Option String */
-       [preset setObject:@"ref=6:mixed-refs:bframes=3:bime:weightb:b-rdo:direct=auto:b-pyramid:me=umh:subme=7:me-range=24:analyse=all:8x8dct:trellis=2:no-fast-pskip" forKey:@"x264Option"];
+       [preset setObject:@"ref=16:mixed-refs:bframes=6:bime:weightb:b-rdo:direct=auto:b-pyramid:me=umh:subme=7:me-range=64:analyse=all:8x8dct:trellis=2:no-fast-pskip:no-dct-decimate:filter=-2,-1" forKey:@"x264Option"];
        /* Video quality */
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
        [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
-       [preset setObject:@"2000" forKey:@"VideoAvgBitrate"];
+       [preset setObject:@"1800" forKey:@"VideoAvgBitrate"];
        [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
        
        /* Video framerate */
@@ -4071,6 +3769,7 @@ the user is using "Custom" settings by determining the sender*/
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
        /* 2 Pass Encoding */
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTwoPass"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTurboTwoPass"];
        
        /*Picture Settings*/
        //hb_job_t * job = fTitle->job;
@@ -4104,11 +3803,11 @@ the user is using "Custom" settings by determining the sender*/
 
 }
 
-- (NSDictionary *)CreateTelevisionPreset
+- (NSDictionary *)createiPhonePreset
 {
     NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
        /* Get the New Preset Name from the field in the AddPresetPanel */
-    [preset setObject:@"HB-Television" forKey:@"PresetName"];
+    [preset setObject:@"iPhone" forKey:@"PresetName"];
        /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
        /*Set whether or not this is default, at creation set to 0*/
@@ -4116,43 +3815,43 @@ the user is using "Custom" settings by determining the sender*/
        /*Get the whether or not to apply pic settings in the AddPresetPanel*/
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
        /* Get the New Preset Description from the field in the AddPresetPanel */
-    [preset setObject:@"HandBrake's settings for video from television." forKey:@"PresetDescription"];
+    [preset setObject:@"HandBrake's settings for the iPhone." forKey:@"PresetDescription"];
        /* File Format */
-    [preset setObject:@"MKV file" forKey:@"FileFormat"];
+    [preset setObject:@"MP4 file" forKey:@"FileFormat"];
        /* Chapter Markers*/
         [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
     /* Codecs */
        [preset setObject:@"AVC/H.264 Video / AAC Audio" forKey:@"FileCodecs"];
        /* Video encoder */
-       [preset setObject:@"x264 (h.264 Main)" forKey:@"VideoEncoder"];
+       [preset setObject:@"x264 (h.264 iPod)" forKey:@"VideoEncoder"];
        /* x264 Option String */
-       [preset setObject:@"ref=3:mixed-refs:bframes=9:bime:weightb:direct=auto:b-pyramid:me=umh:subme=6:me-range=24:analyse=all:8x8dct:trellis=2:nr=150:no-fast-pskip" forKey:@"x264Option"];
+       [preset setObject:@"cabac=0:ref=1:analyse=all:me=umh:subme=6:no-fast-pskip=1:trellis=1" forKey:@"x264Option"];
        /* Video quality */
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
        [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
-       [preset setObject:@"1300" forKey:@"VideoAvgBitrate"];
+       [preset setObject:@"960" forKey:@"VideoAvgBitrate"];
        [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
        
        /* Video framerate */
-       [preset setObject:@"29.97" forKey:@"VideoFramerate"];
+       [preset setObject:@"Same as source" forKey:@"VideoFramerate"];
        /* GrayScale */
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
        /* 2 Pass Encoding */
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTwoPass"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTwoPass"];
        
        /*Picture Settings*/
        //hb_job_t * job = fTitle->job;
        /* Basic Picture Settings */
        /* Use Max Picture settings for whatever the dvd is.*/
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesMaxPictureSettings"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureWidth"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"UsesMaxPictureSettings"];
+       [preset setObject:[NSNumber numberWithInt:480] forKey:@"PictureWidth"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureKeepRatio"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureDeinterlace"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PicturePAR"];
        /* Set crop settings here */
        /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
     [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureBottomCrop"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureLeftCrop"];
@@ -4162,7 +3861,7 @@ the user is using "Custom" settings by determining the sender*/
        /* Audio Sample Rate*/
        [preset setObject:@"48" forKey:@"AudioSampleRate"];
        /* Audio Bitrate Rate*/
-       [preset setObject:@"160" forKey:@"AudioBitRate"];
+       [preset setObject:@"128" forKey:@"AudioBitRate"];
        /* Subtitles*/
        [preset setObject:@"None" forKey:@"Subtitles"];
        
@@ -4172,11 +3871,11 @@ the user is using "Custom" settings by determining the sender*/
 
 }
 
-- (NSDictionary *)CreateAnimationPreset
+- (NSDictionary *)createDeuxSixQuatrePreset
 {
     NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
        /* Get the New Preset Name from the field in the AddPresetPanel */
-    [preset setObject:@"HB-Animation" forKey:@"PresetName"];
+    [preset setObject:@"Deux Six Quatre" forKey:@"PresetName"];
        /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
        /*Set whether or not this is default, at creation set to 0*/
@@ -4184,29 +3883,30 @@ the user is using "Custom" settings by determining the sender*/
        /*Get the whether or not to apply pic settings in the AddPresetPanel*/
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
        /* Get the New Preset Description from the field in the AddPresetPanel */
-    [preset setObject:@"HandBrake's settings for cartoons, anime, and CGI." forKey:@"PresetDescription"];
+    [preset setObject:@"HandBrake's preset for true high profile x264 quality. A good balance of quality and speed, based on community standards found in the wild. This preset will give you a much better sense of x264's capabilities than vanilla main profile." forKey:@"PresetDescription"];
        /* File Format */
     [preset setObject:@"MKV file" forKey:@"FileFormat"];
        /* Chapter Markers*/
         [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
     /* Codecs */
-       [preset setObject:@"AVC/H.264 Video / AAC Audio" forKey:@"FileCodecs"];
+       [preset setObject:@"AVC/H.264 Video / AC-3 Audio" forKey:@"FileCodecs"];
        /* Video encoder */
        [preset setObject:@"x264 (h.264 Main)" forKey:@"VideoEncoder"];
        /* x264 Option String */
-       [preset setObject:@"ref=9:mixed-refs:bframes=13:bime:weightb:b-rdo:direct=auto:b-pyramid:me=umh:subme=7:me-range=24:analyse=all:8x8dct:trellis=2:nr=150:no-fast-pskip:filter=2,2" forKey:@"x264Option"];
+       [preset setObject:@"ref=5:mixed-refs:bframes=3:bime:weightb:b-rdo:b-pyramid:me=umh:subme=7:trellis=1:analyse=all:8x8dct:no-fast-pskip" forKey:@"x264Option"];
        /* Video quality */
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
        [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
-       [preset setObject:@"1000" forKey:@"VideoAvgBitrate"];
+       [preset setObject:@"1600" forKey:@"VideoAvgBitrate"];
        [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
        
        /* Video framerate */
-       [preset setObject:@"29.97" forKey:@"VideoFramerate"];
+       [preset setObject:@"Same as source" forKey:@"VideoFramerate"];
        /* GrayScale */
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
        /* 2 Pass Encoding */
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTwoPass"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTurboTwoPass"];
        
        /*Picture Settings*/
        //hb_job_t * job = fTitle->job;
@@ -4217,7 +3917,7 @@ the user is using "Custom" settings by determining the sender*/
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureWidth"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureKeepRatio"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureDeinterlace"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"PicturePAR"];
        /* Set crop settings here */
        /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
@@ -4240,11 +3940,11 @@ the user is using "Custom" settings by determining the sender*/
 
 }
 
-- (NSDictionary *)CreateQuickTimePreset
+- (NSDictionary *)createBrokePreset
 {
     NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
        /* Get the New Preset Name from the field in the AddPresetPanel */
-    [preset setObject:@"HB-QuickTime" forKey:@"PresetName"];
+    [preset setObject:@"Broke" forKey:@"PresetName"];
        /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
        /*Set whether or not this is default, at creation set to 0*/
@@ -4252,7 +3952,7 @@ the user is using "Custom" settings by determining the sender*/
        /*Get the whether or not to apply pic settings in the AddPresetPanel*/
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
        /* Get the New Preset Description from the field in the AddPresetPanel */
-    [preset setObject:@"HandBrake's settings for use with QuickTime." forKey:@"PresetDescription"];
+    [preset setObject:@"HandBrake's preset for people without a lot of money to waste on hard drives. Tries to maximize quality for burning to CDs, so you can party like it's 1999." forKey:@"PresetDescription"];
        /* File Format */
     [preset setObject:@"MP4 file" forKey:@"FileFormat"];
        /* Chapter Markers*/
@@ -4262,11 +3962,11 @@ the user is using "Custom" settings by determining the sender*/
        /* Video encoder */
        [preset setObject:@"x264 (h.264 Main)" forKey:@"VideoEncoder"];
        /* x264 Option String */
-       [preset setObject:@"ref=6:mixed-refs:bframes=3:bime:weightb:b-rdo:direct-auto:me=umh:subme=7:me-range=24:analyse=all:8x8dct:trellis=2:no-fast-pskip" forKey:@"x264Option"];
+       [preset setObject:@"ref=3:mixed-refs:bframes=6:bime:weightb:b-rdo:b-pyramid:direct=auto:me=umh:subme=6:trellis=1:analyse=all:8x8dct:no-fast-pskip" forKey:@"x264Option"];
        /* Video quality */
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
-       [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
-       [preset setObject:@"2000" forKey:@"VideoAvgBitrate"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoQualityType"];
+       [preset setObject:@"695" forKey:@"VideoTargetSize"];
+       [preset setObject:@"1600" forKey:@"VideoAvgBitrate"];
        [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
        
        /* Video framerate */
@@ -4275,18 +3975,19 @@ the user is using "Custom" settings by determining the sender*/
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
        /* 2 Pass Encoding */
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTwoPass"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTurboTwoPass"];
        
        /*Picture Settings*/
        //hb_job_t * job = fTitle->job;
        /* Basic Picture Settings */
        /* Use Max Picture settings for whatever the dvd is.*/
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesMaxPictureSettings"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"UsesMaxPictureSettings"];
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureWidth"];
+       [preset setObject:[NSNumber numberWithInt:640] forKey:@"PictureWidth"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureKeepRatio"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureKeepRatio"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PicturePAR"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PicturePAR"];
        /* Set crop settings here */
        /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
@@ -4298,7 +3999,7 @@ the user is using "Custom" settings by determining the sender*/
        /* Audio Sample Rate*/
        [preset setObject:@"48" forKey:@"AudioSampleRate"];
        /* Audio Bitrate Rate*/
-       [preset setObject:@"160" forKey:@"AudioBitRate"];
+       [preset setObject:@"128" forKey:@"AudioBitRate"];
        /* Subtitles*/
        [preset setObject:@"None" forKey:@"Subtitles"];
        
@@ -4308,11 +4009,11 @@ the user is using "Custom" settings by determining the sender*/
 
 }
 
-- (NSDictionary *)CreateBedlamPreset
+- (NSDictionary *)createBlindPreset
 {
     NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
        /* Get the New Preset Name from the field in the AddPresetPanel */
-    [preset setObject:@"HB-Bedlam" forKey:@"PresetName"];
+    [preset setObject:@"Blind" forKey:@"PresetName"];
        /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
        /*Set whether or not this is default, at creation set to 0*/
@@ -4320,21 +4021,21 @@ the user is using "Custom" settings by determining the sender*/
        /*Get the whether or not to apply pic settings in the AddPresetPanel*/
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
        /* Get the New Preset Description from the field in the AddPresetPanel */
-    [preset setObject:@"HandBrake's settings maxed out for slowest encoding and highest quality. Use at your own risk. So slow it's not just insane...it's a trip to the looney bin." forKey:@"PresetDescription"];
+    [preset setObject:@"HandBrake's preset for impatient people who don't care about picture quality." forKey:@"PresetDescription"];
        /* File Format */
-    [preset setObject:@"MKV file" forKey:@"FileFormat"];
+    [preset setObject:@"MP4 file" forKey:@"FileFormat"];
        /* Chapter Markers*/
         [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
     /* Codecs */
-       [preset setObject:@"AVC/H.264 Video / AC-3 Audio" forKey:@"FileCodecs"];
+       [preset setObject:@"MPEG-4 Video / AAC Audio" forKey:@"FileCodecs"];
        /* Video encoder */
-       [preset setObject:@"x264 (h.264 Main)" forKey:@"VideoEncoder"];
+       [preset setObject:@"FFmpeg" forKey:@"VideoEncoder"];
        /* x264 Option String */
-       [preset setObject:@"ref=16:mixed-refs:bframes=13:bime:weightb:b-rdo:direct=auto:b-pyramid:me=umh:subme=7:me-range=64:analyse=all:8x8dct:trellis=2:no-fast-pskip:no-dct-decimate:filter=-2,-1" forKey:@"x264Option"];
+       [preset setObject:@"" forKey:@"x264Option"];
        /* Video quality */
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
        [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
-       [preset setObject:@"1800" forKey:@"VideoAvgBitrate"];
+       [preset setObject:@"512" forKey:@"VideoAvgBitrate"];
        [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
        
        /* Video framerate */
@@ -4342,19 +4043,20 @@ the user is using "Custom" settings by determining the sender*/
        /* GrayScale */
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
        /* 2 Pass Encoding */
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoTwoPass"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTwoPass"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTurboTwoPass"];
        
        /*Picture Settings*/
        //hb_job_t * job = fTitle->job;
        /* Basic Picture Settings */
        /* Use Max Picture settings for whatever the dvd is.*/
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesMaxPictureSettings"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"UsesMaxPictureSettings"];
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureWidth"];
+       [preset setObject:[NSNumber numberWithInt:512] forKey:@"PictureWidth"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureKeepRatio"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureKeepRatio"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PicturePAR"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PicturePAR"];
        /* Set crop settings here */
        /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
@@ -4366,7 +4068,7 @@ the user is using "Custom" settings by determining the sender*/
        /* Audio Sample Rate*/
        [preset setObject:@"48" forKey:@"AudioSampleRate"];
        /* Audio Bitrate Rate*/
-       [preset setObject:@"160" forKey:@"AudioBitRate"];
+       [preset setObject:@"128" forKey:@"AudioBitRate"];
        /* Subtitles*/
        [preset setObject:@"None" forKey:@"Subtitles"];
        
@@ -4376,11 +4078,11 @@ the user is using "Custom" settings by determining the sender*/
 
 }
 
-- (NSDictionary *)CreateiPhonePreset
+- (NSDictionary *)createCRFPreset
 {
     NSMutableDictionary *preset = [[NSMutableDictionary alloc] init];
        /* Get the New Preset Name from the field in the AddPresetPanel */
-    [preset setObject:@"HB-iPhone" forKey:@"PresetName"];
+    [preset setObject:@"Constant Quality Rate" forKey:@"PresetName"];
        /*Set whether or not this is a user preset or factory 0 is factory, 1 is user*/
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"Type"];
        /*Set whether or not this is default, at creation set to 0*/
@@ -4388,22 +4090,22 @@ the user is using "Custom" settings by determining the sender*/
        /*Get the whether or not to apply pic settings in the AddPresetPanel*/
        [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesPictureSettings"];
        /* Get the New Preset Description from the field in the AddPresetPanel */
-    [preset setObject:@"HandBrake's settings for the iPhone." forKey:@"PresetDescription"];
+    [preset setObject:@"HandBrake's preset for consistently excellent quality in one pass, with the downside of entirely unpredictable file sizes and bitrates." forKey:@"PresetDescription"];
        /* File Format */
-    [preset setObject:@"MP4 file" forKey:@"FileFormat"];
+    [preset setObject:@"MKV file" forKey:@"FileFormat"];
        /* Chapter Markers*/
         [preset setObject:[NSNumber numberWithInt:1] forKey:@"ChapterMarkers"];
     /* Codecs */
-       [preset setObject:@"AVC/H.264 Video / AAC Audio" forKey:@"FileCodecs"];
+       [preset setObject:@"AVC/H.264 Video / AC-3 Audio" forKey:@"FileCodecs"];
        /* Video encoder */
-       [preset setObject:@"x264 (h.264 iPod)" forKey:@"VideoEncoder"];
+       [preset setObject:@"x264 (h.264 Main)" forKey:@"VideoEncoder"];
        /* x264 Option String */
-       [preset setObject:@"cabac=0:ref=1:analyse=all:me=umh:subme=6:no-fast-pskip=1:trellis=2" forKey:@"x264Option"];
+       [preset setObject:@"ref=3:mixed-refs:bframes=3:b-pyramid:b-rdo:bime:weightb:filter=-2,-1:subme=6:trellis=1:analyse=all:8x8dct:me=umh" forKey:@"x264Option"];
        /* Video quality */
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"VideoQualityType"];
+       [preset setObject:[NSNumber numberWithInt:2] forKey:@"VideoQualityType"];
        [preset setObject:[fVidTargetSizeField stringValue] forKey:@"VideoTargetSize"];
-       [preset setObject:@"960" forKey:@"VideoAvgBitrate"];
-       [preset setObject:[NSNumber numberWithFloat:[fVidQualitySlider floatValue]] forKey:@"VideoQualitySlider"];
+       [preset setObject:@"2000" forKey:@"VideoAvgBitrate"];
+       [preset setObject:[NSNumber numberWithFloat:0.6471] forKey:@"VideoQualitySlider"];
        
        /* Video framerate */
        [preset setObject:@"Same as source" forKey:@"VideoFramerate"];
@@ -4411,17 +4113,19 @@ the user is using "Custom" settings by determining the sender*/
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoGrayScale"];
        /* 2 Pass Encoding */
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTwoPass"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"VideoTurboTwoPass"];
        
        /*Picture Settings*/
        //hb_job_t * job = fTitle->job;
        /* Basic Picture Settings */
        /* Use Max Picture settings for whatever the dvd is.*/
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"UsesMaxPictureSettings"];
-       [preset setObject:[NSNumber numberWithInt:480] forKey:@"PictureWidth"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"UsesMaxPictureSettings"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureAutoCrop"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureWidth"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureHeight"];
-       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PictureKeepRatio"];
+       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureKeepRatio"];
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureDeinterlace"];
-       [preset setObject:[NSNumber numberWithInt:0] forKey:@"PicturePAR"];
+       [preset setObject:[NSNumber numberWithInt:1] forKey:@"PicturePAR"];
        /* Set crop settings here */
        /* The Auto Crop Matrix in the Picture Window autodetects differences in crop settings */
        [preset setObject:[NSNumber numberWithInt:0] forKey:@"PictureTopCrop"];
@@ -4443,7 +4147,8 @@ the user is using "Custom" settings by determining the sender*/
 
 }
 
-- (IBAction)DeletePreset:(id)sender
+
+- (IBAction)deletePreset:(id)sender
 {
     int status;
     NSEnumerator *enumerator;
@@ -4473,6 +4178,71 @@ the user is using "Custom" settings by determining the sender*/
         [self savePreset];   
     }
 }
+
+- (IBAction)getDefaultPresets:(id)sender
+{
+       int i = 0;
+    NSEnumerator *enumerator = [UserPresets objectEnumerator];
+       id tempObject;
+       while (tempObject = [enumerator nextObject])
+       {
+               NSDictionary *thisPresetDict = tempObject;
+               if ([[thisPresetDict objectForKey:@"Default"] intValue] == 1) // 1 is HB default
+               {
+                       presetHbDefault = i;    
+               }
+               if ([[thisPresetDict objectForKey:@"Default"] intValue] == 2) // 2 is User specified default
+               {
+                       presetUserDefault = i;  
+               }
+               i++;
+       }
+}
+
+- (IBAction)setDefaultPreset:(id)sender
+{
+    int i = 0;
+    NSEnumerator *enumerator = [UserPresets objectEnumerator];
+       id tempObject;
+       /* First make sure the old user specified default preset is removed */
+       while (tempObject = [enumerator nextObject])
+       {
+               /* make sure we are not removing the default HB preset */
+               if ([[[UserPresets objectAtIndex:i] objectForKey:@"Default"] intValue] != 1) // 1 is HB default
+               {
+                       [[UserPresets objectAtIndex:i] setObject:[NSNumber numberWithInt:0] forKey:@"Default"];
+               }
+               i++;
+       }
+       /* Second, go ahead and set the appropriate user specfied preset */
+       /* we get the chosen preset from the UserPresets array */
+       if ([[[UserPresets objectAtIndex:[tableView selectedRow]] objectForKey:@"Default"] intValue] != 1) // 1 is HB default
+       {
+               [[UserPresets objectAtIndex:[tableView selectedRow]] setObject:[NSNumber numberWithInt:2] forKey:@"Default"];
+       }
+       presetUserDefault = [tableView selectedRow];
+       
+       /* We save all of the preset data here */
+    [self savePreset];
+       /* We Reload the New Table data for presets */
+    [tableView reloadData];
+}
+
+- (IBAction)selectDefaultPreset:(id)sender
+{
+       /* if there is a user specified default, we use it */
+       if (presetUserDefault)
+       {
+       [tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:presetUserDefault] byExtendingSelection:NO];
+       [self tableViewSelected:NULL];
+       }
+       else if (presetHbDefault) //else we use the built in default presetHbDefault
+       {
+       [tableView selectRowIndexes:[NSIndexSet indexSetWithIndex:presetHbDefault] byExtendingSelection:NO];
+       [self tableViewSelected:NULL];
+       }
+}
+
 - (IBAction)tableViewSelected:(id)sender
 {
     /* Since we cannot disable the presets tableView in terms of clickability
@@ -4480,120 +4250,151 @@ the user is using "Custom" settings by determining the sender*/
           or not clicking on a preset will do anything */
        if ([fPresetsAdd isEnabled])
        {
-               
-               /* we get the chosen preset from the UserPresets array */
-               chosenPreset = [UserPresets objectAtIndex:[sender selectedRow]];
-               curUserPresetChosenNum = [sender selectedRow];
-               /* we set the preset display field in main window here */
-               [fPresetSelectedDisplay setStringValue: [NSString stringWithFormat: @"%@",[chosenPreset valueForKey:@"PresetName"]]];
-               /* File Format */
-               [fDstFormatPopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"FileFormat"]]];
-               [self FormatPopUpChanged: NULL];
-               
-               /* Chapter Markers*/
-               [fCreateChapterMarkers setState:[[chosenPreset objectForKey:@"ChapterMarkers"] intValue]];
-               /* Allow Mpeg4 64 bit formatting +4GB file sizes */
-               [fDstMpgLargeFileCheck setState:[[chosenPreset objectForKey:@"Mp4LargeFile"] intValue]];
-               /* Codecs */
-               [fDstCodecsPopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"FileCodecs"]]];
-               [self CodecsPopUpChanged: NULL];
-               /* Video encoder */
-               [fVidEncoderPopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"VideoEncoder"]]];
-               
-               /* We can show the preset options here in the gui if we want to
-                       so we check to see it the user has specified it in the prefs */
-               [fDisplayX264Options setStringValue: [NSString stringWithFormat:[chosenPreset valueForKey:@"x264Option"]]];
-
-               [self X264AdvancedOptionsSet:NULL];
-               
-               /* Lets run through the following functions to get variables set there */
-               [self EncoderPopUpChanged: NULL];
-               
-               [self CalculateBitrate: NULL];
-               
-               /* Video quality */
-               [fVidQualityMatrix selectCellAtRow:[[chosenPreset objectForKey:@"VideoQualityType"] intValue] column:0];
-               
-               [fVidTargetSizeField setStringValue: [NSString stringWithFormat:[chosenPreset valueForKey:@"VideoTargetSize"]]];
-               [fVidBitrateField setStringValue: [NSString stringWithFormat:[chosenPreset valueForKey:@"VideoAvgBitrate"]]];
-               
-               [fVidQualitySlider setFloatValue: [[chosenPreset valueForKey:@"VideoQualitySlider"] floatValue]];
-               [self VideoMatrixChanged: NULL];
-               
-               /* Video framerate */
-               [fVidRatePopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"VideoFramerate"]]];
-
-               /* GrayScale */
-               [fVidGrayscaleCheck setState:[[chosenPreset objectForKey:@"VideoGrayScale"] intValue]];
-               
-               /* 2 Pass Encoding */
-               [fVidTwoPassCheck setState:[[chosenPreset objectForKey:@"VideoTwoPass"] intValue]];
-               [self TwoPassCheckboxChanged: NULL];
-               /* Turbo 1st pass for 2 Pass Encoding */
-               [fVidTurboPassCheck setState:[[chosenPreset objectForKey:@"VideoTurboTwoPass"] intValue]];
-               
-               /*Audio*/
-               
-               /* Audio Sample Rate*/
-               [fAudRatePopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"AudioSampleRate"]]];
-               /* Audio Bitrate Rate*/
-               [fAudBitratePopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"AudioBitRate"]]];
-               /*Subtitles*/
-               [fSubPopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"Subtitles"]]];
-               
-               /* Picture Settings */
-               /* Look to see if we apply these here in objectForKey:@"UsesPictureSettings"] */
-               if ([[chosenPreset objectForKey:@"UsesPictureSettings"]  intValue] > 0)
-               {
-                       hb_job_t * job = fTitle->job;
-                       /* Check to see if we should use the max picture setting for the current title*/
-                       if ([[chosenPreset objectForKey:@"UsesPictureSettings"]  intValue] == 2 || [[chosenPreset objectForKey:@"UsesMaxPictureSettings"]  intValue] == 1)
+               if ([tableView selectedRow] >= 0)
+               {       
+                       /* we get the chosen preset from the UserPresets array */
+                       chosenPreset = [UserPresets objectAtIndex:[tableView selectedRow]];
+                       curUserPresetChosenNum = [sender selectedRow];
+                       /* we set the preset display field in main window here */
+                       [fPresetSelectedDisplay setStringValue: [NSString stringWithFormat: @"%@",[chosenPreset valueForKey:@"PresetName"]]];
+                       if ([[chosenPreset objectForKey:@"Default"] intValue] == 1)
                        {
-                               /* Use Max Picture settings for whatever the dvd is.*/
-                               [self RevertPictureSizeToMax: NULL];
-                               job->keep_ratio = [[chosenPreset objectForKey:@"PictureKeepRatio"]  intValue];
-                               if (job->keep_ratio == 1)
-                               {
-                                       hb_fix_aspect( job, HB_KEEP_WIDTH );
-                               }
-                               job->pixel_ratio = [[chosenPreset objectForKey:@"PicturePAR"]  intValue];
+                               [fPresetSelectedDisplay setStringValue: [NSString stringWithFormat: @"%@ (Default)",[chosenPreset valueForKey:@"PresetName"]]];
                        }
                        else
                        {
-                               job->width = [[chosenPreset objectForKey:@"PictureWidth"]  intValue];
-                               job->height = [[chosenPreset objectForKey:@"PictureHeight"]  intValue];
-                               job->keep_ratio = [[chosenPreset objectForKey:@"PictureKeepRatio"]  intValue];
-                               if (job->keep_ratio == 1)
-                               {
-                                       hb_fix_aspect( job, HB_KEEP_WIDTH );
-                               }
-                               job->pixel_ratio = [[chosenPreset objectForKey:@"PicturePAR"]  intValue];
-                               /* AutoCrop is in preset, then use the autocrop settings for each dvd */
-                               if ([[chosenPreset objectForKey:@"PictureAutoCrop"]  intValue] == 1)
+                               [fPresetSelectedDisplay setStringValue: [NSString stringWithFormat: @"%@",[chosenPreset valueForKey:@"PresetName"]]];
+                       }
+                       /* File Format */
+                       [fDstFormatPopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"FileFormat"]]];
+                       [self formatPopUpChanged: NULL];
+                       
+                       /* Chapter Markers*/
+                       [fCreateChapterMarkers setState:[[chosenPreset objectForKey:@"ChapterMarkers"] intValue]];
+                       /* Allow Mpeg4 64 bit formatting +4GB file sizes */
+                       [fDstMpgLargeFileCheck setState:[[chosenPreset objectForKey:@"Mp4LargeFile"] intValue]];
+                       /* Codecs */
+                       [fDstCodecsPopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"FileCodecs"]]];
+                       [self codecsPopUpChanged: NULL];
+                       /* Video encoder */
+                       [fVidEncoderPopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"VideoEncoder"]]];
+                       
+                       /* We can show the preset options here in the gui if we want to
+                               so we check to see it the user has specified it in the prefs */
+                       [fAdvancedOptions setOptions: [NSString stringWithFormat:[chosenPreset valueForKey:@"x264Option"]]];
+                       
+                       /* Lets run through the following functions to get variables set there */
+                       [self encoderPopUpChanged: NULL];
+                       
+                       [self calculateBitrate: NULL];
+                       
+                       /* Video quality */
+                       [fVidQualityMatrix selectCellAtRow:[[chosenPreset objectForKey:@"VideoQualityType"] intValue] column:0];
+                       
+                       [fVidTargetSizeField setStringValue: [NSString stringWithFormat:[chosenPreset valueForKey:@"VideoTargetSize"]]];
+                       [fVidBitrateField setStringValue: [NSString stringWithFormat:[chosenPreset valueForKey:@"VideoAvgBitrate"]]];
+                       
+                       [fVidQualitySlider setFloatValue: [[chosenPreset valueForKey:@"VideoQualitySlider"] floatValue]];
+                       [self videoMatrixChanged: NULL];
+                       
+                       /* Video framerate */
+                       [fVidRatePopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"VideoFramerate"]]];
+                       
+                       /* GrayScale */
+                       [fVidGrayscaleCheck setState:[[chosenPreset objectForKey:@"VideoGrayScale"] intValue]];
+                       
+                       /* 2 Pass Encoding */
+                       [fVidTwoPassCheck setState:[[chosenPreset objectForKey:@"VideoTwoPass"] intValue]];
+                       [self twoPassCheckboxChanged: NULL];
+                       /* Turbo 1st pass for 2 Pass Encoding */
+                       [fVidTurboPassCheck setState:[[chosenPreset objectForKey:@"VideoTurboTwoPass"] intValue]];
+                       
+                       /*Audio*/
+                       
+                       /* Audio Sample Rate*/
+                       [fAudRatePopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"AudioSampleRate"]]];
+                       /* Audio Bitrate Rate*/
+                       [fAudBitratePopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"AudioBitRate"]]];
+                       /*Subtitles*/
+                       [fSubPopUp selectItemWithTitle: [NSString stringWithFormat:[chosenPreset valueForKey:@"Subtitles"]]];
+                       
+                       /* Picture Settings */
+                       /* Look to see if we apply these here in objectForKey:@"UsesPictureSettings"] */
+                       if ([[chosenPreset objectForKey:@"UsesPictureSettings"]  intValue] > 0)
+                       {
+                               hb_job_t * job = fTitle->job;
+                               /* Check to see if we should use the max picture setting for the current title*/
+                               if ([[chosenPreset objectForKey:@"UsesPictureSettings"]  intValue] == 2 || [[chosenPreset objectForKey:@"UsesMaxPictureSettings"]  intValue] == 1)
                                {
-                               [fPicSettingAutoCrop setStringValue: [NSString stringWithFormat:
-                               @"%d", 1]];
-                               job->crop[0] = [[chosenPreset objectForKey:@"PictureTopCrop"]  intValue];
-                               job->crop[1] = [[chosenPreset objectForKey:@"PictureBottomCrop"]  intValue];
-                               job->crop[2] = [[chosenPreset objectForKey:@"PictureLeftCrop"]  intValue];
-                               job->crop[3] = [[chosenPreset objectForKey:@"PictureRightCrop"]  intValue];
+                                       /* Use Max Picture settings for whatever the dvd is.*/
+                                       [self revertPictureSizeToMax: NULL];
+                                       job->keep_ratio = [[chosenPreset objectForKey:@"PictureKeepRatio"]  intValue];
+                                       if (job->keep_ratio == 1)
+                                       {
+                                               hb_fix_aspect( job, HB_KEEP_WIDTH );
+                                               if( job->height > fTitle->height )
+                                               {
+                                                       job->height = fTitle->height;
+                                                       hb_fix_aspect( job, HB_KEEP_HEIGHT );
+                                               }
+                                       }
+                                       job->pixel_ratio = [[chosenPreset objectForKey:@"PicturePAR"]  intValue];
                                }
-                               else /* if custom crop has been saved in preset, use the saved custom cropping regardless of the source */
+                               else // Apply picture settings that were in effect at the time the preset was saved
                                {
-                               [fPicSettingAutoCrop setStringValue: [NSString stringWithFormat:
-                               @"%d", 0]];
-                               job->crop[0] = [[chosenPreset objectForKey:@"PictureTopCrop"]  intValue];
-                               job->crop[1] = [[chosenPreset objectForKey:@"PictureBottomCrop"]  intValue];
-                               job->crop[2] = [[chosenPreset objectForKey:@"PictureLeftCrop"]  intValue];
-                               job->crop[3] = [[chosenPreset objectForKey:@"PictureRightCrop"]  intValue];
+                                       job->width = [[chosenPreset objectForKey:@"PictureWidth"]  intValue];
+                                       job->height = [[chosenPreset objectForKey:@"PictureHeight"]  intValue];
+                                       job->keep_ratio = [[chosenPreset objectForKey:@"PictureKeepRatio"]  intValue];
+                                       if (job->keep_ratio == 1)
+                                       {
+                                               hb_fix_aspect( job, HB_KEEP_WIDTH );
+                                               if( job->height > fTitle->height )
+                                               {
+                                                       job->height = fTitle->height;
+                                                       hb_fix_aspect( job, HB_KEEP_HEIGHT );
+                                               }
+                                       }
+                                       job->pixel_ratio = [[chosenPreset objectForKey:@"PicturePAR"]  intValue];
+                    [fPictureController setDeinterlace:[[chosenPreset objectForKey:@"PictureDeinterlace"] intValue]];
+                                       
+                                       if ([chosenPreset objectForKey:@"PictureDetelecine"])
+                                       {
+                        [fPictureController setDetelecine:[[chosenPreset objectForKey:@"PictureDetelecine"] intValue]];
+                                       }
+                                       if ([chosenPreset objectForKey:@"PictureDenoise"])
+                                       {
+                        [fPictureController setDenoise:[[chosenPreset objectForKey:@"PictureDenoise"] intValue]];
+                                       }
+                                       /* If Cropping is set to custom, then recall all four crop values from
+                                               when the preset was created and apply them */
+                                       if ([[chosenPreset objectForKey:@"PictureAutoCrop"]  intValue] == 0)
+                                       {
+                        [fPictureController setAutoCrop:NO];
+                                               
+                                               /* Here we use the custom crop values saved at the time the preset was saved */
+                                               job->crop[0] = [[chosenPreset objectForKey:@"PictureTopCrop"]  intValue];
+                                               job->crop[1] = [[chosenPreset objectForKey:@"PictureBottomCrop"]  intValue];
+                                               job->crop[2] = [[chosenPreset objectForKey:@"PictureLeftCrop"]  intValue];
+                                               job->crop[3] = [[chosenPreset objectForKey:@"PictureRightCrop"]  intValue];
+                                               
+                                       }
+                                       else /* if auto crop has been saved in preset, set to auto and use post scan auto crop */
+                                       {
+                        [fPictureController setAutoCrop:YES];
+                        /* Here we use the auto crop values determined right after scan */
+                                               job->crop[0] = AutoCropTop;
+                                               job->crop[1] = AutoCropBottom;
+                                               job->crop[2] = AutoCropLeft;
+                                               job->crop[3] = AutoCropRight;
+                                               
+                                       }
                                }
+                               [self calculatePictureSizing: NULL]; 
+                       }
+                       
+                       
+                       [[fPresetsActionMenu itemAtIndex:0] setEnabled: YES];
                        }
-                       [self CalculatePictureSizing: NULL]; 
-               }
-               
-
-
-
 }
 }
 
@@ -4612,8 +4413,10 @@ show the built in presets in a blue font. */
  forTableColumn:(NSTableColumn *)aTableColumn row:(int)rowIndex
 {
     NSDictionary *userPresetDict = [UserPresets objectAtIndex:rowIndex];
+       NSFont *txtFont;
        NSColor *fontColor;
        NSColor *shadowColor;
+       txtFont = [NSFont systemFontOfSize: [NSFont smallSystemFontSize]];
        /* First, we check to see if its a selected row, if so, we use white since its highlighted in blue */
        if ([[aTableView selectedRowIndexes] containsIndex:rowIndex] && ([tableView editedRow] != rowIndex))
        {
@@ -4635,7 +4438,19 @@ show the built in presets in a blue font. */
                }
                shadowColor = nil;
        }
+       /* We check to see if this is the HB default, if so, color it appropriately */
+       if (!presetUserDefault && presetHbDefault && rowIndex == presetHbDefault)
+       {
+       txtFont = [NSFont boldSystemFontOfSize: [NSFont smallSystemFontSize]];
+       }
+       /* We check to see if this is the User Specified default, if so, color it appropriately */
+       if (presetUserDefault && rowIndex == presetUserDefault)
+       {
+       txtFont = [NSFont boldSystemFontOfSize: [NSFont smallSystemFontSize]];
+       }
+       
        [aCell setTextColor:fontColor];
+       [aCell setFont:txtFont];
        /* this shadow stuff (like mail app) for some reason looks crappy, commented out
        temporarily in case we want to resurrect it */
        /*
@@ -4657,12 +4472,12 @@ show the built in presets in a blue font. */
      /* if there is a description for the preset, we show it in the tooltip */
         if ([[UserPresets objectAtIndex:rowIndex] valueForKey:@"PresetDescription"])
         {
-        loc_tip = [NSString stringWithFormat: @"%@",[[UserPresets objectAtIndex:rowIndex] valueForKey:@"PresetDescription"]];
-        return (loc_tip);
+        loc_tip = [NSString stringWithFormat: @"%@",[[UserPresets objectAtIndex:rowIndex] valueForKey:@"PresetDescription"]];
+        return (loc_tip);
         }
         else
         {
-        loc_tip = @"No description available";
+        loc_tip = @"No description available";
         }
         return (loc_tip);
 
@@ -4704,42 +4519,31 @@ id theRecord, theValue;
     [self savePreset];
 }
 
-
 - (void)savePreset
 {
     [UserPresets writeToFile:UserPresetsFile atomically:YES];
+       /* We get the default preset in case it changed */
+       [self getDefaultPresets: NULL];
 
 }
 
-
-
-- (void) controlTextDidBeginEditing: (NSNotification *) notification
-{
-    [self CalculateBitrate: NULL];
-}
-
-- (void) controlTextDidEndEditing: (NSNotification *) notification
-{
-    [self CalculateBitrate: NULL];
-}
-
 - (void) controlTextDidChange: (NSNotification *) notification
 {
-    [self CalculateBitrate: NULL];
+    [self calculateBitrate: NULL];
 }
 
-- (IBAction) OpenHomepage: (id) sender
+- (IBAction) openHomepage: (id) sender
 {
     [[NSWorkspace sharedWorkspace] openURL: [NSURL
         URLWithString:@"http://handbrake.m0k.org/"]];
 }
 
-- (IBAction) OpenForums: (id) sender
+- (IBAction) openForums: (id) sender
 {
     [[NSWorkspace sharedWorkspace] openURL: [NSURL
         URLWithString:@"http://handbrake.m0k.org/forum/"]];
 }
-- (IBAction) OpenUserGuide: (id) sender
+- (IBAction) openUserGuide: (id) sender
 {
     [[NSWorkspace sharedWorkspace] openURL: [NSURL
         URLWithString:@"http://handbrake.m0k.org/trac/wiki/HandBrakeGuide"]];
@@ -4754,14 +4558,28 @@ id theRecord, theValue;
 }
 
 /**
- * Creates preferences controller, shows preferences window modally, and
- * releases the controller after user has closed the window.
+ * Shows preferences window modally.
+ */
+- (IBAction) showPreferencesWindow: (id) sender
+{
+    NSWindow * window = [fPreferencesController window];
+    if (![window isVisible])
+        [window center];
+
+    [window makeKeyAndOrderFront: nil];
+}
+
+/**
+ * Shows queue window.
  */
-- (IBAction)showPreferencesWindow:(id)sender
+- (IBAction) showQueueWindow:(id)sender
 {
-    HBPreferencesController *controller = [[HBPreferencesController alloc] init];
-    [controller runModal:nil];
-    [controller release];
+    [fQueueController showQueueWindow:sender];
+}
+
+
+- (IBAction) toggleDrawer:(id)sender {
+    [fPresetDrawer toggle:self];
 }
 
 @end