[nautilus] general: refactor extension library



commit 7e2605c681d065e6b0a3d779c30b892932597991
Author: Ernestas Kulik <ernestask gnome org>
Date:   Thu Feb 1 13:41:39 2018 +0200

    general: refactor extension library
    
    The changes include:
    
      * adding a single-include header and deprecating
        nautilus-extension-types.h and direct inclusions of individual
        headers;
    
      * type definition simplifications - this causes some breakages in
        nautilus-file, because NautilusFile used to be typedefed to
        NautilusFileInfo, and that is no longer possible, so the interface
        implementation was moved to static functions and the public
        NautilusFile API provides thin wrappers for them to maintain
        compatibility;
    
      * documentation cleanups and reorganization;
    
      * general build rule and code cleanups: mostly g_auto* sprinkled
        around and style changes (sorry)

 .../libnautilus-extension-docs.xml                 |  17 +-
 .../libnautilus-extension-sections.txt             | 102 +---
 libnautilus-extension/meson.build                  |  41 +-
 libnautilus-extension/nautilus-column-provider.c   |  49 +-
 libnautilus-extension/nautilus-column-provider.h   |  31 +-
 libnautilus-extension/nautilus-column.c            |  50 +-
 libnautilus-extension/nautilus-column.h            |  35 +-
 libnautilus-extension/nautilus-extension-types.c   |  58 ---
 libnautilus-extension/nautilus-extension-types.h   |  67 +--
 libnautilus-extension/nautilus-extension.h         |  43 ++
 libnautilus-extension/nautilus-file-info.c         | 326 +++++++-----
 libnautilus-extension/nautilus-file-info.h         | 141 +++---
 libnautilus-extension/nautilus-info-provider.c     |  68 +--
 libnautilus-extension/nautilus-info-provider.h     |  95 ++--
 .../nautilus-location-widget-provider.c            |  49 +-
 .../nautilus-location-widget-provider.h            |  39 +-
 libnautilus-extension/nautilus-menu-item.c         | 143 +++---
 libnautilus-extension/nautilus-menu-item.h         |   4 +
 libnautilus-extension/nautilus-menu-provider.c     |  98 ++--
 libnautilus-extension/nautilus-menu-provider.h     |  53 +-
 libnautilus-extension/nautilus-menu.c              |  45 +-
 libnautilus-extension/nautilus-menu.h              |  87 +---
 .../nautilus-property-page-provider.c              |  50 +-
 .../nautilus-property-page-provider.h              |  36 +-
 libnautilus-extension/nautilus-property-page.c     |  86 +---
 libnautilus-extension/nautilus-property-page.h     |  37 +-
 src/nautilus-application.c                         |   3 +-
 src/nautilus-column-chooser.c                      |   2 +
 src/nautilus-column-utilities.c                    |   2 +-
 src/nautilus-column-utilities.h                    |   1 -
 src/nautilus-desktop-item-properties.c             |   3 +-
 src/nautilus-directory-private.h                   |   2 +-
 src/nautilus-file.c                                | 552 ++++++++++++++-------
 src/nautilus-files-view.c                          |   6 +-
 src/nautilus-list-model.h                          |   2 +-
 src/nautilus-list-view.c                           |   1 -
 src/nautilus-preferences-window.c                  |   2 +
 src/nautilus-properties-window.c                   |   2 +-
 src/nautilus-ui-utilities.h                        |   1 -
 src/nautilus-window-slot.c                         |   2 +-
 40 files changed, 1177 insertions(+), 1254 deletions(-)
---
diff --git a/docs/reference/libnautilus-extension/libnautilus-extension-docs.xml 
b/docs/reference/libnautilus-extension/libnautilus-extension-docs.xml
index a5d8badbe..1c88c6339 100644
--- a/docs/reference/libnautilus-extension/libnautilus-extension-docs.xml
+++ b/docs/reference/libnautilus-extension/libnautilus-extension-docs.xml
@@ -14,19 +14,24 @@
   <part>
     <title>API Reference</title>
 
+    <chapter>
+        <title>Core Classes</title>
+        <xi:include href="xml/nautilus-column.xml" />
+        <xi:include href="xml/nautilus-file-info.xml" />
+        <xi:include href="xml/nautilus-menu.xml" />
+        <xi:include href="xml/nautilus-menu-item.xml" />
+        <xi:include href="xml/nautilus-property-page.xml" />
+    </chapter>
+
+    <xi:include href="xml/nautilus-extension.xml" />
+
     <chapter>
       <title>Extension Interfaces</title>
       <xi:include href="xml/nautilus-column-provider.xml" />
-      <xi:include href="xml/nautilus-column.xml" />
-      <xi:include href="xml/nautilus-extension-types.xml" />
-      <xi:include href="xml/nautilus-file-info.xml" />
       <xi:include href="xml/nautilus-info-provider.xml" />
       <xi:include href="xml/nautilus-location-widget-provider.xml" />
       <xi:include href="xml/nautilus-menu-provider.xml" />
-      <xi:include href="xml/nautilus-menu.xml" />
-      <xi:include href="xml/nautilus-menu-item.xml" />
       <xi:include href="xml/nautilus-property-page-provider.xml" />
-      <xi:include href="xml/nautilus-property-page.xml" />
     </chapter>
 
   </part>
diff --git a/docs/reference/libnautilus-extension/libnautilus-extension-sections.txt 
b/docs/reference/libnautilus-extension/libnautilus-extension-sections.txt
index ea216d3fd..e7d9d7340 100644
--- a/docs/reference/libnautilus-extension/libnautilus-extension-sections.txt
+++ b/docs/reference/libnautilus-extension/libnautilus-extension-sections.txt
@@ -1,46 +1,34 @@
+<INCLUDE>nautilus-extension.h</INCLUDE>
+
+<SECTION>
+<FILE>nautilus-extension</FILE>
+nautilus_module_initialize
+nautilus_module_shutdown
+nautilus_module_list_types
+</SECTION>
+
 <SECTION>
 <FILE>nautilus-location-widget-provider</FILE>
 NautilusLocationWidgetProvider
-NautilusLocationWidgetProviderIface
+NautilusLocationWidgetProviderInterface
 nautilus_location_widget_provider_get_widget
-<SUBSECTION Standard>
-NAUTILUS_LOCATION_WIDGET_PROVIDER
-NAUTILUS_IS_LOCATION_WIDGET_PROVIDER
-NAUTILUS_TYPE_LOCATION_WIDGET_PROVIDER
-nautilus_location_widget_provider_get_type
-NAUTILUS_LOCATION_WIDGET_PROVIDER_GET_IFACE
 </SECTION>
 
 <SECTION>
 <FILE>nautilus-menu-provider</FILE>
 NautilusMenuProvider
-NautilusMenuProviderIface
+NautilusMenuProviderInterface
 nautilus_menu_provider_get_file_items
 nautilus_menu_provider_get_background_items
 nautilus_menu_provider_emit_items_updated_signal
-<SUBSECTION Standard>
-NAUTILUS_MENU_PROVIDER
-NAUTILUS_IS_MENU_PROVIDER
-NAUTILUS_TYPE_MENU_PROVIDER
-nautilus_menu_provider_get_type
-NAUTILUS_MENU_PROVIDER_GET_IFACE
 </SECTION>
 
 <SECTION>
 <FILE>nautilus-menu</FILE>
-NautilusMenuPrivate
 NautilusMenu
 nautilus_menu_new
 nautilus_menu_append_item
 nautilus_menu_get_items
-<SUBSECTION Standard>
-NAUTILUS_MENU
-NAUTILUS_IS_MENU
-NAUTILUS_TYPE_MENU
-nautilus_menu_get_type
-NAUTILUS_MENU_CLASS
-NAUTILUS_IS_MENU_CLASS
-NAUTILUS_MENU_GET_CLASS
 </SECTION>
 
 <SECTION>
@@ -51,40 +39,20 @@ nautilus_menu_item_get_type
 nautilus_menu_item_new
 nautilus_menu_item_activate
 nautilus_menu_item_set_submenu
-<SUBSECTION Standard>
-NAUTILUS_TYPE_MENU_ITEM
-NAUTILUS_MENU_ITEM
-NAUTILUS_MENU_ITEM_CLASS
-NAUTILUS_MENU_IS_ITEM
-NAUTILUS_MENU_IS_ITEM_CLASS
-NAUTILUS_MENU_ITEM_GET_CLASS
-NautilusMenuItemDetails
 </SECTION>
 
 <SECTION>
 <FILE>nautilus-column-provider</FILE>
 NautilusColumnProvider
-NautilusColumnProviderIface
+NautilusColumnProviderInterface
 nautilus_column_provider_get_columns
-<SUBSECTION Standard>
-NAUTILUS_COLUMN_PROVIDER
-NAUTILUS_IS_COLUMN_PROVIDER
-NAUTILUS_TYPE_COLUMN_PROVIDER
-nautilus_column_provider_get_type
-NAUTILUS_COLUMN_PROVIDER_GET_IFACE
 </SECTION>
 
 <SECTION>
 <FILE>nautilus-property-page-provider</FILE>
 NautilusPropertyPageProvider
-NautilusPropertyPageProviderIface
+NautilusPropertyPageProviderInterface
 nautilus_property_page_provider_get_pages
-<SUBSECTION Standard>
-NAUTILUS_PROPERTY_PAGE_PROVIDER
-NAUTILUS_IS_PROPERTY_PAGE_PROVIDER
-NAUTILUS_TYPE_PROPERTY_PAGE_PROVIDER
-nautilus_property_page_provider_get_type
-NAUTILUS_PROPERTY_PAGE_PROVIDER_GET_IFACE
 </SECTION>
 
 <SECTION>
@@ -92,7 +60,7 @@ NAUTILUS_PROPERTY_PAGE_PROVIDER_GET_IFACE
 NAUTILUS_FILE_DEFINED
 NautilusFile
 NautilusFileInfo
-NautilusFileInfoIface
+NautilusFileInfoInterface
 nautilus_file_info_create
 nautilus_file_info_create_for_uri
 nautilus_file_info_lookup
@@ -118,68 +86,28 @@ nautilus_file_info_add_emblem
 nautilus_file_info_get_string_attribute
 nautilus_file_info_add_string_attribute
 nautilus_file_info_invalidate_extension_info
-<SUBSECTION Standard>
-NAUTILUS_FILE_INFO
-NAUTILUS_IS_FILE_INFO
-NAUTILUS_TYPE_FILE_INFO
-nautilus_file_info_get_type
-NAUTILUS_FILE_INFO_GET_IFACE
 </SECTION>
 
 <SECTION>
 <FILE>nautilus-column</FILE>
 NautilusColumn
 nautilus_column_new
-<SUBSECTION Standard>
-NAUTILUS_COLUMN
-NAUTILUS_INFO_IS_COLUMN
-NAUTILUS_TYPE_COLUMN
-nautilus_column_get_type
-NAUTILUS_COLUMN_CLASS
-NAUTILUS_INFO_IS_COLUMN_CLASS
-NAUTILUS_COLUMN_GET_CLASS
-NautilusColumnDetails
 </SECTION>
 
 <SECTION>
 <FILE>nautilus-info-provider</FILE>
 NautilusInfoProvider
-NautilusInfoProviderIface
-NautilusInfoProviderUpdateComplete
+NautilusInfoProviderInterface
 NautilusOperationHandle
 NautilusOperationResult
 nautilus_info_provider_update_file_info
 nautilus_info_provider_cancel_update
 nautilus_info_provider_update_complete_invoke
-<SUBSECTION Standard>
-NAUTILUS_TYPE_OPERATION_RESULT
-nautilus_operation_result_get_type
-NAUTILUS_INFO_PROVIDER
-NAUTILUS_IS_INFO_PROVIDER
-NAUTILUS_TYPE_INFO_PROVIDER
-nautilus_info_provider_get_type
-NAUTILUS_INFO_PROVIDER_GET_IFACE
 </SECTION>
 
 <SECTION>
 <FILE>nautilus-property-page</FILE>
 NautilusPropertyPage
 nautilus_property_page_new
-<SUBSECTION Standard>
-NAUTILUS_PROPERTY_PAGE
-NAUTILUS_IS_PROPERTY_PAGE
-NAUTILUS_TYPE_PROPERTY_PAGE
-nautilus_property_page_get_type
-NAUTILUS_PROPERTY_PAGE_CLASS
-NAUTILUS_IS_PROPERTY_PAGE_CLASS
-NAUTILUS_PROPERTY_PAGE_GET_CLASS
-NautilusPropertyPageDetails
-</SECTION>
-
-<SECTION>
-<FILE>nautilus-extension-types</FILE>
-nautilus_module_initialize
-nautilus_module_shutdown
-nautilus_module_list_types
 </SECTION>
 
diff --git a/libnautilus-extension/meson.build b/libnautilus-extension/meson.build
index 99dc4309e..e7c5717cf 100644
--- a/libnautilus-extension/meson.build
+++ b/libnautilus-extension/meson.build
@@ -1,28 +1,45 @@
-nautilus_extension_version = '1.4.0'
+nautilus_extension_version = '1.5.0'
+
+libnautilus_extension_deprecated_headers = [
+  'nautilus-extension-types.h',
+  'nautilus-menu-item.h'
+]
 
 libnautilus_extension_headers = [
   'nautilus-column-provider.h',
   'nautilus-column.h',
-  'nautilus-extension-types.h',
   'nautilus-file-info.h',
   'nautilus-info-provider.h',
   'nautilus-location-widget-provider.h',
-  'nautilus-menu-item.h',
   'nautilus-menu-provider.h',
   'nautilus-property-page-provider.h',
   'nautilus-property-page.h',
   'nautilus-menu.h'
 ]
 
+install_headers(
+  'nautilus-extension.h',
+  subdir: 'nautilus'
+)
 install_headers(
   libnautilus_extension_headers,
+  libnautilus_extension_deprecated_headers,
   subdir: join_paths('nautilus', 'libnautilus-extension')
 )
 
 libnautilus_extension_sources = [
+  gnome.mkenums_simple(
+    'nautilus-extension-enum-types',
+    install_header: true,
+    install_dir: join_paths(includedir, 'nautilus', 'libnautilus-extension'),
+    sources: [
+      'nautilus-info-provider.h'
+    ]
+  ),
+  libnautilus_extension_headers,
   'nautilus-column-provider.c',
   'nautilus-column.c',
-  'nautilus-extension-types.c',
+  'nautilus-extension.h',
   'nautilus-extension-private.h',
   'nautilus-file-info.c',
   'nautilus-info-provider.c',
@@ -40,8 +57,13 @@ libnautilus_extension_deps = [
 ]
 
 libnautilus_extension = shared_library(
-  'nautilus-extension',
-  libnautilus_extension_sources,
+  'nautilus-extension', [
+    libnautilus_extension_deprecated_headers,
+    libnautilus_extension_sources,
+  ],
+  c_args: [
+    '-DNAUTILUS_COMPILATION'
+  ],
   dependencies: libnautilus_extension_deps,
   include_directories: nautilus_include_dirs,
   version: nautilus_extension_version,
@@ -50,10 +72,10 @@ libnautilus_extension = shared_library(
 
 gnome.generate_gir(
   libnautilus_extension,
-  sources: [
-    libnautilus_extension_headers,
-    libnautilus_extension_sources
+  extra_args: [
+    '-DNAUTILUS_COMPILATION'
   ],
+  sources: libnautilus_extension_sources,
   nsversion: '3.0',
   namespace: 'Nautilus',
   includes: [
@@ -61,6 +83,7 @@ gnome.generate_gir(
     'Gio-2.0',
     'GLib-2.0'
   ],
+  header: 'nautilus-extension.h',
   install: true
 )
 
diff --git a/libnautilus-extension/nautilus-column-provider.c 
b/libnautilus-extension/nautilus-column-provider.c
index 22519a635..f40bebaac 100644
--- a/libnautilus-extension/nautilus-column-provider.c
+++ b/libnautilus-extension/nautilus-column-provider.c
@@ -21,55 +21,24 @@
  *
  */
 
-#include <config.h>
 #include "nautilus-column-provider.h"
 
-#include <glib-object.h>
+G_DEFINE_INTERFACE (NautilusColumnProvider, nautilus_column_provider, G_TYPE_OBJECT)
 
 /**
  * SECTION:nautilus-column-provider
  * @title: NautilusColumnProvider
  * @short_description: Interface to provide additional list view columns
- * @include: libnautilus-extension/nautilus-column-provider.h
  *
  * #NautilusColumnProvider allows extension to provide additional columns
  * in the file manager list view.
  */
 
 static void
-nautilus_column_provider_base_init (gpointer g_class)
+nautilus_column_provider_default_init (NautilusColumnProviderInterface *klass)
 {
 }
 
-GType
-nautilus_column_provider_get_type (void)
-{
-    static GType type = 0;
-
-    if (!type)
-    {
-        const GTypeInfo info =
-        {
-            sizeof (NautilusColumnProviderIface),
-            nautilus_column_provider_base_init,
-            NULL,
-            NULL,
-            NULL,
-            NULL,
-            0,
-            0,
-            NULL
-        };
-
-        type = g_type_register_static (G_TYPE_INTERFACE,
-                                       "NautilusColumnProvider",
-                                       &info, 0);
-        g_type_interface_add_prerequisite (type, G_TYPE_OBJECT);
-    }
-
-    return type;
-}
-
 /**
  * nautilus_column_provider_get_columns:
  * @provider: a #NautilusColumnProvider
@@ -77,11 +46,15 @@ nautilus_column_provider_get_type (void)
  * Returns: (element-type NautilusColumn) (transfer full): the provided #NautilusColumn objects
  */
 GList *
-nautilus_column_provider_get_columns (NautilusColumnProvider *provider)
+nautilus_column_provider_get_columns (NautilusColumnProvider *self)
 {
-    g_return_val_if_fail (NAUTILUS_IS_COLUMN_PROVIDER (provider), NULL);
-    g_return_val_if_fail (NAUTILUS_COLUMN_PROVIDER_GET_IFACE (provider)->get_columns != NULL, NULL);
+    NautilusColumnProviderInterface *iface;
+
+    g_return_val_if_fail (NAUTILUS_IS_COLUMN_PROVIDER (self), NULL);
+
+    iface = NAUTILUS_COLUMN_PROVIDER_GET_IFACE (self);
+
+    g_return_val_if_fail (iface->get_columns != NULL, NULL);
 
-    return NAUTILUS_COLUMN_PROVIDER_GET_IFACE (provider)->get_columns
-               (provider);
+    return iface->get_columns (self);
 }
diff --git a/libnautilus-extension/nautilus-column-provider.h 
b/libnautilus-extension/nautilus-column-provider.h
index dd6c8e1f0..de730bf5f 100644
--- a/libnautilus-extension/nautilus-column-provider.h
+++ b/libnautilus-extension/nautilus-column-provider.h
@@ -30,37 +30,40 @@
 #ifndef NAUTILUS_COLUMN_PROVIDER_H
 #define NAUTILUS_COLUMN_PROVIDER_H
 
+#if !defined (NAUTILUS_EXTENSION_H) && !defined (NAUTILUS_COMPILATION)
+#warning "Only <nautilus-extension.h> should be included directly."
+#endif
+
 #include <glib-object.h>
-#include "nautilus-extension-types.h"
-#include "nautilus-column.h"
 
 G_BEGIN_DECLS
 
-#define NAUTILUS_TYPE_COLUMN_PROVIDER           (nautilus_column_provider_get_type ())
-#define NAUTILUS_COLUMN_PROVIDER(obj)           (G_TYPE_CHECK_INSTANCE_CAST ((obj), 
NAUTILUS_TYPE_COLUMN_PROVIDER, NautilusColumnProvider))
-#define NAUTILUS_IS_COLUMN_PROVIDER(obj)        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), 
NAUTILUS_TYPE_COLUMN_PROVIDER))
-#define NAUTILUS_COLUMN_PROVIDER_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), 
NAUTILUS_TYPE_COLUMN_PROVIDER, NautilusColumnProviderIface))
+#define NAUTILUS_TYPE_COLUMN_PROVIDER (nautilus_column_provider_get_type ())
+
+G_DECLARE_INTERFACE (NautilusColumnProvider, nautilus_column_provider,
+                     NAUTILUS, COLUMN_PROVIDER,
+                     GObject)
 
-typedef struct _NautilusColumnProvider       NautilusColumnProvider;
-typedef struct _NautilusColumnProviderIface  NautilusColumnProviderIface;
+/* For compatibility reasons, remove this once you start introducing breaking changes. */
+typedef NautilusColumnProviderInterface NautilusColumnProviderIface;
 
 /**
- * NautilusColumnProviderIface:
+ * NautilusColumnProviderInterface:
  * @g_iface: The parent interface.
  * @get_columns: Returns a #GList of #NautilusColumn.
  *   See nautilus_column_provider_get_columns() for details.
  *
  * Interface for extensions to provide additional list view columns.
  */
-struct _NautilusColumnProviderIface {
-       GTypeInterface g_iface;
+struct _NautilusColumnProviderInterface
+{
+    GTypeInterface g_iface;
 
-       GList *(*get_columns) (NautilusColumnProvider *provider);
+    GList *(*get_columns) (NautilusColumnProvider *provider);
 };
 
 /* Interface Functions */
-GType                   nautilus_column_provider_get_type       (void);
-GList                  *nautilus_column_provider_get_columns    (NautilusColumnProvider *provider);
+GList *nautilus_column_provider_get_columns (NautilusColumnProvider *provider);
 
 G_END_DECLS
 
diff --git a/libnautilus-extension/nautilus-column.c b/libnautilus-extension/nautilus-column.c
index fdf83204c..a36885091 100644
--- a/libnautilus-extension/nautilus-column.c
+++ b/libnautilus-extension/nautilus-column.c
@@ -21,8 +21,6 @@
  *
  */
 
-#include <config.h>
-#include <glib/gi18n-lib.h>
 #include <gtk/gtk.h>
 #include "nautilus-column.h"
 
@@ -39,8 +37,10 @@ enum
     LAST_PROP
 };
 
-struct _NautilusColumnDetails
+struct _NautilusColumn
 {
+    GObject parent_instance;
+
     char *name;
     GQuark attribute;
     char *label;
@@ -55,7 +55,6 @@ G_DEFINE_TYPE (NautilusColumn, nautilus_column, G_TYPE_OBJECT);
  * SECTION:nautilus-column
  * @title: NautilusColumn
  * @short_description: List view column descriptor object
- * @include: libnautilus-extension/nautilus-column.h
  *
  * #NautilusColumn is an object that describes a column in the file manager
  * list view. Extensions can provide #NautilusColumn by registering a
@@ -112,43 +111,43 @@ nautilus_column_get_property (GObject    *object,
     {
         case PROP_NAME:
         {
-            g_value_set_string (value, column->details->name);
+            g_value_set_string (value, column->name);
         }
         break;
 
         case PROP_ATTRIBUTE:
         {
-            g_value_set_string (value, g_quark_to_string (column->details->attribute));
+            g_value_set_string (value, g_quark_to_string (column->attribute));
         }
         break;
 
         case PROP_ATTRIBUTE_Q:
         {
-            g_value_set_uint (value, column->details->attribute);
+            g_value_set_uint (value, column->attribute);
         }
         break;
 
         case PROP_LABEL:
         {
-            g_value_set_string (value, column->details->label);
+            g_value_set_string (value, column->label);
         }
         break;
 
         case PROP_DESCRIPTION:
         {
-            g_value_set_string (value, column->details->description);
+            g_value_set_string (value, column->description);
         }
         break;
 
         case PROP_XALIGN:
         {
-            g_value_set_float (value, column->details->xalign);
+            g_value_set_float (value, column->xalign);
         }
         break;
 
         case PROP_DEFAULT_SORT_ORDER:
         {
-            g_value_set_enum (value, column->details->default_sort_order);
+            g_value_set_enum (value, column->default_sort_order);
         }
         break;
 
@@ -174,15 +173,15 @@ nautilus_column_set_property (GObject      *object,
     {
         case PROP_NAME:
         {
-            g_free (column->details->name);
-            column->details->name = g_strdup (g_value_get_string (value));
+            g_free (column->name);
+            column->name = g_strdup (g_value_get_string (value));
             g_object_notify (object, "name");
         }
         break;
 
         case PROP_ATTRIBUTE:
         {
-            column->details->attribute = g_quark_from_string (g_value_get_string (value));
+            column->attribute = g_quark_from_string (g_value_get_string (value));
             g_object_notify (object, "attribute");
             g_object_notify (object, "attribute_q");
         }
@@ -190,30 +189,30 @@ nautilus_column_set_property (GObject      *object,
 
         case PROP_LABEL:
         {
-            g_free (column->details->label);
-            column->details->label = g_strdup (g_value_get_string (value));
+            g_free (column->label);
+            column->label = g_strdup (g_value_get_string (value));
             g_object_notify (object, "label");
         }
         break;
 
         case PROP_DESCRIPTION:
         {
-            g_free (column->details->description);
-            column->details->description = g_strdup (g_value_get_string (value));
+            g_free (column->description);
+            column->description = g_strdup (g_value_get_string (value));
             g_object_notify (object, "description");
         }
         break;
 
         case PROP_XALIGN:
         {
-            column->details->xalign = g_value_get_float (value);
+            column->xalign = g_value_get_float (value);
             g_object_notify (object, "xalign");
         }
         break;
 
         case PROP_DEFAULT_SORT_ORDER:
         {
-            column->details->default_sort_order = g_value_get_enum (value);
+            column->default_sort_order = g_value_get_enum (value);
             g_object_notify (object, "default-sort-order");
         }
         break;
@@ -233,11 +232,9 @@ nautilus_column_finalize (GObject *object)
 
     column = NAUTILUS_COLUMN (object);
 
-    g_free (column->details->name);
-    g_free (column->details->label);
-    g_free (column->details->description);
-
-    g_free (column->details);
+    g_free (column->name);
+    g_free (column->label);
+    g_free (column->description);
 
     G_OBJECT_CLASS (nautilus_column_parent_class)->finalize (object);
 }
@@ -245,8 +242,7 @@ nautilus_column_finalize (GObject *object)
 static void
 nautilus_column_init (NautilusColumn *column)
 {
-    column->details = g_new0 (NautilusColumnDetails, 1);
-    column->details->xalign = 0.0;
+    column->xalign = 0.0;
 }
 
 static void
diff --git a/libnautilus-extension/nautilus-column.h b/libnautilus-extension/nautilus-column.h
index 64de2cb77..c4e3ad9af 100644
--- a/libnautilus-extension/nautilus-column.h
+++ b/libnautilus-extension/nautilus-column.h
@@ -24,37 +24,22 @@
 #ifndef NAUTILUS_COLUMN_H
 #define NAUTILUS_COLUMN_H
 
+#if !defined (NAUTILUS_EXTENSION_H) && !defined (NAUTILUS_COMPILATION)
+#warning "Only <nautilus-extension.h> should be included directly."
+#endif
+
 #include <glib-object.h>
-#include "nautilus-extension-types.h"
 
 G_BEGIN_DECLS
 
-#define NAUTILUS_TYPE_COLUMN            (nautilus_column_get_type())
-#define NAUTILUS_COLUMN(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), NAUTILUS_TYPE_COLUMN, 
NautilusColumn))
-#define NAUTILUS_COLUMN_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), NAUTILUS_TYPE_COLUMN, 
NautilusColumnClass))
-#define NAUTILUS_INFO_IS_COLUMN(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NAUTILUS_TYPE_COLUMN))
-#define NAUTILUS_INFO_IS_COLUMN_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), NAUTILUS_TYPE_COLUMN))
-#define NAUTILUS_COLUMN_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj), NAUTILUS_TYPE_COLUMN, 
NautilusColumnClass))
-
-typedef struct _NautilusColumn        NautilusColumn;
-typedef struct _NautilusColumnDetails NautilusColumnDetails;
-typedef struct _NautilusColumnClass   NautilusColumnClass;
-
-struct _NautilusColumn {
-       GObject parent;
-
-       NautilusColumnDetails *details;
-};
+#define NAUTILUS_TYPE_COLUMN (nautilus_column_get_type())
 
-struct _NautilusColumnClass {
-       GObjectClass parent;
-};
+G_DECLARE_FINAL_TYPE (NautilusColumn, nautilus_column, NAUTILUS, COLUMN, GObject)
 
-GType             nautilus_column_get_type        (void);
-NautilusColumn *  nautilus_column_new             (const char     *name,
-                                                  const char     *attribute,
-                                                  const char     *label,
-                                                  const char     *description);
+NautilusColumn *nautilus_column_new  (const char *name,
+                                      const char *attribute,
+                                      const char *label,
+                                      const char *description);
 
 /* NautilusColumn has the following properties:
  *   name (string)        - the identifier for the column
diff --git a/libnautilus-extension/nautilus-extension-types.h 
b/libnautilus-extension/nautilus-extension-types.h
index ca7ec7fe5..43a0b2056 100644
--- a/libnautilus-extension/nautilus-extension-types.h
+++ b/libnautilus-extension/nautilus-extension-types.h
@@ -1,6 +1,5 @@
-/*
- *  nautilus-info-provider.h - Type definitions for Nautilus extensions
- * 
+/* nautilus-info-provider.h - Type definitions for Nautilus extensions
+ *
  *  Copyright (C) 2003 Novell, Inc.
  *
  *  This library is free software; you can redistribute it and/or
@@ -17,7 +16,7 @@
  *  License along with this library; if not, see <http://www.gnu.org/licenses/>.
  *
  *  Author: Dave Camp <dave ximian com>
- * 
+ *
  */
 
 /* This interface is implemented by Nautilus extensions that want to 
@@ -28,64 +27,8 @@
 #ifndef NAUTILUS_EXTENSION_TYPES_H
 #define NAUTILUS_EXTENSION_TYPES_H
 
-#include <glib-object.h>
-
-G_BEGIN_DECLS
-
-#define NAUTILUS_TYPE_OPERATION_RESULT (nautilus_operation_result_get_type ())
-
-/**
- * NautilusOperationHandle:
- *
- * Handle for asynchronous interfaces. These are opaque handles that must
- * be unique within an extension object. These are returned by operations
- * that return #NAUTILUS_OPERATION_IN_PROGRESS.
- */
-typedef struct _NautilusOperationHandle NautilusOperationHandle;
-
-/**
- * NautilusOperationResult:
- * @NAUTILUS_OPERATION_COMPLETE: the operation succeeded, and the extension
- *  is done with the request.
- * @NAUTILUS_OPERATION_FAILED: the operation failed.
- * @NAUTILUS_OPERATION_IN_PROGRESS: the extension has begin an async operation.
- *  When this value is returned, the extension must set the handle parameter
- *  and call the callback closure when the operation is complete.
- *
- * Return values for asynchronous operations performed by the extension.
- * See nautilus_info_provider_update_file_info().
- */
-typedef enum {
-       /* Returned if the call succeeded, and the extension is done 
-        * with the request */
-       NAUTILUS_OPERATION_COMPLETE,
-
-       /* Returned if the call failed */
-       NAUTILUS_OPERATION_FAILED,
-
-       /* Returned if the extension has begun an async operation. 
-        * If this is returned, the extension must set the handle 
-        * parameter and call the callback closure when the 
-        * operation is complete. */
-       NAUTILUS_OPERATION_IN_PROGRESS
-} NautilusOperationResult;
-
-GType nautilus_operation_result_get_type (void);
-
-/**
- * SECTION:nautilus-extension-types
- * @title: NautilusModule
- * @short_description: Initialize an extension
- * @include: libnautilus-extension/nautilus-extension-types.h
- *
- * Methods that each extension implements.
- */
-
-void nautilus_module_initialize (GTypeModule  *module);
-void nautilus_module_shutdown   (void);
-void nautilus_module_list_types (const GType **types,
-                                int          *num_types);
+#include <nautilus-extension.h>
 
-G_END_DECLS
+#warning "This header is deprecated, include <nautilus-extension.h> instead."
 
 #endif
diff --git a/libnautilus-extension/nautilus-extension.h b/libnautilus-extension/nautilus-extension.h
new file mode 100644
index 000000000..26159d1e8
--- /dev/null
+++ b/libnautilus-extension/nautilus-extension.h
@@ -0,0 +1,43 @@
+/* Copyright (C) 2018 Ernestas Kulik <ernestask gnome org>
+ *
+ * This file is part of libnautilus-extension.
+ *
+ * libnautilus-extension is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation, either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * libnautilus-extension is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with libnautilus-extension.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#ifndef NAUTILUS_EXTENSION_H
+#define NAUTILUS_EXTENSION_H
+
+#include <libnautilus-extension/nautilus-column-provider.h>
+#include <libnautilus-extension/nautilus-column.h>
+#include <libnautilus-extension/nautilus-extension-enum-types.h>
+#include <libnautilus-extension/nautilus-file-info.h>
+#include <libnautilus-extension/nautilus-info-provider.h>
+#include <libnautilus-extension/nautilus-location-widget-provider.h>
+#include <libnautilus-extension/nautilus-menu.h>
+#include <libnautilus-extension/nautilus-menu-provider.h>
+#include <libnautilus-extension/nautilus-property-page.h>
+#include <libnautilus-extension/nautilus-property-page-provider.h>
+
+/**
+ * SECTION:nautilus-extension
+ * @title: Extension entry points
+ */
+
+void nautilus_module_initialize (GTypeModule  *module);
+void nautilus_module_shutdown   (void);
+void nautilus_module_list_types (const GType **types,
+                                 int          *num_types);
+
+#endif
diff --git a/libnautilus-extension/nautilus-file-info.c b/libnautilus-extension/nautilus-file-info.c
index 2f2a46b93..db02a0b11 100644
--- a/libnautilus-extension/nautilus-file-info.c
+++ b/libnautilus-extension/nautilus-file-info.c
@@ -18,17 +18,18 @@
  *
  */
 
-#include <config.h>
 #include "nautilus-file-info.h"
+
 #include "nautilus-extension-private.h"
 
+G_DEFINE_INTERFACE (NautilusFileInfo, nautilus_file_info, G_TYPE_OBJECT)
+
 NautilusFileInfo *(*nautilus_file_info_getter)(GFile * location, gboolean create);
 
 /**
  * SECTION:nautilus-file-info
  * @title: NautilusFileInfo
  * @short_description: File interface for nautilus extensions
- * @include: libnautilus-extension/nautilus-file-info.h
  *
  * #NautilusFileInfo provides methods to get and modify information
  * about file objects in the file manager.
@@ -76,246 +77,309 @@ nautilus_file_info_list_free (GList *files)
 }
 
 static void
-nautilus_file_info_base_init (gpointer g_class)
+nautilus_file_info_default_init (NautilusFileInfoInterface *klass)
 {
 }
 
-GType
-nautilus_file_info_get_type (void)
+gboolean
+nautilus_file_info_is_gone (NautilusFileInfo *self)
 {
-    static GType type = 0;
+    NautilusFileInfoInterface *iface;
 
-    if (!type)
-    {
-        const GTypeInfo info =
-        {
-            sizeof (NautilusFileInfoIface),
-            nautilus_file_info_base_init,
-            NULL,
-            NULL,
-            NULL,
-            NULL,
-            0,
-            0,
-            NULL
-        };
-
-        type = g_type_register_static (G_TYPE_INTERFACE,
-                                       "NautilusFileInfo",
-                                       &info, 0);
-        g_type_interface_add_prerequisite (type, G_TYPE_OBJECT);
-    }
+    g_return_val_if_fail (NAUTILUS_IS_FILE_INFO (self), FALSE);
 
-    return type;
-}
+    iface = NAUTILUS_FILE_INFO_GET_IFACE (self);
 
-gboolean
-nautilus_file_info_is_gone (NautilusFileInfo *file)
-{
-    g_return_val_if_fail (NAUTILUS_IS_FILE_INFO (file), FALSE);
-    g_return_val_if_fail (NAUTILUS_FILE_INFO_GET_IFACE (file)->is_gone != NULL, FALSE);
+    g_return_val_if_fail (iface->is_gone != NULL, FALSE);
 
-    return NAUTILUS_FILE_INFO_GET_IFACE (file)->is_gone (file);
+    return iface->is_gone (self);
 }
 
 GFileType
-nautilus_file_info_get_file_type (NautilusFileInfo *file)
+nautilus_file_info_get_file_type (NautilusFileInfo *self)
 {
-    g_return_val_if_fail (NAUTILUS_IS_FILE_INFO (file), G_FILE_TYPE_UNKNOWN);
-    g_return_val_if_fail (NAUTILUS_FILE_INFO_GET_IFACE (file)->get_file_type != NULL, G_FILE_TYPE_UNKNOWN);
+    NautilusFileInfoInterface *iface;
+
+    g_return_val_if_fail (NAUTILUS_IS_FILE_INFO (self), G_FILE_TYPE_UNKNOWN);
 
-    return NAUTILUS_FILE_INFO_GET_IFACE (file)->get_file_type (file);
+    iface = NAUTILUS_FILE_INFO_GET_IFACE (self);
+
+    g_return_val_if_fail (iface->get_file_type != NULL, G_FILE_TYPE_UNKNOWN);
+
+    return iface->get_file_type (self);
 }
 
 char *
-nautilus_file_info_get_name (NautilusFileInfo *file)
+nautilus_file_info_get_name (NautilusFileInfo *self)
 {
-    g_return_val_if_fail (NAUTILUS_IS_FILE_INFO (file), NULL);
-    g_return_val_if_fail (NAUTILUS_FILE_INFO_GET_IFACE (file)->get_name != NULL, NULL);
+    NautilusFileInfoInterface *iface;
+
+    g_return_val_if_fail (NAUTILUS_IS_FILE_INFO (self), NULL);
+
+    iface = NAUTILUS_FILE_INFO_GET_IFACE (self);
 
-    return NAUTILUS_FILE_INFO_GET_IFACE (file)->get_name (file);
+    g_return_val_if_fail (iface->get_name != NULL, NULL);
+
+    return iface->get_name (self);
 }
 
 /**
  * nautilus_file_info_get_location:
- * @file: a #NautilusFileInfo
+ * @file_info: a #NautilusFileInfo
  *
- * Returns: (transfer full): a #GFile for the location of @file
+ * Returns: (transfer full): a #GFile for the location of @file_info
  */
 GFile *
-nautilus_file_info_get_location (NautilusFileInfo *file)
+nautilus_file_info_get_location (NautilusFileInfo *self)
 {
-    g_return_val_if_fail (NAUTILUS_IS_FILE_INFO (file), NULL);
-    g_return_val_if_fail (NAUTILUS_FILE_INFO_GET_IFACE (file)->get_location != NULL, NULL);
+    NautilusFileInfoInterface *iface;
+
+    g_return_val_if_fail (NAUTILUS_IS_FILE_INFO (self), NULL);
+
+    iface = NAUTILUS_FILE_INFO_GET_IFACE (self);
+
+    g_return_val_if_fail (iface->get_location != NULL, NULL);
 
-    return NAUTILUS_FILE_INFO_GET_IFACE (file)->get_location (file);
+    return iface->get_location (self);
 }
 char *
-nautilus_file_info_get_uri (NautilusFileInfo *file)
+nautilus_file_info_get_uri (NautilusFileInfo *self)
 {
-    g_return_val_if_fail (NAUTILUS_IS_FILE_INFO (file), NULL);
-    g_return_val_if_fail (NAUTILUS_FILE_INFO_GET_IFACE (file)->get_uri != NULL, NULL);
+    NautilusFileInfoInterface *iface;
 
-    return NAUTILUS_FILE_INFO_GET_IFACE (file)->get_uri (file);
+    g_return_val_if_fail (NAUTILUS_IS_FILE_INFO (self), NULL);
+
+    iface = NAUTILUS_FILE_INFO_GET_IFACE (self);
+
+    g_return_val_if_fail (iface->get_uri != NULL, NULL);
+
+    return iface->get_uri (self);
 }
 
 char *
-nautilus_file_info_get_activation_uri (NautilusFileInfo *file)
+nautilus_file_info_get_activation_uri (NautilusFileInfo *self)
 {
-    g_return_val_if_fail (NAUTILUS_IS_FILE_INFO (file), NULL);
-    g_return_val_if_fail (NAUTILUS_FILE_INFO_GET_IFACE (file)->get_activation_uri != NULL, NULL);
+    NautilusFileInfoInterface *iface;
+
+    g_return_val_if_fail (NAUTILUS_IS_FILE_INFO (self), NULL);
 
-    return NAUTILUS_FILE_INFO_GET_IFACE (file)->get_activation_uri (file);
+    iface = NAUTILUS_FILE_INFO_GET_IFACE (self);
+
+    g_return_val_if_fail (iface->get_activation_uri != NULL, NULL);
+
+    return iface->get_activation_uri (self);
 }
 
 /**
  * nautilus_file_info_get_parent_location:
- * @file: a #NautilusFileInfo
+ * @file_info: a #NautilusFileInfo
  *
- * Returns: (allow-none) (transfer full): a #GFile for the parent location of @file,
- *   or %NULL if @file has no parent
+ * Returns: (allow-none) (transfer full): a #GFile for the parent location of @file_info,
+ *   or %NULL if @file_info has no parent
  */
 GFile *
-nautilus_file_info_get_parent_location (NautilusFileInfo *file)
+nautilus_file_info_get_parent_location (NautilusFileInfo *self)
 {
-    g_return_val_if_fail (NAUTILUS_IS_FILE_INFO (file), NULL);
-    g_return_val_if_fail (NAUTILUS_FILE_INFO_GET_IFACE (file)->get_parent_location != NULL, NULL);
+    NautilusFileInfoInterface *iface;
+
+    g_return_val_if_fail (NAUTILUS_IS_FILE_INFO (self), NULL);
+
+    iface = NAUTILUS_FILE_INFO_GET_IFACE (self);
 
-    return NAUTILUS_FILE_INFO_GET_IFACE (file)->get_parent_location (file);
+    g_return_val_if_fail (iface->get_parent_location != NULL, NULL);
+
+    return iface->get_parent_location (self);
 }
 
 char *
-nautilus_file_info_get_parent_uri (NautilusFileInfo *file)
+nautilus_file_info_get_parent_uri (NautilusFileInfo *self)
 {
-    g_return_val_if_fail (NAUTILUS_IS_FILE_INFO (file), NULL);
-    g_return_val_if_fail (NAUTILUS_FILE_INFO_GET_IFACE (file)->get_parent_uri != NULL, NULL);
+    NautilusFileInfoInterface *iface;
+
+    g_return_val_if_fail (NAUTILUS_IS_FILE_INFO (self), NULL);
+
+    iface = NAUTILUS_FILE_INFO_GET_IFACE (self);
+
+    g_return_val_if_fail (iface->get_parent_uri != NULL, NULL);
 
-    return NAUTILUS_FILE_INFO_GET_IFACE (file)->get_parent_uri (file);
+    return iface->get_parent_uri (self);
 }
 
 /**
  * nautilus_file_info_get_parent_info:
- * @file: a #NautilusFileInfo
+ * @file_info: a #NautilusFileInfo
  *
- * Returns: (allow-none) (transfer full): a #NautilusFileInfo for the parent of @file,
- *   or %NULL if @file has no parent
+ * Returns: (allow-none) (transfer full): a #NautilusFileInfo for the parent of @file_info,
+ *   or %NULL if @file_info has no parent
  */
 NautilusFileInfo *
-nautilus_file_info_get_parent_info (NautilusFileInfo *file)
+nautilus_file_info_get_parent_info (NautilusFileInfo *self)
 {
-    g_return_val_if_fail (NAUTILUS_IS_FILE_INFO (file), NULL);
-    g_return_val_if_fail (NAUTILUS_FILE_INFO_GET_IFACE (file)->get_parent_info != NULL, NULL);
+    NautilusFileInfoInterface *iface;
 
-    return NAUTILUS_FILE_INFO_GET_IFACE (file)->get_parent_info (file);
+    g_return_val_if_fail (NAUTILUS_IS_FILE_INFO (self), NULL);
+
+    iface = NAUTILUS_FILE_INFO_GET_IFACE (self);
+
+    g_return_val_if_fail (iface->get_parent_info != NULL, NULL);
+
+    return iface->get_parent_info (self);
 }
 
 /**
  * nautilus_file_info_get_mount:
- * @file: a #NautilusFileInfo
+ * @file_info: a #NautilusFileInfo
  *
- * Returns: (allow-none) (transfer full): a #GMount for the mount of @file,
- *   or %NULL if @file has no mount
+ * Returns: (allow-none) (transfer full): a #GMount for the mount of @file_info,
+ *   or %NULL if @file_info has no mount
  */
 GMount *
-nautilus_file_info_get_mount (NautilusFileInfo *file)
+nautilus_file_info_get_mount (NautilusFileInfo *self)
 {
-    g_return_val_if_fail (NAUTILUS_IS_FILE_INFO (file), NULL);
-    g_return_val_if_fail (NAUTILUS_FILE_INFO_GET_IFACE (file)->get_mount != NULL, NULL);
+    NautilusFileInfoInterface *iface;
+
+    g_return_val_if_fail (NAUTILUS_IS_FILE_INFO (self), NULL);
 
-    return NAUTILUS_FILE_INFO_GET_IFACE (file)->get_mount (file);
+    iface = NAUTILUS_FILE_INFO_GET_IFACE (self);
+
+    g_return_val_if_fail (iface->get_mount != NULL, NULL);
+
+    return iface->get_mount (self);
 }
 
 char *
-nautilus_file_info_get_uri_scheme (NautilusFileInfo *file)
+nautilus_file_info_get_uri_scheme (NautilusFileInfo *self)
 {
-    g_return_val_if_fail (NAUTILUS_IS_FILE_INFO (file), NULL);
-    g_return_val_if_fail (NAUTILUS_FILE_INFO_GET_IFACE (file)->get_uri_scheme != NULL, NULL);
+    NautilusFileInfoInterface *iface;
+
+    g_return_val_if_fail (NAUTILUS_IS_FILE_INFO (self), NULL);
+
+    iface = NAUTILUS_FILE_INFO_GET_IFACE (self);
+
+    g_return_val_if_fail (iface->get_uri_scheme != NULL, NULL);
 
-    return NAUTILUS_FILE_INFO_GET_IFACE (file)->get_uri_scheme (file);
+    return iface->get_uri_scheme (self);
 }
 
 char *
-nautilus_file_info_get_mime_type (NautilusFileInfo *file)
+nautilus_file_info_get_mime_type (NautilusFileInfo *self)
 {
-    g_return_val_if_fail (NAUTILUS_IS_FILE_INFO (file), NULL);
-    g_return_val_if_fail (NAUTILUS_FILE_INFO_GET_IFACE (file)->get_mime_type != NULL, NULL);
+    NautilusFileInfoInterface *iface;
 
-    return NAUTILUS_FILE_INFO_GET_IFACE (file)->get_mime_type (file);
+    g_return_val_if_fail (NAUTILUS_IS_FILE_INFO (self), NULL);
+
+    iface = NAUTILUS_FILE_INFO_GET_IFACE (self);
+
+    g_return_val_if_fail (iface->get_mime_type != NULL, NULL);
+
+    return iface->get_mime_type (self);
 }
 
 gboolean
-nautilus_file_info_is_mime_type (NautilusFileInfo *file,
+nautilus_file_info_is_mime_type (NautilusFileInfo *self,
                                  const char       *mime_type)
 {
-    g_return_val_if_fail (NAUTILUS_IS_FILE_INFO (file), FALSE);
+    NautilusFileInfoInterface *iface;
+
+    g_return_val_if_fail (NAUTILUS_IS_FILE_INFO (self), FALSE);
     g_return_val_if_fail (mime_type != NULL, FALSE);
-    g_return_val_if_fail (NAUTILUS_FILE_INFO_GET_IFACE (file)->is_mime_type != NULL, FALSE);
 
-    return NAUTILUS_FILE_INFO_GET_IFACE (file)->is_mime_type (file,
-                                                              mime_type);
+    iface = NAUTILUS_FILE_INFO_GET_IFACE (self);
+
+    g_return_val_if_fail (iface->is_mime_type != NULL, FALSE);
+
+    return iface->is_mime_type (self, mime_type);
 }
 
 gboolean
-nautilus_file_info_is_directory (NautilusFileInfo *file)
+nautilus_file_info_is_directory (NautilusFileInfo *self)
 {
-    g_return_val_if_fail (NAUTILUS_IS_FILE_INFO (file), FALSE);
-    g_return_val_if_fail (NAUTILUS_FILE_INFO_GET_IFACE (file)->is_directory != NULL, FALSE);
+    NautilusFileInfoInterface *iface;
+
+    g_return_val_if_fail (NAUTILUS_IS_FILE_INFO (self), FALSE);
+
+    iface = NAUTILUS_FILE_INFO_GET_IFACE (self);
 
-    return NAUTILUS_FILE_INFO_GET_IFACE (file)->is_directory (file);
+    g_return_val_if_fail (iface->is_directory != NULL, FALSE);
+
+    return iface->is_directory (self);
 }
 
 gboolean
-nautilus_file_info_can_write (NautilusFileInfo *file)
+nautilus_file_info_can_write (NautilusFileInfo *self)
 {
-    g_return_val_if_fail (NAUTILUS_IS_FILE_INFO (file), FALSE);
-    g_return_val_if_fail (NAUTILUS_FILE_INFO_GET_IFACE (file)->can_write != NULL, FALSE);
+    NautilusFileInfoInterface *iface;
+
+    g_return_val_if_fail (NAUTILUS_IS_FILE_INFO (self), FALSE);
+
+    iface = NAUTILUS_FILE_INFO_GET_IFACE (self);
+
+    g_return_val_if_fail (iface->can_write != NULL, FALSE);
 
-    return NAUTILUS_FILE_INFO_GET_IFACE (file)->can_write (file);
+    return iface->can_write (self);
 }
 
 void
-nautilus_file_info_add_emblem (NautilusFileInfo *file,
+nautilus_file_info_add_emblem (NautilusFileInfo *self,
                                const char       *emblem_name)
 {
-    g_return_if_fail (NAUTILUS_IS_FILE_INFO (file));
-    g_return_if_fail (NAUTILUS_FILE_INFO_GET_IFACE (file)->add_emblem != NULL);
+    NautilusFileInfoInterface *iface;
 
-    NAUTILUS_FILE_INFO_GET_IFACE (file)->add_emblem (file, emblem_name);
+    g_return_if_fail (NAUTILUS_IS_FILE_INFO (self));
+
+    iface = NAUTILUS_FILE_INFO_GET_IFACE (self);
+
+    g_return_if_fail (iface->add_emblem != NULL);
+
+    iface->add_emblem (self, emblem_name);
 }
 
 char *
-nautilus_file_info_get_string_attribute (NautilusFileInfo *file,
+nautilus_file_info_get_string_attribute (NautilusFileInfo *self,
                                          const char       *attribute_name)
 {
-    g_return_val_if_fail (NAUTILUS_IS_FILE_INFO (file), NULL);
-    g_return_val_if_fail (NAUTILUS_FILE_INFO_GET_IFACE (file)->get_string_attribute != NULL, NULL);
+    NautilusFileInfoInterface *iface;
+
+    g_return_val_if_fail (NAUTILUS_IS_FILE_INFO (self), NULL);
     g_return_val_if_fail (attribute_name != NULL, NULL);
 
-    return NAUTILUS_FILE_INFO_GET_IFACE (file)->get_string_attribute
-               (file, attribute_name);
+    iface = NAUTILUS_FILE_INFO_GET_IFACE (self);
+
+    g_return_val_if_fail (iface->get_string_attribute != NULL, NULL);
+
+    return iface->get_string_attribute (self, attribute_name);
 }
 
 void
-nautilus_file_info_add_string_attribute (NautilusFileInfo *file,
+nautilus_file_info_add_string_attribute (NautilusFileInfo *self,
                                          const char       *attribute_name,
                                          const char       *value)
 {
-    g_return_if_fail (NAUTILUS_IS_FILE_INFO (file));
-    g_return_if_fail (NAUTILUS_FILE_INFO_GET_IFACE (file)->add_string_attribute != NULL);
+    NautilusFileInfoInterface *iface;
+
+    g_return_if_fail (NAUTILUS_IS_FILE_INFO (self));
     g_return_if_fail (attribute_name != NULL);
     g_return_if_fail (value != NULL);
 
-    NAUTILUS_FILE_INFO_GET_IFACE (file)->add_string_attribute
-        (file, attribute_name, value);
+    iface = NAUTILUS_FILE_INFO_GET_IFACE (self);
+
+    g_return_if_fail (iface->add_string_attribute != NULL);
+
+    iface->add_string_attribute (self, attribute_name, value);
 }
 
 void
-nautilus_file_info_invalidate_extension_info (NautilusFileInfo *file)
+nautilus_file_info_invalidate_extension_info (NautilusFileInfo *self)
 {
-    g_return_if_fail (NAUTILUS_IS_FILE_INFO (file));
-    g_return_if_fail (NAUTILUS_FILE_INFO_GET_IFACE (file)->invalidate_extension_info != NULL);
+    NautilusFileInfoInterface *iface;
+
+    g_return_if_fail (NAUTILUS_IS_FILE_INFO (self));
+
+    iface = NAUTILUS_FILE_INFO_GET_IFACE (self);
+
+    g_return_if_fail (iface->invalidate_extension_info != NULL);
 
-    NAUTILUS_FILE_INFO_GET_IFACE (file)->invalidate_extension_info (file);
+    iface->invalidate_extension_info (self);
 }
 
 /**
@@ -327,6 +391,8 @@ nautilus_file_info_invalidate_extension_info (NautilusFileInfo *file)
 NautilusFileInfo *
 nautilus_file_info_lookup (GFile *location)
 {
+    g_return_val_if_fail (G_IS_FILE (location), NULL);
+
     return nautilus_file_info_getter (location, FALSE);
 }
 
@@ -339,6 +405,8 @@ nautilus_file_info_lookup (GFile *location)
 NautilusFileInfo *
 nautilus_file_info_create (GFile *location)
 {
+    g_return_val_if_fail (G_IS_FILE (location), NULL);
+
     return nautilus_file_info_getter (location, TRUE);
 }
 
@@ -351,14 +419,13 @@ nautilus_file_info_create (GFile *location)
 NautilusFileInfo *
 nautilus_file_info_lookup_for_uri (const char *uri)
 {
-    GFile *location;
-    NautilusFile *file;
+    g_autoptr (GFile) location = NULL;
+
+    g_return_val_if_fail (uri != NULL, NULL);
 
     location = g_file_new_for_uri (uri);
-    file = nautilus_file_info_lookup (location);
-    g_object_unref (location);
 
-    return file;
+    return nautilus_file_info_lookup (location);
 }
 
 /**
@@ -370,12 +437,11 @@ nautilus_file_info_lookup_for_uri (const char *uri)
 NautilusFileInfo *
 nautilus_file_info_create_for_uri (const char *uri)
 {
-    GFile *location;
-    NautilusFile *file;
+    g_autoptr (GFile) location = NULL;
+
+    g_return_val_if_fail (uri != NULL, NULL);
 
     location = g_file_new_for_uri (uri);
-    file = nautilus_file_info_create (location);
-    g_object_unref (location);
 
-    return file;
+    return nautilus_file_info_create (location);
 }
diff --git a/libnautilus-extension/nautilus-file-info.h b/libnautilus-extension/nautilus-file-info.h
index 4660ad7c2..0e7ea8539 100644
--- a/libnautilus-extension/nautilus-file-info.h
+++ b/libnautilus-extension/nautilus-file-info.h
@@ -25,28 +25,29 @@
 #ifndef NAUTILUS_FILE_INFO_H
 #define NAUTILUS_FILE_INFO_H
 
+#if !defined (NAUTILUS_EXTENSION_H) && !defined (NAUTILUS_COMPILATION)
+#warning "Only <nautilus-extension.h> should be included directly."
+#endif
+
 #include <glib-object.h>
 #include <gio/gio.h>
 
 G_BEGIN_DECLS
 
-#define NAUTILUS_TYPE_FILE_INFO           (nautilus_file_info_get_type ())
-#define NAUTILUS_FILE_INFO(obj)           (G_TYPE_CHECK_INSTANCE_CAST ((obj), NAUTILUS_TYPE_FILE_INFO, 
NautilusFileInfo))
-#define NAUTILUS_IS_FILE_INFO(obj)        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NAUTILUS_TYPE_FILE_INFO))
-#define NAUTILUS_FILE_INFO_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), NAUTILUS_TYPE_FILE_INFO, 
NautilusFileInfoIface))
+#define NAUTILUS_TYPE_FILE_INFO (nautilus_file_info_get_type ())
 
-#ifndef NAUTILUS_FILE_DEFINED
-#define NAUTILUS_FILE_DEFINED
-/* Using NautilusFile for the vtable to make implementing this in 
- * NautilusFile easier */
-typedef struct NautilusFile          NautilusFile;
-#endif
+G_DECLARE_INTERFACE (NautilusFileInfo, nautilus_file_info, NAUTILUS, FILE_INFO, GObject)
 
-typedef NautilusFile                  NautilusFileInfo;
-typedef struct _NautilusFileInfoIface NautilusFileInfoIface;
+/* For compatibility reasons, remove this once you start introducing breaking changes.
+ *
+ * I’ve only noticed nautilus-python depending on this, but the context is that
+ * NautilusFileInfo used to be an alias for NautilusFile to make it easier to
+ * implement the interface,
+ */
+typedef struct NautilusFile NautilusFile;
 
 /**
- * NautilusFileInfoIface:
+ * NautilusFileInfoInterface:
  * @g_iface: The parent interface.
  * @is_gone: Returns whether the file info is gone.
  *   See nautilus_file_info_is_gone() for details.
@@ -89,83 +90,81 @@ typedef struct _NautilusFileInfoIface NautilusFileInfoIface;
  *
  * Interface for extensions to provide additional menu items.
  */
-struct _NautilusFileInfoIface 
+struct _NautilusFileInfoInterface
 {
-       GTypeInterface g_iface;
-
-       gboolean          (*is_gone)              (NautilusFileInfo *file);
-       
-       char *            (*get_name)             (NautilusFileInfo *file);
-       char *            (*get_uri)              (NautilusFileInfo *file);
-       char *            (*get_parent_uri)       (NautilusFileInfo *file);
-       char *            (*get_uri_scheme)       (NautilusFileInfo *file);
-       
-       char *            (*get_mime_type)        (NautilusFileInfo *file);
-       gboolean          (*is_mime_type)         (NautilusFileInfo *file,
-                                                  const char       *mime_Type);
-       gboolean          (*is_directory)         (NautilusFileInfo *file);
-       
-       void              (*add_emblem)           (NautilusFileInfo *file,
-                                                  const char       *emblem_name);
-       char *            (*get_string_attribute) (NautilusFileInfo *file,
-                                                  const char       *attribute_name);
-       void              (*add_string_attribute) (NautilusFileInfo *file,
-                                                  const char       *attribute_name,
-                                                  const char       *value);
-       void              (*invalidate_extension_info) (NautilusFileInfo *file);
-       
-       char *            (*get_activation_uri)   (NautilusFileInfo *file);
-
-       GFileType         (*get_file_type)        (NautilusFileInfo *file);
-       GFile *           (*get_location)         (NautilusFileInfo *file);
-       GFile *           (*get_parent_location)  (NautilusFileInfo *file);
-       NautilusFileInfo* (*get_parent_info)      (NautilusFileInfo *file);
-       GMount *          (*get_mount)            (NautilusFileInfo *file);
-       gboolean          (*can_write)            (NautilusFileInfo *file);
-  
+    GTypeInterface g_iface;
+
+    gboolean          (*is_gone)                   (NautilusFileInfo *file_info);
+
+    char             *(*get_name)                  (NautilusFileInfo *file_info);
+    char             *(*get_uri)                   (NautilusFileInfo *file_info);
+    char             *(*get_parent_uri)            (NautilusFileInfo *file_info);
+    char             *(*get_uri_scheme)            (NautilusFileInfo *file_info);
+
+    char             *(*get_mime_type)             (NautilusFileInfo *file_info);
+    gboolean          (*is_mime_type)              (NautilusFileInfo *file_info,
+                                                    const char       *mime_type);
+    gboolean          (*is_directory)              (NautilusFileInfo *file_info);
+
+    void              (*add_emblem)                (NautilusFileInfo *file_info,
+                                                    const char       *emblem_name);
+    char             *(*get_string_attribute)      (NautilusFileInfo *file_info,
+                                                    const char       *attribute_name);
+    void              (*add_string_attribute)      (NautilusFileInfo *file_info,
+                                                    const char       *attribute_name,
+                                                    const char       *value);
+    void              (*invalidate_extension_info) (NautilusFileInfo *file_info);
+
+    char             *(*get_activation_uri)        (NautilusFileInfo *file_info);
+
+    GFileType         (*get_file_type)             (NautilusFileInfo *file_info);
+    GFile            *(*get_location)              (NautilusFileInfo *file_info);
+    GFile            *(*get_parent_location)       (NautilusFileInfo *file_info);
+    NautilusFileInfo *(*get_parent_info)           (NautilusFileInfo *file_info);
+    GMount           *(*get_mount)                 (NautilusFileInfo *file_info);
+    gboolean          (*can_write)                 (NautilusFileInfo *file_info);
 };
 
 GList            *nautilus_file_info_list_copy            (GList            *files);
 void              nautilus_file_info_list_free            (GList            *files);
-GType             nautilus_file_info_get_type             (void);
 
 /* Return true if the file has been deleted */
-gboolean          nautilus_file_info_is_gone              (NautilusFileInfo *file);
+gboolean          nautilus_file_info_is_gone              (NautilusFileInfo *file_info);
 
 /* Name and Location */
-GFileType         nautilus_file_info_get_file_type        (NautilusFileInfo *file);
-GFile *           nautilus_file_info_get_location         (NautilusFileInfo *file);
-char *            nautilus_file_info_get_name             (NautilusFileInfo *file);
-char *            nautilus_file_info_get_uri              (NautilusFileInfo *file);
-char *            nautilus_file_info_get_activation_uri   (NautilusFileInfo *file);
-GFile *           nautilus_file_info_get_parent_location  (NautilusFileInfo *file);
-char *            nautilus_file_info_get_parent_uri       (NautilusFileInfo *file);
-GMount *          nautilus_file_info_get_mount            (NautilusFileInfo *file);
-char *            nautilus_file_info_get_uri_scheme       (NautilusFileInfo *file);
+GFileType         nautilus_file_info_get_file_type        (NautilusFileInfo *file_info);
+GFile            *nautilus_file_info_get_location         (NautilusFileInfo *file_info);
+char             *nautilus_file_info_get_name             (NautilusFileInfo *file_info);
+char             *nautilus_file_info_get_uri              (NautilusFileInfo *file_info);
+char             *nautilus_file_info_get_activation_uri   (NautilusFileInfo *file_info);
+GFile            *nautilus_file_info_get_parent_location  (NautilusFileInfo *file_info);
+char             *nautilus_file_info_get_parent_uri       (NautilusFileInfo *file_info);
+GMount           *nautilus_file_info_get_mount            (NautilusFileInfo *file_info);
+char             *nautilus_file_info_get_uri_scheme       (NautilusFileInfo *file_info);
 /* It's not safe to call this recursively multiple times, as it works
  * only for files already cached by Nautilus.
  */
-NautilusFileInfo* nautilus_file_info_get_parent_info      (NautilusFileInfo *file);
+NautilusFileInfo *nautilus_file_info_get_parent_info      (NautilusFileInfo *file_info);
 
 /* File Type */
-char *            nautilus_file_info_get_mime_type        (NautilusFileInfo *file);
-gboolean          nautilus_file_info_is_mime_type         (NautilusFileInfo *file,
-                                                          const char       *mime_type);
-gboolean          nautilus_file_info_is_directory         (NautilusFileInfo *file);
-gboolean          nautilus_file_info_can_write            (NautilusFileInfo *file);
+char *            nautilus_file_info_get_mime_type        (NautilusFileInfo *file_info);
+gboolean          nautilus_file_info_is_mime_type         (NautilusFileInfo *file_info,
+                                                           const char       *mime_type);
+gboolean          nautilus_file_info_is_directory         (NautilusFileInfo *file_info);
+gboolean          nautilus_file_info_can_write            (NautilusFileInfo *file_info);
 
 
 /* Modifying the NautilusFileInfo */
-void              nautilus_file_info_add_emblem           (NautilusFileInfo *file,
-                                                          const char       *emblem_name);
-char *            nautilus_file_info_get_string_attribute (NautilusFileInfo *file,
-                                                          const char       *attribute_name);
-void              nautilus_file_info_add_string_attribute (NautilusFileInfo *file,
-                                                          const char       *attribute_name,
-                                                          const char       *value);
+void              nautilus_file_info_add_emblem           (NautilusFileInfo *file_info,
+                                                           const char       *emblem_name);
+char             *nautilus_file_info_get_string_attribute (NautilusFileInfo *file_info,
+                                                           const char       *attribute_name);
+void              nautilus_file_info_add_string_attribute (NautilusFileInfo *file_info,
+                                                           const char       *attribute_name,
+                                                           const char       *value);
 
 /* Invalidating file info */
-void              nautilus_file_info_invalidate_extension_info (NautilusFileInfo *file);
+void              nautilus_file_info_invalidate_extension_info (NautilusFileInfo *file_info);
 
 NautilusFileInfo *nautilus_file_info_lookup                (GFile *location);
 NautilusFileInfo *nautilus_file_info_create                (GFile *location);
diff --git a/libnautilus-extension/nautilus-info-provider.c b/libnautilus-extension/nautilus-info-provider.c
index 359bf8e24..37e95b2b0 100644
--- a/libnautilus-extension/nautilus-info-provider.c
+++ b/libnautilus-extension/nautilus-info-provider.c
@@ -21,16 +21,16 @@
  *
  */
 
-#include <config.h>
 #include "nautilus-info-provider.h"
 
-#include <glib-object.h>
+#include "nautilus-extension-enum-types.h"
+
+G_DEFINE_INTERFACE (NautilusInfoProvider, nautilus_info_provider, G_TYPE_OBJECT)
 
 /**
  * SECTION:nautilus-info-provider
  * @title: NautilusInfoProvider
  * @short_description: Interface to provide additional information about files
- * @include: libnautilus-extension/nautilus-column-provider.h
  *
  * #NautilusInfoProvider allows extension to provide additional information about
  * files. When nautilus_info_provider_update_file_info() is called by the application,
@@ -39,68 +39,46 @@
  */
 
 static void
-nautilus_info_provider_base_init (gpointer g_class)
-{
-}
-
-GType
-nautilus_info_provider_get_type (void)
+nautilus_info_provider_default_init (NautilusInfoProviderInterface *klass)
 {
-    static GType type = 0;
-
-    if (!type)
-    {
-        const GTypeInfo info =
-        {
-            sizeof (NautilusInfoProviderIface),
-            nautilus_info_provider_base_init,
-            NULL,
-            NULL,
-            NULL,
-            NULL,
-            0,
-            0,
-            NULL
-        };
-
-        type = g_type_register_static (G_TYPE_INTERFACE,
-                                       "NautilusInfoProvider",
-                                       &info, 0);
-        g_type_interface_add_prerequisite (type, G_TYPE_OBJECT);
-    }
-
-    return type;
 }
 
 NautilusOperationResult
-nautilus_info_provider_update_file_info (NautilusInfoProvider     *provider,
+nautilus_info_provider_update_file_info (NautilusInfoProvider     *self,
                                          NautilusFileInfo         *file,
                                          GClosure                 *update_complete,
                                          NautilusOperationHandle **handle)
 {
-    g_return_val_if_fail (NAUTILUS_IS_INFO_PROVIDER (provider),
-                          NAUTILUS_OPERATION_FAILED);
-    g_return_val_if_fail (NAUTILUS_INFO_PROVIDER_GET_IFACE (provider)->update_file_info != NULL,
+    NautilusInfoProviderInterface *iface;
+
+    g_return_val_if_fail (NAUTILUS_IS_INFO_PROVIDER (self),
                           NAUTILUS_OPERATION_FAILED);
     g_return_val_if_fail (update_complete != NULL,
                           NAUTILUS_OPERATION_FAILED);
     g_return_val_if_fail (handle != NULL, NAUTILUS_OPERATION_FAILED);
 
-    return NAUTILUS_INFO_PROVIDER_GET_IFACE (provider)->update_file_info
-               (provider, file, update_complete, handle);
+    iface = NAUTILUS_INFO_PROVIDER_GET_IFACE (self);
+
+    g_return_val_if_fail (iface->update_file_info != NULL,
+                          NAUTILUS_OPERATION_FAILED);
+
+    return iface->update_file_info (self, file, update_complete, handle);
 }
 
 void
-nautilus_info_provider_cancel_update (NautilusInfoProvider    *provider,
+nautilus_info_provider_cancel_update (NautilusInfoProvider    *self,
                                       NautilusOperationHandle *handle)
 {
-    g_return_if_fail (NAUTILUS_IS_INFO_PROVIDER (provider));
-    g_return_if_fail (NAUTILUS_INFO_PROVIDER_GET_IFACE (provider)->cancel_update != NULL);
-    g_return_if_fail (NAUTILUS_INFO_PROVIDER_GET_IFACE (provider)->cancel_update != NULL);
+    NautilusInfoProviderInterface *iface;
+
+    g_return_if_fail (NAUTILUS_IS_INFO_PROVIDER (self));
     g_return_if_fail (handle != NULL);
 
-    NAUTILUS_INFO_PROVIDER_GET_IFACE (provider)->cancel_update (provider,
-                                                                handle);
+    iface = NAUTILUS_INFO_PROVIDER_GET_IFACE (self);
+
+    g_return_if_fail (iface->cancel_update != NULL);
+
+    iface->cancel_update (self, handle);
 }
 
 void
diff --git a/libnautilus-extension/nautilus-info-provider.h b/libnautilus-extension/nautilus-info-provider.h
index 6d70887e9..479f19b28 100644
--- a/libnautilus-extension/nautilus-info-provider.h
+++ b/libnautilus-extension/nautilus-info-provider.h
@@ -29,26 +29,63 @@
 #ifndef NAUTILUS_INFO_PROVIDER_H
 #define NAUTILUS_INFO_PROVIDER_H
 
+#if !defined (NAUTILUS_EXTENSION_H) && !defined (NAUTILUS_COMPILATION)
+#warning "Only <nautilus-extension.h> should be included directly."
+#endif
+
 #include <glib-object.h>
-#include "nautilus-extension-types.h"
 #include "nautilus-file-info.h"
 
 G_BEGIN_DECLS
 
-#define NAUTILUS_TYPE_INFO_PROVIDER           (nautilus_info_provider_get_type ())
-#define NAUTILUS_INFO_PROVIDER(obj)           (G_TYPE_CHECK_INSTANCE_CAST ((obj), 
NAUTILUS_TYPE_INFO_PROVIDER, NautilusInfoProvider))
-#define NAUTILUS_IS_INFO_PROVIDER(obj)        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), 
NAUTILUS_TYPE_INFO_PROVIDER))
-#define NAUTILUS_INFO_PROVIDER_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), 
NAUTILUS_TYPE_INFO_PROVIDER, NautilusInfoProviderIface))
+#define NAUTILUS_TYPE_INFO_PROVIDER (nautilus_info_provider_get_type ())
+
+G_DECLARE_INTERFACE (NautilusInfoProvider, nautilus_info_provider,
+                     NAUTILUS, INFO_PROVIDER,
+                     GObject)
+
+/* For compatibility reasons, remove this once you start introducing breaking changes. */
+typedef NautilusInfoProviderInterface NautilusInfoProviderIface;
+
+/**
+ * NautilusOperationHandle:
+ *
+ * Handle for asynchronous interfaces. These are opaque handles that must
+ * be unique within an extension object. These are returned by operations
+ * that return #NAUTILUS_OPERATION_IN_PROGRESS.
+ */
+typedef struct _NautilusOperationHandle NautilusOperationHandle;
+
+/**
+ * NautilusOperationResult:
+ * @NAUTILUS_OPERATION_COMPLETE: the operation succeeded, and the extension
+ *  is done with the request.
+ * @NAUTILUS_OPERATION_FAILED: the operation failed.
+ * @NAUTILUS_OPERATION_IN_PROGRESS: the extension has begin an async operation.
+ *  When this value is returned, the extension must set the handle parameter
+ *  and call the callback closure when the operation is complete.
+ *
+ * Return values for asynchronous operations performed by the extension.
+ * See nautilus_info_provider_update_file_info().
+ */
+typedef enum
+{
+    /* Returned if the call succeeded, and the extension is done 
+     * with the request */
+    NAUTILUS_OPERATION_COMPLETE,
+
+    /* Returned if the call failed */
+    NAUTILUS_OPERATION_FAILED,
 
-typedef struct _NautilusInfoProvider       NautilusInfoProvider;
-typedef struct _NautilusInfoProviderIface  NautilusInfoProviderIface;
+    /* Returned if the extension has begun an async operation. 
+     * If this is returned, the extension must set the handle 
+     * parameter and call the callback closure when the 
+     * operation is complete. */
+    NAUTILUS_OPERATION_IN_PROGRESS
+} NautilusOperationResult;
 
-typedef void (*NautilusInfoProviderUpdateComplete) (NautilusInfoProvider    *provider,
-                                                   NautilusOperationHandle *handle,
-                                                   NautilusOperationResult  result,
-                                                   gpointer                 user_data);
 /**
- * NautilusInfoProviderIface:
+ * NautilusInfoProviderInterface:
  * @g_iface: The parent interface.
  * @update_file_info: Returns a #NautilusOperationResult.
  *   See nautilus_info_provider_update_file_info() for details.
@@ -57,33 +94,33 @@ typedef void (*NautilusInfoProviderUpdateComplete) (NautilusInfoProvider    *pro
  *
  * Interface for extensions to provide additional information about files.
  */
-struct _NautilusInfoProviderIface {
-       GTypeInterface g_iface;
-
-       NautilusOperationResult (*update_file_info) (NautilusInfoProvider     *provider,
-                                                    NautilusFileInfo         *file,
-                                                    GClosure                 *update_complete,
-                                                    NautilusOperationHandle **handle);
-       void                    (*cancel_update)    (NautilusInfoProvider     *provider,
-                                                    NautilusOperationHandle  *handle);
+struct _NautilusInfoProviderInterface
+{
+    GTypeInterface g_iface;
+
+    NautilusOperationResult (*update_file_info) (NautilusInfoProvider     *provider,
+                                                 NautilusFileInfo         *file,
+                                                 GClosure                 *update_complete,
+                                                 NautilusOperationHandle **handle);
+    void                    (*cancel_update)    (NautilusInfoProvider     *provider,
+                                                 NautilusOperationHandle  *handle);
 };
 
 /* Interface Functions */
-GType                   nautilus_info_provider_get_type               (void);
 NautilusOperationResult nautilus_info_provider_update_file_info       (NautilusInfoProvider     *provider,
-                                                                      NautilusFileInfo         *file,
-                                                                      GClosure                 
*update_complete,
-                                                                      NautilusOperationHandle **handle);
+                                                                       NautilusFileInfo         *file,
+                                                                       GClosure                 
*update_complete,
+                                                                       NautilusOperationHandle **handle);
 void                    nautilus_info_provider_cancel_update          (NautilusInfoProvider     *provider,
-                                                                      NautilusOperationHandle  *handle);
+                                                                       NautilusOperationHandle  *handle);
 
 
 
 /* Helper functions for implementations */
 void                    nautilus_info_provider_update_complete_invoke (GClosure                 
*update_complete,
-                                                                      NautilusInfoProvider     *provider,
-                                                                      NautilusOperationHandle  *handle,
-                                                                      NautilusOperationResult   result);
+                                                                       NautilusInfoProvider     *provider,
+                                                                       NautilusOperationHandle  *handle,
+                                                                       NautilusOperationResult   result);
 
 G_END_DECLS
 
diff --git a/libnautilus-extension/nautilus-location-widget-provider.c 
b/libnautilus-extension/nautilus-location-widget-provider.c
index a2e2af008..55f989741 100644
--- a/libnautilus-extension/nautilus-location-widget-provider.c
+++ b/libnautilus-extension/nautilus-location-widget-provider.c
@@ -21,55 +21,25 @@
  *
  */
 
-#include <config.h>
 #include "nautilus-location-widget-provider.h"
 
-#include <glib-object.h>
+G_DEFINE_INTERFACE (NautilusLocationWidgetProvider, nautilus_location_widget_provider,
+                    G_TYPE_OBJECT)
 
 /**
  * SECTION:nautilus-location-widget-provider
  * @title: NautilusLocationWidgetProvider
  * @short_description: Interface to provide additional location widgets
- * @include: libnautilus-extension/nautilus-location-widget-provider.h
  *
  * #NautilusLocationWidgetProvider allows extension to provide additional location
  * widgets in the file manager views.
  */
 
 static void
-nautilus_location_widget_provider_base_init (gpointer g_class)
+nautilus_location_widget_provider_default_init (NautilusLocationWidgetProviderInterface *klass)
 {
 }
 
-GType
-nautilus_location_widget_provider_get_type (void)
-{
-    static GType type = 0;
-
-    if (!type)
-    {
-        const GTypeInfo info =
-        {
-            sizeof (NautilusLocationWidgetProviderIface),
-            nautilus_location_widget_provider_base_init,
-            NULL,
-            NULL,
-            NULL,
-            NULL,
-            0,
-            0,
-            NULL
-        };
-
-        type = g_type_register_static (G_TYPE_INTERFACE,
-                                       "NautilusLocationWidgetProvider",
-                                       &info, 0);
-        g_type_interface_add_prerequisite (type, G_TYPE_OBJECT);
-    }
-
-    return type;
-}
-
 /**
  * nautilus_location_widget_provider_get_widget:
  * @provider: a #NautilusLocationWidgetProvider
@@ -79,12 +49,17 @@ nautilus_location_widget_provider_get_type (void)
  * Returns: (transfer none): the location widget for @provider at @uri
  */
 GtkWidget *
-nautilus_location_widget_provider_get_widget (NautilusLocationWidgetProvider *provider,
+nautilus_location_widget_provider_get_widget (NautilusLocationWidgetProvider *self,
                                               const char                     *uri,
                                               GtkWidget                      *window)
 {
-    g_return_val_if_fail (NAUTILUS_IS_LOCATION_WIDGET_PROVIDER (provider), NULL);
+    NautilusLocationWidgetProviderInterface *iface;
+
+    g_return_val_if_fail (NAUTILUS_IS_LOCATION_WIDGET_PROVIDER (self), NULL);
+
+    iface = NAUTILUS_LOCATION_WIDGET_PROVIDER_GET_IFACE (self);
+
+    g_return_val_if_fail (iface->get_widget != NULL, NULL);
 
-    return NAUTILUS_LOCATION_WIDGET_PROVIDER_GET_IFACE (provider)->get_widget
-               (provider, uri, window);
+    return iface->get_widget (self, uri, window);
 }
diff --git a/libnautilus-extension/nautilus-location-widget-provider.h 
b/libnautilus-extension/nautilus-location-widget-provider.h
index 8000b2c19..e95ca0523 100644
--- a/libnautilus-extension/nautilus-location-widget-provider.h
+++ b/libnautilus-extension/nautilus-location-widget-provider.h
@@ -31,41 +31,46 @@
 #ifndef NAUTILUS_LOCATION_WIDGET_PROVIDER_H
 #define NAUTILUS_LOCATION_WIDGET_PROVIDER_H
 
+#if !defined (NAUTILUS_EXTENSION_H) && !defined (NAUTILUS_COMPILATION)
+#warning "Only <nautilus-extension.h> should be included directly."
+#endif
+
 #include <glib-object.h>
 #include <gtk/gtk.h>
-#include "nautilus-extension-types.h"
 
 G_BEGIN_DECLS
 
-#define NAUTILUS_TYPE_LOCATION_WIDGET_PROVIDER           (nautilus_location_widget_provider_get_type ())
-#define NAUTILUS_LOCATION_WIDGET_PROVIDER(obj)           (G_TYPE_CHECK_INSTANCE_CAST ((obj), 
NAUTILUS_TYPE_LOCATION_WIDGET_PROVIDER, NautilusLocationWidgetProvider))
-#define NAUTILUS_IS_LOCATION_WIDGET_PROVIDER(obj)        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), 
NAUTILUS_TYPE_LOCATION_WIDGET_PROVIDER))
-#define NAUTILUS_LOCATION_WIDGET_PROVIDER_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), 
NAUTILUS_TYPE_LOCATION_WIDGET_PROVIDER, NautilusLocationWidgetProviderIface))
+#define NAUTILUS_TYPE_LOCATION_WIDGET_PROVIDER (nautilus_location_widget_provider_get_type ())
 
-typedef struct _NautilusLocationWidgetProvider       NautilusLocationWidgetProvider;
-typedef struct _NautilusLocationWidgetProviderIface  NautilusLocationWidgetProviderIface;
+G_DECLARE_INTERFACE (NautilusLocationWidgetProvider, nautilus_location_widget_provider,
+                     NAUTILUS, LOCATION_WIDGET_PROVIDER,
+                     GObject)
+
+/* For compatibility reasons, remove this once you start introducing breaking changes. */
+typedef NautilusLocationWidgetProviderInterface NautilusLocationWidgetProviderIface;
 
 /**
- * NautilusLocationWidgetProviderIface:
+ * NautilusLocationWidgetProviderInterface:
  * @g_iface: The parent interface.
  * @get_widget: Returns a #GtkWidget.
  *   See nautilus_location_widget_provider_get_widget() for details.
  *
  * Interface for extensions to provide additional location widgets.
  */
-struct _NautilusLocationWidgetProviderIface {
-       GTypeInterface g_iface;
+struct _NautilusLocationWidgetProviderInterface
+{
+    GTypeInterface g_iface;
 
-       GtkWidget * (*get_widget) (NautilusLocationWidgetProvider *provider,
-                                  const char                     *uri,
-                                  GtkWidget                      *window);
+    GtkWidget *(*get_widget) (NautilusLocationWidgetProvider *provider,
+                              const char                     *uri,
+                              GtkWidget                      *window);
 };
 
 /* Interface Functions */
-GType       nautilus_location_widget_provider_get_type      (void);
-GtkWidget * nautilus_location_widget_provider_get_widget    (NautilusLocationWidgetProvider     *provider,
-                                                            const char                         *uri,
-                                                            GtkWidget                          *window);
+GtkWidget *nautilus_location_widget_provider_get_widget (NautilusLocationWidgetProvider *provider,
+                                                         const char                     *uri,
+                                                         GtkWidget                      *window);
+
 G_END_DECLS
 
 #endif
diff --git a/libnautilus-extension/nautilus-menu-item.c b/libnautilus-extension/nautilus-menu-item.c
index 068188a6b..85c8b8a72 100644
--- a/libnautilus-extension/nautilus-menu-item.c
+++ b/libnautilus-extension/nautilus-menu-item.c
@@ -25,6 +25,19 @@
 #include <glib/gi18n-lib.h>
 #include "nautilus-menu.h"
 
+typedef struct
+{
+    char *name;
+    char *label;
+    char *tip;
+    char *icon;
+    NautilusMenu *menu;
+    gboolean sensitive;
+    gboolean priority;
+} NautilusMenuItemPrivate;
+
+G_DEFINE_TYPE_WITH_PRIVATE (NautilusMenuItem, nautilus_menu_item, G_TYPE_OBJECT)
+
 enum
 {
     ACTIVATE,
@@ -44,26 +57,12 @@ enum
     LAST_PROP
 };
 
-struct _NautilusMenuItemDetails
-{
-    char *name;
-    char *label;
-    char *tip;
-    char *icon;
-    NautilusMenu *menu;
-    gboolean sensitive;
-    gboolean priority;
-};
-
 static guint signals[LAST_SIGNAL];
 
-static GObjectClass *parent_class = NULL;
-
 /**
  * SECTION:nautilus-menu-item
  * @title: NautilusMenuItem
  * @short_description: Menu item descriptor object
- * @include: libnautilus-extension/nautilus-menu-item.h
  *
  * #NautilusMenuItem is an object that describes an item in a file manager
  * menu. Extensions can provide #NautilusMenuItem objects by registering a
@@ -113,9 +112,11 @@ nautilus_menu_item_new (const char *name,
  * emits the activate signal.
  */
 void
-nautilus_menu_item_activate (NautilusMenuItem *item)
+nautilus_menu_item_activate (NautilusMenuItem *self)
 {
-    g_signal_emit (item, signals[ACTIVATE], 0);
+    g_return_if_fail (NAUTILUS_IS_MENU_ITEM (self));
+
+    g_signal_emit (self, signals[ACTIVATE], 0);
 }
 
 /**
@@ -126,10 +127,12 @@ nautilus_menu_item_activate (NautilusMenuItem *item)
  * Attachs a menu to the given #NautilusMenuItem.
  */
 void
-nautilus_menu_item_set_submenu (NautilusMenuItem *item,
+nautilus_menu_item_set_submenu (NautilusMenuItem *self,
                                 NautilusMenu     *menu)
 {
-    g_object_set (item, "menu", menu, NULL);
+    g_return_if_fail (NAUTILUS_IS_MENU_ITEM (self));
+
+    g_object_set (self, "menu", menu, NULL);
 }
 
 static void
@@ -139,50 +142,52 @@ nautilus_menu_item_get_property (GObject    *object,
                                  GParamSpec *pspec)
 {
     NautilusMenuItem *item;
+    NautilusMenuItemPrivate *priv;
 
     item = NAUTILUS_MENU_ITEM (object);
+    priv = nautilus_menu_item_get_instance_private (item);
 
     switch (param_id)
     {
         case PROP_NAME:
         {
-            g_value_set_string (value, item->details->name);
+            g_value_set_string (value, priv->name);
         }
         break;
 
         case PROP_LABEL:
         {
-            g_value_set_string (value, item->details->label);
+            g_value_set_string (value, priv->label);
         }
         break;
 
         case PROP_TIP:
         {
-            g_value_set_string (value, item->details->tip);
+            g_value_set_string (value, priv->tip);
         }
         break;
 
         case PROP_ICON:
         {
-            g_value_set_string (value, item->details->icon);
+            g_value_set_string (value, priv->icon);
         }
         break;
 
         case PROP_SENSITIVE:
         {
-            g_value_set_boolean (value, item->details->sensitive);
+            g_value_set_boolean (value, priv->sensitive);
         }
         break;
 
         case PROP_PRIORITY:
         {
-            g_value_set_boolean (value, item->details->priority);
+            g_value_set_boolean (value, priv->priority);
         }
         break;
 
         case PROP_MENU:
         {
-            g_value_set_object (value, item->details->menu);
+            g_value_set_object (value, priv->menu);
         }
         break;
 
@@ -201,64 +206,66 @@ nautilus_menu_item_set_property (GObject      *object,
                                  GParamSpec   *pspec)
 {
     NautilusMenuItem *item;
+    NautilusMenuItemPrivate *priv;
 
     item = NAUTILUS_MENU_ITEM (object);
+    priv = nautilus_menu_item_get_instance_private (item);
 
     switch (param_id)
     {
         case PROP_NAME:
         {
-            g_free (item->details->name);
-            item->details->name = g_strdup (g_value_get_string (value));
+            g_free (priv->name);
+            priv->name = g_strdup (g_value_get_string (value));
             g_object_notify (object, "name");
         }
         break;
 
         case PROP_LABEL:
         {
-            g_free (item->details->label);
-            item->details->label = g_strdup (g_value_get_string (value));
+            g_free (priv->label);
+            priv->label = g_strdup (g_value_get_string (value));
             g_object_notify (object, "label");
         }
         break;
 
         case PROP_TIP:
         {
-            g_free (item->details->tip);
-            item->details->tip = g_strdup (g_value_get_string (value));
+            g_free (priv->tip);
+            priv->tip = g_strdup (g_value_get_string (value));
             g_object_notify (object, "tip");
         }
         break;
 
         case PROP_ICON:
         {
-            g_free (item->details->icon);
-            item->details->icon = g_strdup (g_value_get_string (value));
+            g_free (priv->icon);
+            priv->icon = g_strdup (g_value_get_string (value));
             g_object_notify (object, "icon");
         }
         break;
 
         case PROP_SENSITIVE:
         {
-            item->details->sensitive = g_value_get_boolean (value);
+            priv->sensitive = g_value_get_boolean (value);
             g_object_notify (object, "sensitive");
         }
         break;
 
         case PROP_PRIORITY:
         {
-            item->details->priority = g_value_get_boolean (value);
+            priv->priority = g_value_get_boolean (value);
             g_object_notify (object, "priority");
         }
         break;
 
         case PROP_MENU:
         {
-            if (item->details->menu)
+            if (priv->menu)
             {
-                g_object_unref (item->details->menu);
+                g_object_unref (priv->menu);
             }
-            item->details->menu = g_object_ref (g_value_get_object (value));
+            priv->menu = g_object_ref (g_value_get_object (value));
             g_object_notify (object, "menu");
         }
         break;
@@ -275,36 +282,37 @@ static void
 nautilus_menu_item_finalize (GObject *object)
 {
     NautilusMenuItem *item;
+    NautilusMenuItemPrivate *priv;
 
     item = NAUTILUS_MENU_ITEM (object);
+    priv = nautilus_menu_item_get_instance_private (item);
 
-    g_free (item->details->name);
-    g_free (item->details->label);
-    g_free (item->details->tip);
-    g_free (item->details->icon);
-    if (item->details->menu)
+    g_free (priv->name);
+    g_free (priv->label);
+    g_free (priv->tip);
+    g_free (priv->icon);
+    if (priv->menu)
     {
-        g_object_unref (item->details->menu);
+        g_object_unref (priv->menu);
     }
 
-    g_free (item->details);
-
-    G_OBJECT_CLASS (parent_class)->finalize (object);
+    G_OBJECT_CLASS (nautilus_menu_item_parent_class)->finalize (object);
 }
 
 static void
-nautilus_menu_item_instance_init (NautilusMenuItem *item)
+nautilus_menu_item_init (NautilusMenuItem *self)
 {
-    item->details = g_new0 (NautilusMenuItemDetails, 1);
-    item->details->sensitive = TRUE;
-    item->details->menu = NULL;
+    NautilusMenuItemPrivate *priv;
+
+    priv = nautilus_menu_item_get_instance_private (self);
+
+    priv->sensitive = TRUE;
+    priv->menu = NULL;
 }
 
 static void
 nautilus_menu_item_class_init (NautilusMenuItemClass *class)
 {
-    parent_class = g_type_class_peek_parent (class);
-
     G_OBJECT_CLASS (class)->finalize = nautilus_menu_item_finalize;
     G_OBJECT_CLASS (class)->get_property = nautilus_menu_item_get_property;
     G_OBJECT_CLASS (class)->set_property = nautilus_menu_item_set_property;
@@ -370,32 +378,3 @@ nautilus_menu_item_class_init (NautilusMenuItemClass *class)
                                                           NAUTILUS_TYPE_MENU,
                                                           G_PARAM_READWRITE));
 }
-
-GType
-nautilus_menu_item_get_type (void)
-{
-    static GType type = 0;
-
-    if (!type)
-    {
-        const GTypeInfo info =
-        {
-            sizeof (NautilusMenuItemClass),
-            NULL,
-            NULL,
-            (GClassInitFunc) nautilus_menu_item_class_init,
-            NULL,
-            NULL,
-            sizeof (NautilusMenuItem),
-            0,
-            (GInstanceInitFunc) nautilus_menu_item_instance_init
-        };
-
-        type = g_type_register_static
-                   (G_TYPE_OBJECT,
-                   "NautilusMenuItem",
-                   &info, 0);
-    }
-
-    return type;
-}
diff --git a/libnautilus-extension/nautilus-menu-item.h b/libnautilus-extension/nautilus-menu-item.h
index cc1b32ad6..9e867444b 100644
--- a/libnautilus-extension/nautilus-menu-item.h
+++ b/libnautilus-extension/nautilus-menu-item.h
@@ -24,6 +24,10 @@
 #ifndef NAUTILUS_MENU_ITEM_H
 #define NAUTILUS_MENU_ITEM_H
 
+#if !defined (NAUTILUS_EXTENSION_H) && !defined (NAUTILUS_COMPILATION)
+#warning "Only <nautilus-extension.h> should be included directly."
+#endif
+
 #include "nautilus-menu.h"
 
 #endif
diff --git a/libnautilus-extension/nautilus-menu-provider.c b/libnautilus-extension/nautilus-menu-provider.c
index 05eb28a67..ead742bd7 100644
--- a/libnautilus-extension/nautilus-menu-provider.c
+++ b/libnautilus-extension/nautilus-menu-provider.c
@@ -25,64 +25,36 @@
 #include <config.h>
 #include "nautilus-menu-provider.h"
 
-#include <glib-object.h>
+G_DEFINE_INTERFACE (NautilusMenuProvider, nautilus_menu_provider, G_TYPE_OBJECT)
+
+enum
+{
+    ITEMS_UPDATED,
+    LAST_SIGNAL
+};
+
+static guint signals[LAST_SIGNAL];
 
 /**
  * SECTION:nautilus-menu-provider
  * @title: NautilusMenuProvider
  * @short_description: Interface to provide additional menu items
- * @include: libnautilus-extension/nautilus-menu-provider.h
  *
  * #NautilusMenuProvider allows extension to provide additional menu items
  * in the file manager menus.
  */
 
 static void
-nautilus_menu_provider_base_init (gpointer g_class)
+nautilus_menu_provider_default_init (NautilusMenuProviderInterface *klass)
 {
-    static gboolean initialized = FALSE;
-
-    if (!initialized)
-    {
-        /* This signal should be emited each time the extension modify the list of menu items */
-        g_signal_new ("items-updated",
-                      NAUTILUS_TYPE_MENU_PROVIDER,
-                      G_SIGNAL_RUN_LAST,
-                      0,
-                      NULL, NULL,
-                      g_cclosure_marshal_VOID__VOID,
-                      G_TYPE_NONE, 0);
-        initialized = TRUE;
-    }
-}
-
-GType
-nautilus_menu_provider_get_type (void)
-{
-    static GType type = 0;
-
-    if (!type)
-    {
-        const GTypeInfo info =
-        {
-            sizeof (NautilusMenuProviderIface),
-            nautilus_menu_provider_base_init,
-            NULL,
-            NULL,
-            NULL,
-            NULL,
-            0,
-            0,
-            NULL
-        };
-
-        type = g_type_register_static (G_TYPE_INTERFACE,
-                                       "NautilusMenuProvider",
-                                       &info, 0);
-        g_type_interface_add_prerequisite (type, G_TYPE_OBJECT);
-    }
-
-    return type;
+    /* This signal should be emited each time the extension modify the list of menu items */
+    signals[ITEMS_UPDATED] = g_signal_new ("items-updated",
+                                           NAUTILUS_TYPE_MENU_PROVIDER,
+                                           G_SIGNAL_RUN_LAST,
+                                           0,
+                                           NULL, NULL,
+                                           g_cclosure_marshal_VOID__VOID,
+                                           G_TYPE_NONE, 0);
 }
 
 /**
@@ -98,17 +70,19 @@ nautilus_menu_provider_get_file_items (NautilusMenuProvider *provider,
                                        GtkWidget            *window,
                                        GList                *files)
 {
+    NautilusMenuProviderInterface *iface;
+
+    iface = NAUTILUS_MENU_PROVIDER_GET_IFACE (provider);
+
     g_return_val_if_fail (NAUTILUS_IS_MENU_PROVIDER (provider), NULL);
+    g_return_val_if_fail (GTK_IS_WIDGET (window), NULL);
 
-    if (NAUTILUS_MENU_PROVIDER_GET_IFACE (provider)->get_file_items)
+    if (iface->get_file_items != NULL)
     {
-        return NAUTILUS_MENU_PROVIDER_GET_IFACE (provider)->get_file_items
-                   (provider, window, files);
-    }
-    else
-    {
-        return NULL;
+        return iface->get_file_items (provider, window, files);
     }
+
+    return NULL;
 }
 
 /**
@@ -124,18 +98,20 @@ nautilus_menu_provider_get_background_items (NautilusMenuProvider *provider,
                                              GtkWidget            *window,
                                              NautilusFileInfo     *current_folder)
 {
+    NautilusMenuProviderInterface *iface;
+
+    iface = NAUTILUS_MENU_PROVIDER_GET_IFACE (provider);
+
     g_return_val_if_fail (NAUTILUS_IS_MENU_PROVIDER (provider), NULL);
+    g_return_val_if_fail (GTK_IS_WIDGET (window), NULL);
     g_return_val_if_fail (NAUTILUS_IS_FILE_INFO (current_folder), NULL);
 
-    if (NAUTILUS_MENU_PROVIDER_GET_IFACE (provider)->get_background_items)
+    if (iface->get_background_items != NULL)
     {
-        return NAUTILUS_MENU_PROVIDER_GET_IFACE (provider)->get_background_items
-                   (provider, window, current_folder);
-    }
-    else
-    {
-        return NULL;
+        return iface->get_background_items (provider, window, current_folder);
     }
+
+    return NULL;
 }
 
 /* This function emit a signal to inform nautilus that its item list has changed */
@@ -144,5 +120,5 @@ nautilus_menu_provider_emit_items_updated_signal (NautilusMenuProvider *provider
 {
     g_return_if_fail (NAUTILUS_IS_MENU_PROVIDER (provider));
 
-    g_signal_emit_by_name (provider, "items-updated");
+    g_signal_emit (provider, ITEMS_UPDATED, 0);
 }
diff --git a/libnautilus-extension/nautilus-menu-provider.h b/libnautilus-extension/nautilus-menu-provider.h
index 23ff537be..bd887feaa 100644
--- a/libnautilus-extension/nautilus-menu-provider.h
+++ b/libnautilus-extension/nautilus-menu-provider.h
@@ -29,24 +29,27 @@
 #ifndef NAUTILUS_MENU_PROVIDER_H
 #define NAUTILUS_MENU_PROVIDER_H
 
+#if !defined (NAUTILUS_EXTENSION_H) && !defined (NAUTILUS_COMPILATION)
+#warning "Only <nautilus-extension.h> should be included directly."
+#endif
+
 #include <glib-object.h>
 #include <gtk/gtk.h>
-#include "nautilus-extension-types.h"
 #include "nautilus-file-info.h"
-#include "nautilus-menu.h"
 
 G_BEGIN_DECLS
 
-#define NAUTILUS_TYPE_MENU_PROVIDER           (nautilus_menu_provider_get_type ())
-#define NAUTILUS_MENU_PROVIDER(obj)           (G_TYPE_CHECK_INSTANCE_CAST ((obj), 
NAUTILUS_TYPE_MENU_PROVIDER, NautilusMenuProvider))
-#define NAUTILUS_IS_MENU_PROVIDER(obj)        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), 
NAUTILUS_TYPE_MENU_PROVIDER))
-#define NAUTILUS_MENU_PROVIDER_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), 
NAUTILUS_TYPE_MENU_PROVIDER, NautilusMenuProviderIface))
+#define NAUTILUS_TYPE_MENU_PROVIDER (nautilus_menu_provider_get_type ())
+
+G_DECLARE_INTERFACE (NautilusMenuProvider, nautilus_menu_provider,
+                     NAUTILUS, MENU_PROVIDER,
+                     GObject)
 
-typedef struct _NautilusMenuProvider       NautilusMenuProvider;
-typedef struct _NautilusMenuProviderIface  NautilusMenuProviderIface;
+/* For compatibility reasons, remove this once you start introducing breaking changes. */
+typedef NautilusMenuProviderInterface NautilusMenuProviderIface;
 
 /**
- * NautilusMenuProviderIface:
+ * NautilusMenuProviderInterface:
  * @g_iface: The parent interface.
  * @get_file_items: Returns a #GList of #NautilusMenuItem.
  *   See nautilus_menu_provider_get_file_items() for details.
@@ -55,28 +58,28 @@ typedef struct _NautilusMenuProviderIface  NautilusMenuProviderIface;
  *
  * Interface for extensions to provide additional menu items.
  */
-struct _NautilusMenuProviderIface {
-       GTypeInterface g_iface;
+struct _NautilusMenuProviderInterface
+{
+    GTypeInterface g_iface;
 
-       GList *(*get_file_items)       (NautilusMenuProvider *provider,
-                                       GtkWidget            *window,
-                                       GList                *files);
-       GList *(*get_background_items) (NautilusMenuProvider *provider,
-                                       GtkWidget            *window,
-                                       NautilusFileInfo     *current_folder);
+    GList *(*get_file_items)       (NautilusMenuProvider *provider,
+                                    GtkWidget            *window,
+                                    GList                *files);
+    GList *(*get_background_items) (NautilusMenuProvider *provider,
+                                    GtkWidget            *window,
+                                    NautilusFileInfo     *current_folder);
 };
 
 /* Interface Functions */
-GType                   nautilus_menu_provider_get_type             (void);
-GList                  *nautilus_menu_provider_get_file_items       (NautilusMenuProvider *provider,
-                                                                    GtkWidget            *window,
-                                                                    GList                *files);
-GList                  *nautilus_menu_provider_get_background_items (NautilusMenuProvider *provider,
-                                                                    GtkWidget            *window,
-                                                                    NautilusFileInfo     *current_folder);
+GList  *nautilus_menu_provider_get_file_items           (NautilusMenuProvider *provider,
+                                                         GtkWidget            *window,
+                                                         GList                *files);
+GList *nautilus_menu_provider_get_background_items      (NautilusMenuProvider *provider,
+                                                         GtkWidget            *window,
+                                                         NautilusFileInfo     *current_folder);
 
 /* This function emit a signal to inform nautilus that its item list has changed. */
-void                    nautilus_menu_provider_emit_items_updated_signal (NautilusMenuProvider *provider);
+void   nautilus_menu_provider_emit_items_updated_signal (NautilusMenuProvider *provider);
 
 G_END_DECLS
 
diff --git a/libnautilus-extension/nautilus-menu.c b/libnautilus-extension/nautilus-menu.c
index fcc2ecc4c..d4b5b3001 100644
--- a/libnautilus-extension/nautilus-menu.c
+++ b/libnautilus-extension/nautilus-menu.c
@@ -30,29 +30,29 @@
  * SECTION:nautilus-menu
  * @title: NautilusMenu
  * @short_description: Menu descriptor object
- * @include: libnautilus-extension/nautilus-menu.h
  *
  * #NautilusMenu is an object that describes a submenu in a file manager
  * menu. Extensions can provide #NautilusMenu objects by attaching them to
  * #NautilusMenuItem objects, using nautilus_menu_item_set_submenu().
  */
 
-#define NAUTILUS_MENU_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NAUTILUS_TYPE_MENU, 
NautilusMenuPrivate))
-G_DEFINE_TYPE (NautilusMenu, nautilus_menu, G_TYPE_OBJECT);
-
-struct _NautilusMenuPrivate
+struct _NautilusMenu
 {
+    GObject parent_instance;
+
     GList *item_list;
 };
 
+G_DEFINE_TYPE (NautilusMenu, nautilus_menu, G_TYPE_OBJECT);
+
 void
-nautilus_menu_append_item (NautilusMenu     *menu,
-                           NautilusMenuItem *item)
+nautilus_menu_append_item (NautilusMenu     *self,
+                           NautilusMenuItem *menu_item)
 {
-    g_return_if_fail (menu != NULL);
-    g_return_if_fail (item != NULL);
+    g_return_if_fail (NAUTILUS_IS_MENU (self));
+    g_return_if_fail (NAUTILUS_IS_MENU_ITEM (menu_item));
 
-    menu->priv->item_list = g_list_append (menu->priv->item_list, g_object_ref (item));
+    self->item_list = g_list_append (self->item_list, g_object_ref (menu_item));
 }
 
 /**
@@ -62,13 +62,13 @@ nautilus_menu_append_item (NautilusMenu     *menu,
  * Returns: (element-type NautilusMenuItem) (transfer full): the provided #NautilusMenuItem list
  */
 GList *
-nautilus_menu_get_items (NautilusMenu *menu)
+nautilus_menu_get_items (NautilusMenu *self)
 {
     GList *item_list;
 
-    g_return_val_if_fail (menu != NULL, NULL);
+    g_return_val_if_fail (NAUTILUS_IS_MENU (self), NULL);
 
-    item_list = g_list_copy (menu->priv->item_list);
+    item_list = g_list_copy (self->item_list);
     g_list_foreach (item_list, (GFunc) g_object_ref, NULL);
 
     return item_list;
@@ -95,20 +95,15 @@ nautilus_menu_finalize (GObject *object)
 {
     NautilusMenu *menu = NAUTILUS_MENU (object);
 
-    if (menu->priv->item_list)
-    {
-        g_list_free (menu->priv->item_list);
-    }
+    g_clear_pointer (&menu->item_list, g_list_free);
 
     G_OBJECT_CLASS (nautilus_menu_parent_class)->finalize (object);
 }
 
 static void
-nautilus_menu_init (NautilusMenu *menu)
+nautilus_menu_init (NautilusMenu *self)
 {
-    menu->priv = NAUTILUS_MENU_GET_PRIVATE (menu);
-
-    menu->priv->item_list = NULL;
+    self->item_list = NULL;
 }
 
 static void
@@ -116,8 +111,6 @@ nautilus_menu_class_init (NautilusMenuClass *klass)
 {
     GObjectClass *object_class = G_OBJECT_CLASS (klass);
 
-    g_type_class_add_private (klass, sizeof (NautilusMenuPrivate));
-
     object_class->finalize = nautilus_menu_finalize;
 }
 
@@ -126,9 +119,5 @@ nautilus_menu_class_init (NautilusMenuClass *klass)
 NautilusMenu *
 nautilus_menu_new (void)
 {
-    NautilusMenu *obj;
-
-    obj = NAUTILUS_MENU (g_object_new (NAUTILUS_TYPE_MENU, NULL));
-
-    return obj;
+    return g_object_new (NAUTILUS_TYPE_MENU, NULL);
 }
diff --git a/libnautilus-extension/nautilus-menu.h b/libnautilus-extension/nautilus-menu.h
index fd132be4e..efac9a0d1 100644
--- a/libnautilus-extension/nautilus-menu.h
+++ b/libnautilus-extension/nautilus-menu.h
@@ -26,80 +26,47 @@
 #define NAUTILUS_MENU_H
 
 #include <glib-object.h>
-#include "nautilus-extension-types.h"
 
+#if !defined (NAUTILUS_EXTENSION_H) && !defined (NAUTILUS_COMPILATION)
+#warning "Only <nautilus-extension.h> should be included directly."
+#endif
 
 G_BEGIN_DECLS
 
-/* NautilusMenu defines */
-#define NAUTILUS_TYPE_MENU         (nautilus_menu_get_type ())
-#define NAUTILUS_MENU(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), NAUTILUS_TYPE_MENU, NautilusMenu))
-#define NAUTILUS_MENU_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST((k), NAUTILUS_TYPE_MENU, NautilusMenuClass))
-#define NAUTILUS_IS_MENU(o)        (G_TYPE_CHECK_INSTANCE_TYPE ((o), NAUTILUS_TYPE_MENU))
-#define NAUTILUS_IS_MENU_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE ((k), NAUTILUS_TYPE_MENU))
-#define NAUTILUS_MENU_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), NAUTILUS_TYPE_MENU, NautilusMenuClass))
-/* NautilusMenuItem defines */
-#define NAUTILUS_TYPE_MENU_ITEM            (nautilus_menu_item_get_type())
-#define NAUTILUS_MENU_ITEM(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), NAUTILUS_TYPE_MENU_ITEM, 
NautilusMenuItem))
-#define NAUTILUS_MENU_ITEM_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), NAUTILUS_TYPE_MENU_ITEM, 
NautilusMenuItemClass))
-#define NAUTILUS_MENU_IS_ITEM(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), NAUTILUS_TYPE_MENU_ITEM))
-#define NAUTILUS_MENU_IS_ITEM_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), NAUTILUS_TYPE_MENU_ITEM))
-#define NAUTILUS_MENU_ITEM_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj), NAUTILUS_TYPE_MENU_ITEM, 
NautilusMenuItemClass))
-
-
-/* NautilusMenu types */
-typedef struct _NautilusMenu           NautilusMenu;
-typedef struct _NautilusMenuPrivate    NautilusMenuPrivate;
-typedef struct _NautilusMenuClass      NautilusMenuClass;
-/* NautilusMenuItem types */
-typedef struct _NautilusMenuItem        NautilusMenuItem;
-typedef struct _NautilusMenuItemDetails NautilusMenuItemDetails;
-typedef struct _NautilusMenuItemClass   NautilusMenuItemClass;
-
-
-/* NautilusMenu structs */
-struct _NautilusMenu {
-       GObject parent;
-       NautilusMenuPrivate *priv;
-};
+#define NAUTILUS_TYPE_MENU (nautilus_menu_get_type ())
+#define NAUTILUS_TYPE_MENU_ITEM (nautilus_menu_item_get_type ())
 
-struct _NautilusMenuClass {
-       GObjectClass parent_class;
-};
+G_DECLARE_FINAL_TYPE     (NautilusMenu, nautilus_menu,
+                          NAUTILUS, MENU,
+                          GObject)
+G_DECLARE_DERIVABLE_TYPE (NautilusMenuItem, nautilus_menu_item,
+                          NAUTILUS, MENU_ITEM,
+                          GObject)
 
-/* NautilusMenuItem structs */
-struct _NautilusMenuItem {
-       GObject parent;
+struct _NautilusMenuItemClass
+{
+    GObjectClass parent;
 
-       NautilusMenuItemDetails *details;
+    void (*activate) (NautilusMenuItem *item);
 };
 
-struct _NautilusMenuItemClass {
-       GObjectClass parent;
-
-       void (*activate) (NautilusMenuItem *item);
-};
+NautilusMenu     *nautilus_menu_new              (void);
 
+void              nautilus_menu_append_item      (NautilusMenu     *menu,
+                                                  NautilusMenuItem *item);
+GList            *nautilus_menu_get_items        (NautilusMenu     *menu);
+void              nautilus_menu_item_list_free   (GList            *item_list);
 
-/* NautilusMenu methods */
-GType          nautilus_menu_get_type  (void);
-NautilusMenu * nautilus_menu_new       (void);
 
-void   nautilus_menu_append_item       (NautilusMenu      *menu,
-                                        NautilusMenuItem  *item);
-GList* nautilus_menu_get_items         (NautilusMenu *menu);
-void   nautilus_menu_item_list_free    (GList *item_list);
+NautilusMenuItem *nautilus_menu_item_new         (const char       *name,
+                                                  const char       *label,
+                                                  const char       *tip,
+                                                  const char       *icon);
 
-/* NautilusMenuItem methods */
-GType             nautilus_menu_item_get_type      (void);
-NautilusMenuItem *nautilus_menu_item_new           (const char       *name,
-                                                   const char       *label,
-                                                   const char       *tip,
-                                                   const char       *icon);
+void              nautilus_menu_item_activate    (NautilusMenuItem *item);
+void              nautilus_menu_item_set_submenu (NautilusMenuItem *item,
+                                                  NautilusMenu     *menu);
 
-void              nautilus_menu_item_activate      (NautilusMenuItem *item);
-void              nautilus_menu_item_set_submenu   (NautilusMenuItem *item,
-                                                   NautilusMenu     *menu);
 /* NautilusMenuItem has the following properties:
  *   name (string)        - the identifier for the menu item
  *   label (string)       - the user-visible label of the menu item
diff --git a/libnautilus-extension/nautilus-property-page-provider.c 
b/libnautilus-extension/nautilus-property-page-provider.c
index 7a7a13cf0..26ec03cf5 100644
--- a/libnautilus-extension/nautilus-property-page-provider.c
+++ b/libnautilus-extension/nautilus-property-page-provider.c
@@ -22,55 +22,25 @@
  *
  */
 
-#include <config.h>
 #include "nautilus-property-page-provider.h"
 
-#include <glib-object.h>
+G_DEFINE_INTERFACE (NautilusPropertyPageProvider, nautilus_property_page_provider,
+                    G_TYPE_OBJECT)
 
 /**
  * SECTION:nautilus-property-page-provider
  * @title: NautilusPropertyPageProvider
  * @short_description: Interface to provide additional property pages
- * @include: libnautilus-extension/nautilus-property-page-provider.h
  *
  * #NautilusPropertyPageProvider allows extension to provide additional pages
  * for the file properties dialog.
  */
 
 static void
-nautilus_property_page_provider_base_init (gpointer g_class)
+nautilus_property_page_provider_default_init (NautilusPropertyPageProviderInterface *klass)
 {
 }
 
-GType
-nautilus_property_page_provider_get_type (void)
-{
-    static GType type = 0;
-
-    if (!type)
-    {
-        const GTypeInfo info =
-        {
-            sizeof (NautilusPropertyPageProviderIface),
-            nautilus_property_page_provider_base_init,
-            NULL,
-            NULL,
-            NULL,
-            NULL,
-            0,
-            0,
-            NULL
-        };
-
-        type = g_type_register_static (G_TYPE_INTERFACE,
-                                       "NautilusPropertyPageProvider",
-                                       &info, 0);
-        g_type_interface_add_prerequisite (type, G_TYPE_OBJECT);
-    }
-
-    return type;
-}
-
 /**
  * nautilus_property_page_provider_get_pages:
  * @provider: a #NautilusPropertyPageProvider
@@ -85,12 +55,16 @@ nautilus_property_page_provider_get_type (void)
  * Returns: (element-type NautilusPropertyPage) (transfer full): A #GList of allocated #NautilusPropertyPage 
items.
  */
 GList *
-nautilus_property_page_provider_get_pages (NautilusPropertyPageProvider *provider,
+nautilus_property_page_provider_get_pages (NautilusPropertyPageProvider *self,
                                            GList                        *files)
 {
-    g_return_val_if_fail (NAUTILUS_IS_PROPERTY_PAGE_PROVIDER (provider), NULL);
-    g_return_val_if_fail (NAUTILUS_PROPERTY_PAGE_PROVIDER_GET_IFACE (provider)->get_pages != NULL, NULL);
+    NautilusPropertyPageProviderInterface *iface;
+
+    g_return_val_if_fail (NAUTILUS_IS_PROPERTY_PAGE_PROVIDER (self), NULL);
+
+    iface = NAUTILUS_PROPERTY_PAGE_PROVIDER_GET_IFACE (self);
+
+    g_return_val_if_fail (iface->get_pages != NULL, NULL);
 
-    return NAUTILUS_PROPERTY_PAGE_PROVIDER_GET_IFACE (provider)->get_pages
-               (provider, files);
+    return iface->get_pages (self, files);
 }
diff --git a/libnautilus-extension/nautilus-property-page-provider.h 
b/libnautilus-extension/nautilus-property-page-provider.h
index 1a3b36058..55b7742e7 100644
--- a/libnautilus-extension/nautilus-property-page-provider.h
+++ b/libnautilus-extension/nautilus-property-page-provider.h
@@ -30,40 +30,42 @@
 #ifndef NAUTILUS_PROPERTY_PAGE_PROVIDER_H
 #define NAUTILUS_PROPERTY_PAGE_PROVIDER_H
 
+#if !defined (NAUTILUS_EXTENSION_H) && !defined (NAUTILUS_COMPILATION)
+#warning "Only <nautilus-extension.h> should be included directly."
+#endif
+
 #include <glib-object.h>
-#include "nautilus-extension-types.h"
-#include "nautilus-file-info.h"
-#include "nautilus-property-page.h"
 
 G_BEGIN_DECLS
 
-#define NAUTILUS_TYPE_PROPERTY_PAGE_PROVIDER           (nautilus_property_page_provider_get_type ())
-#define NAUTILUS_PROPERTY_PAGE_PROVIDER(obj)           (G_TYPE_CHECK_INSTANCE_CAST ((obj), 
NAUTILUS_TYPE_PROPERTY_PAGE_PROVIDER, NautilusPropertyPageProvider))
-#define NAUTILUS_IS_PROPERTY_PAGE_PROVIDER(obj)        (G_TYPE_CHECK_INSTANCE_TYPE ((obj), 
NAUTILUS_TYPE_PROPERTY_PAGE_PROVIDER))
-#define NAUTILUS_PROPERTY_PAGE_PROVIDER_GET_IFACE(obj) (G_TYPE_INSTANCE_GET_INTERFACE ((obj), 
NAUTILUS_TYPE_PROPERTY_PAGE_PROVIDER, NautilusPropertyPageProviderIface))
+#define NAUTILUS_TYPE_PROPERTY_PAGE_PROVIDER (nautilus_property_page_provider_get_type ())
+
+G_DECLARE_INTERFACE (NautilusPropertyPageProvider, nautilus_property_page_provider,
+                     NAUTILUS, PROPERTY_PAGE_PROVIDER,
+                     GObject)
 
-typedef struct _NautilusPropertyPageProvider       NautilusPropertyPageProvider;
-typedef struct _NautilusPropertyPageProviderIface  NautilusPropertyPageProviderIface;
+/* For compatibility reasons, remove this once you start introducing breaking changes. */
+typedef NautilusPropertyPageProviderInterface NautilusPropertyPageProviderIface;
 
 /**
- * NautilusPropertyPageProviderIface:
+ * NautilusPropertyPageProviderInterface:
  * @g_iface: The parent interface.
  * @get_pages: Returns a #GList of #NautilusPropertyPage.
  *   See nautilus_property_page_provider_get_pages() for details.
  *
  * Interface for extensions to provide additional property pages.
  */
-struct _NautilusPropertyPageProviderIface {
-       GTypeInterface g_iface;
+struct _NautilusPropertyPageProviderInterface
+{
+    GTypeInterface g_iface;
 
-       GList *(*get_pages) (NautilusPropertyPageProvider *provider,
-                            GList                        *files);
+    GList *(*get_pages) (NautilusPropertyPageProvider *provider,
+                         GList                        *files);
 };
 
 /* Interface Functions */
-GType                   nautilus_property_page_provider_get_type  (void);
-GList                  *nautilus_property_page_provider_get_pages (NautilusPropertyPageProvider *provider,
-                                                                  GList                        *files);
+GList *nautilus_property_page_provider_get_pages (NautilusPropertyPageProvider *provider,
+                                                  GList                        *files);
 
 G_END_DECLS
 
diff --git a/libnautilus-extension/nautilus-property-page.c b/libnautilus-extension/nautilus-property-page.c
index a1c9d3a87..ca81fc121 100644
--- a/libnautilus-extension/nautilus-property-page.c
+++ b/libnautilus-extension/nautilus-property-page.c
@@ -35,20 +35,21 @@ enum
     LAST_PROP
 };
 
-struct _NautilusPropertyPageDetails
+struct _NautilusPropertyPage
 {
+    GObject parent_instance;
+
     char *name;
     GtkWidget *label;
     GtkWidget *page;
 };
 
-static GObjectClass *parent_class = NULL;
+G_DEFINE_TYPE (NautilusPropertyPage, nautilus_property_page, G_TYPE_OBJECT)
 
 /**
  * SECTION:nautilus-property-page
  * @title: NautilusPropertyPage
  * @short_description: Property page descriptor object
- * @include: libnautilus-extension/nautilus-property-page.h
  *
  * #NautilusPropertyPage is an object that describes a page in the file
  * properties dialog. Extensions can provide #NautilusPropertyPage objects
@@ -75,9 +76,8 @@ nautilus_property_page_new (const char *name,
     NautilusPropertyPage *page;
 
     g_return_val_if_fail (name != NULL, NULL);
-    g_return_val_if_fail (label != NULL && GTK_IS_WIDGET (label), NULL);
-    g_return_val_if_fail (page_widget != NULL && GTK_IS_WIDGET (page_widget),
-                          NULL);
+    g_return_val_if_fail (GTK_IS_WIDGET (label), NULL);
+    g_return_val_if_fail (GTK_IS_WIDGET (page_widget), NULL);
 
     page = g_object_new (NAUTILUS_TYPE_PROPERTY_PAGE,
                          "name", name,
@@ -102,19 +102,19 @@ nautilus_property_page_get_property (GObject    *object,
     {
         case PROP_NAME:
         {
-            g_value_set_string (value, page->details->name);
+            g_value_set_string (value, page->name);
         }
         break;
 
         case PROP_LABEL:
         {
-            g_value_set_object (value, page->details->label);
+            g_value_set_object (value, page->label);
         }
         break;
 
         case PROP_PAGE:
         {
-            g_value_set_object (value, page->details->page);
+            g_value_set_object (value, page->page);
         }
         break;
 
@@ -140,32 +140,32 @@ nautilus_property_page_set_property (GObject      *object,
     {
         case PROP_NAME:
         {
-            g_free (page->details->name);
-            page->details->name = g_strdup (g_value_get_string (value));
+            g_free (page->name);
+            page->name = g_strdup (g_value_get_string (value));
             g_object_notify (object, "name");
         }
         break;
 
         case PROP_LABEL:
         {
-            if (page->details->label)
+            if (page->label)
             {
-                g_object_unref (page->details->label);
+                g_object_unref (page->label);
             }
 
-            page->details->label = g_object_ref (g_value_get_object (value));
+            page->label = g_object_ref (g_value_get_object (value));
             g_object_notify (object, "label");
         }
         break;
 
         case PROP_PAGE:
         {
-            if (page->details->page)
+            if (page->page)
             {
-                g_object_unref (page->details->page);
+                g_object_unref (page->page);
             }
 
-            page->details->page = g_object_ref (g_value_get_object (value));
+            page->page = g_object_ref (g_value_get_object (value));
             g_object_notify (object, "page");
         }
         break;
@@ -185,15 +185,15 @@ nautilus_property_page_dispose (GObject *object)
 
     page = NAUTILUS_PROPERTY_PAGE (object);
 
-    if (page->details->label)
+    if (page->label)
     {
-        g_object_unref (page->details->label);
-        page->details->label = NULL;
+        g_object_unref (page->label);
+        page->label = NULL;
     }
-    if (page->details->page)
+    if (page->page)
     {
-        g_object_unref (page->details->page);
-        page->details->page = NULL;
+        g_object_unref (page->page);
+        page->page = NULL;
     }
 }
 
@@ -204,24 +204,19 @@ nautilus_property_page_finalize (GObject *object)
 
     page = NAUTILUS_PROPERTY_PAGE (object);
 
-    g_free (page->details->name);
-
-    g_free (page->details);
+    g_free (page->name);
 
-    G_OBJECT_CLASS (parent_class)->finalize (object);
+    G_OBJECT_CLASS (nautilus_property_page_parent_class)->finalize (object);
 }
 
 static void
-nautilus_property_page_instance_init (NautilusPropertyPage *page)
+nautilus_property_page_init (NautilusPropertyPage *page)
 {
-    page->details = g_new0 (NautilusPropertyPageDetails, 1);
 }
 
 static void
 nautilus_property_page_class_init (NautilusPropertyPageClass *class)
 {
-    parent_class = g_type_class_peek_parent (class);
-
     G_OBJECT_CLASS (class)->finalize = nautilus_property_page_finalize;
     G_OBJECT_CLASS (class)->dispose = nautilus_property_page_dispose;
     G_OBJECT_CLASS (class)->get_property = nautilus_property_page_get_property;
@@ -249,32 +244,3 @@ nautilus_property_page_class_init (NautilusPropertyPageClass *class)
                                                           GTK_TYPE_WIDGET,
                                                           G_PARAM_READWRITE));
 }
-
-GType
-nautilus_property_page_get_type (void)
-{
-    static GType type = 0;
-
-    if (!type)
-    {
-        const GTypeInfo info =
-        {
-            sizeof (NautilusPropertyPageClass),
-            NULL,
-            NULL,
-            (GClassInitFunc) nautilus_property_page_class_init,
-            NULL,
-            NULL,
-            sizeof (NautilusPropertyPage),
-            0,
-            (GInstanceInitFunc) nautilus_property_page_instance_init
-        };
-
-        type = g_type_register_static
-                   (G_TYPE_OBJECT,
-                   "NautilusPropertyPage",
-                   &info, 0);
-    }
-
-    return type;
-}
diff --git a/libnautilus-extension/nautilus-property-page.h b/libnautilus-extension/nautilus-property-page.h
index da8d44cb5..483df7c72 100644
--- a/libnautilus-extension/nautilus-property-page.h
+++ b/libnautilus-extension/nautilus-property-page.h
@@ -24,39 +24,24 @@
 #ifndef NAUTILUS_PROPERTY_PAGE_H
 #define NAUTILUS_PROPERTY_PAGE_H
 
+#if !defined (NAUTILUS_EXTENSION_H) && !defined (NAUTILUS_COMPILATION)
+#warning "Only <nautilus-extension.h> should be included directly."
+#endif
+
 #include <glib-object.h>
 #include <gtk/gtk.h>
-#include "nautilus-extension-types.h"
 
 G_BEGIN_DECLS
 
-#define NAUTILUS_TYPE_PROPERTY_PAGE            (nautilus_property_page_get_type())
-#define NAUTILUS_PROPERTY_PAGE(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), 
NAUTILUS_TYPE_PROPERTY_PAGE, NautilusPropertyPage))
-#define NAUTILUS_PROPERTY_PAGE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), 
NAUTILUS_TYPE_PROPERTY_PAGE, NautilusPropertyPageClass))
-#define NAUTILUS_IS_PROPERTY_PAGE(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), 
NAUTILUS_TYPE_PROPERTY_PAGE))
-#define NAUTILUS_IS_PROPERTY_PAGE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((obj), NAUTILUS_TYPE_PROPERTY_PAGE))
-#define NAUTILUS_PROPERTY_PAGE_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj), 
NAUTILUS_TYPE_PROPERTY_PAGE, NautilusPropertyPageClass))
-
-typedef struct _NautilusPropertyPage        NautilusPropertyPage;
-typedef struct _NautilusPropertyPageDetails NautilusPropertyPageDetails;
-typedef struct _NautilusPropertyPageClass   NautilusPropertyPageClass;
-
-struct _NautilusPropertyPage
-{
-       GObject parent;
-
-       NautilusPropertyPageDetails *details;
-};
+#define NAUTILUS_TYPE_PROPERTY_PAGE (nautilus_property_page_get_type ())
 
-struct _NautilusPropertyPageClass 
-{
-       GObjectClass parent;
-};
+G_DECLARE_FINAL_TYPE (NautilusPropertyPage, nautilus_property_page,
+                      NAUTILUS, PROPERTY_PAGE,
+                      GObject)
 
-GType                 nautilus_property_page_get_type  (void);
-NautilusPropertyPage *nautilus_property_page_new       (const char           *name,
-                                                       GtkWidget            *label,
-                                                       GtkWidget            *page);
+NautilusPropertyPage *nautilus_property_page_new (const char *name,
+                                                  GtkWidget  *label,
+                                                  GtkWidget  *page);
 
 /* NautilusPropertyPage has the following properties:
  *   name (string)        - the identifier for the property page
diff --git a/src/nautilus-application.c b/src/nautilus-application.c
index 61d980863..a73b77363 100644
--- a/src/nautilus-application.c
+++ b/src/nautilus-application.c
@@ -50,7 +50,8 @@
 #include "nautilus-profile.h"
 #include "nautilus-signaller.h"
 #include "nautilus-ui-utilities.h"
-#include <libnautilus-extension/nautilus-menu-provider.h>
+
+#include <nautilus-extension.h>
 
 #define DEBUG_FLAG NAUTILUS_DEBUG_APPLICATION
 #include "nautilus-debug.h"
diff --git a/src/nautilus-column-chooser.c b/src/nautilus-column-chooser.c
index 24a77386e..ba05b5924 100644
--- a/src/nautilus-column-chooser.c
+++ b/src/nautilus-column-chooser.c
@@ -26,6 +26,8 @@
 #include <gtk/gtk.h>
 #include <glib/gi18n.h>
 
+#include <nautilus-extension.h>
+
 #include "nautilus-column-utilities.h"
 
 struct _NautilusColumnChooser
diff --git a/src/nautilus-column-utilities.c b/src/nautilus-column-utilities.c
index 22789938b..7f00fa95f 100644
--- a/src/nautilus-column-utilities.c
+++ b/src/nautilus-column-utilities.c
@@ -25,7 +25,7 @@
 #include <string.h>
 #include <eel/eel-glib-extensions.h>
 #include <glib/gi18n.h>
-#include <libnautilus-extension/nautilus-column-provider.h>
+#include <nautilus-extension.h>
 #include "nautilus-module.h"
 
 static const char *default_column_order[] =
diff --git a/src/nautilus-column-utilities.h b/src/nautilus-column-utilities.h
index 83e392812..6d07aa3e5 100644
--- a/src/nautilus-column-utilities.h
+++ b/src/nautilus-column-utilities.h
@@ -23,7 +23,6 @@
 #ifndef NAUTILUS_COLUMN_UTILITIES_H
 #define NAUTILUS_COLUMN_UTILITIES_H
 
-#include <libnautilus-extension/nautilus-column.h>
 #include "nautilus-file.h"
 
 GList *nautilus_get_all_columns       (void);
diff --git a/src/nautilus-desktop-item-properties.c b/src/nautilus-desktop-item-properties.c
index 558cfbfc9..89965121b 100644
--- a/src/nautilus-desktop-item-properties.c
+++ b/src/nautilus-desktop-item-properties.c
@@ -29,8 +29,7 @@
 #include <eel/eel-glib-extensions.h>
 #include <gtk/gtk.h>
 #include <glib/gi18n.h>
-#include <libnautilus-extension/nautilus-extension-types.h>
-#include <libnautilus-extension/nautilus-file-info.h>
+#include <nautilus-extension.h>
 #include "nautilus-file.h"
 #include "nautilus-file-attributes.h"
 
diff --git a/src/nautilus-directory-private.h b/src/nautilus-directory-private.h
index a7d8c7a8e..f60387049 100644
--- a/src/nautilus-directory-private.h
+++ b/src/nautilus-directory-private.h
@@ -25,7 +25,7 @@
 #include "nautilus-file-queue.h"
 #include "nautilus-file.h"
 #include "nautilus-monitor.h"
-#include <libnautilus-extension/nautilus-info-provider.h>
+#include <nautilus-extension.h>
 #include <libxml/tree.h>
 
 typedef struct LinkInfoReadState LinkInfoReadState;
diff --git a/src/nautilus-file.c b/src/nautilus-file.c
index bbbb20df5..496cbefaf 100644
--- a/src/nautilus-file.c
+++ b/src/nautilus-file.c
@@ -54,9 +54,8 @@
 #include <glib.h>
 #include <gnome-autoar/gnome-autoar.h>
 #include <gdesktop-enums.h>
-#include <libnautilus-extension/nautilus-file-info.h>
-#include <libnautilus-extension/nautilus-extension-private.h>
 #include <libxml/parser.h>
+#include <libnautilus-extension/nautilus-extension-private.h>
 #include <pwd.h>
 #include <stdlib.h>
 #include <sys/time.h>
@@ -162,7 +161,7 @@ static GQuark attribute_name_q,
               attribute_free_space_q,
               attribute_favorite_q;
 
-static void     nautilus_file_info_iface_init (NautilusFileInfoIface *iface);
+static void     nautilus_file_info_iface_init (NautilusFileInfoInterface *iface);
 static char *nautilus_file_get_owner_as_string (NautilusFile *file,
                                                 gboolean      include_real_name);
 static char *nautilus_file_get_type_as_string (NautilusFile *file);
@@ -711,7 +710,7 @@ nautilus_file_new_from_info (NautilusDirectory *directory,
     return file;
 }
 
-static NautilusFile *
+static NautilusFileInfo *
 nautilus_file_get_internal (GFile    *location,
                             gboolean  create)
 {
@@ -782,45 +781,39 @@ nautilus_file_get_internal (GFile    *location,
     g_free (basename);
     nautilus_directory_unref (directory);
 
-    return file;
+    return NAUTILUS_FILE_INFO (file);
 }
 
 NautilusFile *
 nautilus_file_get (GFile *location)
 {
-    return nautilus_file_get_internal (location, TRUE);
+    return NAUTILUS_FILE (nautilus_file_get_internal (location, TRUE));
 }
 
 NautilusFile *
 nautilus_file_get_existing (GFile *location)
 {
-    return nautilus_file_get_internal (location, FALSE);
+    return NAUTILUS_FILE (nautilus_file_get_internal (location, FALSE));
 }
 
 NautilusFile *
 nautilus_file_get_existing_by_uri (const char *uri)
 {
-    GFile *location;
-    NautilusFile *file;
+    g_autoptr (GFile) location = NULL;
 
     location = g_file_new_for_uri (uri);
-    file = nautilus_file_get_internal (location, FALSE);
-    g_object_unref (location);
 
-    return file;
+    return nautilus_file_get_existing (location);
 }
 
 NautilusFile *
 nautilus_file_get_by_uri (const char *uri)
 {
-    GFile *location;
-    NautilusFile *file;
+    g_autoptr (GFile) location = NULL;
 
     location = g_file_new_for_uri (uri);
-    file = nautilus_file_get_internal (location, TRUE);
-    g_object_unref (location);
 
-    return file;
+    return nautilus_file_get (location);
 }
 
 gboolean
@@ -1017,41 +1010,29 @@ nautilus_file_get_parent_uri_for_display (NautilusFile *file)
 char *
 nautilus_file_get_parent_uri (NautilusFile *file)
 {
-    g_assert (NAUTILUS_IS_FILE (file));
-
-    if (nautilus_file_is_self_owned (file))
-    {
-        /* Callers expect an empty string, not a NULL. */
-        return g_strdup ("");
-    }
+    g_return_val_if_fail (NAUTILUS_IS_FILE (file), NULL);
 
-    return nautilus_directory_get_uri (file->details->directory);
+    return nautilus_file_info_get_parent_uri (NAUTILUS_FILE_INFO (file));
 }
 
 GFile *
 nautilus_file_get_parent_location (NautilusFile *file)
 {
-    g_assert (NAUTILUS_IS_FILE (file));
-
-    if (nautilus_file_is_self_owned (file))
-    {
-        return NULL;
-    }
+    g_return_val_if_fail (NAUTILUS_IS_FILE (file), NULL);
 
-    return nautilus_directory_get_location (file->details->directory);
+    return nautilus_file_info_get_parent_location (NAUTILUS_FILE_INFO (file));
 }
 
 NautilusFile *
 nautilus_file_get_parent (NautilusFile *file)
 {
-    g_assert (NAUTILUS_IS_FILE (file));
+    NautilusFileInfo *file_info;
 
-    if (nautilus_file_is_self_owned (file))
-    {
-        return NULL;
-    }
+    g_return_val_if_fail (NAUTILUS_IS_FILE (file), NULL);
+
+    file_info = NAUTILUS_FILE_INFO (file);
 
-    return nautilus_directory_get_corresponding_file (file->details->directory);
+    return NAUTILUS_FILE (nautilus_file_info_get_parent_info (file_info));
 }
 
 /**
@@ -1091,7 +1072,7 @@ nautilus_file_can_write (NautilusFile *file)
 {
     g_return_val_if_fail (NAUTILUS_IS_FILE (file), FALSE);
 
-    return file->details->can_write;
+    return nautilus_file_info_can_write (NAUTILUS_FILE_INFO (file));
 }
 
 /**
@@ -1744,57 +1725,26 @@ nautilus_file_can_trash (NautilusFile *file)
 GFile *
 nautilus_file_get_location (NautilusFile *file)
 {
-    g_autoptr (GFile) location = NULL;
-
     g_return_val_if_fail (NAUTILUS_IS_FILE (file), NULL);
 
-    location = nautilus_directory_get_location (file->details->directory);
-
-    if (nautilus_file_is_self_owned (file))
-    {
-        return g_object_ref (location);
-    }
-
-    return g_file_get_child (location, eel_ref_str_peek (file->details->name));
+    return nautilus_file_info_get_location (NAUTILUS_FILE_INFO (file));
 }
 
 /* Return the actual uri associated with the passed-in file. */
 char *
 nautilus_file_get_uri (NautilusFile *file)
 {
-    char *uri;
-    GFile *loc;
-
     g_return_val_if_fail (NAUTILUS_IS_FILE (file), NULL);
 
-    loc = nautilus_file_get_location (file);
-    uri = g_file_get_uri (loc);
-    g_object_unref (loc);
-
-    return uri;
+    return nautilus_file_info_get_uri (NAUTILUS_FILE_INFO (file));
 }
 
 char *
 nautilus_file_get_uri_scheme (NautilusFile *file)
 {
-    g_autoptr (GFile) location = NULL;
-    char *scheme;
-
     g_return_val_if_fail (NAUTILUS_IS_FILE (file), NULL);
 
-    if (file->details->directory == NULL)
-    {
-        return NULL;
-    }
-
-    location = nautilus_directory_get_location (file->details->directory);
-    if (location == NULL)
-    {
-        return NULL;
-    }
-    scheme = g_file_get_uri_scheme (location);
-
-    return scheme;
+    return nautilus_file_info_get_uri_scheme (NAUTILUS_FILE_INFO (file));
 }
 
 
@@ -4603,7 +4553,9 @@ nautilus_file_get_edit_name (NautilusFile *file)
 char *
 nautilus_file_get_name (NautilusFile *file)
 {
-    return g_strdup (eel_ref_str_peek (file->details->name));
+    g_return_val_if_fail (NAUTILUS_IS_FILE (file), NULL);
+
+    return nautilus_file_info_get_name (NAUTILUS_FILE_INFO (file));
 }
 
 /**
@@ -4671,12 +4623,7 @@ nautilus_file_get_activation_uri (NautilusFile *file)
 {
     g_return_val_if_fail (NAUTILUS_IS_FILE (file), NULL);
 
-    if (file->details->activation_uri != NULL)
-    {
-        return g_strdup (file->details->activation_uri);
-    }
-
-    return nautilus_file_get_uri (file);
+    return nautilus_file_info_get_uri (NAUTILUS_FILE_INFO (file));
 }
 
 GFile *
@@ -7507,7 +7454,9 @@ char *
 nautilus_file_get_string_attribute (NautilusFile *file,
                                     const char   *attribute_name)
 {
-    return nautilus_file_get_string_attribute_q (file, g_quark_from_string (attribute_name));
+    g_return_val_if_fail (NAUTILUS_IS_FILE (file), NULL);
+
+    return nautilus_file_info_get_string_attribute (NAUTILUS_FILE_INFO (file), attribute_name);
 }
 
 
@@ -7819,12 +7768,9 @@ nautilus_file_get_detailed_type_as_string (NautilusFile *file)
 GFileType
 nautilus_file_get_file_type (NautilusFile *file)
 {
-    if (file == NULL)
-    {
-        return G_FILE_TYPE_UNKNOWN;
-    }
+    g_return_val_if_fail (NAUTILUS_IS_FILE (file), G_FILE_TYPE_UNKNOWN);
 
-    return file->details->type;
+    return nautilus_file_info_get_file_type (NAUTILUS_FILE_INFO (file));;
 }
 
 /**
@@ -7839,15 +7785,9 @@ nautilus_file_get_file_type (NautilusFile *file)
 char *
 nautilus_file_get_mime_type (NautilusFile *file)
 {
-    if (file != NULL)
-    {
-        g_return_val_if_fail (NAUTILUS_IS_FILE (file), NULL);
-        if (file->details->mime_type != NULL)
-        {
-            return g_strdup (eel_ref_str_peek (file->details->mime_type));
-        }
-    }
-    return g_strdup ("application/octet-stream");
+    g_return_val_if_fail (NAUTILUS_IS_FILE (file), NULL);
+
+    return nautilus_file_info_get_mime_type (NAUTILUS_FILE_INFO (file));
 }
 
 /**
@@ -7869,12 +7809,7 @@ nautilus_file_is_mime_type (NautilusFile *file,
     g_return_val_if_fail (NAUTILUS_IS_FILE (file), FALSE);
     g_return_val_if_fail (mime_type != NULL, FALSE);
 
-    if (file->details->mime_type == NULL)
-    {
-        return FALSE;
-    }
-    return g_content_type_is_a (eel_ref_str_peek (file->details->mime_type),
-                                mime_type);
+    return nautilus_file_info_is_mime_type (NAUTILUS_FILE_INFO (file), mime_type);
 }
 
 char *
@@ -7930,11 +7865,9 @@ nautilus_file_is_symbolic_link (NautilusFile *file)
 GMount *
 nautilus_file_get_mount (NautilusFile *file)
 {
-    if (file->details->mount)
-    {
-        return g_object_ref (file->details->mount);
-    }
-    return NULL;
+    g_return_val_if_fail (NAUTILUS_IS_FILE (file), NULL);
+
+    return nautilus_file_info_get_mount (NAUTILUS_FILE_INFO (file));
 }
 
 static void
@@ -8204,7 +8137,9 @@ nautilus_file_is_regular_file (NautilusFile *file)
 gboolean
 nautilus_file_is_directory (NautilusFile *file)
 {
-    return nautilus_file_get_file_type (file) == G_FILE_TYPE_DIRECTORY;
+    g_return_val_if_fail (NAUTILUS_IS_FILE (file), FALSE);
+
+    return nautilus_file_info_is_directory (NAUTILUS_FILE_INFO (file));
 }
 
 /**
@@ -8614,7 +8549,7 @@ nautilus_file_is_gone (NautilusFile *file)
 {
     g_return_val_if_fail (NAUTILUS_IS_FILE (file), FALSE);
 
-    return file->details->is_gone;
+    return nautilus_file_info_is_gone (NAUTILUS_FILE_INFO (file));
 }
 
 /**
@@ -9521,66 +9456,6 @@ nautilus_file_class_init (NautilusFileClass *class)
                       NULL);
 }
 
-static void
-nautilus_file_add_emblem (NautilusFile *file,
-                          const char   *emblem_name)
-{
-    if (file->details->pending_info_providers)
-    {
-        file->details->pending_extension_emblems = g_list_prepend (file->details->pending_extension_emblems,
-                                                                   g_strdup (emblem_name));
-    }
-    else
-    {
-        file->details->extension_emblems = g_list_prepend (file->details->extension_emblems,
-                                                           g_strdup (emblem_name));
-    }
-
-    nautilus_file_changed (file);
-}
-
-static void
-nautilus_file_add_string_attribute (NautilusFile *file,
-                                    const char   *attribute_name,
-                                    const char   *value)
-{
-    if (file->details->pending_info_providers)
-    {
-        /* Lazily create hashtable */
-        if (!file->details->pending_extension_attributes)
-        {
-            file->details->pending_extension_attributes =
-                g_hash_table_new_full (g_direct_hash, g_direct_equal,
-                                       NULL,
-                                       (GDestroyNotify) g_free);
-        }
-        g_hash_table_insert (file->details->pending_extension_attributes,
-                             GINT_TO_POINTER (g_quark_from_string (attribute_name)),
-                             g_strdup (value));
-    }
-    else
-    {
-        if (!file->details->extension_attributes)
-        {
-            file->details->extension_attributes =
-                g_hash_table_new_full (g_direct_hash, g_direct_equal,
-                                       NULL,
-                                       (GDestroyNotify) g_free);
-        }
-        g_hash_table_insert (file->details->extension_attributes,
-                             GINT_TO_POINTER (g_quark_from_string (attribute_name)),
-                             g_strdup (value));
-    }
-
-    nautilus_file_changed (file);
-}
-
-static void
-nautilus_file_invalidate_extension_info (NautilusFile *file)
-{
-    nautilus_file_invalidate_attributes (file, NAUTILUS_FILE_ATTRIBUTE_EXTENSION_INFO);
-}
-
 void
 nautilus_file_info_providers_done (NautilusFile *file)
 {
@@ -9710,28 +9585,327 @@ nautilus_drag_can_accept_info (NautilusFile              *drop_target_item,
     }
 }
 
+static gboolean
+is_gone (NautilusFileInfo *file_info)
+{
+    NautilusFile *file;
+
+    file = NAUTILUS_FILE (file_info);
+
+    return file->details->is_gone;
+}
+
+static char *
+get_name (NautilusFileInfo *file_info)
+{
+    NautilusFile *file;
+
+    file = NAUTILUS_FILE (file_info);
+
+    return g_strdup (eel_ref_str_peek (file->details->name));
+}
+
+static char *
+get_uri (NautilusFileInfo *file_info)
+{
+    NautilusFile *file;
+    g_autoptr (GFile) location = NULL;
+
+    file = NAUTILUS_FILE (file_info);
+    location = nautilus_file_get_location (file);
+
+    return g_file_get_uri (location);
+}
+
+static char *
+get_parent_uri (NautilusFileInfo *file_info)
+{
+    NautilusFile *file;
+
+    file = NAUTILUS_FILE (file_info);
+
+    if (nautilus_file_is_self_owned (file))
+    {
+        /* Callers expect an empty string, not a NULL. */
+        return g_strdup ("");
+    }
+
+    return nautilus_directory_get_uri (file->details->directory);
+}
+
+static char *
+get_uri_scheme (NautilusFileInfo *file_info)
+{
+    NautilusFile *file;
+    g_autoptr (GFile) location = NULL;
+
+    file = NAUTILUS_FILE (file_info);
+
+    if (file->details->directory == NULL)
+    {
+        return NULL;
+    }
+
+    location = nautilus_directory_get_location (file->details->directory);
+    if (location == NULL)
+    {
+        return NULL;
+    }
+
+    return g_file_get_uri_scheme (location);
+}
+
+static char *
+get_mime_type (NautilusFileInfo *file_info)
+{
+    NautilusFile *file;
+
+    file = NAUTILUS_FILE (file_info);
+
+    if (file->details->mime_type != NULL)
+    {
+        return g_strdup (eel_ref_str_peek (file->details->mime_type));
+    }
+
+    return g_strdup ("application/octet-stream");
+}
+
+static gboolean
+is_mime_type (NautilusFileInfo *file_info,
+              const char       *mime_type)
+{
+    NautilusFile *file;
+
+    file = NAUTILUS_FILE (file_info);
+
+    if (file->details->mime_type == NULL)
+    {
+        return FALSE;
+    }
+
+    return g_content_type_is_a (eel_ref_str_peek (file->details->mime_type), mime_type);
+}
+
+static gboolean
+is_directory (NautilusFileInfo *file_info)
+{
+    NautilusFile *file;
+
+    file = NAUTILUS_FILE (file_info);
+
+    return nautilus_file_get_file_type (file) == G_FILE_TYPE_DIRECTORY;
+}
+
+static void
+add_emblem (NautilusFileInfo *file_info,
+            const char       *emblem_name)
+{
+    NautilusFile *file;
+
+    file = NAUTILUS_FILE (file_info);
+
+    if (file->details->pending_info_providers)
+    {
+        file->details->pending_extension_emblems = g_list_prepend (file->details->pending_extension_emblems,
+                                                                   g_strdup (emblem_name));
+    }
+    else
+    {
+        file->details->extension_emblems = g_list_prepend (file->details->extension_emblems,
+                                                           g_strdup (emblem_name));
+    }
+
+    nautilus_file_changed (file);
+}
+
+static char *
+get_string_attribute (NautilusFileInfo *file_info,
+                      const char       *attribute_name)
+{
+    NautilusFile *file;
+
+    file = NAUTILUS_FILE (file_info);
+
+    return nautilus_file_get_string_attribute_q (file, g_quark_from_string (attribute_name));
+}
+
+static void
+add_string_attribute (NautilusFileInfo *file_info,
+                      const char       *attribute_name,
+                      const char       *value)
+{
+    NautilusFile *file;
+
+    file = NAUTILUS_FILE (file_info);
+
+    if (file->details->pending_info_providers != NULL)
+    {
+        /* Lazily create hashtable */
+        if (file->details->pending_extension_attributes == NULL)
+        {
+            file->details->pending_extension_attributes =
+                g_hash_table_new_full (g_direct_hash, g_direct_equal,
+                                       NULL,
+                                       (GDestroyNotify) g_free);
+        }
+        g_hash_table_insert (file->details->pending_extension_attributes,
+                             GINT_TO_POINTER (g_quark_from_string (attribute_name)),
+                             g_strdup (value));
+    }
+    else
+    {
+        if (file->details->extension_attributes == NULL)
+        {
+            file->details->extension_attributes =
+                g_hash_table_new_full (g_direct_hash, g_direct_equal,
+                                       NULL,
+                                       (GDestroyNotify) g_free);
+        }
+        g_hash_table_insert (file->details->extension_attributes,
+                             GINT_TO_POINTER (g_quark_from_string (attribute_name)),
+                             g_strdup (value));
+    }
+
+    nautilus_file_changed (file);
+}
+
+static void
+invalidate_extension_info (NautilusFileInfo *file_info)
+{
+    NautilusFile *file;
+
+    file = NAUTILUS_FILE (file_info);
+
+    nautilus_file_invalidate_attributes (file, NAUTILUS_FILE_ATTRIBUTE_EXTENSION_INFO);
+}
+
+static char *
+get_activation_uri (NautilusFileInfo *file_info)
+{
+    NautilusFile *file;
+
+    file = NAUTILUS_FILE (file_info);
+
+    if (file->details->activation_uri != NULL)
+    {
+        return g_strdup (file->details->activation_uri);
+    }
+
+    return nautilus_file_get_uri (file);
+}
+
+static GFileType
+get_file_type (NautilusFileInfo *file_info)
+{
+    NautilusFile *file;
+
+    file = NAUTILUS_FILE (file_info);
+
+    return file->details->type;
+}
+
+static GFile *
+get_location (NautilusFileInfo *file_info)
+{
+    NautilusFile *file;
+    g_autoptr (GFile) location = NULL;
+
+    file = NAUTILUS_FILE (file_info);
+    location = nautilus_directory_get_location (file->details->directory);
+
+    if (nautilus_file_is_self_owned (file))
+    {
+        return g_object_ref (location);
+    }
+
+    return g_file_get_child (location, eel_ref_str_peek (file->details->name));
+}
+
+static GFile *
+get_parent_location (NautilusFileInfo *file_info)
+{
+    NautilusFile *file;
+
+    file = NAUTILUS_FILE (file_info);
+
+    if (nautilus_file_is_self_owned (file))
+    {
+        return NULL;
+    }
+
+    return nautilus_directory_get_location (file->details->directory);
+}
+
+static NautilusFileInfo *
+get_parent_info (NautilusFileInfo *file_info)
+{
+    NautilusFile *file;
+    NautilusFile *parent_file;
+
+    file = NAUTILUS_FILE (file_info);
+
+    if (nautilus_file_is_self_owned (file))
+    {
+        return NULL;
+    }
+
+    parent_file = nautilus_directory_get_corresponding_file (file->details->directory);
+
+    return NAUTILUS_FILE_INFO (parent_file);
+}
+
+static GMount *
+get_mount (NautilusFileInfo *file_info)
+{
+    NautilusFile *file;
+
+    file = NAUTILUS_FILE (file_info);
+
+    if (file->details->mount)
+    {
+        return g_object_ref (file->details->mount);
+    }
+
+    return NULL;
+}
+
+static gboolean
+can_write (NautilusFileInfo *file_info)
+{
+    NautilusFile *file;
+
+    file = NAUTILUS_FILE (file_info);
+
+    return file->details->can_write;
+}
+
 static void
-nautilus_file_info_iface_init (NautilusFileInfoIface *iface)
-{
-    iface->is_gone = nautilus_file_is_gone;
-    iface->get_name = nautilus_file_get_name;
-    iface->get_file_type = nautilus_file_get_file_type;
-    iface->get_location = nautilus_file_get_location;
-    iface->get_uri = nautilus_file_get_uri;
-    iface->get_parent_location = nautilus_file_get_parent_location;
-    iface->get_parent_uri = nautilus_file_get_parent_uri;
-    iface->get_parent_info = nautilus_file_get_parent;
-    iface->get_mount = nautilus_file_get_mount;
-    iface->get_uri_scheme = nautilus_file_get_uri_scheme;
-    iface->get_activation_uri = nautilus_file_get_activation_uri;
-    iface->get_mime_type = nautilus_file_get_mime_type;
-    iface->is_mime_type = nautilus_file_is_mime_type;
-    iface->is_directory = nautilus_file_is_directory;
-    iface->can_write = nautilus_file_can_write;
-    iface->add_emblem = nautilus_file_add_emblem;
-    iface->get_string_attribute = nautilus_file_get_string_attribute;
-    iface->add_string_attribute = nautilus_file_add_string_attribute;
-    iface->invalidate_extension_info = nautilus_file_invalidate_extension_info;
+nautilus_file_info_iface_init (NautilusFileInfoInterface *iface)
+{
+    iface->is_gone = is_gone;
+
+    iface->get_name = get_name;
+    iface->get_uri = get_uri;
+    iface->get_parent_uri = get_parent_uri;
+    iface->get_uri_scheme = get_uri_scheme;
+
+    iface->get_mime_type = get_mime_type;
+    iface->is_mime_type = is_mime_type;
+    iface->is_directory = is_directory;
+
+    iface->add_emblem = add_emblem;
+    iface->get_string_attribute = get_string_attribute;
+    iface->add_string_attribute = add_string_attribute;
+    iface->invalidate_extension_info = invalidate_extension_info;
+
+    iface->get_activation_uri = get_activation_uri;
+
+    iface->get_file_type = get_file_type;
+    iface->get_location = get_location;
+    iface->get_parent_location = get_parent_location;
+    iface->get_parent_info = get_parent_info;
+    iface->get_mount = get_mount;
+    iface->can_write = can_write;
 }
 
 #if !defined (NAUTILUS_OMIT_SELF_CHECK)
diff --git a/src/nautilus-files-view.c b/src/nautilus-files-view.c
index 7937bed31..ec86d7961 100644
--- a/src/nautilus-files-view.c
+++ b/src/nautilus-files-view.c
@@ -62,7 +62,7 @@
 #include <eel/eel-string.h>
 #include <eel/eel-vfs-extensions.h>
 
-#include <libnautilus-extension/nautilus-menu-provider.h>
+#include <nautilus-extension.h>
 #include "nautilus-clipboard.h"
 #include "nautilus-search-directory.h"
 #include "nautilus-favorite-directory.h"
@@ -4814,12 +4814,14 @@ get_extension_background_menu_items (NautilusFilesView *view)
     for (l = providers; l != NULL; l = l->next)
     {
         NautilusMenuProvider *provider;
+        NautilusFileInfo *file_info;
         GList *file_items;
 
         provider = NAUTILUS_MENU_PROVIDER (l->data);
+        file_info = NAUTILUS_FILE_INFO (priv->directory_as_file);
         file_items = nautilus_menu_provider_get_background_items (provider,
                                                                   GTK_WIDGET (window),
-                                                                  priv->directory_as_file);
+                                                                  file_info);
         items = g_list_concat (items, file_items);
     }
 
diff --git a/src/nautilus-list-model.h b/src/nautilus-list-model.h
index f44be9957..9f00dd198 100644
--- a/src/nautilus-list-model.h
+++ b/src/nautilus-list-model.h
@@ -24,7 +24,7 @@
 #include <gdk/gdk.h>
 #include "nautilus-file.h"
 #include "nautilus-directory.h"
-#include <libnautilus-extension/nautilus-column.h>
+#include <nautilus-extension.h>
 
 #ifndef NAUTILUS_LIST_MODEL_H
 #define NAUTILUS_LIST_MODEL_H
diff --git a/src/nautilus-list-view.c b/src/nautilus-list-view.c
index 6ad2a4260..8f226b6e2 100644
--- a/src/nautilus-list-view.c
+++ b/src/nautilus-list-view.c
@@ -44,7 +44,6 @@
 #include <glib/gi18n.h>
 #include <glib-object.h>
 #include <libgd/gd.h>
-#include <libnautilus-extension/nautilus-column-provider.h>
 #include "nautilus-column-chooser.h"
 #include "nautilus-column-utilities.h"
 #include "nautilus-dnd.h"
diff --git a/src/nautilus-preferences-window.c b/src/nautilus-preferences-window.c
index 36937f5f5..cbe817f08 100644
--- a/src/nautilus-preferences-window.c
+++ b/src/nautilus-preferences-window.c
@@ -34,6 +34,8 @@
 
 #include <eel/eel-glib-extensions.h>
 
+#include <nautilus-extension.h>
+
 #include "nautilus-column-chooser.h"
 #include "nautilus-column-utilities.h"
 #include "nautilus-global-preferences.h"
diff --git a/src/nautilus-properties-window.c b/src/nautilus-properties-window.c
index 9f6571054..14302204c 100644
--- a/src/nautilus-properties-window.c
+++ b/src/nautilus-properties-window.c
@@ -44,7 +44,7 @@
 #include <eel/eel-string.h>
 #include <eel/eel-vfs-extensions.h>
 
-#include <libnautilus-extension/nautilus-property-page-provider.h>
+#include <nautilus-extension.h>
 #include "nautilus-file-attributes.h"
 #include "nautilus-file-operations.h"
 #include "nautilus-file-utilities.h"
diff --git a/src/nautilus-ui-utilities.h b/src/nautilus-ui-utilities.h
index ce949483f..dd8471c51 100644
--- a/src/nautilus-ui-utilities.h
+++ b/src/nautilus-ui-utilities.h
@@ -23,7 +23,6 @@
 #define NAUTILUS_UI_UTILITIES_H
 
 #include <gtk/gtk.h>
-#include <libnautilus-extension/nautilus-menu-item.h>
 
 
 void nautilus_gmenu_add_item_in_submodel          (GMenu             *menu,
diff --git a/src/nautilus-window-slot.c b/src/nautilus-window-slot.c
index b8452e817..f3e42c47b 100644
--- a/src/nautilus-window-slot.c
+++ b/src/nautilus-window-slot.c
@@ -43,7 +43,7 @@
 #include "nautilus-module.h"
 #include "nautilus-monitor.h"
 #include "nautilus-profile.h"
-#include <libnautilus-extension/nautilus-location-widget-provider.h>
+#include <nautilus-extension.h>
 #include "nautilus-ui-utilities.h"
 #include <eel/eel-vfs-extensions.h>
 



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]