Index: src/base/factory.cpp
===================================================================
--- src/base/factory.cpp	(revision 4967)
+++ src/base/factory.cpp	(working copy)
@@ -263,7 +263,24 @@
             {
                 wxMenuItem *menuItem=menuBar->FindItem(id);
                 if (menuItem && menuItem->IsEnabled())
-                    lastItem = treeContextMenu->Append(id, menuItem->GetLabel(), menuItem->GetHelp());
+				{
+					if (!menuItem->IsSubMenu())
+						lastItem = treeContextMenu->Append(id, menuItem->GetLabel(), menuItem->GetHelp());
+					else
+					{
+						/* Copy of submenu */
+						wxMenu *oldSubMenu = menuItem->GetSubMenu();
+						wxMenu *newSubMenu = new wxMenu();
+
+						size_t i;
+						for (i=0; i < oldSubMenu->GetMenuItemCount(); i++)
+						{
+							wxMenuItem *oldMenuItem = oldSubMenu->FindItemByPosition(i);
+							newSubMenu->Append(oldMenuItem->GetId(), oldMenuItem->GetLabel(), oldMenuItem->GetHelp());
+						}
+						lastItem = treeContextMenu->Append(id, menuItem->GetLabel(), newSubMenu);
+					}
+				}
             }
         }
         else
Index: src/dlg/dlgEditGridOptions.cpp
===================================================================
--- src/dlg/dlgEditGridOptions.cpp	(revision 4967)
+++ src/dlg/dlgEditGridOptions.cpp	(working copy)
@@ -43,6 +43,7 @@
 #define lstSortCols                 CTRL_LISTVIEW("lstSortCols")
 #define pnlSort                     CTRL_PANEL("pnlSort")
 #define pnlFilter                   CTRL_PANEL("pnlFilter")
+#define cboRowLimit					CTRL_COMBOBOX("cboRowLimit")
 
 BEGIN_EVENT_TABLE(dlgEditGridOptions, pgDialog)
     EVT_BUTTON               (wxID_OK,              dlgEditGridOptions::OnOK)
@@ -56,7 +57,7 @@
     EVT_LIST_ITEM_DESELECTED (XRCID("lstSortCols"), dlgEditGridOptions::OnLstSortColsChange) 
 END_EVENT_TABLE()
 
-dlgEditGridOptions::dlgEditGridOptions(frmEditGrid *win, pgConn *conn, const wxString &rel, ctlSQLGrid *grid)
+dlgEditGridOptions::dlgEditGridOptions(frmEditGrid *win, pgConn *conn, const wxString &rel, ctlSQLGrid *grid, int limit)
 {
     wxLogInfo(wxT("Creating an edit grid options dialogue"));
     editGrid=grid;
@@ -96,6 +97,12 @@
     wxXmlResource::Get()->AttachUnknownControl(wxT("sqlFilter"), filter);
     filter->SetText(parent->GetFilter());
 
+	// Setup limit combo
+	if (limit <= 0)
+		cboRowLimit->SetValue(_("No limit"));
+	else
+		cboRowLimit->SetValue(wxString::Format(wxT("%i"), limit));
+
     // Get the current sort columns, and populate the listbox.
     // The current columns will be parsed char by char to allow us
     // to cope with quoted column names with commas in them (let's hope 
@@ -234,6 +241,7 @@
 
 void dlgEditGridOptions::OnOK(wxCommandEvent &ev)
 {
+	long limit;
     // Check the filter syntax
     if (!Validate()) return;
 
@@ -259,12 +267,27 @@
     }
 
     parent->SetFilter(filter->GetText().Trim());
+	
+	if (cboRowLimit->GetValue() == _("No limit"))
+		limit = 0;
+	else
+		cboRowLimit->GetValue().ToLong(&limit);
+	parent->SetLimit(limit);
     EndModal(true);
 }
 
 bool dlgEditGridOptions::Validate()
 {
     extern frmMain *winMain;
+	long templong;
+
+	if (cboRowLimit->GetValue() != _("No limit") &&
+		!cboRowLimit->GetValue().ToLong(&templong))
+	{
+		wxLogError(_("Limit must be number or 'No limit'"));
+		return false;
+	}
+
     winMain->StartMsg(_("Validating filter string"));
     filter->MarkerDeleteAll(0);
     if (!filter->GetText().Trim().Length()) {
Index: src/frm/frmEditGrid.cpp
===================================================================
--- src/frm/frmEditGrid.cpp	(revision 4967)
+++ src/frm/frmEditGrid.cpp	(working copy)
@@ -77,6 +77,7 @@
     mainForm=form;
     thread=0;
     relkind=0;
+	limit=0;
     relid=(Oid)obj->GetOid();
 
 
@@ -168,6 +169,14 @@
 	} 
 }
 
+void frmEditGrid::SetLimit(const int rowlimit)
+{
+	if (rowlimit != limit) {
+		limit = rowlimit;
+		optionsChanged = true;
+	}
+}
+
 void frmEditGrid::OnLabelRightClick(wxGridEvent& event)
 {
     wxArrayInt rows=sqlGrid->GetSelectedRows();
@@ -484,7 +493,7 @@
 void frmEditGrid::OnOptions(wxCommandEvent& event)
 {
 	optionsChanged = false;
-    dlgEditGridOptions *winOptions = new dlgEditGridOptions(this, connection, tableName, sqlGrid);
+    dlgEditGridOptions *winOptions = new dlgEditGridOptions(this, connection, tableName, sqlGrid, limit);
     winOptions->ShowModal();
 
 	if (optionsChanged) Go();
@@ -597,7 +606,7 @@
 	{
 		if (filter) 
 		{
-			dlgEditGridOptions *winOptions = new dlgEditGridOptions(this, connection, tableName, sqlGrid);
+			dlgEditGridOptions *winOptions = new dlgEditGridOptions(this, connection, tableName, sqlGrid, limit);
 			abort = !(winOptions->ShowModal());
 		}
 		if (abort) {
@@ -632,6 +641,8 @@
     {
         qry += wxT(" ORDER BY ") + orderBy;
     }
+	if (limit > 0)
+		qry += wxT(" LIMIT ") + wxString::Format(wxT("%i"), limit);
 
     thread=new pgQueryThread(connection, qry);
     if (thread->Create() != wxTHREAD_NO_ERROR)
@@ -2011,6 +2022,7 @@
             + wxT(" - ") + obj->GetFullIdentifier();
 
         frmEditGrid *eg= new frmEditGrid(form, txt, conn, (pgSchemaObject*)obj);
+		eg->SetLimit(rowlimit);
         eg->ShowForm(filter);
         return eg;
     }
@@ -2020,8 +2032,9 @@
 
 editGridFactory::editGridFactory(menuFactoryList *list, wxMenu *mnu, wxToolBar *toolbar) : editGridFactoryBase(list)
 {
-    mnu->Append(id, _("View &Data"), _("View the data in the selected object."));
-    toolbar->AddTool(id, _("View Data"), wxBitmap(viewdata_xpm), _("View the data in the selected object."), wxITEM_NORMAL);
+    mnu->Append(id, _("View &All Rows"), _("View the data in the selected object."));
+    toolbar->AddTool(id, _("View All Rows"), wxBitmap(viewdata_xpm), _("View the data in the selected object."), wxITEM_NORMAL);
+	context = false;
 }
 
 
@@ -2034,8 +2047,9 @@
 #include "images/viewfiltereddata.xpm"
 editGridFilteredFactory::editGridFilteredFactory(menuFactoryList *list, wxMenu *mnu, wxToolBar *toolbar) : editGridFactoryBase(list)
 {
-    mnu->Append(id, _("View F&iltered Data..."), _("Apply a filter and view the data in the selected object."));
-    toolbar->AddTool(id, _("View Filtered Data"), wxBitmap(viewfiltereddata_xpm), _("Apply a filter and view the data in the selected object."), wxITEM_NORMAL);
+    mnu->Append(id, _("View F&iltered Rows..."), _("Apply a filter and view the data in the selected object."));
+    toolbar->AddTool(id, _("View Filtered Rows"), wxBitmap(viewfiltereddata_xpm), _("Apply a filter and view the data in the selected object."), wxITEM_NORMAL);
+	context = false;
 }
 
 
@@ -2044,3 +2058,14 @@
     return ViewData(form, obj, true);
 }
 
+editGridLimitedFactory::editGridLimitedFactory(menuFactoryList *list, wxMenu *mnu, wxToolBar *toolbar, int limit) : editGridFactoryBase(list)
+{
+	mnu->Append(id, wxString::Format(_("View Top %i Rows"), limit), _("View a limited number of rows in the selected object."));
+	rowlimit = limit;
+	context = false;
+}
+
+wxWindow *editGridLimitedFactory::StartDialog(frmMain *form, pgObject *obj)
+{
+	return ViewData(form, obj, false);
+}
\ No newline at end of file
Index: src/frm/frmMain.cpp
===================================================================
--- src/frm/frmMain.cpp	(revision 4967)
+++ src/frm/frmMain.cpp	(working copy)
@@ -124,6 +124,7 @@
     viewMenu = new wxMenu();
     helpMenu = new wxMenu();
     newMenu=new wxMenu();
+	viewDataMenu = new wxMenu();
 
     wxMenu *cfgMenu=new wxMenu();
     
@@ -141,6 +142,12 @@
     actionFactory *refFact=new refreshFactory(menuFactories, viewMenu, toolBar);
     new countRowsFactory(menuFactories, viewMenu, 0);
 
+	new editGridLimitedFactory(menuFactories, viewDataMenu, toolBar, 100);
+    new editGridFactory(menuFactories, viewDataMenu, toolBar);
+    new editGridFilteredFactory(menuFactories, viewDataMenu, toolBar);
+    viewdataMenuFactory = new dummyActionFactory(menuFactories);     // placeholder where "View data" submenu will be inserted
+	toolsMenu->Append(viewdataMenuFactory->GetId(), _("View &Data"), viewDataMenu, _("View data."));
+    
     new separatorFactory(menuFactories);
 
     viewMenu->AppendSeparator();
@@ -190,9 +197,8 @@
     toolBar->AddSeparator();
     toolsMenu->AppendSeparator();
     new queryToolFactory(menuFactories, toolsMenu, toolBar);
-    new editGridFactory(menuFactories, toolsMenu, toolBar);
-    new editGridFilteredFactory(menuFactories, toolsMenu, toolBar);
-    new maintenanceFactory(menuFactories, toolsMenu, toolBar);
+	
+	new maintenanceFactory(menuFactories, toolsMenu, toolBar);
 
     new backupFactory(menuFactories, toolsMenu, 0);
     new restoreFactory(menuFactories, toolsMenu, 0);
Index: src/include/dlgEditGridOptions.h
===================================================================
--- src/include/dlgEditGridOptions.h	(revision 4967)
+++ src/include/dlgEditGridOptions.h	(working copy)
@@ -38,7 +38,7 @@
 public:
 
 	// Construction
-    dlgEditGridOptions(frmEditGrid *parent, pgConn *conn, const wxString &rel, ctlSQLGrid *grid);
+    dlgEditGridOptions(frmEditGrid *parent, pgConn *conn, const wxString &rel, ctlSQLGrid *grid, int limit);
 
 private:
 
Index: src/include/frmEditGrid.h
===================================================================
--- src/include/frmEditGrid.h	(revision 4967)
+++ src/include/frmEditGrid.h	(working copy)
@@ -163,6 +163,8 @@
 	void SetSortCols(const wxString &cols);
 	wxString GetFilter() const { return rowFilter; } ;
 	void SetFilter(const wxString &filter);
+	int GetLimit() const { return limit; } ;
+	void SetLimit(const int rowlimit);
 
 private:
     void OnClose(wxCloseEvent& event);
@@ -196,6 +198,7 @@
     wxString primaryKeyColNumbers;
     wxString orderBy;
 	wxString rowFilter;
+	int limit;
 
     DECLARE_EVENT_TABLE();
 };
@@ -207,8 +210,9 @@
     bool CheckEnable(pgObject *obj);
 
 protected:
-    editGridFactoryBase(menuFactoryList *list) : contextActionFactory(list) {}
+    editGridFactoryBase(menuFactoryList *list) : contextActionFactory(list) { rowlimit = 0; }
     wxWindow *ViewData(frmMain *form, pgObject *obj, bool filter);
+	int rowlimit;
 };
 
 
@@ -227,5 +231,12 @@
     wxWindow *StartDialog(frmMain *form, pgObject *obj);
 };
 
+class editGridLimitedFactory : public editGridFactoryBase
+{
+public:
+	editGridLimitedFactory(menuFactoryList *list, wxMenu *mnu, wxToolBar *toolbar, int limit);
+	wxWindow *StartDialog(frmMain *form, pgObject *obj);
+};
+
 #endif
 
Index: src/include/frmMain.h
===================================================================
--- src/include/frmMain.h	(revision 4967)
+++ src/include/frmMain.h	(working copy)
@@ -71,12 +71,13 @@
     ctlListView *referencedBy, *dependsOn;
     wxNotebook *listViews;
     ctlSQLBox *sqlPane;
-    wxMenu *newMenu, *toolsMenu, *viewMenu, *treeContextMenu, *newContextMenu, *slonyMenu;
+    wxMenu *newMenu, *toolsMenu, *viewMenu, *treeContextMenu, *newContextMenu, *slonyMenu, *viewDataMenu;
     pgServerCollection *serversObj;
     wxSplitterWindow *horizontal, *vertical;
 
     propertyFactory *propFactory;
     actionFactory *newMenuFactory;
+	actionFactory *viewdataMenuFactory;
 
     wxStopWatch stopwatch;
     wxString timermsg;
Index: src/main/events.cpp
===================================================================
--- src/main/events.cpp	(revision 4967)
+++ src/main/events.cpp	(working copy)
@@ -364,6 +364,7 @@
     enableSubmenu(MNU_CONFIGSUBMENU);
     enableSubmenu(MNU_SLONY_SUBMENU);
     enableSubmenu(newMenuFactory->GetId());
+	enableSubmenu(viewdataMenuFactory->GetId());
 }
 
 
Index: src/ui/dlgEditGridOptions.xrc
===================================================================
--- src/ui/dlgEditGridOptions.xrc	(revision 4967)
+++ src/ui/dlgEditGridOptions.xrc	(working copy)
@@ -147,6 +147,33 @@
                   </object>
                   <flag>wxGROW</flag>
                 </object>
+                <object class="sizeritem">
+                  <object class="wxFlexGridSizer">
+                   <cols>3</cols>
+				   <object class="sizeritem">
+				    <object class="wxStaticText" name="lblRowLimit">
+ 				    <label>Max rows:</label>zz
+				    </object>
+				   </object>
+				   <object class="spacer">
+ 				    <size>3,3d</size>
+				   </object>
+                   <object class="sizeritem">
+					<object class="wxComboBox" name="cboRowLimit">
+                     <content>
+					  <item>No limit</item>
+					  <item>100</item>
+					  <item>500</item>
+					  <item>1000</item>
+					 </content>
+                     <style>wxCB_DROPDOWN</style>
+                     <tooltip>Enter number of rows to show.</tooltip>
+					 <size>100,12d</size>
+					</object>
+                   </object>
+				  </object>
+                  <flag>wxGROW</flag>
+				</object>
                 <object class="spacer">
                   <size>3,3d</size>
                 </object>
