[dia/zbrown/object-change: 3/16] change: replace ObjectChange with DiaObjectChange




commit 64a2d82b45cdab0cddd08f563e19b78b75ca947c
Author: Zander Brown <zbrown gnome org>
Date:   Sun Oct 4 14:16:17 2020 +0100

    change: replace ObjectChange with DiaObjectChange
    
    For now use a simple wrapper around the existing ObjectChanges

 app/commands.c                       |  16 +--
 app/disp_callbacks.c                 |  58 ++++++---
 app/display.c                        |  10 +-
 app/find-and-replace.c               |   3 +-
 app/menus.c                          |  36 ++---
 app/modify_tool.c                    |  39 ++++--
 app/properties-dialog.c              |  13 +-
 app/undo.c                           | 104 ++++++++-------
 app/undo.h                           |   9 +-
 bindings/dia-object.cpp              |  39 ++++--
 bindings/dia-object.h                |   6 +-
 docs/dia/dia-docs.xml                |  13 +-
 lib/bezier-common.c                  |  14 +-
 lib/bezier-common.h                  |  26 ++--
 lib/bezier_conn.c                    |  59 ++++-----
 lib/bezier_conn.h                    |  69 ++++++----
 lib/beziershape.c                    |  62 ++++-----
 lib/beziershape.h                    |  69 ++++++----
 lib/connection.c                     |   5 +-
 lib/connection.h                     |  43 +++---
 lib/connpoint_line.c                 |  44 ++++---
 lib/connpoint_line.h                 |  12 +-
 lib/dia-object-change-legacy.c       |  75 +++++++++++
 lib/dia-object-change-legacy.h       |  39 ++++++
 lib/dia-object-change-list.c         |  87 +++++++++++++
 lib/dia-object-change-list.h         |  36 +++++
 lib/dia-object-change.c              |   2 -
 lib/diamenu.h                        |   5 +-
 lib/diatypes.h                       |   1 -
 lib/element.c                        |  14 +-
 lib/element.h                        |  23 ++--
 lib/filter.h                         |  13 +-
 lib/focus.h                          |   9 +-
 lib/group.c                          | 101 ++++++++------
 lib/meson.build                      |   4 +
 lib/objchange.c                      |  97 ++------------
 lib/objchange.h                      |  26 ++--
 lib/object.c                         |  91 +++++++------
 lib/object.h                         |  97 ++++++++------
 lib/orth_conn.c                      | 246 +++++++++++++++++++----------------
 lib/orth_conn.h                      |  94 +++++++------
 lib/parent.c                         |  30 +++--
 lib/poly_conn.c                      |  30 +++--
 lib/poly_conn.h                      |  22 ++--
 lib/polyshape.c                      |  48 ++++---
 lib/polyshape.h                      |  20 ++-
 lib/properties.h                     |  21 ++-
 lib/propobject.c                     | 151 ++++++++++++---------
 lib/renderer/diacairo-print.c        |   2 +-
 lib/renderer/diacairo-print.h        |  21 +--
 lib/standard-path.c                  | 125 +++++++++++-------
 lib/text.c                           |  62 +++++----
 lib/text.h                           |  59 +++++----
 objects/AADL/aadl.h                  |  13 +-
 objects/AADL/aadlbox.c               | 115 ++++++++--------
 objects/AADL/edit_port_declaration.c |  12 +-
 objects/AADL/edit_port_declaration.h |   5 +-
 objects/Database/compound.c          | 117 ++++++++++-------
 objects/Database/database.h          |   2 +
 objects/Database/reference.c         | 161 ++++++++++++++---------
 objects/Database/table.c             | 122 +++++++++++------
 objects/ER/attribute.c               |   9 +-
 objects/ER/entity.c                  |   8 +-
 objects/ER/participation.c           |  68 ++++++----
 objects/ER/relationship.c            |   8 +-
 objects/FS/flow-ortho.c              | 117 ++++++++++-------
 objects/FS/flow.c                    |  47 ++++---
 objects/FS/function.c                | 138 ++++++++++++--------
 objects/GRAFCET/action.c             |   8 +-
 objects/GRAFCET/condition.c          |  10 +-
 objects/GRAFCET/step.c               |  10 +-
 objects/GRAFCET/transition.c         |   8 +-
 objects/GRAFCET/vector.c             |  70 ++++++----
 objects/GRAFCET/vergent.c            |  38 +++---
 objects/Istar/actor.c                |   8 +-
 objects/Istar/goal.c                 |   8 +-
 objects/Istar/link.c                 |   8 +-
 objects/Istar/other.c                |  64 +++++----
 objects/Jackson/domain.c             |  32 +++--
 objects/Jackson/phenomenon.c         |   8 +-
 objects/Jackson/requirement.c        |   8 +-
 objects/KAOS/goal.c                  |  49 ++++---
 objects/KAOS/metaandorrel.c          |   8 +-
 objects/KAOS/metabinrel.c            |   8 +-
 objects/KAOS/other.c                 |  67 ++++++----
 objects/Misc/analog_clock.c          |   8 +-
 objects/Misc/diagram_as_object.c     |   4 +-
 objects/Misc/grid_object.c           |   8 +-
 objects/Misc/measure.c               |   8 +-
 objects/Misc/n_gon.c                 |  28 ++--
 objects/Misc/tree.c                  |  69 ++++++----
 objects/SADT/annotation.c            |   8 +-
 objects/SADT/arrow.c                 |  66 ++++++----
 objects/SADT/box.c                   |  69 ++++++----
 objects/UML/activity.c               |   8 +-
 objects/UML/actor.c                  |  31 +++--
 objects/UML/association.c            |  57 ++++----
 objects/UML/branch.c                 |   8 +-
 objects/UML/class.c                  |  97 +++++++++-----
 objects/UML/class.h                  |   2 +-
 objects/UML/class_dialog.c           |  26 ++--
 objects/UML/classicon.c              |   8 +-
 objects/UML/component.c              |   8 +-
 objects/UML/component_feature.c      |  64 +++++----
 objects/UML/constraint.c             |   8 +-
 objects/UML/dependency.c             |  72 ++++++----
 objects/UML/fork.c                   |   8 +-
 objects/UML/generalization.c         |  61 +++++----
 objects/UML/implements.c             |   8 +-
 objects/UML/large_package.c          |   8 +-
 objects/UML/lifeline.c               | 102 ++++++++-------
 objects/UML/message.c                |   8 +-
 objects/UML/node.c                   |   8 +-
 objects/UML/note.c                   |   8 +-
 objects/UML/object.c                 |   8 +-
 objects/UML/realizes.c               |  65 +++++----
 objects/UML/small_package.c          |   8 +-
 objects/UML/state.c                  |   8 +-
 objects/UML/state_term.c             |   8 +-
 objects/UML/transition.c             |  43 +++---
 objects/UML/usecase.c                |   8 +-
 objects/chronogram/chronoline.c      |  47 ++++---
 objects/chronogram/chronoref.c       |  43 +++---
 objects/custom/custom_object.c       |  98 ++++++++------
 objects/flowchart/box.c              |  19 +--
 objects/flowchart/diamond.c          |  34 +++--
 objects/flowchart/ellipse.c          |  23 ++--
 objects/flowchart/parallelogram.c    |  23 ++--
 objects/network/basestation.c        |  33 +++--
 objects/network/bus.c                |  68 ++++++----
 objects/network/radiocell.c          |   8 +-
 objects/network/wanlink.c            |   8 +-
 objects/standard/arc.c               |   8 +-
 objects/standard/bezier.c            |  83 +++++++-----
 objects/standard/beziergon.c         |  53 +++++---
 objects/standard/box.c               |  90 ++++++++-----
 objects/standard/ellipse.c           |  48 ++++---
 objects/standard/image.c             |   8 +-
 objects/standard/line.c              |  72 +++++-----
 objects/standard/outline.c           |   8 +-
 objects/standard/polygon.c           |  49 ++++---
 objects/standard/polyline.c          |  57 ++++----
 objects/standard/textobj.c           |  44 +++++--
 objects/standard/zigzagline.c        |  71 ++++++----
 plug-ins/cairo/diacairo.c            |  22 ++--
 plug-ins/layout/layout.cpp           | 151 ++++++++++++---------
 plug-ins/pdf/pdf-import.cpp          |  23 ++--
 plug-ins/postscript/postscript.c     |  28 ++--
 plug-ins/python/diamodule.c          |   2 +-
 plug-ins/python/pydia-menuitem.c     |  21 +--
 plug-ins/python/pydia-object.c       |  88 ++++++++-----
 plug-ins/stress/stress.c             |  12 +-
 plug-ins/svg/svg-import.c            |  19 ++-
 plug-ins/wmf/wmf.cpp                 |   9 +-
 154 files changed, 3694 insertions(+), 2446 deletions(-)
---
diff --git a/app/commands.c b/app/commands.c
index 9136bc131..a13fb4e57 100644
--- a/app/commands.c
+++ b/app/commands.c
@@ -194,7 +194,7 @@ file_preferences_callback (GtkAction *action)
 static void
 insert_text (DDisplay *ddisp, Focus *focus, const gchar *text)
 {
-  ObjectChange *change = NULL;
+  DiaObjectChange *change = NULL;
   int modified = FALSE, any_modified = FALSE;
   DiaObject *obj = focus_get_object (focus);
 
@@ -273,7 +273,7 @@ received_clipboard_image_handler (GtkClipboard *clipboard,
   DDisplay *ddisp = (DDisplay *) data;
   Diagram  *dia = ddisp->diagram;
   GList *list = dia->data->selected;
-  ObjectChange *change = NULL;
+  DiaObjectChange *change = NULL;
 
   if (!pixbuf) {
     message_error (_("No image from Clipboard to paste."));
@@ -315,10 +315,10 @@ received_clipboard_image_handler (GtkClipboard *clipboard,
                                               &handle2)) != NULL)) {
       /* as above, transfer the data */
       change = dia_object_set_pixbuf (obj, pixbuf);
-      if (change) { /* ... but drop undo info */
-        change->free (change);
-        g_clear_pointer (&change, g_free);
-      }
+
+      /* ... but drop undo info */
+      g_clear_pointer (&change, dia_object_change_unref);
+
       /* allow undo of the whole thing */
       dia_insert_objects_change_new (dia, g_list_prepend (NULL, obj), 1);
 
@@ -876,7 +876,7 @@ edit_cut_text_callback (GtkAction *action)
   DiaObject *obj;
   GPtrArray *textprops;
   TextProperty *prop;
-  ObjectChange *change;
+  DiaObjectChange *change;
 
   ddisp = ddisplay_active ();
   if (!ddisp) {
@@ -956,7 +956,7 @@ edit_delete_callback (GtkAction *action)
     return;
   }
   if (textedit_mode (ddisp)) {
-    ObjectChange *change = NULL;
+    DiaObjectChange *change = NULL;
     Focus *focus = get_active_focus ((DiagramData *) ddisp->diagram);
     if (!text_delete_key_handler (focus, &change)) {
       return;
diff --git a/app/disp_callbacks.c b/app/disp_callbacks.c
index 945179c19..dd8013d1c 100644
--- a/app/disp_callbacks.c
+++ b/app/disp_callbacks.c
@@ -45,6 +45,7 @@
 #include "object.h"
 #include "disp_callbacks.h"
 #include "create.h"
+#include "dia-object-change-list.h"
 
 typedef struct {
        GdkEvent *event; /* Button down event which may be holding */
@@ -57,10 +58,10 @@ static HoldTimeoutData hold_data = {NULL, NULL, 0};
 
 
 static void
-object_menu_item_proxy(GtkWidget *widget, gpointer data)
+object_menu_item_proxy (GtkWidget *widget, gpointer data)
 {
   DiaMenuItem *dia_menu_item;
-  ObjectChange *obj_change;
+  DiaObjectChange *obj_change;
   DiaObject *obj;
   DDisplay *ddisp = ddisplay_active();
   Point last_clicked_pos;
@@ -176,35 +177,41 @@ add_follow_link_menu_item (GtkMenu *menu)
   gtk_widget_show(menu_item);
 }
 
+
 static void
 _convert_to_path_callback (GtkAction *action, gpointer data)
 {
-  DDisplay *ddisp = ddisplay_active();
+  DDisplay *ddisp = ddisplay_active ();
   GList *selected, *list;
-  ObjectChange *change_list = NULL;
+  DiaObjectChange *change_list = NULL;
 
   if (!ddisp) return;
 
   /* copy the list before modifying it */
   list = selected = diagram_get_sorted_selected (ddisp->diagram);
   while (list) {
-    DiaObject *obj = (DiaObject *)list->data;
+    DiaObject *obj = DIA_OBJECT (list->data);
 
     if (obj) { /* paranoid */
       DiaObject *path = create_standard_path_from_object (obj);
 
       if (path) { /* not so paranoid */
-       ObjectChange *change = object_substitute (obj, path);
+        DiaObjectChange *change = object_substitute (obj, path);
 
-       if (!change_list)
-         change_list = change_list_create ();
-       if (change)
-         change_list_add (change_list, change);
+        if (!change_list) {
+          change_list = dia_object_change_list_new ();
+        }
+
+        if (change) {
+          dia_object_change_list_add (DIA_OBJECT_CHANGE_LIST (change_list),
+                                      change);
+        }
       }
     }
     list = g_list_next(list);
   }
   g_list_free (selected);
+
   if (change_list) {
     dia_object_change_change_new (ddisp->diagram, NULL, change_list);
 
@@ -538,20 +545,29 @@ ddisplay_popup_menu(DDisplay *ddisp, GdkEventButton *event)
   gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL,
                 event->button, event->time);
 }
+
+
 static void
-handle_key_event(DDisplay *ddisp, Focus *focus,
-                guint keystate, guint keysym,
-                 const gchar *str, int strlen)
+handle_key_event (DDisplay   *ddisp,
+                  Focus      *focus,
+                  guint       keystate,
+                  guint       keysym,
+                  const char *str,
+                  int         strlen)
 {
-  DiaObject *obj = focus_get_object(focus);
+  DiaObject *obj = focus_get_object (focus);
   Point p = obj->position;
-  ObjectChange *obj_change = NULL;
+  DiaObjectChange *obj_change = NULL;
   gboolean modified;
 
-  object_add_updates(obj, ddisp->diagram);
+  object_add_updates (obj, ddisp->diagram);
 
-  modified = (focus->key_event)(focus, keystate, keysym, str, strlen,
-                               &obj_change);
+  modified = (focus->key_event) (focus,
+                                 keystate,
+                                 keysym,
+                                 str,
+                                 strlen,
+                                 &obj_change);
 
   /* Make sure object updates its data and its connected: */
   p = obj->position;
@@ -1174,7 +1190,7 @@ ddisplay_drop_object(DDisplay *ddisp, gint x, gint y, DiaObjectType *otype,
   Handle *handle1, *handle2;
   DiaObject *obj, *p_obj;
   GList *list;
-  real click_distance;
+  double click_distance;
   gboolean avoid_reset;
 
   ddisplay_untransform_coords(ddisp, x, y, &droppoint.x, &droppoint.y);
@@ -1204,8 +1220,8 @@ ddisplay_drop_object(DDisplay *ddisp, gint x, gint y, DiaObjectType *otype,
     /* the tool was dropped inside an object that takes children*/
   {
     DiaRectangle p_ext, c_ext;
-    real parent_height, child_height, parent_width, child_width;
-    real vadjust = 0.0, hadjust = 0.0;
+    double parent_height, child_height, parent_width, child_width;
+    double vadjust = 0.0, hadjust = 0.0;
     Point new_pos;
 
     obj->parent = p_obj;
diff --git a/app/display.c b/app/display.c
index d9d4358f1..e86ff18c1 100644
--- a/app/display.c
+++ b/app/display.c
@@ -1597,16 +1597,16 @@ display_set_active(DDisplay *ddisp)
   }
 }
 
+
 void
-ddisplay_im_context_preedit_reset(DDisplay *ddisp, Focus *focus)
+ddisplay_im_context_preedit_reset (DDisplay *ddisp, Focus *focus)
 {
   if (ddisp->preedit_string != NULL) {
     if (focus != NULL) {
-      int i;
-      ObjectChange *change;
+      DiaObjectChange *change;
 
-      for (i = 0; i < g_utf8_strlen(ddisp->preedit_string, -1); i++) {
-        (focus->key_event)(focus, 0, GDK_BackSpace, NULL, 0, &change);
+      for (int i = 0; i < g_utf8_strlen (ddisp->preedit_string, -1); i++) {
+        (focus->key_event) (focus, 0, GDK_BackSpace, NULL, 0, &change);
       }
     }
 
diff --git a/app/find-and-replace.c b/app/find-and-replace.c
index 9250fa884..3f7bab52a 100644
--- a/app/find-and-replace.c
+++ b/app/find-and-replace.c
@@ -352,11 +352,12 @@ find_func (gpointer data, gpointer user_data)
   }
 }
 
+
 /* Match and replace property values. */
 static gboolean
 _replace (DiaObject *obj, const SearchData *sd, const char *replacement)
 {
-  ObjectChange *obj_change;
+  DiaObjectChange *obj_change;
   GPtrArray *plist = NULL;
 
   plist = _match_props (obj, sd, replacement);
diff --git a/app/menus.c b/app/menus.c
index dcc1ef1da..938b69e63 100644
--- a/app/menus.c
+++ b/app/menus.c
@@ -39,7 +39,6 @@
 #include "widgets.h"
 #include "preferences.h"
 #include "filter.h"
-#include "objchange.h"
 #include "toolbox.h"
 #include "diagram_tree.h"
 #include "dia-builder.h"
@@ -1357,29 +1356,34 @@ plugin_callback (GtkWidget *widget, gpointer data)
   if (cbf->callback) {
     DDisplay *ddisp = NULL;
     DiagramData* diadata = NULL;
-    ObjectChange *change;
+    DiaObjectChange *change;
+
     /* stuff from the toolbox menu should never get a diagram to modify */
     if (strncmp (cbf->menupath, TOOLBOX_MENU, strlen (TOOLBOX_MENU)) != 0) {
       ddisp = ddisplay_active();
       diadata = ddisp ? ddisp->diagram->data : NULL;
     }
-    change = cbf->callback (diadata, ddisp ? ddisp->diagram->filename : NULL, 0, cbf->user_data);
+
+    change = cbf->callback (diadata,
+                            ddisp ? ddisp->diagram->filename : NULL,
+                            0,
+                            cbf->user_data);
+
     if (change != NULL) {
       if (ddisp) {
         dia_object_change_change_new (ddisp->diagram, NULL, change);
-       /*
-        * - can not call object_add_update() w/o object
-        * - could call object_add_updates_list() with the selected objects,
-        *   but that would just be an educated guess (layout working on selection)
-        */
-       diagram_add_update_all(ddisp->diagram);
-        diagram_modified(ddisp->diagram);
-        diagram_update_extents(ddisp->diagram);
-        undo_set_transactionpoint(ddisp->diagram->undo);
-      } else { /* no diagram to keep the change, throw it away */
-        if (change->free)
-          change->free(change);
-        g_clear_pointer (&change, g_free);
+        /*
+         * - can not call object_add_update() w/o object
+         * - could call object_add_updates_list() with the selected objects,
+         *   but that would just be an educated guess (layout working on selection)
+         */
+        diagram_add_update_all (ddisp->diagram);
+        diagram_modified (ddisp->diagram);
+        diagram_update_extents (ddisp->diagram);
+        undo_set_transactionpoint (ddisp->diagram->undo);
+      } else {
+        /* no diagram to keep the change, throw it away */
+        g_clear_pointer (&change, dia_object_change_unref);
       }
     }
   }
diff --git a/app/modify_tool.c b/app/modify_tool.c
index 6a32c1a5d..d0ba15b7a 100644
--- a/app/modify_tool.c
+++ b/app/modify_tool.c
@@ -468,7 +468,7 @@ modify_motion (ModifyTool     *tool,
   Point now, delta, full_delta;
   gboolean auto_scroll, vertical = FALSE;
   ConnectionPoint *connectionpoint = NULL;
-  ObjectChange *objchange = NULL;
+  DiaObjectChange *objchange = NULL;
 
   ddisplay_untransform_coords(ddisp, event->x, event->y, &to.x, &to.y);
 
@@ -652,10 +652,15 @@ modify_motion (ModifyTool     *tool,
     object_add_updates (tool->object, ddisp->diagram);
 
     /* Handle undo */
-    if (tool->object)
-      objchange = tool->object->ops->move_handle(tool->object, tool->handle,
-                                                &to, connectionpoint,
-                                                HANDLE_MOVE_USER, 
gdk_event_to_dia_ModifierKeys(event->state));
+    if (tool->object) {
+      objchange = dia_object_move_handle (tool->object,
+                                          tool->handle,
+                                          &to,
+                                          connectionpoint,
+                                          HANDLE_MOVE_USER,
+                                          gdk_event_to_dia_ModifierKeys (event->state));
+    }
+
     if (objchange != NULL) {
       dia_object_change_change_new (ddisp->diagram, tool->object, objchange);
     }
@@ -716,14 +721,16 @@ find_selected_objects(DDisplay *ddisp, ModifyTool *tool)
   }
 }
 
+
 static void
-modify_button_release(ModifyTool *tool, GdkEventButton *event,
-                     DDisplay *ddisp)
+modify_button_release (ModifyTool     *tool,
+                       GdkEventButton *event,
+                       DDisplay       *ddisp)
 {
   Point *dest_pos, to;
   GList *list;
   int i;
-  ObjectChange *objchange;
+  DiaObjectChange *objchange;
 
   tool->break_connections = FALSE;
   ddisplay_set_all_cursor(default_cursor);
@@ -778,16 +785,22 @@ modify_button_release(ModifyTool *tool, GdkEventButton *event,
     tool->state = STATE_NONE;
 
     if (tool->orig_pos != NULL) {
-      dia_move_handle_change_new (ddisp->diagram, tool->handle, tool->object,
-                                  *tool->orig_pos, tool->last_to,
+      dia_move_handle_change_new (ddisp->diagram,
+                                  tool->handle,
+                                  tool->object,
+                                  *tool->orig_pos,
+                                  tool->last_to,
                                   gdk_event_to_dia_ModifierKeys (event->state));
     }
 
     /* Final move: */
     object_add_updates(tool->object, ddisp->diagram);
-    objchange = tool->object->ops->move_handle(tool->object, tool->handle,
-                                              &tool->last_to, NULL,
-                                              
HANDLE_MOVE_USER_FINAL,gdk_event_to_dia_ModifierKeys(event->state));
+    objchange = dia_object_move_handle (tool->object,
+                                        tool->handle,
+                                        &tool->last_to,
+                                        NULL,
+                                        HANDLE_MOVE_USER_FINAL,
+                                        gdk_event_to_dia_ModifierKeys (event->state));
     if (objchange != NULL) {
       dia_object_change_change_new (ddisp->diagram, tool->object, objchange);
     }
diff --git a/app/properties-dialog.c b/app/properties-dialog.c
index 73f0653ce..3b9bd8e92 100644
--- a/app/properties-dialog.c
+++ b/app/properties-dialog.c
@@ -115,12 +115,13 @@ properties_key_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
   return FALSE;
 }
 
-static gint
-properties_respond(GtkWidget *widget,
-                   gint       response_id,
-                   gpointer   data)
+
+static int
+properties_respond (GtkWidget *widget,
+                    int        response_id,
+                    gpointer   data)
 {
-  ObjectChange *obj_change = NULL;
+  DiaObjectChange *obj_change = NULL;
   gboolean set_tp = TRUE;
   GList *tmp;
 
@@ -131,7 +132,7 @@ properties_respond(GtkWidget *widget,
 
       for (tmp = current_objects; tmp != NULL; tmp = tmp->next) {
         DiaObject *current_obj = (DiaObject*)tmp->data;
-        obj_change = current_obj->ops->apply_properties_from_dialog(current_obj, object_part);
+        obj_change = dia_object_apply_editor (current_obj, object_part);
         object_add_updates(current_obj, current_dia);
         diagram_update_connections_object(current_dia, current_obj, TRUE);
 
diff --git a/app/undo.c b/app/undo.c
index d70273b8e..f32155b1b 100644
--- a/app/undo.c
+++ b/app/undo.c
@@ -31,7 +31,8 @@
 #include "parent.h"
 #include "dia-layer.h"
 
-void undo_update_menus(UndoStack *stack);
+
+void undo_update_menus (UndoStack *stack);
 
 /**
  * DiaTransactionPointChange:
@@ -979,7 +980,7 @@ struct _DiaObjectChangeChange {
   DiaChange change;
 
   DiaObject *obj;
-  ObjectChange *obj_change;
+  DiaObjectChange *obj_change;
 };
 
 DIA_DEFINE_CHANGE (DiaObjectChangeChange, dia_object_change_change)
@@ -1005,7 +1006,7 @@ dia_object_change_change_apply (DiaChange   *self,
     object_add_updates (change->obj, DIA_DIAGRAM (dia));
   }
 
-  change->obj_change->apply (change->obj_change, change->obj);
+  dia_object_change_apply (change->obj_change, change->obj);
 
   if (change->obj) {
     /* Make sure object updates its data: */
@@ -1035,7 +1036,7 @@ dia_object_change_change_revert (DiaChange   *self,
     object_add_updates (change->obj, DIA_DIAGRAM (dia));
   }
 
-  change->obj_change->revert (change->obj_change, change->obj);
+  dia_object_change_revert (change->obj_change, change->obj);
 
   if (change->obj) {
     /* Make sure object updates its data: */
@@ -1060,27 +1061,30 @@ dia_object_change_change_free (DiaChange *self)
   DiaObjectChangeChange *change = DIA_OBJECT_CHANGE_CHANGE (self);
 
   g_debug ("state_change_free()");
-  if (change->obj_change->free) {
-    (*change->obj_change->free) (change->obj_change);
-  }
 
-  g_clear_pointer (&change->obj_change, g_free);
+  g_clear_pointer (&change->obj_change, dia_object_change_unref);
 }
 
 
+/**
+ * dia_object_change_change_new:
+ * @dia: the #Diagram the change is from
+ * @obj: the #DiaObject in the @dia
+ * @change: (transfer full): the #DiaObjectChange to wrap
+ */
 DiaChange *
-dia_object_change_change_new (Diagram      *dia,
-                              DiaObject    *obj,
-                              ObjectChange *obj_change)
+dia_object_change_change_new (Diagram         *dia,
+                              DiaObject       *obj,
+                              DiaObjectChange *change)
 {
-  DiaObjectChangeChange *change = dia_change_new (DIA_TYPE_OBJECT_CHANGE_CHANGE);
+  DiaObjectChangeChange *self = dia_change_new (DIA_TYPE_OBJECT_CHANGE_CHANGE);
 
-  change->obj = obj;
-  change->obj_change = obj_change;
+  self->obj = obj;
+  self->obj_change = change;
 
-  undo_push_change (dia->undo, DIA_CHANGE (change));
+  undo_push_change (dia->undo, DIA_CHANGE (self));
 
-  return DIA_CHANGE (change);
+  return DIA_CHANGE (self);
 }
 
 /******** Group object list: */
@@ -1735,8 +1739,8 @@ dia_mem_swap_change_new (Diagram *dia, gpointer dest, gsize size)
 struct _DiaMoveGuideChange {
   DiaChange parent;
 
-  real orig_pos;
-  real dest_pos;
+  double orig_pos;
+  double dest_pos;
   DiaGuide *guide;
 };
 
@@ -1744,30 +1748,30 @@ DIA_DEFINE_CHANGE (DiaMoveGuideChange, dia_move_guide_change)
 
 
 static void
-dia_move_guide_change_apply (DiaChange *self, Diagram *dia)
+dia_move_guide_change_apply (DiaChange *self, DiagramData *dia)
 {
   DiaMoveGuideChange *change = DIA_MOVE_GUIDE_CHANGE (self);
 
   change->guide->position = change->dest_pos;
 
   /* Force redraw. */
-  diagram_add_update_all (dia);
-  diagram_modified (dia);
-  diagram_flush (dia);
+  diagram_add_update_all (DIA_DIAGRAM (dia));
+  diagram_modified (DIA_DIAGRAM (dia));
+  diagram_flush (DIA_DIAGRAM (dia));
 }
 
 
 static void
-dia_move_guide_change_revert (DiaChange *self, Diagram *dia)
+dia_move_guide_change_revert (DiaChange *self, DiagramData *dia)
 {
   DiaMoveGuideChange *change = DIA_MOVE_GUIDE_CHANGE (self);
 
   change->guide->position = change->orig_pos;
 
   /* Force redraw. */
-  diagram_add_update_all (dia);
-  diagram_modified (dia);
-  diagram_flush (dia);
+  diagram_add_update_all (DIA_DIAGRAM (dia));
+  diagram_modified (DIA_DIAGRAM (dia));
+  diagram_flush (DIA_DIAGRAM (dia));
 }
 
 
@@ -1779,7 +1783,10 @@ dia_move_guide_change_free (DiaChange *change)
 
 
 DiaChange *
-dia_move_guide_change_new (Diagram *dia, DiaGuide *guide, real orig_pos, real dest_pos)
+dia_move_guide_change_new (Diagram  *dia,
+                           DiaGuide *guide,
+                           double    orig_pos,
+                           double    dest_pos)
 {
   DiaMoveGuideChange *change = dia_change_new (DIA_TYPE_MOVE_GUIDE_CHANGE);
 
@@ -1805,21 +1812,24 @@ DIA_DEFINE_CHANGE (DiaAddGuideChange, dia_add_guide_change)
 
 
 static void
-dia_add_guide_change_apply (DiaChange *self, Diagram *dia)
+dia_add_guide_change_apply (DiaChange *self, DiagramData *dia)
 {
   DiaAddGuideChange *change = DIA_ADD_GUIDE_CHANGE (self);
   DiaGuide *new_guide;
 
   g_debug ("add_guide_apply()");
 
-  new_guide = dia_diagram_add_guide (dia, change->guide->position, change->guide->orientation, FALSE);
+  new_guide = dia_diagram_add_guide (DIA_DIAGRAM (dia),
+                                     change->guide->position,
+                                     change->guide->orientation,
+                                     FALSE);
   g_clear_pointer (&change->guide, g_free);
   change->guide = new_guide;
 
   /* Force redraw. */
-  diagram_add_update_all (dia);
-  diagram_modified (dia);
-  diagram_flush (dia);
+  diagram_add_update_all (DIA_DIAGRAM (dia));
+  diagram_modified (DIA_DIAGRAM (dia));
+  diagram_flush (DIA_DIAGRAM (dia));
 
   /* Set flag. */
   change->applied = 1;
@@ -1827,18 +1837,18 @@ dia_add_guide_change_apply (DiaChange *self, Diagram *dia)
 
 
 static void
-dia_add_guide_change_revert (DiaChange *self, Diagram *dia)
+dia_add_guide_change_revert (DiaChange *self, DiagramData *dia)
 {
   DiaAddGuideChange *change = DIA_ADD_GUIDE_CHANGE (self);
 
   g_debug ("add_guide_revert()");
 
-  dia_diagram_remove_guide (dia, change->guide, FALSE);
+  dia_diagram_remove_guide (DIA_DIAGRAM (dia), change->guide, FALSE);
 
   /* Force redraw. */
-  diagram_add_update_all (dia);
-  diagram_modified (dia);
-  diagram_flush (dia);
+  diagram_add_update_all (DIA_DIAGRAM (dia));
+  diagram_modified (DIA_DIAGRAM (dia));
+  diagram_flush (DIA_DIAGRAM (dia));
 
   /* Set flag. */
   change->applied = 0;
@@ -1884,18 +1894,18 @@ DIA_DEFINE_CHANGE (DiaDeleteGuideChange, dia_delete_guide_change)
 
 
 static void
-dia_delete_guide_change_apply (DiaChange *self, Diagram *dia)
+dia_delete_guide_change_apply (DiaChange *self, DiagramData *dia)
 {
   DiaDeleteGuideChange *change = DIA_DELETE_GUIDE_CHANGE (self);
 
   g_debug ("delete_guide_apply()");
 
-  dia_diagram_remove_guide (dia, change->guide, FALSE);
+  dia_diagram_remove_guide (DIA_DIAGRAM (dia), change->guide, FALSE);
 
   /* Force redraw. */
-  diagram_add_update_all (dia);
-  diagram_modified (dia);
-  diagram_flush (dia);
+  diagram_add_update_all (DIA_DIAGRAM (dia));
+  diagram_modified (DIA_DIAGRAM (dia));
+  diagram_flush (DIA_DIAGRAM (dia));
 
   /* Set flag. */
   change->applied = 1;
@@ -1903,7 +1913,7 @@ dia_delete_guide_change_apply (DiaChange *self, Diagram *dia)
 
 
 static void
-dia_delete_guide_change_revert (DiaChange *self, Diagram *dia)
+dia_delete_guide_change_revert (DiaChange *self, DiagramData *dia)
 {
   DiaDeleteGuideChange *change = DIA_DELETE_GUIDE_CHANGE (self);
 
@@ -1914,7 +1924,7 @@ dia_delete_guide_change_revert (DiaChange *self, Diagram *dia)
   g_debug ("delete_guide_revert()");
 
   /* Add it again. */
-  new_guide = dia_diagram_add_guide (dia,
+  new_guide = dia_diagram_add_guide (DIA_DIAGRAM (dia),
                                      change->guide->position,
                                      change->guide->orientation,
                                      FALSE);
@@ -1924,9 +1934,9 @@ dia_delete_guide_change_revert (DiaChange *self, Diagram *dia)
   change->guide = new_guide;
 
   /* Force redraw. */
-  diagram_add_update_all (dia);
-  diagram_modified (dia);
-  diagram_flush (dia);
+  diagram_add_update_all (DIA_DIAGRAM (dia));
+  diagram_modified (DIA_DIAGRAM (dia));
+  diagram_flush (DIA_DIAGRAM (dia));
 
   /* Set flag. */
   change->applied = 0;
diff --git a/app/undo.h b/app/undo.h
index 59e5a2d81..5976a2cd7 100644
--- a/app/undo.h
+++ b/app/undo.h
@@ -23,8 +23,9 @@ typedef struct _UndoStack UndoStack;
 
 #include "diagram.h"
 #include "dia-guide.h"
-
 #include "dia-change.h"
+#include "dia-object-change.h"
+
 
 struct _UndoStack {
   Diagram *dia;
@@ -116,9 +117,9 @@ DiaChange *dia_reorder_objects_change_new              (Diagram   *dia,
 #define DIA_TYPE_OBJECT_CHANGE_CHANGE dia_object_change_change_get_type ()
 G_DECLARE_FINAL_TYPE (DiaObjectChangeChange, dia_object_change_change, DIA, OBJECT_CHANGE_CHANGE, DiaChange)
 
-DiaChange *dia_object_change_change_new                (Diagram      *dia,
-                                                        DiaObject    *obj,
-                                                        ObjectChange *obj_change);
+DiaChange *dia_object_change_change_new                (Diagram         *dia,
+                                                        DiaObject       *obj,
+                                                        DiaObjectChange *change);
 
 
 #define DIA_TYPE_GROUP_OBJECTS_CHANGE dia_group_objects_change_get_type ()
diff --git a/bindings/dia-object.cpp b/bindings/dia-object.cpp
index 03fdc1d29..0ea975a24 100644
--- a/bindings/dia-object.cpp
+++ b/bindings/dia-object.cpp
@@ -139,22 +139,28 @@ dia::Object* dia::Object::copy () const
     assert (self);
     return new dia::Object (self->ops->copy (self));
 }
+
+
 //! change position of the whole object
-ObjectChange*
+DiaObjectChange *
 dia::Object::move (double x, double y)
 {
-    assert (self);
-    Point p = {x, y};
-    return self->ops->move (self, &p);
+  assert (self);
+  Point p = {x, y};
+  return dia_object_move (self, &p);
 }
+
+
 //! change position of an object handle - this is usually  a resize (Attention: does *not* match the C 
prototype)
-ObjectChange*
+DiaObjectChange *
 dia::Object::move_handle (dia::Handle* h, double x, double y, HandleMoveReason reason, ModifierKeys 
modifiers)
 {
-    assert (self);
-    Point p = {x, y};
-    return self->ops->move_handle (self, h->Self(), &p, NULL, reason, modifiers);
+  assert (self);
+  Point p = {x, y};
+  return dia_object_move_handle (self, h->Self(), &p, NULL, reason, modifiers);
 }
+
+
 //! OPTIONAL: provide a property dialog to change the object proeprties
 GtkWidget*
 dia::Object::get_properties (bool is_default) const
@@ -164,15 +170,22 @@ dia::Object::get_properties (bool is_default) const
        return 0;
     return self->ops->get_properties (self, is_default);
 }
+
+
 //! OPTIONAL: apply the properties changed in the dialog
-ObjectChange*
+DiaObjectChange *
 dia::Object::apply_properties (GtkWidget* w)
 {
-    assert (self);
-    if (!self->ops->apply_properties_from_dialog)
-       return NULL;
-    return self->ops->apply_properties_from_dialog (self, w);
+  assert (self);
+
+  if (!self->ops->apply_properties_from_dialog) {
+    return NULL;
+  }
+
+  return self->ops->apply_properties_from_dialog (self, w);
 }
+
+
 //! OPTIONAL: provide a context menu to change the object states
 DiaMenu*
 dia::Object::get_object_menu (Point* pos) const
diff --git a/bindings/dia-object.h b/bindings/dia-object.h
index 627c964e3..e808a9e2a 100644
--- a/bindings/dia-object.h
+++ b/bindings/dia-object.h
@@ -85,14 +85,14 @@ public :
     //! create a deep copy
     Object* copy () const;
     //! change position of the whole object
-    ObjectChange* move (double x, double y);
+    DiaObjectChange* move (double x, double y);
     //! change position of an object handle - this is usually  a resize (Attention: does *not* match the C 
prototype)
-    ObjectChange* move_handle (Handle* h, double x, double y, HandleMoveReason reason, ModifierKeys 
modifiers);
+    DiaObjectChange* move_handle (Handle* h, double x, double y, HandleMoveReason reason, ModifierKeys 
modifiers);
 
     //! OPTIONAL: provide a property dialog to change the object proeprties
     GtkWidget* get_properties (bool is_default) const;
     //! OPTIONAL: apply the properties changed in the dialog
-    ObjectChange* apply_properties (GtkWidget*);
+    DiaObjectChange* apply_properties (GtkWidget*);
     //! OPTIONAL: provide a context menu to change the object states
     DiaMenu* get_object_menu (Point* pos) const;
 
diff --git a/docs/dia/dia-docs.xml b/docs/dia/dia-docs.xml
index fafb731ee..ec3e4c5e1 100644
--- a/docs/dia/dia-docs.xml
+++ b/docs/dia/dia-docs.xml
@@ -19,7 +19,7 @@
     </releaseinfo>
 
     <copyright>
-      <year>2019</year>
+      <year>2019-2020</year>
       <holder>Zander Brown</holder>
     </copyright>
   </bookinfo>
@@ -72,6 +72,7 @@
     <xi:include href="xml/objchange.xml"/>
     <xi:include href="xml/dia-change.xml" />
     <xi:include href="xml/dia-object-change.xml" />
+    <xi:include href="xml/dia-object-change-legacy.xml" />
     <xi:include href="xml/object-alias.xml"/>
     <xi:include href="xml/create.xml"/>
     <xi:include href="xml/diatransform.xml"/>
@@ -132,24 +133,24 @@
     <xi:include href="xml/api-index-full.xml"><xi:fallback /></xi:include>
   </index>
 
-  <index id="api-index-0.98">
+  <index id="api-index-0.98" role="0.98">
     <title>API added in 0.98</title>
     <xi:include href="xml/api-index-0.98.xml"><xi:fallback /></xi:include>
   </index>
 
-  <index id="api-index-dawn-of-time">
+  <index id="api-index-dawn-of-time" role="dawn-of-time">
     <title>API added before 0.98</title>
     <xi:include href="xml/api-index-dawn-of-time.xml"><xi:fallback /></xi:include>
   </index>
 
-  <index id="deprecated-api-index" role="deprecated">
+  <index id="api-index-deprecated" role="deprecated">
     <title>Index of deprecated API</title>
     <xi:include href="xml/api-index-deprecated.xml"><xi:fallback /></xi:include>
   </index>
 
   <index id="annotations-glossary">
-  <title>Annotations glossary</title>
-  <xi:include href="xml/annotation-glossary.xml"><xi:fallback /></xi:include>
+    <title>Annotations glossary</title>
+    <xi:include href="xml/annotation-glossary.xml"><xi:fallback /></xi:include>
   </index>
 
 </book>
diff --git a/lib/bezier-common.c b/lib/bezier-common.c
index 995d96792..0104d0924 100644
--- a/lib/bezier-common.c
+++ b/lib/bezier-common.c
@@ -40,7 +40,7 @@ bezier_calc_corner_types (BezierCommon *bezier)
 {
   int i;
   int num = bezier->num_points;
-  const real tolerance = 0.00001; /* EPSILON */
+  const double tolerance = 0.00001; /* EPSILON */
 
   g_return_if_fail (bezier->num_points > 1);
 
@@ -93,8 +93,8 @@ beziercommon_set_points (BezierCommon   *bezier,
     /* to make editing in Dia more convenient we turn line-to to curve-to with cusp controls */
     if (points[i].type == BEZ_LINE_TO) {
       Point start = (points[i-1].type == BEZ_CURVE_TO) ? points[i-1].p3 : points[i-1].p1;
-      real dx = points[i].p1.x - start.x;
-      real dy = points[i].p1.y - start.y;
+      double dx = points[i].p1.x - start.x;
+      double dy = points[i].p1.y - start.y;
       bezier->points[i].p3 = points[i].p1;
       bezier->points[i].p1.x = start.x + dx / 3;
       bezier->points[i].p1.y = start.y + dy / 3;
@@ -135,19 +135,19 @@ beziercommon_copy (BezierCommon *from, BezierCommon *to)
  */
 int
 beziercommon_closest_segment (BezierCommon *bezier,
-                             const Point  *point,
-                             real          line_width)
+                              const Point  *point,
+                              double        line_width)
 {
   Point last;
   int i;
-  real dist = G_MAXDOUBLE;
+  double dist = G_MAXDOUBLE;
   int closest;
 
   closest = 0;
   last = bezier->points[0].p1;
   /* the first point is just move-to so there is no need to consider p2,p3 of it */
   for (i = 1; i < bezier->num_points; i++) {
-    real new_dist = distance_bez_seg_point(&last, &bezier->points[i], line_width, point);
+    double new_dist = distance_bez_seg_point(&last, &bezier->points[i], line_width, point);
     if (new_dist < dist) {
       dist = new_dist;
       closest = i - 1;
diff --git a/lib/bezier-common.h b/lib/bezier-common.h
index 7f6058703..c8c9a0e57 100644
--- a/lib/bezier-common.h
+++ b/lib/bezier-common.h
@@ -25,7 +25,6 @@
 #define BEZIER_COMMON_H
 
 #include "diatypes.h"
-#include "geometry.h" /* for real */
 #include "diarenderer.h"
 
 typedef enum {
@@ -35,21 +34,30 @@ typedef enum {
 } BezCornerType;
 
 
+/**
+ * BezierCommon:
+ * @num_points: The number of point in points
+ * @points: Array of #BezPoint to operate on
+ * @corner_types: The corner types for manual adjustment
+ */
 typedef struct _BezierCommon BezierCommon;
-
 struct _BezierCommon {
-  /*! The number of point in points */
   int            num_points;
-  /*! Array of _BezPoint to operate on */
   BezPoint      *points;
-  /*! The corner types for manual adjustment */
   BezCornerType *corner_types;
 };
 
-void beziercommon_set_points (BezierCommon *bezier, int num, const BezPoint *pts);
-void beziercommon_copy (BezierCommon *from, BezierCommon *to);
-int  beziercommon_closest_segment (BezierCommon *bezier, const Point *point, real line_width);
 
-void bezier_draw_control_lines (int num_points, BezPoint *pts, DiaRenderer *renderer);
+void beziercommon_set_points      (BezierCommon   *bezier,
+                                   int             num_points,
+                                   const BezPoint *points);
+void beziercommon_copy            (BezierCommon   *from,
+                                   BezierCommon   *to);
+int  beziercommon_closest_segment (BezierCommon   *bezier,
+                                   const Point    *point,
+                                   double          line_width);
+void bezier_draw_control_lines    (int             num_points,
+                                   BezPoint       *pts,
+                                   DiaRenderer    *renderer);
 
 #endif
diff --git a/lib/bezier_conn.c b/lib/bezier_conn.c
index 9584e6357..cc5285bd3 100644
--- a/lib/bezier_conn.c
+++ b/lib/bezier_conn.c
@@ -29,6 +29,7 @@
 
 #include "bezier_conn.h"
 #include "diarenderer.h"
+#include "dia-object-change-legacy.h"
 
 #define HANDLE_BEZMAJOR  (HANDLE_CUSTOM1)
 #define HANDLE_LEFTCTRL  (HANDLE_CUSTOM2)
@@ -68,23 +69,23 @@ struct CornerChange {
 };
 
 
-static ObjectChange *bezierconn_create_point_change  (BezierConn       *bezier,
-                                                      enum change_type  type,
-                                                      BezPoint         *point,
-                                                      BezCornerType     corner_type,
-                                                      int               segment,
-                                                      Handle           *handle1,
-                                                      ConnectionPoint  *connected_to1,
-                                                      Handle           *handle2,
-                                                      ConnectionPoint  *connected_to2,
-                                                      Handle           *handle3,
-                                                      ConnectionPoint  *connected_to3);
-static ObjectChange *bezierconn_create_corner_change (BezierConn       *bezier,
-                                                      Handle           *handle,
-                                                      Point            *point_left,
-                                                      Point            *point_right,
-                                                      BezCornerType     old_corner_type,
-                                                      BezCornerType     new_corner_type);
+static DiaObjectChange *bezierconn_create_point_change  (BezierConn       *bezier,
+                                                         enum change_type  type,
+                                                         BezPoint         *point,
+                                                         BezCornerType     corner_type,
+                                                         int               segment,
+                                                         Handle           *handle1,
+                                                         ConnectionPoint  *connected_to1,
+                                                         Handle           *handle2,
+                                                         ConnectionPoint  *connected_to2,
+                                                         Handle           *handle3,
+                                                         ConnectionPoint  *connected_to3);
+static DiaObjectChange *bezierconn_create_corner_change (BezierConn       *bezier,
+                                                         Handle           *handle,
+                                                         Point            *point_left,
+                                                         Point            *point_right,
+                                                         BezCornerType     old_corner_type,
+                                                         BezCornerType     new_corner_type);
 
 
 /**
@@ -141,7 +142,7 @@ void new_handles (BezierConn *bezier, int num_points);
  * @to: The position it has been moved to (corrected for
  *   vertical/horizontal only movement).
  * @cp: If non-%NULL, the connectionpoint found at this position.
- *   If @a cp is %NULL, there may or may not be a connectionpoint.
+ *   If @cp is %NULL, there may or may not be a connectionpoint.
  * @reason: ignored
  * @modifiers: ignored
  *
@@ -149,7 +150,7 @@ void new_handles (BezierConn *bezier, int num_points);
  *
  * Returns: %NULL
  */
-ObjectChange*
+DiaObjectChange *
 bezierconn_move_handle (BezierConn       *bezier,
                         Handle           *handle,
                         Point            *to,
@@ -288,7 +289,7 @@ bezierconn_move_handle (BezierConn       *bezier,
  *
  * Returns: %NULL
  */
-ObjectChange*
+DiaObjectChange *
 bezierconn_move (BezierConn *bezier, Point *to)
 {
   Point p;
@@ -518,11 +519,11 @@ remove_handles (BezierConn *bezier, int pos)
  * 'point' or, if NULL, in the middle. This function will attempt to come
  * up with reasonable placements for the control points.
  *
- * Returns: An #ObjectChange object with undo information for the split.
+ * Returns: An #DiaObjectChange object with undo information for the split.
  *
  * Since: dawn-of-time
  */
-ObjectChange *
+DiaObjectChange *
 bezierconn_add_segment (BezierConn *bezier,
                         int         segment,
                         Point      *point)
@@ -597,7 +598,7 @@ bezierconn_add_segment (BezierConn *bezier,
  *
  * Since: dawn-of-time
  */
-ObjectChange *
+DiaObjectChange *
 bezierconn_remove_segment (BezierConn *bezier, int pos)
 {
   Handle *old_handle1, *old_handle2, *old_handle3;
@@ -731,7 +732,7 @@ bezierconn_straighten_corner (BezierConn *bezier, int comp_nr)
  *
  * Returns: Undo information about the corner change.
  */
-ObjectChange *
+DiaObjectChange *
 bezierconn_set_corner_type (BezierConn    *bezier,
                             Handle        *handle,
                             BezCornerType  corner_type)
@@ -1277,7 +1278,7 @@ bezierconn_point_change_revert (struct PointChange *change, DiaObject *obj)
  *
  * Since: dawn-of-time
  */
-static ObjectChange *
+static DiaObjectChange *
 bezierconn_create_point_change (BezierConn       *bezier,
                                 enum change_type  type,
                                 BezPoint         *point,
@@ -1310,7 +1311,7 @@ bezierconn_create_point_change (BezierConn       *bezier,
   change->handle3 = handle3;
   change->connected_to3 = connected_to3;
 
-  return (ObjectChange *)change;
+  return dia_object_change_legacy_new ((ObjectChange *) change);
 }
 
 
@@ -1376,14 +1377,14 @@ bezierconn_corner_change_revert (struct CornerChange *change,
  * @new_corner_type: The corner type being changed to.
  *
  * Create new undo information about a changing the type of a corner.
- * Note that the created #ObjectChange object has nothing in it that needs
+ * Note that the created #DiaObjectChange object has nothing in it that needs
  * freeing.
  *
  * Returns: Newly allocated undo information.
  *
  * Since: dawn-of-time
  */
-static ObjectChange *
+static DiaObjectChange *
 bezierconn_create_corner_change (BezierConn    *bezier,
                                  Handle        *handle,
                                  Point         *point_left,
@@ -1410,5 +1411,5 @@ bezierconn_create_corner_change (BezierConn    *bezier,
   change->point_left = *point_left;
   change->point_right = *point_right;
 
-  return (ObjectChange *) change;
+  return dia_object_change_legacy_new ((ObjectChange *) change);
 }
diff --git a/lib/bezier_conn.h b/lib/bezier_conn.h
index 628e9d991..f40c194ee 100644
--- a/lib/bezier_conn.h
+++ b/lib/bezier_conn.h
@@ -17,15 +17,16 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
- 
-#ifndef BEZIER_CONN_H
-#define BEZIER_CONN_H
+
+#pragma once
 
 #include "diatypes.h"
 #include "object.h"
 #include "boundingbox.h"
 #include "bezier-common.h"
 
+G_BEGIN_DECLS
+
 /*!
  * \brief Helper class to implement bezier connections
  *
@@ -43,27 +44,45 @@ struct _BezierConn {
   PolyBBExtras extra_spacing;
 };
 
-void bezierconn_update_data(BezierConn *bez);
-void bezierconn_update_boundingbox(BezierConn *bez);
-void bezierconn_init(BezierConn *bez, int num_points);
-void bezierconn_destroy(BezierConn *bez);
-void bezierconn_copy(BezierConn *from, BezierConn *to);
-void bezierconn_save(BezierConn *bez, ObjectNode obj_node, DiaContext *ctx);
-void bezierconn_load(BezierConn *bez, ObjectNode obj_node, DiaContext *ctx);  /* NOTE: Does object_init() */
-ObjectChange *bezierconn_add_segment(BezierConn *bez, int segment, Point *point);
-ObjectChange *bezierconn_remove_segment(BezierConn *bez, int point);
-ObjectChange *bezierconn_set_corner_type(BezierConn *bez,
-                                        Handle *handle,
-                                        BezCornerType style);
-ObjectChange *bezierconn_move_handle(BezierConn *bez, Handle *id,
-                                    Point *to, ConnectionPoint *cp,
-                                    HandleMoveReason reason,
-                                    ModifierKeys modifiers);
-ObjectChange *bezierconn_move(BezierConn *bez, Point *to);
-real bezierconn_distance_from(BezierConn *bez, Point *point,
-                             real line_width);
-Handle *bezierconn_closest_handle(BezierConn *bez, Point *point);
-Handle *bezierconn_closest_major_handle(BezierConn *bez, Point *point);
+
+void             bezierconn_update_data          (BezierConn       *bezier);
+void             bezierconn_update_boundingbox   (BezierConn       *bezier);
+void             bezierconn_init                 (BezierConn       *bezier,
+                                                  int               num_points);
+void             bezierconn_destroy              (BezierConn       *bezier);
+void             bezierconn_copy                 (BezierConn       *from,
+                                                  BezierConn       *to);
+void             bezierconn_save                 (BezierConn       *bezier,
+                                                  ObjectNode        obj_node,
+                                                  DiaContext       *ctx);
+/* NOTE: Does object_init() */
+void             bezierconn_load                 (BezierConn       *bezier,
+                                                  ObjectNode        obj_node,
+                                                  DiaContext       *ctx);
+DiaObjectChange *bezierconn_add_segment          (BezierConn       *bezier,
+                                                  int               segment,
+                                                  Point            *point);
+DiaObjectChange *bezierconn_remove_segment       (BezierConn       *bezier,
+                                                  int               point);
+DiaObjectChange *bezierconn_set_corner_type      (BezierConn       *bezier,
+                                                  Handle           *handle,
+                                                  BezCornerType     style);
+DiaObjectChange *bezierconn_move_handle          (BezierConn       *bezier,
+                                                  Handle           *handle,
+                                                  Point            *to,
+                                                  ConnectionPoint  *cp,
+                                                  HandleMoveReason  reason,
+                                                  ModifierKeys      modifiers);
+DiaObjectChange *bezierconn_move                 (BezierConn       *bezier,
+                                                  Point            *to);
+double           bezierconn_distance_from        (BezierConn       *bezier,
+                                                  Point            *point,
+                                                  double            line_width);
+Handle          *bezierconn_closest_handle       (BezierConn       *bezier,
+                                                  Point            *point);
+Handle          *bezierconn_closest_major_handle (BezierConn       *bezier,
+                                                  Point            *point);
+
 
 #define BEZCONN_COMMON_PROPERTIES \
   OBJECT_COMMON_PROPERTIES, \
@@ -74,4 +93,4 @@ Handle *bezierconn_closest_major_handle(BezierConn *bez, Point *point);
   { "bez_points", PROP_TYPE_BEZPOINTARRAY, \
      offsetof(BezierConn,bezier.points), offsetof(BezierConn,bezier.num_points)} \
 
-#endif /* BEZIER_CONN_H */
+G_END_DECLS
diff --git a/lib/beziershape.c b/lib/beziershape.c
index 5ca9872bc..bda7dadf6 100644
--- a/lib/beziershape.c
+++ b/lib/beziershape.c
@@ -28,6 +28,8 @@
 
 #include "beziershape.h"
 #include "diarenderer.h"
+#include "dia-object-change-legacy.h"
+
 
 #define HANDLE_BEZMAJOR  (HANDLE_CUSTOM1)
 #define HANDLE_LEFTCTRL  (HANDLE_CUSTOM2)
@@ -71,24 +73,24 @@ struct CornerChange {
 };
 
 
-static ObjectChange *beziershape_create_point_change (BezierShape      *bezier,
-                                                      enum change_type  type,
-                                                      BezPoint         *point,
-                                                      BezCornerType     corner_type,
-                                                      int               segment,
-                                                      Handle           *handle1,
-                                                      Handle           *handle2,
-                                                      Handle           *handle3,
-                                                      ConnectionPoint  *cp1,
-                                                      ConnectionPoint  *cp2);
-static ObjectChange *beziershape_create_corner_change (BezierShape     *bezier,
-                                                       Handle          *handle,
-                                                       Point           *point_left,
-                                                       Point           *point_right,
-                                                       BezCornerType    old_corner_type,
-                                                       BezCornerType    new_corner_type);
-static void new_handles_and_connections               (BezierShape     *bezier,
-                                                       int              num_points);
+static DiaObjectChange *beziershape_create_point_change  (BezierShape      *bezier,
+                                                          enum change_type  type,
+                                                          BezPoint         *point,
+                                                          BezCornerType     corner_type,
+                                                          int               segment,
+                                                          Handle           *handle1,
+                                                          Handle           *handle2,
+                                                          Handle           *handle3,
+                                                          ConnectionPoint  *cp1,
+                                                          ConnectionPoint  *cp2);
+static DiaObjectChange *beziershape_create_corner_change (BezierShape     *bezier,
+                                                          Handle          *handle,
+                                                          Point           *point_left,
+                                                          Point           *point_right,
+                                                          BezCornerType    old_corner_type,
+                                                          BezCornerType    new_corner_type);
+static void new_handles_and_connections                  (BezierShape     *bezier,
+                                                          int              num_points);
 
 
 /**
@@ -153,7 +155,7 @@ get_handle_nr (BezierShape *bezier, Handle *handle)
  *
  * Returns: %NULL
  */
-ObjectChange *
+DiaObjectChange *
 beziershape_move_handle (BezierShape      *bezier,
                          Handle           *handle,
                          Point            *to,
@@ -292,7 +294,7 @@ beziershape_move_handle (BezierShape      *bezier,
  * @return NULL
  * \memberof _BezierConn
  */
-ObjectChange*
+DiaObjectChange *
 beziershape_move (BezierShape *bezier, Point *to)
 {
   Point p;
@@ -483,9 +485,10 @@ remove_handles (BezierShape *bezier, int pos)
 
 /* Add a point by splitting segment into two, putting the new point at
  'point' or, if NULL, in the middle */
-ObjectChange *
+DiaObjectChange *
 beziershape_add_segment (BezierShape *bezier,
-                        int segment, Point *point)
+                         int          segment,
+                         Point       *point)
 {
   BezPoint realpoint;
   BezCornerType corner_type = BEZ_CORNER_SYMMETRIC;
@@ -537,6 +540,7 @@ beziershape_add_segment (BezierShape *bezier,
                                         new_cp1, new_cp2);
 }
 
+
 /*!
  * \brief Remove a segment from a bezier.
  * @param bezier The bezier to remove a segment from.
@@ -544,7 +548,7 @@ beziershape_add_segment (BezierShape *bezier,
  * @returns Undo information for the segment removal.
  * \memberof _BezierShape
  */
-ObjectChange *
+DiaObjectChange *
 beziershape_remove_segment (BezierShape *bezier, int pos)
 {
   Handle *old_handle1, *old_handle2, *old_handle3;
@@ -668,7 +672,7 @@ beziershape_straighten_corner (BezierShape *bezier, int comp_nr)
 }
 
 
-ObjectChange *
+DiaObjectChange *
 beziershape_set_corner_type (BezierShape   *bezier,
                              Handle        *handle,
                              BezCornerType  corner_type)
@@ -1233,7 +1237,7 @@ beziershape_point_change_revert (struct BezPointChange *change,
 }
 
 
-static ObjectChange *
+static DiaObjectChange *
 beziershape_create_point_change (BezierShape      *bezier,
                                  enum change_type  type,
                                  BezPoint         *point,
@@ -1267,7 +1271,7 @@ beziershape_create_point_change (BezierShape      *bezier,
   change->cp1 = cp1;
   change->cp2 = cp2;
 
-  return (ObjectChange *) change;
+  return dia_object_change_legacy_new ((ObjectChange *) change);
 }
 
 
@@ -1349,14 +1353,14 @@ beziershape_corner_change_revert (struct CornerChange *change,
  * @new_corner_type: The corner type being changed to.
  *
  * Create new undo information about a changing the type of a corner.
- * Note that the created #ObjectChange object has nothing in it that needs
+ * Note that the created #DiaObjectChange object has nothing in it that needs
  * freeing.
  *
  * Returns: Newly allocated undo information.
  *
  * Since: dawn-of-time
  */
-static ObjectChange *
+static DiaObjectChange *
 beziershape_create_corner_change (BezierShape   *bezier,
                                   Handle        *handle,
                                   Point         *point_left,
@@ -1383,5 +1387,5 @@ beziershape_create_corner_change (BezierShape   *bezier,
   change->point_left = *point_left;
   change->point_right = *point_right;
 
-  return (ObjectChange *) change;
+  return dia_object_change_legacy_new ((ObjectChange *) change);
 }
diff --git a/lib/beziershape.h b/lib/beziershape.h
index e651d37f4..11a4bf24c 100644
--- a/lib/beziershape.h
+++ b/lib/beziershape.h
@@ -18,17 +18,19 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
- 
+
 /** \file beziershape.h Allows to construct closed objects consisting of bezier lines */
 
-#ifndef BEZIERSHAPE_H
-#define BEZIERSHAPE_H
+#pragma once
 
 #include "diatypes.h"
 #include "object.h"
 #include "boundingbox.h"
 #include "bezier-common.h"
 
+
+G_BEGIN_DECLS
+
 #define HANDLE_CORNER (HANDLE_CUSTOM1)
 
 /*!
@@ -48,28 +50,45 @@ struct _BezierShape {
   ElementBBExtras extra_spacing;
 };
 
-void beziershape_update_data(BezierShape *bezier);
-void beziershape_update_boundingbox(BezierShape *bezier);
-void beziershape_init(BezierShape *bezier, int num_points);
-void beziershape_destroy(BezierShape *bezier);
-void beziershape_copy(BezierShape *from, BezierShape *to);
-void beziershape_save(BezierShape *bezier, ObjectNode obj_node, DiaContext *ctx);
+
+void             beziershape_update_data           (BezierShape      *bezier);
+void             beziershape_update_boundingbox    (BezierShape      *bezier);
+void             beziershape_init                  (BezierShape      *bezier,
+                                                    int               num_points);
+void             beziershape_destroy               (BezierShape      *bezier);
+void             beziershape_copy                  (BezierShape      *from,
+                                                    BezierShape      *to);
+void             beziershape_save                  (BezierShape      *bezier,
+                                                    ObjectNode        obj_node,
+                                                    DiaContext       *ctx);
 /* NOTE: Does object_init() */
-void beziershape_load(BezierShape *bezier, ObjectNode obj_node, DiaContext *ctx);
-ObjectChange *beziershape_add_segment(BezierShape *bezier, int segment,
-                                     Point *point);
-ObjectChange *beziershape_remove_segment(BezierShape *bezier, int point);
-ObjectChange *beziershape_set_corner_type(BezierShape *bez, Handle *handle,
-                                         BezCornerType corner_type);
-ObjectChange *beziershape_move_handle(BezierShape *bezier, Handle *id,
-                                     Point *to, ConnectionPoint *cp,
-                                     HandleMoveReason reason,
-                                     ModifierKeys modifiers);
-ObjectChange *beziershape_move(BezierShape *bezier, Point *to);
-real beziershape_distance_from(BezierShape *bezier, Point *point,
-                              real line_width);
-Handle *beziershape_closest_handle(BezierShape *bezier, Point *point);
-Handle *beziershape_closest_major_handle(BezierShape *bezier, Point *point);
+void             beziershape_load                  (BezierShape      *bezier,
+                                                    ObjectNode        obj_node,
+                                                    DiaContext       *ctx);
+DiaObjectChange *beziershape_add_segment           (BezierShape      *bezier,
+                                                    int               segment,
+                                                    Point            *point);
+DiaObjectChange *beziershape_remove_segment        (BezierShape      *bezier,
+                                                    int               point);
+DiaObjectChange *beziershape_set_corner_type       (BezierShape      *bez,
+                                                    Handle           *handle,
+                                                    BezCornerType     corner_type);
+DiaObjectChange *beziershape_move_handle           (BezierShape      *bezier,
+                                                    Handle           *handle,
+                                                    Point            *to,
+                                                    ConnectionPoint  *cp,
+                                                    HandleMoveReason  reason,
+                                                    ModifierKeys      modifiers);
+DiaObjectChange *beziershape_move                  (BezierShape      *bezier,
+                                                    Point            *to);
+double           beziershape_distance_from         (BezierShape      *bezier,
+                                                    Point            *point,
+                                                    double            line_width);
+Handle          *beziershape_closest_handle        (BezierShape      *bezier,
+                                                    Point            *point);
+Handle          *beziershape_closest_major_handle  (BezierShape      *bezier,
+                                                    Point            *point);
+
 
 #define BEZSHAPE_COMMON_PROPERTIES \
   OBJECT_COMMON_PROPERTIES, \
@@ -80,4 +99,4 @@ Handle *beziershape_closest_major_handle(BezierShape *bezier, Point *point);
   { "bez_points", PROP_TYPE_BEZPOINTARRAY, \
      offsetof(BezierShape,bezier.points), offsetof(BezierShape,bezier.num_points)} \
 
-#endif /* BEZIER_SHAPE_H */
+G_END_DECLS
diff --git a/lib/connection.c b/lib/connection.c
index 3556e3f12..c8e71542d 100644
--- a/lib/connection.c
+++ b/lib/connection.c
@@ -87,11 +87,11 @@ connection_adjust_for_autogap (Connection *connection)
  *
  * Function called to move one of the handles associated with the object.
  *
- * Returns: An #ObjectChange with additional undo information, or
+ * Returns: An #DiaObjectChange with additional undo information, or
  *          (in most cases) %NULL. Undo for moving the handle itself is
  *          handled elsewhere.
  */
-ObjectChange*
+DiaObjectChange *
 connection_move_handle (Connection       *conn,
                         HandleId          id,
                         Point            *to,
@@ -247,6 +247,7 @@ connection_destroy (Connection *conn)
  * connection_save:
  * @conn: The connection to save.
  * @obj_node: The XML node to save it to.
+ * @ctx: the current #DiaContext
  *
  * Save a connections data to XML.
  */
diff --git a/lib/connection.h b/lib/connection.h
index 87680ca80..7f8231e63 100644
--- a/lib/connection.h
+++ b/lib/connection.h
@@ -39,27 +39,28 @@ struct _Connection {
   LineBBExtras extra_spacing; /*!< calcualted bounding box */
 };
 
-void          connection_update_handles     (Connection       *conn);
-void          connection_update_boundingbox (Connection       *conn);
-void          connection_init               (Connection       *conn,
-                                             int               num_handles,
-                                             int               num_connections);
-void          connection_destroy            (Connection       *conn);
-void          connection_copy               (Connection       *from,
-                                             Connection       *to);
-void          connection_save               (Connection       *conn,
-                                             ObjectNode        obj_node,
-                                             DiaContext       *ctx);
-void          connection_load               (Connection       *conn,
-                                             ObjectNode        obj_node,
-                                             DiaContext       *ctx);
-ObjectChange* connection_move_handle        (Connection       *conn,
-                                             HandleId          id,
-                                             Point            *to,
-                                             ConnectionPoint  *cp,
-                                             HandleMoveReason  reason,
-                                             ModifierKeys      modifiers);
-void          connection_adjust_for_autogap (Connection       *conn);
+
+void             connection_update_handles     (Connection       *conn);
+void             connection_update_boundingbox (Connection       *conn);
+void             connection_init               (Connection       *conn,
+                                                int               num_handles,
+                                                int               num_connections);
+void             connection_destroy            (Connection       *conn);
+void             connection_copy               (Connection       *from,
+                                                Connection       *to);
+void             connection_save               (Connection       *conn,
+                                                ObjectNode        obj_node,
+                                                DiaContext       *ctx);
+void             connection_load               (Connection       *conn,
+                                                ObjectNode        obj_node,
+                                                DiaContext       *ctx);
+DiaObjectChange* connection_move_handle        (Connection       *conn,
+                                                HandleId          id,
+                                                Point            *to,
+                                                ConnectionPoint  *cp,
+                                                HandleMoveReason  reason,
+                                                ModifierKeys      modifiers);
+void             connection_adjust_for_autogap (Connection       *conn);
 
 /* base property stuff... */
 #define CONNECTION_COMMON_PROPERTIES \
diff --git a/lib/connpoint_line.c b/lib/connpoint_line.c
index 0b77c8567..4bcb44f9c 100644
--- a/lib/connpoint_line.c
+++ b/lib/connpoint_line.c
@@ -23,6 +23,8 @@
 #include "connpoint_line.h"
 #include "connectionpoint.h"
 #include "dia_xml.h"
+#include "dia-object-change-legacy.h"
+
 
 #define DEBUG_PARENT 0
 #define DEBUG_ORDER 0
@@ -485,7 +487,7 @@ cpl_change_free (CPLChange *change)
 }
 
 
-static ObjectChange *
+static DiaObjectChange *
 cpl_create_change(ConnPointLine *cpl, int pos, int add)
 {
   CPLChange *change;
@@ -506,35 +508,40 @@ cpl_create_change(ConnPointLine *cpl, int pos, int add)
     change->cp[add] = new_connpoint(cpl->parent);
   }
 
-  return (ObjectChange *)change;
+  return dia_object_change_legacy_new ((ObjectChange *) change);
 }
 
-ObjectChange *
-connpointline_add_points(ConnPointLine *cpl,
-                         Point *clickedpoint, int count)
+
+DiaObjectChange *
+connpointline_add_points (ConnPointLine *cpl,
+                          Point         *clickedpoint,
+                          int            count)
 {
   int pos;
-  ObjectChange *change;
+  DiaObjectChange *change;
 
-  pos = cpl_get_pointbefore(cpl,clickedpoint);
-  change = cpl_create_change(cpl,pos,count);
+  pos = cpl_get_pointbefore (cpl, clickedpoint);
+  change = cpl_create_change (cpl, pos, count);
+
+  dia_object_change_apply (change, DIA_OBJECT (cpl));
 
-  change->apply(change, (DiaObject *)cpl);
   return change;
 }
 
 
-ObjectChange *
-connpointline_remove_points(ConnPointLine *cpl,
-                            Point *clickedpoint, int count)
+DiaObjectChange *
+connpointline_remove_points (ConnPointLine *cpl,
+                             Point         *clickedpoint,
+                             int            count)
 {
   int pos;
-  ObjectChange *change;
+  DiaObjectChange *change;
+
+  pos = cpl_get_pointbefore (cpl, clickedpoint);
+  change = cpl_create_change (cpl, pos, -count);
 
-  pos = cpl_get_pointbefore(cpl,clickedpoint);
-  change = cpl_create_change(cpl,pos,-count);
+  dia_object_change_apply (change, DIA_OBJECT (cpl));
 
-  change->apply(change, (DiaObject *)cpl);
   return change;
 }
 
@@ -552,7 +559,7 @@ connpointline_adjust_count (ConnPointLine *cpl,
 
   delta = newcount - oldcount;
   if (delta != 0) {
-    ObjectChange *change;
+    DiaObjectChange *change;
     /*g_message("going to adjust %d (to be %d)",delta,shouldbe);*/
 
     if (delta > 0) {
@@ -561,8 +568,7 @@ connpointline_adjust_count (ConnPointLine *cpl,
       change = connpointline_remove_points (cpl, where, -delta);
     }
 
-    if (change->free) change->free (change);
-    g_clear_pointer (&change, g_free);
+    g_clear_pointer (&change, dia_object_change_unref);
     /* we don't really need this change object. */
   }
 
diff --git a/lib/connpoint_line.h b/lib/connpoint_line.h
index 030ea6bc6..4ad853290 100644
--- a/lib/connpoint_line.h
+++ b/lib/connpoint_line.h
@@ -53,12 +53,12 @@ int connpointline_can_add_point(ConnPointLine *cpl,
 int connpointline_can_remove_point(ConnPointLine *cpl,
                                   Point *clicked);
 
-ObjectChange *connpointline_add_points(ConnPointLine *cpl,
-                                      Point *clickedpoint,
-                                      int count);
-ObjectChange *connpointline_remove_points(ConnPointLine *cpl,
-                                         Point *clickedpoint,
-                                         int count);
+DiaObjectChange *connpointline_add_points    (ConnPointLine *cpl,
+                                              Point         *clickedpoint,
+                                              int            count);
+DiaObjectChange *connpointline_remove_points (ConnPointLine *cpl,
+                                              Point         *clickedpoint,
+                                              int            count);
 ConnPointLine *connpointline_load(DiaObject *obj,ObjectNode obj_node,
                                  const gchar *name, int default_nc,
                                  int *realconncount,
diff --git a/lib/dia-object-change-legacy.c b/lib/dia-object-change-legacy.c
new file mode 100644
index 000000000..dd90f65d5
--- /dev/null
+++ b/lib/dia-object-change-legacy.c
@@ -0,0 +1,75 @@
+/* Dia -- an diagram creation/manipulation program
+ * Copyright (C) 1999 Alexander Larsson
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ *
+ * Copyright © 2020 Zander Brown <zbrown gnome org>
+ */
+
+#include "dia-object-change-legacy.h"
+
+
+struct _DiaObjectChangeLegacy {
+  DiaObjectChange parent_instance;
+
+  ObjectChange *legacy;
+};
+
+
+DIA_DEFINE_OBJECT_CHANGE (DiaObjectChangeLegacy, dia_object_change_legacy)
+
+
+static void
+dia_object_change_legacy_apply (DiaObjectChange *self, DiaObject *object)
+{
+  DiaObjectChangeLegacy *change = DIA_OBJECT_CHANGE_LEGACY (self);
+
+  change->legacy->apply (change->legacy, object);
+}
+
+
+static void
+dia_object_change_legacy_revert (DiaObjectChange *self, DiaObject *object)
+{
+  DiaObjectChangeLegacy *change = DIA_OBJECT_CHANGE_LEGACY (self);
+
+  change->legacy->revert (change->legacy, object);
+}
+
+
+static void
+dia_object_change_legacy_free (DiaObjectChange *self)
+{
+  DiaObjectChangeLegacy *change = DIA_OBJECT_CHANGE_LEGACY (self);
+
+  if (change->legacy->free) {
+    change->legacy->free (change->legacy);
+  }
+
+  g_clear_pointer (&change->legacy, g_free);
+}
+
+
+DiaObjectChange *
+dia_object_change_legacy_new (ObjectChange *legacy)
+{
+  DiaObjectChangeLegacy *change = dia_object_change_new (DIA_TYPE_OBJECT_CHANGE_LEGACY);
+
+  change->legacy = legacy;
+
+  return DIA_OBJECT_CHANGE (change);
+}
diff --git a/lib/dia-object-change-legacy.h b/lib/dia-object-change-legacy.h
new file mode 100644
index 000000000..e4af98588
--- /dev/null
+++ b/lib/dia-object-change-legacy.h
@@ -0,0 +1,39 @@
+/* Dia -- an diagram creation/manipulation program
+ * Copyright (C) 1999 Alexander Larsson
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ *
+ * Copyright © 2020 Zander Brown <zbrown gnome org>
+ */
+
+#pragma once
+
+#ifndef __GTK_DOC_IGNORE__
+typedef struct _ObjectChange ObjectChange;
+#endif
+
+#include "dia-object-change.h"
+#include "objchange.h"
+
+G_BEGIN_DECLS
+
+#define DIA_TYPE_OBJECT_CHANGE_LEGACY dia_object_change_legacy_get_type ()
+G_DECLARE_FINAL_TYPE (DiaObjectChangeLegacy, dia_object_change_legacy, DIA, OBJECT_CHANGE_LEGACY, 
DiaObjectChange)
+
+DiaObjectChange *dia_object_change_legacy_new (ObjectChange *legacy);
+
+G_END_DECLS
diff --git a/lib/dia-object-change-list.c b/lib/dia-object-change-list.c
new file mode 100644
index 000000000..1b37251f5
--- /dev/null
+++ b/lib/dia-object-change-list.c
@@ -0,0 +1,87 @@
+/* Dia -- an diagram creation/manipulation program
+ * Copyright (C) 1999 Alexander Larsson
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ *
+ * Copyright © 2020 Zander Brown <zbrown gnome org>
+ */
+
+#include "dia-object-change-list.h"
+
+
+struct _DiaObjectChangeList {
+  DiaObjectChange parent_instance;
+
+  GPtrArray *changes;
+};
+
+
+DIA_DEFINE_OBJECT_CHANGE (DiaObjectChangeList, dia_object_change_list)
+
+
+static void
+dia_object_change_list_apply (DiaObjectChange *self, DiaObject *object)
+{
+  DiaObjectChangeList *change = DIA_OBJECT_CHANGE_LIST (self);
+
+  for (int i = 0; i < change->changes->len; i++) {
+    dia_object_change_apply (g_ptr_array_index (change->changes, i), object);
+  }
+}
+
+
+static void
+dia_object_change_list_revert (DiaObjectChange *self, DiaObject *object)
+{
+  DiaObjectChangeList *change = DIA_OBJECT_CHANGE_LIST (self);
+
+  for (int i = 0; i < change->changes->len; i++) {
+    dia_object_change_revert (g_ptr_array_index (change->changes, i), object);
+  }
+}
+
+
+static void
+dia_object_change_list_free (DiaObjectChange *self)
+{
+  DiaObjectChangeList *change = DIA_OBJECT_CHANGE_LIST (self);
+
+  g_clear_pointer (&change->changes, g_ptr_array_unref);
+}
+
+
+DiaObjectChange *
+dia_object_change_list_new (void)
+{
+  DiaObjectChangeList *self = dia_object_change_new (DIA_TYPE_OBJECT_CHANGE_LIST);
+
+  self->changes = g_ptr_array_new_with_free_func (dia_object_change_unref);
+
+  return DIA_OBJECT_CHANGE (self);
+}
+
+
+void
+dia_object_change_list_add (DiaObjectChangeList *self,
+                            DiaObjectChange     *change)
+{
+  g_return_if_fail (DIA_IS_OBJECT_CHANGE_LIST (self));
+
+  if (change) {
+    g_ptr_array_add (self->changes, dia_object_change_ref (change));
+  }
+}
diff --git a/lib/dia-object-change-list.h b/lib/dia-object-change-list.h
new file mode 100644
index 000000000..f27528dd3
--- /dev/null
+++ b/lib/dia-object-change-list.h
@@ -0,0 +1,36 @@
+/* Dia -- an diagram creation/manipulation program
+ * Copyright (C) 1999 Alexander Larsson
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ *
+ * SPDX-License-Identifier: GPL-2.0-or-later
+ *
+ * Copyright © 2020 Zander Brown <zbrown gnome org>
+ */
+
+#pragma once
+
+#include "dia-object-change.h"
+
+G_BEGIN_DECLS
+
+#define DIA_TYPE_OBJECT_CHANGE_LIST dia_object_change_list_get_type ()
+G_DECLARE_FINAL_TYPE (DiaObjectChangeList, dia_object_change_list, DIA, OBJECT_CHANGE_LIST, DiaObjectChange)
+
+DiaObjectChange *dia_object_change_list_new (void);
+void             dia_object_change_list_add (DiaObjectChangeList *self,
+                                             DiaObjectChange     *change);
+
+G_END_DECLS
diff --git a/lib/dia-object-change.c b/lib/dia-object-change.c
index f14ce6714..398bc1759 100644
--- a/lib/dia-object-change.c
+++ b/lib/dia-object-change.c
@@ -316,7 +316,6 @@ dia_object_change_apply (DiaObjectChange *self,
                          DiaObject       *object)
 {
   g_return_if_fail (self && DIA_IS_OBJECT_CHANGE (self));
-  g_return_if_fail (object && DIA_IS_DIAGRAM_DATA (object));
 
   DIA_OBJECT_CHANGE_GET_CLASS (self)->apply (self, object);
 }
@@ -338,7 +337,6 @@ dia_object_change_revert (DiaObjectChange *self,
                           DiaObject       *object)
 {
   g_return_if_fail (self && DIA_IS_OBJECT_CHANGE (self));
-  g_return_if_fail (object && DIA_IS_DIAGRAM_DATA (object));
 
   DIA_OBJECT_CHANGE_GET_CLASS (self)->revert (self, object);
 }
diff --git a/lib/diamenu.h b/lib/diamenu.h
index 926882af9..5a7bf47d8 100644
--- a/lib/diamenu.h
+++ b/lib/diamenu.h
@@ -19,6 +19,7 @@
 #define DIAMENU_H
 
 #include "diatypes.h"
+#include "dia-object-change.h"
 
 /* Flags for DiaMenuItem->active */
 #define DIAMENU_ACTIVE (1<<0)
@@ -26,7 +27,9 @@
 #define DIAMENU_TOGGLE_ON (1<<2)
 
 /* Note: The returned change is already applied. */
-typedef ObjectChange *(*DiaMenuCallback)(DiaObject *obj, Point *pos, gpointer data);
+typedef DiaObjectChange *(*DiaMenuCallback) (DiaObject *obj,
+                                             Point     *pos,
+                                             gpointer   data);
 
 struct _DiaMenuItem {
   char *text;
diff --git a/lib/diatypes.h b/lib/diatypes.h
index abba78b2d..7fa332d06 100644
--- a/lib/diatypes.h
+++ b/lib/diatypes.h
@@ -120,7 +120,6 @@ typedef struct _NewOrthConn NewOrthConn;
 
 /* In objchange.h: */
 typedef struct _ObjectState ObjectState;
-typedef struct _ObjectChange ObjectChange;
 
 /* In object.h: */
 typedef struct _DiaObject DiaObject;
diff --git a/lib/element.c b/lib/element.c
index 2843e6ac5..cf62628f7 100644
--- a/lib/element.c
+++ b/lib/element.c
@@ -17,7 +17,7 @@
  */
 
 /**
- * SECTION:element:
+ * SECTION:element
  * @title: Element
  *
  * The Element object type is a rectangular box that has
@@ -35,6 +35,8 @@
 
 #include "element.h"
 #include "properties.h"
+#include "dia-object-change-legacy.h"
+
 
 #ifdef G_OS_WIN32
 /* defined in header */
@@ -214,7 +216,7 @@ element_update_handles (Element *elem)
  *
  * Returns: Undo information for this change.
  */
-ObjectChange *
+DiaObjectChange *
 element_move_handle (Element          *elem,
                      HandleId          id,
                      Point            *to,
@@ -594,10 +596,10 @@ _element_change_swap (ObjectChange *self,
 }
 
 
-ObjectChange *
+DiaObjectChange *
 element_change_new (const Point *corner,
-                    real         width,
-                    real         height,
+                    double       width,
+                    double       height,
                     Element     *elem)
 {
   ElementChange *ec = g_new0 (ElementChange, 1);
@@ -611,7 +613,7 @@ element_change_new (const Point *corner,
   ec->width = elem->width;
   ec->height = elem->height;
 
-  return &ec->object_change;
+  return dia_object_change_legacy_new ((ObjectChange *) ec);
 }
 
 
diff --git a/lib/element.h b/lib/element.h
index 0a5079991..801a95c6f 100644
--- a/lib/element.h
+++ b/lib/element.h
@@ -31,13 +31,13 @@
  * \brief Beside OrthCon one of the most use object classes
  *
  * This is a subclass of DiaObject used to help implementing objects
- * of a type with 8 handles. 
+ * of a type with 8 handles.
  *
  * \extends _DiaObject
  */
 struct _Element {
   DiaObject object; /* inheritance */
-  
+
   Handle resize_handles[8]; /*!< not only for resizing but may also be used for connections */
 
   Point corner; /*!< upper-left corner of the Element */
@@ -57,19 +57,22 @@ void element_update_boundingbox(Element *elem);
 void element_init(Element *elem, int num_handles, int num_connections);
 void element_destroy(Element *elem);
 void element_copy(Element *from, Element *to);
-ObjectChange* element_move_handle(Element *elem, HandleId id,
-                                 Point *to, ConnectionPoint *cp,
-                                 HandleMoveReason reason, 
-                                 ModifierKeys modifiers);
+DiaObjectChange *element_move_handle           (Element          *elem,
+                                                HandleId          id,
+                                                Point            *to,
+                                                ConnectionPoint  *cp,
+                                                HandleMoveReason  reason,
+                                                ModifierKeys      modifiers);
 void element_move_handle_aspect(Element *elem, HandleId id,
                                Point *to, real aspect_ratio);
 
 void element_save(Element *elem, ObjectNode obj_node, DiaContext *ctx);
 void element_load(Element *elem, ObjectNode obj_node, DiaContext *ctx);
 
-ObjectChange *element_change_new (const Point *corner, 
-                                 real width, real height,
-                                 Element *elem);
+DiaObjectChange *element_change_new            (const Point      *corner,
+                                                double            width,
+                                                double            height,
+                                                Element          *elem);
 
 void element_get_poly (const Element *elem, real angle, Point corners[4]);
 
@@ -79,7 +82,7 @@ void element_get_poly (const Element *elem, real angle, Point corners[4]);
 /* see lib/properties.h for the reason */
 static PropNumData width_range = { -G_MAXFLOAT, G_MAXFLOAT, 0.1};
 #else
-/* use extern on Linux/gcc to avoid 
+/* use extern on Linux/gcc to avoid
  * warning: 'width_range' defined but not used */
 extern PropNumData width_range;
 #endif
diff --git a/lib/filter.h b/lib/filter.h
index 1c80c7fc0..b4fc02821 100644
--- a/lib/filter.h
+++ b/lib/filter.h
@@ -25,6 +25,7 @@
 #include <glib.h>
 #include "diagramdata.h"
 #include "diacontext.h"
+#include "dia-object-change.h"
 
 G_BEGIN_DECLS
 
@@ -56,7 +57,7 @@ struct _DiaExportFilter {
 };
 
 /* returns FALSE on error loading diagram */
-typedef gboolean (* DiaImportFunc) (const gchar* filename, DiagramData *dia, 
+typedef gboolean (* DiaImportFunc) (const gchar* filename, DiagramData *dia,
                                     DiaContext *ctx, void* user_data);
 /* load from given memory block instead of from file */
 typedef gboolean (* DiaImportMemFunc) (const guchar *p, guint size, DiagramData *dia,
@@ -82,10 +83,12 @@ struct _DiaImportFilter {
 };
 
 /* gets called as menu callback */
-typedef ObjectChange * (* DiaCallbackFunc) (DiagramData *dia,
-                                           const gchar *filename, /* the original filename */
-                                           guint flags, /* further additions */
-                                           void* user_data);
+typedef DiaObjectChange * (* DiaCallbackFunc) (DiagramData *dia,
+                                               /* the original filename */
+                                               const char  *filename,
+                                               /* further additions */
+                                               guint        flags,
+                                               void        *user_data);
 
 struct _DiaCallbackFilter {
   const gchar *action;
diff --git a/lib/focus.h b/lib/focus.h
index 7154bdaed..3bd28ab4d 100644
--- a/lib/focus.h
+++ b/lib/focus.h
@@ -19,6 +19,7 @@
 #pragma once
 
 #include "diatypes.h"
+#include "dia-object-change.h"
 
 struct _Focus {
   DiaObject *obj;
@@ -27,8 +28,12 @@ struct _Focus {
 
   /* return TRUE if modified object.
      Set change if object is changed. */
-  int (*key_event)(Focus *focus, guint keystate, guint keysym, const gchar *str, int strlen,
-                   ObjectChange **change);
+  int (*key_event) (Focus            *focus,
+                    guint             keystate,
+                    guint             keysym,
+                    const char       *str,
+                    int               strlen,
+                    DiaObjectChange **change);
 };
 
 void request_focus(Focus *focus);
diff --git a/lib/group.c b/lib/group.c
index d3d8aa04e..4badab1b9 100644
--- a/lib/group.c
+++ b/lib/group.c
@@ -25,6 +25,8 @@
 #include "group.h"
 #include "properties.h"
 #include "diarenderer.h"
+#include "dia-object-change-legacy.h"
+
 
 /*!
  * \brief Allow grouping other objects and hiding them from the diagram
@@ -49,26 +51,40 @@ struct _GroupPropChange {
   GList *changes_per_object;
 };
 
-static GroupPropChange* group_apply_properties_list(Group *group, GPtrArray *props);
-static void group_prop_change_apply(GroupPropChange *change, DiaObject *obj);
-static void group_prop_change_revert(GroupPropChange *change, DiaObject *obj);
-static void group_prop_change_free(GroupPropChange *change);
-
-static real group_distance_from(Group *group, Point *point);
-static void group_select(Group *group);
-static ObjectChange* group_move_handle(Group *group, Handle *handle, Point *to, ConnectionPoint *cp,
-                                                HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* group_move(Group *group, Point *to);
-static void group_draw(Group *group, DiaRenderer *renderer);
-static void group_update_data(Group *group);
-static void group_update_handles(Group *group);
-static void group_update_connectionpoints(Group *group);
-static void group_destroy(Group *group);
-static DiaObject *group_copy(Group *group);
-static const PropDescription *group_describe_props(Group *group);
-static void group_get_props(Group *group, GPtrArray *props);
-static void group_set_props(Group *group, GPtrArray *props);
-static void group_transform (Group *group, const DiaMatrix *m);
+
+static DiaObjectChange       *group_apply_properties_list    (Group            *group,
+                                                              GPtrArray        *props);
+static void                   group_prop_change_apply        (GroupPropChange  *change,
+                                                              DiaObject        *obj);
+static void                   group_prop_change_revert       (GroupPropChange  *change,
+                                                              DiaObject        *obj);
+static void                   group_prop_change_free         (GroupPropChange  *change);
+static double                 group_distance_from            (Group            *group,
+                                                              Point            *point);
+static void                   group_select                   (Group            *group);
+static DiaObjectChange       *group_move_handle              (Group            *group,
+                                                              Handle           *handle,
+                                                              Point            *to,
+                                                              ConnectionPoint  *cp,
+                                                              HandleMoveReason  reason,
+                                                              ModifierKeys      modifiers);
+static DiaObjectChange       *group_move                     (Group            *group,
+                                                              Point            *to);
+static void                   group_draw                     (Group            *group,
+                                                              DiaRenderer      *renderer);
+static void                   group_update_data              (Group            *group);
+static void                   group_update_handles           (Group            *group);
+static void                   group_update_connectionpoints  (Group            *group);
+static void                   group_destroy                  (Group            *group);
+static DiaObject             *group_copy                     (Group            *group);
+static const PropDescription *group_describe_props           (Group            *group);
+static void                   group_get_props                (Group            *group,
+                                                              GPtrArray        *props);
+static void                   group_set_props                (Group            *group,
+                                                              GPtrArray        *props);
+static void                   group_transform                (Group            *group,
+                                                              const DiaMatrix  *m);
+
 
 static ObjectOps group_ops = {
   (DestroyFunc)         group_destroy,
@@ -213,7 +229,7 @@ group_objects_move_delta (Group *group, const Point *delta)
 }
 
 
-static ObjectChange*
+static DiaObjectChange *
 group_move_handle (Group            *group,
                    Handle           *handle,
                    Point            *to,
@@ -327,8 +343,9 @@ group_move_handle (Group            *group,
   return NULL;
 }
 
-static ObjectChange*
-group_move(Group *group, Point *to)
+
+static DiaObjectChange *
+group_move (Group *group, Point *to)
 {
   Point delta,pos;
 
@@ -785,12 +802,13 @@ group_set_props(Group *group, GPtrArray *props)
   group_update_data (group);
 }
 
-GroupPropChange *
-group_apply_properties_list(Group *group, GPtrArray *props)
+
+DiaObjectChange *
+group_apply_properties_list (Group *group, GPtrArray *props)
 {
   GList *tmp = NULL;
   GList *clist = NULL;
-  ObjectChange *objchange;
+  DiaObjectChange *objchange;
   GroupPropChange *change = NULL;
   GPtrArray *props_list, *props_self;
   guint i;
@@ -841,17 +859,18 @@ group_apply_properties_list(Group *group, GPtrArray *props)
 
   change->changes_per_object = clist;
 
-  return change;
+  return dia_object_change_legacy_new ((ObjectChange *) change);
 }
 
+
 static void
-group_prop_change_apply(GroupPropChange *change, DiaObject *obj)
+group_prop_change_apply (GroupPropChange *change, DiaObject *obj)
 {
   GList *tmp;
 
   for (tmp = change->changes_per_object; tmp != NULL;
-       tmp = g_list_next(tmp)) {
-    ObjectChange *obj_change = (ObjectChange*)tmp->data;
+       tmp = g_list_next (tmp)) {
+    DiaObjectChange *obj_change = DIA_OBJECT_CHANGE (tmp->data);
 
     /*
       This call to apply() depends on the fact that it is actually a
@@ -861,18 +880,19 @@ group_prop_change_apply(GroupPropChange *change, DiaObject *obj)
       in ObjectChange. Read comments near the ObjectChange struct in
       objchange.h
      */
-    obj_change->apply(obj_change, NULL);
+    dia_object_change_apply (obj_change, NULL);
   }
 }
 
+
 static void
-group_prop_change_revert(GroupPropChange *change, DiaObject *obj)
+group_prop_change_revert (GroupPropChange *change, DiaObject *obj)
 {
   GList *tmp;
 
   for (tmp = change->changes_per_object; tmp != NULL;
        tmp = g_list_next(tmp)) {
-    ObjectChange *obj_change = (ObjectChange*)tmp->data;
+    DiaObjectChange *obj_change = DIA_OBJECT_CHANGE (tmp->data);
 
     /*
       This call to revert() depends on the fact that it is actually a
@@ -882,23 +902,18 @@ group_prop_change_revert(GroupPropChange *change, DiaObject *obj)
       in ObjectChange. Read comments near the ObjectChange struct in
       objchange.h
      */
-    obj_change->revert(obj_change, NULL);
+    dia_object_change_revert (obj_change, NULL);
   }
 }
 
+
 static void
-group_prop_change_free(GroupPropChange *change)
+group_prop_change_free (GroupPropChange *change)
 {
-  GList *tmp;
-  for (tmp = change->changes_per_object; tmp != NULL;
-       tmp = g_list_next(tmp)) {
-    ObjectChange *obj_change = (ObjectChange*)tmp->data;
-    obj_change->free(obj_change);
-    g_clear_pointer (&obj_change, g_free);
-  }
-  g_list_free(change->changes_per_object);
+  g_list_free_full (change->changes_per_object, dia_object_change_unref);
 }
 
+
 static void
 group_transform (Group *group, const DiaMatrix *m)
 {
diff --git a/lib/meson.build b/lib/meson.build
index 9938fea1a..162c89f59 100644
--- a/lib/meson.build
+++ b/lib/meson.build
@@ -93,6 +93,10 @@ libdia_sources = stdprop_sources + [
     'dia-change.h',
     'dia-object-change.c',
     'dia-object-change.h',
+    'dia-object-change-legacy.c',
+    'dia-object-change-legacy.h',
+    'dia-object-change-list.c',
+    'dia-object-change-list.h',
     'dialogs.c',
     'dialogs.h',
     'widgets.c',
diff --git a/lib/objchange.c b/lib/objchange.c
index 738ea1c81..88217a06e 100644
--- a/lib/objchange.c
+++ b/lib/objchange.c
@@ -19,11 +19,11 @@
 #include <config.h>
 
 #include "object.h"
+#include "dia-object-change-legacy.h"
 
 /******** ObjectChange for object that just need to get/set state: *****/
 
 typedef struct _ObjectStateChange ObjectStateChange;
-
 struct _ObjectStateChange {
   ObjectChange obj_change;
 
@@ -34,14 +34,15 @@ struct _ObjectStateChange {
   DiaObject *obj;
 };
 
+
 static void
-object_state_change_apply_revert(ObjectStateChange *change, DiaObject *obj)
+object_state_change_apply_revert (ObjectStateChange *change, DiaObject *obj)
 {
   ObjectState *old_state;
 
-  old_state = change->get_state(change->obj);
+  old_state = change->get_state (change->obj);
 
-  change->set_state(change->obj, change->saved_state);
+  change->set_state (change->obj, change->saved_state);
 
   change->saved_state = old_state;
 }
@@ -58,10 +59,11 @@ object_state_change_free (ObjectStateChange *change)
 }
 
 
-ObjectChange *new_object_state_change(DiaObject *obj,
-                                     ObjectState *old_state,
-                                     GetStateFunc get_state,
-                                     SetStateFunc set_state )
+DiaObjectChange *
+new_object_state_change (DiaObject    *obj,
+                         ObjectState  *old_state,
+                         GetStateFunc  get_state,
+                         SetStateFunc  set_state)
 {
   ObjectStateChange *change;
 
@@ -82,82 +84,5 @@ ObjectChange *new_object_state_change(DiaObject *obj,
   change->obj = obj;
   change->saved_state = old_state;
 
-  return (ObjectChange *)change;
-}
-
-typedef struct _ObjectChangeList ObjectChangeList;
-struct _ObjectChangeList {
-  ObjectChange object_change;
-
-  GPtrArray *changes;
-};
-
-static void
-_change_list_apply (ObjectChange *change_list, DiaObject *obj)
-{
-  ObjectChangeList *list = (ObjectChangeList *)change_list;
-  guint i;
-
-  for (i = 0; i < list->changes->len; ++i) {
-    ObjectChange * change = (ObjectChange *)g_ptr_array_index(list->changes, i);
-
-    change->apply (change, obj /*?*/);
-  }
-}
-static void
-_change_list_revert (ObjectChange *change_list, DiaObject *obj)
-{
-  ObjectChangeList *list = (ObjectChangeList *)change_list;
-  guint i;
-
-  if (list->changes->len < 1)
-    return; /* avoid overflow below */
-
-  for (i = list->changes->len - 1;/* i >= 0 */; --i) {
-    ObjectChange * change = (ObjectChange *)g_ptr_array_index(list->changes, i);
-
-    change->revert (change, obj /*?*/);
-    if (i == 0)
-      break; /* break here, i>=0 does not work as loop condition (it's always TRUE) */
-  }
-}
-static void
-_change_list_free (ObjectChange *change_list)
-{
-  ObjectChangeList *list = (ObjectChangeList *)change_list;
-  guint i;
-
-  for (i = 0; i < list->changes->len; ++i) {
-    ObjectChange * change = (ObjectChange *)g_ptr_array_index(list->changes, i);
-
-    if (change->free)
-      change->free (change);
-  }
-  g_ptr_array_free (list->changes, FALSE);
-  /* must not delete the object itself, so no:
-  g_clear_pointer (&change_list, g_free);
-   */
-}
-/* An empty list of changes to accumulate many to one change */
-ObjectChange *
-change_list_create (void)
-{
-  ObjectChangeList *list = g_new (ObjectChangeList, 1);
-
-  list->object_change.apply  = _change_list_apply;
-  list->object_change.revert = _change_list_revert;
-  list->object_change.free   = _change_list_free;
-
-  list->changes = g_ptr_array_new ();
-
-  return (ObjectChange *)list;
-}
-
-void
-change_list_add (ObjectChange *change_list, ObjectChange *change)
-{
-  ObjectChangeList *list = (ObjectChangeList *)change_list;
-
-  if (change)
-    g_ptr_array_add (list->changes, change);
+  return dia_object_change_legacy_new ((ObjectChange *) change);
 }
diff --git a/lib/objchange.h b/lib/objchange.h
index 93326267e..df6831d05 100644
--- a/lib/objchange.h
+++ b/lib/objchange.h
@@ -16,8 +16,8 @@
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
-/*! 
- * \file objchange.h -- Forming the basic of undo support to be implemented in objects 
+/*!
+ * \file objchange.h -- Forming the basic of undo support to be implemented in objects
  */
 /*!
  * \defgroup ObjChange Support for undo/redo
@@ -28,6 +28,7 @@
 #define OBJCHANGE_H
 
 #include "diatypes.h"
+#include "dia-object-change.h"
 
 G_BEGIN_DECLS
 
@@ -67,7 +68,7 @@ struct _ObjectState {
 
   Need not save state that only depens on
   the object and it's handles positions.
-  
+
   The calling function owns the returned reference.
 
   \ingroup ObjChange
@@ -86,22 +87,13 @@ typedef ObjectState * (*GetStateFunc) (DiaObject* obj);
 */
 typedef void (*SetStateFunc) (DiaObject* obj, ObjectState *state);
 
-/*! Create a single change from the ObjectState 
- * \ingroup ObjChange
- */
-ObjectChange *new_object_state_change(DiaObject *obj,
-                                     ObjectState *old_state,
-                                     GetStateFunc get_state,
-                                     SetStateFunc set_state );
-
-/*! Create a list of ObjectChange for single step undo/redo 
- * \ingroup ObjChange
- */
-ObjectChange *change_list_create (void);
-/*! Add another ObjectChange to the list of changes
+/*! Create a single change from the ObjectState
  * \ingroup ObjChange
  */
-void change_list_add (ObjectChange *change_list, ObjectChange *change);
+DiaObjectChange *new_object_state_change (DiaObject    *obj,
+                                          ObjectState  *old_state,
+                                          GetStateFunc  get_state,
+                                          SetStateFunc  set_state);
 
 G_END_DECLS
 
diff --git a/lib/object.c b/lib/object.c
index f8a037949..c8793e6ca 100644
--- a/lib/object.c
+++ b/lib/object.c
@@ -27,6 +27,7 @@
 #include "message.h"
 #include "parent.h"
 #include "dia-layer.h"
+#include "dia-object-change-legacy.h"
 
 #include "dummy_dep.h"
 
@@ -270,45 +271,48 @@ object_copy_list (GList *list_orig)
  *
  * bug The return Change object only contains info for a single object.
  */
-ObjectChange*
+DiaObjectChange *
 object_list_move_delta_r (GList *objects, Point *delta, gboolean affected)
 {
   GList *list;
   DiaObject *obj;
   Point pos;
-  ObjectChange *objchange = NULL;
+  DiaObjectChange *objchange = NULL;
 
   if (delta->x == 0 && delta->y == 0)
        return NULL;
 
   list = objects;
   while (list != NULL) {
-    obj = (DiaObject *) list->data;
+    obj = DIA_OBJECT (list->data);
 
     pos = obj->position;
-    point_add(&pos, delta);
+    point_add (&pos, delta);
 
     if (obj->parent && affected) {
       DiaRectangle p_ext;
       DiaRectangle c_ext;
       Point new_delta;
 
-      parent_handle_extents(obj->parent, &p_ext);
-      parent_handle_extents(obj, &c_ext);
-      new_delta = parent_move_child_delta(&p_ext, &c_ext, delta);
-      point_add(&pos, &new_delta);
-      point_add(delta, &new_delta);
+      parent_handle_extents (obj->parent, &p_ext);
+      parent_handle_extents (obj, &c_ext);
+      new_delta = parent_move_child_delta (&p_ext, &c_ext, delta);
+      point_add (&pos, &new_delta);
+      point_add (delta, &new_delta);
     }
-    objchange = obj->ops->move(obj, &pos);
+    objchange = dia_object_move (obj, &pos);
 
-    if (object_flags_set(obj, DIA_OBJECT_CAN_PARENT) && obj->children)
-      objchange = object_list_move_delta_r(obj->children, delta, FALSE);
+    if (object_flags_set (obj, DIA_OBJECT_CAN_PARENT) && obj->children) {
+      objchange = object_list_move_delta_r (obj->children, delta, FALSE);
+    }
 
-    list = g_list_next(list);
+    list = g_list_next (list);
   }
+
   return objchange;
 }
 
+
 /**
  * object_list_move_delta:
  * @objects: The list ob objects to move.
@@ -316,34 +320,34 @@ object_list_move_delta_r (GList *objects, Point *delta, gboolean affected)
  *
  * Move a set of objects a given amount.
  */
-ObjectChange*
+DiaObjectChange *
 object_list_move_delta (GList *objects, Point *delta)
 {
   GList *list;
   DiaObject *obj;
   GList *process;
-  ObjectChange *objchange = NULL;
+  DiaObjectChange *objchange = NULL;
 
-  objects = parent_list_affected_hierarchy(objects);
+  objects = parent_list_affected_hierarchy (objects);
   list = objects;
   /* The recursive function object_list_move_delta cannot process the toplevel
      (in selection) objects so we have to have this extra loop */
-  while (list != NULL)
-  {
-    obj = (DiaObject *) list->data;
+  while (list != NULL) {
+    obj = DIA_OBJECT (list->data);
 
     process = NULL;
-    process = g_list_append(process, obj);
-    objchange = object_list_move_delta_r(process, delta, (obj->parent != NULL) );
-    g_list_free(process);
+    process = g_list_append (process, obj);
+    objchange = object_list_move_delta_r (process, delta, (obj->parent != NULL));
+    g_list_free (process);
 
-    list = g_list_next(list);
+    list = g_list_next (list);
   }
+
   return objchange;
 }
 
-typedef struct _ObjectChangeExchange
-{
+
+typedef struct _ObjectChangeExchange {
   ObjectChange change;
   DiaObject    *orig;
   DiaObject    *subst;
@@ -532,12 +536,12 @@ _object_exchange_free (ObjectChange *change)
  * all the existing object relations, e.g. connections, parent_layer
  * and parenting information.
  *
- * Returns: #ObjectChange containing undo/redo information
+ * Returns: #DiaObjectChange containing undo/redo information
  */
-ObjectChange *
+DiaObjectChange *
 object_substitute (DiaObject *obj, DiaObject *subst)
 {
-  ObjectChangeExchange *change = g_new0(ObjectChangeExchange, 1);
+  ObjectChangeExchange *change = g_new0 (ObjectChangeExchange, 1);
 
   change->change.apply  = _object_exchange_apply;
   change->change.revert = _object_exchange_revert;
@@ -545,9 +549,9 @@ object_substitute (DiaObject *obj, DiaObject *subst)
   change->orig  = obj;
   change->subst = subst;
 
-  _object_exchange_apply ((ObjectChange*)change, obj);
+  _object_exchange_apply ((ObjectChange *) change, obj);
 
-  return (ObjectChange*)change;
+  return dia_object_change_legacy_new ((ObjectChange *) change);
 }
 
 
@@ -1467,6 +1471,7 @@ dia_object_clone (DiaObject *self)
   return self->ops->copy (self);
 }
 
+
 /**
  * dia_object_move:
  * @self: The object being moved.
@@ -1477,15 +1482,15 @@ dia_object_clone (DiaObject *self)
  *
  * Function called to move the entire object.
  *
- * Returns: An #ObjectChange with additional undo information, or
- *          (in most cases) %NULL.  Undo for moving the object itself is
+ * Returns: A #DiaObjectChange with additional undo information, or
+ *          (in most cases) %NULL. Undo for moving the object itself is
  *          handled elsewhere.
  *
  * Stability: Stable
  *
  * Since: 0.98
  */
-ObjectChange *
+DiaObjectChange *
 dia_object_move (DiaObject *self,
                  Point     *to)
 {
@@ -1495,6 +1500,7 @@ dia_object_move (DiaObject *self,
   return self->ops->move (self, to);
 }
 
+
 /**
  * dia_object_move_handle:
  * @self: The object whose handle is being moved.
@@ -1519,15 +1525,15 @@ dia_object_move (DiaObject *self,
  *
  * Function called to move one of the handles associated with the object.
  *
- * Returns: An #ObjectChange with additional undo information, or
- *          (in most cases) %NULL.  Undo for moving the handle itself is handled
+ * Returns: A #DiaObjectChange with additional undo information, or
+ *          (in most cases) %NULL. Undo for moving the handle itself is handled
  *          elsewhere.
  *
  * Stability: Stable
  *
  * Since: 0.98
  */
-ObjectChange *
+DiaObjectChange *
 dia_object_move_handle (DiaObject              *self,
                         Handle                 *handle,
                         Point                  *to,
@@ -1541,6 +1547,7 @@ dia_object_move_handle (DiaObject              *self,
   return self->ops->move_handle (self, handle, to, cp, reason, modifiers);
 }
 
+
 /**
  * dia_object_get_editor:
  * @self: An obj that this dialog is being made for.
@@ -1577,6 +1584,7 @@ dia_object_get_editor (DiaObject *self,
   return self->ops->get_properties (self, is_default);
 }
 
+
 /**
  * dia_object_apply_editor:
  * @self: The object whose dialog has had its Apply button clicked.
@@ -1587,14 +1595,14 @@ dia_object_get_editor (DiaObject *self,
  * The widget parameter is the one created by
  * the get_properties function.
  *
- * Returns: a #ObjectChange that can be used for undo/redo, The returned change is
- *          already applied.
+ * Returns: a #DiaObjectChange that can be used for undo/redo, The returned
+ *          change is already applied.
  *
  * Stability: Stable
  *
  * Since: 0.98
  */
-ObjectChange *
+DiaObjectChange *
 dia_object_apply_editor (DiaObject *self,
                          GtkWidget *editor)
 {
@@ -1604,6 +1612,7 @@ dia_object_apply_editor (DiaObject *self,
   return self->ops->apply_properties_from_dialog (self, editor);
 }
 
+
 /**
  * dia_object_get_menu:
  * @self: The object that is selected when the object menu is asked for.
@@ -1719,13 +1728,13 @@ dia_object_set_properties (DiaObject *self,
  * is different from SetPropsFunc since this is used to implement
  * undo/redo.
  *
- * Returns: a #ObjectChange for undo/redo
+ * Returns: a #DiaObjectChange for undo/redo
  *
  * Stability: Stable
  *
  * Since: 0.98
  */
-ObjectChange *
+DiaObjectChange *
 dia_object_apply_properties (DiaObject *self,
                              GPtrArray *list)
 {
diff --git a/lib/object.h b/lib/object.h
index 0ffff0eff..f5332e751 100644
--- a/lib/object.h
+++ b/lib/object.h
@@ -16,7 +16,8 @@
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
 
-/** @file object.h -- definitions for Dia objects, in particular the 'virtual'
+/*
+ * Definitions for Dia objects, in particular the 'virtual'
  * functions and the object and type structures.
  */
 #ifndef DIA_OBJECT_H
@@ -29,24 +30,32 @@
 #include "connectionpoint.h"
 #include "handle.h"
 #include "diamenu.h"
-#include "objchange.h"
 #include "dia_xml.h"
 #include "text.h"
 #include "diacontext.h"
 #include "diarenderer.h"
+#include "dia-object-change.h"
 
 G_BEGIN_DECLS
 
-/** Flags for DiaObject */
+/**
+ * DiaObjectFlags:
+ *
+ * Flags for DiaObject
+ */
 typedef enum {
-  /** Set this if the DiaObject can 'contain' other objects that move with
-   *  it, a.k.a. be a parent.  A parent moves its children along and
-   *  constricts its children to live inside its borders.
+  /* Set this if the DiaObject can 'contain' other objects that move with
+   * it, a.k.a. be a parent.  A parent moves its children along and
+   * constricts its children to live inside its borders.
    */
   DIA_OBJECT_CAN_PARENT = 1
 } DiaObjectFlags;
 
-/** This enumeration gives a bitset of modifier keys currently held down.
+
+/**
+ * ModifierKeys:
+ *
+ * This enumeration gives a bitset of modifier keys currently held down.
  */
 typedef enum {
   MODIFIER_NONE,
@@ -176,22 +185,26 @@ typedef void (*DestroyFunc) (DiaObject* obj);
 #define DIA_OBJECT(object) ((DiaObject *) object)
 
 typedef void (*DrawFunc) (DiaObject* obj, DiaRenderer* ddisp);
-typedef real (*DistanceFunc) (DiaObject* obj, Point* point);
+typedef double (*DistanceFunc) (DiaObject* obj, Point* point);
 typedef void (*SelectFunc) (DiaObject*   obj,
                            Point*    clicked_point,
                            DiaRenderer* interactive_renderer);
 typedef DiaObject* (*CopyFunc) (DiaObject* obj);
-typedef ObjectChange* (*MoveFunc) (DiaObject* obj, Point * pos);
-typedef ObjectChange* (*MoveHandleFunc) (DiaObject*          obj,
-                                        Handle*          handle,
-                                        Point*           pos,
-                                        ConnectionPoint* cp,
-                                        HandleMoveReason reason,
-                                        ModifierKeys     modifiers);
-typedef GtkWidget *(*GetPropertiesFunc) (DiaObject* obj, gboolean is_default);
-typedef ObjectChange *(*ApplyPropertiesDialogFunc) (DiaObject* obj, GtkWidget *widget);
-typedef ObjectChange *(*ApplyPropertiesListFunc) (DiaObject* obj, GPtrArray* props);
-typedef const PropDescription *(* DescribePropsFunc) (DiaObject *obj);
+typedef DiaObjectChange       *(*MoveFunc)                  (DiaObject        *obj,
+                                                             Point            *pos);
+typedef DiaObjectChange       *(*MoveHandleFunc)            (DiaObject        *obj,
+                                                             Handle           *handle,
+                                                             Point            *pos,
+                                                             ConnectionPoint  *cp,
+                                                             HandleMoveReason  reason,
+                                                             ModifierKeys      modifiers);
+typedef GtkWidget             *(*GetPropertiesFunc)         (DiaObject        *obj,
+                                                             gboolean          is_default);
+typedef DiaObjectChange       *(*ApplyPropertiesDialogFunc) (DiaObject        *obj,
+                                                             GtkWidget        *widget);
+typedef DiaObjectChange       *(*ApplyPropertiesListFunc)   (DiaObject        *obj,
+                                                             GPtrArray        *props);
+typedef const PropDescription *(*DescribePropsFunc)         (DiaObject        *obj);
 typedef void (* GetPropsFunc) (DiaObject *obj, GPtrArray *props);
 typedef void (* SetPropsFunc) (DiaObject *obj, GPtrArray *props);
 typedef DiaMenu *(*ObjectMenuFunc) (DiaObject* obj, Point *position);
@@ -214,9 +227,13 @@ void object_save(DiaObject *obj, ObjectNode obj_node, DiaContext *ctx);
 void object_load(DiaObject *obj, ObjectNode obj_node, DiaContext *ctx);
 
 GList *object_copy_list (GList *list_orig );
-ObjectChange* object_list_move_delta_r(GList *objects, Point *delta, gboolean affected);
-ObjectChange* object_list_move_delta(GList *objects, Point *delta);
-ObjectChange *object_substitute (DiaObject *obj, DiaObject *subst);
+DiaObjectChange *object_list_move_delta_r (GList     *objects,
+                                           Point     *delta,
+                                           gboolean   affected);
+DiaObjectChange *object_list_move_delta   (GList     *objects,
+                                           Point     *delta);
+DiaObjectChange *object_substitute        (DiaObject *obj,
+                                           DiaObject *subst);
 
 void destroy_object_list (GList *list_to_be_destroyed);
 void object_add_handle(DiaObject *obj, Handle *handle);
@@ -263,15 +280,15 @@ struct _ObjectOps {
 
   void                   (*draw)                         (DiaObject        *obj,
                                                           DiaRenderer      *ddisp);
-  real                   (*distance_from)                (DiaObject        *obj,
+  double                 (*distance_from)                (DiaObject        *obj,
                                                           Point            *point);
   void                   (*selectf)                      (DiaObject        *obj,
                                                           Point            *clicked_point,
                                                           DiaRenderer      *interactive_renderer);
   DiaObject             *(*copy)                         (DiaObject        *obj);
-  ObjectChange          *(*move)                         (DiaObject        *obj,
+  DiaObjectChange       *(*move)                         (DiaObject        *obj,
                                                           Point            *pos);
-  ObjectChange          *(*move_handle)                  (DiaObject        *obj,
+  DiaObjectChange       *(*move_handle)                  (DiaObject        *obj,
                                                           Handle           *handle,
                                                           Point            *pos,
                                                           ConnectionPoint  *cp,
@@ -279,7 +296,7 @@ struct _ObjectOps {
                                                           ModifierKeys      modifiers);
   GtkWidget             *(*get_properties)               (DiaObject        *obj,
                                                           gboolean          is_default);
-  ObjectChange          *(*apply_properties_from_dialog) (DiaObject        *obj,
+  DiaObjectChange       *(*apply_properties_from_dialog) (DiaObject        *obj,
                                                           GtkWidget        *widget);
   DiaMenu               *(*get_object_menu)              (DiaObject        *obj,
                                                           Point            *position);
@@ -292,7 +309,7 @@ struct _ObjectOps {
                                                           Text             *text,
                                                           TextEditState     state,
                                                           gchar            *textchange);
-  ObjectChange          *(*apply_properties_list)        (DiaObject        *obj,
+  DiaObjectChange       *(*apply_properties_list)        (DiaObject        *obj,
                                                           GPtrArray        *props);
   gboolean               (*transform)                    (DiaObject        *obj,
                                                           const DiaMatrix  *m);
@@ -358,15 +375,15 @@ struct _DiaObject {
   DiaObject *parent; /*!< Back-pointer to DiaObject which is parenting this object. Can be NULL */
   GList *children; /*!< In case this object is a parent of other object the children are listed here */
 
-  /** The area that contains all parts rendered interactively, so includes
-   *  handles, bezier controllers etc.  Despite historical difference, this
-   *  should not be accessed directly, but through dia_object_get_bounding_box().
-   *  Note that handles and connection points are not included by this, but
-   *  added by that which needs it.
-   *  Internal:  If this is set to a NULL, returns bounding_box.  That is for
-   *  those objects that don't actually calculate it, but can just use the BB.
-   *  Since handles and CPs are not in the BB, that will be the case for most
-   *  objects.
+  /* The area that contains all parts rendered interactively, so includes
+   * handles, bezier controllers etc.  Despite historical difference, this
+   * should not be accessed directly, but through dia_object_get_bounding_box().
+   * Note that handles and connection points are not included by this, but
+   * added by that which needs it.
+   * Internal:  If this is set to a NULL, returns bounding_box.  That is for
+   * those objects that don't actually calculate it, but can just use the BB.
+   * Since handles and CPs are not in the BB, that will be the case for most
+   * objects.
    */
   DiaRectangle     *enclosing_box;
   /*! Metainfo of the object, should not be manipulated directly. Use dia_object_set_meta() */
@@ -470,9 +487,9 @@ void                   dia_object_select              (DiaObject              *s
                                                        DiaRenderer            *renderer);
 // Note: wraps copy
 DiaObject             *dia_object_clone               (DiaObject              *self);
-ObjectChange          *dia_object_move                (DiaObject              *self,
+DiaObjectChange       *dia_object_move                (DiaObject              *self,
                                                        Point                  *to);
-ObjectChange          *dia_object_move_handle         (DiaObject              *self,
+DiaObjectChange       *dia_object_move_handle         (DiaObject              *self,
                                                        Handle                 *handle,
                                                        Point                  *to,
                                                        ConnectionPoint        *cp,
@@ -481,7 +498,7 @@ ObjectChange          *dia_object_move_handle         (DiaObject              *s
 // Note: Wraps get_properties
 GtkWidget             *dia_object_get_editor          (DiaObject              *self,
                                                        gboolean                is_default);
-ObjectChange          *dia_object_apply_editor        (DiaObject              *self,
+DiaObjectChange       *dia_object_apply_editor        (DiaObject              *self,
                                                        GtkWidget              *editor);
 DiaMenu               *dia_object_get_menu            (DiaObject              *self,
                                                        Point                  *at);
@@ -490,7 +507,7 @@ void                   dia_object_get_properties      (DiaObject              *s
                                                        GPtrArray              *list);
 void                   dia_object_set_properties      (DiaObject              *self,
                                                        GPtrArray              *list);
-ObjectChange          *dia_object_apply_properties    (DiaObject              *self,
+DiaObjectChange       *dia_object_apply_properties    (DiaObject              *self,
                                                        GPtrArray              *list);
 gboolean               dia_object_edit_text           (DiaObject              *self,
                                                        Text                   *text,
diff --git a/lib/orth_conn.c b/lib/orth_conn.c
index fbb437274..10be62ebb 100644
--- a/lib/orth_conn.c
+++ b/lib/orth_conn.c
@@ -30,21 +30,26 @@
 #include "handle.h"
 #include "diarenderer.h"
 #include "autoroute.h"
+#include "dia-object-change-legacy.h"
+
 
 static void place_handle_by_swapping(OrthConn *orth,
                                      int index, Handle *handle);
-static ObjectChange *orthconn_set_autorouting(OrthConn *orth, gboolean on);
+static DiaObjectChange *orthconn_set_autorouting (OrthConn *orth, gboolean on);
 
 enum change_type {
   TYPE_ADD_SEGMENT,
   TYPE_REMOVE_SEGMENT
 };
 
-static ObjectChange *
-midsegment_create_change(OrthConn *orth, enum change_type type,
-                        int segment,
-                        Point *point1, Point *point2,
-                        Handle *handle1, Handle *handle2);
+static DiaObjectChange *
+midsegment_create_change (OrthConn         *orth,
+                          enum change_type  type,
+                          int               segment,
+                          Point            *point1,
+                          Point            *point2,
+                          Handle           *handle1,
+                          Handle           *handle2);
 
 struct MidSegmentChange {
   ObjectChange obj_change;
@@ -64,13 +69,17 @@ struct MidSegmentChange {
   Handle *handles[2]; /* These handles cannot be connected */
   /* NewOrthConn additions */
   ConnectionPoint *conn; /* ? */
-  ObjectChange *cplchange[2];
+  DiaObjectChange *cplchange[2];
 };
 
-static ObjectChange *
-endsegment_create_change(OrthConn *orth, enum change_type type,
-                        int segment, Point *point,
-                        Handle *handle);
+
+static DiaObjectChange *
+endsegment_create_change (OrthConn         *orth,
+                          enum change_type  type,
+                          int               segment,
+                          Point            *point,
+                          Handle           *handle);
+
 static void
 place_handle_by_swapping(OrthConn *orth, int index, Handle *handle);
 
@@ -97,11 +106,10 @@ struct EndSegmentChange {
   ConnectionPoint *cp; /* NULL in add segment and if not connected in
                          remove segment */
   /* NewOrthConn additions */
-  ObjectChange *cplchange;
+  DiaObjectChange *cplchange;
 };
 
-static ObjectChange*
-autoroute_create_change(OrthConn *orth, gboolean on);
+static DiaObjectChange *autoroute_create_change (OrthConn *orth, gboolean on);
 
 struct AutorouteChange {
   ObjectChange obj_change;
@@ -167,7 +175,7 @@ static int get_segment_nr(OrthConn *orth, Point *point, real max_dist)
 }
 
 
-ObjectChange *
+DiaObjectChange *
 orthconn_move_handle (OrthConn         *orth,
                       Handle           *handle,
                       Point            *to,
@@ -178,7 +186,7 @@ orthconn_move_handle (OrthConn         *orth,
   int n;
   int handle_nr;
   DiaObject *obj = (DiaObject *) orth;
-  ObjectChange *change = NULL;
+  DiaObjectChange *change = NULL;
 
   switch (handle->id) {
     case HANDLE_MOVE_STARTPOINT:
@@ -261,7 +269,7 @@ orthconn_move_handle (OrthConn         *orth,
 }
 
 
-ObjectChange *
+DiaObjectChange *
 orthconn_move (OrthConn *orth, Point *to)
 {
   Point p;
@@ -279,11 +287,11 @@ orthconn_move (OrthConn *orth, Point *to)
 }
 
 
-real
-orthconn_distance_from (OrthConn *orth, Point *point, real line_width)
+double
+orthconn_distance_from (OrthConn *orth, Point *point, double line_width)
 {
   int i;
-  real dist;
+  double dist;
 
   dist = distance_line_point (&orth->points[0], &orth->points[1],
                               line_width, point);
@@ -760,92 +768,110 @@ orthconn_get_middle_handle( OrthConn *orth )
   return orth->handles[ n/2 ] ;
 }
 
-ObjectChange *
+
+DiaObjectChange *
 orthconn_delete_segment(OrthConn *orth, Point *clickedpoint)
 {
   int segment;
-  ObjectChange *change = NULL;
+  DiaObjectChange *change = NULL;
 
-  if (!orthconn_can_delete_segment(orth, clickedpoint))
+  if (!orthconn_can_delete_segment (orth, clickedpoint)) {
     return NULL;
+  }
 
   segment = get_segment_nr(orth, clickedpoint, 1.0);
   if (segment < 0)
     return NULL;
 
   if (segment==0) {
-    change = endsegment_create_change(orth, TYPE_REMOVE_SEGMENT, segment,
-                                     &orth->points[segment],
-                                     orth->handles[segment]);
+    change = endsegment_create_change (orth,
+                                       TYPE_REMOVE_SEGMENT,
+                                       segment,
+                                       &orth->points[segment],
+                                       orth->handles[segment]);
   } else if (segment == orth->numpoints-2) {
-    change = endsegment_create_change(orth, TYPE_REMOVE_SEGMENT, segment,
-                                     &orth->points[segment+1],
-                                     orth->handles[segment]);
+    change = endsegment_create_change (orth,
+                                       TYPE_REMOVE_SEGMENT,
+                                       segment,
+                                       &orth->points[segment + 1],
+                                       orth->handles[segment]);
   } else if (segment > 0) {
     /* Don't delete the last midpoint segment.
      * That would delete also the endpoint segment after it.
      */
-    if (segment == orth->numpoints-3)
+    if (segment == orth->numpoints-3) {
       segment--;
+    }
 
-    change = midsegment_create_change(orth, TYPE_REMOVE_SEGMENT, segment,
-                                     &orth->points[segment],
-                                     &orth->points[segment+1],
-                                     orth->handles[segment],
-                                     orth->handles[segment+1]);
+    change = midsegment_create_change (orth,
+                                       TYPE_REMOVE_SEGMENT,
+                                       segment,
+                                       &orth->points[segment],
+                                       &orth->points[segment + 1],
+                                       orth->handles[segment],
+                                       orth->handles[segment + 1]);
   }
 
-  change->apply(change, (DiaObject *)orth);
+  dia_object_change_apply (change, DIA_OBJECT (orth));
 
   return change;
 }
 
-ObjectChange *
-orthconn_add_segment(OrthConn *orth, Point *clickedpoint)
+
+DiaObjectChange *
+orthconn_add_segment (OrthConn *orth, Point *clickedpoint)
 {
   Handle *handle1, *handle2;
-  ObjectChange *change = NULL;
+  DiaObjectChange *change = NULL;
   int segment;
   Point newpoint;
 
-  if (!orthconn_can_add_segment(orth, clickedpoint))
+  if (!orthconn_can_add_segment (orth, clickedpoint)) {
     return NULL;
+  }
 
-  segment = get_segment_nr(orth, clickedpoint, 1.0);
-  if (segment < 0)
+  segment = get_segment_nr (orth, clickedpoint, 1.0);
+  if (segment < 0) {
     return NULL;
+  }
 
   if (segment==0) { /* First segment */
-    handle1 = g_new(Handle, 1);
-    setup_endpoint_handle(handle1, HANDLE_MOVE_STARTPOINT);
-    change = endsegment_create_change(orth, TYPE_ADD_SEGMENT,
-                                     0, &orth->points[0],
-                                     handle1);
+    handle1 = g_new0 (Handle, 1);
+    setup_endpoint_handle (handle1, HANDLE_MOVE_STARTPOINT);
+    change = endsegment_create_change (orth,
+                                       TYPE_ADD_SEGMENT,
+                                       0,
+                                       &orth->points[0],
+                                       handle1);
   } else if (segment == orth->numpoints-2) { /* Last segment */
-    handle1 = g_new(Handle, 1);
-    setup_endpoint_handle(handle1, HANDLE_MOVE_ENDPOINT);
-    change = endsegment_create_change(orth, TYPE_ADD_SEGMENT,
-                                     segment+1, &orth->points[segment+1],
-                                     handle1);
+    handle1 = g_new0 (Handle, 1);
+    setup_endpoint_handle (handle1, HANDLE_MOVE_ENDPOINT);
+    change = endsegment_create_change (orth,
+                                       TYPE_ADD_SEGMENT,
+                                       segment + 1,
+                                       &orth->points[segment + 1],
+                                       handle1);
   } else if (segment > 0) {
-    handle1 = g_new(Handle, 1);
-    setup_midpoint_handle(handle1);
-    handle2 = g_new(Handle, 1);
-    setup_midpoint_handle(handle2);
+    handle1 = g_new (Handle, 1);
+    setup_midpoint_handle (handle1);
+    handle2 = g_new (Handle, 1);
+    setup_midpoint_handle (handle2);
     newpoint = *clickedpoint;
     if (orth->orientation[segment]==HORIZONTAL)
       newpoint.y = orth->points[segment].y;
     else
       newpoint.x = orth->points[segment].x;
 
-    change = midsegment_create_change(orth, TYPE_ADD_SEGMENT, segment,
-                                     &newpoint,
-                                     &newpoint,
-                                     handle1,
-                                     handle2);
+    change = midsegment_create_change (orth,
+                                       TYPE_ADD_SEGMENT,
+                                       segment,
+                                       &newpoint,
+                                       &newpoint,
+                                       handle1,
+                                       handle2);
   }
 
-  change->apply(change, (DiaObject *)orth);
+  dia_object_change_apply (change, DIA_OBJECT (orth));
 
   return change;
 }
@@ -854,17 +880,19 @@ orthconn_add_segment(OrthConn *orth, Point *clickedpoint)
 /* Set autorouting on or off.  If setting on, try to autoroute and
  * return the changes from that.
  */
-static ObjectChange *
-orthconn_set_autorouting(OrthConn *conn, gboolean on)
+static DiaObjectChange *
+orthconn_set_autorouting (OrthConn *conn, gboolean on)
 {
-  DiaObject *obj = (DiaObject *)conn;
-  ObjectChange *change;
+  DiaObject *obj = DIA_OBJECT (conn);
+  DiaObjectChange *change;
+
+  change = autoroute_create_change (conn, on);
+  dia_object_change_apply (change, obj);
 
-  change = autoroute_create_change(conn, on);
-  change->apply(change, obj);
   return change;
 }
 
+
 static void
 delete_point(OrthConn *orth, int pos)
 {
@@ -953,12 +981,8 @@ endsegment_change_free (struct EndSegmentChange *change)
        (change->type==TYPE_REMOVE_SEGMENT && change->applied) ){
     g_clear_pointer (&change->handle, g_free);
   }
-  if (change->cplchange) {
-    if (change->cplchange->free) {
-      change->cplchange->free (change->cplchange);
-    }
-    g_clear_pointer (&change->cplchange, g_free);
-  }
+
+  g_clear_pointer (&change->cplchange, dia_object_change_unref);
 }
 
 
@@ -1021,7 +1045,7 @@ endsegment_change_revert (struct EndSegmentChange *change, DiaObject *obj)
 {
   OrthConn *orth = (OrthConn *) obj;
 
-  change->cplchange->revert (change->cplchange, obj);
+  dia_object_change_revert (change->cplchange, obj);
 
   switch (change->type) {
     case TYPE_ADD_SEGMENT:
@@ -1068,14 +1092,16 @@ endsegment_change_revert (struct EndSegmentChange *change, DiaObject *obj)
 }
 
 
-static ObjectChange *
-endsegment_create_change(OrthConn *orth, enum change_type type,
-                        int segment, Point *point,
-                        Handle *handle)
+static DiaObjectChange *
+endsegment_create_change (OrthConn         *orth,
+                          enum change_type  type,
+                          int               segment,
+                          Point            *point,
+                          Handle           *handle)
 {
   struct EndSegmentChange *change;
 
-  change = g_new(struct EndSegmentChange, 1);
+  change = g_new0 (struct EndSegmentChange, 1);
 
   change->obj_change.apply = (ObjectChangeApplyFunc) endsegment_change_apply;
   change->obj_change.revert = (ObjectChangeRevertFunc) endsegment_change_revert;
@@ -1092,7 +1118,7 @@ endsegment_create_change(OrthConn *orth, enum change_type type,
     change->old_end_handle = orth->handles[orth->numpoints-2];
   change->cp = change->old_end_handle->connected_to;
 
-  return (ObjectChange *)change;
+  return dia_object_change_legacy_new ((ObjectChange *) change);
 }
 
 
@@ -1105,17 +1131,8 @@ midsegment_change_free(struct MidSegmentChange *change)
     g_clear_pointer (&change->handles[1], g_free);
   }
 
-  if (change->cplchange[0]) {
-    if (change->cplchange[0]->free)
-      change->cplchange[0]->free(change->cplchange[0]);
-    g_clear_pointer (&change->cplchange[0], g_free);
-  }
-
-  if (change->cplchange[1]) {
-    if (change->cplchange[1]->free)
-      change->cplchange[1]->free(change->cplchange[1]);
-    g_clear_pointer (&change->cplchange[1], g_free);
-  }
+  g_clear_pointer (&change->cplchange[0], dia_object_change_unref);
+  g_clear_pointer (&change->cplchange[1], dia_object_change_unref);
 }
 
 
@@ -1170,8 +1187,8 @@ midsegment_change_revert (struct MidSegmentChange *change, DiaObject *obj)
 {
   OrthConn *orth = (OrthConn *)obj;
 
-  change->cplchange[0]->revert (change->cplchange[0], obj);
-  change->cplchange[1]->revert (change->cplchange[1], obj);
+  dia_object_change_revert (change->cplchange[0], obj);
+  dia_object_change_revert (change->cplchange[1], obj);
 
   switch (change->type) {
     case TYPE_ADD_SEGMENT:
@@ -1200,15 +1217,18 @@ midsegment_change_revert (struct MidSegmentChange *change, DiaObject *obj)
 }
 
 
-static ObjectChange *
-midsegment_create_change(OrthConn *orth, enum change_type type,
-                        int segment,
-                        Point *point1, Point *point2,
-                        Handle *handle1, Handle *handle2)
+static DiaObjectChange *
+midsegment_create_change (OrthConn         *orth,
+                          enum change_type  type,
+                          int               segment,
+                          Point            *point1,
+                          Point            *point2,
+                          Handle           *handle1,
+                          Handle           *handle2)
 {
   struct MidSegmentChange *change;
 
-  change = g_new(struct MidSegmentChange, 1);
+  change = g_new0 (struct MidSegmentChange, 1);
 
   change->obj_change.apply = (ObjectChangeApplyFunc) midsegment_change_apply;
   change->obj_change.revert = (ObjectChangeRevertFunc) midsegment_change_revert;
@@ -1222,7 +1242,7 @@ midsegment_create_change(OrthConn *orth, enum change_type type,
   change->handles[0] = handle1;
   change->handles[1] = handle2;
 
-  return (ObjectChange *)change;
+  return dia_object_change_legacy_new ((ObjectChange *) change);
 }
 
 static void
@@ -1262,8 +1282,9 @@ autoroute_change_revert(struct AutorouteChange *change, DiaObject *obj)
   }
 }
 
-static ObjectChange *
-autoroute_create_change(OrthConn *orth, gboolean on)
+
+static DiaObjectChange *
+autoroute_create_change (OrthConn *orth, gboolean on)
 {
   struct AutorouteChange *change;
   int i;
@@ -1280,22 +1301,27 @@ autoroute_create_change(OrthConn *orth, gboolean on)
   for (i = 0; i < orth->numpoints; i++)
     change->points[i] = orth->points[i];
 
-  return (ObjectChange *)change;
+  return dia_object_change_legacy_new ((ObjectChange *) change);
 }
 
-ObjectChange *
-orthconn_toggle_autorouting_callback(DiaObject *obj, Point *clicked, gpointer data)
+
+DiaObjectChange *
+orthconn_toggle_autorouting_callback (DiaObject *obj,
+                                      Point     *clicked,
+                                      gpointer   data)
 {
-  ObjectChange *change;
+  DiaObjectChange *change;
   /* This is kinda hackish.  Since we can't see the menu item, we have to
    * assume that we're right about toggling and just send !orth->autorouting.
    */
-  change = orthconn_set_autorouting((OrthConn*)obj,
-                                   !((OrthConn*)obj)->autorouting);
-  orthconn_update_data((OrthConn *)obj);
+  change = orthconn_set_autorouting ((OrthConn*) obj,
+                                     !((OrthConn*) obj)->autorouting);
+  orthconn_update_data ((OrthConn *) obj);
+
   return change;
 }
 
+
 void
 orthconn_update_object_menu(OrthConn *orth, Point *clicked,
                            DiaMenuItem *object_menu_items)
diff --git a/lib/orth_conn.h b/lib/orth_conn.h
index b901197f2..39ebf1b45 100644
--- a/lib/orth_conn.h
+++ b/lib/orth_conn.h
@@ -1,4 +1,4 @@
-/* Dia -- an diagram creation/manipulation program -*- c -*- 
+/* Dia -- an diagram creation/manipulation program -*- c -*-
  * Copyright (C) 1998 Alexander Larsson
  *
  * This program is free software; you can redistribute it and/or modify
@@ -15,14 +15,16 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  */
-#ifndef ORTH_CONN_H
-#define ORTH_CONN_H
+
+#pragma once
 
 #include "diatypes.h"
 #include "object.h"
 #include "connpoint_line.h"
 #include "boundingbox.h"
 
+G_BEGIN_DECLS
+
 typedef enum {
   HORIZONTAL,
   VERTICAL
@@ -32,17 +34,16 @@ typedef enum {
 
 #define HANDLE_MIDPOINT (HANDLE_CUSTOM1)
 
-/*!
- * \brief Helper for orthogonal connection implementations
+/**
+ * OrthConn:
+ *
+ * Helper for orthogonal connection implementations
  *
  * This is a subclass of DiaObject used to help implementing objects
  * that connect points with orthogonal line-segments.
- *
- * \extends _DiaObject
  */
 struct _OrthConn {
-  /* DiaObject must be first because this is a 'subclass' of it. */
-  DiaObject object; /*!< inheritance */
+  DiaObject object;
 
   int numpoints; /* >= 3 */
   Point *points; /* [numpoints] */
@@ -63,32 +64,51 @@ struct _OrthConn {
   gboolean autorouting; /* True if this line is autorouted. */
 };
 
-void orthconn_update_data(OrthConn *orth);
-void orthconn_update_boundingbox(OrthConn *orth);
-void orthconn_init(OrthConn *orth, Point *startpoint);
-void orthconn_destroy(OrthConn *orth);
-void orthconn_set_points(OrthConn *orth, int num_points, Point *points);
-void orthconn_copy(OrthConn *from, OrthConn *to);
-void orthconn_save(OrthConn *orth, ObjectNode obj_node, DiaContext *ctx);
-void orthconn_load(OrthConn *orth, ObjectNode obj_node, DiaContext *ctx);  /* NOTE: Does object_init() */
-ObjectChange* orthconn_move_handle(OrthConn *orth, Handle *id,
-                                  Point *to, ConnectionPoint *cp,
-                                  HandleMoveReason reason,
-                                  ModifierKeys modifiers);
-ObjectChange* orthconn_move(OrthConn *orth, Point *to);
-real orthconn_distance_from(OrthConn *orth, Point *point,
-                           real line_width);
-Handle* orthconn_get_middle_handle(OrthConn *orth);
-
-int orthconn_can_delete_segment(OrthConn *orth, Point *clickedpoint);
-int orthconn_can_add_segment(OrthConn *orth, Point *clickedpoint);
-ObjectChange *orthconn_delete_segment(OrthConn *orth, Point *clickedpoint);
-ObjectChange *orthconn_add_segment(OrthConn *orth, Point *clickedpoint);
-ObjectChange *orthconn_toggle_autorouting_callback(DiaObject *orth,
-                                                  Point *clicked,
-                                                  gpointer data);
-void orthconn_update_object_menu(OrthConn *orth, Point *clicked,
-                                DiaMenuItem *object_menu_items);
+
+void             orthconn_update_data                 (OrthConn         *orth);
+void             orthconn_update_boundingbox          (OrthConn         *orth);
+void             orthconn_init                        (OrthConn         *orth,
+                                                       Point            *startpoint);
+void             orthconn_destroy                     (OrthConn         *orth);
+void             orthconn_set_points                  (OrthConn         *orth,
+                                                       int               num_points,
+                                                       Point            *points);
+void             orthconn_copy                        (OrthConn         *from,
+                                                       OrthConn         *to);
+void             orthconn_save                        (OrthConn         *orth,
+                                                       ObjectNode        obj_node,
+                                                       DiaContext       *ctx);
+/* NOTE: Does object_init() */
+void             orthconn_load                        (OrthConn         *orth,
+                                                       ObjectNode        obj_node,
+                                                       DiaContext       *ctx);
+DiaObjectChange *orthconn_move_handle                 (OrthConn         *orth,
+                                                       Handle           *id,
+                                                       Point            *to,
+                                                       ConnectionPoint  *cp,
+                                                       HandleMoveReason  reason,
+                                                       ModifierKeys      modifiers);
+DiaObjectChange *orthconn_move                        (OrthConn         *orth,
+                                                       Point            *to);
+double           orthconn_distance_from               (OrthConn         *orth,
+                                                       Point            *point,
+                                                       double            line_width);
+Handle          *orthconn_get_middle_handle           (OrthConn         *orth);
+int              orthconn_can_delete_segment          (OrthConn         *orth,
+                                                       Point            *clickedpoint);
+int              orthconn_can_add_segment             (OrthConn         *orth,
+                                                       Point            *clickedpoint);
+DiaObjectChange *orthconn_delete_segment              (OrthConn         *orth,
+                                                       Point            *clickedpoint);
+DiaObjectChange *orthconn_add_segment                 (OrthConn         *orth,
+                                                       Point            *clickedpoint);
+DiaObjectChange *orthconn_toggle_autorouting_callback (DiaObject        *orth,
+                                                       Point            *clicked,
+                                                       gpointer          data);
+void             orthconn_update_object_menu          (OrthConn         *orth,
+                                                       Point            *clicked,
+                                                       DiaMenuItem      *object_menu_items);
+
 /* base property stuff... */
 #define ORTHCONN_COMMON_PROPERTIES \
   OBJECT_COMMON_PROPERTIES, \
@@ -108,6 +128,4 @@ void orthconn_update_object_menu(OrthConn *orth, Point *clicked,
   { N_("Autorouting"), orthconn_toggle_autorouting_callback, NULL, \
     DIAMENU_ACTIVE|DIAMENU_TOGGLE}
 
-#endif /* ORTH_CONN_H */
-
-
+G_END_DECLS
diff --git a/lib/parent.c b/lib/parent.c
index 517364f86..a4c5f62d0 100644
--- a/lib/parent.c
+++ b/lib/parent.c
@@ -49,17 +49,21 @@ gboolean parent_list_expand(GList *obj_list)
   return nothing_affected;
 }
 
+
 /**
+ * parent_list_affected_hierarchy:
+ * obj_list: the #DiaObject list
+ *
  * Returns the original list minus any items that appear as children
- * (at any depth) of the objects in the original list.  This is very
+ * (at any depth) of the objects in the original list. This is very
  * different from the parent_list_affected function, which returns a
  * list of ALL objects affected.
-
+ *
  * The caller must call g_list_free() on the returned list
  * when the list is no longer needed.
  */
-
-GList *parent_list_affected_hierarchy(GList *obj_list)
+GList *
+parent_list_affected_hierarchy (GList *obj_list)
 {
   GHashTable *object_hash = g_hash_table_new(g_direct_hash, g_direct_equal);
   GList *all_list = g_list_copy(obj_list);
@@ -283,18 +287,22 @@ parent_handle_extents (DiaObject *obj, DiaRectangle *extents)
   }
 }
 
-/** Apply a function to all children of the given object (recursively,
+
+/**
+ * parent_apply_to_children:
+ * @obj: A parent object.
+ * @function: A function that takes a single DiaObject as an argument.
+ *
+ * Apply a function to all children of the given object (recursively,
  * depth-first).
- * @param obj A parent object.
- * @param function A function that takes a single DiaObject as an argument.
  */
 void
-parent_apply_to_children(DiaObject *obj, DiaObjectFunc function)
+parent_apply_to_children (DiaObject *obj, DiaObjectFunc function)
 {
   GList *children;
-  for (children = obj->children; children != NULL; children = g_list_next(children)) {
+  for (children = obj->children; children != NULL; children = g_list_next (children)) {
     DiaObject *child = children->data;
-    (*function)(child);
-    parent_apply_to_children(child, function);
+    (*function) (child);
+    parent_apply_to_children (child, function);
   }
 }
diff --git a/lib/poly_conn.c b/lib/poly_conn.c
index e681351b3..c1573dae2 100644
--- a/lib/poly_conn.c
+++ b/lib/poly_conn.c
@@ -26,6 +26,7 @@
 
 #include "poly_conn.h"
 #include "diarenderer.h"
+#include "dia-object-change-legacy.h"
 
 
 enum change_type {
@@ -49,10 +50,12 @@ struct PointChange {
 };
 
 
-static ObjectChange *
-polyconn_create_change(PolyConn *poly, enum change_type type,
-                      Point *point, int segment, Handle *handle,
-                      ConnectionPoint *connected_to);
+static DiaObjectChange *polyconn_create_change (PolyConn         *poly,
+                                                enum change_type  type,
+                                                Point            *point,
+                                                int               segment,
+                                                Handle           *handle,
+                                                ConnectionPoint  *connected_to);
 
 typedef enum
 {
@@ -84,7 +87,7 @@ static int get_handle_nr(PolyConn *poly, Handle *handle)
 }
 
 
-ObjectChange *
+DiaObjectChange *
 polyconn_move_handle (PolyConn         *poly,
                       Handle           *handle,
                       Point            *to,
@@ -130,8 +133,8 @@ polyconn_move_handle (PolyConn         *poly,
 }
 
 
-ObjectChange*
-polyconn_move(PolyConn *poly, Point *to)
+DiaObjectChange *
+polyconn_move (PolyConn *poly, Point *to)
 {
   Point p;
   int i;
@@ -263,8 +266,8 @@ remove_handle(PolyConn *poly, int pos)
 
 /* Add a point by splitting segment into two, putting the new point at
  'point' or, if NULL, in the middle */
-ObjectChange *
-polyconn_add_point(PolyConn *poly, int segment, Point *point)
+DiaObjectChange *
+polyconn_add_point (PolyConn *poly, int segment, Point *point)
 {
   Point realpoint;
   Handle *new_handle;
@@ -284,8 +287,9 @@ polyconn_add_point(PolyConn *poly, int segment, Point *point)
                                NULL);
 }
 
-ObjectChange *
-polyconn_remove_point(PolyConn *poly, int pos)
+
+DiaObjectChange *
+polyconn_remove_point (PolyConn *poly, int pos)
 {
   Handle *old_handle;
   ConnectionPoint *connectionpoint;
@@ -557,7 +561,7 @@ polyconn_change_revert (struct PointChange *change, DiaObject *obj)
 }
 
 
-static ObjectChange *
+static DiaObjectChange *
 polyconn_create_change (PolyConn         *poly,
                         enum change_type  type,
                         Point            *point,
@@ -580,5 +584,5 @@ polyconn_create_change (PolyConn         *poly,
   change->handle = handle;
   change->connected_to = connected_to;
 
-  return (ObjectChange *) change;
+  return dia_object_change_legacy_new ((ObjectChange *) change);
 }
diff --git a/lib/poly_conn.h b/lib/poly_conn.h
index 86c7981d9..40f3bc587 100644
--- a/lib/poly_conn.h
+++ b/lib/poly_conn.h
@@ -26,7 +26,7 @@
 
 /*!
  * \brief helper for implementing polyline connections
- * 
+ *
  * This is a subclass of DiaObject used to help implementing objects
  * that connect points with polygonal line-segments.
  *
@@ -51,13 +51,19 @@ void polyconn_destroy(PolyConn *poly);
 void polyconn_copy(PolyConn *from, PolyConn *to);
 void polyconn_save(PolyConn *poly, ObjectNode obj_node, DiaContext *ctx);
 void polyconn_load(PolyConn *poly, ObjectNode obj_node, DiaContext *ctx);  /* NOTE: Does object_init() */
-ObjectChange *polyconn_add_point(PolyConn *poly, int segment, Point *point);
-ObjectChange *polyconn_remove_point(PolyConn *poly, int point);
-ObjectChange *polyconn_move_handle(PolyConn *poly, Handle *id,
-                                  Point *to, ConnectionPoint *cp,
-                                  HandleMoveReason reason,
-                                  ModifierKeys modifiers);
-ObjectChange *polyconn_move(PolyConn *poly, Point *to);
+DiaObjectChange *polyconn_add_point       (PolyConn         *poly,
+                                           int               segment,
+                                           Point            *point);
+DiaObjectChange *polyconn_remove_point    (PolyConn         *poly,
+                                           int               point);
+DiaObjectChange *polyconn_move_handle     (PolyConn         *poly,
+                                           Handle           *id,
+                                           Point            *to,
+                                           ConnectionPoint  *cp,
+                                           HandleMoveReason  reason,
+                                           ModifierKeys      modifiers);
+DiaObjectChange *polyconn_move            (PolyConn         *poly,
+                                           Point            *to);
 real polyconn_distance_from(PolyConn *poly, Point *point,
                            real line_width);
 Handle *polyconn_closest_handle(PolyConn *poly, Point *point);
diff --git a/lib/polyshape.c b/lib/polyshape.c
index 2a2278a48..6b3460d68 100644
--- a/lib/polyshape.c
+++ b/lib/polyshape.c
@@ -27,6 +27,8 @@
 #include "polyshape.h"
 #include "message.h"
 #include "diarenderer.h"
+#include "dia-object-change-legacy.h"
+
 
 #define NUM_CONNECTIONS(poly) ((poly)->numpoints * 2 + 1)
 
@@ -49,12 +51,18 @@ struct PointChange {
   ConnectionPoint *cp1, *cp2;
 };
 
-static ObjectChange *
-polyshape_create_change(PolyShape *poly, enum change_type type,
-                      Point *point, int segment, Handle *handle,
-                      ConnectionPoint *cp1, ConnectionPoint *cp2);
 
-static void setup_handle(Handle *handle)
+static DiaObjectChange *polyshape_create_change (PolyShape        *poly,
+                                                 enum change_type  type,
+                                                 Point            *point,
+                                                 int               segment,
+                                                 Handle           *handle,
+                                                 ConnectionPoint  *cp1,
+                                                 ConnectionPoint  *cp2);
+
+
+static void
+setup_handle (Handle *handle)
 {
   handle->id = HANDLE_CORNER;
   handle->type = HANDLE_MAJOR_CONTROL;
@@ -73,10 +81,14 @@ static int get_handle_nr(PolyShape *poly, Handle *handle)
   return -1;
 }
 
-ObjectChange*
-polyshape_move_handle(PolyShape *poly, Handle *handle,
-                     Point *to, ConnectionPoint *cp,
-                     HandleMoveReason reason, ModifierKeys modifiers)
+
+DiaObjectChange *
+polyshape_move_handle (PolyShape        *poly,
+                       Handle           *handle,
+                       Point            *to,
+                       ConnectionPoint  *cp,
+                       HandleMoveReason  reason,
+                       ModifierKeys      modifiers)
 {
   int handle_nr;
 
@@ -86,8 +98,9 @@ polyshape_move_handle(PolyShape *poly, Handle *handle,
   return NULL;
 }
 
-ObjectChange*
-polyshape_move(PolyShape *poly, Point *to)
+
+DiaObjectChange *
+polyshape_move (PolyShape *poly, Point *to)
 {
   Point p;
   int i;
@@ -199,8 +212,8 @@ remove_handle(PolyShape *poly, int pos)
 
 /* Add a point by splitting segment into two, putting the new point at
  'point' or, if NULL, in the middle */
-ObjectChange *
-polyshape_add_point(PolyShape *poly, int segment, Point *point)
+DiaObjectChange *
+polyshape_add_point (PolyShape *poly, int segment, Point *point)
 {
   Point realpoint;
   Handle *new_handle;
@@ -225,8 +238,9 @@ polyshape_add_point(PolyShape *poly, int segment, Point *point)
                                new_cp1, new_cp2);
 }
 
-ObjectChange *
-polyshape_remove_point(PolyShape *poly, int pos)
+
+DiaObjectChange *
+polyshape_remove_point (PolyShape *poly, int pos)
 {
   Handle *old_handle;
   ConnectionPoint *old_cp1, *old_cp2;
@@ -599,7 +613,7 @@ polyshape_change_revert (struct PointChange *change, DiaObject *obj)
 }
 
 
-static ObjectChange *
+static DiaObjectChange *
 polyshape_create_change (PolyShape        *poly,
                          enum change_type  type,
                          Point            *point,
@@ -624,5 +638,5 @@ polyshape_create_change (PolyShape        *poly,
   change->cp1 = cp1;
   change->cp2 = cp2;
 
-  return (ObjectChange *) change;
+  return dia_object_change_legacy_new ((ObjectChange *) change);
 }
diff --git a/lib/polyshape.h b/lib/polyshape.h
index 395800c4b..7d3e91a4e 100644
--- a/lib/polyshape.h
+++ b/lib/polyshape.h
@@ -50,13 +50,19 @@ void polyshape_destroy(PolyShape *poly);
 void polyshape_copy(PolyShape *from, PolyShape *to);
 void polyshape_save(PolyShape *poly, ObjectNode obj_node, DiaContext *ctx);
 void polyshape_load(PolyShape *poly, ObjectNode obj_node, DiaContext *ctx);  /* NOTE: Does object_init() */
-ObjectChange *polyshape_add_point(PolyShape *poly, int segment, Point *point);
-ObjectChange *polyshape_remove_point(PolyShape *poly, int point);
-ObjectChange *polyshape_move_handle(PolyShape *poly, Handle *id,
-                                   Point *to, ConnectionPoint *cp,
-                                   HandleMoveReason reason,
-                                   ModifierKeys modifiers);
-ObjectChange *polyshape_move(PolyShape *poly, Point *to);
+DiaObjectChange *polyshape_add_point        (PolyShape        *poly,
+                                             int               segment,
+                                             Point            *point);
+DiaObjectChange *polyshape_remove_point     (PolyShape        *poly,
+                                             int               point);
+DiaObjectChange *polyshape_move_handle      (PolyShape        *poly,
+                                             Handle           *id,
+                                             Point            *to,
+                                             ConnectionPoint  *cp,
+                                             HandleMoveReason  reason,
+                                             ModifierKeys      modifiers);
+DiaObjectChange *polyshape_move             (PolyShape        *poly,
+                                             Point            *to);
 real polyshape_distance_from(PolyShape *poly, Point *point,
                             real line_width);
 Handle *polyshape_closest_handle(PolyShape *poly, Point *point);
diff --git a/lib/properties.h b/lib/properties.h
index d311bfc3a..f2dac2cdc 100644
--- a/lib/properties.h
+++ b/lib/properties.h
@@ -49,6 +49,8 @@
 #include "intl.h"
 #include "textattr.h"
 #include "diacontext.h"
+#include "dia-object-change.h"
+
 
 G_BEGIN_DECLS
 
@@ -523,8 +525,11 @@ gboolean object_set_props_from_offsets(DiaObject *obj, PropOffset *offsets,
                                       GPtrArray *props);
 
 /* apply some properties and return a corresponding object change */
-ObjectChange *object_apply_props(DiaObject *obj, GPtrArray *props);
-ObjectChange *object_toggle_prop (DiaObject *obj, const char *pname, gboolean val);
+DiaObjectChange *object_apply_props (DiaObject  *obj,
+                                     GPtrArray  *props);
+DiaObjectChange *object_toggle_prop (DiaObject  *obj,
+                                     const char *pname,
+                                     gboolean    val);
 
 /*!
  * \brief Creation of object specific property dialog
@@ -535,7 +540,7 @@ ObjectChange *object_toggle_prop (DiaObject *obj, const char *pname, gboolean va
  */
 WIDGET *object_create_props_dialog     (DiaObject *obj, gboolean is_default);
 WIDGET *object_list_create_props_dialog(GList *obj, gboolean is_default);
-ObjectChange *object_apply_props_from_dialog (DiaObject *obj, WIDGET *dialog);
+DiaObjectChange *object_apply_props_from_dialog (DiaObject *obj, WIDGET *dialog);
 /*!
  * \brief Descibe objects properties
  * \memberof DiaObject
@@ -559,11 +564,15 @@ void object_get_props(DiaObject *obj, GPtrArray *props);
 Property *object_prop_by_name(DiaObject *obj, const char *name);
 Property *object_prop_by_name_type(DiaObject *obj, const char *name, const char *type);
 /* Set the pixbuf property if there is one */
-ObjectChange *dia_object_set_pixbuf (DiaObject *object, GdkPixbuf *pixbuf);
+DiaObjectChange *dia_object_set_pixbuf  (DiaObject  *object,
+                                         GdkPixbuf  *pixbuf);
 /* Set the pattern property if there is one */
-ObjectChange *dia_object_set_pattern (DiaObject *object, DiaPattern *pat);
+DiaObjectChange *dia_object_set_pattern (DiaObject  *object,
+                                         DiaPattern *pat);
 /* Set the string property if there is one */
-ObjectChange *dia_object_set_string (DiaObject *object, const char *name, const char *value);
+DiaObjectChange *dia_object_set_string  (DiaObject  *object,
+                                         const char *name,
+                                         const char *value);
 
 /* ************************************************************* */
 
diff --git a/lib/propobject.c b/lib/propobject.c
index a38f1073a..9882cc5c6 100644
--- a/lib/propobject.c
+++ b/lib/propobject.c
@@ -35,12 +35,16 @@
 #include "properties.h"
 #include "propinternals.h"
 #include "object.h"
+#include "dia-object-change-legacy.h"
+#include "dia-object-change-list.h"
+
 
 const PropDescription *
-object_get_prop_descriptions (const DiaObject *obj) {
+object_get_prop_descriptions (const DiaObject *obj)
+{
   const PropDescription *pdesc;
 
-  pdesc = dia_object_describe_properties ((DiaObject *) obj); /* Yes... */
+  pdesc = dia_object_describe_properties (DIA_OBJECT (obj)); /* Yes... */
   if (!pdesc) return NULL;
 
   if (pdesc[0].quark != 0) return pdesc;
@@ -133,7 +137,8 @@ object_prop_change_free(ObjectPropChange *change)
   prop_list_free(change->saved_props);
 }
 
-ObjectChange *
+
+DiaObjectChange *
 object_apply_props (DiaObject *obj, GPtrArray *props)
 {
   ObjectPropChange *change;
@@ -160,19 +165,26 @@ object_apply_props (DiaObject *obj, GPtrArray *props)
 
   change->saved_props = old_props;
 
-  return (ObjectChange *) change;
+  return dia_object_change_legacy_new ((ObjectChange *) change);
 }
 
-/*!
+
+/**
+ * object_toggle_prop:
+ * @obj: the #DiaObject
+ * @pname: the property name
+ * @val: the new value
+ *
  * Toggle a boolean property including change management
  */
-ObjectChange *
+DiaObjectChange *
 object_toggle_prop (DiaObject *obj, const char *pname, gboolean val)
 {
   Property *prop = make_new_prop (pname, PROP_TYPE_BOOL, 0);
   GPtrArray *plist = prop_list_from_single (prop);
 
   ((BoolProperty *)prop)->bool_data = val;
+
   return object_apply_props (obj, plist);
 }
 
@@ -214,28 +226,31 @@ object_list_create_props_dialog(GList *objects, gboolean is_default)
 }
 
 
-ObjectChange *
-object_apply_props_from_dialog(DiaObject *obj, WIDGET *dialog_widget)
+DiaObjectChange *
+object_apply_props_from_dialog (DiaObject *obj, WIDGET *dialog_widget)
 {
-  ObjectChange *change;
-  PropDialog *dialog = prop_dialog_from_widget(dialog_widget);
+  DiaObjectChange *change;
+  PropDialog *dialog = prop_dialog_from_widget (dialog_widget);
   GPtrArray *props = g_ptr_array_new ();
   guint i;
 
-  prop_get_data_from_widgets(dialog);
+  prop_get_data_from_widgets (dialog);
   /* only stuff which is actually changed */
   for (i = 0; i < dialog->props->len; ++i) {
     Property *p = g_ptr_array_index (dialog->props, i);
-    if (p->descr->flags & PROP_FLAG_WIDGET_ONLY)
+    if (p->descr->flags & PROP_FLAG_WIDGET_ONLY) {
       continue;
-    if ((p->experience & PXP_NOTSET) == 0)
-      g_ptr_array_add(props, p);
+    }
+    if ((p->experience & PXP_NOTSET) == 0) {
+      g_ptr_array_add (props, p);
+    }
   }
   change = dia_object_apply_properties (obj, props);
   g_ptr_array_free (props, TRUE);
   return change;
 }
 
+
 gboolean
 objects_comply_with_stdprop(GList *objects)
 {
@@ -365,106 +380,120 @@ object_prop_by_name_type(DiaObject *obj, const char *name, const char *type)
   return NULL;
 }
 
+
 Property *
-object_prop_by_name(DiaObject *obj, const char *name)
+object_prop_by_name (DiaObject *obj, const char *name)
 {
-  return object_prop_by_name_type(obj,name,NULL);
+  return object_prop_by_name_type (obj, name,NULL);
 }
 
-/*!
- * \brief Modification of the objects 'pixbuf' property
+
+/**
+ * dia_object_set_pixbuf:
+ * @object: object to modify
+ * @pixbuf: the pixbuf to set
  *
- * @param object object to modify
- * @param pixbuf the pixbuf to set
- * @return an object change or NULL
+ * Modification of the objects 'pixbuf' property
  *
  * If the object does not have a pixbuf property nothing
  * happens. If there is a pixbuf property and the passed
  * in pixbuf is identical an empty change is returned.
  *
- * \memberof _DiaObject
- * \ingroup StdProps
+ * Returns: #DiaObjectChange or %NULL
  */
-ObjectChange *
+DiaObjectChange *
 dia_object_set_pixbuf (DiaObject *object,
-                      GdkPixbuf *pixbuf)
+                       GdkPixbuf *pixbuf)
 {
-  ObjectChange *change;
+  DiaObjectChange *change;
   GPtrArray *props;
   PixbufProperty *pp;
   Property *prop = object_prop_by_name_type (object, "pixbuf", PROP_TYPE_PIXBUF);
 
-  if (!prop)
+  if (!prop) {
     return NULL;
-  pp = (PixbufProperty *)prop;
-  if (pp->pixbuf == pixbuf)
-    return change_list_create ();
+  }
+
+  pp = (PixbufProperty *) prop;
+  if (pp->pixbuf == pixbuf) {
+    return dia_object_change_list_new ();
+  }
+
   g_set_object (&pp->pixbuf, pixbuf);
+
   props = prop_list_from_single (prop);
   change = object_apply_props (object, props);
   prop_list_free (props);
   return change;
 }
 
-/*!
- * \brief Modification of the objects 'pattern' property
+
+/**
+ * dia_object_set_pattern:
+ * @object: object to modify
+ * @pattern: the pattern to set
  *
- * @param object object to modify
- * @param pattern the pattern to set
- * @return an object change or NULL
+ * Modification of the objects 'pattern' property
  *
  * If the object does not have a pattern property nothing
  * happens. If there is a pattern property and the passed
  * in pattern is identical an empty change is returned.
  *
- * \memberof _DiaObject
- * \ingroup StdProps
+ * Returns: #DiaObjectChange or %NULL
  */
-ObjectChange *
+DiaObjectChange *
 dia_object_set_pattern (DiaObject  *object,
-                       DiaPattern *pattern)
+                        DiaPattern *pattern)
 {
-  ObjectChange *change;
+  DiaObjectChange *change;
   GPtrArray *props;
   PatternProperty *pp;
   Property *prop = object_prop_by_name_type (object, "pattern", PROP_TYPE_PATTERN);
 
-  if (!prop)
+  if (!prop) {
     return NULL;
-  pp = (PatternProperty *)prop;
-  if (pp->pattern == pattern)
-    return change_list_create ();
+  }
+
+  pp = (PatternProperty *) prop;
+  if (pp->pattern == pattern) {
+    return dia_object_change_list_new ();
+  }
+
   g_set_object (&pp->pattern, pattern);
+
   props = prop_list_from_single (prop);
   change = object_apply_props (object, props);
   prop_list_free (props);
   return change;
 }
 
-/*!
- * \brief Modify the objects string property
- * @param object the object to modify
- * @param name the name of the string property (NULL for any)
- * @param value the value to set, NULL to delete
- * @return object change on sucess, NULL if not found
+
+/**
+ * dia_object_set_string:
+ * @object: the object to modify
+ * @name: the name of the string property (%NULL for any)
+ * @value: the value to set, %NULL to delete
  *
- * Usually you should not pass NULL for the name, the facility
+ * Modify the objects string property
+ *
+ * Usually you should not pass %NULL for the name, the facility
  * was added for convenience of the unit test.
  *
- * \memberof _DiaObject
- * \ingroup StdProps
+ * Returns: #DiaObjectChange on success, %NULL if @name not found
  */
-ObjectChange *
-dia_object_set_string (DiaObject *object,
-                      const char *name,
-                      const char *value)
+DiaObjectChange *
+dia_object_set_string (DiaObject  *object,
+                       const char *name,
+                       const char *value)
 {
-  ObjectChange *change;
+  DiaObjectChange *change;
   GPtrArray *props = NULL;
   Property *prop = object_prop_by_name_type (object, name, PROP_TYPE_STRING);
 
-  if (!prop)
+  if (!prop) {
     prop = object_prop_by_name_type (object, name, PROP_TYPE_FILE);
+  }
+
   if (prop) {
     StringProperty *pp = (StringProperty *)prop;
     g_clear_pointer (&pp->string_data, g_free);
@@ -476,8 +505,10 @@ dia_object_set_string (DiaObject *object,
     pp->text_data = g_strdup (value);
     props = prop_list_from_single (prop);
   }
-  if (!props)
+
+  if (!props) {
     return NULL;
+  }
 
   change = object_apply_props (object, props);
   prop_list_free (props);
diff --git a/lib/renderer/diacairo-print.c b/lib/renderer/diacairo-print.c
index dbcccc51f..3ebfef052 100644
--- a/lib/renderer/diacairo-print.c
+++ b/lib/renderer/diacairo-print.c
@@ -236,7 +236,7 @@ create_print_operation (DiagramData *data, const char *name)
 }
 
 
-ObjectChange *
+DiaObjectChange *
 cairo_print_callback (DiagramData *data,
                       const char  *filename,
                       guint        flags, /* further additions */
diff --git a/lib/renderer/diacairo-print.h b/lib/renderer/diacairo-print.h
index 9725e51d8..a9fe4ade6 100644
--- a/lib/renderer/diacairo-print.h
+++ b/lib/renderer/diacairo-print.h
@@ -1,13 +1,18 @@
+#pragma once
 
 #include <gtk/gtk.h>
 #include "diagramdata.h"
+#include "dia-object-change.h"
 
-GtkPrintOperation *
-create_print_operation (DiagramData *data, 
-                       const char *name);
 
-ObjectChange *
-cairo_print_callback (DiagramData *dia,
-                      const gchar *filename,
-                      guint flags, /* further additions */
-                      void *user_data);
+G_BEGIN_DECLS
+
+GtkPrintOperation *create_print_operation (DiagramData *data,
+                                           const char  *name);
+DiaObjectChange   *cairo_print_callback   (DiagramData *dia,
+                                           const char  *filename,
+                                           /* further additions */
+                                           guint        flags,
+                                           void        *user_data);
+
+G_END_DECLS
diff --git a/lib/standard-path.c b/lib/standard-path.c
index 61679d24f..33b32a7b7 100644
--- a/lib/standard-path.c
+++ b/lib/standard-path.c
@@ -43,6 +43,9 @@
 #include "create.h"
 #include "bezier-common.h"
 #include "pattern.h"
+#include "dia-object-change-legacy.h"
+#include "dia-object-change-list.h"
+
 
 #define NUM_HANDLES 8
 
@@ -167,12 +170,16 @@ DiaObjectType stdpath_type =
   stdpath_offsets
 };
 
+
 /* Class definition */
-static ObjectChange* stdpath_move_handle (StdPath *stdpath,
-                                          Handle *handle,
-                                         Point *to, ConnectionPoint *cp,
-                                         HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* stdpath_move (StdPath *stdpath, Point *to);
+static DiaObjectChange *stdpath_move_handle (StdPath          *stdpath,
+                                             Handle           *handle,
+                                             Point            *to,
+                                             ConnectionPoint  *cp,
+                                             HandleMoveReason  reason,
+                                             ModifierKeys      modifiers);
+static DiaObjectChange *stdpath_move        (StdPath          *stdpath,
+                                             Point            *to);
 static void stdpath_select(StdPath *stdpath, Point *clicked_point,
                           DiaRenderer *interactive_renderer);
 static void stdpath_draw(StdPath *stdpath, DiaRenderer *renderer);
@@ -437,17 +444,20 @@ stdpath_draw (StdPath *stdpath, DiaRenderer *renderer)
       }
       dia_renderer_bezier_fill (renderer, stdpath->points, stdpath->num_points, &fill);
     }
+
     if (stdpath->stroke_or_fill & PDO_STROKE) {
       dia_renderer_bezier_stroke (renderer, stdpath->points, stdpath->num_points, &stdpath->line_color);
     }
   }
+
   if (stdpath->show_control_lines) {
     bezier_draw_control_lines (stdpath->num_points, stdpath->points, renderer);
   }
 }
 
-static ObjectChange *_path_object_invert_change_create (DiaObject *obj);
-static ObjectChange *_path_object_transform_change_create (DiaObject *obj, DiaMatrix *mat);
+static DiaObjectChange *_path_object_invert_change_create    (DiaObject *obj);
+static DiaObjectChange *_path_object_transform_change_create (DiaObject *obj,
+                                                              DiaMatrix *mat);
 
 /*!
  * \brief Change the direction of the path
@@ -475,29 +485,36 @@ _stdpath_invert (StdPath *stdpath)
   memcpy (stdpath->points, inverted, sizeof(BezPoint)*n);
   stdpath_update_handles (stdpath);
 }
-static ObjectChange *
+
+
+static DiaObjectChange *
 _invert_path_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
-  StdPath *stdpath = (StdPath *)obj;
+  StdPath *stdpath = (StdPath *) obj;
   _stdpath_invert (stdpath);
   return _path_object_invert_change_create (obj);
 }
+
+
 /* a very simple undo function, complete reversible function */
 static void
 _apply_invert (ObjectChange *change, DiaObject *obj)
 {
-  _stdpath_invert ((StdPath *)obj);
+  _stdpath_invert ((StdPath *) obj);
 }
-static ObjectChange *
+
+
+static DiaObjectChange *
 _path_object_invert_change_create (DiaObject *obj)
 {
-  ObjectChange *change = g_new(ObjectChange, 1);
+  ObjectChange *change = g_new0 (ObjectChange, 1);
   change->apply = _apply_invert;
   change->revert = _apply_invert;
   change->free = NULL;
-  return change;
+  return dia_object_change_legacy_new (change);
 }
 
+
 static void
 _path_transform (StdPath *sp, const DiaMatrix *m)
 {
@@ -511,42 +528,50 @@ _path_transform (StdPath *sp, const DiaMatrix *m)
   stdpath_update_data (sp);
 }
 
+
 typedef struct _PathTransformChange {
   ObjectChange change;
   DiaMatrix    matrix;
 } PathTransformChange;
 
+
 static void
 _ptc_apply (ObjectChange *change, DiaObject *obj)
 {
   PathTransformChange *ptc = (PathTransformChange *)change;
-  StdPath *sp = (StdPath *)obj;
+  StdPath *sp = (StdPath *) obj;
 
   _path_transform (sp, &ptc->matrix);
 }
+
+
 static void
 _ptc_revert (ObjectChange *change, DiaObject *obj)
 {
-  StdPath *sp = (StdPath *)obj;
-  PathTransformChange *ptc = (PathTransformChange *)change;
+  StdPath *sp = (StdPath *) obj;
+  PathTransformChange *ptc = (PathTransformChange *) change;
   DiaMatrix mi = ptc->matrix;
 
-  if (cairo_matrix_invert ((cairo_matrix_t *)&mi) != CAIRO_STATUS_SUCCESS)
+  if (cairo_matrix_invert ((cairo_matrix_t *) &mi) != CAIRO_STATUS_SUCCESS) {
     g_warning ("_ptc_revert matrix invert");
+  }
   _path_transform (sp, &mi);
 }
-static ObjectChange *
+
+
+static DiaObjectChange *
 _path_object_transform_change_create (DiaObject *obj, DiaMatrix *matrix)
 {
-  PathTransformChange *ptc = g_new(PathTransformChange, 1);
+  PathTransformChange *ptc = g_new0 (PathTransformChange, 1);
 
   ptc->change.apply = _ptc_apply;
   ptc->change.revert = _ptc_revert;
   ptc->change.free = NULL;
   ptc->matrix = *matrix;
-  return &ptc->change;
+  return dia_object_change_legacy_new (&ptc->change);
 }
 
+
 /*!
  * \brief Flip the path over the vertical or horizontal axis
  *
@@ -557,7 +582,7 @@ _path_object_transform_change_create (DiaObject *obj, DiaMatrix *matrix)
  *
  * \relates _StdPath
  */
-static ObjectChange *
+static DiaObjectChange *
 _path_flip_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
   gboolean horz = data == NULL;
@@ -589,7 +614,7 @@ _path_flip_callback (DiaObject *obj, Point *clicked, gpointer data)
  *
  * \relates _StdPath
  */
-static ObjectChange *
+static DiaObjectChange *
 _path_rotate_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
   StdPath *sp = (StdPath *)obj;
@@ -651,7 +676,7 @@ _path_closest_corner_handle (StdPath *sp, const Point *pt)
  *
  * \relates _StdPath
  */
-static ObjectChange *
+static DiaObjectChange *
 _path_shear_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
   StdPath *sp = (StdPath *)obj;
@@ -695,33 +720,37 @@ _path_shear_callback (DiaObject *obj, Point *clicked, gpointer data)
  *
  * \relates _StdPath
  */
-static ObjectChange *
+static DiaObjectChange *
 _convert_to_beziers_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
   StdPath *stdpath = (StdPath *)obj;
   BezPoint *bezier = stdpath->points;
   GList *list = NULL;
   int i, n = 0;
-  ObjectChange *change;
+  DiaObjectChange *change;
 
   for (i = 1; i < stdpath->num_points; ++i) {
-    if (bezier[i].type == BEZ_MOVE_TO || i+1 == stdpath->num_points) {
+    if (bezier[i].type == BEZ_MOVE_TO || i + 1 == stdpath->num_points) {
       DiaObject *rep;
       int num = bezier[i].type == BEZ_MOVE_TO ? i - n : i - n + 1;
-      if (stdpath->stroke_or_fill & PDO_FILL)
-       rep = create_standard_beziergon (num, &bezier[n]);
-      else
-       rep = create_standard_bezierline (num, &bezier[n], NULL, NULL);
-      if (!rep) /* no Standard objects? */
-       break;
+      if (stdpath->stroke_or_fill & PDO_FILL) {
+        rep = create_standard_beziergon (num, &bezier[n]);
+      } else {
+        rep = create_standard_bezierline (num, &bezier[n], NULL, NULL);
+      }
+      if (!rep) {
+        /* no Standard objects? */
+        break;
+      }
       list = g_list_append (list, rep);
       n = i;
     }
   }
+
   if (!list) {
-    change = change_list_create ();
+    change = dia_object_change_list_new ();
   } else if (g_list_length (list) == 1) {
-    change = object_substitute (obj, (DiaObject *)list->data);
+    change = object_substitute (obj, DIA_OBJECT (list->data));
     g_list_free (list);
   } else {
     change = object_substitute (obj, create_standard_group (list));
@@ -729,14 +758,19 @@ _convert_to_beziers_callback (DiaObject *obj, Point *clicked, gpointer data)
 
   return change;
 }
-static ObjectChange *
+
+
+static DiaObjectChange *
 _show_control_lines (DiaObject *obj, Point *clicked, gpointer data)
 {
-  StdPath *stdpath = (StdPath *)obj;
+  StdPath *stdpath = (StdPath *) obj;
 
-  return object_toggle_prop(obj, "show_control_lines", !stdpath->show_control_lines);
+  return object_toggle_prop (obj,
+                             "show_control_lines",
+                             !stdpath->show_control_lines);
 }
 
+
 static DiaMenuItem _stdpath_menu_items[] = {
   { N_("Convert to Bezier"), _convert_to_beziers_callback, NULL, DIAMENU_ACTIVE },
   { N_("Invert Path"), _invert_path_callback, NULL, DIAMENU_ACTIVE },
@@ -851,17 +885,20 @@ _stdpath_scale (StdPath *stdpath, real sx, real sy, const Point *around)
   }
 }
 
+
 /*!
  * \brief Move one of the objects handles
  * \memberof _StdPath
  */
-static ObjectChange*
-stdpath_move_handle (StdPath *stdpath,
-                    Handle *handle,
-                    Point *to, ConnectionPoint *cp,
-                    HandleMoveReason reason, ModifierKeys modifiers)
+static DiaObjectChange *
+stdpath_move_handle (StdPath          *stdpath,
+                     Handle           *handle,
+                     Point            *to,
+                     ConnectionPoint  *cp,
+                     HandleMoveReason  reason,
+                     ModifierKeys      modifiers)
 {
-  const real EPSILON = 0.01;
+  const double EPSILON = 0.01;
 
   /* move_handle is supposed to be just moving that and related handles (e.g.
    * when N is moved NE and NW will move too). But 'opposite' handles are not
@@ -992,7 +1029,7 @@ stdpath_move_handle (StdPath *stdpath,
  *
  * \memberof _StdPath
  */
-static ObjectChange*
+static DiaObjectChange *
 stdpath_move (StdPath *stdpath, Point *to)
 {
   DiaObject *obj = &stdpath->object;
diff --git a/lib/text.c b/lib/text.c
index 4cfb7c7cd..61b33e883 100644
--- a/lib/text.c
+++ b/lib/text.c
@@ -30,15 +30,20 @@
 #include "diarenderer.h"
 #include "diainteractiverenderer.h"
 #include "diagramdata.h"
-#include "objchange.h"
 #include "textline.h"
 #include "attributes.h"
 #include "object.h"
+#include "dia-object-change-legacy.h"
+#include "dia-object-change-list.h"
+
+
+static int text_key_event (Focus            *focus,
+                           guint             keystate,
+                           guint             keysym,
+                           const char       *str,
+                           int               strlen,
+                           DiaObjectChange **change);
 
-static int text_key_event(Focus *focus,
-                         guint keystate, guint keysym,
-                         const gchar *str, int strlen,
-                         ObjectChange **change);
 
 typedef enum {
   TYPE_DELETE_BACKWARD,
@@ -69,8 +74,11 @@ struct TextObjectChange {
 
 #define CURSOR_HEIGHT_RATIO 20
 
+
 /**
  * text_get_line:
+ * @text: the #Text
+ * @line: the line number in @text to fetch
  *
  * Encapsulation functions for transferring to text_line
  *
@@ -217,7 +225,7 @@ text_get_ascent (Text *text)
 
 /**
  * text_get_descent:
- * @a: #Text object
+ * @text: a #Text object
  *
  * Get the *average* descent of this Text object.
  *
@@ -232,12 +240,12 @@ text_get_descent (Text *text)
 }
 
 
-static ObjectChange *text_create_change (Text           *text,
-                                         TextChangeType  type,
-                                         gunichar        ch,
-                                         int             pos,
-                                         int             row,
-                                         DiaObject      *obj);
+static DiaObjectChange *text_create_change (Text           *text,
+                                            TextChangeType  type,
+                                            gunichar        ch,
+                                            int             pos,
+                                            int             row,
+                                            DiaObject      *obj);
 
 
 static void
@@ -391,6 +399,9 @@ new_text (const char *string,
 
 /**
  * new_text_default:
+ * @pos: the #Point the text is located
+ * @color: the #Color of the text
+ * @align: the #Alignment of the text
  *
  * Fallback function returning a default initialized text object.
  */
@@ -998,7 +1009,7 @@ text_insert_char (Text *text, gunichar c)
 
 
 gboolean
-text_delete_key_handler (Focus *focus, ObjectChange ** change)
+text_delete_key_handler (Focus *focus, DiaObjectChange **change)
 {
   Text *text;
   int row, i;
@@ -1029,12 +1040,12 @@ text_delete_key_handler (Focus *focus, ObjectChange ** change)
 
 
 static int
-text_key_event (Focus         *focus,
-                guint          keystate,
-                guint          keyval,
-                const char    *str,
-                int            strlen,
-                ObjectChange **change)
+text_key_event (Focus            *focus,
+                guint             keystate,
+                guint             keyval,
+                const char       *str,
+                int               strlen,
+                DiaObjectChange **change)
 {
   Text *text;
   int return_val = FALSE;
@@ -1154,16 +1165,17 @@ text_key_event (Focus         *focus,
             break; /* avoid putting junk into our string */
           }
           return_val = TRUE;
-          *change = change_list_create();
+          *change = dia_object_change_list_new ();
           for (utf = str; utf && *utf && strlen > 0 ;
                utf = g_utf8_next_char (utf), strlen--) {
-            ObjectChange *step;
+            DiaObjectChange *step;
             c = g_utf8_get_char (utf);
 
             step = text_create_change (text, TYPE_INSERT_CHAR, c,
                                        text->cursor_pos, text->cursor_row,
                                        focus->obj);
-            change_list_add (*change, step);
+            dia_object_change_list_add (DIA_OBJECT_CHANGE_LIST (*change),
+                                        step);
             text_insert_char (text, c);
           }
         }
@@ -1188,7 +1200,7 @@ text_is_empty (const Text *text)
 
 
 int
-text_delete_all (Text *text, ObjectChange **change, DiaObject *obj)
+text_delete_all (Text *text, DiaObjectChange **change, DiaObject *obj)
 {
   if (!text_is_empty (text)) {
     *change = text_create_change (text, TYPE_DELETE_ALL,
@@ -1427,7 +1439,7 @@ make_posision_and_size_prop_list (void)
 }
 
 
-static ObjectChange *
+static DiaObjectChange *
 text_create_change (Text           *text,
                     TextChangeType  type,
                     gunichar        ch,
@@ -1460,7 +1472,7 @@ text_create_change (Text           *text,
     change->str = NULL;
   }
 
-  return (ObjectChange *) change;
+  return dia_object_change_legacy_new ((ObjectChange *) change);
 }
 
 
diff --git a/lib/text.h b/lib/text.h
index 6f9f3df88..6796cfcfb 100644
--- a/lib/text.h
+++ b/lib/text.h
@@ -30,6 +30,7 @@ typedef enum {
 #include "focus.h"
 #include "dia_xml.h" /* for AttributeNode */
 #include "diarenderer.h"
+#include "dia-object-change.h"
 
 /*!
  * \brief Multiline text representation
@@ -50,7 +51,7 @@ struct _Text {
 
   /* Attributes: */
   DiaFont *font;
-  real height;
+  double height;
   Point position;
   Color color;
   Alignment alignment;
@@ -61,29 +62,39 @@ struct _Text {
   Focus focus;
 
   /* Computed values:  */
-  real ascent; /* **average** ascent */
-  real descent; /* **average** descent */
-  real max_width;
+  double ascent; /* **average** ascent */
+  double descent; /* **average** descent */
+  double max_width;
 };
 
 
 /* makes an internal copy of the string */
 /*! \brief Text object creation \memberof _Text */
-Text *new_text(const char *string, DiaFont *font, real height,
+Text *new_text(const char *string, DiaFont *font, double height,
               Point *pos, Color *color, Alignment align);
-Text *new_text_default(Point *pos, Color *color, Alignment align);
-void text_destroy(Text *text);
-Text *text_copy(Text *text);
-gchar *text_get_line(const Text *text, int line);
-char *text_get_string_copy(const Text *text);
-void text_set_string(Text *text, const char *string);
-void text_set_height(Text *text, real height);
-real text_get_height(const Text *text);
-void text_set_font(Text *text, DiaFont *font);
-void text_set_position(Text *text, Point *pos);
-void text_set_color(Text *text, Color *col);
-void text_set_alignment(Text *text, Alignment align);
-real text_distance_from(Text *text, Point *point);
+Text   *new_text_default      (Point      *pos,
+                               Color      *color,
+                               Alignment   align);
+void    text_destroy          (Text       *text);
+Text   *text_copy             (Text       *text);
+char   *text_get_line         (const Text *text,
+                               int         line);
+char   *text_get_string_copy  (const Text *text);
+void    text_set_string       (Text       *text,
+                               const char *string);
+void    text_set_height       (Text       *text,
+                               double      height);
+double  text_get_height       (const Text *text);
+void    text_set_font         (Text       *text,
+                               DiaFont    *font);
+void    text_set_position     (Text       *text,
+                               Point      *pos);
+void    text_set_color        (Text       *text,
+                               Color      *col);
+void    text_set_alignment    (Text       *text,
+                               Alignment   align);
+double  text_distance_from    (Text       *text,
+                               Point      *point);
 void text_calc_boundingbox(Text *text, DiaRectangle *box);
 void text_draw(Text *text, DiaRenderer *renderer);
 void text_set_cursor(Text *text, Point *clicked_point,
@@ -91,19 +102,19 @@ void text_set_cursor(Text *text, Point *clicked_point,
 void text_set_cursor_at_end( Text* text );
 void text_grab_focus(Text *text, DiaObject *object);
 int text_is_empty(const Text *text);
-int text_delete_all(Text *text, ObjectChange **change, DiaObject *obj);
+int text_delete_all (Text *text, DiaObjectChange **change, DiaObject *obj);
 void text_get_attributes(Text *text, TextAttributes *attr);
 void text_set_attributes(Text *text, TextAttributes *attr);
 
-real text_get_line_width(const Text *text, int line_no);
+double text_get_line_width(const Text *text, int line_no);
 int text_get_line_strlen(const Text *text, int line_no);
-real text_get_max_width(Text *text);
-real text_get_ascent(Text *text);
-real text_get_descent(Text *text);
+double text_get_max_width(Text *text);
+double text_get_ascent(Text *text);
+double text_get_descent(Text *text);
 
 /** Exposing this is a hack, but currently GTK still captures the key
  * events of insensitive clods^H^H^H^H^Hmenu items. LC 21/10 2007*/
-gboolean text_delete_key_handler(Focus *focus, ObjectChange **change);
+gboolean text_delete_key_handler(Focus *focus, DiaObjectChange **change);
 void data_add_text(AttributeNode attr, Text *text, DiaContext *ctx);
 Text *data_text(AttributeNode attr, DiaContext *ctx);
 
diff --git a/objects/AADL/aadl.h b/objects/AADL/aadl.h
index f9d58fe20..526e7190d 100644
--- a/objects/AADL/aadl.h
+++ b/objects/AADL/aadl.h
@@ -175,11 +175,14 @@ void aadlbox_update_ports(Aadlbox *aadlbox);
 real aadlbox_distance_from(Aadlbox *aadlbox, Point *point);
 void aadlbox_select(Aadlbox *aadlbox, Point *clicked_point,
                    DiaRenderer *interactive_renderer);
-ObjectChange* aadlbox_move_handle(Aadlbox *aadlbox, Handle *handle,
-                                 Point *to, ConnectionPoint *cp,
-                                 HandleMoveReason reason,
-                                 ModifierKeys modifiers);
-ObjectChange* aadlbox_move(Aadlbox *aadlbox, Point *to);
+DiaObjectChange *aadlbox_move_handle (Aadlbox          *aadlbox,
+                                      Handle           *handle,
+                                      Point            *to,
+                                      ConnectionPoint  *cp,
+                                      HandleMoveReason  reason,
+                                      ModifierKeys      modifiers);
+DiaObjectChange *aadlbox_move        (Aadlbox          *aadlbox,
+                                      Point            *to);
 void aadlbox_draw(Aadlbox *aadlbox, DiaRenderer *renderer);
 DiaObject *aadlbox_create(Point *startpoint, void *user_data,
                          Handle **handle1, Handle **handle2);
diff --git a/objects/AADL/aadlbox.c b/objects/AADL/aadlbox.c
index 67ecf5af2..2cb4e9fd5 100644
--- a/objects/AADL/aadlbox.c
+++ b/objects/AADL/aadlbox.c
@@ -35,6 +35,8 @@
 
 #include "aadl.h"
 #include "edit_port_declaration.h"
+#include "dia-object-change-legacy.h"
+
 
 #define PORT_HANDLE_AADLBOX (HANDLE_CUSTOM9)
 
@@ -84,20 +86,24 @@ struct PointChange {
 static void aadlbox_update_data(Aadlbox *aadlbox);
 static void aadlbox_add_port(Aadlbox *aadlbox, const Point *p, Aadlport *port);
 static void aadlbox_remove_port(Aadlbox *aadlbox, Aadlport *port);
-static ObjectChange *aadlbox_add_port_callback (DiaObject *obj,
-                                               Point *clicked, gpointer data);
-static ObjectChange *aadlbox_delete_port_callback (DiaObject *obj,
-                                                Point *clicked, gpointer data);
+static DiaObjectChange *aadlbox_add_port_callback          (DiaObject *obj,
+                                                            Point     *clicked,
+                                                            gpointer   data);
+static DiaObjectChange *aadlbox_delete_port_callback       (DiaObject *obj,
+                                                            Point     *clicked,
+                                                            gpointer   data);
 int aadlbox_point_near_port(Aadlbox *aadlbox, Point *p);
 
 static void aadlbox_add_connection(Aadlbox *aadlbox, const Point *p,
                                   ConnectionPoint *connection);
 static void aadlbox_remove_connection(Aadlbox *aadlbox,
                                      ConnectionPoint *connection);
-static ObjectChange *aadlbox_add_connection_callback (DiaObject *obj,
-                                               Point *clicked, gpointer data);
-static ObjectChange *aadlbox_delete_connection_callback (DiaObject *obj,
-                                                Point *clicked, gpointer data);
+static DiaObjectChange *aadlbox_add_connection_callback    (DiaObject *obj,
+                                                            Point     *clicked,
+                                                            gpointer   data);
+static DiaObjectChange *aadlbox_delete_connection_callback (DiaObject *obj,
+                                                            Point     *clicked,
+                                                            gpointer   data);
 static int aadlbox_point_near_connection(Aadlbox *aadlbox, Point *p);
 
 /* == TEMPLATES ==
@@ -304,7 +310,7 @@ aadlbox_change_revert (struct PointChange *change, DiaObject *obj)
 }
 
 
-static ObjectChange *
+static DiaObjectChange *
 aadlbox_create_change (Aadlbox          *aadlbox,
                        enum change_type  type,
                        Point            *point,
@@ -337,7 +343,7 @@ aadlbox_create_change (Aadlbox          *aadlbox,
       g_return_val_if_reached (NULL);
   }
 
-  return (ObjectChange *) change;
+  return dia_object_change_legacy_new ((ObjectChange *) change);
 }
 
 
@@ -537,21 +543,22 @@ aadlbox_remove_port(Aadlbox *aadlbox, Aadlport *port)
 }
 
 
-ObjectChange *
+DiaObjectChange *
 aadlbox_add_port_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
   Aadlbox *aadlbox = (Aadlbox *) obj;
   Aadl_type type = *((Aadl_type *) data);
   Aadlport *port;
 
-  port = new_port(type, "");
-  aadlbox_add_port(aadlbox, clicked, port);
-  aadlbox_update_data(aadlbox);
+  port = new_port (type, "");
+  aadlbox_add_port (aadlbox, clicked, port);
+  aadlbox_update_data (aadlbox);
 
-  return aadlbox_create_change(aadlbox, TYPE_ADD_POINT, clicked, port);
+  return aadlbox_create_change (aadlbox, TYPE_ADD_POINT, clicked, port);
 }
 
-ObjectChange *
+
+DiaObjectChange *
 aadlbox_delete_port_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
   Aadlbox *aadlbox = (Aadlbox *) obj;
@@ -559,15 +566,15 @@ aadlbox_delete_port_callback (DiaObject *obj, Point *clicked, gpointer data)
   int port_num;
   Point p;
 
-  port_num = aadlbox_point_near_port(aadlbox, clicked);
+  port_num = aadlbox_point_near_port (aadlbox, clicked);
 
   port = aadlbox->ports[port_num];
   p = port->handle->pos;
 
-  aadlbox_remove_port(aadlbox, port );
-  aadlbox_update_data(aadlbox);
+  aadlbox_remove_port (aadlbox, port);
+  aadlbox_update_data (aadlbox);
 
-  return aadlbox_create_change(aadlbox, TYPE_REMOVE_POINT, &p, port);
+  return aadlbox_create_change (aadlbox, TYPE_REMOVE_POINT, &p, port);
 }
 
 
@@ -649,7 +656,7 @@ aadlbox_remove_connection(Aadlbox *aadlbox, ConnectionPoint *connection)
 }
 
 
-ObjectChange *
+DiaObjectChange *
 aadlbox_add_connection_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
   Aadlbox *aadlbox = (Aadlbox *) obj;
@@ -657,31 +664,35 @@ aadlbox_add_connection_callback (DiaObject *obj, Point *clicked, gpointer data)
 
   connection = g_new0(ConnectionPoint,1);
 
-  aadlbox_add_connection(aadlbox, clicked, connection);
-  aadlbox_update_data(aadlbox);
+  aadlbox_add_connection (aadlbox, clicked, connection);
+  aadlbox_update_data (aadlbox);
 
-  return aadlbox_create_change(aadlbox, TYPE_ADD_CONNECTION, clicked,connection);
+  return aadlbox_create_change (aadlbox, TYPE_ADD_CONNECTION, clicked, connection);
 }
 
 
-ObjectChange *
-aadlbox_delete_connection_callback (DiaObject *obj, Point *clicked,
-                                   gpointer data)
+DiaObjectChange *
+aadlbox_delete_connection_callback (DiaObject *obj,
+                                    Point     *clicked,
+                                    gpointer   data)
 {
   Aadlbox *aadlbox = (Aadlbox *) obj;
   ConnectionPoint *connection;
   int connection_num;
   Point p;
 
-  connection_num = aadlbox_point_near_connection(aadlbox, clicked);
+  connection_num = aadlbox_point_near_connection (aadlbox, clicked);
 
   connection = aadlbox->connections[connection_num];
   p = connection->pos;
 
-  aadlbox_remove_connection(aadlbox, connection );
-  aadlbox_update_data(aadlbox);
+  aadlbox_remove_connection (aadlbox, connection);
+  aadlbox_update_data (aadlbox);
 
-  return aadlbox_create_change(aadlbox, TYPE_REMOVE_CONNECTION, &p, connection);
+  return aadlbox_create_change (aadlbox,
+                                TYPE_REMOVE_CONNECTION,
+                                &p,
+                                connection);
 }
 
 /***********************************************
@@ -705,17 +716,20 @@ aadlbox_select(Aadlbox *aadlbox, Point *clicked_point,
 }
 
 
-ObjectChange*
-aadlbox_move_handle(Aadlbox *aadlbox, Handle *handle,
-                Point *to, ConnectionPoint *cp,
-                HandleMoveReason reason, ModifierKeys modifiers)
+DiaObjectChange *
+aadlbox_move_handle (Aadlbox          *aadlbox,
+                     Handle           *handle,
+                     Point            *to,
+                     ConnectionPoint  *cp,
+                     HandleMoveReason  reason,
+                     ModifierKeys      modifiers)
 {
   assert(aadlbox!=NULL);
   assert(handle!=NULL);
   assert(to!=NULL);
 
-  if (handle->id < 8) {   /* box resizing */
-
+  if (handle->id < 8) {
+    /* box resizing */
     Element *element = &aadlbox->element;
     Point oldcorner, newcorner;
     real oldw, neww, oldh, newh;
@@ -758,39 +772,37 @@ aadlbox_move_handle(Aadlbox *aadlbox, Handle *handle,
       c->pos.x = newcorner.x + w_factor * neww;
       c->pos.y = newcorner.y + h_factor * newh;
     }
-
-  }
-
-  else {    /* port handles */
-
+  } else {
+    /* port handles */
     handle->pos.x = to->x;
     handle->pos.y = to->y;
   }
 
-  aadlbox_update_data(aadlbox);
+  aadlbox_update_data (aadlbox);
 
   /* FIXME !!  Should I free the given structures (to, ...) ? */
   return NULL;
 }
 
-ObjectChange*
-aadlbox_move(Aadlbox *aadlbox, Point *to)
+
+DiaObjectChange *
+aadlbox_move (Aadlbox *aadlbox, Point *to)
 {
   Point p, delta;
   DiaObject *obj = &aadlbox->element.object;
   int i;
 
   delta = *to;
-  point_sub(&delta, &obj->position);
+  point_sub (&delta, &obj->position);
 
   /* update ports position */
-  for (i=0;i<aadlbox->num_ports;i++) {
-    point_add(&aadlbox->ports[i]->handle->pos, &delta);
+  for (i = 0; i < aadlbox->num_ports; i++) {
+    point_add (&aadlbox->ports[i]->handle->pos, &delta);
   }
 
   /* update connection points position */
-  for (i=0;i<aadlbox->num_connections;i++) {
-    point_add(&aadlbox->connections[i]->pos, &delta);
+  for (i = 0; i < aadlbox->num_connections; i++) {
+    point_add (&aadlbox->connections[i]->pos, &delta);
   }
 
 
@@ -800,11 +812,12 @@ aadlbox_move(Aadlbox *aadlbox, Point *to)
   p.x += AADLBOX_TEXT_MARGIN;
   p.y += aadlbox->name->ascent + AADLBOX_TEXT_MARGIN;
 
-  aadlbox_update_data(aadlbox);
+  aadlbox_update_data (aadlbox);
 
   return NULL;
 }
 
+
 void aadlbox_draw(Aadlbox *aadlbox, DiaRenderer *renderer)
 {
   int i;
diff --git a/objects/AADL/edit_port_declaration.c b/objects/AADL/edit_port_declaration.c
index 596c4a54a..e786fe983 100644
--- a/objects/AADL/edit_port_declaration.c
+++ b/objects/AADL/edit_port_declaration.c
@@ -24,6 +24,8 @@
 #include <string.h>
 #include "aadl.h"
 #include "edit_port_declaration.h"
+#include "dia-object-change-legacy.h"
+
 
 int aadlbox_point_near_port(Aadlbox *aadlbox, Point *p);
 
@@ -120,8 +122,10 @@ static gboolean focus_out_event( GtkWidget      *widget,
 /* I have to write this little GTK code, because there's no way to know
    which point was clicked if I use the properties functions (get_props, ...)*/
 
-ObjectChange *edit_port_declaration_callback (DiaObject *obj,
-                                   Point *clicked, gpointer data)
+DiaObjectChange *
+edit_port_declaration_callback (DiaObject *obj,
+                                Point     *clicked,
+                                gpointer   data)
 {
   GtkWidget *window;
   GtkWidget *vbox;
@@ -206,7 +210,5 @@ ObjectChange *edit_port_declaration_callback (DiaObject *obj,
 
   change->obj_change.apply((ObjectChange *)change, obj);
 
-  return (ObjectChange *) change;
+  return dia_object_change_legacy_new ((ObjectChange *) change);
 }
-
-
diff --git a/objects/AADL/edit_port_declaration.h b/objects/AADL/edit_port_declaration.h
index 921674a27..60ea967b9 100644
--- a/objects/AADL/edit_port_declaration.h
+++ b/objects/AADL/edit_port_declaration.h
@@ -19,5 +19,6 @@
 */
 
 
-ObjectChange *edit_port_declaration_callback (DiaObject *obj,
-                                             Point *clicked, gpointer data);
+DiaObjectChange *edit_port_declaration_callback (DiaObject *obj,
+                                                 Point     *clicked,
+                                                 gpointer   data);
diff --git a/objects/Database/compound.c b/objects/Database/compound.c
index 9eda60f36..8dd41455c 100644
--- a/objects/Database/compound.c
+++ b/objects/Database/compound.c
@@ -32,6 +32,7 @@
 #include "attributes.h"
 #include "geometry.h"
 #include "propinternals.h"
+#include "dia-object-change-legacy.h"
 
 #include "debug.h"
 
@@ -99,16 +100,15 @@ struct _MountPointMoveChange {
 static CompoundState * compound_state_new (Compound *);
 static void compound_state_free (CompoundState *);
 static void compound_state_set (CompoundState *, Compound *);
-static CompoundChange * compound_change_new (Compound *, CompoundState *);
+static DiaObjectChange *compound_change_new (Compound *, CompoundState *);
 static void compound_change_apply (CompoundChange *, DiaObject *);
 static void compound_change_free (CompoundChange *);
 
-static MountPointMoveChange *
-mount_point_move_change_new (Compound *, Point *);
-static void
-mount_point_move_change_apply (MountPointMoveChange *, DiaObject *);
-static void
-mount_point_move_change_free (MountPointMoveChange *);
+static DiaObjectChange *mount_point_move_change_new   (Compound             *,
+                                                       Point                *);
+static void             mount_point_move_change_apply (MountPointMoveChange *,
+                                                       DiaObject            *);
+static void             mount_point_move_change_free  (MountPointMoveChange *);
 
 static DiaObject * compound_create (Point *, void *, Handle **, Handle **);
 static DiaObject * compound_load (ObjectNode obj_node, int version,DiaContext *ctx);
@@ -118,19 +118,28 @@ static void compound_draw (Compound *, DiaRenderer *);
 static real compound_distance_from (Compound *, Point *);
 static void compound_select (Compound *, Point *, DiaRenderer *);
 static DiaObject * compound_copy (Compound *);
-static ObjectChange * compound_move (Compound *, Point *);
-static ObjectChange * compound_move_handle (Compound *, Handle *, Point *,
-                                            ConnectionPoint *,
-                                            HandleMoveReason, ModifierKeys);
-static ObjectChange * compound_apply_properties_dialog (Compound *,
-                                                        GtkWidget *);
-static PropDescription * compound_describe_props (Compound *);
-static void compound_get_props (Compound *, GPtrArray *);
-static void compound_set_props (Compound *, GPtrArray *);
-static void compound_update_object (Compound *);
-static ObjectChange * compound_flip_arms_cb (DiaObject *, Point *, gpointer);
-static ObjectChange * compound_repos_mount_point_cb (DiaObject *, Point *,
-                                                     gpointer);
+static DiaObjectChange *compound_move                    (Compound         *,
+                                                          Point            *);
+static DiaObjectChange *compound_move_handle             (Compound         *,
+                                                          Handle           *,
+                                                          Point            *,
+                                                          ConnectionPoint  *,
+                                                          HandleMoveReason,
+                                                          ModifierKeys);
+static DiaObjectChange *compound_apply_properties_dialog (Compound         *,
+                                                          GtkWidget        *);
+static PropDescription *compound_describe_props          (Compound         *);
+static void             compound_get_props               (Compound         *,
+                                                          GPtrArray        *);
+static void             compound_set_props               (Compound         *,
+                                                          GPtrArray        *);
+static void             compound_update_object           (Compound         *);
+static DiaObjectChange *compound_flip_arms_cb            (DiaObject        *,
+                                                          Point            *,
+                                                          gpointer);
+static DiaObjectChange *compound_repos_mount_point_cb    (DiaObject        *,
+                                                          Point            *,
+                                                          gpointer);
 static DiaMenu * compound_object_menu(DiaObject *, Point *);
 static gint adjust_handle_count_to (Compound *, gint);
 static void setup_mount_point (ConnectionPoint *, DiaObject *, Point *);
@@ -300,10 +309,10 @@ compound_state_free (CompoundState * state)
 }
 
 
-static CompoundChange *
-compound_change_new (Compound * comp, CompoundState * state)
+static DiaObjectChange *
+compound_change_new (Compound *comp, CompoundState *state)
 {
-  CompoundChange * change;
+  CompoundChange *change;
 
   change = g_new (CompoundChange, 1);
 
@@ -314,7 +323,7 @@ compound_change_new (Compound * comp, CompoundState * state)
   change->obj = comp;
   change->saved_state = state;
 
-  return change;
+  return dia_object_change_legacy_new ((ObjectChange *) change);
 }
 
 static void
@@ -336,7 +345,8 @@ compound_change_free (CompoundChange * change)
   compound_state_free (change->saved_state);
 }
 
-static MountPointMoveChange *
+
+static DiaObjectChange *
 mount_point_move_change_new (Compound * comp, Point * pos)
 {
   MountPointMoveChange * change;
@@ -352,9 +362,10 @@ mount_point_move_change_new (Compound * comp, Point * pos)
   change->obj = comp;
   change->saved_pos = *pos;
 
-  return change;
+  return dia_object_change_legacy_new ((ObjectChange *) change);
 }
 
+
 static void
 mount_point_move_change_apply (MountPointMoveChange * change, DiaObject * obj)
 {
@@ -657,32 +668,36 @@ compound_copy (Compound * comp)
   return &copy->object;
 }
 
-static ObjectChange *
-compound_move (Compound * comp, Point * to)
+
+static DiaObjectChange *
+compound_move (Compound *comp, Point *to)
 {
   Point diff;
   Handle * h;
-  gint i, num_handles;
+  int i, num_handles;
 
   diff.x = to->x - comp->object.position.x;
   diff.y = to->y - comp->object.position.y;
 
   num_handles = comp->object.num_handles;
-  for (i = 0; i < num_handles; i++)
-    {
-      h = &comp->handles[i];
-      point_add (&h->pos, &diff);
-    }
+  for (i = 0; i < num_handles; i++) {
+    h = &comp->handles[i];
+    point_add (&h->pos, &diff);
+  }
   point_add (&comp->mount_point.pos, &diff);
 
   compound_update_data (comp);
   return NULL;
 }
 
-static ObjectChange *
-compound_move_handle (Compound * comp, Handle * handle,
-                      Point * to, ConnectionPoint * cp,
-                      HandleMoveReason reason, ModifierKeys modifiers)
+
+static DiaObjectChange *
+compound_move_handle (Compound         *comp,
+                      Handle           *handle,
+                      Point            *to,
+                      ConnectionPoint  *cp,
+                      HandleMoveReason  reason,
+                      ModifierKeys      modifiers)
 {
   if (handle->id == HANDLE_MOUNT_POINT)
     {
@@ -719,7 +734,8 @@ compound_move_handle (Compound * comp, Handle * handle,
   return NULL;
 }
 
-static ObjectChange *
+
+static DiaObjectChange *
 compound_apply_properties_dialog (Compound * comp, GtkWidget * dialog_widget)
 {
   CompoundState * state;
@@ -729,9 +745,11 @@ compound_apply_properties_dialog (Compound * comp, GtkWidget * dialog_widget)
 
   prop_get_data_from_widgets(dialog);
   compound_apply_props (comp, dialog->props, FALSE);
-  return (ObjectChange *) compound_change_new (comp, state);
+
+  return compound_change_new (comp, state);
 }
 
+
 static PropDescription *
 compound_describe_props (Compound * comp)
 {
@@ -1071,16 +1089,17 @@ compound_object_menu(DiaObject *obj, Point *p)
   return &compound_menu;
 }
 
-static ObjectChange *
+
+static DiaObjectChange *
 compound_flip_arms_cb (DiaObject *obj, Point *pos, gpointer data)
 {
   Compound * comp = (Compound *) obj;
-  gint direction = GPOINTER_TO_INT (data);
+  int direction = GPOINTER_TO_INT (data);
   Point * mppos = &comp->mount_point.pos;
   CompoundState * state;
   Handle * h;
   Point * p;
-  gint num_handles, i;
+  int num_handles, i;
 
   state = compound_state_new (comp);
 
@@ -1106,18 +1125,20 @@ compound_flip_arms_cb (DiaObject *obj, Point *pos, gpointer data)
 
   compound_update_data (comp);
   compound_sanity_check (comp, "After flipping sides");
-  return (ObjectChange *) compound_change_new (comp, state);
+
+  return compound_change_new (comp, state);
 }
 
-static ObjectChange *
+
+static DiaObjectChange *
 compound_repos_mount_point_cb (DiaObject * obj, Point *clicked, gpointer data)
 {
   Compound * comp = (Compound *) obj;
   Handle * h;
   Point old_pos;
   Point pos;
-  gint what_todo;
-  gint i, num_handles;
+  int what_todo;
+  int i, num_handles;
 
   old_pos = comp->mount_point.pos;
   what_todo = GPOINTER_TO_INT (data);
@@ -1152,7 +1173,7 @@ compound_repos_mount_point_cb (DiaObject * obj, Point *clicked, gpointer data)
   comp->mount_point.pos = pos;
   compound_update_data (comp);
 
-  return (ObjectChange *)mount_point_move_change_new (comp, &old_pos);
+  return mount_point_move_change_new (comp, &old_pos);
 }
 
 /**
diff --git a/objects/Database/database.h b/objects/Database/database.h
index cb4efa021..66a16dbf0 100644
--- a/objects/Database/database.h
+++ b/objects/Database/database.h
@@ -22,6 +22,8 @@
 #include "element.h"
 #include "connectionpoint.h"
 #include "orth_conn.h"
+#include "dia-object-change-legacy.h"
+
 
 #define IS_NOT_EMPTY(str) (((str) != NULL) && ((str)[0] != '\0'))
 
diff --git a/objects/Database/reference.c b/objects/Database/reference.c
index 225d2ef5a..7a15e80d7 100644
--- a/objects/Database/reference.c
+++ b/objects/Database/reference.c
@@ -37,11 +37,14 @@ static void reference_destroy (TableReference *);
 static void reference_draw (TableReference *, DiaRenderer *);
 static real reference_distance_from (TableReference *, Point *);
 static void reference_select (TableReference *, Point *, DiaRenderer *);
-static ObjectChange * reference_move (TableReference *, Point *);
-static ObjectChange * reference_move_handle (TableReference *, Handle *,
-                                             Point *, ConnectionPoint *,
-                                             HandleMoveReason,
-                                             ModifierKeys);
+static DiaObjectChange *reference_move           (TableReference   *,
+                                                  Point            *);
+static DiaObjectChange *reference_move_handle    (TableReference   *,
+                                                  Handle           *,
+                                                  Point            *,
+                                                  ConnectionPoint  *,
+                                                  HandleMoveReason,
+                                                  ModifierKeys);
 static PropDescription * reference_describe_props (TableReference *);
 static void reference_get_props (TableReference *, GPtrArray *);
 static void reference_set_props (TableReference *, GPtrArray *);
@@ -51,8 +54,12 @@ static void update_desc_data (Point *, Alignment *,
                               Point *, Point *, Orientation, real, real);
 static void get_desc_bbox (DiaRectangle *, gchar *, real, Point *, Alignment,
                            DiaFont *, real);
-static ObjectChange * reference_add_segment_cb(DiaObject *, Point *, gpointer);
-static ObjectChange * reference_del_segment_cb(DiaObject *, Point *, gpointer);
+static DiaObjectChange *reference_add_segment_cb (DiaObject        *,
+                                                  Point            *,
+                                                  gpointer);
+static DiaObjectChange *reference_del_segment_cb (DiaObject        *,
+                                                  Point            *,
+                                                  gpointer);
 static DiaMenu * reference_object_menu(TableReference *, Point *);
 
 /* ------------------------------------------------------------------------ */
@@ -206,19 +213,23 @@ reference_destroy (TableReference * ref)
 
 
 static DiaObject *
-reference_load (ObjectNode obj_node, int version,DiaContext *ctx)
+reference_load (ObjectNode obj_node, int version, DiaContext *ctx)
 {
-  DiaObject * obj = object_load_using_properties (&reference_type,
-                                                  obj_node, version,ctx);
+  DiaObject *obj = object_load_using_properties (&reference_type,
+                                                 obj_node,
+                                                 version,
+                                                 ctx);
+
   return obj;
 }
 
+
 static void
 reference_draw (TableReference *ref, DiaRenderer *renderer)
 {
   OrthConn * orth = &ref->orth;
   Point * points;
-  gint num_points;
+  int num_points;
 
   points = &orth->points[0];
   num_points = orth->numpoints;
@@ -246,6 +257,7 @@ reference_draw (TableReference *ref, DiaRenderer *renderer)
                               ref->sp_desc_text_align,
                               &ref->text_color);
   }
+
   if (IS_NOT_EMPTY (ref->end_point_desc)) {
     dia_renderer_draw_string (renderer,
                               ref->end_point_desc,
@@ -255,66 +267,91 @@ reference_draw (TableReference *ref, DiaRenderer *renderer)
   }
 }
 
-static real
-reference_distance_from (TableReference * ref, Point *point)
+
+static double
+reference_distance_from (TableReference *ref, Point *point)
 {
   DiaRectangle rect;
-  OrthConn * orth;
-  real dist;
+  OrthConn *orth;
+  double dist;
 
   orth = &ref->orth;
   dist = orthconn_distance_from (orth, point, ref->line_width);
 
-  if (IS_NOT_EMPTY(ref->start_point_desc))
-    {
-      get_desc_bbox (&rect, ref->start_point_desc, ref->sp_desc_width,
-                     &ref->sp_desc_pos, ref->sp_desc_text_align,
-                     ref->normal_font, ref->normal_font_height);
-      dist = MIN(distance_rectangle_point(&rect, point), dist);
-      if (dist < 0.000001)
-        return 0.0;
-    }
-  if (IS_NOT_EMPTY(ref->start_point_desc))
-    {
-      get_desc_bbox (&rect, ref->end_point_desc, ref->ep_desc_width,
-                     &ref->ep_desc_pos, ref->ep_desc_text_align,
-                     ref->normal_font, ref->normal_font_height);
-      dist = MIN(distance_rectangle_point (&rect, point), dist);
+  if (IS_NOT_EMPTY (ref->start_point_desc)) {
+    get_desc_bbox (&rect,
+                   ref->start_point_desc,
+                   ref->sp_desc_width,
+                   &ref->sp_desc_pos,
+                   ref->sp_desc_text_align,
+                   ref->normal_font,
+                   ref->normal_font_height);
+
+    dist = MIN (distance_rectangle_point (&rect, point), dist);
+
+    if (dist < 0.000001) {
+      return 0.0;
     }
+  }
+
+  if (IS_NOT_EMPTY (ref->start_point_desc)) {
+    get_desc_bbox (&rect,
+                   ref->end_point_desc,
+                   ref->ep_desc_width,
+                   &ref->ep_desc_pos,
+                   ref->ep_desc_text_align,
+                   ref->normal_font,
+                   ref->normal_font_height);
+    dist = MIN (distance_rectangle_point (&rect, point), dist);
+  }
 
   return dist;
 }
 
+
 static void
-reference_select (TableReference * ref,
-                  Point * clicked_point,
-                  DiaRenderer * interactive_renderer)
+reference_select (TableReference *ref,
+                  Point          *clicked_point,
+                  DiaRenderer    *interactive_renderer)
 {
-  orthconn_update_data(&ref->orth);
+  orthconn_update_data (&ref->orth);
 }
 
-static ObjectChange *
+
+static DiaObjectChange *
 reference_move (TableReference *ref, Point *to)
 {
-  ObjectChange *change;
+  DiaObjectChange *change;
 
-  change = orthconn_move(&ref->orth, to);
+  change = orthconn_move (&ref->orth, to);
   reference_update_data (ref);
+
   return change;
 }
 
-static ObjectChange *
-reference_move_handle (TableReference *ref, Handle *handle,
-                       Point *to, ConnectionPoint *cp,
-                       HandleMoveReason reason, ModifierKeys modifiers)
-{
-  ObjectChange *change;
 
-  change = orthconn_move_handle(&ref->orth, handle, to, cp, reason, modifiers);
+static DiaObjectChange *
+reference_move_handle (TableReference   *ref,
+                       Handle           *handle,
+                       Point            *to,
+                       ConnectionPoint  *cp,
+                       HandleMoveReason  reason,
+                       ModifierKeys      modifiers)
+{
+  DiaObjectChange *change;
+
+  change = orthconn_move_handle (&ref->orth,
+                                 handle,
+                                 to,
+                                 cp,
+                                 reason,
+                                 modifiers);
   reference_update_data (ref);
+
   return change;
 }
 
+
 static PropDescription *
 reference_describe_props (TableReference *ref)
 {
@@ -498,33 +535,41 @@ get_desc_bbox (DiaRectangle * r, gchar * string, real string_width,
   r->bottom = r->top + font_height;
 }
 
+
 static DiaMenu *
-reference_object_menu(TableReference *tbl, Point *clicked)
+reference_object_menu (TableReference *tbl, Point *clicked)
 {
   OrthConn *orth;
 
   orth = &tbl->orth;
   /* Set entries sensitive/selected etc here */
-  reference_menu_items[0].active = orthconn_can_add_segment(orth, clicked);
-  reference_menu_items[1].active = orthconn_can_delete_segment(orth, clicked);
-  orthconn_update_object_menu(orth, clicked, &reference_menu_items[2]);
+  reference_menu_items[0].active = orthconn_can_add_segment (orth, clicked);
+  reference_menu_items[1].active = orthconn_can_delete_segment (orth, clicked);
+  orthconn_update_object_menu (orth, clicked, &reference_menu_items[2]);
+
   return &reference_menu;
 }
 
-static ObjectChange *
-reference_add_segment_cb(DiaObject * obj, Point * clicked, gpointer data)
+
+static DiaObjectChange *
+reference_add_segment_cb (DiaObject *obj, Point *clicked, gpointer data)
 {
-  ObjectChange *change;
-  change = orthconn_add_segment((OrthConn *)obj, clicked);
-  reference_update_data((TableReference *)obj);
+  DiaObjectChange *change;
+
+  change = orthconn_add_segment ((OrthConn *)obj, clicked);
+  reference_update_data ((TableReference *) obj);
+
   return change;
 }
 
-static ObjectChange *
-reference_del_segment_cb(DiaObject * obj, Point * clicked, gpointer data)
+
+static DiaObjectChange *
+reference_del_segment_cb (DiaObject *obj, Point *clicked, gpointer data)
 {
-  ObjectChange *change;
-  change = orthconn_delete_segment((OrthConn *)obj, clicked);
-  reference_update_data((TableReference *)obj);
+  DiaObjectChange *change;
+
+  change = orthconn_delete_segment ((OrthConn *) obj, clicked);
+  reference_update_data ((TableReference *) obj);
+
   return change;
 }
diff --git a/objects/Database/table.c b/objects/Database/table.c
index 9682ca711..514d9bc72 100644
--- a/objects/Database/table.c
+++ b/objects/Database/table.c
@@ -50,33 +50,62 @@
 
 /* ----------------------------------------------------------------------- */
 
-static real         table_calculate_namebox_data (Table *);
-static real         table_init_attributesbox_height (Table *);
-static DiaObject *  table_create (Point *, void *, Handle **, Handle **);
-static DiaObject *  table_load (ObjectNode obj_node, int version, DiaContext *ctx);
-static void         table_save (Table *, ObjectNode, DiaContext *ctx);
-static void         table_destroy (Table *);
-static real         table_distance_from (Table *, Point *);
-static void         table_select (Table *, Point *, DiaRenderer *);
-static DiaObject *  table_copy (Table *table);
-static ObjectChange* table_move (Table *, Point *);
-static ObjectChange * table_move_handle (Table *, Handle *,
-                                         Point *, ConnectionPoint *,
-                                         HandleMoveReason, ModifierKeys);
-static PropDescription * table_describe_props (Table *);
-static void         table_get_props (Table *, GPtrArray *);
-static void         table_set_props (Table *, GPtrArray *);
-
-static void         table_draw (Table *, DiaRenderer *);
-static real         table_draw_namebox (Table *, DiaRenderer *, Element *);
-static real         table_draw_attributesbox (Table *, DiaRenderer *,
-                                              Element *, real);
-static DiaMenu * table_object_menu(DiaObject *, Point *);
-static ObjectChange * table_show_comments_cb(DiaObject *, Point *, gpointer);
-static void underline_table_attribute (DiaRenderer  *, Point,
-                                       TableAttribute *, Table *);
-static void fill_diamond (DiaRenderer *, real, real, Point *, Color *);
-static void table_init_fonts (Table *);
+static double           table_calculate_namebox_data    (Table             *);
+static double           table_init_attributesbox_height (Table             *);
+static DiaObject       *table_create                    (Point             *,
+                                                         void              *,
+                                                         Handle           **,
+                                                         Handle           **);
+static DiaObject       *table_load                      (ObjectNode         obj_node,
+                                                         int                version,
+                                                         DiaContext        *ctx);
+static void             table_save                      (Table             *,
+                                                         ObjectNode,
+                                                         DiaContext        *ctx);
+static void             table_destroy                   (Table             *);
+static double           table_distance_from             (Table             *,
+                                                         Point             *);
+static void             table_select                    (Table             *,
+                                                         Point             *,
+                                                         DiaRenderer       *);
+static DiaObject       *table_copy                      (Table             *table);
+static DiaObjectChange *table_move                      (Table             *,
+                                                         Point             *);
+static DiaObjectChange *table_move_handle               (Table             *,
+                                                         Handle            *,
+                                                         Point             *,
+                                                         ConnectionPoint   *,
+                                                         HandleMoveReason,
+                                                         ModifierKeys);
+static PropDescription *table_describe_props            (Table             *);
+static void             table_get_props                 (Table             *,
+                                                         GPtrArray         *);
+static void             table_set_props                 (Table             *,
+                                                         GPtrArray         *);
+static void             table_draw                      (Table             *,
+                                                         DiaRenderer       *);
+static double           table_draw_namebox              (Table             *,
+                                                         DiaRenderer       *,
+                                                         Element           *);
+static double           table_draw_attributesbox        (Table             *,
+                                                         DiaRenderer       *,
+                                                         Element           *,
+                                                         double);
+static DiaMenu         *table_object_menu               (DiaObject         *,
+                                                         Point             *);
+static DiaObjectChange *table_show_comments_cb          (DiaObject         *,
+                                                         Point             *,
+                                                         gpointer);
+static void             underline_table_attribute       (DiaRenderer       *,
+                                                         Point,
+                                                         TableAttribute    *,
+                                                         Table             *);
+static void             fill_diamond                    (DiaRenderer       *,
+                                                         double,
+                                                         double,
+                                                         Point             *,
+                                                         Color             *);
+static void             table_init_fonts                (Table             *);
 
 static TableAttribute *table_attribute_new (void);
 static void table_attribute_free (TableAttribute *);
@@ -85,8 +114,11 @@ static void table_update_connectionpoints (Table *);
 static void table_update_positions (Table *);
 static void table_compute_width_height (Table *);
 static TableState *table_state_new (Table *);
-static TableChange *table_change_new (Table *, TableState *,
-                                      GList *, GList *, GList *);
+static DiaObjectChange *table_change_new                (Table             *,
+                                                         TableState        *,
+                                                         GList             *,
+                                                         GList             *,
+                                                         GList             *);
 static void table_update_primary_key_font (Table *);
 
 static char *create_documentation_tag (char     *comment,
@@ -859,7 +891,8 @@ table_copy(Table * orig)
   return &copy->element.object;
 }
 
-static ObjectChange *
+
+static DiaObjectChange *
 table_move (Table *table, Point *to)
 {
   table->element.corner = *to;
@@ -867,10 +900,14 @@ table_move (Table *table, Point *to)
   return NULL;
 }
 
-static ObjectChange *
-table_move_handle (Table *table, Handle *handle,
-                   Point *to, ConnectionPoint *cp,
-                   HandleMoveReason reason, ModifierKeys modifiers)
+
+static DiaObjectChange *
+table_move_handle (Table            *table,
+                   Handle           *handle,
+                   Point            *to,
+                   ConnectionPoint  *cp,
+                   HandleMoveReason  reason,
+                   ModifierKeys      modifiers)
 {
   /* ignore this event */
   return NULL;
@@ -1326,8 +1363,9 @@ table_update_connectionpoints (Table * table)
     }
 }
 
+
 static DiaMenu *
-table_object_menu(DiaObject *obj, Point *p)
+table_object_menu (DiaObject *obj, Point *p)
 {
   table_menu_items[0].active = DIAMENU_ACTIVE|DIAMENU_TOGGLE|
     (((Table *)obj)->visible_comment ? DIAMENU_TOGGLE_ON : 0);
@@ -1335,8 +1373,9 @@ table_object_menu(DiaObject *obj, Point *p)
   return &table_menu;
 }
 
-static ObjectChange *
-table_show_comments_cb(DiaObject *obj, Point *pos, gpointer data)
+
+static DiaObjectChange *
+table_show_comments_cb (DiaObject *obj, Point *pos, gpointer data)
 {
   TableState * state;
   Table * table = (Table *) obj;
@@ -1345,9 +1384,11 @@ table_show_comments_cb(DiaObject *obj, Point *pos, gpointer data)
   table->visible_comment = !table->visible_comment;
   table_compute_width_height (table);
   table_update_positions (table);
-  return (ObjectChange *) table_change_new (table, state, NULL, NULL, NULL);
+
+  return table_change_new (table, state, NULL, NULL, NULL);
 }
 
+
 /**
  * This routine updates the font for primary keys. It depends on
  * `normal_font' and `bold_primary_key' properties of the passed table.
@@ -1547,7 +1588,8 @@ table_change_apply (TableChange * change, DiaObject * obj)
   change->applied = TRUE;
 }
 
-static TableChange *
+
+static DiaObjectChange *
 table_change_new (Table * table, TableState * saved_state,
                   GList * added, GList * deleted,
                   GList * disconnects)
@@ -1567,5 +1609,5 @@ table_change_new (Table * table, TableState * saved_state,
   change->applied = TRUE;
   change->saved_state = saved_state;
 
-  return change;
+  return dia_object_change_legacy_new ((ObjectChange *) change);
 }
diff --git a/objects/ER/attribute.c b/objects/ER/attribute.c
index 4be561b33..917d789cf 100644
--- a/objects/ER/attribute.c
+++ b/objects/ER/attribute.c
@@ -31,6 +31,7 @@
 #include "diarenderer.h"
 #include "attributes.h"
 #include "properties.h"
+#include "dia-object-change-legacy.h"
 
 #include "pixmaps/attribute.xpm"
 
@@ -85,11 +86,11 @@ struct _Attribute {
 static real attribute_distance_from(Attribute *attribute, Point *point);
 static void attribute_select(Attribute *attribute, Point *clicked_point,
                           DiaRenderer *interactive_renderer);
-static ObjectChange* attribute_move_handle(Attribute *attribute, Handle *handle,
+static DiaObjectChange* attribute_move_handle(Attribute *attribute, Handle *handle,
                                           Point *to, ConnectionPoint *cp,
                                           HandleMoveReason reason,
                                           ModifierKeys modifiers);
-static ObjectChange* attribute_move(Attribute *attribute, Point *to);
+static DiaObjectChange* attribute_move(Attribute *attribute, Point *to);
 static void attribute_draw(Attribute *attribute, DiaRenderer *renderer);
 static void attribute_update_data(Attribute *attribute);
 static DiaObject *attribute_create(Point *startpoint,
@@ -223,7 +224,7 @@ attribute_select(Attribute *attribute, Point *clicked_point,
   element_update_handles(&attribute->element);
 }
 
-static ObjectChange*
+static DiaObjectChange*
 attribute_move_handle(Attribute *attribute, Handle *handle,
                      Point *to, ConnectionPoint *cp,
                      HandleMoveReason reason, ModifierKeys modifiers)
@@ -240,7 +241,7 @@ attribute_move_handle(Attribute *attribute, Handle *handle,
   return NULL;
 }
 
-static ObjectChange*
+static DiaObjectChange*
 attribute_move(Attribute *attribute, Point *to)
 {
   attribute->element.corner = *to;
diff --git a/objects/ER/entity.c b/objects/ER/entity.c
index 7d3b9c594..3c0390576 100644
--- a/objects/ER/entity.c
+++ b/objects/ER/entity.c
@@ -69,11 +69,11 @@ struct _Entity {
 static real entity_distance_from(Entity *entity, Point *point);
 static void entity_select(Entity *entity, Point *clicked_point,
                       DiaRenderer *interactive_renderer);
-static ObjectChange* entity_move_handle(Entity *entity, Handle *handle,
+static DiaObjectChange* entity_move_handle(Entity *entity, Handle *handle,
                                        Point *to, ConnectionPoint *cp,
                                        HandleMoveReason reason,
                                        ModifierKeys modifiers);
-static ObjectChange* entity_move(Entity *entity, Point *to);
+static DiaObjectChange* entity_move(Entity *entity, Point *to);
 static void entity_draw(Entity *entity, DiaRenderer *renderer);
 static void entity_update_data(Entity *entity);
 static DiaObject *entity_create(Point *startpoint,
@@ -199,7 +199,7 @@ entity_select(Entity *entity, Point *clicked_point,
   element_update_handles(&entity->element);
 }
 
-static ObjectChange*
+static DiaObjectChange*
 entity_move_handle(Entity *entity, Handle *handle,
                   Point *to, ConnectionPoint *cp,
                   HandleMoveReason reason, ModifierKeys modifiers)
@@ -215,7 +215,7 @@ entity_move_handle(Entity *entity, Handle *handle,
   return NULL;
 }
 
-static ObjectChange*
+static DiaObjectChange*
 entity_move(Entity *entity, Point *to)
 {
   entity->element.corner = *to;
diff --git a/objects/ER/participation.c b/objects/ER/participation.c
index 57aea80bb..27fe2558e 100644
--- a/objects/ER/participation.c
+++ b/objects/ER/participation.c
@@ -51,10 +51,14 @@ struct _Participation {
 static real participation_distance_from(Participation *dep, Point *point);
 static void participation_select(Participation *dep, Point *clicked_point,
                              DiaRenderer *interactive_renderer);
-static ObjectChange* participation_move_handle(Participation *dep, Handle *handle,
-                                              Point *to, ConnectionPoint *cp,
-                                              HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* participation_move(Participation *dep, Point *to);
+static DiaObjectChange *participation_move_handle    (Participation    *dep,
+                                                      Handle           *handle,
+                                                      Point            *to,
+                                                      ConnectionPoint  *cp,
+                                                      HandleMoveReason  reason,
+                                                      ModifierKeys      modifiers);
+static DiaObjectChange *participation_move           (Participation    *dep,
+                                                      Point            *to);
 static void participation_draw(Participation *dep, DiaRenderer *renderer);
 static DiaObject *participation_create(Point *startpoint,
                                 void *user_data,
@@ -160,12 +164,17 @@ participation_select(Participation *participation, Point *clicked_point,
   orthconn_update_data(&participation->orth);
 }
 
-static ObjectChange*
-participation_move_handle(Participation *participation, Handle *handle,
-                         Point *to, ConnectionPoint *cp,
-                         HandleMoveReason reason, ModifierKeys modifiers)
+
+static DiaObjectChange *
+participation_move_handle (Participation    *participation,
+                           Handle           *handle,
+                           Point            *to,
+                           ConnectionPoint  *cp,
+                           HandleMoveReason  reason,
+                           ModifierKeys      modifiers)
 {
-  ObjectChange *change;
+  DiaObjectChange *change;
+
   assert(participation!=NULL);
   assert(handle!=NULL);
   assert(to!=NULL);
@@ -177,17 +186,19 @@ participation_move_handle(Participation *participation, Handle *handle,
   return change;
 }
 
-static ObjectChange*
+
+static DiaObjectChange *
 participation_move(Participation *participation, Point *to)
 {
-  ObjectChange *change;
+  DiaObjectChange *change;
 
-  change = orthconn_move(&participation->orth, to);
-  participation_update_data(participation);
+  change = orthconn_move (&participation->orth, to);
+  participation_update_data (participation);
 
   return change;
 }
 
+
 static void
 participation_draw (Participation *participation, DiaRenderer *renderer)
 {
@@ -379,24 +390,35 @@ participation_load(ObjectNode obj_node, int version,DiaContext *ctx)
   return &participation->orth.object;
 }
 
-static ObjectChange *
-participation_add_segment_callback(DiaObject *obj, Point *clicked, gpointer data)
+
+static DiaObjectChange *
+participation_add_segment_callback (DiaObject *obj,
+                                    Point     *clicked,
+                                    gpointer   data)
 {
-  ObjectChange *change;
-  change = orthconn_add_segment((OrthConn *)obj, clicked);
-  participation_update_data((Participation *)obj);
+  DiaObjectChange *change;
+
+  change = orthconn_add_segment ((OrthConn *) obj, clicked);
+  participation_update_data ((Participation *) obj);
+
   return change;
 }
 
-static ObjectChange *
-participation_delete_segment_callback(DiaObject *obj, Point *clicked, gpointer data)
+
+static DiaObjectChange *
+participation_delete_segment_callback (DiaObject *obj,
+                                       Point     *clicked,
+                                       gpointer   data)
 {
-  ObjectChange *change;
-  change = orthconn_delete_segment((OrthConn *)obj, clicked);
-  participation_update_data((Participation *)obj);
+  DiaObjectChange *change;
+
+  change = orthconn_delete_segment ((OrthConn *) obj, clicked);
+  participation_update_data ((Participation *) obj);
+
   return change;
 }
 
+
 static DiaMenuItem object_menu_items[] = {
   { N_("Add segment"), participation_add_segment_callback, NULL, 1 },
   { N_("Delete segment"), participation_delete_segment_callback, NULL, 1 },
diff --git a/objects/ER/relationship.c b/objects/ER/relationship.c
index 172c6b699..2066324eb 100644
--- a/objects/ER/relationship.c
+++ b/objects/ER/relationship.c
@@ -72,10 +72,10 @@ struct _Relationship {
 static double relationship_distance_from(Relationship *relationship, Point *point);
 static void relationship_select(Relationship *relationship, Point *clicked_point,
                       DiaRenderer *interactive_renderer);
-static ObjectChange* relationship_move_handle(Relationship *relationship, Handle *handle,
+static DiaObjectChange* relationship_move_handle(Relationship *relationship, Handle *handle,
                                              Point *to, ConnectionPoint *cp,
                                              HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* relationship_move(Relationship *relationship, Point *to);
+static DiaObjectChange* relationship_move(Relationship *relationship, Point *to);
 static void relationship_draw(Relationship *relationship, DiaRenderer *renderer);
 static void relationship_update_data(Relationship *relationship);
 static DiaObject *relationship_create(Point *startpoint,
@@ -218,7 +218,7 @@ relationship_select (Relationship *relationship,
 }
 
 
-static ObjectChange *
+static DiaObjectChange *
 relationship_move_handle (Relationship     *relationship,
                           Handle           *handle,
                           Point            *to,
@@ -237,7 +237,7 @@ relationship_move_handle (Relationship     *relationship,
 }
 
 
-static ObjectChange *
+static DiaObjectChange *
 relationship_move (Relationship *relationship, Point *to)
 {
   relationship->element.corner = *to;
diff --git a/objects/FS/flow-ortho.c b/objects/FS/flow-ortho.c
index 97595dfac..e8bf149df 100644
--- a/objects/FS/flow-ortho.c
+++ b/objects/FS/flow-ortho.c
@@ -29,7 +29,6 @@
 
 #include "intl.h"
 #include "object.h"
-#include "objchange.h"
 #include "connection.h"
 #include "diarenderer.h"
 #include "handle.h"
@@ -39,6 +38,7 @@
 #include "orth_conn.h"
 #include "element.h"
 #include "properties.h"
+#include "dia-object-change-legacy.h"
 
 #include "pixmaps/orthflow.xpm"
 
@@ -88,11 +88,14 @@ Color orthflow_color_signal   = { 0.0f, 0.0f, 1.0f, 1.0f };
 #define ORTHFLOW_ARROWWIDTH 0.5
 #define HANDLE_MOVE_TEXT (HANDLE_CUSTOM2)
 
-static ObjectChange* orthflow_move_handle(Orthflow *orthflow, Handle *handle,
-                                         Point *to, ConnectionPoint *cp,
-                                         HandleMoveReason reason,
-                                         ModifierKeys modifiers);
-static ObjectChange* orthflow_move(Orthflow *orthflow, Point *to);
+static DiaObjectChange *orthflow_move_handle   (Orthflow         *orthflow,
+                                                Handle           *handle,
+                                                Point            *to,
+                                                ConnectionPoint  *cp,
+                                                HandleMoveReason  reason,
+                                                ModifierKeys      modifiers);
+static DiaObjectChange *orthflow_move          (Orthflow         *orthflow,
+                                                Point            *to);
 static void orthflow_select(Orthflow *orthflow, Point *clicked_point,
                            DiaRenderer *interactive_renderer);
 static void orthflow_draw(Orthflow *orthflow, DiaRenderer *renderer);
@@ -210,7 +213,7 @@ orthflow_set_props(Orthflow *orthflow, GPtrArray *props)
 
 
 static void
-orthflow_change_apply_revert(ObjectChange* objchg, DiaObject* obj)
+orthflow_change_apply_revert (ObjectChange* objchg, DiaObject* obj)
 {
   struct _OrthflowChange* change = (struct _OrthflowChange*) objchg ;
   Orthflow* oflow = (Orthflow*) obj ;
@@ -240,40 +243,44 @@ orthflow_change_free(ObjectChange* objchg)
   }
 }
 
-static ObjectChange*
-orthflow_create_change( enum OrthflowChangeType change_type,
-                       OrthflowType type, Text* text )
+
+static DiaObjectChange*
+orthflow_create_change (enum OrthflowChangeType  change_type,
+                        OrthflowType             type,
+                        Text                    *text )
 {
-  struct _OrthflowChange* change ;
-  change = g_new0( struct _OrthflowChange, 1 ) ;
-  change->obj_change.apply = (ObjectChangeApplyFunc) orthflow_change_apply_revert ;
-  change->obj_change.revert =  (ObjectChangeRevertFunc) orthflow_change_apply_revert ;
-  change->obj_change.free =  (ObjectChangeFreeFunc) orthflow_change_free ;
-  change->change_type = change_type ;
-
-  change->type = type ;
-  if ( text ) {
-    change->text = text_get_string_copy( text ) ;
+  struct _OrthflowChange *change;
+  change = g_new0 (struct _OrthflowChange, 1);
+  change->obj_change.apply = (ObjectChangeApplyFunc) orthflow_change_apply_revert;
+  change->obj_change.revert =  (ObjectChangeRevertFunc) orthflow_change_apply_revert;
+  change->obj_change.free =  (ObjectChangeFreeFunc) orthflow_change_free;
+  change->change_type = change_type;
+
+  change->type = type;
+  if (text) {
+    change->text = text_get_string_copy (text);
   }
 
-  return (ObjectChange*) change ;
+  return dia_object_change_legacy_new ((ObjectChange *) change);
 }
 
-static real
+
+static double
 orthflow_distance_from(Orthflow *orthflow, Point *point)
 {
-  real linedist;
-  real textdist;
+  double linedist;
+  double textdist;
 
-  linedist = orthconn_distance_from( &orthflow->orth, point,
-                                    orthflow->type == ORTHFLOW_MATERIAL ?
-                                    ORTHFLOW_MATERIAL_WIDTH :
-                                    ORTHFLOW_WIDTH ) ;
-  textdist = text_distance_from( orthflow->text, point ) ;
+  linedist = orthconn_distance_from (&orthflow->orth, point,
+                                     orthflow->type == ORTHFLOW_MATERIAL ?
+                                        ORTHFLOW_MATERIAL_WIDTH :
+                                        ORTHFLOW_WIDTH);
+  textdist = text_distance_from (orthflow->text, point);
 
-  return linedist > textdist ? textdist : linedist ;
+  return linedist > textdist ? textdist : linedist;
 }
 
+
 static void
 orthflow_select(Orthflow *orthflow, Point *clicked_point,
                DiaRenderer *interactive_renderer)
@@ -284,12 +291,17 @@ orthflow_select(Orthflow *orthflow, Point *clicked_point,
   orthconn_update_data(&orthflow->orth);
 }
 
-static ObjectChange*
-orthflow_move_handle(Orthflow *orthflow, Handle *handle,
-                    Point *to, ConnectionPoint *cp,
-                    HandleMoveReason reason, ModifierKeys modifiers)
+
+static DiaObjectChange *
+orthflow_move_handle (Orthflow         *orthflow,
+                      Handle           *handle,
+                      Point            *to,
+                      ConnectionPoint  *cp,
+                      HandleMoveReason  reason,
+                      ModifierKeys      modifiers)
 {
-  ObjectChange *change = NULL;
+  DiaObjectChange *change = NULL;
+
   assert(orthflow!=NULL);
   assert(handle!=NULL);
   assert(to!=NULL);
@@ -315,25 +327,27 @@ orthflow_move_handle(Orthflow *orthflow, Handle *handle,
   return change;
 }
 
-static ObjectChange*
-orthflow_move(Orthflow *orthflow, Point *to)
+
+static DiaObjectChange *
+orthflow_move (Orthflow *orthflow, Point *to)
 {
-  ObjectChange *change;
+  DiaObjectChange *change;
 
   Point *points = &orthflow->orth.points[0];
   Point delta;
 
   delta = *to;
-  point_sub(&delta, &points[0]);
-  point_add(&orthflow->textpos, &delta);
+  point_sub (&delta, &points[0]);
+  point_add (&orthflow->textpos, &delta);
 
-  change = orthconn_move( &orthflow->orth, to ) ;
+  change = orthconn_move (&orthflow->orth, to);
 
-  orthflow_update_data(orthflow);
+  orthflow_update_data (orthflow);
 
   return change;
 }
 
+
 static void
 orthflow_draw (Orthflow *orthflow, DiaRenderer *renderer)
 {
@@ -600,11 +614,13 @@ orthflow_load(ObjectNode obj_node, int version, DiaContext *ctx)
   return &orthflow->orth.object;
 }
 
-static ObjectChange *
+
+static DiaObjectChange *
 orthflow_set_type_callback (DiaObject* obj, Point* clicked, gpointer data)
 {
-  ObjectChange* change ;
-  change = orthflow_create_change( FLOW_TYPE, ((Orthflow*)obj)->type, 0 ) ;
+  DiaObjectChange *change;
+
+  change = orthflow_create_change (FLOW_TYPE, ((Orthflow*)obj)->type, 0);
 
   ((Orthflow*)obj)->type = GPOINTER_TO_INT (data);
   orthflow_update_data((Orthflow*)obj);
@@ -612,15 +628,18 @@ orthflow_set_type_callback (DiaObject* obj, Point* clicked, gpointer data)
   return change;
 }
 
-static ObjectChange *
+
+static DiaObjectChange *
 orthflow_segment_callback (DiaObject* obj, Point* clicked, gpointer data)
 {
-  if ( GPOINTER_TO_INT (data) )
-     return orthconn_add_segment( (OrthConn*)obj, clicked ) ;
+  if (GPOINTER_TO_INT (data)) {
+    return orthconn_add_segment ((OrthConn*) obj, clicked);
+  }
 
-  return orthconn_delete_segment( (OrthConn*)obj, clicked ) ;
+  return orthconn_delete_segment ((OrthConn*) obj, clicked);
 }
 
+
 static DiaMenuItem orthflow_menu_items[] = {
   { N_("Energy"), orthflow_set_type_callback, (void*)ORTHFLOW_ENERGY, 1 },
   { N_("Material"), orthflow_set_type_callback, (void*)ORTHFLOW_MATERIAL, 1 },
diff --git a/objects/FS/flow.c b/objects/FS/flow.c
index 8deefbc29..9c23b4494 100644
--- a/objects/FS/flow.c
+++ b/objects/FS/flow.c
@@ -35,6 +35,7 @@
 #include "text.h"
 #include "connection.h"
 #include "properties.h"
+#include "dia-object-change-legacy.h"
 
 #include "pixmaps/flow.xpm"
 
@@ -67,11 +68,14 @@ struct _Flow {
 #define FLOW_ARROWWIDTH 0.5
 #define HANDLE_MOVE_TEXT (HANDLE_CUSTOM1)
 
-static ObjectChange* flow_move_handle(Flow *flow, Handle *handle,
-                                     Point *to, ConnectionPoint *cp,
-                                     HandleMoveReason reason,
-                                     ModifierKeys modifiers);
-static ObjectChange* flow_move(Flow *flow, Point *to);
+static DiaObjectChange *flow_move_handle       (Flow             *flow,
+                                                Handle           *handle,
+                                                Point            *to,
+                                                ConnectionPoint  *cp,
+                                                HandleMoveReason  reason,
+                                                ModifierKeys      modifiers);
+static DiaObjectChange *flow_move              (Flow             *flow,
+                                                Point            *to);
 static void flow_select(Flow *flow, Point *clicked_point,
                        DiaRenderer *interactive_renderer);
 static void flow_draw(Flow *flow, DiaRenderer *renderer);
@@ -212,10 +216,14 @@ flow_select(Flow *flow, Point *clicked_point,
   connection_update_handles(&flow->connection);
 }
 
-static ObjectChange*
-flow_move_handle(Flow *flow, Handle *handle,
-                Point *to, ConnectionPoint *cp,
-                HandleMoveReason reason, ModifierKeys modifiers)
+
+static DiaObjectChange *
+flow_move_handle (Flow             *flow,
+                  Handle           *handle,
+                  Point            *to,
+                  ConnectionPoint  *cp,
+                  HandleMoveReason  reason,
+                  ModifierKeys      modifiers)
 {
   Point p1, p2;
   Point *endpoints;
@@ -280,8 +288,9 @@ flow_move_handle(Flow *flow, Handle *handle,
   return NULL;
 }
 
-static ObjectChange*
-flow_move(Flow *flow, Point *to)
+
+static DiaObjectChange *
+flow_move (Flow *flow, Point *to)
 {
   Point start_to_end;
   Point *endpoints = &flow->connection.endpoints[0];
@@ -596,8 +605,9 @@ type_change_revert(struct TypeChange *change, DiaObject *obj)
   flow_update_data(flow);
 }
 
-static ObjectChange *
-type_create_change(Flow *flow, int type)
+
+static DiaObjectChange *
+type_create_change (Flow *flow, int type)
 {
   struct TypeChange *change;
 
@@ -610,21 +620,22 @@ type_create_change(Flow *flow, int type)
   change->old_type = flow->type;
   change->new_type = type;
 
-  return (ObjectChange *)change;
+  return dia_object_change_legacy_new ((ObjectChange *) change);
 }
 
 
-static ObjectChange *
+static DiaObjectChange *
 flow_set_type_callback (DiaObject* obj, Point* clicked, gpointer data)
 {
-  ObjectChange *change;
+  DiaObjectChange *change;
 
-  change = type_create_change((Flow *)obj, GPOINTER_TO_INT(data));
-  change->apply(change, obj);
+  change = type_create_change ((Flow *) obj, GPOINTER_TO_INT (data));
+  dia_object_change_apply (change, obj);
 
   return change;
 }
 
+
 static DiaMenuItem flow_menu_items[] = {
   { N_("Energy"), flow_set_type_callback, (void*)FLOW_ENERGY, 1 },
   { N_("Material"), flow_set_type_callback, (void*)FLOW_MATERIAL, 1 },
diff --git a/objects/FS/function.c b/objects/FS/function.c
index cc021b6a2..501479136 100644
--- a/objects/FS/function.c
+++ b/objects/FS/function.c
@@ -33,6 +33,7 @@
 #include "attributes.h"
 #include "text.h"
 #include "properties.h"
+#include "dia-object-change-legacy.h"
 
 #include "pixmaps/function.xpm"
 
@@ -74,14 +75,19 @@ struct _FunctionChange {
 #define FUNCTION_MARGIN_Y 2.4
 #define FUNCTION_DASHLENGTH_SCALE 2.0
 
-static real function_distance_from(Function *pkg, Point *point);
-static void function_select(Function *pkg, Point *clicked_point,
-                           DiaRenderer *interactive_renderer);
-static ObjectChange* function_move_handle(Function *pkg, Handle *handle,
-                                         Point *to, ConnectionPoint *cp,
-                                         HandleMoveReason reason,
-                                         ModifierKeys modifiers);
-static ObjectChange* function_move(Function *pkg, Point *to);
+static double           function_distance_from   (Function         *pkg,
+                                                  Point            *point);
+static void             function_select          (Function         *pkg,
+                                                  Point            *clicked_point,
+                                                  DiaRenderer      *interactive_renderer);
+static DiaObjectChange* function_move_handle     (Function         *pkg,
+                                                  Handle           *handle,
+                                                  Point            *to,
+                                                  ConnectionPoint  *cp,
+                                                  HandleMoveReason  reason,
+                                                  ModifierKeys      modifiers);
+static DiaObjectChange* function_move            (Function         *pkg,
+                                                  Point            *to);
 static void function_draw(Function *pkg, DiaRenderer *renderer);
 static DiaObject *function_create(Point *startpoint,
                               void *user_data,
@@ -217,8 +223,9 @@ function_change_free( ObjectChange* objchg )
   }
 }
 
-static ObjectChange*
-function_create_change( Function* fcn, enum FuncChangeType change_type )
+
+static DiaObjectChange *
+function_create_change (Function *fcn, enum FuncChangeType change_type)
 {
   FunctionChange* change = g_new0(FunctionChange,1) ;
   change->obj_change.apply = (ObjectChangeApplyFunc) function_change_apply_revert ;
@@ -226,24 +233,31 @@ function_create_change( Function* fcn, enum FuncChangeType change_type )
   change->obj_change.free = (ObjectChangeFreeFunc) function_change_free ;
   change->change_type = change_type ;
 
-  if ( change_type == WISH_FUNC || change_type == ALL )
-     change->is_wish = fcn->is_wish ;
+  if (change_type == WISH_FUNC || change_type == ALL) {
+    change->is_wish = fcn->is_wish;
+  }
 
-  if ( change_type == USER_FUNC || change_type == ALL )
-     change->is_user = fcn->is_user ;
+  if (change_type == USER_FUNC || change_type == ALL) {
+    change->is_user = fcn->is_user;
+  }
+
+  if (change_type == TEXT_EDIT || change_type == ALL) {
+    change->text = text_get_string_copy (fcn->text);
+  }
 
-  if ( change_type == TEXT_EDIT || change_type == ALL )
-     change->text = text_get_string_copy( fcn->text ) ;
-  return (ObjectChange*) change ;
+  return dia_object_change_legacy_new ((ObjectChange *) change);
 }
 
-static real
+
+static double
 function_distance_from(Function *pkg, Point *point)
 {
   DiaObject *obj = &pkg->element.object;
-  return distance_rectangle_point(&obj->bounding_box, point);
+
+  return distance_rectangle_point (&obj->bounding_box, point);
 }
 
+
 static void
 function_select(Function *pkg, Point *clicked_point,
                DiaRenderer *interactive_renderer)
@@ -253,10 +267,14 @@ function_select(Function *pkg, Point *clicked_point,
   element_update_handles(&pkg->element);
 }
 
-static ObjectChange*
-function_move_handle(Function *pkg, Handle *handle,
-                    Point *to, ConnectionPoint *cp,
-                    HandleMoveReason reason, ModifierKeys modifiers)
+
+static DiaObjectChange *
+function_move_handle (Function         *pkg,
+                      Handle           *handle,
+                      Point            *to,
+                      ConnectionPoint  *cp,
+                      HandleMoveReason  reason,
+                      ModifierKeys      modifiers)
 {
   assert(pkg!=NULL);
   assert(handle!=NULL);
@@ -267,15 +285,17 @@ function_move_handle(Function *pkg, Handle *handle,
   return NULL;
 }
 
-static ObjectChange*
-function_move(Function *pkg, Point *to)
+
+static DiaObjectChange*
+function_move (Function *pkg, Point *to)
 {
   pkg->element.corner = *to;
-  function_update_data(pkg);
+  function_update_data (pkg);
 
   return NULL;
 }
 
+
 static void
 function_draw (Function *pkg, DiaRenderer *renderer)
 {
@@ -587,57 +607,63 @@ function_load(ObjectNode obj_node, int version, DiaContext *ctx)
   return &pkg->element.object;
 }
 
-static ObjectChange *
-function_insert_word( Function* func, const char* word, gboolean newline )
+
+static DiaObjectChange *
+function_insert_word (Function *func, const char *word, gboolean newline)
 {
-  ObjectChange* change = function_create_change( func, TEXT_EDIT ) ;
-  char* old_chars = text_get_string_copy( func->text ) ;
-  char* new_chars = g_malloc( strlen( old_chars) + strlen( word )
-                       + ( newline ? 2 : 1) ) ;
-  sprintf( new_chars, newline ? "%s\n%s" : "%s%s", old_chars, word ) ;
-  text_set_string( func->text, new_chars ) ;
-  g_clear_pointer (&new_chars, g_free) ;
-  g_clear_pointer (&old_chars, g_free) ;
-  function_update_data( func ) ;
-  text_set_cursor_at_end( func->text ) ;
+  DiaObjectChange* change = function_create_change (func, TEXT_EDIT);
+  char *old_chars = text_get_string_copy (func->text);
+  char *new_chars = g_malloc (strlen (old_chars) + strlen (word)
+                                      + (newline ? 2 : 1));
+  sprintf (new_chars, newline ? "%s\n%s" : "%s%s", old_chars, word);
+  text_set_string (func->text, new_chars);
+  g_clear_pointer (&new_chars, g_free);
+  g_clear_pointer (&old_chars, g_free);
+  function_update_data (func);
+  text_set_cursor_at_end (func->text);
 
   return change;
 }
 
-static ObjectChange *
-function_insert_verb( DiaObject* obj, Point* clicked, gpointer data)
+
+static DiaObjectChange *
+function_insert_verb (DiaObject *obj, Point *clicked, gpointer data)
 {
-  return function_insert_word( (Function*)obj, (const char*) data, FALSE ) ;
+  return function_insert_word ((Function*) obj, (const char*) data, FALSE);
 }
 
-static ObjectChange *
-function_insert_noun( DiaObject* obj, Point* clicked, gpointer data)
+
+static DiaObjectChange *
+function_insert_noun (DiaObject *obj, Point *clicked, gpointer data)
 {
-  return function_insert_word( (Function*)obj, (const char*) data, TRUE ) ;
+  return function_insert_word ((Function*)obj, (const char*) data, TRUE);
 }
 
-static ObjectChange *
-function_toggle_user_function( DiaObject* obj, Point* clicked, gpointer data)
+
+static DiaObjectChange *
+function_toggle_user_function (DiaObject *obj, Point *clicked, gpointer data)
 {
-  Function* func = (Function*)obj ;
-  ObjectChange* change = function_create_change( func, USER_FUNC ) ;
-  func->is_user = !func->is_user ;
-  function_update_data( func ) ;
+  Function *func = (Function *) obj;
+  DiaObjectChange *change = function_create_change (func, USER_FUNC);
+  func->is_user = !func->is_user;
+  function_update_data (func);
 
   return change;
 }
 
-static ObjectChange *
-function_toggle_wish_function( DiaObject* obj, Point* clicked, gpointer data)
+
+static DiaObjectChange *
+function_toggle_wish_function (DiaObject *obj, Point *clicked, gpointer data)
 {
-  Function* func = (Function*)obj ;
-  ObjectChange* change = function_create_change( func, WISH_FUNC ) ;
-  func->is_wish = !func->is_wish ;
-  function_update_data( func ) ;
+  Function* func = (Function*) obj;
+  DiaObjectChange* change = function_create_change (func, WISH_FUNC);
+  func->is_wish = !func->is_wish;
+  function_update_data (func);
 
   return change;
 }
 
+
 struct _IndentedMenus {
   char*                        name ;
   int                  depth ;
diff --git a/objects/GRAFCET/action.c b/objects/GRAFCET/action.c
index a33e362f5..6f074ad64 100644
--- a/objects/GRAFCET/action.c
+++ b/objects/GRAFCET/action.c
@@ -62,10 +62,10 @@ typedef struct _Action {
   ConnPointLine *cps; /* aaahrg ! again one ! */
 } Action;
 
-static ObjectChange* action_move_handle(Action *action, Handle *handle,
+static DiaObjectChange* action_move_handle(Action *action, Handle *handle,
                                        Point *to, ConnectionPoint *cp,
                                        HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* action_move(Action *action, Point *to);
+static DiaObjectChange* action_move(Action *action, Point *to);
 static void action_select(Action *action, Point *clicked_point,
                              DiaRenderer *interactive_renderer);
 static void action_draw(Action *action, DiaRenderer *renderer);
@@ -191,7 +191,7 @@ action_select(Action *action, Point *clicked_point,
   text_grab_focus(action->text, &action->connection.object);
 }
 
-static ObjectChange*
+static DiaObjectChange*
 action_move_handle(Action *action, Handle *handle,
                   Point *to, ConnectionPoint *cp,
                   HandleMoveReason reason, ModifierKeys modifiers)
@@ -219,7 +219,7 @@ action_move_handle(Action *action, Handle *handle,
 }
 
 
-static ObjectChange*
+static DiaObjectChange*
 action_move(Action *action, Point *to)
 {
   Point start_to_end;
diff --git a/objects/GRAFCET/condition.c b/objects/GRAFCET/condition.c
index 424e0ed10..d001041ec 100644
--- a/objects/GRAFCET/condition.c
+++ b/objects/GRAFCET/condition.c
@@ -64,13 +64,13 @@ typedef struct _Condition {
 } Condition;
 
 
-static ObjectChange    *condition_move_handle    (Condition         *condition,
+static DiaObjectChange *condition_move_handle    (Condition         *condition,
                                                   Handle            *handle,
                                                   Point             *to,
                                                   ConnectionPoint   *cp,
                                                   HandleMoveReason   reason,
                                                   ModifierKeys       modifiers);
-static ObjectChange    *condition_move           (Condition         *condition,
+static DiaObjectChange *condition_move           (Condition         *condition,
                                                   Point             *to);
 static void             condition_select         (Condition         *condition,
                                                   Point             *clicked_point,
@@ -213,7 +213,7 @@ condition_select (Condition   *condition,
 }
 
 
-static ObjectChange*
+static DiaObjectChange *
 condition_move_handle (Condition        *condition,
                        Handle           *handle,
                        Point            *to,
@@ -302,8 +302,8 @@ condition_move_handle (Condition        *condition,
 }
 
 
-static ObjectChange*
-condition_move(Condition *condition, Point *to)
+static DiaObjectChange *
+condition_move (Condition *condition, Point *to)
 {
   Point start_to_end;
   Point *endpoints = &condition->connection.endpoints[0];
diff --git a/objects/GRAFCET/step.c b/objects/GRAFCET/step.c
index d3ada10ef..756c99295 100644
--- a/objects/GRAFCET/step.c
+++ b/objects/GRAFCET/step.c
@@ -82,18 +82,18 @@ typedef struct _Step {
 } Step;
 
 
-static real             step_distance_from  (Step              *step,
+static double           step_distance_from  (Step              *step,
                                              Point             *point);
 static void             step_select         (Step              *step,
                                              Point             *clicked_point,
                                              DiaRenderer       *interactive_renderer);
-static ObjectChange    *step_move_handle    (Step              *step,
+static DiaObjectChange *step_move_handle    (Step              *step,
                                              Handle            *handle,
                                              Point             *to,
                                              ConnectionPoint   *cp,
                                              HandleMoveReason   reason,
                                              ModifierKeys       modifiers);
-static ObjectChange    *step_move           (Step              *step,
+static DiaObjectChange *step_move           (Step              *step,
                                              Point             *to);
 static void             step_draw           (Step              *step,
                                              DiaRenderer       *renderer);
@@ -314,7 +314,7 @@ step_select (Step        *step,
 }
 
 
-static ObjectChange*
+static DiaObjectChange *
 step_move_handle (Step             *step,
                   Handle           *handle,
                   Point            *to,
@@ -371,7 +371,7 @@ step_move_handle (Step             *step,
 }
 
 
-static ObjectChange*
+static DiaObjectChange *
 step_move (Step *step, Point *to)
 {
   Point delta = *to;
diff --git a/objects/GRAFCET/transition.c b/objects/GRAFCET/transition.c
index de0f28935..3303636c9 100644
--- a/objects/GRAFCET/transition.c
+++ b/objects/GRAFCET/transition.c
@@ -74,13 +74,13 @@ typedef struct _Transition {
 } Transition;
 
 
-static ObjectChange    *transition_move_handle    (Transition        *transition,
+static DiaObjectChange *transition_move_handle    (Transition        *transition,
                                                    Handle            *handle,
                                                    Point             *to,
                                                    ConnectionPoint   *cp,
                                                    HandleMoveReason   reason,
                                                    ModifierKeys       modifiers);
-static ObjectChange    *transition_move           (Transition        *transition,
+static DiaObjectChange *transition_move           (Transition        *transition,
                                                    Point             *to);
 static void             transition_select         (Transition        *transition,
                                                    Point             *clicked_point,
@@ -314,7 +314,7 @@ transition_select (Transition  *transition,
 }
 
 
-static ObjectChange*
+static DiaObjectChange *
 transition_move_handle (Transition       *transition,
                         Handle           *handle,
                         Point            *to,
@@ -366,7 +366,7 @@ transition_move_handle (Transition       *transition,
 }
 
 
-static ObjectChange*
+static DiaObjectChange *
 transition_move (Transition *transition, Point *to)
 {
   Point delta = *to;
diff --git a/objects/GRAFCET/vector.c b/objects/GRAFCET/vector.c
index 2e83b71f0..c3c57fb02 100644
--- a/objects/GRAFCET/vector.c
+++ b/objects/GRAFCET/vector.c
@@ -50,10 +50,15 @@ typedef struct _Arc {
   gboolean uparrow;
 } Arc;
 
-static ObjectChange* arc_move_handle(Arc *arc, Handle *handle,
-                                    Point *to, ConnectionPoint *cp,
-                                    HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* arc_move(Arc *arc, Point *to);
+
+static DiaObjectChange *arc_move_handle         (Arc              *arc,
+                                                 Handle           *handle,
+                                                 Point            *to,
+                                                 ConnectionPoint  *cp,
+                                                 HandleMoveReason  reason,
+                                                 ModifierKeys      modifiers);
+static DiaObjectChange *arc_move                (Arc              *arc,
+                                                 Point            *to);
 static void arc_select(Arc *arc, Point *clicked_point,
                              DiaRenderer *interactive_renderer);
 static void arc_draw(Arc *arc, DiaRenderer *renderer);
@@ -169,30 +174,36 @@ arc_select(Arc *arc, Point *clicked_point,
   orthconn_update_data(&arc->orth);
 }
 
-static ObjectChange*
-arc_move_handle(Arc *arc, Handle *handle,
-               Point *to, ConnectionPoint *cp,
-               HandleMoveReason reason, ModifierKeys modifiers)
+
+static DiaObjectChange *
+arc_move_handle (Arc              *arc,
+                 Handle           *handle,
+                 Point            *to,
+                 ConnectionPoint  *cp,
+                 HandleMoveReason  reason,
+                 ModifierKeys      modifiers)
 {
-  ObjectChange *change;
-  change = orthconn_move_handle(&arc->orth, handle, to, cp, reason, modifiers);
-  arc_update_data(arc);
+  DiaObjectChange *change;
+
+  change = orthconn_move_handle (&arc->orth, handle, to, cp, reason, modifiers);
+  arc_update_data (arc);
 
   return change;
 }
 
 
-static ObjectChange*
-arc_move(Arc *arc, Point *to)
+static DiaObjectChange *
+arc_move (Arc *arc, Point *to)
 {
-  ObjectChange *change;
+  DiaObjectChange *change;
 
-  change = orthconn_move(&arc->orth, to);
-  arc_update_data(arc);
+  change = orthconn_move (&arc->orth, to);
+  arc_update_data (arc);
 
   return change;
 }
 
+
 static void
 arc_draw (Arc *arc, DiaRenderer *renderer)
 {
@@ -288,30 +299,37 @@ arc_update_data(Arc *arc)
 }
 
 
-static ObjectChange *
-arc_add_segment_callback(DiaObject *obj, Point *clicked, gpointer data)
+static DiaObjectChange *
+arc_add_segment_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
-  ObjectChange *change;
-  change = orthconn_add_segment((OrthConn *)obj, clicked);
-  arc_update_data((Arc *)obj);
+  DiaObjectChange *change;
+
+  change = orthconn_add_segment ((OrthConn *) obj, clicked);
+  arc_update_data ((Arc *) obj);
+
   return change;
 }
 
-static ObjectChange *
-arc_delete_segment_callback(DiaObject *obj, Point *clicked, gpointer data)
+
+static DiaObjectChange *
+arc_delete_segment_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
-  ObjectChange *change;
-  change = orthconn_delete_segment((OrthConn *)obj, clicked);
-  arc_update_data((Arc *)obj);
+  DiaObjectChange *change;
+
+  change = orthconn_delete_segment ((OrthConn *) obj, clicked);
+  arc_update_data ((Arc *) obj);
+
   return change;
 }
 
+
 static DiaMenuItem object_menu_items[] = {
   { N_("Add segment"), arc_add_segment_callback, NULL, 1 },
   { N_("Delete segment"), arc_delete_segment_callback, NULL, 1 },
   ORTHCONN_COMMON_MENUS,
 };
 
+
 static DiaMenu object_menu = {
   "Arc",
   sizeof(object_menu_items)/sizeof(DiaMenuItem),
diff --git a/objects/GRAFCET/vergent.c b/objects/GRAFCET/vergent.c
index e85c62eb3..2b17eab58 100644
--- a/objects/GRAFCET/vergent.c
+++ b/objects/GRAFCET/vergent.c
@@ -34,6 +34,7 @@
 #include "properties.h"
 #include "geometry.h"
 #include "connpoint_line.h"
+#include "dia-object-change-legacy.h"
 
 #include "grafcet.h"
 
@@ -54,13 +55,13 @@ typedef struct _Vergent {
 } Vergent;
 
 
-static ObjectChange    *vergent_move_handle     (Vergent          *vergent,
+static DiaObjectChange *vergent_move_handle     (Vergent          *vergent,
                                                  Handle           *handle,
                                                  Point            *to,
                                                  ConnectionPoint  *cp,
                                                  HandleMoveReason  reason,
                                                  ModifierKeys      modifiers);
-static ObjectChange    *vergent_move            (Vergent          *vergent,
+static DiaObjectChange *vergent_move            (Vergent          *vergent,
                                                  Point            *to);
 static void             vergent_select          (Vergent          *vergent,
                                                  Point            *clicked_point,
@@ -215,7 +216,7 @@ vergent_select (Vergent     *vergent,
 }
 
 
-static ObjectChange*
+static DiaObjectChange *
 vergent_move_handle (Vergent          *vergent,
                      Handle           *handle,
                      Point            *to,
@@ -251,7 +252,7 @@ vergent_move_handle (Vergent          *vergent,
 }
 
 
-static ObjectChange*
+static DiaObjectChange *
 vergent_move (Vergent *vergent, Point *to)
 {
   Point start_to_end;
@@ -381,42 +382,35 @@ vergent_update_data (Vergent *vergent)
 typedef struct {
   ObjectChange obj_change;
 
-  ObjectChange *north,*south;
+  DiaObjectChange *north, *south;
 } VergentChange;
 
 
 static void
 vergent_change_apply (VergentChange *change, DiaObject *obj)
 {
-  change->north->apply (change->north, obj);
-  change->south->apply (change->south, obj);
+  dia_object_change_apply (change->north, obj);
+  dia_object_change_apply (change->south, obj);
 }
 
 
 static void
 vergent_change_revert (VergentChange *change, DiaObject *obj)
 {
-  change->north->revert (change->north,obj);
-  change->south->revert (change->south,obj);
+  dia_object_change_revert (change->north,obj);
+  dia_object_change_revert (change->south,obj);
 }
 
 
 static void
 vergent_change_free (VergentChange *change)
 {
-  if (change->north->free) {
-    change->north->free (change->north);
-  }
-  g_clear_pointer (&change->north, g_free);
-
-  if (change->south->free) {
-    change->south->free (change->south);
-  }
-  g_clear_pointer (&change->south, g_free);
+  g_clear_pointer (&change->north, dia_object_change_unref);
+  g_clear_pointer (&change->south, dia_object_change_unref);
 }
 
 
-static ObjectChange *
+static DiaObjectChange *
 vergent_create_change (Vergent *vergent, int add, Point *clicked)
 {
   VergentChange *vc;
@@ -436,18 +430,18 @@ vergent_create_change (Vergent *vergent, int add, Point *clicked)
 
   vergent_update_data (vergent);
 
-  return (ObjectChange *) vc;
+  return dia_object_change_legacy_new ((ObjectChange *) vc);
 }
 
 
-static ObjectChange *
+static DiaObjectChange *
 vergent_add_cp_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
   return vergent_create_change ((Vergent *) obj, 1, clicked);
 }
 
 
-static ObjectChange *
+static DiaObjectChange *
 vergent_delete_cp_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
   return vergent_create_change ((Vergent *) obj, 0, clicked);
diff --git a/objects/Istar/actor.c b/objects/Istar/actor.c
index b3ca944c8..47d9f5724 100644
--- a/objects/Istar/actor.c
+++ b/objects/Istar/actor.c
@@ -81,10 +81,10 @@ struct _Actor {
 static real actor_distance_from(Actor *actor, Point *point);
 static void actor_select(Actor *actor, Point *clicked_point,
                       DiaRenderer *interactive_renderer);
-static ObjectChange* actor_move_handle(Actor *actor, Handle *handle,
+static DiaObjectChange* actor_move_handle(Actor *actor, Handle *handle,
                            Point *to, ConnectionPoint *cp,
                            HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* actor_move(Actor *actor, Point *to);
+static DiaObjectChange* actor_move(Actor *actor, Point *to);
 static void actor_draw(Actor *actor, DiaRenderer *renderer);
 static void actor_update_data(Actor *actor, AnchorShape h,AnchorShape v);
 static DiaObject *actor_create(Point *startpoint,
@@ -206,7 +206,7 @@ actor_select (Actor       *actor,
 }
 
 
-static ObjectChange*
+static DiaObjectChange*
 actor_move_handle (Actor            *actor,
                    Handle           *handle,
                    Point            *to,
@@ -273,7 +273,7 @@ actor_move_handle (Actor            *actor,
 }
 
 
-static ObjectChange*
+static DiaObjectChange*
 actor_move (Actor *actor, Point *to)
 {
   actor->element.corner = *to;
diff --git a/objects/Istar/goal.c b/objects/Istar/goal.c
index 21530c032..1cce48b12 100644
--- a/objects/Istar/goal.c
+++ b/objects/Istar/goal.c
@@ -88,10 +88,10 @@ typedef struct _Goal {
 static real goal_distance_from(Goal *goal, Point *point);
 static void goal_select(Goal *goal, Point *clicked_point,
                       DiaRenderer *interactive_renderer);
-static ObjectChange* goal_move_handle(Goal *goal, Handle *handle,
+static DiaObjectChange* goal_move_handle(Goal *goal, Handle *handle,
                            Point *to, ConnectionPoint *cp,
                            HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* goal_move(Goal *goal, Point *to);
+static DiaObjectChange* goal_move(Goal *goal, Point *to);
 static void goal_draw(Goal *goal, DiaRenderer *renderer);
 static void goal_update_data(Goal *goal, AnchorShape horix, AnchorShape vert);
 static DiaObject *goal_create(Point *startpoint,
@@ -212,7 +212,7 @@ goal_select(Goal *goal, Point *clicked_point,
 }
 
 
-static ObjectChange*
+static DiaObjectChange*
 goal_move_handle (Goal             *goal,
                   Handle           *handle,
                   Point            *to,
@@ -278,7 +278,7 @@ goal_move_handle (Goal             *goal,
 }
 
 
-static ObjectChange*
+static DiaObjectChange*
 goal_move (Goal *goal, Point *to)
 {
   goal->element.corner = *to;
diff --git a/objects/Istar/link.c b/objects/Istar/link.c
index 96868d648..36fbc0ea8 100644
--- a/objects/Istar/link.c
+++ b/objects/Istar/link.c
@@ -81,10 +81,10 @@ struct _Link {
 
 static DiaFont *link_font = NULL;
 
-static ObjectChange* link_move_handle(Link *link, Handle *handle,
+static DiaObjectChange* link_move_handle(Link *link, Handle *handle,
                                   Point *to, ConnectionPoint *cp,
                                   HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* link_move(Link *link, Point *to);
+static DiaObjectChange* link_move(Link *link, Point *to);
 static void link_select(Link *link, Point *clicked_point,
                              DiaRenderer *interactive_renderer);
 static void link_draw(Link *link, DiaRenderer *renderer);
@@ -208,7 +208,7 @@ link_select(Link *link, Point *clicked_point,
   connection_update_handles(&link->connection);
 }
 
-static ObjectChange*
+static DiaObjectChange*
 link_move_handle(Link *link, Handle *handle,
                 Point *to, ConnectionPoint *cp,
                 HandleMoveReason reason, ModifierKeys modifiers)
@@ -237,7 +237,7 @@ link_move_handle(Link *link, Handle *handle,
   return NULL;
 }
 
-static ObjectChange*
+static DiaObjectChange*
 link_move(Link *link, Point *to)
 {
   Point start_to_end;
diff --git a/objects/Istar/other.c b/objects/Istar/other.c
index 29ce602aa..0fac9f982 100644
--- a/objects/Istar/other.c
+++ b/objects/Istar/other.c
@@ -85,10 +85,14 @@ typedef struct _Other {
 static real other_distance_from(Other *other, Point *point);
 static void other_select(Other *other, Point *clicked_point,
                       DiaRenderer *interactive_renderer);
-static ObjectChange* other_move_handle(Other *other, Handle *handle,
-                           Point *to, ConnectionPoint *cp,
-                           HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* other_move(Other *other, Point *to);
+static DiaObjectChange *other_move_handle        (Other            *other,
+                                                  Handle           *handle,
+                                                  Point            *to,
+                                                  ConnectionPoint  *cp,
+                                                  HandleMoveReason  reason,
+                                                  ModifierKeys      modifiers);
+static DiaObjectChange *other_move               (Other            *other,
+                                                  Point            *to);
 static void other_draw(Other *other, DiaRenderer *renderer);
 static void other_update_data(Other *other, AnchorShape horix, AnchorShape vert);
 static DiaObject *other_create(Point *startpoint,
@@ -216,7 +220,7 @@ other_select (Other       *other,
 }
 
 
-static ObjectChange*
+static DiaObjectChange *
 other_move_handle (Other            *other,
                    Handle           *handle,
                    Point            *to,
@@ -283,7 +287,7 @@ other_move_handle (Other            *other,
 }
 
 
-static ObjectChange*
+static DiaObjectChange *
 other_move (Other *other, Point *to)
 {
   other->element.corner = *to;
@@ -485,43 +489,52 @@ other_get_clicked_border (Other *other, Point *clicked)
   return cpl;
 }
 
-inline static ObjectChange *
-other_create_change(Other *other, ObjectChange *inner, ConnPointLine *cpl) {
-  return (ObjectChange *)inner;
+
+inline static DiaObjectChange *
+other_create_change (Other *other, DiaObjectChange *inner, ConnPointLine *cpl)
+{
+  return (DiaObjectChange *) inner;
 }
 
-static ObjectChange *
-other_add_connpoint_callback(DiaObject *obj, Point *clicked, gpointer data)
+
+static DiaObjectChange *
+other_add_connpoint_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
-  ObjectChange *change;
+  DiaObjectChange *change;
   ConnPointLine *cpl;
   Other *other = (Other *)obj;
 
-  cpl = other_get_clicked_border(other,clicked);
-  change = connpointline_add_point(cpl, clicked);
-  other_update_data((Other *)obj,ANCHOR_MIDDLE, ANCHOR_MIDDLE);
-  return other_create_change(other,change,cpl);
+  cpl = other_get_clicked_border (other,clicked);
+  change = connpointline_add_point (cpl, clicked);
+  other_update_data ((Other *) obj, ANCHOR_MIDDLE, ANCHOR_MIDDLE);
+
+  return other_create_change (other, change, cpl);
 }
 
-static ObjectChange *
-other_remove_connpoint_callback(DiaObject *obj, Point *clicked, gpointer data)
+
+static DiaObjectChange *
+other_remove_connpoint_callback (DiaObject *obj,
+                                 Point     *clicked,
+                                 gpointer   data)
 {
-  ObjectChange *change;
+  DiaObjectChange *change;
   ConnPointLine *cpl;
-  Other *other = (Other *)obj;
+  Other *other = (Other *) obj;
 
-  cpl = other_get_clicked_border(other,clicked);
-  change = connpointline_remove_point(cpl, clicked);
-  other_update_data((Other *)obj,ANCHOR_MIDDLE, ANCHOR_MIDDLE);
-  return other_create_change(other,change,cpl);
+  cpl = other_get_clicked_border (other, clicked);
+  change = connpointline_remove_point (cpl, clicked);
+  other_update_data ((Other *) obj, ANCHOR_MIDDLE, ANCHOR_MIDDLE);
+  return other_create_change (other, change, cpl);
 }
 
+
 static DiaMenuItem object_menu_items[] = {
   { N_("Add connection point"), other_add_connpoint_callback, NULL, 1 },
   { N_("Delete connection point"), other_remove_connpoint_callback,
     NULL, 1 },
 };
 
+
 static DiaMenu object_menu = {
   N_("i* other"),
   sizeof(object_menu_items)/sizeof(DiaMenuItem),
@@ -529,8 +542,9 @@ static DiaMenu object_menu = {
   NULL
 };
 
+
 static DiaMenu *
-other_get_object_menu(Other *other, Point *clickedpoint)
+other_get_object_menu (Other *other, Point *clickedpoint)
 {
   ConnPointLine *cpl;
 
diff --git a/objects/Jackson/domain.c b/objects/Jackson/domain.c
index b1e1fdac9..b2022032f 100644
--- a/objects/Jackson/domain.c
+++ b/objects/Jackson/domain.c
@@ -112,10 +112,14 @@ typedef struct _Box {
 static real jackson_box_distance_from(Box *box, Point *point);
 static void jackson_box_select(Box *box, Point *clicked_point,
                       DiaRenderer *interactive_renderer);
-static ObjectChange* jackson_box_move_handle(Box *box, Handle *handle,
-                           Point *to, ConnectionPoint *cp,
-                           HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* jackson_box_move(Box *box, Point *to);
+static DiaObjectChange *jackson_box_move_handle  (Box             *box,
+                                                  Handle          *handle,
+                                                  Point           *to,
+                                                  ConnectionPoint *cp,
+                                                  HandleMoveReason reason,
+                                                  ModifierKeys     modifiers);
+static DiaObjectChange *jackson_box_move         (Box             *box,
+                                                  Point           *to);
 static void jackson_box_draw(Box *box, DiaRenderer *renderer);
 static void jackson_box_update_data(Box *box, AnchorShape horix, AnchorShape vert);
 static DiaObject *jackson_box_create(Point *startpoint,
@@ -276,7 +280,7 @@ jackson_box_select (Box         *box,
 }
 
 
-static ObjectChange*
+static DiaObjectChange *
 jackson_box_move_handle (Box              *box,
                          Handle           *handle,
                          Point            *to,
@@ -342,7 +346,7 @@ jackson_box_move_handle (Box              *box,
 }
 
 
-static ObjectChange*
+static DiaObjectChange *
 jackson_box_move (Box *box, Point *to)
 {
   box->element.corner = *to;
@@ -567,19 +571,21 @@ jackson_box_get_clicked_border (Box *box, Point *clicked)
 }
 
 
-inline static ObjectChange *
-jackson_box_create_change (Box *box, ObjectChange *inner, ConnPointLine *cpl)
+inline static DiaObjectChange *
+jackson_box_create_change (Box             *box,
+                           DiaObjectChange *inner,
+                           ConnPointLine   *cpl)
 {
-  return (ObjectChange *) inner;
+  return (DiaObjectChange *) inner;
 }
 
 
-static ObjectChange *
+static DiaObjectChange *
 jackson_box_add_connpoint_callback (DiaObject *obj,
                                     Point     *clicked,
                                     gpointer   data)
 {
-  ObjectChange *change;
+  DiaObjectChange *change;
   ConnPointLine *cpl;
   Box *box = (Box *)obj;
 
@@ -591,12 +597,12 @@ jackson_box_add_connpoint_callback (DiaObject *obj,
 }
 
 
-static ObjectChange *
+static DiaObjectChange *
 jackson_box_remove_connpoint_callback (DiaObject *obj,
                                        Point     *clicked,
                                        gpointer   data)
 {
-  ObjectChange *change;
+  DiaObjectChange *change;
   ConnPointLine *cpl;
   Box *box = (Box *)obj;
 
diff --git a/objects/Jackson/phenomenon.c b/objects/Jackson/phenomenon.c
index 942fbdf11..0bf609d0a 100644
--- a/objects/Jackson/phenomenon.c
+++ b/objects/Jackson/phenomenon.c
@@ -74,10 +74,10 @@ struct _Message {
 
 static DiaFont *message_font = NULL;
 
-static ObjectChange* message_move_handle(Message *message, Handle *handle,
+static DiaObjectChange* message_move_handle(Message *message, Handle *handle,
                                   Point *to, ConnectionPoint *cp,
                                   HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* message_move(Message *message, Point *to);
+static DiaObjectChange* message_move(Message *message, Point *to);
 static void message_select(Message *message, Point *clicked_point,
                              DiaRenderer *interactive_renderer);
 static void message_draw(Message *message, DiaRenderer *renderer);
@@ -200,7 +200,7 @@ message_select(Message *message, Point *clicked_point,
   connection_update_handles(&message->connection);
 }
 
-static ObjectChange*
+static DiaObjectChange*
 message_move_handle(Message *message, Handle *handle,
                 Point *to, ConnectionPoint *cp,
                 HandleMoveReason reason, ModifierKeys modifiers)
@@ -230,7 +230,7 @@ message_move_handle(Message *message, Handle *handle,
   return NULL;
 }
 
-static ObjectChange*
+static DiaObjectChange*
 message_move(Message *message, Point *to)
 {
   Point start_to_end;
diff --git a/objects/Jackson/requirement.c b/objects/Jackson/requirement.c
index 3d31321c0..0d975b6d7 100644
--- a/objects/Jackson/requirement.c
+++ b/objects/Jackson/requirement.c
@@ -69,10 +69,10 @@ struct _Requirement {
 static real req_distance_from(Requirement *req, Point *point);
 static void req_select(Requirement *req, Point *clicked_point,
                           DiaRenderer *interactive_renderer);
-static ObjectChange* req_move_handle(Requirement *req, Handle *handle,
+static DiaObjectChange* req_move_handle(Requirement *req, Handle *handle,
                                Point *to, ConnectionPoint *cp,
                                HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* req_move(Requirement *req, Point *to);
+static DiaObjectChange* req_move(Requirement *req, Point *to);
 static void req_draw(Requirement *req, DiaRenderer *renderer);
 static DiaObject *req_create(Point *startpoint,
                              void *user_data,
@@ -184,7 +184,7 @@ req_select(Requirement *req, Point *clicked_point,
   element_update_handles(&req->element);
 }
 
-static ObjectChange*
+static DiaObjectChange*
 req_move_handle(Requirement *req, Handle *handle,
                 Point *to, ConnectionPoint *cp,
                HandleMoveReason reason, ModifierKeys modifiers)
@@ -197,7 +197,7 @@ req_move_handle(Requirement *req, Handle *handle,
   return NULL;
 }
 
-static ObjectChange*
+static DiaObjectChange*
 req_move(Requirement *req, Point *to)
 {
   real h;
diff --git a/objects/KAOS/goal.c b/objects/KAOS/goal.c
index acedfb2e1..f86ebcef7 100644
--- a/objects/KAOS/goal.c
+++ b/objects/KAOS/goal.c
@@ -96,13 +96,19 @@ typedef struct _Goal {
 } Goal;
 
 
-static real goal_distance_from(Goal *goal, Point *point);
-static void goal_select(Goal *goal, Point *clicked_point,
-                      DiaRenderer *interactive_renderer);
-static ObjectChange* goal_move_handle(Goal *goal, Handle *handle,
-                           Point *to, ConnectionPoint *cp,
-                           HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* goal_move(Goal *goal, Point *to);
+static double           goal_distance_from             (Goal             *goal,
+                                                        Point            *point);
+static void             goal_select                    (Goal             *goal,
+                                                        Point            *clicked_point,
+                                                        DiaRenderer      *interactive_renderer);
+static DiaObjectChange *goal_move_handle               (Goal             *goal,
+                                                        Handle           *handle,
+                                                        Point            *to,
+                                                        ConnectionPoint  *cp,
+                                                        HandleMoveReason  reason,
+                                                        ModifierKeys      modifiers);
+static DiaObjectChange *goal_move                      (Goal             *goal,
+                                                        Point            *to);
 static void goal_draw(Goal *goal, DiaRenderer *renderer);
 static void goal_update_data(Goal *goal, AnchorShape horix, AnchorShape vert);
 static DiaObject *goal_create(Point *startpoint,
@@ -244,7 +250,7 @@ goal_select (Goal        *goal,
 }
 
 
-static ObjectChange*
+static DiaObjectChange *
 goal_move_handle (Goal             *goal,
                   Handle           *handle,
                   Point            *to,
@@ -259,7 +265,11 @@ goal_move_handle (Goal             *goal,
   g_return_val_if_fail (to != NULL, NULL);
 
   element_move_handle (&goal->element,
-                       handle->id, to, cp, reason, modifiers);
+                       handle->id,
+                       to,
+                       cp,
+                       reason,
+                       modifiers);
 
   switch (handle->id) {
     case HANDLE_RESIZE_NW:
@@ -311,7 +321,7 @@ goal_move_handle (Goal             *goal,
 }
 
 
-static ObjectChange*
+static DiaObjectChange*
 goal_move (Goal *goal, Point *to)
 {
   goal->element.corner = *to;
@@ -616,17 +626,17 @@ goal_get_clicked_border (Goal *goal, Point *clicked)
 }
 
 
-inline static ObjectChange *
-goal_create_change (Goal *goal, ObjectChange *inner, ConnPointLine *cpl)
+inline static DiaObjectChange *
+goal_create_change (Goal *goal, DiaObjectChange *inner, ConnPointLine *cpl)
 {
-  return (ObjectChange *) inner;
+  return (DiaObjectChange *) inner;
 }
 
 
-static ObjectChange *
-goal_add_connpoint_callback(DiaObject *obj, Point *clicked, gpointer data)
+static DiaObjectChange *
+goal_add_connpoint_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
-  ObjectChange *change;
+  DiaObjectChange *change;
   ConnPointLine *cpl;
   Goal *goal = (Goal *)obj;
 
@@ -636,10 +646,11 @@ goal_add_connpoint_callback(DiaObject *obj, Point *clicked, gpointer data)
   return goal_create_change(goal,change,cpl);
 }
 
-static ObjectChange *
-goal_remove_connpoint_callback(DiaObject *obj, Point *clicked, gpointer data)
+
+static DiaObjectChange *
+goal_remove_connpoint_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
-  ObjectChange *change;
+  DiaObjectChange *change;
   ConnPointLine *cpl;
   Goal *goal = (Goal *)obj;
 
diff --git a/objects/KAOS/metaandorrel.c b/objects/KAOS/metaandorrel.c
index 78475a899..af518d44c 100644
--- a/objects/KAOS/metaandorrel.c
+++ b/objects/KAOS/metaandorrel.c
@@ -85,10 +85,10 @@ struct _Maor {
 
 static DiaFont *maor_font = NULL;
 
-static ObjectChange* maor_move_handle(Maor *maor, Handle *handle,
+static DiaObjectChange* maor_move_handle(Maor *maor, Handle *handle,
                                   Point *to, ConnectionPoint *cp,
                                   HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* maor_move(Maor *maor, Point *to);
+static DiaObjectChange* maor_move(Maor *maor, Point *to);
 static void maor_select(Maor *maor, Point *clicked_point,
                              DiaRenderer *interactive_renderer);
 static void maor_draw(Maor *maor, DiaRenderer *renderer);
@@ -220,7 +220,7 @@ maor_select(Maor *maor, Point *clicked_point,
   connection_update_handles(&maor->connection);
 }
 
-static ObjectChange*
+static DiaObjectChange*
 maor_move_handle(Maor *maor, Handle *handle,
                 Point *to, ConnectionPoint *cp,
                 HandleMoveReason reason, ModifierKeys modifiers)
@@ -250,7 +250,7 @@ maor_move_handle(Maor *maor, Handle *handle,
   return NULL;
 }
 
-static ObjectChange*
+static DiaObjectChange*
 maor_move(Maor *maor, Point *to)
 {
   Point start_to_end;
diff --git a/objects/KAOS/metabinrel.c b/objects/KAOS/metabinrel.c
index 0a1f5579e..d491555dd 100644
--- a/objects/KAOS/metabinrel.c
+++ b/objects/KAOS/metabinrel.c
@@ -93,10 +93,10 @@ static Color color_red = { 1.0f, 0.0f, 0.0f, 1.0f };
 
 static DiaFont *mbr_font = NULL;
 
-static ObjectChange* mbr_move_handle(Mbr *mbr, Handle *handle,
+static DiaObjectChange* mbr_move_handle(Mbr *mbr, Handle *handle,
                                   Point *to, ConnectionPoint *cp,
                                   HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* mbr_move(Mbr *mbr, Point *to);
+static DiaObjectChange* mbr_move(Mbr *mbr, Point *to);
 static void mbr_select(Mbr *mbr, Point *clicked_point,
                              DiaRenderer *interactive_renderer);
 static void mbr_draw(Mbr *mbr, DiaRenderer *renderer);
@@ -219,7 +219,7 @@ mbr_select(Mbr *mbr, Point *clicked_point,
   connection_update_handles(&mbr->connection);
 }
 
-static ObjectChange*
+static DiaObjectChange*
 mbr_move_handle(Mbr *mbr, Handle *handle,
                 Point *to, ConnectionPoint *cp,
                 HandleMoveReason reason, ModifierKeys modifiers)
@@ -248,7 +248,7 @@ mbr_move_handle(Mbr *mbr, Handle *handle,
   return NULL;
 }
 
-static ObjectChange*
+static DiaObjectChange*
 mbr_move(Mbr *mbr, Point *to)
 {
   Point start_to_end;
diff --git a/objects/KAOS/other.c b/objects/KAOS/other.c
index 9ac428060..5f0983dbe 100644
--- a/objects/KAOS/other.c
+++ b/objects/KAOS/other.c
@@ -77,7 +77,7 @@ typedef struct _Other {
   ConnPointLine *north,*south,*east,*west;
 
   Text *text;
-  real padding;
+  double padding;
   OtherType type;
 
   int init;
@@ -85,13 +85,19 @@ typedef struct _Other {
   ConnectionPoint center_cp;
 } Other;
 
-static real other_distance_from(Other *other, Point *point);
-static void other_select(Other *other, Point *clicked_point,
-                      DiaRenderer *interactive_renderer);
-static ObjectChange* other_move_handle(Other *other, Handle *handle,
-                           Point *to, ConnectionPoint *cp,
-                           HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* other_move(Other *other, Point *to);
+
+static double           other_distance_from            (Other            *other,
+                                                        Point            *point);
+static void             other_select                   (Other            *other,
+                                                        Point            *clicked_point,
+                                                        DiaRenderer      *interactive_renderer);
+static DiaObjectChange* other_move_handle              (Other            *other,
+                                                        Handle           *handle,
+                                                        Point            *to,
+                                                        ConnectionPoint  *cp,
+                                                        HandleMoveReason  reason,
+                                                        ModifierKeys      modifiers);
+static DiaObjectChange* other_move(Other *other, Point *to);
 static void other_draw(Other *other, DiaRenderer *renderer);
 static void other_update_data(Other *other, AnchorShape horix, AnchorShape vert);
 static DiaObject *other_create(Point *startpoint,
@@ -221,7 +227,7 @@ other_select (Other       *other,
 }
 
 
-static ObjectChange*
+static DiaObjectChange *
 other_move_handle (Other            *other,
                    Handle           *handle,
                    Point            *to,
@@ -288,7 +294,7 @@ other_move_handle (Other            *other,
 }
 
 
-static ObjectChange*
+static DiaObjectChange *
 other_move (Other *other, Point *to)
 {
   other->element.corner = *to;
@@ -555,39 +561,44 @@ other_get_clicked_border (Other *other, Point *clicked)
 }
 
 
-inline static ObjectChange *
-other_create_change (Other *other, ObjectChange *inner, ConnPointLine *cpl)
+inline static DiaObjectChange *
+other_create_change (Other           *other,
+                     DiaObjectChange *inner,
+                     ConnPointLine   *cpl)
 {
-  return (ObjectChange *) inner;
+  return (DiaObjectChange *) inner;
 }
 
 
-static ObjectChange *
+static DiaObjectChange *
 other_add_connpoint_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
-  ObjectChange *change;
+  DiaObjectChange *change;
   ConnPointLine *cpl;
-  Other *other = (Other *)obj;
+  Other *other = (Other *) obj;
+
+  cpl = other_get_clicked_border (other,clicked);
+  change = connpointline_add_point (cpl, clicked);
+  other_update_data ((Other *) obj, ANCHOR_MIDDLE, ANCHOR_MIDDLE);
 
-  cpl = other_get_clicked_border(other,clicked);
-  change = connpointline_add_point(cpl, clicked);
-  other_update_data((Other *)obj,ANCHOR_MIDDLE, ANCHOR_MIDDLE);
-  return other_create_change(other,change,cpl);
+  return other_create_change (other, change, cpl);
 }
 
-static ObjectChange *
-other_remove_connpoint_callback(DiaObject *obj, Point *clicked, gpointer data)
+
+static DiaObjectChange *
+other_remove_connpoint_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
-  ObjectChange *change;
+  DiaObjectChange *change;
   ConnPointLine *cpl;
-  Other *other = (Other *)obj;
+  Other *other = (Other *) obj;
 
-  cpl = other_get_clicked_border(other,clicked);
-  change = connpointline_remove_point(cpl, clicked);
-  other_update_data((Other *)obj,ANCHOR_MIDDLE, ANCHOR_MIDDLE);
-  return other_create_change(other,change,cpl);
+  cpl = other_get_clicked_border (other, clicked);
+  change = connpointline_remove_point (cpl, clicked);
+  other_update_data((Other *) obj, ANCHOR_MIDDLE, ANCHOR_MIDDLE);
+  return other_create_change (other, change, cpl);
 }
 
+
 static DiaMenuItem object_menu_items[] = {
   { N_("Add connection point"), other_add_connpoint_callback, NULL, 1 },
   { N_("Delete connection point"), other_remove_connpoint_callback,
diff --git a/objects/Misc/analog_clock.c b/objects/Misc/analog_clock.c
index 07055d0fe..f5f218a07 100644
--- a/objects/Misc/analog_clock.c
+++ b/objects/Misc/analog_clock.c
@@ -67,11 +67,11 @@ static real analog_clock_distance_from(Analog_Clock *analog_clock,
 static void analog_clock_select(Analog_Clock *analog_clock,
                                 Point *clicked_point,
                                 DiaRenderer *interactive_renderer);
-static ObjectChange* analog_clock_move_handle(Analog_Clock *analog_clock,
+static DiaObjectChange* analog_clock_move_handle(Analog_Clock *analog_clock,
                                              Handle *handle, Point *to,
                                              ConnectionPoint *cp, HandleMoveReason reason,
                                      ModifierKeys modifiers);
-static ObjectChange* analog_clock_move(Analog_Clock *analog_clock, Point *to);
+static DiaObjectChange* analog_clock_move(Analog_Clock *analog_clock, Point *to);
 static void analog_clock_draw(Analog_Clock *analog_clock, DiaRenderer *renderer);
 static void analog_clock_update_data(Analog_Clock *analog_clock);
 static DiaObject *analog_clock_create(Point *startpoint,
@@ -201,7 +201,7 @@ analog_clock_select(Analog_Clock *analog_clock, Point *clicked_point,
   element_update_handles(&analog_clock->element);
 }
 
-static ObjectChange*
+static DiaObjectChange*
 analog_clock_move_handle(Analog_Clock *analog_clock, Handle *handle,
                         Point *to, ConnectionPoint *cp,
                         HandleMoveReason reason, ModifierKeys modifiers)
@@ -217,7 +217,7 @@ analog_clock_move_handle(Analog_Clock *analog_clock, Handle *handle,
   return NULL;
 }
 
-static ObjectChange*
+static DiaObjectChange*
 analog_clock_move(Analog_Clock *analog_clock, Point *to)
 {
   analog_clock->element.corner = *to;
diff --git a/objects/Misc/diagram_as_object.c b/objects/Misc/diagram_as_object.c
index 2654a3a90..92580a09f 100644
--- a/objects/Misc/diagram_as_object.c
+++ b/objects/Misc/diagram_as_object.c
@@ -150,7 +150,7 @@ _dae_select(DiagramAsElement *dae, Point *clicked_point, DiaRenderer *interactiv
 {
   element_update_handles(&dae->element);
 }
-static ObjectChange*
+static DiaObjectChange*
 _dae_move_handle(DiagramAsElement *dae, Handle *handle,
                 Point *to, ConnectionPoint *cp,
                 HandleMoveReason reason, ModifierKeys modifiers)
@@ -166,7 +166,7 @@ _dae_move_handle(DiagramAsElement *dae, Handle *handle,
 
   return NULL;
 }
-static ObjectChange*
+static DiaObjectChange*
 _dae_move(DiagramAsElement *dae, Point *to)
 {
   dae->element.corner = *to;
diff --git a/objects/Misc/grid_object.c b/objects/Misc/grid_object.c
index ac2bc99cb..2ee926058 100644
--- a/objects/Misc/grid_object.c
+++ b/objects/Misc/grid_object.c
@@ -65,11 +65,11 @@ static real grid_object_distance_from(Grid_Object *grid_object,
 static void grid_object_select(Grid_Object *grid_object,
                                 Point *clicked_point,
                                 DiaRenderer *interactive_renderer);
-static ObjectChange* grid_object_move_handle(Grid_Object *grid_object,
+static DiaObjectChange* grid_object_move_handle(Grid_Object *grid_object,
                                              Handle *handle, Point *to,
                                              ConnectionPoint *cp, HandleMoveReason reason,
                                      ModifierKeys modifiers);
-static ObjectChange* grid_object_move(Grid_Object *grid_object, Point *to);
+static DiaObjectChange* grid_object_move(Grid_Object *grid_object, Point *to);
 static void grid_object_draw(Grid_Object *grid_object, DiaRenderer *renderer);
 static void grid_object_update_data(Grid_Object *grid_object);
 static DiaObject *grid_object_create(Point *startpoint,
@@ -200,7 +200,7 @@ grid_object_select(Grid_Object *grid_object, Point *clicked_point,
   element_update_handles(&grid_object->element);
 }
 
-static ObjectChange*
+static DiaObjectChange*
 grid_object_move_handle(Grid_Object *grid_object, Handle *handle,
                         Point *to, ConnectionPoint *cp,
                         HandleMoveReason reason, ModifierKeys modifiers)
@@ -216,7 +216,7 @@ grid_object_move_handle(Grid_Object *grid_object, Handle *handle,
   return NULL;
 }
 
-static ObjectChange*
+static DiaObjectChange*
 grid_object_move(Grid_Object *grid_object, Point *to)
 {
   grid_object->element.corner = *to;
diff --git a/objects/Misc/measure.c b/objects/Misc/measure.c
index 1305bf15d..1357cc324 100644
--- a/objects/Misc/measure.c
+++ b/objects/Misc/measure.c
@@ -80,11 +80,11 @@ DiaObjectType measure_type =
 DiaObjectType *_measure_type = (DiaObjectType *) &measure_type;
 
 /* Class definition */
-static ObjectChange* measure_move_handle (Measure *measure,
+static DiaObjectChange* measure_move_handle (Measure *measure,
                                           Handle *handle,
                                          Point *to, ConnectionPoint *cp,
                                          HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* measure_move (Measure *measure, Point *to);
+static DiaObjectChange* measure_move (Measure *measure, Point *to);
 static void measure_select(Measure *measure, Point *clicked_point,
                           DiaRenderer *interactive_renderer);
 static void measure_draw(Measure *measure, DiaRenderer *renderer);
@@ -319,7 +319,7 @@ measure_select(Measure *measure, Point *clicked_point,
 {
   connection_update_handles(&measure->connection);
 }
-static ObjectChange*
+static DiaObjectChange*
 measure_move_handle (Measure *measure,
                      Handle *handle,
                     Point *to, ConnectionPoint *cp,
@@ -336,7 +336,7 @@ measure_get_object_menu(Measure *measure,
   return NULL;
 }
 
-static ObjectChange*
+static DiaObjectChange*
 measure_move (Measure *measure, Point *to)
 {
   Point start_to_end;
diff --git a/objects/Misc/n_gon.c b/objects/Misc/n_gon.c
index 777aecb88..93d579f37 100644
--- a/objects/Misc/n_gon.c
+++ b/objects/Misc/n_gon.c
@@ -183,13 +183,18 @@ _ngon_select(Ngon *ng, Point *clicked_point, DiaRenderer *interactive_renderer)
 {
   element_update_handles(&ng->element);
 }
-static ObjectChange*
-_ngon_move_handle (Ngon *ng, Handle *handle,
-                  Point *to, ConnectionPoint *cp,
-                  HandleMoveReason reason, ModifierKeys modifiers)
+
+
+static DiaObjectChange *
+_ngon_move_handle (Ngon             *ng,
+                   Handle           *handle,
+                   Point            *to,
+                   ConnectionPoint  *cp,
+                   HandleMoveReason  reason,
+                   ModifierKeys      modifiers)
 {
   Element *elem = &ng->element;
-  ObjectChange *change = NULL; /* stays NULL for fully reversible move handle */
+  DiaObjectChange *change = NULL; /* stays NULL for fully reversible move handle */
 
   g_return_val_if_fail (handle!=NULL, NULL);
   g_return_val_if_fail (to!=NULL, NULL);
@@ -203,25 +208,28 @@ _ngon_move_handle (Ngon *ng, Handle *handle,
     real d1 = distance_point_point (to, &ng->center);
     ng->ray_len *= (d1 / d0);
     /* not sure if this is useful at all, but we must not do it with our center_handle */
-    change = element_move_handle(elem, handle->id, to, cp, reason, modifiers);
+    change = element_move_handle (elem, handle->id, to, cp, reason, modifiers);
   }
 
-  _ngon_update_data(ng);
+  _ngon_update_data (ng);
 
   return change;
 }
+
+
 /*!
  * \brief Move the object, to is relative to former object position
  */
-static ObjectChange*
-_ngon_move(Ngon *ng, Point *to)
+static DiaObjectChange *
+_ngon_move (Ngon *ng, Point *to)
 {
   ng->center = *to;
-  _ngon_update_data(ng);
+  _ngon_update_data (ng);
 
   return NULL;
 }
 
+
 static void
 _ngon_draw (Ngon *ng, DiaRenderer *renderer)
 {
diff --git a/objects/Misc/tree.c b/objects/Misc/tree.c
index dd9612748..0269108e6 100644
--- a/objects/Misc/tree.c
+++ b/objects/Misc/tree.c
@@ -29,6 +29,7 @@
 #include "attributes.h"
 #include "properties.h"
 #include "diamenu.h"
+#include "dia-object-change-legacy.h"
 
 #include "pixmaps/tree.xpm"
 
@@ -65,10 +66,14 @@ struct PointChange {
   ConnectionPoint *connected_to; /* NULL if not connected */
 };
 
-static ObjectChange* tree_move_handle(Tree *tree, Handle *handle,
-                                    Point *to, ConnectionPoint *cp,
-                                    HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* tree_move(Tree *tree, Point *to);
+static DiaObjectChange *tree_move_handle         (Tree             *tree,
+                                                  Handle           *handle,
+                                                  Point            *to,
+                                                  ConnectionPoint  *cp,
+                                                  HandleMoveReason  reason,
+                                                  ModifierKeys      modifiers);
+static DiaObjectChange *tree_move                (Tree             *tree,
+                                                  Point            *to);
 static void tree_select(Tree *tree, Point *clicked_point,
                       DiaRenderer *interactive_renderer);
 static void tree_draw(Tree *tree, DiaRenderer *renderer);
@@ -88,14 +93,14 @@ static void tree_save(Tree *tree, ObjectNode obj_node, DiaContext *ctx);
 static DiaObject *tree_load(ObjectNode obj_node, int version,DiaContext *ctx);
 static DiaMenu *tree_get_object_menu(Tree *tree, Point *clickedpoint);
 
-static ObjectChange *
-tree_create_change(Tree *tree, enum change_type type,
-                 Point *point, Handle *handle,
-                 ConnectionPoint *connected_to);
+static DiaObjectChange *tree_create_change (Tree             *tree,
+                                            enum change_type  type,
+                                            Point            *point,
+                                            Handle           *handle,
+                                            ConnectionPoint  *connected_to);
 
 
-static ObjectTypeOps tree_type_ops =
-{
+static ObjectTypeOps tree_type_ops = {
   (CreateFunc) tree_create,
   (LoadFunc)   tree_load,
   (SaveFunc)   tree_save,
@@ -190,10 +195,14 @@ tree_select(Tree *tree, Point *clicked_point,
   connection_update_handles(&tree->connection);
 }
 
-static ObjectChange*
-tree_move_handle(Tree *tree, Handle *handle,
-               Point *to, ConnectionPoint *cp,
-               HandleMoveReason reason, ModifierKeys modifiers)
+
+static DiaObjectChange *
+tree_move_handle (Tree             *tree,
+                  Handle           *handle,
+                  Point            *to,
+                  ConnectionPoint  *cp,
+                  HandleMoveReason  reason,
+                  ModifierKeys      modifiers)
 {
   Connection *conn = &tree->connection;
   Point *endpoints;
@@ -263,8 +272,9 @@ tree_move_handle(Tree *tree, Handle *handle,
   return NULL;
 }
 
-static ObjectChange*
-tree_move(Tree *tree, Point *to)
+
+static DiaObjectChange *
+tree_move (Tree *tree, Point *to)
 {
   Point delta;
   Point *endpoints = &tree->connection.endpoints[0];
@@ -535,19 +545,21 @@ tree_remove_handle(Tree *tree, Handle *handle)
   }
 }
 
-static ObjectChange *
+
+static DiaObjectChange *
 tree_add_handle_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
   Tree *tree = (Tree *) obj;
   Handle *handle;
 
-  handle = g_new0(Handle,1);
-  tree_add_handle(tree, clicked, handle);
-  tree_update_data(tree);
+  handle = g_new0 (Handle, 1);
+  tree_add_handle (tree, clicked, handle);
+  tree_update_data (tree);
 
-  return tree_create_change(tree, TYPE_ADD_POINT, clicked, handle, NULL);
+  return tree_create_change (tree, TYPE_ADD_POINT, clicked, handle, NULL);
 }
 
+
 static int
 tree_point_near_handle(Tree *tree, Point *p)
 {
@@ -572,7 +584,8 @@ tree_point_near_handle(Tree *tree, Point *p)
     return -1;
 }
 
-static ObjectChange *
+
+static DiaObjectChange *
 tree_delete_handle_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
   Tree *tree = (Tree *) obj;
@@ -743,10 +756,12 @@ tree_change_revert (struct PointChange *change, DiaObject *obj)
 }
 
 
-static ObjectChange *
-tree_create_change(Tree *tree, enum change_type type,
-                 Point *point, Handle *handle,
-                 ConnectionPoint *connected_to)
+static DiaObjectChange *
+tree_create_change (Tree             *tree,
+                    enum change_type  type,
+                    Point            *point,
+                    Handle           *handle,
+                    ConnectionPoint  *connected_to)
 {
   struct PointChange *change;
 
@@ -762,5 +777,5 @@ tree_create_change(Tree *tree, enum change_type type,
   change->handle = handle;
   change->connected_to = connected_to;
 
-  return (ObjectChange *)change;
+  return dia_object_change_legacy_new ((ObjectChange *) change);
 }
diff --git a/objects/SADT/annotation.c b/objects/SADT/annotation.c
index 7ed1ffdd7..b8d676917 100644
--- a/objects/SADT/annotation.c
+++ b/objects/SADT/annotation.c
@@ -57,10 +57,10 @@ typedef struct _Annotation {
 
 #define HANDLE_MOVE_TEXT (HANDLE_CUSTOM1)
 
-static ObjectChange* annotation_move_handle(Annotation *annotation, Handle *handle,
+static DiaObjectChange* annotation_move_handle(Annotation *annotation, Handle *handle,
                                            Point *to, ConnectionPoint *cp,
                                            HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* annotation_move(Annotation *annotation, Point *to);
+static DiaObjectChange* annotation_move(Annotation *annotation, Point *to);
 static void annotation_select(Annotation *annotation, Point *clicked_point,
                              DiaRenderer *interactive_renderer);
 static void annotation_draw(Annotation *annotation, DiaRenderer *renderer);
@@ -209,7 +209,7 @@ annotation_select(Annotation *annotation, Point *clicked_point,
   connection_update_handles(&annotation->connection);
 }
 
-static ObjectChange*
+static DiaObjectChange*
 annotation_move_handle(Annotation *annotation, Handle *handle,
                       Point *to, ConnectionPoint *cp,
                       HandleMoveReason reason, ModifierKeys modifiers)
@@ -249,7 +249,7 @@ annotation_move_handle(Annotation *annotation, Handle *handle,
   return NULL;
 }
 
-static ObjectChange*
+static DiaObjectChange*
 annotation_move(Annotation *annotation, Point *to)
 {
   Point start_to_end;
diff --git a/objects/SADT/arrow.c b/objects/SADT/arrow.c
index 57d4ccd93..eaa0d2243 100644
--- a/objects/SADT/arrow.c
+++ b/objects/SADT/arrow.c
@@ -66,10 +66,15 @@ typedef struct _Sadtarrow {
   Color line_color;
 } Sadtarrow;
 
-static ObjectChange* sadtarrow_move_handle(Sadtarrow *sadtarrow, Handle *handle,
-                                          Point *to, ConnectionPoint *cp,
-                                          HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* sadtarrow_move(Sadtarrow *sadtarrow, Point *to);
+
+static DiaObjectChange *sadtarrow_move_handle        (Sadtarrow        *sadtarrow,
+                                                      Handle           *handle,
+                                                      Point            *to,
+                                                      ConnectionPoint  *cp,
+                                                      HandleMoveReason  reason,
+                                                      ModifierKeys      modifiers);
+static DiaObjectChange *sadtarrow_move               (Sadtarrow        *sadtarrow,
+                                                      Point            *to);
 static void sadtarrow_select(Sadtarrow *sadtarrow, Point *clicked_point,
                              DiaRenderer *interactive_renderer);
 static void sadtarrow_draw(Sadtarrow *sadtarrow, DiaRenderer *renderer);
@@ -197,12 +202,17 @@ sadtarrow_select(Sadtarrow *sadtarrow, Point *clicked_point,
   orthconn_update_data(&sadtarrow->orth);
 }
 
-static ObjectChange*
-sadtarrow_move_handle(Sadtarrow *sadtarrow, Handle *handle,
-                     Point *to, ConnectionPoint *cp,
-                     HandleMoveReason reason, ModifierKeys modifiers)
+
+static DiaObjectChange *
+sadtarrow_move_handle (Sadtarrow        *sadtarrow,
+                       Handle           *handle,
+                       Point            *to,
+                       ConnectionPoint  *cp,
+                       HandleMoveReason  reason,
+                       ModifierKeys      modifiers)
 {
-  ObjectChange *change;
+  DiaObjectChange *change;
+
   assert(sadtarrow!=NULL);
   assert(handle!=NULL);
   assert(to!=NULL);
@@ -215,17 +225,18 @@ sadtarrow_move_handle(Sadtarrow *sadtarrow, Handle *handle,
 }
 
 
-static ObjectChange*
-sadtarrow_move(Sadtarrow *sadtarrow, Point *to)
+static DiaObjectChange *
+sadtarrow_move (Sadtarrow *sadtarrow, Point *to)
 {
-  ObjectChange *change;
+  DiaObjectChange *change;
 
-  change = orthconn_move(&sadtarrow->orth, to);
-  sadtarrow_update_data(sadtarrow);
+  change = orthconn_move (&sadtarrow->orth, to);
+  sadtarrow_update_data (sadtarrow);
 
   return change;
 }
 
+
 static void draw_dot(DiaRenderer *renderer,
                     Point *end, Point *vect, Color *col);
 static void draw_tunnel(DiaRenderer *renderer,
@@ -452,24 +463,31 @@ sadtarrow_update_data(Sadtarrow *sadtarrow)
   orthconn_update_boundingbox (orth);
 }
 
-static ObjectChange *
-sadtarrow_add_segment_callback(DiaObject *obj, Point *clicked, gpointer data)
+
+static DiaObjectChange *
+sadtarrow_add_segment_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
-  ObjectChange *change;
-  change = orthconn_add_segment((OrthConn *)obj, clicked);
-  sadtarrow_update_data((Sadtarrow *)obj);
+  DiaObjectChange *change;
+
+  change = orthconn_add_segment ((OrthConn *) obj, clicked);
+  sadtarrow_update_data ((Sadtarrow *) obj);
+
   return change;
 }
 
-static ObjectChange *
-sadtarrow_delete_segment_callback(DiaObject *obj, Point *clicked, gpointer data)
+
+static DiaObjectChange *
+sadtarrow_delete_segment_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
-  ObjectChange *change;
-  change = orthconn_delete_segment((OrthConn *)obj, clicked);
-  sadtarrow_update_data((Sadtarrow *)obj);
+  DiaObjectChange *change;
+
+  change = orthconn_delete_segment ((OrthConn *) obj, clicked);
+  sadtarrow_update_data ((Sadtarrow *) obj);
+
   return change;
 }
 
+
 static DiaMenuItem object_menu_items[] = {
   { N_("Add segment"), sadtarrow_add_segment_callback, NULL, 1 },
   { N_("Delete segment"), sadtarrow_delete_segment_callback, NULL, 1 },
diff --git a/objects/SADT/box.c b/objects/SADT/box.c
index bf5c7a673..1a34cd3e1 100644
--- a/objects/SADT/box.c
+++ b/objects/SADT/box.c
@@ -60,8 +60,8 @@ typedef struct _Box {
   ConnPointLine *north,*south,*east,*west;
 
   Text *text;
-  gchar *id;
-  real padding;
+  char *id;
+  double padding;
 
   Color line_color;
   Color fill_color;
@@ -70,11 +70,14 @@ typedef struct _Box {
 static real sadtbox_distance_from(Box *box, Point *point);
 static void sadtbox_select(Box *box, Point *clicked_point,
                       DiaRenderer *interactive_renderer);
-static ObjectChange* sadtbox_move_handle(Box *box, Handle *handle,
-                                        Point *to, ConnectionPoint *cp,
-                                        HandleMoveReason reason,
-                           ModifierKeys modifiers);
-static ObjectChange* sadtbox_move(Box *box, Point *to);
+static DiaObjectChange *sadtbox_move_handle          (Box             *box,
+                                                      Handle          *handle,
+                                                      Point           *to,
+                                                      ConnectionPoint *cp,
+                                                      HandleMoveReason  reason,
+                                                      ModifierKeys      modifiers);
+static DiaObjectChange *sadtbox_move                 (Box              *box,
+                                                      Point            *to);
 static void sadtbox_draw(Box *box, DiaRenderer *renderer);
 static void sadtbox_update_data(Box *box, AnchorShape horix, AnchorShape vert);
 static DiaObject *sadtbox_create(Point *startpoint,
@@ -215,7 +218,7 @@ sadtbox_select (Box         *box,
 }
 
 
-static ObjectChange*
+static DiaObjectChange *
 sadtbox_move_handle (Box              *box,
                      Handle           *handle,
                      Point            *to,
@@ -276,16 +279,17 @@ sadtbox_move_handle (Box              *box,
 }
 
 
-static ObjectChange*
-sadtbox_move(Box *box, Point *to)
+static DiaObjectChange*
+sadtbox_move (Box *box, Point *to)
 {
   box->element.corner = *to;
 
-  sadtbox_update_data(box, ANCHOR_MIDDLE, ANCHOR_MIDDLE);
+  sadtbox_update_data (box, ANCHOR_MIDDLE, ANCHOR_MIDDLE);
 
   return NULL;
 }
 
+
 static void
 sadtbox_draw (Box *box, DiaRenderer *renderer)
 {
@@ -450,37 +454,46 @@ sadtbox_get_clicked_border (Box *box, Point *clicked)
   return cpl;
 }
 
-inline static ObjectChange *
-sadtbox_create_change(Box *box, ObjectChange *inner, ConnPointLine *cpl) {
-  return (ObjectChange *)inner;
+
+inline static DiaObjectChange *
+sadtbox_create_change (Box *box, DiaObjectChange *inner, ConnPointLine *cpl)
+{
+  return (DiaObjectChange *)inner;
 }
 
-static ObjectChange *
-sadtbox_add_connpoint_callback(DiaObject *obj, Point *clicked, gpointer data)
+
+static DiaObjectChange *
+sadtbox_add_connpoint_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
-  ObjectChange *change;
+  DiaObjectChange *change;
   ConnPointLine *cpl;
   Box *box = (Box *)obj;
 
-  cpl = sadtbox_get_clicked_border(box,clicked);
-  change = connpointline_add_point(cpl, clicked);
-  sadtbox_update_data((Box *)obj,ANCHOR_MIDDLE, ANCHOR_MIDDLE);
-  return sadtbox_create_change(box,change,cpl);
+  cpl = sadtbox_get_clicked_border (box, clicked);
+  change = connpointline_add_point (cpl, clicked);
+  sadtbox_update_data ((Box *) obj, ANCHOR_MIDDLE, ANCHOR_MIDDLE);
+
+  return sadtbox_create_change (box, change, cpl);
 }
 
-static ObjectChange *
-sadtbox_remove_connpoint_callback(DiaObject *obj, Point *clicked, gpointer data)
+
+static DiaObjectChange *
+sadtbox_remove_connpoint_callback (DiaObject *obj,
+                                   Point     *clicked,
+                                   gpointer   data)
 {
-  ObjectChange *change;
+  DiaObjectChange *change;
   ConnPointLine *cpl;
   Box *box = (Box *)obj;
 
-  cpl = sadtbox_get_clicked_border(box,clicked);
-  change = connpointline_remove_point(cpl, clicked);
-  sadtbox_update_data((Box *)obj,ANCHOR_MIDDLE, ANCHOR_MIDDLE);
-  return sadtbox_create_change(box,change,cpl);
+  cpl = sadtbox_get_clicked_border (box, clicked);
+  change = connpointline_remove_point (cpl, clicked);
+  sadtbox_update_data ((Box *) obj, ANCHOR_MIDDLE, ANCHOR_MIDDLE);
+
+  return sadtbox_create_change (box, change, cpl);
 }
 
+
 static DiaMenuItem object_menu_items[] = {
   { N_("Add connection point"), sadtbox_add_connpoint_callback, NULL, 1 },
   { N_("Delete connection point"), sadtbox_remove_connpoint_callback,
diff --git a/objects/UML/activity.c b/objects/UML/activity.c
index 061919845..b131316df 100644
--- a/objects/UML/activity.c
+++ b/objects/UML/activity.c
@@ -61,10 +61,10 @@ struct _State {
 static real state_distance_from(State *state, Point *point);
 static void state_select(State *state, Point *clicked_point,
                        DiaRenderer *interactive_renderer);
-static ObjectChange* state_move_handle(State *state, Handle *handle,
+static DiaObjectChange* state_move_handle(State *state, Handle *handle,
                                       Point *to, ConnectionPoint *cp,
                                       HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* state_move(State *state, Point *to);
+static DiaObjectChange* state_move(State *state, Point *to);
 static void state_draw(State *state, DiaRenderer *renderer);
 static DiaObject *state_create_activity(Point *startpoint,
                           void *user_data,
@@ -180,7 +180,7 @@ state_select(State *state, Point *clicked_point,
   element_update_handles(&state->element);
 }
 
-static ObjectChange*
+static DiaObjectChange*
 state_move_handle(State *state, Handle *handle,
                  Point *to, ConnectionPoint *cp,
                  HandleMoveReason reason, ModifierKeys modifiers)
@@ -194,7 +194,7 @@ state_move_handle(State *state, Handle *handle,
   return NULL;
 }
 
-static ObjectChange*
+static DiaObjectChange*
 state_move(State *state, Point *to)
 {
   state->element.corner = *to;
diff --git a/objects/UML/actor.c b/objects/UML/actor.c
index b34cc4c30..630a2fe17 100644
--- a/objects/UML/actor.c
+++ b/objects/UML/actor.c
@@ -57,10 +57,14 @@ struct _Actor {
 static real actor_distance_from(Actor *actor, Point *point);
 static void actor_select(Actor *actor, Point *clicked_point,
                        DiaRenderer *interactive_renderer);
-static ObjectChange* actor_move_handle(Actor *actor, Handle *handle,
-                                      Point *to, ConnectionPoint *cp,
-                                      HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* actor_move(Actor *actor, Point *to);
+static DiaObjectChange *actor_move_handle (Actor            *actor,
+                                           Handle           *handle,
+                                           Point            *to,
+                                           ConnectionPoint  *cp,
+                                           HandleMoveReason  reason,
+                                           ModifierKeys      modifiers);
+static DiaObjectChange *actor_move        (Actor            *actor,
+                                           Point            *to);
 static void actor_draw(Actor *actor, DiaRenderer *renderer);
 static DiaObject *actor_create(Point *startpoint,
                           void *user_data,
@@ -174,12 +178,16 @@ actor_select(Actor *actor, Point *clicked_point,
   element_update_handles(&actor->element);
 }
 
-static ObjectChange*
-actor_move_handle(Actor *actor, Handle *handle,
-                 Point *to, ConnectionPoint *cp,
-                 HandleMoveReason reason, ModifierKeys modifiers)
+
+static DiaObjectChange *
+actor_move_handle (Actor            *actor,
+                   Handle           *handle,
+                   Point            *to,
+                   ConnectionPoint  *cp,
+                   HandleMoveReason  reason,
+                   ModifierKeys      modifiers)
 {
-  ObjectChange* oc;
+  DiaObjectChange *oc;
 
   assert(actor!=NULL);
   assert(handle!=NULL);
@@ -192,8 +200,9 @@ actor_move_handle(Actor *actor, Handle *handle,
   return oc;
 }
 
-static ObjectChange*
-actor_move(Actor *actor, Point *to)
+
+static DiaObjectChange *
+actor_move (Actor *actor, Point *to)
 {
   Element *elem = &actor->element;
 
diff --git a/objects/UML/association.c b/objects/UML/association.c
index 91862c4b4..c15c84277 100644
--- a/objects/UML/association.c
+++ b/objects/UML/association.c
@@ -61,7 +61,7 @@
 #include "attributes.h"
 #include "arrows.h"
 #include "uml.h"
-
+#include "dia-object-change-legacy.h"
 #include "properties.h"
 
 #include "pixmaps/association.xpm"
@@ -149,12 +149,17 @@ struct _Association {
 #define ASSOCIATION_END_SPACE (assoc->font_height/4)
 
 static real association_distance_from(Association *assoc, Point *point);
-static void association_select(Association *assoc, Point *clicked_point,
-                              DiaRenderer *interactive_renderer);
-static ObjectChange* association_move_handle(Association *assoc, Handle *handle,
-                                            Point *to, ConnectionPoint *cp,
-                                            HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* association_move(Association *assoc, Point *to);
+static void             association_select      (Association      *assoc,
+                                                 Point            *clicked_point,
+                                                 DiaRenderer      *interactive_renderer);
+static DiaObjectChange *association_move_handle (Association      *assoc,
+                                                 Handle           *handle,
+                                                 Point            *to,
+                                                 ConnectionPoint  *cp,
+                                                 HandleMoveReason  reason,
+                                                 ModifierKeys      modifiers);
+static DiaObjectChange* association_move        (Association      *assoc,
+                                                 Point            *to);
 static void association_draw(Association *assoc, DiaRenderer *renderer);
 static DiaObject *association_create(Point *startpoint,
                                  void *user_data,
@@ -346,29 +351,35 @@ association_select(Association *assoc, Point *clicked_point,
   orthconn_update_data(&assoc->orth);
 }
 
-static ObjectChange*
-association_move_handle(Association *assoc, Handle *handle,
-                       Point *to, ConnectionPoint *cp,
-                       HandleMoveReason reason, ModifierKeys modifiers)
+
+static DiaObjectChange*
+association_move_handle (Association      *assoc,
+                         Handle           *handle,
+                         Point            *to,
+                         ConnectionPoint  *cp,
+                         HandleMoveReason  reason,
+                         ModifierKeys      modifiers)
 {
-  ObjectChange *change;
+  DiaObjectChange *change;
+
   assert(assoc!=NULL);
   assert(handle!=NULL);
   assert(to!=NULL);
 
-  change = orthconn_move_handle(&assoc->orth, handle, to, cp, reason, modifiers);
-  association_update_data(assoc);
+  change = orthconn_move_handle (&assoc->orth, handle, to, cp, reason, modifiers);
+  association_update_data (assoc);
 
   return change;
 }
 
-static ObjectChange*
-association_move(Association *assoc, Point *to)
+
+static DiaObjectChange *
+association_move (Association *assoc, Point *to)
 {
-  ObjectChange *change;
+  DiaObjectChange *change;
 
-  change = orthconn_move(&assoc->orth, to);
-  association_update_data(assoc);
+  change = orthconn_move (&assoc->orth, to);
+  association_update_data (assoc);
 
   return change;
 }
@@ -865,12 +876,12 @@ association_create (Point   *startpoint,
 }
 
 
-static ObjectChange *
+static DiaObjectChange *
 association_add_segment_callback (DiaObject *obj,
                                   Point     *clicked,
                                   gpointer   data)
 {
-  ObjectChange *change;
+  DiaObjectChange *change;
 
   change = orthconn_add_segment ((OrthConn *) obj, clicked);
   association_update_data ((Association *) obj);
@@ -879,12 +890,12 @@ association_add_segment_callback (DiaObject *obj,
 }
 
 
-static ObjectChange *
+static DiaObjectChange *
 association_delete_segment_callback (DiaObject *obj,
                                      Point     *clicked,
                                      gpointer   data)
 {
-  ObjectChange *change;
+  DiaObjectChange *change;
 
   change = orthconn_delete_segment ((OrthConn *) obj, clicked);
   association_update_data ((Association *) obj);
diff --git a/objects/UML/branch.c b/objects/UML/branch.c
index 09936470e..4cf140781 100644
--- a/objects/UML/branch.c
+++ b/objects/UML/branch.c
@@ -56,10 +56,10 @@ static const double BRANCH_HEIGHT = 2.0;
 
 static real branch_distance_from(Branch *branch, Point *point);
 static void branch_select(Branch *branch, Point *clicked_point, DiaRenderer *interactive_renderer);
-static ObjectChange* branch_move_handle(Branch *branch, Handle *handle,
+static DiaObjectChange* branch_move_handle(Branch *branch, Handle *handle,
                                        Point *to, ConnectionPoint *cp,
                                        HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* branch_move(Branch *branch, Point *to);
+static DiaObjectChange* branch_move(Branch *branch, Point *to);
 static void branch_draw(Branch *branch, DiaRenderer *renderer);
 static DiaObject *branch_create(Point *startpoint,
                             void *user_data,
@@ -162,7 +162,7 @@ branch_select(Branch *branch, Point *clicked_point, DiaRenderer *interactive_ren
   element_update_handles(&branch->element);
 }
 
-static ObjectChange*
+static DiaObjectChange*
 branch_move_handle(Branch *branch, Handle *handle,
                   Point *to, ConnectionPoint *cp,
                   HandleMoveReason reason, ModifierKeys modifiers)
@@ -185,7 +185,7 @@ branch_move_handle(Branch *branch, Handle *handle,
   return NULL;
 }
 
-static ObjectChange*
+static DiaObjectChange*
 branch_move(Branch *branch, Point *to)
 {
   branch->element.corner = *to;
diff --git a/objects/UML/class.c b/objects/UML/class.c
index dcd86be76..b945770b1 100644
--- a/objects/UML/class.c
+++ b/objects/UML/class.c
@@ -34,7 +34,7 @@
 #include "attributes.h"
 #include "properties.h"
 #include "diamenu.h"
-
+#include "dia-object-change-legacy.h"
 #include "class.h"
 
 #include "pixmaps/umlclass.xpm"
@@ -49,9 +49,14 @@
 static real umlclass_distance_from(UMLClass *umlclass, Point *point);
 static void umlclass_select(UMLClass *umlclass, Point *clicked_point,
                            DiaRenderer *interactive_renderer);
-static ObjectChange* umlclass_move_handle(UMLClass *umlclass, Handle *handle,
-                                Point *to, ConnectionPoint *cp, HandleMoveReason reason, ModifierKeys 
modifiers);
-static ObjectChange* umlclass_move(UMLClass *umlclass, Point *to);
+static DiaObjectChange *umlclass_move_handle         (UMLClass         *umlclass,
+                                                      Handle           *handle,
+                                                      Point            *to,
+                                                      ConnectionPoint  *cp,
+                                                      HandleMoveReason  reason,
+                                                      ModifierKeys      modifiers);
+static DiaObjectChange *umlclass_move                (UMLClass         *umlclass,
+                                                      Point            *to);
 static void umlclass_draw(UMLClass *umlclass, DiaRenderer *renderer);
 static DiaObject *umlclass_create(Point *startpoint,
                               void *user_data,
@@ -65,8 +70,12 @@ static void umlclass_save(UMLClass *umlclass, ObjectNode obj_node,
 static DiaObject *umlclass_load(ObjectNode obj_node, int version, DiaContext *ctx);
 
 static DiaMenu * umlclass_object_menu(DiaObject *obj, Point *p);
-static ObjectChange *umlclass_show_comments_callback(DiaObject *obj, Point *pos, gpointer data);
-static ObjectChange *umlclass_allow_resizing_callback(DiaObject *obj, Point *pos, gpointer data);
+static DiaObjectChange *umlclass_show_comments_callback   (DiaObject *obj,
+                                                           Point     *pos,
+                                                           gpointer   data);
+static DiaObjectChange *umlclass_allow_resizing_callback  (DiaObject *obj,
+                                                           Point     *pos,
+                                                           gpointer   data);
 
 static PropDescription *umlclass_describe_props(UMLClass *umlclass);
 static void umlclass_get_props(UMLClass *umlclass, GPtrArray *props);
@@ -75,7 +84,8 @@ static void umlclass_set_props(UMLClass *umlclass, GPtrArray *props);
 static void fill_in_fontdata(UMLClass *umlclass);
 static int umlclass_num_dynamic_connectionpoints(UMLClass *class);
 
-static ObjectChange *_umlclass_apply_props_from_dialog(UMLClass *umlclass, GtkWidget *widget);
+static DiaObjectChange *_umlclass_apply_props_from_dialog (UMLClass  *umlclass,
+                                                           GtkWidget *widget);
 
 static ObjectTypeOps umlclass_type_ops =
 {
@@ -240,7 +250,8 @@ static PropDescription umlclass_props[] = {
   PROP_DESC_END
 };
 
-ObjectChange *
+
+DiaObjectChange *
 _umlclass_apply_props_from_dialog(UMLClass *umlclass, GtkWidget *widget)
 {
   DiaObject *obj = &umlclass->element.object;
@@ -251,6 +262,7 @@ _umlclass_apply_props_from_dialog(UMLClass *umlclass, GtkWidget *widget)
     return umlclass_apply_props_from_dialog (umlclass, widget);
 }
 
+
 static PropDescription *
 umlclass_describe_props(UMLClass *umlclass)
 {
@@ -390,26 +402,33 @@ _comment_set_state (DiaObject *obj, ObjectState *state)
 }
 
 
-static ObjectChange *
-umlclass_show_comments_callback(DiaObject *obj, Point *pos, gpointer data)
+static DiaObjectChange *
+umlclass_show_comments_callback (DiaObject *obj, Point *pos, gpointer data)
 {
   ObjectState *old_state = _comment_get_state(obj);
-  ObjectChange *change = new_object_state_change(obj, old_state, _comment_get_state, _comment_set_state );
-
-  ((UMLClass *)obj)->visible_comments = !((UMLClass *)obj)->visible_comments;
-  umlclass_calculate_data((UMLClass *)obj);
-  umlclass_update_data((UMLClass *)obj);
+  DiaObjectChange *change = new_object_state_change (obj,
+                                                     old_state,
+                                                     _comment_get_state,
+                                                     _comment_set_state );
+
+  ((UMLClass *) obj)->visible_comments = !((UMLClass *) obj)->visible_comments;
+  umlclass_calculate_data ((UMLClass *) obj);
+  umlclass_update_data ((UMLClass *) obj);
   return change;
 }
 
-static ObjectChange *
-umlclass_allow_resizing_callback(DiaObject *obj,
-                                 Point *pos G_GNUC_UNUSED,
-                                 gpointer data G_GNUC_UNUSED)
+
+static DiaObjectChange *
+umlclass_allow_resizing_callback (DiaObject *obj,
+                                  Point     *pos G_GNUC_UNUSED,
+                                  gpointer   data G_GNUC_UNUSED)
 {
-  return object_toggle_prop(obj, "allow_resizing", !((UMLClass *)obj)->allow_resizing);
+  return object_toggle_prop (obj,
+                             "allow_resizing",
+                             !((UMLClass *) obj)->allow_resizing);
 }
 
+
 static void
 umlclass_reflect_resizing(UMLClass *umlclass)
 {
@@ -513,10 +532,14 @@ umlclass_select(UMLClass *umlclass, Point *clicked_point,
   element_update_handles(&umlclass->element);
 }
 
-static ObjectChange*
-umlclass_move_handle(UMLClass *umlclass, Handle *handle,
-                    Point *to, ConnectionPoint *cp,
-                     HandleMoveReason reason, ModifierKeys modifiers)
+
+static DiaObjectChange *
+umlclass_move_handle (UMLClass         *umlclass,
+                      Handle           *handle,
+                      Point            *to,
+                      ConnectionPoint  *cp,
+                      HandleMoveReason  reason,
+                      ModifierKeys      modifiers)
 {
   Element *elem = &umlclass->element;
 
@@ -527,13 +550,18 @@ umlclass_move_handle(UMLClass *umlclass, Handle *handle,
 
   if (handle->type != HANDLE_NON_MOVABLE) {
     if (handle->id == HANDLE_RESIZE_E || handle->id == HANDLE_RESIZE_W) {
-      real dist = (handle->id == HANDLE_RESIZE_E) ?
-             to->x - elem->resize_handles[3].pos.x :
-            elem->resize_handles[4].pos.x - to->x;
+      double dist = (handle->id == HANDLE_RESIZE_E) ?
+                        to->x - elem->resize_handles[3].pos.x :
+                        elem->resize_handles[4].pos.x - to->x;
       if (umlclass->min_width <= dist) {
-        ObjectChange *oc = element_move_handle (elem, handle->id, to, cp, reason, modifiers);
-       umlclass_update_data(umlclass);
-       return oc;
+        DiaObjectChange *oc = element_move_handle (elem,
+                                                   handle->id,
+                                                   to,
+                                                   cp,
+                                                   reason,
+                                                   modifiers);
+        umlclass_update_data (umlclass);
+        return oc;
       }
     }
   }
@@ -541,14 +569,17 @@ umlclass_move_handle(UMLClass *umlclass, Handle *handle,
   return NULL;
 }
 
-static ObjectChange*
-umlclass_move(UMLClass *umlclass, Point *to)
+
+static DiaObjectChange *
+umlclass_move (UMLClass *umlclass, Point *to)
 {
   umlclass->element.corner = *to;
-  umlclass_update_data(umlclass);
+  umlclass_update_data (umlclass);
 
   return NULL;
 }
+
+
 /**
  * underlines the text at the start point using the text to determine
  * the length of the underline. Draw a line under the text represented by
diff --git a/objects/UML/class.h b/objects/UML/class.h
index 1f92247fe..0b6ffddf1 100644
--- a/objects/UML/class.h
+++ b/objects/UML/class.h
@@ -145,7 +145,7 @@ struct _UMLClass {
 
 void umlclass_dialog_free (UMLClassDialog *dialog);
 GtkWidget *umlclass_get_properties(UMLClass *umlclass, gboolean is_default);
-ObjectChange *umlclass_apply_props_from_dialog(UMLClass *umlclass, GtkWidget *widget);
+DiaObjectChange *umlclass_apply_props_from_dialog(UMLClass *umlclass, GtkWidget *widget);
 void umlclass_calculate_data(UMLClass *umlclass);
 void umlclass_update_data(UMLClass *umlclass);
 
diff --git a/objects/UML/class_dialog.c b/objects/UML/class_dialog.c
index df8a47a7b..e31703f4f 100644
--- a/objects/UML/class_dialog.c
+++ b/objects/UML/class_dialog.c
@@ -37,11 +37,11 @@
 #include <string.h>
 
 #include "object.h"
-#include "objchange.h"
 #include "intl.h"
 #include "class.h"
 #include "diaoptionmenu.h"
 #include "diafontselector.h"
+#include "dia-object-change-legacy.h"
 
 #include "class_dialog.h"
 
@@ -126,10 +126,12 @@ struct _UMLClassChange {
   UMLClassState *saved_state;
 };
 
-static UMLClassState *umlclass_get_state(UMLClass *umlclass);
-static ObjectChange *new_umlclass_change(UMLClass *obj, UMLClassState *saved_state,
-                                        GList *added, GList *deleted,
-                                        GList *disconnected);
+static UMLClassState   *umlclass_get_state  (UMLClass      *umlclass);
+static DiaObjectChange *new_umlclass_change (UMLClass      *obj,
+                                             UMLClassState *saved_state,
+                                             GList         *added,
+                                             GList         *deleted,
+                                             GList         *disconnected);
 
 /**** Utility functions ******/
 void
@@ -587,7 +589,7 @@ fill_in_dialog (UMLClass *umlclass)
 }
 
 
-ObjectChange *
+DiaObjectChange *
 umlclass_apply_props_from_dialog (UMLClass *umlclass, GtkWidget *widget)
 {
   UMLClassDialog *prop_dialog;
@@ -1043,9 +1045,13 @@ umlclass_change_free(UMLClassChange *change)
 
 }
 
-static ObjectChange *
-new_umlclass_change(UMLClass *obj, UMLClassState *saved_state,
-                   GList *added, GList *deleted, GList *disconnected)
+
+static DiaObjectChange *
+new_umlclass_change (UMLClass      *obj,
+                     UMLClassState *saved_state,
+                     GList         *added,
+                     GList         *deleted,
+                     GList         *disconnected)
 {
   UMLClassChange *change;
 
@@ -1066,7 +1072,7 @@ new_umlclass_change(UMLClass *obj, UMLClassState *saved_state,
   change->deleted_cp = deleted;
   change->disconnected = disconnected;
 
-  return (ObjectChange *)change;
+  return dia_object_change_legacy_new ((ObjectChange *) change);
 }
 
 
diff --git a/objects/UML/classicon.c b/objects/UML/classicon.c
index 6d837598f..b2a8b4b4e 100644
--- a/objects/UML/classicon.c
+++ b/objects/UML/classicon.c
@@ -69,10 +69,10 @@ enum CLassIconStereotype {
 static real classicon_distance_from(Classicon *cicon, Point *point);
 static void classicon_select(Classicon *cicon, Point *clicked_point,
                             DiaRenderer *interactive_renderer);
-static ObjectChange* classicon_move_handle(Classicon *cicon, Handle *handle,
+static DiaObjectChange* classicon_move_handle(Classicon *cicon, Handle *handle,
                                           Point *to, ConnectionPoint *cp,
                                           HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* classicon_move(Classicon *cicon, Point *to);
+static DiaObjectChange* classicon_move(Classicon *cicon, Point *to);
 static void classicon_draw(Classicon *cicon, DiaRenderer *renderer);
 static DiaObject *classicon_create(Point *startpoint,
                                void *user_data,
@@ -205,7 +205,7 @@ classicon_select(Classicon *cicon, Point *clicked_point,
   element_update_handles(&cicon->element);
 }
 
-static ObjectChange*
+static DiaObjectChange*
 classicon_move_handle(Classicon *cicon, Handle *handle,
                      Point *to, ConnectionPoint *cp,
                      HandleMoveReason reason, ModifierKeys modifiers)
@@ -219,7 +219,7 @@ classicon_move_handle(Classicon *cicon, Handle *handle,
   return NULL;
 }
 
-static ObjectChange*
+static DiaObjectChange*
 classicon_move(Classicon *cicon, Point *to)
 {
   Element *elem = &cicon->element;
diff --git a/objects/UML/component.c b/objects/UML/component.c
index c1728f441..dde444d0c 100644
--- a/objects/UML/component.c
+++ b/objects/UML/component.c
@@ -60,10 +60,10 @@ struct _Component {
 static real component_distance_from(Component *cmp, Point *point);
 static void component_select(Component *cmp, Point *clicked_point,
                                DiaRenderer *interactive_renderer);
-static ObjectChange* component_move_handle(Component *cmp, Handle *handle,
+static DiaObjectChange* component_move_handle(Component *cmp, Handle *handle,
                                           Point *to, ConnectionPoint *cp,
                                           HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* component_move(Component *cmp, Point *to);
+static DiaObjectChange* component_move(Component *cmp, Point *to);
 static void component_draw(Component *cmp, DiaRenderer *renderer);
 static DiaObject *component_create(Point *startpoint,
                                   void *user_data,
@@ -196,7 +196,7 @@ component_select(Component *cmp, Point *clicked_point,
   element_update_handles(&cmp->element);
 }
 
-static ObjectChange*
+static DiaObjectChange*
 component_move_handle(Component *cmp, Handle *handle,
                      Point *to, ConnectionPoint *cp,
                      HandleMoveReason reason, ModifierKeys modifiers)
@@ -210,7 +210,7 @@ component_move_handle(Component *cmp, Handle *handle,
   return NULL;
 }
 
-static ObjectChange*
+static DiaObjectChange*
 component_move(Component *cmp, Point *to)
 {
   cmp->element.corner = *to;
diff --git a/objects/UML/component_feature.c b/objects/UML/component_feature.c
index a4f31de62..40778fb85 100644
--- a/objects/UML/component_feature.c
+++ b/objects/UML/component_feature.c
@@ -79,13 +79,14 @@ struct _Compfeat {
 #define COMPPROP_TEXTOFFSET 1.0
 #define HANDLE_MOVE_TEXT (HANDLE_CUSTOM2)
 
-static ObjectChange* compfeat_move_handle(Compfeat *compfeat,
-                                         Handle *handle,
-                                         Point *to,
-                                         ConnectionPoint *cp,
-                                         HandleMoveReason reason,
-                                         ModifierKeys modifiers);
-static ObjectChange* compfeat_move(Compfeat *compfeat, Point *to);
+static DiaObjectChange *compfeat_move_handle     (Compfeat         *compfeat,
+                                                  Handle           *handle,
+                                                  Point            *to,
+                                                  ConnectionPoint  *cp,
+                                                  HandleMoveReason  reason,
+                                                  ModifierKeys      modifiers);
+static DiaObjectChange *compfeat_move            (Compfeat         *compfeat,
+                                                  Point            *to);
 static void compfeat_select(Compfeat *compfeat, Point *clicked_point,
                            DiaRenderer *interactive_renderer);
 static void compfeat_draw(Compfeat *compfeat, DiaRenderer *renderer);
@@ -164,25 +165,33 @@ static PropDescription compfeat_props[] = {
   PROP_DESC_END
 };
 
-static ObjectChange *
+
+static DiaObjectChange *
 compfeat_add_segment_callback(DiaObject *obj, Point *clicked, gpointer data)
 {
-  ObjectChange *change;
-  change = orthconn_add_segment((OrthConn *)obj, clicked);
-  compfeat_update_data((Compfeat *)obj);
+  DiaObjectChange *change;
+
+  change = orthconn_add_segment ((OrthConn *) obj, clicked);
+  compfeat_update_data ((Compfeat *) obj);
+
   return change;
 }
 
-static ObjectChange *
-compfeat_delete_segment_callback(DiaObject *obj, Point *clicked, gpointer data)
+
+static DiaObjectChange *
+compfeat_delete_segment_callback (DiaObject *obj,
+                                  Point     *clicked,
+                                  gpointer   data)
 {
-  ObjectChange *change;
+  DiaObjectChange *change;
+
+  change = orthconn_delete_segment ((OrthConn *) obj, clicked);
+  compfeat_update_data ((Compfeat *) obj);
 
-  change = orthconn_delete_segment((OrthConn *)obj, clicked);
-  compfeat_update_data((Compfeat *)obj);
   return change;
 }
 
+
 static DiaMenuItem object_menu_items[] = {
   { N_("Add segment"), compfeat_add_segment_callback, NULL, 1 },
   { N_("Delete segment"), compfeat_delete_segment_callback, NULL, 1 },
@@ -269,13 +278,16 @@ compfeat_select(Compfeat *compfeat, Point *clicked_point,
   orthconn_update_data(&compfeat->orth);
 }
 
-static ObjectChange *
-compfeat_move_handle(Compfeat *compfeat, Handle *handle,
-                    Point *to, ConnectionPoint *cp,
-                    HandleMoveReason reason,
-                    ModifierKeys modifiers)
+
+static DiaObjectChange *
+compfeat_move_handle (Compfeat         *compfeat,
+                      Handle           *handle,
+                      Point            *to,
+                      ConnectionPoint  *cp,
+                      HandleMoveReason  reason,
+                      ModifierKeys      modifiers)
 {
-  ObjectChange *change;
+  DiaObjectChange *change;
 
   assert(compfeat!=NULL);
   assert(handle!=NULL);
@@ -293,10 +305,11 @@ compfeat_move_handle(Compfeat *compfeat, Handle *handle,
   return change;
 }
 
-static ObjectChange *
-compfeat_move(Compfeat *compfeat, Point *to)
+
+static DiaObjectChange *
+compfeat_move (Compfeat *compfeat, Point *to)
 {
-  ObjectChange *change;
+  DiaObjectChange *change;
   Point delta = *to;
 
   delta = *to;
@@ -312,6 +325,7 @@ compfeat_move(Compfeat *compfeat, Point *to)
   return change;
 }
 
+
 static void
 compfeat_draw (Compfeat *compfeat, DiaRenderer *renderer)
 {
diff --git a/objects/UML/constraint.c b/objects/UML/constraint.c
index fc5127981..b39b2cd82 100644
--- a/objects/UML/constraint.c
+++ b/objects/UML/constraint.c
@@ -62,10 +62,10 @@ struct _Constraint {
 #define HANDLE_MOVE_TEXT (HANDLE_CUSTOM1)
 
 
-static ObjectChange* constraint_move_handle(Constraint *constraint, Handle *handle,
+static DiaObjectChange* constraint_move_handle(Constraint *constraint, Handle *handle,
                                            Point *to, ConnectionPoint *cp,
                                            HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* constraint_move(Constraint *constraint, Point *to);
+static DiaObjectChange* constraint_move(Constraint *constraint, Point *to);
 static void constraint_select(Constraint *constraint, Point *clicked_point,
                              DiaRenderer *interactive_renderer);
 static void constraint_draw(Constraint *constraint, DiaRenderer *renderer);
@@ -189,7 +189,7 @@ constraint_select(Constraint *constraint, Point *clicked_point,
   connection_update_handles(&constraint->connection);
 }
 
-static ObjectChange*
+static DiaObjectChange*
 constraint_move_handle(Constraint *constraint, Handle *handle,
                       Point *to, ConnectionPoint *cp,
                       HandleMoveReason reason, ModifierKeys modifiers)
@@ -221,7 +221,7 @@ constraint_move_handle(Constraint *constraint, Handle *handle,
   return NULL;
 }
 
-static ObjectChange*
+static DiaObjectChange*
 constraint_move(Constraint *constraint, Point *to)
 {
   Point start_to_end;
diff --git a/objects/UML/dependency.c b/objects/UML/dependency.c
index 7cecb79f5..a1869f792 100644
--- a/objects/UML/dependency.c
+++ b/objects/UML/dependency.c
@@ -66,10 +66,14 @@ struct _Dependency {
 static real dependency_distance_from(Dependency *dep, Point *point);
 static void dependency_select(Dependency *dep, Point *clicked_point,
                              DiaRenderer *interactive_renderer);
-static ObjectChange* dependency_move_handle(Dependency *dep, Handle *handle,
-                                           Point *to, ConnectionPoint *cp,
-                                           HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* dependency_move(Dependency *dep, Point *to);
+static DiaObjectChange *dependency_move_handle (Dependency       *dep,
+                                                Handle           *handle,
+                                                Point            *to,
+                                                ConnectionPoint  *cp,
+                                                HandleMoveReason  reason,
+                                                ModifierKeys      modifiers);
+static DiaObjectChange *dependency_move        (Dependency       *dep,
+                                                Point            *to);
 static void dependency_draw(Dependency *dep, DiaRenderer *renderer);
 static DiaObject *dependency_create(Point *startpoint,
                                 void *user_data,
@@ -196,33 +200,40 @@ dependency_select(Dependency *dep, Point *clicked_point,
   orthconn_update_data(&dep->orth);
 }
 
-static ObjectChange*
-dependency_move_handle(Dependency *dep, Handle *handle,
-                      Point *to, ConnectionPoint *cp,
-                      HandleMoveReason reason, ModifierKeys modifiers)
+
+static DiaObjectChange*
+dependency_move_handle (Dependency       *dep,
+                        Handle           *handle,
+                        Point            *to,
+                        ConnectionPoint  *cp,
+                        HandleMoveReason  reason,
+                        ModifierKeys      modifiers)
 {
-  ObjectChange *change;
+  DiaObjectChange *change;
+
   assert(dep!=NULL);
   assert(handle!=NULL);
   assert(to!=NULL);
 
-  change = orthconn_move_handle(&dep->orth, handle, to, cp, reason, modifiers);
-  dependency_update_data(dep);
+  change = orthconn_move_handle (&dep->orth, handle, to, cp, reason, modifiers);
+  dependency_update_data (dep);
 
   return change;
 }
 
-static ObjectChange*
-dependency_move(Dependency *dep, Point *to)
+
+static DiaObjectChange *
+dependency_move (Dependency *dep, Point *to)
 {
-  ObjectChange *change;
+  DiaObjectChange *change;
 
-  change = orthconn_move(&dep->orth, to);
-  dependency_update_data(dep);
+  change = orthconn_move (&dep->orth, to);
+  dependency_update_data (dep);
 
   return change;
 }
 
+
 static void
 dependency_draw (Dependency *dep, DiaRenderer *renderer)
 {
@@ -358,21 +369,29 @@ dependency_update_data(Dependency *dep)
   rectangle_union(&obj->bounding_box, &rect);
 }
 
-static ObjectChange *
-dependency_add_segment_callback(DiaObject *obj, Point *clicked, gpointer data)
+
+static DiaObjectChange *
+dependency_add_segment_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
-  ObjectChange *change;
-  change = orthconn_add_segment((OrthConn *)obj, clicked);
-  dependency_update_data((Dependency *)obj);
+  DiaObjectChange *change;
+
+  change = orthconn_add_segment ((OrthConn *) obj, clicked);
+  dependency_update_data ((Dependency *) obj);
+
   return change;
 }
 
-static ObjectChange *
-dependency_delete_segment_callback(DiaObject *obj, Point *clicked, gpointer data)
+
+static DiaObjectChange *
+dependency_delete_segment_callback (DiaObject *obj,
+                                    Point     *clicked,
+                                    gpointer   data)
 {
-  ObjectChange *change;
-  change = orthconn_delete_segment((OrthConn *)obj, clicked);
-  dependency_update_data((Dependency *)obj);
+  DiaObjectChange *change;
+
+  change = orthconn_delete_segment ((OrthConn *) obj, clicked);
+  dependency_update_data ((Dependency *) obj);
+
   return change;
 }
 
@@ -383,6 +402,7 @@ static DiaMenuItem object_menu_items[] = {
   ORTHCONN_COMMON_MENUS,
 };
 
+
 static DiaMenu object_menu = {
   "Dependency",
   sizeof(object_menu_items)/sizeof(DiaMenuItem),
diff --git a/objects/UML/fork.c b/objects/UML/fork.c
index bfe48ba64..901edf3a6 100644
--- a/objects/UML/fork.c
+++ b/objects/UML/fork.c
@@ -56,10 +56,10 @@ static const double FORK_MARGIN = 0.125;
 
 static real fork_distance_from(Fork *branch, Point *point);
 static void fork_select(Fork *branch, Point *clicked_point, DiaRenderer *interactive_renderer);
-static ObjectChange* fork_move_handle(Fork *branch, Handle *handle,
+static DiaObjectChange* fork_move_handle(Fork *branch, Handle *handle,
                                      Point *to, ConnectionPoint *cp,
                                      HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* fork_move(Fork *branch, Point *to);
+static DiaObjectChange* fork_move(Fork *branch, Point *to);
 static void fork_draw(Fork *branch, DiaRenderer *renderer);
 static DiaObject *fork_create(Point *startpoint,
                             void *user_data,
@@ -160,7 +160,7 @@ fork_select(Fork *branch, Point *clicked_point, DiaRenderer *interactive_rendere
 }
 
 
-static ObjectChange*
+static DiaObjectChange*
 fork_move_handle (Fork             *branch,
                   Handle           *handle,
                   Point            *to,
@@ -192,7 +192,7 @@ fork_move_handle (Fork             *branch,
   return NULL;
 }
 
-static ObjectChange*
+static DiaObjectChange*
 fork_move(Fork *branch, Point *to)
 {
   branch->element.corner = *to;
diff --git a/objects/UML/generalization.c b/objects/UML/generalization.c
index faed53dfe..f96deb22f 100644
--- a/objects/UML/generalization.c
+++ b/objects/UML/generalization.c
@@ -62,10 +62,14 @@ struct _Generalization {
 static real generalization_distance_from(Generalization *genlz, Point *point);
 static void generalization_select(Generalization *genlz, Point *clicked_point,
                              DiaRenderer *interactive_renderer);
-static ObjectChange* generalization_move_handle(Generalization *genlz, Handle *handle,
-                                               Point *to, ConnectionPoint *cp,
-                                               HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* generalization_move(Generalization *genlz, Point *to);
+static DiaObjectChange* generalization_move_handle   (Generalization   *genlz,
+                                                      Handle           *handle,
+                                                      Point            *to,
+                                                      ConnectionPoint  *cp,
+                                                      HandleMoveReason  reason,
+                                                      ModifierKeys      modifiers);
+static DiaObjectChange* generalization_move          (Generalization   *genlz,
+                                                      Point            *to);
 static void generalization_draw(Generalization *genlz, DiaRenderer *renderer);
 static DiaObject *generalization_create(Point *startpoint,
                                 void *user_data,
@@ -191,12 +195,17 @@ generalization_select(Generalization *genlz, Point *clicked_point,
   orthconn_update_data(&genlz->orth);
 }
 
-static ObjectChange*
-generalization_move_handle(Generalization *genlz, Handle *handle,
-                          Point *to, ConnectionPoint *cp,
-                          HandleMoveReason reason, ModifierKeys modifiers)
+
+static DiaObjectChange *
+generalization_move_handle (Generalization   *genlz,
+                            Handle           *handle,
+                            Point            *to,
+                            ConnectionPoint  *cp,
+                            HandleMoveReason  reason,
+                            ModifierKeys      modifiers)
 {
-  ObjectChange *change;
+  DiaObjectChange *change;
+
   assert(genlz!=NULL);
   assert(handle!=NULL);
   assert(to!=NULL);
@@ -207,10 +216,11 @@ generalization_move_handle(Generalization *genlz, Handle *handle,
   return change;
 }
 
-static ObjectChange*
-generalization_move(Generalization *genlz, Point *to)
+
+static DiaObjectChange *
+generalization_move (Generalization *genlz, Point *to)
 {
-  ObjectChange *change;
+  DiaObjectChange *change;
 
   change = orthconn_move(&genlz->orth, to);
   generalization_update_data(genlz);
@@ -218,6 +228,7 @@ generalization_move(Generalization *genlz, Point *to)
   return change;
 }
 
+
 static void
 generalization_draw (Generalization *genlz, DiaRenderer *renderer)
 {
@@ -358,21 +369,27 @@ generalization_update_data(Generalization *genlz)
   rectangle_union(&obj->bounding_box, &rect);
 }
 
-static ObjectChange *
-generalization_add_segment_callback(DiaObject *obj, Point *clicked, gpointer data)
+
+static DiaObjectChange *
+generalization_add_segment_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
-  ObjectChange *change;
-  change = orthconn_add_segment((OrthConn *)obj, clicked);
-  generalization_update_data((Generalization *)obj);
+  DiaObjectChange *change;
+
+  change = orthconn_add_segment ((OrthConn *) obj, clicked);
+  generalization_update_data ((Generalization *) obj);
+
   return change;
 }
 
-static ObjectChange *
-generalization_delete_segment_callback(DiaObject *obj, Point *clicked, gpointer data)
+
+static DiaObjectChange *
+generalization_delete_segment_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
-  ObjectChange *change;
-  change = orthconn_delete_segment((OrthConn *)obj, clicked);
-  generalization_update_data((Generalization *)obj);
+  DiaObjectChange *change;
+
+  change = orthconn_delete_segment ((OrthConn *) obj, clicked);
+  generalization_update_data ((Generalization *) obj);
+
   return change;
 }
 
diff --git a/objects/UML/implements.c b/objects/UML/implements.c
index f2c8ad819..980d69ca8 100644
--- a/objects/UML/implements.c
+++ b/objects/UML/implements.c
@@ -62,10 +62,10 @@ struct _Implements {
 #define HANDLE_CIRCLE_SIZE (HANDLE_CUSTOM1)
 #define HANDLE_MOVE_TEXT (HANDLE_CUSTOM2)
 
-static ObjectChange* implements_move_handle(Implements *implements, Handle *handle,
+static DiaObjectChange* implements_move_handle(Implements *implements, Handle *handle,
                                            Point *to, ConnectionPoint *cp,
                                            HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* implements_move(Implements *implements, Point *to);
+static DiaObjectChange* implements_move(Implements *implements, Point *to);
 static void implements_select(Implements *implements, Point *clicked_point,
                              DiaRenderer *interactive_renderer);
 static void implements_draw(Implements *implements, DiaRenderer *renderer);
@@ -197,7 +197,7 @@ implements_select(Implements *implements, Point *clicked_point,
   connection_update_handles(&implements->connection);
 }
 
-static ObjectChange*
+static DiaObjectChange*
 implements_move_handle(Implements *implements, Handle *handle,
                       Point *to, ConnectionPoint *cp,
                       HandleMoveReason reason, ModifierKeys modifiers)
@@ -233,7 +233,7 @@ implements_move_handle(Implements *implements, Handle *handle,
   return NULL;
 }
 
-static ObjectChange*
+static DiaObjectChange*
 implements_move(Implements *implements, Point *to)
 {
   Point start_to_end;
diff --git a/objects/UML/large_package.c b/objects/UML/large_package.c
index 6bc2115a3..77430af9f 100644
--- a/objects/UML/large_package.c
+++ b/objects/UML/large_package.c
@@ -70,10 +70,10 @@ struct _LargePackage {
 static real largepackage_distance_from(LargePackage *pkg, Point *point);
 static void largepackage_select(LargePackage *pkg, Point *clicked_point,
                                DiaRenderer *interactive_renderer);
-static ObjectChange* largepackage_move_handle(LargePackage *pkg, Handle *handle,
+static DiaObjectChange* largepackage_move_handle(LargePackage *pkg, Handle *handle,
                                              Point *to, ConnectionPoint *cp,
                                              HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* largepackage_move(LargePackage *pkg, Point *to);
+static DiaObjectChange* largepackage_move(LargePackage *pkg, Point *to);
 static void largepackage_draw(LargePackage *pkg, DiaRenderer *renderer);
 static DiaObject *largepackage_create(Point *startpoint,
                                   void *user_data,
@@ -211,7 +211,7 @@ largepackage_select(LargePackage *pkg, Point *clicked_point,
   element_update_handles(&pkg->element);
 }
 
-static ObjectChange*
+static DiaObjectChange*
 largepackage_move_handle(LargePackage *pkg, Handle *handle,
                         Point *to, ConnectionPoint *cp,
                         HandleMoveReason reason, ModifierKeys modifiers)
@@ -228,7 +228,7 @@ largepackage_move_handle(LargePackage *pkg, Handle *handle,
   return NULL;
 }
 
-static ObjectChange*
+static DiaObjectChange*
 largepackage_move(LargePackage *pkg, Point *to)
 {
   pkg->element.corner = *to;
diff --git a/objects/UML/lifeline.c b/objects/UML/lifeline.c
index 50870b588..37db57e6c 100644
--- a/objects/UML/lifeline.c
+++ b/objects/UML/lifeline.c
@@ -31,6 +31,7 @@
 #include "properties.h"
 #include "connpoint_line.h"
 #include "attributes.h"
+#include "dia-object-change-legacy.h"
 
 #include "pixmaps/lifeline.xpm"
 
@@ -85,11 +86,14 @@ struct _Lifeline {
 #define HANDLE_BOXBOT (HANDLE_CUSTOM2)
 #define HANDLE_BOXMID (HANDLE_CUSTOM3)
 
-static ObjectChange* lifeline_move_handle(Lifeline *lifeline, Handle *handle,
-                                         Point *to, ConnectionPoint *cp,
-                                         HandleMoveReason reason,
-                                 ModifierKeys modifiers);
-static ObjectChange* lifeline_move(Lifeline *lifeline, Point *to);
+static DiaObjectChange *lifeline_move_handle   (Lifeline         *lifeline,
+                                                Handle           *handle,
+                                                Point            *to,
+                                                ConnectionPoint  *cp,
+                                                HandleMoveReason  reason,
+                                                ModifierKeys      modifiers);
+static DiaObjectChange *lifeline_move          (Lifeline         *lifeline,
+                                                Point            *to);
 static void lifeline_select(Lifeline *lifeline, Point *clicked_point,
                             DiaRenderer *interactive_renderer);
 static void lifeline_draw(Lifeline *lifeline, DiaRenderer *renderer);
@@ -117,7 +121,9 @@ typedef enum {
   LIFELINE_CHANGE_DEF = 0x05
 } LifelineChangeType;
 
-static ObjectChange *lifeline_create_change(Lifeline *lifeline, LifelineChangeType changetype, Point 
*clicked);
+static DiaObjectChange *lifeline_create_change (Lifeline           *lifeline,
+                                                LifelineChangeType  changetype,
+                                                Point              *clicked);
 
 static ObjectTypeOps lifeline_type_ops =
 {
@@ -252,6 +258,8 @@ lifeline_point_above_mid (Lifeline *lifeline,
 {
   return (pt->y < lifeline->boxmid_handle.pos.y);
 }
+
+
 /*!
  * Moving handles of a lifeline
  *
@@ -263,12 +271,15 @@ lifeline_point_above_mid (Lifeline *lifeline,
  *   by connected points)
  * - the bottom handle just move itself, not beyond the lower box handle
  */
-static ObjectChange*
-lifeline_move_handle(Lifeline *lifeline, Handle *handle,
-                    Point *to, ConnectionPoint *cp,
-                    HandleMoveReason reason, ModifierKeys modifiers)
+static DiaObjectChange*
+lifeline_move_handle (Lifeline         *lifeline,
+                      Handle           *handle,
+                      Point            *to,
+                      ConnectionPoint  *cp,
+                      HandleMoveReason  reason,
+                      ModifierKeys      modifiers)
 {
-  real s, dy;
+  double s, dy;
   Connection *conn;
 
   assert(lifeline!=NULL);
@@ -336,27 +347,29 @@ lifeline_move_handle(Lifeline *lifeline, Handle *handle,
   return NULL;
 }
 
-static ObjectChange*
-lifeline_move(Lifeline *lifeline, Point *to)
+
+static DiaObjectChange *
+lifeline_move (Lifeline *lifeline, Point *to)
 {
   Point start_to_end;
   Point delta;
   Point *endpoints = &lifeline->connection.endpoints[0];
 
   delta = *to;
-  point_sub(&delta, &endpoints[0]);
+  point_sub (&delta, &endpoints[0]);
 
   start_to_end = endpoints[1];
-  point_sub(&start_to_end, &endpoints[0]);
+  point_sub (&start_to_end, &endpoints[0]);
 
   endpoints[1] = endpoints[0] = *to;
-  point_add(&endpoints[1], &start_to_end);
+  point_add (&endpoints[1], &start_to_end);
 
-  lifeline_update_data(lifeline);
+  lifeline_update_data (lifeline);
 
   return NULL;
 }
 
+
 static void
 lifeline_draw (Lifeline *lifeline, DiaRenderer *renderer)
 {
@@ -428,29 +441,30 @@ lifeline_draw (Lifeline *lifeline, DiaRenderer *renderer)
 typedef struct {
   ObjectChange obj_change;
 
-  ObjectChange *east, *west;
-  real cp_distance_change;
+  DiaObjectChange *east, *west;
+  double cp_distance_change;
   LifelineChangeType type;
 } LifelineChange;
 
+
 static void
-lifeline_change_apply(LifelineChange *change, DiaObject *obj)
+lifeline_change_apply (LifelineChange *change, DiaObject *obj)
 {
-  if( change->type == LIFELINE_CHANGE_ADD ||  change->type == LIFELINE_CHANGE_DEL ) {
-    change->west->apply(change->west,obj);
-    change->east->apply(change->east,obj);
+  if (change->type == LIFELINE_CHANGE_ADD || change->type == LIFELINE_CHANGE_DEL) {
+    dia_object_change_apply (change->west,obj);
+    dia_object_change_apply (change->east,obj);
   } else {
-    ((Lifeline*)obj)->cp_distance += change->cp_distance_change;
+    ((Lifeline*) obj)->cp_distance += change->cp_distance_change;
   }
-
 }
 
+
 static void
-lifeline_change_revert(LifelineChange *change, DiaObject *obj)
+lifeline_change_revert (LifelineChange *change, DiaObject *obj)
 {
-  if( change->type == LIFELINE_CHANGE_ADD ||  change->type == LIFELINE_CHANGE_DEL ) {
-    change->west->revert(change->west,obj);
-    change->east->revert(change->east,obj);
+  if (change->type == LIFELINE_CHANGE_ADD || change->type == LIFELINE_CHANGE_DEL) {
+    dia_object_change_revert (change->west,obj);
+    dia_object_change_revert (change->east,obj);
   } else {
     ((Lifeline*)obj)->cp_distance -= change->cp_distance_change;
   }
@@ -462,23 +476,20 @@ lifeline_change_free (LifelineChange *change)
 {
   if (change->type == LIFELINE_CHANGE_ADD ||
       change->type == LIFELINE_CHANGE_DEL) {
-    if (change->east->free)
-      change->east->free (change->east);
-    g_clear_pointer (&change->east, g_free);
-
-    if (change->west->free)
-      change->west->free (change->west);
-    g_clear_pointer (&change->west, g_free);
+    g_clear_pointer (&change->east, dia_object_change_unref);
+    g_clear_pointer (&change->west, dia_object_change_unref);
   }
 }
 
 
-static ObjectChange *
-lifeline_create_change (Lifeline *lifeline, LifelineChangeType changetype, Point *clicked)
+static DiaObjectChange *
+lifeline_create_change (Lifeline           *lifeline,
+                        LifelineChangeType  changetype,
+                        Point              *clicked)
 {
   LifelineChange *vc;
 
-  vc = g_new0(LifelineChange,1);
+  vc = g_new0 (LifelineChange, 1);
   vc->obj_change.apply = (ObjectChangeApplyFunc)lifeline_change_apply;
   vc->obj_change.revert = (ObjectChangeRevertFunc)lifeline_change_revert;
   vc->obj_change.free = (ObjectChangeFreeFunc)lifeline_change_free;
@@ -518,18 +529,21 @@ lifeline_create_change (Lifeline *lifeline, LifelineChangeType changetype, Point
     default:
       g_return_val_if_reached (NULL);
   }
+
   lifeline_update_data (lifeline);
-  return (ObjectChange *) vc;
+
+  return dia_object_change_legacy_new ((ObjectChange *) vc);
 }
 
 
-static ObjectChange *
-lifeline_cp_callback(DiaObject *obj, Point *clicked, gpointer data)
+static DiaObjectChange *
+lifeline_cp_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
-  LifelineChangeType type = GPOINTER_TO_INT(data);
-  return lifeline_create_change((Lifeline *)obj, type, clicked);
+  LifelineChangeType type = GPOINTER_TO_INT (data);
+  return lifeline_create_change ((Lifeline *) obj, type, clicked);
 }
 
+
 static DiaMenuItem object_menu_items[] = {
   { N_("Add connection points"), lifeline_cp_callback, GINT_TO_POINTER(LIFELINE_CHANGE_ADD), 1 },
   { N_("Remove connection points"), lifeline_cp_callback, GINT_TO_POINTER(LIFELINE_CHANGE_DEL), 1 },
diff --git a/objects/UML/message.c b/objects/UML/message.c
index 5f0672e6d..ff306cfd8 100644
--- a/objects/UML/message.c
+++ b/objects/UML/message.c
@@ -75,10 +75,10 @@ struct _Message {
 #define HANDLE_MOVE_TEXT (HANDLE_CUSTOM1)
 
 
-static ObjectChange* message_move_handle(Message *message, Handle *handle,
+static DiaObjectChange* message_move_handle(Message *message, Handle *handle,
                                         Point *to, ConnectionPoint *cp,
                                         HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* message_move(Message *message, Point *to);
+static DiaObjectChange* message_move(Message *message, Point *to);
 static void message_select(Message *message, Point *clicked_point,
                              DiaRenderer *interactive_renderer);
 static void message_draw(Message *message, DiaRenderer *renderer);
@@ -221,7 +221,7 @@ message_select(Message *message, Point *clicked_point,
   connection_update_handles(&message->connection);
 }
 
-static ObjectChange*
+static DiaObjectChange*
 message_move_handle(Message *message, Handle *handle,
                    Point *to, ConnectionPoint *cp,
                    HandleMoveReason reason, ModifierKeys modifiers)
@@ -252,7 +252,7 @@ message_move_handle(Message *message, Handle *handle,
   return NULL;
 }
 
-static ObjectChange*
+static DiaObjectChange*
 message_move(Message *message, Point *to)
 {
   Point start_to_end;
diff --git a/objects/UML/node.c b/objects/UML/node.c
index a5475ab6d..8e9643c7b 100644
--- a/objects/UML/node.c
+++ b/objects/UML/node.c
@@ -62,10 +62,10 @@ static const double NODE_TEXT_MARGIN = 0.5;
 static real node_distance_from(Node *node, Point *point);
 static void node_select(Node *node, Point *clicked_point,
                                DiaRenderer *interactive_renderer);
-static ObjectChange* node_move_handle(Node *node, Handle *handle,
+static DiaObjectChange* node_move_handle(Node *node, Handle *handle,
                                      Point *to, ConnectionPoint *cp,
                                      HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* node_move(Node *node, Point *to);
+static DiaObjectChange* node_move(Node *node, Point *to);
 static void node_draw(Node *node, DiaRenderer *renderer);
 static DiaObject *node_create(Point *startpoint,
                                   void *user_data,
@@ -189,7 +189,7 @@ node_select(Node *node, Point *clicked_point,
   element_update_handles(&node->element);
 }
 
-static ObjectChange*
+static DiaObjectChange*
 node_move_handle(Node *node, Handle *handle,
                 Point *to, ConnectionPoint *cp,
                 HandleMoveReason reason, ModifierKeys modifiers)
@@ -206,7 +206,7 @@ node_move_handle(Node *node, Handle *handle,
   return NULL;
 }
 
-static ObjectChange*
+static DiaObjectChange*
 node_move(Node *node, Point *to)
 {
   Point p;
diff --git a/objects/UML/note.c b/objects/UML/note.c
index 92e530906..69a121747 100644
--- a/objects/UML/note.c
+++ b/objects/UML/note.c
@@ -55,10 +55,10 @@ struct _Note {
 static real note_distance_from(Note *note, Point *point);
 static void note_select(Note *note, Point *clicked_point,
                        DiaRenderer *interactive_renderer);
-static ObjectChange* note_move_handle(Note *note, Handle *handle,
+static DiaObjectChange* note_move_handle(Note *note, Handle *handle,
                                      Point *to, ConnectionPoint *cp,
                                      HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* note_move(Note *note, Point *to);
+static DiaObjectChange* note_move(Note *note, Point *to);
 static void note_draw(Note *note, DiaRenderer *renderer);
 static DiaObject *note_create(Point *startpoint,
                           void *user_data,
@@ -184,7 +184,7 @@ note_select(Note *note, Point *clicked_point,
   element_update_handles(&note->element);
 }
 
-static ObjectChange*
+static DiaObjectChange*
 note_move_handle(Note *note, Handle *handle,
                 Point *to, ConnectionPoint *cp,
                 HandleMoveReason reason, ModifierKeys modifiers)
@@ -198,7 +198,7 @@ note_move_handle(Note *note, Handle *handle,
   return NULL;
 }
 
-static ObjectChange*
+static DiaObjectChange*
 note_move(Note *note, Point *to)
 {
   note->element.corner = *to;
diff --git a/objects/UML/object.c b/objects/UML/object.c
index 9389f61a6..82037388e 100644
--- a/objects/UML/object.c
+++ b/objects/UML/object.c
@@ -75,10 +75,10 @@ struct _Objet {
 static real objet_distance_from(Objet *ob, Point *point);
 static void objet_select(Objet *ob, Point *clicked_point,
                         DiaRenderer *interactive_renderer);
-static ObjectChange* objet_move_handle(Objet *ob, Handle *handle,
+static DiaObjectChange* objet_move_handle(Objet *ob, Handle *handle,
                                       Point *to, ConnectionPoint *cp,
                                       HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* objet_move(Objet *ob, Point *to);
+static DiaObjectChange* objet_move(Objet *ob, Point *to);
 static void objet_draw(Objet *ob, DiaRenderer *renderer);
 static DiaObject *objet_create(Point *startpoint,
                            void *user_data,
@@ -248,7 +248,7 @@ objet_select(Objet *ob, Point *clicked_point,
   element_update_handles(&ob->element);
 }
 
-static ObjectChange*
+static DiaObjectChange*
 objet_move_handle(Objet *ob, Handle *handle,
                  Point *to, ConnectionPoint *cp,
                  HandleMoveReason reason, ModifierKeys modifiers)
@@ -262,7 +262,7 @@ objet_move_handle(Objet *ob, Handle *handle,
   return NULL;
 }
 
-static ObjectChange*
+static DiaObjectChange*
 objet_move(Objet *ob, Point *to)
 {
   ob->element.corner = *to;
diff --git a/objects/UML/realizes.c b/objects/UML/realizes.c
index 5a5da6977..585075d9e 100644
--- a/objects/UML/realizes.c
+++ b/objects/UML/realizes.c
@@ -62,10 +62,14 @@ struct _Realizes {
 static real realizes_distance_from(Realizes *realize, Point *point);
 static void realizes_select(Realizes *realize, Point *clicked_point,
                              DiaRenderer *interactive_renderer);
-static ObjectChange* realizes_move_handle(Realizes *realize, Handle *handle,
-                                         Point *to, ConnectionPoint *cp,
-                                         HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* realizes_move(Realizes *realize, Point *to);
+static DiaObjectChange *realizes_move_handle   (Realizes         *realize,
+                                                Handle           *handle,
+                                                Point            *to,
+                                                ConnectionPoint  *cp,
+                                                HandleMoveReason  reason,
+                                                ModifierKeys      modifiers);
+static DiaObjectChange *realizes_move          (Realizes         *realize,
+                                                Point            *to);
 static void realizes_draw(Realizes *realize, DiaRenderer *renderer);
 static DiaObject *realizes_create(Point *startpoint,
                                 void *user_data,
@@ -192,12 +196,17 @@ realizes_select(Realizes *realize, Point *clicked_point,
   orthconn_update_data(&realize->orth);
 }
 
-static ObjectChange*
-realizes_move_handle(Realizes *realize, Handle *handle,
-                    Point *to, ConnectionPoint *cp,
-                    HandleMoveReason reason, ModifierKeys modifiers)
+
+static DiaObjectChange *
+realizes_move_handle (Realizes         *realize,
+                      Handle           *handle,
+                      Point            *to,
+                      ConnectionPoint  *cp,
+                      HandleMoveReason  reason,
+                      ModifierKeys      modifiers)
 {
-  ObjectChange *change;
+  DiaObjectChange *change;
+
   assert(realize!=NULL);
   assert(handle!=NULL);
   assert(to!=NULL);
@@ -208,15 +217,17 @@ realizes_move_handle(Realizes *realize, Handle *handle,
   return change;
 }
 
-static ObjectChange*
-realizes_move(Realizes *realize, Point *to)
+
+static DiaObjectChange *
+realizes_move (Realizes *realize, Point *to)
 {
-  orthconn_move(&realize->orth, to);
-  realizes_update_data(realize);
+  orthconn_move (&realize->orth, to);
+  realizes_update_data (realize);
 
   return NULL;
 }
 
+
 static void
 realizes_draw (Realizes *realize, DiaRenderer *renderer)
 {
@@ -349,21 +360,29 @@ realizes_update_data(Realizes *realize)
   rectangle_union(&obj->bounding_box, &rect);
 }
 
-static ObjectChange *
-realizes_add_segment_callback(DiaObject *obj, Point *clicked, gpointer data)
+
+static DiaObjectChange *
+realizes_add_segment_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
-  ObjectChange *change;
-  change = orthconn_add_segment((OrthConn *)obj, clicked);
-  realizes_update_data((Realizes *)obj);
+  DiaObjectChange *change;
+
+  change = orthconn_add_segment ((OrthConn *) obj, clicked);
+  realizes_update_data ((Realizes *) obj);
+
   return change;
 }
 
-static ObjectChange *
-realizes_delete_segment_callback(DiaObject *obj, Point *clicked, gpointer data)
+
+static DiaObjectChange *
+realizes_delete_segment_callback (DiaObject *obj,
+                                  Point     *clicked,
+                                  gpointer   data)
 {
-  ObjectChange *change;
-  change = orthconn_delete_segment((OrthConn *)obj, clicked);
-  realizes_update_data((Realizes *)obj);
+  DiaObjectChange *change;
+
+  change = orthconn_delete_segment ((OrthConn *) obj, clicked);
+  realizes_update_data ((Realizes *) obj);
+
   return change;
 }
 
diff --git a/objects/UML/small_package.c b/objects/UML/small_package.c
index 9da0d8fbe..5d8df3856 100644
--- a/objects/UML/small_package.c
+++ b/objects/UML/small_package.c
@@ -64,10 +64,10 @@ struct _SmallPackage {
 static real smallpackage_distance_from(SmallPackage *pkg, Point *point);
 static void smallpackage_select(SmallPackage *pkg, Point *clicked_point,
                                DiaRenderer *interactive_renderer);
-static ObjectChange* smallpackage_move_handle(SmallPackage *pkg, Handle *handle,
+static DiaObjectChange* smallpackage_move_handle(SmallPackage *pkg, Handle *handle,
                                              Point *to, ConnectionPoint *cp,
                                              HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* smallpackage_move(SmallPackage *pkg, Point *to);
+static DiaObjectChange* smallpackage_move(SmallPackage *pkg, Point *to);
 static void smallpackage_draw(SmallPackage *pkg, DiaRenderer *renderer);
 static DiaObject *smallpackage_create(Point *startpoint,
                                   void *user_data,
@@ -201,7 +201,7 @@ smallpackage_select(SmallPackage *pkg, Point *clicked_point,
   element_update_handles(&pkg->element);
 }
 
-static ObjectChange*
+static DiaObjectChange*
 smallpackage_move_handle(SmallPackage *pkg, Handle *handle,
                         Point *to, ConnectionPoint *cp,
                         HandleMoveReason reason, ModifierKeys modifiers)
@@ -215,7 +215,7 @@ smallpackage_move_handle(SmallPackage *pkg, Handle *handle,
   return NULL;
 }
 
-static ObjectChange*
+static DiaObjectChange*
 smallpackage_move(SmallPackage *pkg, Point *to)
 {
   Point p;
diff --git a/objects/UML/state.c b/objects/UML/state.c
index 963bdd535..cc7b45d4a 100644
--- a/objects/UML/state.c
+++ b/objects/UML/state.c
@@ -81,10 +81,10 @@ struct _State {
 static real state_distance_from(State *state, Point *point);
 static void state_select(State *state, Point *clicked_point,
                        DiaRenderer *interactive_renderer);
-static ObjectChange* state_move_handle(State *state, Handle *handle,
+static DiaObjectChange* state_move_handle(State *state, Handle *handle,
                                       Point *to, ConnectionPoint *cp,
                                       HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* state_move(State *state, Point *to);
+static DiaObjectChange* state_move(State *state, Point *to);
 static void state_draw(State *state, DiaRenderer *renderer);
 static DiaObject *state_create(Point *startpoint,
                           void *user_data,
@@ -221,7 +221,7 @@ state_select(State *state, Point *clicked_point,
   element_update_handles(&state->element);
 }
 
-static ObjectChange*
+static DiaObjectChange*
 state_move_handle(State *state, Handle *handle,
                  Point *to, ConnectionPoint *cp,
                  HandleMoveReason reason, ModifierKeys modifiers)
@@ -235,7 +235,7 @@ state_move_handle(State *state, Handle *handle,
   return NULL;
 }
 
-static ObjectChange*
+static DiaObjectChange*
 state_move(State *state, Point *to)
 {
   state->element.corner = *to;
diff --git a/objects/UML/state_term.c b/objects/UML/state_term.c
index d525770b3..12b20b399 100644
--- a/objects/UML/state_term.c
+++ b/objects/UML/state_term.c
@@ -61,10 +61,10 @@ struct _State {
 static real state_distance_from(State *state, Point *point);
 static void state_select(State *state, Point *clicked_point,
                        DiaRenderer *interactive_renderer);
-static ObjectChange* state_move_handle(State *state, Handle *handle,
+static DiaObjectChange* state_move_handle(State *state, Handle *handle,
                                       Point *to, ConnectionPoint *cp,
                                       HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* state_move(State *state, Point *to);
+static DiaObjectChange* state_move(State *state, Point *to);
 static void state_draw(State *state, DiaRenderer *renderer);
 static DiaObject *state_create(Point *startpoint,
                           void *user_data,
@@ -168,7 +168,7 @@ state_select(State *state, Point *clicked_point,
   element_update_handles(&state->element);
 }
 
-static ObjectChange*
+static DiaObjectChange*
 state_move_handle(State *state, Handle *handle,
                  Point *to, ConnectionPoint *cp,
                  HandleMoveReason reason, ModifierKeys modifiers)
@@ -182,7 +182,7 @@ state_move_handle(State *state, Handle *handle,
   return NULL;
 }
 
-static ObjectChange*
+static DiaObjectChange*
 state_move(State *state, Point *to)
 {
   state->element.corner = *to;
diff --git a/objects/UML/transition.c b/objects/UML/transition.c
index 54040b980..0c2133d1b 100644
--- a/objects/UML/transition.c
+++ b/objects/UML/transition.c
@@ -74,23 +74,24 @@ static DiaMenu* transition_get_object_menu(Transition* transition,
 static void transition_select(Transition* obj,
                               Point* clicked_point,
                               DiaRenderer* interactive_renderer);
-static ObjectChange* transition_move(Transition* transition, Point* pos);
-static ObjectChange* transition_move_handle(Transition*      transition,
-                                            Handle*          handle,
-                                            Point*           pos,
-                                            ConnectionPoint* cp,
-                                            HandleMoveReason reason,
-                                            ModifierKeys     modifiers);
+static DiaObjectChange *transition_move           (Transition       *transition,
+                                                   Point            *pos);
+static DiaObjectChange *transition_move_handle    (Transition       *transition,
+                                                   Handle           *handle,
+                                                   Point            *pos,
+                                                   ConnectionPoint  *cp,
+                                                   HandleMoveReason  reason,
+                                                   ModifierKeys      modifiers);
 static void transition_set_props(Transition *transition, GPtrArray *props);
 static void transition_get_props(Transition *transition, GPtrArray *props);
 static PropDescription *transition_describe_props(Transition *transition);
 static void uml_transition_update_data(Transition *transition);
-static ObjectChange* transition_add_segment_cb(DiaObject *obj,
-                                               Point *clicked_point,
-                                               gpointer data);
-static ObjectChange* transition_del_segment_cb(DiaObject *obj,
-                                               Point *clicked_point,
-                                               gpointer data);
+static DiaObjectChange* transition_add_segment_cb (DiaObject        *obj,
+                                                   Point            *clicked_point,
+                                                   gpointer          data);
+static DiaObjectChange* transition_del_segment_cb (DiaObject        *obj,
+                                                   Point            *clicked_point,
+                                                   gpointer          data);
 
 static ObjectTypeOps uml_transition_type_ops = {
   (CreateFunc)transition_create,
@@ -430,11 +431,11 @@ transition_select (Transition *transition,
 }
 
 
-static ObjectChange*
+static DiaObjectChange *
 transition_move (Transition* transition, Point* newpos)
 {
   Point delta;
-  ObjectChange *change;
+  DiaObjectChange *change;
 
   /* Find a delta in order to move the text handles along with the transition */
   delta = *newpos;
@@ -452,7 +453,7 @@ transition_move (Transition* transition, Point* newpos)
 }
 
 
-static ObjectChange*
+static DiaObjectChange *
 transition_move_handle (Transition       *transition,
                         Handle           *handle,
                         Point            *newpos,
@@ -460,7 +461,7 @@ transition_move_handle (Transition       *transition,
                         HandleMoveReason  reason,
                         ModifierKeys      modifiers)
 {
-  ObjectChange *change = NULL;
+  DiaObjectChange *change = NULL;
 
   g_return_val_if_fail (transition != NULL, NULL);
   g_return_val_if_fail (handle != NULL, NULL);
@@ -528,12 +529,12 @@ transition_move_handle (Transition       *transition,
 }
 
 
-static ObjectChange *
+static DiaObjectChange *
 transition_add_segment_cb (DiaObject *obj,
                            Point     *clickedpoint,
                            gpointer   data)
 {
-  ObjectChange *change;
+  DiaObjectChange *change;
 
   change = orthconn_add_segment ((OrthConn *) obj, clickedpoint);
   uml_transition_update_data ((Transition *) obj);
@@ -542,12 +543,12 @@ transition_add_segment_cb (DiaObject *obj,
 }
 
 
-static ObjectChange *
+static DiaObjectChange *
 transition_del_segment_cb (DiaObject *obj,
                            Point     *clickedpoint,
                            gpointer   data)
 {
-  ObjectChange *change;
+  DiaObjectChange *change;
 
   change = orthconn_delete_segment ((OrthConn *) obj, clickedpoint);
   uml_transition_update_data ((Transition *) obj);
diff --git a/objects/UML/usecase.c b/objects/UML/usecase.c
index c71b54556..1146ccbd4 100644
--- a/objects/UML/usecase.c
+++ b/objects/UML/usecase.c
@@ -71,10 +71,10 @@ struct _UsecasePropertiesDialog {
 static real usecase_distance_from(Usecase *usecase, Point *point);
 static void usecase_select(Usecase *usecase, Point *clicked_point,
                           DiaRenderer *interactive_renderer);
-static ObjectChange* usecase_move_handle(Usecase *usecase, Handle *handle,
+static DiaObjectChange* usecase_move_handle(Usecase *usecase, Handle *handle,
                                         Point *to, ConnectionPoint *cp,
                                         HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* usecase_move(Usecase *usecase, Point *to);
+static DiaObjectChange* usecase_move(Usecase *usecase, Point *to);
 static void usecase_draw(Usecase *usecase, DiaRenderer *renderer);
 static DiaObject *usecase_create(Point *startpoint,
                              void *user_data,
@@ -193,7 +193,7 @@ usecase_select(Usecase *usecase, Point *clicked_point,
   element_update_handles(&usecase->element);
 }
 
-static ObjectChange*
+static DiaObjectChange*
 usecase_move_handle(Usecase *usecase, Handle *handle,
                    Point *to, ConnectionPoint *cp,
                    HandleMoveReason reason, ModifierKeys modifiers)
@@ -207,7 +207,7 @@ usecase_move_handle(Usecase *usecase, Handle *handle,
   return NULL;
 }
 
-static ObjectChange*
+static DiaObjectChange*
 usecase_move(Usecase *usecase, Point *to)
 {
   real h;
diff --git a/objects/chronogram/chronoline.c b/objects/chronogram/chronoline.c
index 90cab1521..c33fb9d0e 100644
--- a/objects/chronogram/chronoline.c
+++ b/objects/chronogram/chronoline.c
@@ -72,8 +72,8 @@ typedef struct _Chronoline {
   CLEventList *evtlist;
 
   int checksum;
-  real labelwidth;
-  real y_down,y_up;
+  double labelwidth;
+  double y_down,y_up;
   Color gray, datagray;
 } Chronoline;
 
@@ -81,11 +81,14 @@ typedef struct _Chronoline {
 static real chronoline_distance_from(Chronoline *chronoline, Point *point);
 static void chronoline_select(Chronoline *chronoline, Point *clicked_point,
                       DiaRenderer *interactive_renderer);
-static ObjectChange* chronoline_move_handle(Chronoline *chronoline, Handle *handle,
-                                           Point *to, ConnectionPoint *cp,
-                                           HandleMoveReason reason,
-                           ModifierKeys modifiers);
-static ObjectChange* chronoline_move(Chronoline *chronoline, Point *to);
+static DiaObjectChange *chronoline_move_handle    (Chronoline       *chronoline,
+                                                   Handle           *handle,
+                                                   Point            *to,
+                                                   ConnectionPoint  *cp,
+                                                   HandleMoveReason  reason,
+                                                   ModifierKeys      modifiers);
+static DiaObjectChange  *chronoline_move          (Chronoline       *chronoline,
+                                                   Point            *to);
 static void chronoline_draw(Chronoline *chronoline, DiaRenderer *renderer);
 static void chronoline_update_data(Chronoline *chronoline);
 static DiaObject *chronoline_create(Point *startpoint,
@@ -254,31 +257,41 @@ chronoline_select(Chronoline *chronoline, Point *clicked_point,
   element_update_handles(&chronoline->element);
 }
 
-static ObjectChange*
-chronoline_move_handle(Chronoline *chronoline, Handle *handle,
-                      Point *to, ConnectionPoint *cp,
-                      HandleMoveReason reason, ModifierKeys modifiers)
+
+static DiaObjectChange *
+chronoline_move_handle (Chronoline       *chronoline,
+                        Handle           *handle,
+                        Point            *to,
+                        ConnectionPoint  *cp,
+                        HandleMoveReason  reason,
+                        ModifierKeys      modifiers)
 {
   g_assert(chronoline!=NULL);
   g_assert(handle!=NULL);
   g_assert(to!=NULL);
 
-  element_move_handle(&chronoline->element, handle->id, to, cp,
-                     reason, modifiers);
-  chronoline_update_data(chronoline);
+  element_move_handle (&chronoline->element,
+                       handle->id,
+                       to,
+                       cp,
+                       reason,
+                       modifiers);
+  chronoline_update_data (chronoline);
 
   return NULL;
 }
 
-static ObjectChange*
-chronoline_move(Chronoline *chronoline, Point *to)
+
+static DiaObjectChange*
+chronoline_move (Chronoline *chronoline, Point *to)
 {
   chronoline->element.corner = *to;
-  chronoline_update_data(chronoline);
+  chronoline_update_data (chronoline);
 
   return NULL;
 }
 
+
 static void
 cld_onebit (Chronoline  *chronoline,
             DiaRenderer *renderer,
diff --git a/objects/chronogram/chronoref.c b/objects/chronogram/chronoref.c
index 6d8be4fe3..e8d2bb6d8 100644
--- a/objects/chronogram/chronoref.c
+++ b/objects/chronogram/chronoref.c
@@ -72,11 +72,14 @@ typedef struct _Chronoref {
 static real chronoref_distance_from(Chronoref *chronoref, Point *point);
 static void chronoref_select(Chronoref *chronoref, Point *clicked_point,
                       DiaRenderer *interactive_renderer);
-static ObjectChange* chronoref_move_handle(Chronoref *chronoref, Handle *handle,
-                                          Point *to, ConnectionPoint *cp,
-                                          HandleMoveReason reason,
-                           ModifierKeys modifiers);
-static ObjectChange* chronoref_move(Chronoref *chronoref, Point *to);
+static DiaObjectChange *chronoref_move_handle  (Chronoref        *chronoref,
+                                                Handle           *handle,
+                                                Point            *to,
+                                                ConnectionPoint  *cp,
+                                                HandleMoveReason  reason,
+                                                ModifierKeys      modifiers);
+static DiaObjectChange *chronoref_move         (Chronoref        *chronoref,
+                                                Point            *to);
 static void chronoref_draw(Chronoref *chronoref, DiaRenderer *renderer);
 static void chronoref_update_data(Chronoref *chronoref);
 static DiaObject *chronoref_create(Point *startpoint,
@@ -233,31 +236,41 @@ chronoref_select(Chronoref *chronoref, Point *clicked_point,
   element_update_handles(&chronoref->element);
 }
 
-static ObjectChange*
-chronoref_move_handle(Chronoref *chronoref, Handle *handle,
-                     Point *to, ConnectionPoint *cp,
-                     HandleMoveReason reason, ModifierKeys modifiers)
+
+static DiaObjectChange *
+chronoref_move_handle (Chronoref        *chronoref,
+                       Handle           *handle,
+                       Point            *to,
+                       ConnectionPoint  *cp,
+                       HandleMoveReason  reason,
+                       ModifierKeys      modifiers)
 {
   g_assert(chronoref!=NULL);
   g_assert(handle!=NULL);
   g_assert(to!=NULL);
 
-  element_move_handle(&chronoref->element, handle->id, to, cp,
-                     reason, modifiers);
-  chronoref_update_data(chronoref);
+  element_move_handle (&chronoref->element,
+                       handle->id,
+                       to,
+                       cp,
+                       reason,
+                       modifiers);
+  chronoref_update_data (chronoref);
 
   return NULL;
 }
 
-static ObjectChange*
-chronoref_move(Chronoref *chronoref, Point *to)
+
+static DiaObjectChange *
+chronoref_move (Chronoref *chronoref, Point *to)
 {
   chronoref->element.corner = *to;
-  chronoref_update_data(chronoref);
+  chronoref_update_data (chronoref);
 
   return NULL;
 }
 
+
 static void
 chronoref_draw(Chronoref *chronoref, DiaRenderer *renderer)
 {
diff --git a/objects/custom/custom_object.c b/objects/custom/custom_object.c
index 82a8bed63..33b844681 100644
--- a/objects/custom/custom_object.c
+++ b/objects/custom/custom_object.c
@@ -46,6 +46,7 @@
 #include "dia_image.h"
 #include "custom_object.h"
 #include "prefs.h"
+#include "dia-object-change-legacy.h"
 
 #include "pixmaps/custom.xpm"
 
@@ -74,8 +75,8 @@ struct _Custom {
   /*! ShapeInfo giving the object it's drawing info */
   ShapeInfo *info;
   /*! transformation coords */
-  real xscale, yscale;
-  real xoffs,  yoffs;
+  double xscale, yscale;
+  double xoffs,  yoffs;
 
   /*!
    * The sub-scale variables
@@ -83,8 +84,8 @@ struct _Custom {
    * (shift-pressed) scaling
    * @{
    */
-  real subscale;
-  real old_subscale;
+  double subscale;
+  double old_subscale;
   /*! @} */
   /*!
    * \brief Pointer changing during the drawing of the display list
@@ -96,29 +97,35 @@ struct _Custom {
   /*! Connection points need to be dynamically allocated */
   ConnectionPoint *connections;
   /*! width calculate from line_width */
-  real border_width;
+  double border_width;
   Color border_color;
   Color inner_color;
   gboolean show_background;
   LineStyle line_style;
-  real dashlength;
+  double dashlength;
 
   gboolean flip_h, flip_v;
 
   Text *text;
-  real padding;
+  double padding;
 
   TextFitting text_fitting;
 };
 
-static real custom_distance_from(Custom *custom, Point *point);
-static void custom_select(Custom *custom, Point *clicked_point,
-                         DiaRenderer *interactive_renderer);
-static ObjectChange* custom_move_handle(Custom *custom, Handle *handle,
-                                       Point *to, ConnectionPoint *cp,
-                                       HandleMoveReason reason,
-                                       ModifierKeys modifiers);
-static ObjectChange* custom_move(Custom *custom, Point *to);
+
+static double           custom_distance_from (Custom           *custom,
+                                              Point            *point);
+static void             custom_select        (Custom           *custom,
+                                              Point            *clicked_point,
+                                              DiaRenderer      *interactive_renderer);
+static DiaObjectChange *custom_move_handle   (Custom           *custom,
+                                              Handle           *handle,
+                                              Point            *to,
+                                              ConnectionPoint  *cp,
+                                              HandleMoveReason  reason,
+                                              ModifierKeys      modifiers);
+static DiaObjectChange *custom_move          (Custom           *custom,
+                                              Point            *to);
 static void custom_draw(Custom *custom, DiaRenderer *renderer);
 static void custom_draw_displaylist(GList *display_list, Custom *custom,
                                DiaRenderer *renderer, GArray *arr, GArray *barr, real* cur_line,
@@ -788,7 +795,7 @@ custom_adjust_scale (Custom           *custom,
 }
 
 
-static ObjectChange*
+static DiaObjectChange *
 custom_move_handle (Custom           *custom,
                     Handle           *handle,
                     Point            *to,
@@ -862,40 +869,43 @@ custom_move_handle (Custom           *custom,
   return NULL;
 }
 
-static ObjectChange*
-custom_move(Custom *custom, Point *to)
+
+static DiaObjectChange *
+custom_move (Custom *custom, Point *to)
 {
   custom->element.corner = *to;
 
-  custom_update_data(custom, ANCHOR_MIDDLE, ANCHOR_MIDDLE);
+  custom_update_data (custom, ANCHOR_MIDDLE, ANCHOR_MIDDLE);
 
   return NULL;
 }
 
+
 static void
-get_colour(Custom *custom, Color *colour, gint32 c, real opacity)
+get_colour (Custom *custom, Color *colour, gint32 c, double opacity)
 {
   switch (c) {
-  case DIA_SVG_COLOUR_NONE:
-    break;
-  case DIA_SVG_COLOUR_FOREGROUND:
-    *colour = custom->border_color;
-    break;
-  case DIA_SVG_COLOUR_BACKGROUND:
-    *colour = custom->inner_color;
-    break;
-  case DIA_SVG_COLOUR_TEXT:
-    *colour = custom->text->color;
-    break;
-  default:
-    colour->alpha = opacity;
-    colour->red   = ((c & 0x00ff0000) >> 16) / 255.0;
-    colour->green = ((c & 0x0000ff00) >> 8) / 255.0;
-    colour->blue  =  (c & 0x000000ff) / 255.0;
-    break;
+    case DIA_SVG_COLOUR_NONE:
+      break;
+    case DIA_SVG_COLOUR_FOREGROUND:
+      *colour = custom->border_color;
+      break;
+    case DIA_SVG_COLOUR_BACKGROUND:
+      *colour = custom->inner_color;
+      break;
+    case DIA_SVG_COLOUR_TEXT:
+      *colour = custom->text->color;
+      break;
+    default:
+      colour->alpha = opacity;
+      colour->red   = ((c & 0x00ff0000) >> 16) / 255.0;
+      colour->green = ((c & 0x0000ff00) >> 8) / 255.0;
+      colour->blue  =  (c & 0x000000ff) / 255.0;
+      break;
   }
 }
 
+
 static void
 custom_draw (Custom *custom, DiaRenderer *renderer)
 {
@@ -1870,11 +1880,11 @@ custom_change_revert (struct CustomObjectChange *change,
 }
 
 
-static ObjectChange *
+static DiaObjectChange *
 custom_flip_h_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
   Custom *custom = (Custom *)obj;
-  struct CustomObjectChange *change = g_new0(struct CustomObjectChange, 1);
+  struct CustomObjectChange *change = g_new0 (struct CustomObjectChange, 1);
 
   change->objchange.apply = (ObjectChangeApplyFunc)custom_change_apply;
   change->objchange.revert = (ObjectChangeRevertFunc)custom_change_revert;
@@ -1885,14 +1895,15 @@ custom_flip_h_callback (DiaObject *obj, Point *clicked, gpointer data)
   custom->flip_h = !custom->flip_h;
   custom_update_data(custom, ANCHOR_MIDDLE, ANCHOR_MIDDLE);
 
-  return &change->objchange;
+  return dia_object_change_legacy_new (&change->objchange);
 }
 
-static ObjectChange *
+
+static DiaObjectChange *
 custom_flip_v_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
   Custom *custom = (Custom *)obj;
-  struct CustomObjectChange *change = g_new0(struct CustomObjectChange, 1);
+  struct CustomObjectChange *change = g_new0 (struct CustomObjectChange, 1);
 
   change->objchange.apply = (ObjectChangeApplyFunc)custom_change_apply;
   change->objchange.revert = (ObjectChangeRevertFunc)custom_change_revert;
@@ -1903,9 +1914,10 @@ custom_flip_v_callback (DiaObject *obj, Point *clicked, gpointer data)
   custom->flip_v = !custom->flip_v;
   custom_update_data(custom, ANCHOR_MIDDLE, ANCHOR_MIDDLE);
 
-  return &change->objchange;
+  return dia_object_change_legacy_new (&change->objchange);
 }
 
+
 static DiaMenuItem custom_menu_items[] = {
   { N_("Flip Horizontal"), custom_flip_h_callback, NULL, 1 },
   { N_("Flip Vertical"), custom_flip_v_callback, NULL, 1 },
diff --git a/objects/flowchart/box.c b/objects/flowchart/box.c
index 9fa87c9db..8c6e4514f 100644
--- a/objects/flowchart/box.c
+++ b/objects/flowchart/box.c
@@ -80,11 +80,14 @@ static BoxProperties default_properties;
 static real box_distance_from(Box *box, Point *point);
 static void box_select(Box *box, Point *clicked_point,
                       DiaRenderer *interactive_renderer);
-static ObjectChange* box_move_handle(Box *box, Handle *handle,
-                                    Point *to, ConnectionPoint *cp,
-                                    HandleMoveReason reason,
-                           ModifierKeys modifiers);
-static ObjectChange* box_move(Box *box, Point *to);
+static DiaObjectChange *box_move_handle         (Box              *box,
+                                                 Handle           *handle,
+                                                 Point            *to,
+                                                 ConnectionPoint  *cp,
+                                                 HandleMoveReason  reason,
+                                                 ModifierKeys      modifiers);
+static DiaObjectChange *box_move                (Box              *box,
+                                                 Point            *to);
 static void box_draw(Box *box, DiaRenderer *renderer);
 static void box_update_data(Box *box, AnchorShape horix, AnchorShape vert);
 static DiaObject *box_create(Point *startpoint,
@@ -262,7 +265,7 @@ box_select (Box         *box,
 }
 
 
-static ObjectChange *
+static DiaObjectChange *
 box_move_handle (Box              *box,
                  Handle           *handle,
                  Point            *to,
@@ -272,7 +275,7 @@ box_move_handle (Box              *box,
 {
   AnchorShape horiz = ANCHOR_MIDDLE, vert = ANCHOR_MIDDLE;
   Point corner;
-  real width, height;
+  double width, height;
 
   g_return_val_if_fail (box != NULL, NULL);
   g_return_val_if_fail (handle != NULL, NULL);
@@ -338,7 +341,7 @@ box_move_handle (Box              *box,
 }
 
 
-static ObjectChange*
+static DiaObjectChange *
 box_move (Box *box, Point *to)
 {
   box->element.corner = *to;
diff --git a/objects/flowchart/diamond.c b/objects/flowchart/diamond.c
index fdc17bbfd..23b5ddf05 100644
--- a/objects/flowchart/diamond.c
+++ b/objects/flowchart/diamond.c
@@ -80,11 +80,14 @@ static DiamondProperties default_properties;
 static real diamond_distance_from(Diamond *diamond, Point *point);
 static void diamond_select(Diamond *diamond, Point *clicked_point,
                       DiaRenderer *interactive_renderer);
-static ObjectChange* diamond_move_handle(Diamond *diamond, Handle *handle,
-                                        Point *to, ConnectionPoint *cp,
-                                        HandleMoveReason reason,
-                           ModifierKeys modifiers);
-static ObjectChange* diamond_move(Diamond *diamond, Point *to);
+static DiaObjectChange* diamond_move_handle     (Diamond          *diamond,
+                                                 Handle           *handle,
+                                                 Point            *to,
+                                                 ConnectionPoint  *cp,
+                                                 HandleMoveReason  reason,
+                                                 ModifierKeys      modifiers);
+static DiaObjectChange* diamond_move            (Diamond          *diamond,
+                                                 Point            *to);
 static void diamond_draw(Diamond *diamond, DiaRenderer *renderer);
 static void diamond_update_data(Diamond *diamond, AnchorShape h,AnchorShape v);
 static DiaObject *diamond_create(Point *startpoint,
@@ -272,14 +275,17 @@ diamond_select (Diamond     *diamond,
 }
 
 
-static ObjectChange*
-diamond_move_handle(Diamond *diamond, Handle *handle,
-                   Point *to, ConnectionPoint *cp,
-                   HandleMoveReason reason, ModifierKeys modifiers)
+static DiaObjectChange *
+diamond_move_handle (Diamond          *diamond,
+                     Handle           *handle,
+                     Point            *to,
+                     ConnectionPoint  *cp,
+                     HandleMoveReason  reason,
+                     ModifierKeys      modifiers)
 {
   AnchorShape horiz = ANCHOR_MIDDLE, vert = ANCHOR_MIDDLE;
   Point corner;
-  real width, height;
+  double width, height;
 
   g_return_val_if_fail (diamond != NULL, NULL);
   g_return_val_if_fail (handle != NULL, NULL);
@@ -345,16 +351,18 @@ diamond_move_handle(Diamond *diamond, Handle *handle,
   return NULL;
 }
 
-static ObjectChange*
-diamond_move(Diamond *diamond, Point *to)
+
+static DiaObjectChange*
+diamond_move (Diamond *diamond, Point *to)
 {
   diamond->element.corner = *to;
 
-  diamond_update_data(diamond, ANCHOR_MIDDLE, ANCHOR_MIDDLE);
+  diamond_update_data (diamond, ANCHOR_MIDDLE, ANCHOR_MIDDLE);
 
   return NULL;
 }
 
+
 static void
 diamond_draw(Diamond *diamond, DiaRenderer *renderer)
 {
diff --git a/objects/flowchart/ellipse.c b/objects/flowchart/ellipse.c
index 642d98587..6c6134a2a 100644
--- a/objects/flowchart/ellipse.c
+++ b/objects/flowchart/ellipse.c
@@ -79,11 +79,14 @@ static EllipseProperties default_properties;
 static real ellipse_distance_from(Ellipse *ellipse, Point *point);
 static void ellipse_select(Ellipse *ellipse, Point *clicked_point,
                       DiaRenderer *interactive_renderer);
-static ObjectChange* ellipse_move_handle(Ellipse *ellipse, Handle *handle,
-                                        Point *to, ConnectionPoint *cp,
-                                        HandleMoveReason reason,
-                           ModifierKeys modifiers);
-static ObjectChange* ellipse_move(Ellipse *ellipse, Point *to);
+static DiaObjectChange* ellipse_move_handle    (Ellipse          *ellipse,
+                                                Handle           *handle,
+                                                Point            *to,
+                                                ConnectionPoint  *cp,
+                                                HandleMoveReason  reason,
+                                                ModifierKeys      modifiers);
+static DiaObjectChange* ellipse_move           (Ellipse          *ellipse,
+                                                Point            *to);
 static void ellipse_draw(Ellipse *ellipse, DiaRenderer *renderer);
 static void ellipse_update_data(Ellipse *ellipse, AnchorShape h,AnchorShape v);
 static DiaObject *ellipse_create(Point *startpoint,
@@ -271,7 +274,7 @@ ellipse_select (Ellipse     *ellipse,
 }
 
 
-static ObjectChange*
+static DiaObjectChange *
 ellipse_move_handle (Ellipse          *ellipse,
                      Handle           *handle,
                      Point            *to,
@@ -347,16 +350,18 @@ ellipse_move_handle (Ellipse          *ellipse,
   return NULL;
 }
 
-static ObjectChange*
-ellipse_move(Ellipse *ellipse, Point *to)
+
+static DiaObjectChange *
+ellipse_move (Ellipse *ellipse, Point *to)
 {
   ellipse->element.corner = *to;
 
-  ellipse_update_data(ellipse, ANCHOR_MIDDLE, ANCHOR_MIDDLE);
+  ellipse_update_data (ellipse, ANCHOR_MIDDLE, ANCHOR_MIDDLE);
 
   return NULL;
 }
 
+
 static void
 ellipse_draw (Ellipse *ellipse, DiaRenderer *renderer)
 {
diff --git a/objects/flowchart/parallelogram.c b/objects/flowchart/parallelogram.c
index 68c764d9f..213ccf7c9 100644
--- a/objects/flowchart/parallelogram.c
+++ b/objects/flowchart/parallelogram.c
@@ -81,11 +81,14 @@ static PgramProperties default_properties;
 static real pgram_distance_from(Pgram *pgram, Point *point);
 static void pgram_select(Pgram *pgram, Point *clicked_point,
                       DiaRenderer *interactive_renderer);
-static ObjectChange* pgram_move_handle(Pgram *pgram, Handle *handle,
-                                      Point *to, ConnectionPoint *cp,
-                                      HandleMoveReason reason,
-                           ModifierKeys modifiers);
-static ObjectChange* pgram_move(Pgram *pgram, Point *to);
+static DiaObjectChange *pgram_move_handle      (Pgram            *pgram,
+                                                Handle           *handle,
+                                                Point            *to,
+                                                ConnectionPoint  *cp,
+                                                HandleMoveReason  reason,
+                                                ModifierKeys      modifiers);
+static DiaObjectChange *pgram_move             (Pgram            *pgram,
+                                                Point            *to);
 static void pgram_draw(Pgram *pgram, DiaRenderer *renderer);
 static void pgram_update_data(Pgram *pgram, AnchorShape h, AnchorShape v);
 static DiaObject *pgram_create(Point *startpoint,
@@ -270,7 +273,7 @@ pgram_select(Pgram *pgram, Point *clicked_point,
 }
 
 
-static ObjectChange*
+static DiaObjectChange *
 pgram_move_handle (Pgram            *pgram,
                    Handle           *handle,
                    Point            *to,
@@ -345,16 +348,18 @@ pgram_move_handle (Pgram            *pgram,
   return NULL;
 }
 
-static ObjectChange*
-pgram_move(Pgram *pgram, Point *to)
+
+static DiaObjectChange *
+pgram_move (Pgram *pgram, Point *to)
 {
   pgram->element.corner = *to;
 
-  pgram_update_data(pgram, ANCHOR_MIDDLE, ANCHOR_MIDDLE);
+  pgram_update_data (pgram, ANCHOR_MIDDLE, ANCHOR_MIDDLE);
 
   return NULL;
 }
 
+
 static void
 pgram_draw (Pgram *pgram, DiaRenderer *renderer)
 {
diff --git a/objects/network/basestation.c b/objects/network/basestation.c
index e705a2c2f..d6ec77aa5 100644
--- a/objects/network/basestation.c
+++ b/objects/network/basestation.c
@@ -61,12 +61,14 @@ static real basestation_distance_from(Basestation *basestation,
 static void basestation_select(Basestation *basestation,
                                Point *clicked_point,
                                DiaRenderer *interactive_renderer);
-static ObjectChange
-    *basestation_move_handle(Basestation *basestation, Handle *handle,
-                             Point *to, ConnectionPoint *cp,
-                             HandleMoveReason reason,
-                             ModifierKeys modifiers);
-static ObjectChange *basestation_move(Basestation *basestation, Point *to);
+static DiaObjectChange *basestation_move_handle    (Basestation      *basestation,
+                                                    Handle           *handle,
+                                                    Point            *to,
+                                                    ConnectionPoint  *cp,
+                                                    HandleMoveReason  reason,
+                                                    ModifierKeys      modifiers);
+static DiaObjectChange *basestation_move           (Basestation      *basestation,
+                                                    Point            *to);
 static void basestation_draw(Basestation *basestation,
                              DiaRenderer *renderer);
 static DiaObject *basestation_create(Point *startpoint,
@@ -187,12 +189,16 @@ basestation_select(Basestation *basestation, Point *clicked_point,
   element_update_handles(&basestation->element);
 }
 
-static ObjectChange*
-basestation_move_handle(Basestation *basestation, Handle *handle,
-                        Point *to, ConnectionPoint *cp,
-                        HandleMoveReason reason, ModifierKeys modifiers)
+
+static DiaObjectChange *
+basestation_move_handle (Basestation      *basestation,
+                         Handle           *handle,
+                         Point            *to,
+                         ConnectionPoint  *cp,
+                         HandleMoveReason  reason,
+                         ModifierKeys      modifiers)
 {
-  ObjectChange* oc;
+  DiaObjectChange *oc;
 
   assert(basestation!=NULL);
   assert(handle!=NULL);
@@ -207,8 +213,9 @@ basestation_move_handle(Basestation *basestation, Handle *handle,
   return oc;
 }
 
-static ObjectChange*
-basestation_move(Basestation *basestation, Point *to)
+
+static DiaObjectChange*
+basestation_move (Basestation *basestation, Point *to)
 {
   Element *elem = &basestation->element;
 
diff --git a/objects/network/bus.c b/objects/network/bus.c
index b183764b7..75e745705 100644
--- a/objects/network/bus.c
+++ b/objects/network/bus.c
@@ -29,6 +29,7 @@
 #include "attributes.h"
 #include "diamenu.h"
 #include "properties.h"
+#include "dia-object-change-legacy.h"
 
 #include "pixmaps/bus.xpm"
 
@@ -65,10 +66,15 @@ struct PointChange {
   ConnectionPoint *connected_to; /* NULL if not connected */
 };
 
-static ObjectChange* bus_move_handle(Bus *bus, Handle *handle,
-                                    Point *to, ConnectionPoint *cp,
-                                    HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* bus_move(Bus *bus, Point *to);
+
+static DiaObjectChange* bus_move_handle        (Bus              *bus,
+                                                Handle           *handle,
+                                                Point            *to,
+                                                ConnectionPoint  *cp,
+                                                HandleMoveReason  reason,
+                                                ModifierKeys      modifiers);
+static DiaObjectChange* bus_move               (Bus              *bus,
+                                                Point            *to);
 static void bus_select(Bus *bus, Point *clicked_point,
                       DiaRenderer *interactive_renderer);
 static void bus_draw(Bus *bus, DiaRenderer *renderer);
@@ -88,10 +94,11 @@ static void bus_save(Bus *bus, ObjectNode obj_node, DiaContext *ctx);
 static DiaObject *bus_load(ObjectNode obj_node, int version, DiaContext *ctx);
 static DiaMenu *bus_get_object_menu(Bus *bus, Point *clickedpoint);
 
-static ObjectChange *
-bus_create_change(Bus *bus, enum change_type type,
-                 Point *point, Handle *handle,
-                 ConnectionPoint *connected_to);
+static DiaObjectChange *bus_create_change (Bus              *bus,
+                                           enum change_type  type,
+                                           Point            *point,
+                                           Handle           *handle,
+                                           ConnectionPoint  *connected_to);
 
 
 static ObjectTypeOps bus_type_ops =
@@ -190,19 +197,23 @@ bus_select(Bus *bus, Point *clicked_point,
   connection_update_handles(&bus->connection);
 }
 
-static ObjectChange*
-bus_move_handle(Bus *bus, Handle *handle,
-               Point *to, ConnectionPoint *cp,
-               HandleMoveReason reason, ModifierKeys modifiers)
+
+static DiaObjectChange *
+bus_move_handle (Bus              *bus,
+                 Handle           *handle,
+                 Point            *to,
+                 ConnectionPoint  *cp,
+                 HandleMoveReason  reason,
+                 ModifierKeys      modifiers)
 {
   Connection *conn = &bus->connection;
   Point *endpoints;
-  real *parallel=NULL;
-  real *perp=NULL;
+  double *parallel=NULL;
+  double *perp=NULL;
   Point vhat, vhatperp;
   Point u;
-  real vlen, vlen2;
-  real len_scale;
+  double vlen, vlen2;
+  double len_scale;
   int i;
   const int num_handles = bus->num_handles; /* const to help scan-build */
 
@@ -263,8 +274,9 @@ bus_move_handle(Bus *bus, Handle *handle,
   return NULL;
 }
 
-static ObjectChange*
-bus_move(Bus *bus, Point *to)
+
+static DiaObjectChange *
+bus_move (Bus *bus, Point *to)
 {
   Point delta;
   Point *endpoints = &bus->connection.endpoints[0];
@@ -534,7 +546,8 @@ bus_remove_handle(Bus *bus, Handle *handle)
   }
 }
 
-static ObjectChange *
+
+static DiaObjectChange *
 bus_add_handle_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
   Bus *bus = (Bus *) obj;
@@ -571,7 +584,8 @@ bus_point_near_handle(Bus *bus, Point *p)
     return -1;
 }
 
-static ObjectChange *
+
+static DiaObjectChange *
 bus_delete_handle_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
   Bus *bus = (Bus *) obj;
@@ -744,10 +758,12 @@ bus_change_revert (struct PointChange *change, DiaObject *obj)
 }
 
 
-static ObjectChange *
-bus_create_change(Bus *bus, enum change_type type,
-                 Point *point, Handle *handle,
-                 ConnectionPoint *connected_to)
+static DiaObjectChange *
+bus_create_change (Bus              *bus,
+                   enum change_type  type,
+                   Point            *point,
+                   Handle           *handle,
+                   ConnectionPoint  *connected_to)
 {
   struct PointChange *change;
 
@@ -763,7 +779,5 @@ bus_create_change(Bus *bus, enum change_type type,
   change->handle = handle;
   change->connected_to = connected_to;
 
-  return (ObjectChange *)change;
+  return dia_object_change_legacy_new ((ObjectChange *) change);
 }
-
-
diff --git a/objects/network/radiocell.c b/objects/network/radiocell.c
index 2ceb3db7e..8519da12d 100644
--- a/objects/network/radiocell.c
+++ b/objects/network/radiocell.c
@@ -58,12 +58,12 @@ struct _RadioCell {
 static real radiocell_distance_from(RadioCell *radiocell, Point *point);
 static void radiocell_select(RadioCell *radiocell, Point *clicked_point,
                             DiaRenderer *interactive_renderer);
-static ObjectChange* radiocell_move_handle(RadioCell *radiocell,
+static DiaObjectChange* radiocell_move_handle(RadioCell *radiocell,
                                           Handle *handle,
                                           Point *to, ConnectionPoint *cp,
                                           HandleMoveReason reason,
                                           ModifierKeys modifiers);
-static ObjectChange* radiocell_move(RadioCell *radiocell, Point *to);
+static DiaObjectChange* radiocell_move(RadioCell *radiocell, Point *to);
 static void radiocell_draw(RadioCell *radiocell, DiaRenderer *renderer);
 static DiaObject *radiocell_create(Point *startpoint,
                                void *user_data,
@@ -193,7 +193,7 @@ radiocell_select(RadioCell *radiocell, Point *clicked_point,
   radiocell_update_data(radiocell);
 }
 
-static ObjectChange*
+static DiaObjectChange*
 radiocell_move_handle(RadioCell *radiocell, Handle *handle,
                      Point *to, ConnectionPoint *cp,
                      HandleMoveReason reason, ModifierKeys modifiers)
@@ -230,7 +230,7 @@ radiocell_move_handle(RadioCell *radiocell, Handle *handle,
   return NULL;
 }
 
-static ObjectChange*
+static DiaObjectChange*
 radiocell_move(RadioCell *radiocell, Point *to)
 {
   polyshape_move(&radiocell->poly, to);
diff --git a/objects/network/wanlink.c b/objects/network/wanlink.c
index 54ff6e35d..db788708a 100644
--- a/objects/network/wanlink.c
+++ b/objects/network/wanlink.c
@@ -61,8 +61,8 @@ static real wanlink_distance_from(WanLink *wanlink, Point *point);
 static void wanlink_select(WanLink *wanlink, Point *clicked_point,
                         DiaRenderer *interactive_renderer);
 static DiaObject *wanlink_copy(WanLink *wanlink);
-static ObjectChange* wanlink_move(WanLink *wanlink, Point *to);
-static ObjectChange* wanlink_move_handle(WanLink *wanlink, Handle *handle,
+static DiaObjectChange* wanlink_move(WanLink *wanlink, Point *to);
+static DiaObjectChange* wanlink_move_handle(WanLink *wanlink, Handle *handle,
                                         Point *to, ConnectionPoint *cp,
                                         HandleMoveReason reason,
                              ModifierKeys modifiers);
@@ -265,7 +265,7 @@ wanlink_copy(WanLink *wanlink)
   return (DiaObject *)newwanlink;
 }
 
-static ObjectChange*
+static DiaObjectChange*
 wanlink_move(WanLink *wanlink, Point *to)
 {
   Point delta;
@@ -285,7 +285,7 @@ wanlink_move(WanLink *wanlink, Point *to)
   return NULL;
 }
 
-static ObjectChange*
+static DiaObjectChange*
 wanlink_move_handle(WanLink *wanlink, Handle *handle,
                    Point *to, ConnectionPoint *cp,
                    HandleMoveReason reason, ModifierKeys modifiers)
diff --git a/objects/standard/arc.c b/objects/standard/arc.c
index 5d477bb4e..425fc8358 100644
--- a/objects/standard/arc.c
+++ b/objects/standard/arc.c
@@ -71,10 +71,10 @@ struct _Arc {
 };
 
 /* updates both endpoints and arc->curve_distance */
-static ObjectChange* arc_move_handle(Arc *arc, Handle *handle,
+static DiaObjectChange* arc_move_handle(Arc *arc, Handle *handle,
                                     Point *to, ConnectionPoint *cp,
                                     HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* arc_move(Arc *arc, Point *to);
+static DiaObjectChange* arc_move(Arc *arc, Point *to);
 static void arc_select(Arc *arc, Point *clicked_point,
                       DiaRenderer *interactive_renderer);
 static void arc_draw(Arc *arc, DiaRenderer *renderer);
@@ -334,7 +334,7 @@ point_projection_is_between (const Point *c,
   return (c->x == a->x && c->y == a->y);
 }
 
-static ObjectChange*
+static DiaObjectChange*
 arc_move_handle(Arc *arc, Handle *handle,
                Point *to, ConnectionPoint *cp,
                HandleMoveReason reason, ModifierKeys modifiers)
@@ -428,7 +428,7 @@ arc_move_handle(Arc *arc, Handle *handle,
   return NULL;
 }
 
-static ObjectChange*
+static DiaObjectChange*
 arc_move(Arc *arc, Point *to)
 {
   Point start_to_end;
diff --git a/objects/standard/bezier.c b/objects/standard/bezier.c
index 66a2d1254..94913ab03 100644
--- a/objects/standard/bezier.c
+++ b/objects/standard/bezier.c
@@ -51,17 +51,21 @@ struct _Bezierline {
   LineStyle line_style;
   LineJoin line_join;
   LineCaps line_caps;
-  real dashlength;
-  real line_width;
+  double dashlength;
+  double line_width;
   Arrow start_arrow, end_arrow;
-  real absolute_start_gap, absolute_end_gap;
+  double absolute_start_gap, absolute_end_gap;
 };
 
 
-static ObjectChange* bezierline_move_handle(Bezierline *bezierline, Handle *handle,
-                                           Point *to, ConnectionPoint *cp,
-                                           HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* bezierline_move(Bezierline *bezierline, Point *to);
+static DiaObjectChange* bezierline_move_handle     (Bezierline       *bezierline,
+                                                    Handle           *handle,
+                                                    Point            *to,
+                                                    ConnectionPoint  *cp,
+                                                    HandleMoveReason  reason,
+                                                    ModifierKeys      modifiers);
+static DiaObjectChange* bezierline_move            (Bezierline       *bezierline,
+                                                    Point            *to);
 static void bezierline_select(Bezierline *bezierline, Point *clicked_point,
                              DiaRenderer *interactive_renderer);
 static void bezierline_draw(Bezierline *bezierline, DiaRenderer *renderer);
@@ -222,10 +226,14 @@ bezierline_select(Bezierline *bezierline, Point *clicked_point,
   bezierconn_update_data(&bezierline->bez);
 }
 
-static ObjectChange*
-bezierline_move_handle(Bezierline *bezierline, Handle *handle,
-                      Point *to, ConnectionPoint *cp,
-                      HandleMoveReason reason, ModifierKeys modifiers)
+
+static DiaObjectChange *
+bezierline_move_handle (Bezierline       *bezierline,
+                        Handle           *handle,
+                        Point            *to,
+                        ConnectionPoint  *cp,
+                        HandleMoveReason  reason,
+                        ModifierKeys      modifiers)
 {
   assert(bezierline!=NULL);
   assert(handle!=NULL);
@@ -256,15 +264,16 @@ bezierline_move_handle(Bezierline *bezierline, Handle *handle,
 }
 
 
-static ObjectChange*
-bezierline_move(Bezierline *bezierline, Point *to)
+static DiaObjectChange *
+bezierline_move (Bezierline *bezierline, Point *to)
 {
-  bezierconn_move(&bezierline->bez, to);
-  bezierline_update_data(bezierline);
+  bezierconn_move (&bezierline->bez, to);
+  bezierline_update_data (bezierline);
 
   return NULL;
 }
 
+
 static void
 exchange_bez_gap_points(BezierConn * bez, Point* gap_points)
 {
@@ -719,48 +728,58 @@ bezierline_load(ObjectNode obj_node, int version, DiaContext *ctx)
   return &bezierline->bez.object;
 }
 
-static ObjectChange *
+
+static DiaObjectChange *
 bezierline_add_segment_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
   Bezierline *bezierline = (Bezierline*) obj;
   int segment;
-  ObjectChange *change;
+  DiaObjectChange *change;
+
+  segment = bezierline_closest_segment (bezierline, clicked);
+  change = bezierconn_add_segment (&bezierline->bez, segment, clicked);
+  bezierline_update_data (bezierline);
 
-  segment = bezierline_closest_segment(bezierline, clicked);
-  change = bezierconn_add_segment(&bezierline->bez, segment, clicked);
-  bezierline_update_data(bezierline);
   return change;
 }
 
-static ObjectChange *
+
+static DiaObjectChange *
 bezierline_delete_segment_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
   int seg_nr;
   Bezierline *bezierline = (Bezierline*) obj;
-  ObjectChange *change;
+  DiaObjectChange *change;
 
-  seg_nr = beziercommon_closest_segment(&bezierline->bez.bezier, clicked, bezierline->line_width);
+  seg_nr = beziercommon_closest_segment (&bezierline->bez.bezier, clicked, bezierline->line_width);
+
+  change = bezierconn_remove_segment (&bezierline->bez, seg_nr+1);
+  bezierline_update_data (bezierline);
 
-  change = bezierconn_remove_segment(&bezierline->bez, seg_nr+1);
-  bezierline_update_data(bezierline);
   return change;
 }
 
-static ObjectChange *
-bezierline_set_corner_type_callback (DiaObject *obj, Point *clicked, gpointer data)
+
+static DiaObjectChange *
+bezierline_set_corner_type_callback (DiaObject *obj,
+                                     Point     *clicked,
+                                     gpointer   data)
 {
   Handle *closest;
   Bezierline *bezierline = (Bezierline*) obj;
-  ObjectChange *change;
+  DiaObjectChange *change;
 
-  closest = bezierconn_closest_major_handle(&bezierline->bez, clicked);
-  change = bezierconn_set_corner_type(&bezierline->bez, closest,
-                                     GPOINTER_TO_INT(data));
+  closest = bezierconn_closest_major_handle (&bezierline->bez, clicked);
+  change = bezierconn_set_corner_type (&bezierline->bez,
+                                       closest,
+                                       GPOINTER_TO_INT (data));
+
+  bezierline_update_data (bezierline);
 
-  bezierline_update_data(bezierline);
   return change;
 }
 
+
 static DiaMenuItem bezierline_menu_items[] = {
   { N_("Add Segment"), bezierline_add_segment_callback, NULL, 1 },
   { N_("Delete Segment"), bezierline_delete_segment_callback, NULL, 1 },
diff --git a/objects/standard/beziergon.c b/objects/standard/beziergon.c
index c944310df..9715f3705 100644
--- a/objects/standard/beziergon.c
+++ b/objects/standard/beziergon.c
@@ -62,10 +62,15 @@ static struct _BeziergonProperties {
   gboolean show_background;
 } default_properties = { TRUE };
 
-static ObjectChange* beziergon_move_handle(Beziergon *beziergon, Handle *handle,
-                                          Point *to, ConnectionPoint *cp,
-                                          HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* beziergon_move(Beziergon *beziergon, Point *to);
+
+static DiaObjectChange* beziergon_move_handle       (Beziergon        *beziergon,
+                                                     Handle           *handle,
+                                                     Point            *to,
+                                                     ConnectionPoint  *cp,
+                                                     HandleMoveReason  reason,
+                                                     ModifierKeys      modifiers);
+static DiaObjectChange* beziergon_move              (Beziergon        *beziergon,
+                                                     Point            *to);
 static void beziergon_select(Beziergon *beziergon, Point *clicked_point,
                             DiaRenderer *interactive_renderer);
 static void beziergon_draw(Beziergon *beziergon, DiaRenderer *renderer);
@@ -184,31 +189,36 @@ beziergon_select(Beziergon *beziergon, Point *clicked_point,
   beziershape_update_data(&beziergon->bezier);
 }
 
-static ObjectChange*
-beziergon_move_handle(Beziergon *beziergon, Handle *handle,
-                     Point *to, ConnectionPoint *cp,
-                     HandleMoveReason reason, ModifierKeys modifiers)
+
+static DiaObjectChange*
+beziergon_move_handle (Beziergon        *beziergon,
+                       Handle           *handle,
+                       Point            *to,
+                       ConnectionPoint  *cp,
+                       HandleMoveReason  reason,
+                       ModifierKeys      modifiers)
 {
   assert(beziergon!=NULL);
   assert(handle!=NULL);
   assert(to!=NULL);
 
-  beziershape_move_handle(&beziergon->bezier, handle, to, cp, reason, modifiers);
-  beziergon_update_data(beziergon);
+  beziershape_move_handle (&beziergon->bezier, handle, to, cp, reason, modifiers);
+  beziergon_update_data (beziergon);
 
   return NULL;
 }
 
 
-static ObjectChange*
-beziergon_move(Beziergon *beziergon, Point *to)
+static DiaObjectChange *
+beziergon_move (Beziergon *beziergon, Point *to)
 {
-  beziershape_move(&beziergon->bezier, to);
-  beziergon_update_data(beziergon);
+  beziershape_move (&beziergon->bezier, to);
+  beziergon_update_data (beziergon);
 
   return NULL;
 }
 
+
 static void
 beziergon_draw (Beziergon *beziergon, DiaRenderer *renderer)
 {
@@ -473,12 +483,13 @@ beziergon_load(ObjectNode obj_node, int version, DiaContext *ctx)
   return &beziergon->bezier.object;
 }
 
-static ObjectChange *
+
+static DiaObjectChange *
 beziergon_add_segment_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
   Beziergon *bezier = (Beziergon*) obj;
   int segment;
-  ObjectChange *change;
+  DiaObjectChange *change;
 
   segment = beziergon_closest_segment(bezier, clicked);
   change = beziershape_add_segment(&bezier->bezier, segment, clicked);
@@ -487,12 +498,13 @@ beziergon_add_segment_callback (DiaObject *obj, Point *clicked, gpointer data)
   return change;
 }
 
-static ObjectChange *
+
+static DiaObjectChange *
 beziergon_delete_segment_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
   int seg_nr;
   Beziergon *bezier = (Beziergon*) obj;
-  ObjectChange *change;
+  DiaObjectChange *change;
 
   seg_nr = beziergon_closest_segment(bezier, clicked);
   change = beziershape_remove_segment(&bezier->bezier, seg_nr+1);
@@ -501,12 +513,13 @@ beziergon_delete_segment_callback (DiaObject *obj, Point *clicked, gpointer data
   return change;
 }
 
-static ObjectChange *
+
+static DiaObjectChange *
 beziergon_set_corner_type_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
   Handle *closest;
   Beziergon *beziergon = (Beziergon *) obj;
-  ObjectChange *change;
+  DiaObjectChange *change;
 
   closest = beziershape_closest_major_handle(&beziergon->bezier, clicked);
   change = beziershape_set_corner_type(&beziergon->bezier, closest,
diff --git a/objects/standard/box.c b/objects/standard/box.c
index 47c17e812..9371d508a 100644
--- a/objects/standard/box.c
+++ b/objects/standard/box.c
@@ -31,6 +31,8 @@
 #include "create.h"
 #include "message.h"
 #include "pattern.h"
+#include "dia-object-change-legacy.h"
+
 
 #define DEFAULT_WIDTH 2.0
 #define DEFAULT_HEIGHT 1.0
@@ -75,32 +77,44 @@ static struct _BoxProperties {
   AspectType aspect;
 } default_properties = { TRUE, 0.0 };
 
-static real box_distance_from(Box *box, Point *point);
-static void box_select(Box *box, Point *clicked_point,
-                      DiaRenderer *interactive_renderer);
-static ObjectChange* box_move_handle(Box *box, Handle *handle,
-                           Point *to, ConnectionPoint *cp,
-                                    HandleMoveReason reason,
-                           ModifierKeys modifiers);
-static ObjectChange* box_move(Box *box, Point *to);
-static void box_draw(Box *box, DiaRenderer *renderer);
-static void box_update_data(Box *box);
-static DiaObject *box_create(Point *startpoint,
-                         void *user_data,
-                         Handle **handle1,
-                         Handle **handle2);
-static void box_destroy(Box *box);
-static DiaObject *box_copy(Box *box);
-
-static void box_set_props(Box *box, GPtrArray *props);
-
-static void box_save(Box *box, ObjectNode obj_node, DiaContext *ctx);
-static DiaObject *box_load(ObjectNode obj_node, int version, DiaContext *ctx);
-static DiaMenu *box_get_object_menu(Box *box, Point *clickedpoint);
-static gboolean box_transform(Box *box, const DiaMatrix *m);
-
-static ObjectTypeOps box_type_ops =
-{
+
+static double           box_distance_from    (Box              *box,
+                                              Point            *point);
+static void             box_select           (Box              *box,
+                                              Point            *clicked_point,
+                                              DiaRenderer      *interactive_renderer);
+static DiaObjectChange *box_move_handle      (Box              *box,
+                                              Handle           *handle,
+                                              Point            *to,
+                                              ConnectionPoint  *cp,
+                                              HandleMoveReason  reason,
+                                              ModifierKeys      modifiers);
+static DiaObjectChange *box_move             (Box              *box,
+                                              Point            *to);
+static void             box_draw             (Box              *box,
+                                              DiaRenderer      *renderer);
+static void             box_update_data      (Box              *box);
+static DiaObject       *box_create           (Point            *startpoint,
+                                              void             *user_data,
+                                              Handle          **handle1,
+                                              Handle          **handle2);
+static void             box_destroy          (Box              *box);
+static DiaObject       *box_copy             (Box              *box);
+static void             box_set_props        (Box              *box,
+                                              GPtrArray        *props);
+static void             box_save             (Box              *box,
+                                              ObjectNode        obj_node,
+                                              DiaContext       *ctx);
+static DiaObject       *box_load             (ObjectNode        obj_node,
+                                              int               version,
+                                              DiaContext       *ctx);
+static DiaMenu         *box_get_object_menu  (Box              *box,
+                                              Point            *clickedpoint);
+static gboolean         box_transform        (Box              *box,
+                                              const DiaMatrix  *m);
+
+
+static ObjectTypeOps box_type_ops = {
   (CreateFunc) box_create,
   (LoadFunc)   box_load,
   (SaveFunc)   box_save,
@@ -265,7 +279,7 @@ box_select(Box *box, Point *clicked_point,
 }
 
 
-static ObjectChange*
+static DiaObjectChange *
 box_move_handle (Box              *box,
                  Handle           *handle,
                  Point            *to,
@@ -336,16 +350,18 @@ box_move_handle (Box              *box,
   return NULL;
 }
 
-static ObjectChange*
-box_move(Box *box, Point *to)
+
+static DiaObjectChange *
+box_move (Box *box, Point *to)
 {
   box->element.corner = *to;
 
-  box_update_data(box);
+  box_update_data (box);
 
   return NULL;
 }
 
+
 static void
 box_draw (Box *box, DiaRenderer *renderer)
 {
@@ -740,7 +756,8 @@ aspect_change_revert(struct AspectChange *change, DiaObject *obj)
   box_update_data(box);
 }
 
-static ObjectChange *
+
+static DiaObjectChange *
 aspect_create_change(Box *box, AspectType aspect)
 {
   struct AspectChange *change;
@@ -757,21 +774,22 @@ aspect_create_change(Box *box, AspectType aspect)
   change->width = box->element.width;
   change->height = box->element.height;
 
-  return (ObjectChange *)change;
+  return dia_object_change_legacy_new ((ObjectChange *) change);
 }
 
 
-static ObjectChange *
+static DiaObjectChange *
 box_set_aspect_callback (DiaObject* obj, Point* clicked, gpointer data)
 {
-  ObjectChange *change;
+  DiaObjectChange *change;
 
-  change = aspect_create_change((Box*)obj, (AspectType)data);
-  change->apply(change, obj);
+  change = aspect_create_change ((Box*) obj, (AspectType) data);
+  dia_object_change_apply (change, obj);
 
   return change;
 }
 
+
 static DiaMenuItem box_menu_items[] = {
   { N_("Free aspect"), box_set_aspect_callback, (void*)FREE_ASPECT,
     DIAMENU_ACTIVE|DIAMENU_TOGGLE },
diff --git a/objects/standard/ellipse.c b/objects/standard/ellipse.c
index 3d681ef8e..83244431b 100644
--- a/objects/standard/ellipse.c
+++ b/objects/standard/ellipse.c
@@ -31,6 +31,8 @@
 #include "pattern.h"
 #include "diapathrenderer.h"
 #include "message.h"
+#include "dia-object-change-legacy.h"
+
 
 #define DEFAULT_WIDTH 2.0
 #define DEFAULT_HEIGHT 1.0
@@ -71,13 +73,20 @@ static struct _EllipseProperties {
   gboolean show_background;
 } default_properties = { FREE_ASPECT, TRUE };
 
-static real ellipse_distance_from(Ellipse *ellipse, Point *point);
-static void ellipse_select(Ellipse *ellipse, Point *clicked_point,
-                          DiaRenderer *interactive_renderer);
-static ObjectChange* ellipse_move_handle(Ellipse *ellipse, Handle *handle,
-                                        Point *to, ConnectionPoint *cp,
-                                        HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* ellipse_move(Ellipse *ellipse, Point *to);
+
+static double           ellipse_distance_from   (Ellipse          *ellipse,
+                                                 Point            *point);
+static void             ellipse_select          (Ellipse          *ellipse,
+                                                 Point            *clicked_point,
+                                                 DiaRenderer      *interactive_renderer);
+static DiaObjectChange *ellipse_move_handle     (Ellipse          *ellipse,
+                                                 Handle           *handle,
+                                                 Point            *to,
+                                                 ConnectionPoint  *cp,
+                                                 HandleMoveReason  reason,
+                                                 ModifierKeys      modifiers);
+static DiaObjectChange *ellipse_move            (Ellipse          *ellipse,
+                                                 Point            *to);
 static void ellipse_draw(Ellipse *ellipse, DiaRenderer *renderer);
 static void ellipse_update_data(Ellipse *ellipse);
 static DiaObject *ellipse_create(Point *startpoint,
@@ -233,7 +242,7 @@ ellipse_select (Ellipse     *ellipse,
 }
 
 
-static ObjectChange*
+static DiaObjectChange*
 ellipse_move_handle (Ellipse          *ellipse,
                      Handle           *handle,
                      Point            *to,
@@ -334,15 +343,16 @@ ellipse_move_handle (Ellipse          *ellipse,
 }
 
 
-static ObjectChange*
-ellipse_move(Ellipse *ellipse, Point *to)
+static DiaObjectChange *
+ellipse_move (Ellipse *ellipse, Point *to)
 {
   ellipse->element.corner = *to;
-  ellipse_update_data(ellipse);
+  ellipse_update_data (ellipse);
 
   return NULL;
 }
 
+
 static void
 ellipse_draw (Ellipse *ellipse, DiaRenderer *renderer)
 {
@@ -747,7 +757,8 @@ aspect_change_revert(struct AspectChange *change, DiaObject *obj)
   ellipse_update_data(ellipse);
 }
 
-static ObjectChange *
+
+static DiaObjectChange *
 aspect_create_change(Ellipse *ellipse, AspectType aspect)
 {
   struct AspectChange *change;
@@ -764,21 +775,22 @@ aspect_create_change(Ellipse *ellipse, AspectType aspect)
   change->width = ellipse->element.width;
   change->height = ellipse->element.height;
 
-  return (ObjectChange *)change;
+  return dia_object_change_legacy_new ((ObjectChange *) change);
 }
 
 
-static ObjectChange *
-ellipse_set_aspect_callback (DiaObject* obj, Point* clicked, gpointer data)
+static DiaObjectChange *
+ellipse_set_aspect_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
-  ObjectChange *change;
+  DiaObjectChange *change;
 
-  change = aspect_create_change((Ellipse*)obj, (AspectType)data);
-  change->apply(change, obj);
+  change = aspect_create_change ((Ellipse *) obj, (AspectType) data);
+  dia_object_change_apply (change, obj);
 
   return change;
 }
 
+
 static DiaMenuItem ellipse_menu_items[] = {
   { N_("Free aspect"), ellipse_set_aspect_callback, (void*)FREE_ASPECT,
     DIAMENU_ACTIVE|DIAMENU_TOGGLE },
diff --git a/objects/standard/image.c b/objects/standard/image.c
index fe16b4bdf..c8727fb32 100644
--- a/objects/standard/image.c
+++ b/objects/standard/image.c
@@ -80,10 +80,10 @@ static struct _ImageProperties {
 static real image_distance_from(Image *image, Point *point);
 static void image_select(Image *image, Point *clicked_point,
                       DiaRenderer *interactive_renderer);
-static ObjectChange* image_move_handle(Image *image, Handle *handle,
+static DiaObjectChange* image_move_handle(Image *image, Handle *handle,
                                       Point *to, ConnectionPoint *cp,
                                       HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* image_move(Image *image, Point *to);
+static DiaObjectChange* image_move(Image *image, Point *to);
 static void image_draw(Image *image, DiaRenderer *renderer);
 static gboolean image_transform(Image *image, const DiaMatrix *m);
 static void image_update_data(Image *image);
@@ -321,7 +321,7 @@ image_select (Image       *image,
 }
 
 
-static ObjectChange*
+static DiaObjectChange*
 image_move_handle (Image            *image,
                    Handle           *handle,
                    Point            *to,
@@ -434,7 +434,7 @@ image_move_handle (Image            *image,
 }
 
 
-static ObjectChange*
+static DiaObjectChange*
 image_move (Image *image, Point *to)
 {
   image->element.corner = *to;
diff --git a/objects/standard/line.c b/objects/standard/line.c
index 90dcd39fa..9ed28996c 100644
--- a/objects/standard/line.c
+++ b/objects/standard/line.c
@@ -68,11 +68,11 @@ struct _LineProperties {
 
 static LineProperties default_properties;
 
-static ObjectChange* line_move_handle(Line *line, Handle *handle,
+static DiaObjectChange* line_move_handle(Line *line, Handle *handle,
                                      Point *to, ConnectionPoint *cp,
                                      HandleMoveReason reason,
                             ModifierKeys modifiers);
-static ObjectChange* line_move(Line *line, Point *to);
+static DiaObjectChange* line_move(Line *line, Point *to);
 static void line_select(Line *line, Point *clicked_point,
                        DiaRenderer *interactive_renderer);
 static void line_draw(Line *line, DiaRenderer *renderer);
@@ -209,12 +209,14 @@ line_init_defaults (void)
  *
  * Add a connection point to the line
  */
-static ObjectChange *
+static DiaObjectChange *
 line_add_connpoint_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
-  ObjectChange *oc;
-  oc = connpointline_add_point (((Line *) obj)->cpl,clicked);
+  DiaObjectChange *oc;
+
+  oc = connpointline_add_point (((Line *) obj)->cpl, clicked);
   line_update_data ((Line *) obj);
+
   return oc;
 }
 
@@ -224,29 +226,33 @@ line_add_connpoint_callback (DiaObject *obj, Point *clicked, gpointer data)
  *
  * \memberof Line
  */
-static ObjectChange *
+static DiaObjectChange *
 line_remove_connpoint_callback(DiaObject *obj, Point *clicked, gpointer data)
 {
-  ObjectChange *oc;
-  oc = connpointline_remove_point(((Line *)obj)->cpl,clicked);
-  line_update_data((Line *)obj);
+  DiaObjectChange *oc;
+
+  oc = connpointline_remove_point (((Line *)obj)->cpl, clicked);
+  line_update_data ((Line *) obj);
+
   return oc;
 }
 
-/*!
- * \brief Upgrade the Line to a Polyline
+
+/**
+ * _convert_to_polyline_callback:
+ * @obj: self pointer
+ * @clicked: last clicked point on canvas or %NULL
+ * @data: here unuesed user_data pointer
  *
- * Convert the _Line to a _Polyline with the position clicked as third point.
- * Further object properties are preserved by the use of object_substitute()
  *
- * @param obj  self pointer
- * @param clicked  last clicked point on canvas or NULL
- * @param data  here unuesed user_data pointer
- * @return an _ObjectChange to support undo/redo
+ * Upgrade the #Line to a #Polyline
  *
- * \memberof Line
+ * Convert the #Line to a Polyline with the position clicked as third point.
+ * Further object properties are preserved by the use of object_substitute()
+ *
+ * Returns: an #DiaObjectChange to support undo/redo
  */
-static ObjectChange *
+static DiaObjectChange *
 _convert_to_polyline_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
   DiaObject *poly;
@@ -267,27 +273,28 @@ _convert_to_polyline_callback (DiaObject *obj, Point *clicked, gpointer data)
   return object_substitute (obj, poly);
 }
 
-/*!
- * \brief Upgrade the Line to a Zigzagline
+
+/**
+ * _convert_to_zigzagline_callback:
+ * @obj: self pointer
+ * @clicked: last clicked point on canvas or %NULL
+ * @data: here unuesed user_data pointer
  *
- * Convert the _Line to a _Zigzagline with the position clicked (if near enough)
+ * Upgrade the #Line to a #Zigzagline
+ *
+ * Convert the #Line to a #Zigzagline with the position clicked (if near enough)
  * for the new segment. The result of this function is more favorable for connected
  * lines by autorouting.
  *
  * Further object properties are preserved by the use of object_substitute()
  *
- * @param obj  self pointer
- * @param clicked  last clicked point on canvas or NULL
- * @param data  here unuesed user_data pointer
- * @return an _ObjectChange to support undo/redo
- *
- * \memberof Line
+ * Returns: an #DiaObjectChange to support undo/redo
  */
-static ObjectChange *
+static DiaObjectChange *
 _convert_to_zigzagline_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
   DiaObject *zigzag;
-  Line *line = (Line *)obj;
+  Line *line = (Line *) obj;
   Point points[4];
 
   if (clicked) {
@@ -317,6 +324,7 @@ _convert_to_zigzagline_callback (DiaObject *obj, Point *clicked, gpointer data)
   return object_substitute (obj, zigzag);
 }
 
+
 static DiaMenuItem object_menu_items[] = {
   { N_("Add connection point"), line_add_connpoint_callback, NULL, 1 },
   { N_("Delete connection point"), line_remove_connpoint_callback, NULL, 1 },
@@ -414,7 +422,7 @@ line_select(Line *line, Point *clicked_point,
   connection_update_handles(&line->connection);
 }
 
-static ObjectChange*
+static DiaObjectChange*
 line_move_handle(Line *line, Handle *handle,
                 Point *to, ConnectionPoint *cp,
                 HandleMoveReason reason, ModifierKeys modifiers)
@@ -431,7 +439,7 @@ line_move_handle(Line *line, Handle *handle,
   return NULL;
 }
 
-static ObjectChange*
+static DiaObjectChange*
 line_move(Line *line, Point *to)
 {
   Point start_to_end;
diff --git a/objects/standard/outline.c b/objects/standard/outline.c
index c6179a7e4..41108d495 100644
--- a/objects/standard/outline.c
+++ b/objects/standard/outline.c
@@ -136,11 +136,11 @@ static DiaObjectType outline_type =
 DiaObjectType *_outline_type = (DiaObjectType *) &outline_type;
 
 /* Class definition */
-static ObjectChange* outline_move_handle (Outline *outline,
+static DiaObjectChange* outline_move_handle (Outline *outline,
                                           Handle *handle,
                                          Point *to, ConnectionPoint *cp,
                                          HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* outline_move (Outline *outline, Point *to);
+static DiaObjectChange* outline_move (Outline *outline, Point *to);
 static void outline_select(Outline *outline, Point *clicked_point,
                           DiaRenderer *interactive_renderer);
 static void outline_draw(Outline *outline, DiaRenderer *renderer);
@@ -453,7 +453,7 @@ outline_distance_from (Outline *outline, Point *point)
  *
  * Move one of the objects handles
  */
-static ObjectChange*
+static DiaObjectChange*
 outline_move_handle (Outline          *outline,
                      Handle           *handle,
                      Point            *to,
@@ -520,7 +520,7 @@ outline_move_handle (Outline          *outline,
  *
  * \memberof Outline
  */
-static ObjectChange*
+static DiaObjectChange*
 outline_move (Outline *outline, Point *to)
 {
   DiaObject *obj = &outline->object;
diff --git a/objects/standard/polygon.c b/objects/standard/polygon.c
index eb3f5dbaa..f668027c5 100644
--- a/objects/standard/polygon.c
+++ b/objects/standard/polygon.c
@@ -64,10 +64,14 @@ static struct _PolygonProperties {
   gboolean show_background;
 } default_properties = { TRUE };
 
-static ObjectChange* polygon_move_handle(Polygon *polygon, Handle *handle,
-                                        Point *to, ConnectionPoint *cp,
-                                        HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* polygon_move(Polygon *polygon, Point *to);
+static DiaObjectChange* polygon_move_handle    (Polygon          *polygon,
+                                                Handle           *handle,
+                                                Point            *to,
+                                                ConnectionPoint  *cp,
+                                                HandleMoveReason  reason,
+                                                ModifierKeys      modifiers);
+static DiaObjectChange* polygon_move           (Polygon          *polygon,
+                                                Point            *to);
 static void polygon_select(Polygon *polygon, Point *clicked_point,
                              DiaRenderer *interactive_renderer);
 static void polygon_draw(Polygon *polygon, DiaRenderer *renderer);
@@ -185,10 +189,14 @@ polygon_select(Polygon *polygon, Point *clicked_point,
   polyshape_update_data(&polygon->poly);
 }
 
-static ObjectChange*
-polygon_move_handle(Polygon *polygon, Handle *handle,
-                   Point *to, ConnectionPoint *cp,
-                   HandleMoveReason reason, ModifierKeys modifiers)
+
+static DiaObjectChange *
+polygon_move_handle (Polygon          *polygon,
+                     Handle           *handle,
+                     Point            *to,
+                     ConnectionPoint  *cp,
+                     HandleMoveReason  reason,
+                     ModifierKeys      modifiers)
 {
   assert(polygon!=NULL);
   assert(handle!=NULL);
@@ -201,11 +209,11 @@ polygon_move_handle(Polygon *polygon, Handle *handle,
 }
 
 
-static ObjectChange*
-polygon_move(Polygon *polygon, Point *to)
+static DiaObjectChange *
+polygon_move (Polygon *polygon, Point *to)
 {
-  polyshape_move(&polygon->poly, to);
-  polygon_update_data(polygon);
+  polyshape_move (&polygon->poly, to);
+  polygon_update_data (polygon);
 
   return NULL;
 }
@@ -446,27 +454,30 @@ polygon_load(ObjectNode obj_node, int version, DiaContext *ctx)
   return &polygon->poly.object;
 }
 
-static ObjectChange *
+
+static DiaObjectChange *
 polygon_add_corner_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
   Polygon *poly = (Polygon*) obj;
   int segment;
-  ObjectChange *change;
+  DiaObjectChange *change;
 
-  segment = polygon_closest_segment(poly, clicked);
-  change = polyshape_add_point(&poly->poly, segment, clicked);
+  segment = polygon_closest_segment (poly, clicked);
+  change = polyshape_add_point (&poly->poly, segment, clicked);
+
+  polygon_update_data (poly);
 
-  polygon_update_data(poly);
   return change;
 }
 
-static ObjectChange *
+
+static DiaObjectChange *
 polygon_delete_corner_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
   Handle *handle;
   int handle_nr, i;
   Polygon *poly = (Polygon*) obj;
-  ObjectChange *change;
+  DiaObjectChange *change;
 
   handle = polygon_closest_handle(poly, clicked);
 
diff --git a/objects/standard/polyline.c b/objects/standard/polyline.c
index 764d7bbd0..0f15467e7 100644
--- a/objects/standard/polyline.c
+++ b/objects/standard/polyline.c
@@ -45,18 +45,22 @@ typedef struct _Polyline {
   LineStyle line_style;
   LineJoin line_join;
   LineCaps line_caps;
-  real dashlength;
-  real line_width;
-  real corner_radius;
+  double dashlength;
+  double line_width;
+  double corner_radius;
   Arrow start_arrow, end_arrow;
-  real absolute_start_gap, absolute_end_gap;
+  double absolute_start_gap, absolute_end_gap;
 } Polyline;
 
 
-static ObjectChange* polyline_move_handle(Polyline *polyline, Handle *handle,
-                                         Point *to, ConnectionPoint *cp,
-                                         HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* polyline_move(Polyline *polyline, Point *to);
+static DiaObjectChange *polyline_move_handle     (Polyline         *polyline,
+                                                  Handle           *handle,
+                                                  Point            *to,
+                                                  ConnectionPoint  *cp,
+                                                  HandleMoveReason  reason,
+                                                  ModifierKeys      modifiers);
+static DiaObjectChange *polyline_move            (Polyline         *polyline,
+                                                  Point            *to);
 static void polyline_select(Polyline *polyline, Point *clicked_point,
                              DiaRenderer *interactive_renderer);
 static void polyline_draw(Polyline *polyline, DiaRenderer *renderer);
@@ -200,10 +204,14 @@ polyline_select(Polyline *polyline, Point *clicked_point,
   polyconn_update_data(&polyline->poly);
 }
 
-static ObjectChange*
-polyline_move_handle(Polyline *polyline, Handle *handle,
-                    Point *to, ConnectionPoint *cp,
-                    HandleMoveReason reason, ModifierKeys modifiers)
+
+static DiaObjectChange *
+polyline_move_handle (Polyline         *polyline,
+                      Handle           *handle,
+                      Point            *to,
+                      ConnectionPoint  *cp,
+                      HandleMoveReason  reason,
+                      ModifierKeys      modifiers)
 {
   assert(polyline!=NULL);
   assert(handle!=NULL);
@@ -216,11 +224,11 @@ polyline_move_handle(Polyline *polyline, Handle *handle,
 }
 
 
-static ObjectChange*
-polyline_move(Polyline *polyline, Point *to)
+static DiaObjectChange *
+polyline_move (Polyline *polyline, Point *to)
 {
-  polyconn_move(&polyline->poly, to);
-  polyline_update_data(polyline);
+  polyconn_move (&polyline->poly, to);
+  polyline_update_data (polyline);
 
   return NULL;
 }
@@ -582,26 +590,29 @@ polyline_load(ObjectNode obj_node, int version, DiaContext *ctx)
   return &polyline->poly.object;
 }
 
-static ObjectChange *
+
+static DiaObjectChange *
 polyline_add_corner_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
   Polyline *poly = (Polyline*) obj;
   int segment;
-  ObjectChange *change;
+  DiaObjectChange *change;
+
+  segment = polyline_closest_segment (poly, clicked);
+  change = polyconn_add_point (&poly->poly, segment, clicked);
+  polyline_update_data (poly);
 
-  segment = polyline_closest_segment(poly, clicked);
-  change = polyconn_add_point(&poly->poly, segment, clicked);
-  polyline_update_data(poly);
   return change;
 }
 
-static ObjectChange *
+
+static DiaObjectChange *
 polyline_delete_corner_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
   Handle *handle;
   int handle_nr, i;
   Polyline *poly = (Polyline*) obj;
-  ObjectChange *change;
+  DiaObjectChange *change;
 
   handle = polyline_closest_handle(poly, clicked);
 
diff --git a/objects/standard/textobj.c b/objects/standard/textobj.c
index 932b04969..e2b2e850c 100644
--- a/objects/standard/textobj.c
+++ b/objects/standard/textobj.c
@@ -33,6 +33,7 @@
 #include "diamenu.h"
 #include "create.h"
 #include "message.h" /* just dia_log_message */
+#include "dia-object-change-list.h"
 
 #define HANDLE_TEXT HANDLE_CUSTOM1
 
@@ -76,10 +77,14 @@ static struct _TextobjProperties {
 static real textobj_distance_from(Textobj *textobj, Point *point);
 static void textobj_select(Textobj *textobj, Point *clicked_point,
                           DiaRenderer *interactive_renderer);
-static ObjectChange* textobj_move_handle(Textobj *textobj, Handle *handle,
-                                        Point *to, ConnectionPoint *cp,
-                                        HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* textobj_move(Textobj *textobj, Point *to);
+static DiaObjectChange *textobj_move_handle (Textobj          *textobj,
+                                             Handle           *handle,
+                                             Point            *to,
+                                             ConnectionPoint  *cp,
+                                             HandleMoveReason  reason,
+                                             ModifierKeys      modifiers);
+static DiaObjectChange *textobj_move        (Textobj          *textobj,
+                                             Point            *to);
 static void textobj_draw(Textobj *textobj, DiaRenderer *renderer);
 static void textobj_update_data(Textobj *textobj);
 static DiaObject *textobj_create(Point *startpoint,
@@ -255,10 +260,14 @@ textobj_select(Textobj *textobj, Point *clicked_point,
   text_grab_focus(textobj->text, &textobj->object);
 }
 
-static ObjectChange*
-textobj_move_handle(Textobj *textobj, Handle *handle,
-                   Point *to, ConnectionPoint *cp,
-                   HandleMoveReason reason, ModifierKeys modifiers)
+
+static DiaObjectChange *
+textobj_move_handle (Textobj          *textobj,
+                     Handle           *handle,
+                     Point            *to,
+                     ConnectionPoint  *cp,
+                     HandleMoveReason  reason,
+                     ModifierKeys      modifiers)
 {
   assert(textobj!=NULL);
   assert(handle!=NULL);
@@ -271,16 +280,18 @@ textobj_move_handle(Textobj *textobj, Handle *handle,
   return NULL;
 }
 
-static ObjectChange*
-textobj_move(Textobj *textobj, Point *to)
+
+static DiaObjectChange *
+textobj_move (Textobj *textobj, Point *to)
 {
   textobj->object.position = *to;
 
-  textobj_update_data(textobj);
+  textobj_update_data (textobj);
 
   return NULL;
 }
 
+
 static void
 textobj_draw(Textobj *textobj, DiaRenderer *renderer)
 {
@@ -557,7 +568,8 @@ textobj_load(ObjectNode obj_node, int version, DiaContext *ctx)
   return &textobj->object;
 }
 
-static ObjectChange *
+
+static DiaObjectChange *
 _textobj_convert_to_path_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
   Textobj *textobj = (Textobj *)obj;
@@ -568,7 +580,7 @@ _textobj_convert_to_path_callback (DiaObject *obj, Point *clicked, gpointer data
     path = create_standard_path_from_text (text);
 
   if (path) {
-    ObjectChange *change;
+    DiaObjectChange *change;
     Color bg = textobj->fill_color;
 
     /* FIXME: otherwise object_substitue() will tint the text with bg */
@@ -579,13 +591,17 @@ _textobj_convert_to_path_callback (DiaObject *obj, Point *clicked, gpointer data
 
     return change;
   }
+
   /* silently fail */
-  return change_list_create ();
+  return dia_object_change_list_new ();
 }
+
+
 static DiaMenuItem textobj_menu_items[] = {
   { N_("Convert to Path"), _textobj_convert_to_path_callback, NULL, DIAMENU_ACTIVE }
 };
 
+
 static DiaMenu textobj_menu = {
   "Text",
   sizeof(textobj_menu_items)/sizeof(DiaMenuItem),
diff --git a/objects/standard/zigzagline.c b/objects/standard/zigzagline.c
index 2062ee7a7..8e7833397 100644
--- a/objects/standard/zigzagline.c
+++ b/objects/standard/zigzagline.c
@@ -47,17 +47,21 @@ typedef struct _Zigzagline {
   LineStyle line_style;
   LineJoin line_join;
   LineCaps line_caps;
-  real dashlength;
-  real line_width;
-  real corner_radius;
+  double dashlength;
+  double line_width;
+  double corner_radius;
   Arrow start_arrow, end_arrow;
 } Zigzagline;
 
 
-static ObjectChange* zigzagline_move_handle(Zigzagline *zigzagline, Handle *handle,
-                                           Point *to, ConnectionPoint *cp,
-                                           HandleMoveReason reason, ModifierKeys modifiers);
-static ObjectChange* zigzagline_move(Zigzagline *zigzagline, Point *to);
+static DiaObjectChange *zigzagline_move_handle   (Zigzagline       *zigzagline,
+                                                  Handle           *handle,
+                                                  Point            *to,
+                                                  ConnectionPoint  *cp,
+                                                  HandleMoveReason  reason,
+                                                  ModifierKeys      modifiers);
+static DiaObjectChange *zigzagline_move          (Zigzagline       *zigzagline,
+                                                  Point            *to);
 static void zigzagline_select(Zigzagline *zigzagline, Point *clicked_point,
                              DiaRenderer *interactive_renderer);
 static void zigzagline_draw(Zigzagline *zigzagline, DiaRenderer *renderer);
@@ -173,12 +177,17 @@ zigzagline_select(Zigzagline *zigzagline, Point *clicked_point,
   orthconn_update_data(&zigzagline->orth);
 }
 
-static ObjectChange*
-zigzagline_move_handle(Zigzagline *zigzagline, Handle *handle,
-                      Point *to, ConnectionPoint *cp,
-                      HandleMoveReason reason, ModifierKeys modifiers)
+
+static DiaObjectChange *
+zigzagline_move_handle (Zigzagline       *zigzagline,
+                        Handle           *handle,
+                        Point            *to,
+                        ConnectionPoint  *cp,
+                        HandleMoveReason  reason,
+                        ModifierKeys      modifiers)
 {
-  ObjectChange *change;
+  DiaObjectChange *change;
+
   assert(zigzagline!=NULL);
   assert(handle!=NULL);
   assert(to!=NULL);
@@ -192,15 +201,16 @@ zigzagline_move_handle(Zigzagline *zigzagline, Handle *handle,
 }
 
 
-static ObjectChange*
-zigzagline_move(Zigzagline *zigzagline, Point *to)
+static DiaObjectChange *
+zigzagline_move (Zigzagline *zigzagline, Point *to)
 {
-  orthconn_move(&zigzagline->orth, to);
-  zigzagline_update_data(zigzagline);
+  orthconn_move (&zigzagline->orth, to);
+  zigzagline_update_data (zigzagline);
 
   return NULL;
 }
 
+
 static void
 zigzagline_draw (Zigzagline *zigzagline, DiaRenderer *renderer)
 {
@@ -355,24 +365,31 @@ zigzagline_update_data(Zigzagline *zigzagline)
   }
 }
 
-static ObjectChange *
-zigzagline_add_segment_callback(DiaObject *obj, Point *clicked, gpointer data)
+
+static DiaObjectChange *
+zigzagline_add_segment_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
-  ObjectChange *change;
-  change = orthconn_add_segment((OrthConn *)obj, clicked);
-  zigzagline_update_data((Zigzagline *)obj);
+  DiaObjectChange *change;
+
+  change = orthconn_add_segment ((OrthConn *) obj, clicked);
+  zigzagline_update_data ((Zigzagline *) obj);
+
   return change;
 }
 
-static ObjectChange *
-zigzagline_delete_segment_callback(DiaObject *obj, Point *clicked, gpointer data)
+
+static DiaObjectChange *
+zigzagline_delete_segment_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
-  ObjectChange *change;
-  change = orthconn_delete_segment((OrthConn *)obj, clicked);
-  zigzagline_update_data((Zigzagline *)obj);
+  DiaObjectChange *change;
+
+  change = orthconn_delete_segment ((OrthConn *) obj, clicked);
+  zigzagline_update_data ((Zigzagline *) obj);
+
   return change;
 }
 
+
 /*!
  * \brief Upgrade the _Zigzagline to a _Bezierline
  *
@@ -387,7 +404,7 @@ zigzagline_delete_segment_callback(DiaObject *obj, Point *clicked, gpointer data
  *
  * \memberof _Zigzagline
  */
-static ObjectChange *
+static DiaObjectChange *
 _convert_to_bezierline_callback (DiaObject *obj, Point *clicked, gpointer data)
 {
   Zigzagline *zigzagline = (Zigzagline *)obj;
diff --git a/plug-ins/cairo/diacairo.c b/plug-ins/cairo/diacairo.c
index b8e6280f4..9471ea9c2 100644
--- a/plug-ins/cairo/diacairo.c
+++ b/plug-ins/cairo/diacairo.c
@@ -142,11 +142,13 @@ static DiaExportFilter wmf_export_filter = {
     FILTER_DONT_GUESS /* don't use this if not asked explicit */
 };
 
-static ObjectChange *
+
+static DiaObjectChange *
 cairo_clipboard_callback (DiagramData *data,
-                          const gchar *filename,
-                          guint flags, /* further additions */
-                          void *user_data)
+                          const char  *filename,
+                          /* further additions */
+                          guint        flags,
+                          void        *user_data)
 {
   DiaContext *ctx = dia_context_new(_("Cairo Clipboard Copy"));
 
@@ -169,14 +171,16 @@ static DiaCallbackFilter cb_clipboard = {
 };
 #endif
 
+
 static DiaCallbackFilter cb_gtk_print = {
-    "FilePrintGTK",
-    N_("Print (GTK) …"),
-    "/InvisibleMenu/File/FilePrint",
-    cairo_print_callback,
-    (void*)OUTPUT_PDF
+  "FilePrintGTK",
+  N_("Print (GTK) …"),
+  "/InvisibleMenu/File/FilePrint",
+  cairo_print_callback,
+  (void *) OUTPUT_PDF
 };
 
+
 static gboolean
 _plugin_can_unload (PluginInfo *info)
 {
diff --git a/plug-ins/layout/layout.cpp b/plug-ins/layout/layout.cpp
index 453db1e96..10888a6b9 100644
--- a/plug-ins/layout/layout.cpp
+++ b/plug-ins/layout/layout.cpp
@@ -48,6 +48,7 @@
 
 #include "ogdf-simple.h"
 #include "dia-graph.h"
+#include "dia-object-change-list.h"
 
 #include <vector>
 
@@ -110,7 +111,9 @@ _obj_get_bends (DiaObject *obj, std::vector<double>& coords)
     prop->ops->free(prop);
   return coords.size();
 }
-static ObjectChange *
+
+
+static DiaObjectChange *
 _obj_set_bends (DiaObject *obj, std::vector<double>& coords)
 {
   Property *prop = NULL;
@@ -198,23 +201,25 @@ _obj_set_bends (DiaObject *obj, std::vector<double>& coords)
     GPtrArray *props = prop_list_from_single (prop);
     return object_apply_props (obj, props);
   }
+
   return NULL;
 }
 
+
 typedef IGraph *(*GraphCreateFunc)();
 
 /*!
  * \brief Calback function invoking layout algorithms from Dia's menu
  * \ingroup LayoutPlugin
  */
-static ObjectChange *
-layout_callback (DiagramData *data,
-                 const gchar *filename,
-                 guint flags, /* further additions */
-                 void *user_data,
-                GraphCreateFunc func)
+static DiaObjectChange *
+layout_callback (DiagramData     *data,
+                 const char      *filename,
+                 guint            flags, /* further additions */
+                 void            *user_data,
+                 GraphCreateFunc  func)
 {
-  ObjectChange *changes = NULL;
+  DiaObjectChange *changes = NULL;
   GList *nodes = NULL, *edges = NULL, *list;
   const char *algorithm = (const char*)user_data;
 
@@ -259,58 +264,87 @@ layout_callback (DiagramData *data,
         else
           g->AddEdge (g_list_index (nodes, src), g_list_index (nodes, dst), NULL, 0);
       }
+
       IGraph::eResult res;
       if ((res = g->Layout (algorithm)) != IGraph::SUCCESS) {
-       const char *sErr;
-       switch (res) {
-       case IGraph::NO_MODULE : sErr = _("No such module."); break;
-       case IGraph::OUT_OF_MEMORY : sErr = _("Out of memory."); break;
-       case IGraph::NO_TREE: sErr = _("Not a tree."); break;
-       case IGraph::NO_FOREST: sErr = _("Not a forest."); break;
-       case IGraph::FAILED_ALGORITHM: sErr = _("Failed algorithm."); break;
-       case IGraph::FAILED_PRECONDITION: sErr = _("Failed precondition."); break;
-       case IGraph::CRASHED : sErr = _("OGDF crashed."); break;
-       default : sErr = _("Unknown reason"); break;
-       }
-        message_warning (_("Layout '%s' failed.\n%s"), (const char*)user_data, sErr);
+        const char *sErr;
+        switch (res) {
+          case IGraph::NO_MODULE:
+            sErr = _("No such module.");
+            break;
+          case IGraph::OUT_OF_MEMORY:
+            sErr = _("Out of memory.");
+            break;
+          case IGraph::NO_TREE:
+            sErr = _("Not a tree.");
+            break;
+          case IGraph::NO_FOREST:
+            sErr = _("Not a forest.");
+            break;
+          case IGraph::FAILED_ALGORITHM:
+            sErr = _("Failed algorithm.");
+            break;
+          case IGraph::FAILED_PRECONDITION:
+            sErr = _("Failed precondition.");
+            break;
+          case IGraph::CRASHED:
+            sErr = _("OGDF crashed.");
+            break;
+          default:
+            sErr = _("Unknown reason");
+            break;
+        }
+        message_warning (_("Layout '%s' failed.\n%s"),
+                         (const char*) user_data,
+                         sErr);
       } else {
-        changes = change_list_create ();
-       /* transfer back information */
-       int n;
-       for (n = 0, list = nodes; list != NULL; list = g_list_next (list), ++n) {
-         Point pt;
-         if (g->GetNodePosition (n, &pt.x, &pt.y)) {
-           DiaObject *o = (DiaObject *)list->data;
-           GPtrArray *props = g_ptr_array_new ();
-
-           //FIXME: can't use "obj_pos", it is not read in usual update_data impementations
-           // "elem_corner" will only work for Element derived classes, but that covers most
-           // of the cases here ...
-           prop_list_add_point (props, "elem_corner", &pt);
-           change_list_add (changes, object_apply_props (o, props));
-         }
-       }
-       // first update to reuse the connected points
-       diagram_update_connections_selection(DIA_DIAGRAM (data));
-       /* use edge bends, if any */
-       int e;
-       for (e = 0, list = edges; list != NULL; list = g_list_next (list), ++e) {
-          DiaObject *o = (DiaObject *)list->data;
-         // number of bends / 2 is the number of points
-         int n = g->GetEdgeBends (e, NULL, 0);
-         if (n >= 0) { // with 0 it is just a reset of the exisiting line
-           try {
-             coords.resize (n);
-           } catch (std::bad_alloc& ex) {
-             g_warning ("%s", ex.what());
-             continue;
-           }
-           g->GetEdgeBends (e, &coords[0], n);
-           change_list_add (changes, _obj_set_bends (o, coords));
-         }
-       }
-       /* update view */
-       diagram_update_connections_selection(DIA_DIAGRAM (data));
+        changes = dia_object_change_list_new ();
+
+        /* transfer back information */
+        int n;
+        for (n = 0, list = nodes;
+             list != NULL;
+             list = g_list_next (list), ++n) {
+          Point pt;
+          if (g->GetNodePosition (n, &pt.x, &pt.y)) {
+            DiaObject *o = DIA_OBJECT (list->data);
+            GPtrArray *props = g_ptr_array_new ();
+
+            // FIXME: can't use "obj_pos", it is not read in usual update_data
+            // impementations "elem_corner" will only work for Element derived
+            // classes, but that covers most of the cases here ...
+            prop_list_add_point (props, "elem_corner", &pt);
+
+            dia_object_change_list_add (DIA_OBJECT_CHANGE_LIST (changes),
+                                        object_apply_props (o, props));
+          }
+        }
+
+        // first update to reuse the connected points
+        diagram_update_connections_selection (DIA_DIAGRAM (data));
+
+        /* use edge bends, if any */
+        int e;
+        for (e = 0, list = edges;
+             list != NULL;
+             list = g_list_next (list), ++e) {
+          DiaObject *o = DIA_OBJECT (list->data);
+          // number of bends / 2 is the number of points
+          int n = g->GetEdgeBends (e, NULL, 0);
+          if (n >= 0) { // with 0 it is just a reset of the exisiting line
+            try {
+              coords.resize (n);
+            } catch (std::bad_alloc& ex) {
+              g_warning ("%s", ex.what());
+              continue;
+            }
+            g->GetEdgeBends (e, &coords[0], n);
+            dia_object_change_list_add (DIA_OBJECT_CHANGE_LIST (changes),
+                                        _obj_set_bends (o, coords));
+          }
+        }
+        /* update view */
+        diagram_update_connections_selection (DIA_DIAGRAM (data));
       }
       g->Release ();
     }
@@ -321,7 +355,8 @@ layout_callback (DiagramData *data,
   return changes;
 }
 
-static ObjectChange *
+
+static DiaObjectChange *
 layout_callback1 (DiagramData *data,
                   const gchar *filename,
                   guint flags, /* further additions */
diff --git a/plug-ins/pdf/pdf-import.cpp b/plug-ins/pdf/pdf-import.cpp
index 185a20631..15100bc61 100644
--- a/plug-ins/pdf/pdf-import.cpp
+++ b/plug-ins/pdf/pdf-import.cpp
@@ -652,11 +652,9 @@ DiaOutputDev::_fill (GfxState *state, bool winding)
       obj = create_standard_path (points->len, &g_array_index (points, BezPoint, 0));
     applyStyle (obj, true);
     if (this->pattern) {
-      ObjectChange *change = dia_object_set_pattern (obj, this->pattern);
-      if (change) {
-       change->free (change);
-       g_free (change);
-      }
+      DiaObjectChange *change = dia_object_set_pattern (obj, this->pattern);
+
+      g_clear_pointer (&change, dia_object_change_unref);
     }
   }
   g_array_free (points, TRUE);
@@ -779,7 +777,7 @@ DiaOutputDev::drawImage(GfxState *state, Object *ref, Stream *str,
   DiaObject *obj;
   GdkPixbuf *pixbuf;
   Point pos;
-  ObjectChange *change;
+  DiaObjectChange *change;
   const double *ctm = state->getCTM();
 
   pos.x = ctm[4] * scale;
@@ -839,12 +837,14 @@ DiaOutputDev::drawImage(GfxState *state, Object *ref, Stream *str,
     g_hash_table_insert (this->image_cache, str, g_object_ref (pixbuf));
   }
 #endif
-  obj = create_standard_image (pos.x, pos.y,
-                              ctm[0]  * scale,
-                              ctm[3]  * scale, NULL);
+  obj = create_standard_image (pos.x,
+                               pos.y,
+                               ctm[0] * scale,
+                               ctm[3] * scale,
+                               NULL);
+
   if ((change = dia_object_set_pixbuf (obj, pixbuf)) != NULL) {
-    change->free (change);
-    g_free (change);
+    g_clear_pointer (&change, dia_object_change_unref);
   }
 
   g_object_unref (pixbuf);
@@ -852,6 +852,7 @@ DiaOutputDev::drawImage(GfxState *state, Object *ref, Stream *str,
   addObject (obj);
 }
 
+
 extern "C"
 gboolean
 import_pdf(const gchar *filename, DiagramData *dia, DiaContext *ctx, void* user_data)
diff --git a/plug-ins/postscript/postscript.c b/plug-ins/postscript/postscript.c
index e3f004b87..aec08a184 100644
--- a/plug-ins/postscript/postscript.c
+++ b/plug-ins/postscript/postscript.c
@@ -29,27 +29,33 @@
 #include "render_eps.h"
 #include "paginate_psprint.h"
 
-static ObjectChange *
+
+static DiaObjectChange *
 print_callback (DiagramData *data,
-                const gchar *filename,
-                guint flags, /* further additions */
-                void *user_data)
+                const char  *filename,
+                /* further additions */
+                guint        flags,
+                void        *user_data)
 {
-  if (!data)
+  if (!data) {
     message_error (_("Nothing to print"));
-  else
+  } else {
     diagram_print_ps (data, filename ? filename : "output.ps");
+  }
+
   return NULL;
 }
 
+
 static DiaCallbackFilter cb_ps_print = {
-    "FilePrintPS",
-    N_("Print (PS)"),
-    "/InvisibleMenu/File/FilePrint",
-    print_callback,
-    NULL
+  "FilePrintPS",
+  N_("Print (PS)"),
+  "/InvisibleMenu/File/FilePrint",
+  print_callback,
+  NULL
 };
 
+
 /* --- dia plug-in interface --- */
 static gboolean
 _plugin_can_unload (PluginInfo *info)
diff --git a/plug-ins/python/diamodule.c b/plug-ins/python/diamodule.c
index c5615d01b..c412a9270 100644
--- a/plug-ins/python/diamodule.c
+++ b/plug-ins/python/diamodule.c
@@ -367,7 +367,7 @@ PyDia_RegisterImport(PyObject *self, PyObject *args)
  * It needs to be registered before via Python function
  * dia.register_action (or dia.register_callback)
  */
-static ObjectChange *
+static DiaObjectChange *
 PyDia_callback_func (DiagramData *dia,
                      const char  *filename,
                      guint        flags,
diff --git a/plug-ins/python/pydia-menuitem.c b/plug-ins/python/pydia-menuitem.c
index 22fbed89a..c055fb81c 100644
--- a/plug-ins/python/pydia-menuitem.c
+++ b/plug-ins/python/pydia-menuitem.c
@@ -91,30 +91,31 @@ PyDiaMenuitem_GetAttr(PyDiaMenuitem *self, gchar *attr)
 
 
 static PyObject *
-PyDiaMenuitem_Call(PyDiaMenuitem *self, PyObject *args)
+PyDiaMenuitem_Call (PyDiaMenuitem *self, PyObject *args)
 {
   const DiaMenuItem *mi;
-  ObjectChange *oc;
+  DiaObjectChange *oc;
   DiaObject *obj;
   Point clicked;
 
-  if (!PyArg_ParseTuple(args, "O!(dd)|ii:Menuitem.callback",
-                        &PyDiaObject_Type, &obj, &clicked.x, &clicked.y))
+  if (!PyArg_ParseTuple (args, "O!(dd)|ii:Menuitem.callback",
+                         &PyDiaObject_Type, &obj, &clicked.x, &clicked.y)) {
     return NULL;
+  }
 
   mi = self->menuitem;
 
   oc = mi->callback (obj, &clicked, mi->callback_data);
+
   /* Throw away the undo information */
-  if (oc) {
-    if (oc->free)
-      oc->free(oc);
-    g_clear_pointer (&oc, g_free);
-  }
+  g_clear_pointer (&oc, dia_object_change_unref);
+
+  Py_INCREF (Py_None);
 
-  Py_INCREF(Py_None);
   return Py_None;
 }
+
+
 /*
  * Repr / _Str
  */
diff --git a/plug-ins/python/pydia-object.c b/plug-ins/python/pydia-object.c
index d08c98879..d7d9baa73 100644
--- a/plug-ins/python/pydia-object.c
+++ b/plug-ins/python/pydia-object.c
@@ -195,57 +195,77 @@ PyDiaObject_GetMenu(PyDiaObject *self, PyObject *args)
     PyTuple_SetItem(ret, 1, items);
     return ret;
 }
+
+
 static PyObject *
-PyDiaObject_Move(PyDiaObject *self, PyObject *args)
+PyDiaObject_Move (PyDiaObject *self, PyObject *args)
 {
-    Point point;
-    ObjectChange *change;
+  Point point;
+  DiaObjectChange *change;
 
-    if (!PyArg_ParseTuple(args, "dd:Object.move", &point.x, &point.y))
-       return NULL;
+  if (!PyArg_ParseTuple (args, "dd:Object.move", &point.x, &point.y)) {
+    return NULL;
+  }
 
-    if (!self->object->ops->move) {
-       PyErr_SetString(PyExc_RuntimeError,"object does not implement method");
-       return NULL;
-    }
+  if (!self->object->ops->move) {
+    PyErr_SetString (PyExc_RuntimeError,
+                     "object does not implement method");
+    return NULL;
+  }
 
-    change = self->object->ops->move(self->object, &point);
-    if (G_UNLIKELY(change)) /* TODO: return the change? */
-        change->free(change);
+  change = dia_object_move (self->object, &point);
 
-    Py_INCREF(Py_None);
-    return Py_None;
+  if (G_UNLIKELY (change)) {
+    /* TODO: return the change? */
+    dia_object_change_unref (change);
+  }
+
+  Py_INCREF (Py_None);
+
+  return Py_None;
 }
 
+
 static PyObject *
-PyDiaObject_MoveHandle(PyDiaObject *self, PyObject *args)
+PyDiaObject_MoveHandle (PyDiaObject *self, PyObject *args)
 {
-    PyDiaHandle *handle;
-    Point point;
-    HandleMoveReason reason = 0;
-    ModifierKeys modifiers = 0;
-    ObjectChange *change;
+  PyDiaHandle *handle;
+  Point point;
+  HandleMoveReason reason = 0;
+  ModifierKeys modifiers = 0;
+  DiaObjectChange *change;
+
+  if (!PyArg_ParseTuple (args, "O!(dd)|ii:Object.move_handle",
+                         &PyDiaHandle_Type, &handle, &point.x, &point.y,
+                         &reason, &modifiers)) {
+    return NULL;
+  }
 
-    if (!PyArg_ParseTuple(args, "O!(dd)|ii:Object.move_handle",
-                         &PyDiaHandle_Type, &handle, &point.x, &point.y,
-                         &reason, &modifiers))
-       return NULL;
+  if (!self->object->ops->move_handle) {
+    PyErr_SetString (PyExc_RuntimeError,
+                     "object does not implement method");
 
-    if (!self->object->ops->move_handle) {
-       PyErr_SetString(PyExc_RuntimeError,"object does not implement method");
-       return NULL;
-    }
+    return NULL;
+  }
 
-    change = self->object->ops->move_handle(self->object, handle->handle, &point,
-                                           NULL, reason, modifiers);
+  change = dia_object_move_handle (self->object,
+                                   handle->handle,
+                                   &point,
+                                   NULL,
+                                   reason,
+                                   modifiers);
 
-    if (G_UNLIKELY(change)) /* TODO: return the change? */
-        change->free(change);
+  if (G_UNLIKELY (change)) {
+    /* TODO: return the change? */
+    dia_object_change_unref (change);
+  }
 
-    Py_INCREF(Py_None);
-    return Py_None;
+  Py_INCREF (Py_None);
+
+  return Py_None;
 }
 
+
 static PyMethodDef PyDiaObject_Methods[] = {
     { "destroy", (PyCFunction)PyDiaObject_Destroy, METH_VARARGS,
       "destroy() -> None."
diff --git a/plug-ins/stress/stress.c b/plug-ins/stress/stress.c
index 1dc04c6af..287216efc 100644
--- a/plug-ins/stress/stress.c
+++ b/plug-ins/stress/stress.c
@@ -27,17 +27,19 @@
 
 #include "stress-memory.h"
 
-static ObjectChange *
+
+static DiaObjectChange *
 stress_memory_callback (DiagramData *data,
-                       const gchar *filename,
-                       guint flags, /* further additions */
-                       void *user_data)
+                        const char  *filename,
+                        /* further additions */
+                        guint        flags,
+                        void        *user_data)
 {
   guint64 avail;
 
   if (vmem_avail (&avail)) {
     guint64 eat = (avail * 9) / 10;
-    
+
     if (vmem_reserve (eat)) {
       guint64 still_avail;
       vmem_avail (&still_avail);
diff --git a/plug-ins/svg/svg-import.c b/plug-ins/svg/svg-import.c
index 11fd7a4b8..14cec92ec 100644
--- a/plug-ins/svg/svg-import.c
+++ b/plug-ins/svg/svg-import.c
@@ -425,7 +425,7 @@ _set_pattern_from_key (DiaObject    *obj,
                        GHashTable   *pattern_ht,
                        const char   *key)
 {
-  ObjectChange *change = NULL;
+  DiaObjectChange *change = NULL;
   DiaPattern *pattern = g_hash_table_lookup (pattern_ht, key);
 
   if (pattern) {
@@ -434,10 +434,8 @@ _set_pattern_from_key (DiaObject    *obj,
     bprop->bool_data = TRUE;
   }
 
-  if (change) { /* throw it away, no one needs it here  */
-    change->free (change);
-    g_clear_pointer (&change, g_free);
-  }
+  /* throw it away, no one needs it here  */
+  g_clear_pointer (&change, dia_object_change_unref);
 }
 
 
@@ -1289,14 +1287,13 @@ read_image_svg (xmlNodePtr   node,
         GdkPixbuf *pixbuf = pixbuf_decode_base64 (data+1);
 
         if (pixbuf) {
-          ObjectChange *change;
+          DiaObjectChange *change;
 
-          new_obj = create_standard_image(x, y, width, height, NULL);
+          new_obj = create_standard_image (x, y, width, height, NULL);
           change = dia_object_set_pixbuf (new_obj, pixbuf);
-          if (change) { /* throw it away, no one needs it here  */
-            change->free (change);
-            g_clear_pointer (&change, g_free);
-          }
+
+          /* throw it away, no one needs it here  */
+          g_clear_pointer (&change, dia_object_change_unref);
           g_clear_object (&pixbuf);
         }
       }
diff --git a/plug-ins/wmf/wmf.cpp b/plug-ins/wmf/wmf.cpp
index 59474e47c..0cb000e88 100644
--- a/plug-ins/wmf/wmf.cpp
+++ b/plug-ins/wmf/wmf.cpp
@@ -1532,11 +1532,12 @@ static DiaExportFilter emf_export_filter = {
     "emf"
 };
 
-static ObjectChange *
+
+static DiaObjectChange *
 print_callback (DiagramData *data,
-                const gchar *filename,
-               guint        flags,
-               void        *user_data)
+                const char  *filename,
+                guint        flags,
+                void        *user_data)
 {
   /* Todo: get the context from caller */
   DiaContext *ctx = dia_context_new ("PrintGDI");


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