 <p>Ok, again I reply to my own question, but this time with a positive remark. I think what I was doing wrong had something to do with the hidden - for me - implications of the Document-based architecture of the default Document Application template.</p> <p>I have tried with a different approach, creating an application from scratch NOT flagging "Document-based Application" and providing it with:</p> <ul> <li>1 NSDocument subclass </li> <li>2 NSWindowControllers subclasses </li> <li>1 MainMenu.xib </li> <li>2 window.xib</li> </ul> <p>and I have forced instantiation of the NSWindowController subclasses in the MyDocument code.</p> <p>I have also put the IBActions for the MenuItems in the MyDocument and I have bound the MyDocument Object to the MenuItems in the MainMenu.xib.</p> <p><strong>This time I was able to do whatever, hiding/showing windows starting with one hidden one not, enabling menu items automatically at will.</strong></p> <p>Here follows the code, for any newbie like me who might have to fight with this in the future. </p> <pre><code>// MyDocument.h #import &lt;Cocoa/Cocoa.h&gt; #import "testWindowController.h" #import "test2WindowController.h" @interface MyDocument : NSDocument { testWindowController *test; test2WindowController *test2; } - (IBAction)showWindow1:(id)pId; - (IBAction)showWindow2:(id)pId; - (IBAction)hideWindow1:(id)pId; - (IBAction)hideWindow2:(id)pId; @end // MyDocument.m #import "MyDocument.h" #import "testWindowController.h" #import "test2WindowController.h" @implementation MyDocument - (id)init { self = [super init]; if (self) { // Initialization code here. NSLog(@"MyDocument init..."); [self makeWindowControllers]; } return self; } - (void)dealloc { [super dealloc]; } - (void)makeWindowControllers { test = [[testWindowController alloc] init]; test2 = [[test2WindowController alloc] init]; [self addWindowController:test]; [self addWindowController:test2]; // start hiding the first window [[test window] orderOut:self]; } - (IBAction)hideWindow1:(id)pId { NSLog(@"hideWindow1"); [[test window] orderOut:self]; } - (IBAction)showWindow1:(id)pId { NSLog(@"showWindow1"); [test showWindow:self]; [[test window] makeKeyAndOrderFront:nil]; // to show it } - (IBAction)hideWindow2:(id)pId { NSLog(@"hideWindow2"); [[test2 window] orderOut:self]; } - (IBAction)showWindow2:(id)pId { NSLog(@"showWindow2"); [test2 showWindow:self]; [[test2 window] makeKeyAndOrderFront:nil]; // to show it } -(BOOL)validateMenuItem:(NSMenuItem *)menuItem { NSLog(@"in validateMenuItem for item: %@", [menuItem title]); if ([[menuItem title] isEqualToString:@"Show Window"] &amp;&amp; [[test window] isVisible]){ return NO; } if ([[menuItem title] isEqualToString:@"Hide Window"] &amp;&amp; ![[test window] isVisible]){ return NO; } if ([[menuItem title] isEqualToString:@"Show Window2"] &amp;&amp; [[test2 window] isVisible]){ return NO; } if ([[menuItem title] isEqualToString:@"Hide Window2"] &amp;&amp; ![[test2 window] isVisible]){ return NO; } return [super validateMenuItem:menuItem]; } </code></pre>