Index: gazpacho/uimstate.py
===================================================================
--- gazpacho/uimstate.py	(revision 2286)
+++ gazpacho/uimstate.py	(working copy)
@@ -210,12 +210,16 @@
   <menubar name="MainMenu">
     <menu action="ObjectMenu">
       <menuitem action="AddAction"/>
+      <menuitem action="AddToggleAction"/>
+      <menuitem action="AddRadioAction"/>
       <menuitem action="AddActionGroup"/>
       <menuitem action="EditAction"/>
     </menu>
   </menubar>
   <toolbar name="MainToolbar">
     <toolitem action="AddAction"/>
+    <toolitem action="AddToggleAction"/>
+    <toolitem action="AddRadioAction"/>
   </toolbar>
 </ui>
 """
@@ -224,6 +228,8 @@
 <ui>
   <popup name="ActionPopup">
     <menuitem action="AddAction"/>
+    <menuitem action="AddToggleAction"/>
+    <menuitem action="AddRadioAction"/>
     <menuitem action="AddActionGroup"/>
     <menuitem action="EditAction"/>
     <menuitem action="Delete"/>
@@ -309,6 +315,22 @@
         action.set_property('short-label', _('Action'))
         group.add_action(action)
 
+        action = gtk.Action('AddToggleAction',
+                            _('_Add ToggleAction...'),
+                            _('Add a toggle action'),
+                            gtk.STOCK_ADD)
+        action.connect('activate', self._add_toggle_action_cb)
+        action.set_property('short-label', _('Toggle Action'))
+        group.add_action(action)
+
+        action = gtk.Action('AddRadioAction',
+                            _('_Add Radio Action...'),
+                            _('Add a radio action'),
+                            gtk.STOCK_ADD)
+        action.connect('activate', self._add_radio_action_cb)
+        action.set_property('short-label', _('Radio Action'))
+        group.add_action(action)
+
         action = gtk.Action('AddActionGroup',
                             _('Add Action _Group...'),
                             _('Add an action group'),
@@ -342,7 +364,8 @@
         else:
             sensitive = False
 
-        bar_manager.set_action_props(('AddAction', 'Delete', 'EditAction'),
+        bar_manager.set_action_props(('AddAction', 'AddToggleAction',
+                                      'AddRadioAction', 'Delete', 'EditAction'),
                                      sensitive=sensitive)
 
     #
@@ -376,6 +399,14 @@
         gaction = self._view.get_selected_action()
         self._view.add_action(gaction)
 
+    def _add_toggle_action_cb(self, action):
+        gaction = self._view.get_selected_action()
+        self._view.add_toggle_action(gaction)
+
+    def _add_radio_action_cb(self, action):
+        gaction = self._view.get_selected_action()
+        self._view.add_radio_action(gaction)
+
     def _add_action_group_cb(self, action):
         self._view.add_action_group()
 
Index: gazpacho/commandmanager.py
===================================================================
--- gazpacho/commandmanager.py	(revision 2286)
+++ gazpacho/commandmanager.py	(working copy)
@@ -20,7 +20,7 @@
 from kiwi.ui.dialogs import warning
 
 from gazpacho.clipboard import clipboard
-from gazpacho.gaction import GAction, GActionGroup
+from gazpacho.gaction import GAction, GToggleAction, GRadioAction, GActionGroup
 from gazpacho.sizegroup import safe_to_add_gadgets
 from gazpacho.util import get_parent
 
@@ -246,6 +246,26 @@
         cmd.execute()
         project.undo_stack.push_undo(cmd)
 
+    def add_toggle_action(self, values, parent, project):
+        gact = GToggleAction(parent, values['name'], values['label'],
+                             values['short_label'], values['is_important'],
+                             values['tooltip'], values['stock_id'],
+                             values['callback'], values['accelerator'])
+        dsc = _('Add toggle action %s') % gact.name
+        cmd = self._get_command('add-action', parent, gact, True, dsc)
+        cmd.execute()
+        project.undo_stack.push_undo(cmd)
+
+    def add_radio_action(self, values, parent, project):
+        gact = GRadioAction(parent, values['name'], values['label'],
+                            values['short_label'], values['is_important'],
+                            values['tooltip'], values['stock_id'],
+                            values['callback'], values['accelerator'])
+        dsc = _('Add radio action %s') % gact.name
+        cmd = self._get_command('add-action', parent, gact, True, dsc)
+        cmd.execute()
+        project.undo_stack.push_undo(cmd)
+
     def remove_action(self, gact, project):
         dsc = _('Remove action %s') % gact.name
         cmd = self._get_command('add-action',
Index: gazpacho/gaction.py
===================================================================
--- gazpacho/gaction.py	(revision 2286)
+++ gazpacho/gaction.py	(working copy)
@@ -90,6 +90,15 @@
     def get_name(self):
         return self.name
 
+    def new_gtk_action(self):
+        gtk_action = gtk.Action(self.name, self.label,
+                                self.tooltip, self.stock_id)
+        # don't set a zero-length short label
+        if self.short_label:
+            gtk_action.set_property('short-label', self.short_label)
+        gtk_action.set_property('is-important', self.is_important)
+        return gtk_action
+
     def write(self, xml_doc):
         # XXX: Use XMLWriter
         node = xml_doc.createElement(tags.XML_TAG_WIDGET)
@@ -150,6 +159,79 @@
                                                              self.accelerator))
         return node
 
+class GToggleAction(GAction):
+    """A GAction for GtkToggleActions.
+    """
+    def new_gtk_action(self):
+        gtk_action = gtk.ToggleAction(self.name, self.label,
+                                      self.tooltip, self.stock_id)
+        # don't set a zero-length short label
+        if self.short_label:
+            gtk_action.set_property('short-label', self.short_label)
+        gtk_action.set_property('is-important', self.is_important)
+        return gtk_action
+
+    def write(self, xml_doc):
+        node = GAction.write(self, xml_doc)
+        node.setAttribute(tags.XML_TAG_CLASS, "GtkToggleAction")
+        return node
+
+class GRadioAction(GToggleAction):
+    """A GAction for GtkRadioActions.
+    """
+    def __init__(self, parent, name='', label='',
+                 short_label='', is_important=False,
+                 tooltip='', stock_id=None, callback='', accel='',
+                 value=0):
+        GToggleAction.__init__(self, parent, name, label,
+                               short_label, is_important,
+                               tooltip, stock_id, callback, accel)
+        self.value = value
+
+    def new(cls, gtk_action, parent):
+        """Create a new GAction from a GtkAction and a GtkActionGroup"""
+        # This code is similar to code in the loader, investigate
+        # if we can use more code reusage
+        name = gtk_action.get_name()
+        label = gtk_action.get_property('label')
+        short_label = gtk_action.get_property('short-label')
+        is_important = gtk_action.get_property('is-important')
+        tooltip = gtk_action.get_property('tooltip')
+        stock_id = gtk_action.get_property('stock-id') or None
+        value = gtk_action.get_property('value') or 0
+        gaction = cls(parent, name, label, short_label, is_important,
+                      tooltip, stock_id, value)
+
+        # check if it has accelerator
+        accel_entry = gtk.accel_map_lookup_entry('<Actions>/%s/%s' %
+                                                 (parent.name, name))
+        if accel_entry:
+            key, modifier = accel_entry
+            if key != 0:
+                gaction.accelerator = gtk.accelerator_name(key, modifier)
+
+        # check if it has signal handler
+        callback = gtk_action.get_data(tags.SIGNAL_HANDLER)
+        if callback:
+            gaction.callback = callback
+
+        return gaction
+    new = classmethod(new)
+
+    def new_gtk_action(self):
+        gtk_action = gtk.RadioAction(self.name, self.label, self.tooltip,
+                                     self.stock_id, self.value)
+        # don't set a zero-length short label
+        if self.short_label:
+            gtk_action.set_property('short-label', self.short_label)
+        gtk_action.set_property('is-important', self.is_important)
+        return gtk_action
+
+    def write(self, xml_doc):
+        node = GAction.write(self, xml_doc)
+        node.setAttribute(tags.XML_TAG_CLASS, "GtkRadioAction")
+        return node
+
 class GActionGroup(gobject.GObject):
     """A GActionGroup is just a list of GActions with a name.
     Associated with each GActionGroup there is a GtkActionGroup with
@@ -235,12 +317,7 @@
             # are not exactly the same as the old one
 
     def _add_gtk_action(self, action):
-        gtk_action = gtk.Action(action.name, action.label,
-                                action.tooltip, action.stock_id)
-        # don't set a zero-length short label
-        if action.short_label:
-            gtk_action.set_property('short-label', action.short_label)
-        gtk_action.set_property('is-important', action.is_important)
+        gtk_action = action.new_gtk_action()
         gtk_action_group = self.get_data('gtk_action_group')
         gtk_action_group.add_action_with_accel(gtk_action, action.accelerator)
 
Index: gazpacho/actioneditor.py
===================================================================
--- gazpacho/actioneditor.py	(revision 2286)
+++ gazpacho/actioneditor.py	(working copy)
@@ -24,7 +24,7 @@
 
 from gazpacho.app.bars import bar_manager
 from gazpacho.commandmanager import command_manager
-from gazpacho.gaction import GAction, GActionGroup
+from gazpacho.gaction import GAction, GToggleAction, GRadioAction, GActionGroup
 from gazpacho.interfaces import IGazpachoApp
 from gazpacho.stockicons import StockIconList
 from gazpacho.signalhandlers import SignalHandlerStorage
@@ -111,6 +111,44 @@
             command_manager.add_action(values, parent, self.project)
         dialog.destroy()
 
+    def add_toggle_action(self, gaction):
+        """Create an action and add it to the selected action
+        group. This method will not create the action directly but
+        delegate to the command manager."""
+        if isinstance(gaction, GActionGroup):
+            # create an action with the selected action group
+            # as the parent
+            parent = gaction
+        else:
+            # create a brother action of the selected action
+            parent = gaction.parent
+
+        dialog = GToggleActionDialog(
+            get_utility(IGazpachoApp).get_window(), parent, None)
+        if dialog.run() == gtk.RESPONSE_OK:
+            values = dialog.get_values()
+            command_manager.add_toggle_action(values, parent, self.project)
+        dialog.destroy()
+
+    def add_radio_action(self, gaction):
+        """Create an action and add it to the selected action
+        group. This method will not create the action directly but
+        delegate to the command manager."""
+        if isinstance(gaction, GActionGroup):
+            # create an action with the selected action group
+            # as the parent
+            parent = gaction
+        else:
+            # create a brother action of the selected action
+            parent = gaction.parent
+
+        dialog = GRadioActionDialog(
+            get_utility(IGazpachoApp).get_window(), parent, None)
+        if dialog.run() == gtk.RESPONSE_OK:
+            values = dialog.get_values()
+            command_manager.add_radio_action(values, parent, self.project)
+        dialog.destroy()
+
     def add_action_group(self):
         """Create and add an action group. This method will not create
         the action group directly but delegate to the command manager."""
@@ -134,7 +172,10 @@
         """Edit the action or action group. This method will not edit
         it directly but delegate to the command manager."""
         if isinstance(gaction, GAction):
-            dialog = GActionDialog(
+            dialogs = { GAction: GActionDialog,
+                        GToggleAction: GToggleActionDialog,
+                        GRadioAction: GRadioActionDialog }
+            dialog = dialogs[type(gaction)](
                 get_utility(IGazpachoApp).get_window(),
                 gaction.parent, gaction)
             if dialog.run() == gtk.RESPONSE_OK:
@@ -598,6 +639,34 @@
 
 gobject.type_register(GActionDialog)
 
+class GToggleActionDialog(GActionDialog):
+    """This Dialog allows the creation and edition of a GToggleAction."""
+    def __init__(self, toplevel, action_group, edit_action=None):
+        GActionDialog.__init__(self, toplevel, action_group, edit_action)
+        if edit_action:
+            title = _('Edit Toggle Action')
+        else:
+            title = _('Add Toggle Action')
+        self.set_title(title)
+
+    # XXX add UI for setting active state, radio-appearence
+
+gobject.type_register(GToggleActionDialog)
+
+class GRadioActionDialog(GToggleActionDialog):
+    """This Dialog allows the creation and edition of a GRadioAction."""
+    def __init__(self, toplevel, action_group, edit_action=None):
+        GActionDialog.__init__(self, toplevel, action_group, edit_action)
+        if edit_action:
+            title = _('Edit Radio Action')
+        else:
+            title = _('Add Radio Action')
+        self.set_title(title)
+
+    # XXX add UI for setting group
+
+gobject.type_register(GRadioActionDialog)
+
 class GActionGroupDialog(BaseDialog):
     """This Dialog allows the creation and edition of a GActionGroup."""
     def __init__(self, toplevel=None, action_group=None):
Index: gazpacho/uim.py
===================================================================
--- gazpacho/uim.py	(revision 2286)
+++ gazpacho/uim.py	(working copy)
@@ -21,7 +21,7 @@
 
 import gtk
 
-from gazpacho.gaction import GAction, GActionGroup
+from gazpacho.gaction import GAction, GToggleAction, GRadioAction, GActionGroup
 from gazpacho.loader import tags
 from gazpacho.widget import Gadget
 
@@ -240,6 +240,9 @@
                 gaction_callbacks[widget] = handler
 
         # read the action groups
+        action_types = { gtk.Action: GAction,
+                         gtk.ToggleAction: GToggleAction,
+                         gtk.RadioAction: GRadioAction }
         for ag in uimanager.get_action_groups():
             # only add the action group if we don't have it
             gag = self.get_action_group(ag.get_name())
@@ -247,7 +250,7 @@
                 gag = GActionGroup.new(ag)
                 self.add_action_group(gag)
             for action in ag.list_actions():
-                ga = GAction.new(action, gag)
+                ga = action_types[type(action)].new(action, gag)
                 # only add the action if the action group does not have it
                 if not gag.get_action(ga.name):
                     ga.callback = gaction_callbacks.get(action, '')
Index: gazpacho/loader/custom.py
===================================================================
--- gazpacho/loader/custom.py	(revision 2286)
+++ gazpacho/loader/custom.py	(working copy)
@@ -464,6 +464,12 @@
         if value:
             self._build.add_signal(action, 'activate', value)
 
+class ToggleActionAdapter(ActionAdapter):
+    object_type = gtk.ToggleAction
+
+class RadioActionAdapter(ToggleActionAdapter):
+    object_type = gtk.RadioAction
+
 class PixmapAdapter(WidgetAdapter):
     object_type = gtk.Pixmap
     def prop_set_build_insensitive(self, pixmap, value):
