diff -rbBuP dia/lib/geometry.c dia-current/lib/geometry.c
--- dia/lib/geometry.c	Thu Apr 13 20:00:32 2000
+++ dia-current/lib/geometry.c	Thu Mar 15 11:51:53 2001
@@ -1,6 +1,9 @@
 /* Dia -- an diagram creation/manipulation program
  * Copyright (C) 1998 Alexander Larsson
  *
+ * Matrix code from GIMP:app/transform_tool.c
+ * Copyright (C) 1995 Spencer Kimball and Peter Mattis
+ *
  * 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
@@ -408,3 +411,132 @@
   else
     return dist - rad;
 }
+
+
+void
+transform_point (Matrix m, Point *src, Point *dest)
+{
+  real xx, yy, ww;
+
+  xx = m[0][0] * src->x + m[0][1] * src->y + m[0][2];
+  yy = m[1][0] * src->x + m[1][1] * src->y + m[1][2];
+  ww = m[2][0] * src->x + m[2][1] * src->y + m[2][2];
+
+  if (!ww)
+    ww = 1.0;
+
+  dest->x = xx / ww;
+  dest->y = yy / ww;
+}
+
+void
+mult_matrix (Matrix m1, Matrix m2)
+{
+  Matrix result;
+  int i, j, k;
+
+  for (i = 0; i < 3; i++)
+    for (j = 0; j < 3; j++)
+      {
+	result [i][j] = 0.0;
+	for (k = 0; k < 3; k++)
+	  result [i][j] += m1 [i][k] * m2[k][j];
+      }
+
+  /*  copy the result into matrix 2  */
+  for (i = 0; i < 3; i++)
+    for (j = 0; j < 3; j++)
+      m2 [i][j] = result [i][j];
+}
+
+void
+identity_matrix (Matrix m)
+{
+  int i, j;
+
+  for (i = 0; i < 3; i++)
+    for (j = 0; j < 3; j++)
+      m[i][j] = (i == j) ? 1 : 0;
+
+}
+
+void
+translate_matrix (Matrix m, real x, real y)
+{
+  Matrix trans;
+
+  identity_matrix (trans);
+  trans[0][2] = x;
+  trans[1][2] = y;
+  mult_matrix (trans, m);
+}
+
+void
+scale_matrix (Matrix m, real x, real y)
+{
+  Matrix scale;
+
+  identity_matrix (scale);
+  scale[0][0] = x;
+  scale[1][1] = y;
+  mult_matrix (scale, m);
+}
+
+void
+rotate_matrix (Matrix m, real theta)
+{
+  Matrix rotate;
+  real cos_theta, sin_theta;
+
+  cos_theta = cos (theta);
+  sin_theta = sin (theta);
+
+  identity_matrix (rotate);
+  rotate[0][0] = cos_theta;
+  rotate[0][1] = -sin_theta;
+  rotate[1][0] = sin_theta;
+  rotate[1][1] = cos_theta;
+  mult_matrix (rotate, m);
+}
+
+void
+xshear_matrix (Matrix m, real shear)
+{
+  Matrix shear_m;
+
+  identity_matrix (shear_m);
+  shear_m[0][1] = shear;
+  mult_matrix (shear_m, m);
+}
+
+void
+yshear_matrix (Matrix m, real shear)
+{
+  Matrix shear_m;
+
+  identity_matrix (shear_m);
+  shear_m[1][0] = shear;
+  mult_matrix (shear_m, m);
+}
+
+/*  find the determinate for a 3x3 matrix  */
+static real
+determinate (Matrix m)
+{
+  int i;
+  double det = 0;
+
+  for (i = 0; i < 3; i ++)
+    {
+      det += m[0][i] * m[1][(i+1)%3] * m[2][(i+2)%3];
+      det -= m[2][i] * m[1][(i+1)%3] * m[0][(i+2)%3];
+    }
+
+  return det;
+}
+
+
+
+
+
+
diff -rbBuP dia/lib/geometry.h dia-current/lib/geometry.h
--- dia/lib/geometry.h	Sun Feb 25 17:18:32 2001
+++ dia-current/lib/geometry.h	Thu Mar 15 11:51:53 2001
@@ -291,4 +291,16 @@
 real distance_ellipse_point(Point *centre, real width, real height,
 			    real line_width, Point *point);
 
+typedef real  Vector[3];
+typedef Vector  Matrix[3];
+
+void          transform_point             (Matrix, Point *, Point *);
+void          mult_matrix                 (Matrix, Matrix);
+void          identity_matrix             (Matrix);
+void          translate_matrix            (Matrix, real, real);
+void          scale_matrix                (Matrix, real, real);
+void          rotate_matrix               (Matrix, real);
+void          xshear_matrix               (Matrix, real);
+void          yshear_matrix               (Matrix, real);
+
 #endif /* GEOMETRY_H */
diff -rbBuP dia/objects/GRAFCET/vector.c dia-current/objects/GRAFCET/vector.c
--- dia/objects/GRAFCET/vector.c	Fri Feb 23 15:52:19 2001
+++ dia-current/objects/GRAFCET/vector.c	Thu Mar 15 11:51:53 2001
@@ -60,15 +60,15 @@
   gboolean uparrow;
 };
 
-typedef struct _Vector {
+typedef struct _GRAFCETVector {
   OrthConn orth;
 
   gboolean uparrow;
-} Vector;
+} GRAFCETVector;
 
 struct _VectorPropertiesDialog {
   AttributeDialog dialog;
-  Vector *parent;
+  GRAFCETVector *parent;
 
   BoolAttribute uparrow;
 };
@@ -89,29 +89,29 @@
 static VectorDefaultsDialog *vector_defaults_dialog;
 static VectorDefaults defaults; 
 
-static void vector_move_handle(Vector *vector, Handle *handle,
+static void vector_move_handle(GRAFCETVector *vector, Handle *handle,
 				   Point *to, HandleMoveReason reason, ModifierKeys modifiers);
-static void vector_move(Vector *vector, Point *to);
-static void vector_select(Vector *vector, Point *clicked_point,
+static void vector_move(GRAFCETVector *vector, Point *to);
+static void vector_select(GRAFCETVector *vector, Point *clicked_point,
 			      Renderer *interactive_renderer);
-static void vector_draw(Vector *vector, Renderer *renderer);
+static void vector_draw(GRAFCETVector *vector, Renderer *renderer);
 static Object *vector_create(Point *startpoint,
 				 void *user_data,
 				 Handle **handle1,
 				 Handle **handle2);
-static real vector_distance_from(Vector *vector, Point *point);
-static void vector_update_data(Vector *vector);
-static void vector_destroy(Vector *vector);
-static Object *vector_copy(Vector *vector);
-static PROPDLG_TYPE vector_get_properties(Vector *vector);
-static ObjectChange *vector_apply_properties(Vector *vector);
-static DiaMenu *vector_get_object_menu(Vector *vector,
+static real vector_distance_from(GRAFCETVector *vector, Point *point);
+static void vector_update_data(GRAFCETVector *vector);
+static void vector_destroy(GRAFCETVector *vector);
+static Object *vector_copy(GRAFCETVector *vector);
+static PROPDLG_TYPE vector_get_properties(GRAFCETVector *vector);
+static ObjectChange *vector_apply_properties(GRAFCETVector *vector);
+static DiaMenu *vector_get_object_menu(GRAFCETVector *vector,
 					   Point *clickedpoint);
 
-static VectorState *vector_get_state(Vector *vector);
-static void vector_set_state(Vector *vector, VectorState *state);
+static VectorState *vector_get_state(GRAFCETVector *vector);
+static void vector_set_state(GRAFCETVector *vector, VectorState *state);
 
-static void vector_save(Vector *vector, ObjectNode obj_node,
+static void vector_save(GRAFCETVector *vector, ObjectNode obj_node,
 			    const char *filename);
 static Object *vector_load(ObjectNode obj_node, int version,
 			       const char *filename);
@@ -150,7 +150,7 @@
 };
 
 static ObjectChange *
-vector_apply_properties(Vector *vector)
+vector_apply_properties(GRAFCETVector *vector)
 {
   ObjectState *old_state;
   VectorPropertiesDialog *dlg = vector_properties_dialog;
@@ -168,7 +168,7 @@
 }
 
 static PROPDLG_TYPE
-vector_get_properties(Vector *vector)
+vector_get_properties(GRAFCETVector *vector)
 {
   VectorPropertiesDialog *dlg = vector_properties_dialog;
   
@@ -215,21 +215,21 @@
 }
 
 static real
-vector_distance_from(Vector *vector, Point *point)
+vector_distance_from(GRAFCETVector *vector, Point *point)
 {
   OrthConn *orth = &vector->orth;
   return orthconn_distance_from(orth, point, VECTOR_LINE_WIDTH);
 }
 
 static void
-vector_select(Vector *vector, Point *clicked_point,
+vector_select(GRAFCETVector *vector, Point *clicked_point,
 		  Renderer *interactive_renderer)
 {
   orthconn_update_data(&vector->orth);
 }
 
 static void
-vector_move_handle(Vector *vector, Handle *handle,
+vector_move_handle(GRAFCETVector *vector, Handle *handle,
 		       Point *to, HandleMoveReason reason, ModifierKeys modifiers)
 {
   assert(vector!=NULL);
@@ -242,14 +242,14 @@
 
 
 static void
-vector_move(Vector *vector, Point *to)
+vector_move(GRAFCETVector *vector, Point *to)
 {
   orthconn_move(&vector->orth, to);
   vector_update_data(vector);
 }
 
 static void
-vector_draw(Vector *vector, Renderer *renderer)
+vector_draw(GRAFCETVector *vector, Renderer *renderer)
 {
   OrthConn *orth = &vector->orth;
   Point *points;
@@ -288,12 +288,12 @@
 		  Handle **handle1,
 		  Handle **handle2)
 {
-  Vector *vector;
+  GRAFCETVector *vector;
   OrthConn *orth;
   Object *obj;
 
   vector_init_defaults();
-  vector = g_malloc(sizeof(Vector));
+  vector = g_malloc(sizeof(GRAFCETVector));
   orth = &vector->orth;
   obj = &orth->object;
   
@@ -312,21 +312,21 @@
 }
 
 static void
-vector_destroy(Vector *vector)
+vector_destroy(GRAFCETVector *vector)
 {
   orthconn_destroy(&vector->orth);
 }
 
 static Object *
-vector_copy(Vector *vector)
+vector_copy(GRAFCETVector *vector)
 {
-  Vector *newvector;
+  GRAFCETVector *newvector;
   OrthConn *orth, *neworth;
   Object *newobj;
   
   orth = &vector->orth;
  
-  newvector = g_malloc(sizeof(Vector));
+  newvector = g_malloc(sizeof(GRAFCETVector));
   neworth = &newvector->orth;
   newobj = &neworth->object;
 
@@ -338,7 +338,7 @@
 }
 
 static VectorState *
-vector_get_state(Vector *vector)
+vector_get_state(GRAFCETVector *vector)
 {
   VectorState *state = g_new(VectorState, 1);
 
@@ -350,7 +350,7 @@
 }
 
 static void
-vector_set_state(Vector *vector, VectorState *state)
+vector_set_state(GRAFCETVector *vector, VectorState *state)
 {
   vector->uparrow = state->uparrow;
 
@@ -360,7 +360,7 @@
 }
 
 static void
-vector_update_data(Vector *vector)
+vector_update_data(GRAFCETVector *vector)
 {
   OrthConn *orth = &vector->orth;
   OrthConnBBExtras *extra = &orth->extra_spacing;
@@ -386,7 +386,7 @@
 {
   ObjectChange *change;
   change = orthconn_add_segment((OrthConn *)obj, clicked);
-  vector_update_data((Vector *)obj);
+  vector_update_data((GRAFCETVector *)obj);
   return change;
 }
 
@@ -395,7 +395,7 @@
 {
   ObjectChange *change;
   change = orthconn_delete_segment((OrthConn *)obj, clicked);
-  vector_update_data((Vector *)obj);
+  vector_update_data((GRAFCETVector *)obj);
   return change;
 }
 
@@ -412,7 +412,7 @@
 };
 
 static DiaMenu *
-vector_get_object_menu(Vector *vector, Point *clickedpoint)
+vector_get_object_menu(GRAFCETVector *vector, Point *clickedpoint)
 {
   OrthConn *orth;
 
@@ -425,7 +425,7 @@
 
 
 static void
-vector_save(Vector *vector, ObjectNode obj_node,
+vector_save(GRAFCETVector *vector, ObjectNode obj_node,
 		const char *filename)
 {
   orthconn_save(&vector->orth, obj_node);
@@ -436,13 +436,13 @@
 static Object *
 vector_load(ObjectNode obj_node, int version, const char *filename)
 {
-  Vector *vector;
+  GRAFCETVector *vector;
   OrthConn *orth;
   Object *obj;
 
   vector_init_defaults();
 
-  vector = g_malloc(sizeof(Vector));
+  vector = g_malloc(sizeof(GRAFCETVector));
 
   orth = &vector->orth;
   obj = &orth->object;
diff -rbBuP dia/objects/network/Makefile.am dia-current/objects/network/Makefile.am
--- dia/objects/network/Makefile.am	Sat Jun 24 16:47:05 2000
+++ dia-current/objects/network/Makefile.am	Thu Mar 15 11:51:54 2001
@@ -12,6 +12,7 @@
 			      antenna.c \
 			      modem.c \
 			      flash.c \
+			      wanlink.c \
 			      hub.c \
 			      modularswitch.c \
 			      rj45plug.c \
@@ -27,6 +28,7 @@
 	pixmaps/computer.xpm \
 	pixmaps/disc.xpm \
 	pixmaps/flash.xpm \
+	pixmaps/wanlink.xpm \
 	pixmaps/hub.xpm \
 	pixmaps/modem.xpm \
 	pixmaps/modularswitch.xpm \
diff -rbBuP dia/objects/network/network.c dia-current/objects/network/network.c
--- dia/objects/network/network.c	Fri Feb 23 15:52:27 2001
+++ dia-current/objects/network/network.c	Thu Mar 15 11:51:54 2001
@@ -36,6 +36,7 @@
 extern ObjectType bus_type_std;
 extern ObjectType printer_type;
 extern ObjectType flash_type;
+extern ObjectType wanlink_type;
 extern ObjectType hub_type;
 extern ObjectType modularswitch_type;
 extern ObjectType rj45plug_type;
@@ -59,6 +60,7 @@
   object_register_type(&bus_type);
   object_register_type(&printer_type);
   object_register_type(&flash_type);
+  object_register_type(&wanlink_type);
   object_register_type(&hub_type);
   object_register_type(&modularswitch_type);
   object_register_type(&rj45plug_type);
diff -rbBuP dia/objects/network/pixmaps/wanlink.xpm dia-current/objects/network/pixmaps/wanlink.xpm
--- dia/objects/network/pixmaps/wanlink.xpm	Thu Jan  1 01:00:00 1970
+++ dia-current/objects/network/pixmaps/wanlink.xpm	Thu Mar 15 15:49:18 2001
@@ -0,0 +1,27 @@
+/* XPM */
+static char * wanlink_xpm[] = {
+"22 22 2 1",
+" 	c None",
+".	c #000000",
+"        .             ",
+"        ..            ",
+"         ..           ",
+"         ...          ",
+"          ..          ",
+"          ...         ",
+"           ..         ",
+"           ...        ",
+"            ...       ",
+"         .......      ",
+"        ........      ",
+"        .........     ",
+"         .......      ",
+"         ....         ",
+"          ..          ",
+"          ...         ",
+"           ..         ",
+"           ...        ",
+"            ..        ",
+"             ..       ",
+"              .       ",
+"                      "};
diff -rbBuP dia/objects/network/wanlink.c dia-current/objects/network/wanlink.c
--- dia/objects/network/wanlink.c	Thu Jan  1 01:00:00 1970
+++ dia-current/objects/network/wanlink.c	Thu Mar 15 11:51:54 2001
@@ -0,0 +1,403 @@
+/* Dia -- an diagram creation/manipulation program
+ *
+ * Wan Link netwrok object
+ * Code based on wanlink.c and bus.c
+ *
+ * Copyright (C) 1998 Alexander Larsson
+ * Copyright (C) 2001 Hubert Figuiere
+ *
+ * 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.
+ */
+
+#include <assert.h>
+#include <gtk/gtk.h>
+#include <math.h>
+
+#include "config.h"
+#include "intl.h"
+#include "render_object.h"
+#include "connection.h"
+#include "network.h"
+
+#include "pixmaps/wanlink.xpm"
+
+typedef struct _WanLinkPropertiesDialog 
+{
+    GtkWidget *dialog;
+} WanLinkPropertiesDialog;
+
+#define WANLINK_POLY_LEN 6
+
+
+typedef struct _WanLink {
+    Connection connection;
+
+    real width;
+    Point poly[WANLINK_POLY_LEN];
+    WanLinkPropertiesDialog *properties_dialog;
+} WanLink;
+
+static Object *wanlink_create(Point *startpoint,
+			      void *user_data,
+			      Handle **handle1,
+			      Handle **handle2);
+static void wanlink_destroy(WanLink *wanlink);
+static void wanlink_draw (WanLink *wanlink, Renderer *renderer);
+static real wanlink_distance_from(WanLink *wanlink, Point *point);
+static void wanlink_select(WanLink *wanlink, Point *clicked_point,
+			 Renderer *interactive_renderer);
+static Object *wanlink_copy(WanLink *wanlink);
+static void wanlink_move(WanLink *wanlink, Point *to);
+static void wanlink_move_handle(WanLink *wanlink, Handle *handle,
+			      Point *to, HandleMoveReason reason, 
+			      ModifierKeys modifiers);
+static GtkWidget *wanlink_get_properties(WanLink *wanlink);
+
+
+static void wanlink_save(WanLink *wanlink, ObjectNode obj_node,
+			 const char *filename);
+static Object *wanlink_load(ObjectNode obj_node, int version,
+			    const char *filename);
+static void wanlink_update_data(WanLink *wanlink);
+
+static ObjectTypeOps wanlink_type_ops =
+{
+  (CreateFunc) wanlink_create,
+  (LoadFunc)   wanlink_load,
+  (SaveFunc)   wanlink_save
+};
+
+static ObjectOps wanlink_ops =
+{
+  (DestroyFunc)         wanlink_destroy,
+  (DrawFunc)            wanlink_draw,
+  (DistanceFunc)        wanlink_distance_from,
+  (SelectFunc)          wanlink_select,
+  (CopyFunc)            wanlink_copy,
+  (MoveFunc)            wanlink_move,
+  (MoveHandleFunc)      wanlink_move_handle,
+  (GetPropertiesFunc)   wanlink_get_properties,
+  (ApplyPropertiesFunc) NULL,
+  (ObjectMenuFunc)      NULL
+};
+
+ObjectType wanlink_type =
+{
+  "Network - WAN Link",   /* name */
+  1,                     /* version */
+  (char **) wanlink_xpm, /* pixmap */
+
+  &wanlink_type_ops      /* ops */
+};
+
+#define FLASH_LINE NETWORK_GENERAL_LINEWIDTH
+#define FLASH_WIDTH 1.0
+#define FLASH_HEIGHT 11.0
+#define FLASH_BORDER 0.325
+
+#define FLASH_BOTTOM (FLASH_HEIGHT)
+
+static GtkWidget *
+wanlink_get_properties(WanLink *wanlink)
+{
+  return NULL;
+}
+
+
+static Object *
+wanlink_create(Point *startpoint,
+	       void *user_data,
+	       Handle **handle1,
+	       Handle **handle2)
+{
+  WanLink *wanlink;
+  Connection *conn;
+  Object *obj;
+  int i;
+  Point defaultpoly = {0.0, 0.0};
+  Point defaultlen = { 5.0, 0.0 };
+
+  wanlink = g_malloc(sizeof(WanLink));
+
+  conn = &wanlink->connection;
+  conn->endpoints[0] = *startpoint;
+  conn->endpoints[1] = *startpoint;
+  point_add(&conn->endpoints[1], &defaultlen);
+ 
+  obj = (Object *) wanlink;
+  
+  obj->type = &wanlink_type;
+  obj->ops = &wanlink_ops;
+
+  connection_init(conn, 2, 0);
+
+  for (i = 0; i < WANLINK_POLY_LEN ; i++)
+      wanlink->poly[i] = defaultpoly;
+  
+  wanlink->width = FLASH_WIDTH;
+  wanlink->properties_dialog = NULL;
+  
+  wanlink_update_data(wanlink);
+
+  *handle1 = obj->handles[0];
+  *handle2 = obj->handles[1];
+  return (Object *)wanlink;
+}
+
+
+
+static void
+wanlink_destroy(WanLink *wanlink)
+{
+  if (wanlink->properties_dialog != NULL) {
+    gtk_widget_destroy(wanlink->properties_dialog->dialog);
+    g_free(wanlink->properties_dialog);
+  }
+  connection_destroy(&wanlink->connection);
+}
+
+
+static void 
+wanlink_draw (WanLink *wanlink, Renderer *renderer)
+{
+        
+    assert (wanlink != NULL);
+    assert (renderer != NULL);
+    
+    renderer->ops->set_linewidth(renderer, FLASH_LINE);
+    renderer->ops->set_linejoin(renderer, LINEJOIN_MITER);
+    renderer->ops->set_linestyle(renderer, LINESTYLE_SOLID);
+    
+    
+    renderer->ops->fill_polygon(renderer, wanlink->poly,  WANLINK_POLY_LEN, &color_black);
+    renderer->ops->draw_polygon(renderer, wanlink->poly,  WANLINK_POLY_LEN, &color_black);
+}
+
+static real
+wanlink_distance_from(WanLink *wanlink, Point *point)
+{
+  Point *endpoints;
+  real min_dist;
+
+  /* TODO: handle the fact that this is not a line */
+  endpoints = &wanlink->connection.endpoints[0];
+  min_dist = distance_line_point( &endpoints[0], &endpoints[1],
+                                  wanlink->width, point);
+  return min_dist;
+}
+
+static void
+wanlink_select(WanLink *wanlink, Point *clicked_point,
+	    Renderer *interactive_renderer)
+{
+  connection_update_handles(&wanlink->connection);
+}
+
+static Object *
+wanlink_copy(WanLink *wanlink)
+{
+  WanLink *newwanlink;
+  Connection *conn, *newconn;
+  Object *newobj;
+  
+  conn = &wanlink->connection;
+  
+  newwanlink = g_malloc(sizeof(WanLink));
+  newconn = &newwanlink->connection;
+  newobj = (Object *) newwanlink;
+  
+  connection_copy(conn, newconn);
+
+  newwanlink->width = wanlink->width;
+  newwanlink->properties_dialog = NULL;
+
+  return (Object *)newwanlink;
+}
+
+static void
+wanlink_move(WanLink *wanlink, Point *to)
+{
+  Point delta;
+  Point *endpoints = &wanlink->connection.endpoints[0]; 
+  Object *obj = (Object *) wanlink;
+  int i;
+    
+  delta = *to;
+  point_sub(&delta, &obj->position);
+
+  for (i=0;i<2;i++) {
+    point_add(&endpoints[i], &delta);
+  }
+
+  wanlink_update_data(wanlink);
+}
+
+static void
+wanlink_move_handle(WanLink *wanlink, Handle *handle,
+		Point *to, HandleMoveReason reason, ModifierKeys modifiers)
+{
+  connection_move_handle(&wanlink->connection, handle->id, to, reason);
+  
+  wanlink_update_data(wanlink);
+}
+
+static void
+wanlink_save(WanLink *wanlink, ObjectNode obj_node,
+	     const char *filename)
+{
+    AttributeNode attr;
+  
+    connection_save((Connection *)wanlink, obj_node);
+    
+    attr = new_attribute(obj_node, "width");
+    data_add_real(attr, wanlink->width);
+}
+
+static Object *
+wanlink_load(ObjectNode obj_node, int version, const char *filename)
+{
+    WanLink *wanlink;
+    Connection *conn;
+    Object *obj;
+    AttributeNode attr;
+    DataNode data;
+    
+    wanlink = g_malloc(sizeof(WanLink));
+
+    conn = &wanlink->connection;
+    obj = (Object *) wanlink;
+    
+    obj->type = &wanlink_type;
+    obj->ops = &wanlink_ops;
+
+    wanlink->properties_dialog = NULL;
+
+    connection_load(conn, obj_node);
+    connection_init(conn, 2, 0);
+    
+    attr = object_find_attribute(obj_node, "width");
+    if (attr != NULL) {
+	data = attribute_first_data(attr);
+	wanlink->width = data_real( data);
+    }
+
+    wanlink_update_data (wanlink);
+    
+    return obj;
+    /*
+      if (wanlink_desc.store == NULL) {
+      render_to_store();
+      }
+      return render_object_load(obj_node, &wanlink_desc);
+    */
+}
+
+static void
+wanlink_update_data(WanLink *wanlink)
+{
+  Connection *conn = &wanlink->connection;
+  Object *obj = (Object *) wanlink;
+  Point v, vhat;
+  Point *endpoints;
+  real min_par, max_par;
+  real width, width_2;
+  real len, angle;
+  real middle_x;
+  Point origin;
+  int i;
+  Matrix m;
+  
+
+  width = wanlink->width;
+  width_2 = width / 2.0;
+  
+  endpoints = &conn->endpoints[0]; 
+  obj->position = endpoints[0];
+
+  v = endpoints[1];
+  point_sub(&v, &endpoints[0]);
+  if ((fabs(v.x) == 0.0) && (fabs(v.y)==0.0)) {
+    v.x += 0.01;
+  }
+  vhat = v;
+  point_normalize(&vhat);
+  min_par = 0.0;
+  max_par = point_dot(&vhat, &v);
+
+  min_par -= width_2;
+  max_par += width_2;
+
+  connection_update_boundingbox(conn);
+
+
+  /** compute the polygon **/
+  origin = wanlink->connection.endpoints [0];
+  middle_x = origin.x;
+  len = point_len (&v);
+
+  angle = atan2 (vhat.y, vhat.x) - M_PI_2;
+
+    /* The case of the wanlink */
+  wanlink->poly[0].x = (width * 0.50) - width_2;
+  wanlink->poly[0].y = (len * 0.00);
+  wanlink->poly[1].x = (width * 0.50) - width_2;
+  wanlink->poly[1].y = (len * 0.45);
+  wanlink->poly[2].x = (width * 0.94) - width_2;
+  wanlink->poly[2].y = (len * 0.45);
+  wanlink->poly[3].x = (width * 0.50) - width_2;
+  wanlink->poly[3].y = (len * 1.00);
+  wanlink->poly[4].x = (width * 0.50) - width_2;
+  wanlink->poly[4].y = (len * 0.55);
+  wanlink->poly[5].x = (width * 0.06) - width_2;
+  wanlink->poly[5].y = (len * 0.55);
+  
+  /* rotate */
+
+  identity_matrix (m);
+  rotate_matrix (m, angle);
+  
+
+  obj->bounding_box.top = origin.y;
+  obj->bounding_box.left = origin.x;
+  obj->bounding_box.bottom = conn->endpoints[1].y;
+  obj->bounding_box.right = conn->endpoints[1].x;
+  for (i = 0; i <  WANLINK_POLY_LEN; i++) 
+  {
+      Point new_pt;
+      
+      transform_point (m, &wanlink->poly[i], 
+		       &new_pt);
+      point_add (&new_pt, &origin);
+      wanlink->poly[i] = new_pt;
+      if (wanlink->poly [i].y < obj->bounding_box.top)
+	  obj->bounding_box.top = wanlink->poly [i].y;
+      if (wanlink->poly [i].x < obj->bounding_box.left)
+	  obj->bounding_box.left = wanlink->poly [i].x;
+      if (wanlink->poly [i].y > obj->bounding_box.bottom)
+	  obj->bounding_box.bottom = wanlink->poly [i].y;
+      if (wanlink->poly [i].x > obj->bounding_box.right)
+	  obj->bounding_box.right = wanlink->poly [i].x;
+  }
+
+
+  connection_update_handles(conn);
+}
+
+
+
+
+
+
+
diff -rbBuP dia/sheets/network.sheet dia-current/sheets/network.sheet
--- dia/sheets/network.sheet	Fri Feb 23 15:52:34 2001
+++ dia-current/sheets/network.sheet	Thu Mar 15 11:54:24 2001
@@ -52,6 +52,10 @@
       <description xml:lang="hu">WAN kapcsolat</description>
       <description>A WAN Connection</description>
     </object>
+    <object name="Network - WAN Link">
+      <description xml:lang="fr">Une laison WAN.</description>
+      <description>A WAN Link.</description>
+    </object>
     <object name="Network - Hub">
       <description xml:lang="no">En hub eller switch som kan stables</description>
       <description xml:lang="fr">Un hub ou commutateur empilable</description>
@@ -96,22 +100,26 @@
     </object>
     <object name="Network - Cloud">
       <description xml:lang="no">Nettverkssky</description>
+      <description xml:lang="fr">Nuage de réseau</description>
       <description xml:lang="de">Netzwerkwolke</description>
       <description xml:lang="hu">Hálozat felhő</description>
       <description>Network Cloud</description>
     </object>
     <object name="Network - Router Symbol">
       <description xml:lang="no">Rutersymbol</description>
+      <description xml:lang="fr">Symbole de routeur</description>
       <description xml:lang="hu">Útválasztó jele</description>
       <description>Router Symbol</description>
     </object>
     <object name="Network - Switch Symbol">
       <description xml:lang="no">Symbol for en switch</description>
+      <description xml:lang="fr">Symbole de commutateur</description>
       <description xml:lang="hu">Switch jele</description>
       <description>Switch Symbol</description>
     </object>
     <object name="Network - Switch ATM Symbol">
       <description xml:lang="no">Symbol for en ATM-switch</description>
+      <description xml:lang="fr">Symbole de commutateur ATM</description>
       <description xml:lang="hu">ATM-switch jele</description>
       <description>ATM Switch Symbol</description>
     </object>