Index: client/reqtree.c
===================================================================
--- client/reqtree.c	(revision 14681)
+++ client/reqtree.c	(working copy)
@@ -1104,6 +1104,7 @@
       }
 
       /* Draw all outgoing edges */
+
       startx = node->node_x + node->node_width;
       starty = node->node_y + node->node_height / 2;
       for (k = 0; k < node->nprovide; k++) {
@@ -1112,7 +1113,7 @@
 	endx = dest_node->node_x;
 	endy = dest_node->node_y + dest_node->node_height / 2;
 	
-	canvas_put_line(pcanvas,
+	canvas_put_bezier_line(pcanvas,
 		        get_color(tileset, edge_color(node, dest_node)),
 		        LINE_GOTO,
 		        startx, starty, endx - startx, endy - starty);
Index: client/gui-gtk-2.0/canvas.c
===================================================================
--- client/gui-gtk-2.0/canvas.c	(revision 14681)
+++ client/gui-gtk-2.0/canvas.c	(working copy)
@@ -260,11 +260,102 @@
     }
 
     gdk_gc_set_foreground(gc, &pcolor->color);
+
     gdk_draw_line(pcanvas->v.pixmap, gc,
-		  start_x, start_y, start_x + dx, start_y + dy);
+                  start_x, start_y, start_x + dx, start_y + dy);
+    
   }
 }
 
+/****************************************************************************
+  Draw a colored bezier line for the Technology Tree connectors
+  A bezier line is: 1 horizontal line, 2 arcs, 1 horizontal line
+****************************************************************************/
+void canvas_put_bezier_line(struct canvas *pcanvas,
+		     struct color *pcolor,
+		     enum line_type ltype, int start_x, int start_y,
+		     int dx, int dy)
+{
+  if (pcanvas->type == CANVAS_PIXMAP) {
+    GdkGC *gc = NULL;
+    
+    switch (ltype) {
+    case LINE_NORMAL:
+      gc = thin_line_gc;
+      break;
+    case LINE_BORDER:
+      gc = border_line_gc;
+      break;
+    case LINE_TILE_FRAME:
+      gc = thick_line_gc;
+      break;
+    case LINE_GOTO:
+      gc = thick_line_gc;
+      break;
+    }
+
+    gdk_gc_set_foreground(gc, &pcolor->color);
+
+    /* To begin, work out the endpoints of the curve */
+    /* and initial horizontal stroke */
+    int line1end_x = start_x + 10;
+    int end_x = start_x + dx;
+    int end_y = start_y + dy;
+    
+    int arcwidth = dx - 10;
+    /* draw a short horizontal line */
+    gdk_draw_line(pcanvas->v.pixmap, gc,
+                  start_x, start_y, line1end_x, start_y);
+
+    if (end_y < start_y) {
+      /* if end_y is above start_y then the first curve is rising */
+      int archeight = -dy + 1;
+
+      /* position the BB of the arc */
+      int arcstart_x = line1end_x-arcwidth/2 -1;
+      int arcstart_y = end_y-1;
+
+      /* Draw arc curving up */
+      gdk_draw_arc(pcanvas->v.pixmap, gc, FALSE,
+                   arcstart_x, arcstart_y, 
+                   arcwidth, archeight, 0, -90*64);
+
+      /* Shift BB to the right */
+      arcstart_x = arcstart_x + arcwidth;
+
+      /* draw arc curving across */
+      gdk_draw_arc(pcanvas->v.pixmap, gc, FALSE,
+                   arcstart_x, arcstart_y, 
+                   arcwidth, archeight, 180*64, -90*64);
+
+    } else { /* end_y is below start_y */
+
+      int archeight = dy + 1;
+
+      /* position BB */
+      int arcstart_x = line1end_x - arcwidth/2 -1;
+      int arcstart_y = start_y-1;
+
+      /* Draw arc curving down */
+      gdk_draw_arc(pcanvas->v.pixmap, gc, FALSE,
+                   arcstart_x, arcstart_y, 
+                   arcwidth, archeight, 0, 90*64);
+
+      /* shift BB right */
+      arcstart_x = arcstart_x + arcwidth;
+
+      /* Draw arc curving across */
+      gdk_draw_arc(pcanvas->v.pixmap, gc, FALSE,
+                   arcstart_x, arcstart_y, 
+                   arcwidth, archeight, 270*64, -90*64);
+
+    }
+    /* Draw short horizontal line */
+    gdk_draw_line(pcanvas->v.pixmap, gc,
+                  end_x - 10, start_y + dy, end_x, end_y);
+  }
+}
+
 static PangoLayout *layout;
 static struct {
   PangoFontDescription **font;
Index: client/gui-xaw/mapview.c
===================================================================
--- client/gui-xaw/mapview.c	(revision 14681)
+++ client/gui-xaw/mapview.c	(working copy)
@@ -522,6 +522,36 @@
 }
 
 /**************************************************************************
+  Draw a 1-pixel-width curved colored line onto the mapview or 
+  citydialog canvas.
+**************************************************************************/
+void canvas_put_bezier_line(struct canvas *pcanvas, struct color *pcolor,
+		     enum line_type ltype, int start_x, int start_y,
+		     int dx, int dy)
+{
+  /* TODO: Needs to draw curved line */
+  GC gc = NULL;
+
+  switch (ltype) {
+  case LINE_NORMAL:
+    gc = civ_gc;
+    break;
+  case LINE_BORDER:
+    gc = border_line_gc;
+    break;
+  case LINE_TILE_FRAME:
+  case LINE_GOTO:
+    /* TODO: differentiate these. */
+    gc = civ_gc;
+    break;
+  }
+
+  XSetForeground(display, gc, pcolor->color.pixel);
+  XDrawLine(display, pcanvas->pixmap, gc,
+	    start_x, start_y, start_x + dx, start_y + dy);
+}
+
+/**************************************************************************
   Flush the given part of the canvas buffer (if there is one) to the
   screen.
 **************************************************************************/
Index: client/include/canvas_g.h
===================================================================
--- client/include/canvas_g.h	(revision 14681)
+++ client/include/canvas_g.h	(working copy)
@@ -56,6 +56,11 @@
 		     enum line_type ltype, int start_x, int start_y,
 		     int dx, int dy);
 
+void canvas_put_bezier_line(struct canvas *pcanvas,
+		     struct color *pcolor,
+		     enum line_type ltype, int start_x, int start_y,
+		     int dx, int dy);
+
 /* Text drawing functions */
 enum client_font {
   FONT_CITY_NAME,
Index: client/gui-win32/canvas.c
===================================================================
--- client/gui-win32/canvas.c	(revision 14681)
+++ client/gui-win32/canvas.c	(working copy)
@@ -344,3 +344,25 @@
 
   canvas_release_hdc(pcanvas);
 }
+
+/**************************************************************************
+  Draw a 1-pixel-width colored curved line onto the canvas.
+**************************************************************************/
+void canvas_put_bezier_line(struct canvas *pcanvas, struct color *pcolor,
+		     enum line_type ltype, int start_x, int start_y,
+		     int dx, int dy)
+{
+  /* FIXME: This function should draw a curved line comprising 2 arcs */
+  HDC hdc = canvas_get_hdc(pcanvas);
+  HPEN old_pen, pen;
+
+  /* FIXME: set line type (size). */
+  pen = pen_alloc(pcolor);
+  old_pen = SelectObject(hdc, pen);
+  MoveToEx(hdc, start_x, start_y, NULL);
+  LineTo(hdc, start_x + dx, start_y + dy);
+  SelectObject(hdc, old_pen);
+  pen_free(pen);
+
+  canvas_release_hdc(pcanvas);
+}
Index: client/gui-sdl/canvas.c
===================================================================
--- client/gui-sdl/canvas.c	(revision 14681)
+++ client/gui-sdl/canvas.c	(working copy)
@@ -193,6 +193,22 @@
 }
 
 /****************************************************************************
+  Draw a 1-pixel-width colored curved line onto the canvas.
+****************************************************************************/
+void canvas_put_bezier_line(struct canvas *pcanvas, struct color *pcolor,
+		  enum line_type ltype, int start_x, int start_y,
+		  int dx, int dy)
+{
+  /* FIXME: This procedure should draw a curved line */
+  putline(pcanvas->surf, start_x, start_y, start_x + dx, start_y + dy,
+                                    SDL_MapRGBA(pcanvas->surf->format,
+                                                pcolor->color->r,
+                                                pcolor->color->g,
+		                                pcolor->color->b,
+                                                pcolor->color->unused));
+}
+
+/****************************************************************************
   Return the size of the given text in the given font.  This size should
   include the ascent and descent of the text.  Either of width or height
   may be NULL in which case those values simply shouldn't be filled out.
Index: client/gui-ftwl/canvas.c
===================================================================
--- client/gui-ftwl/canvas.c	(revision 14681)
+++ client/gui-ftwl/canvas.c	(working copy)
@@ -183,6 +183,37 @@
   }
 }
 
+/**************************************************************************
+  Draw a 1-pixel-width curved colored line onto the mapview or 
+  citydialog canvas.
+**************************************************************************/
+void canvas_put_bezier_line(struct canvas *pcanvas, struct color *pcolor,
+		     enum line_type ltype, int start_x, int start_y,
+		     int dx, int dy)
+{
+  /* TODO: Needs to draw curved line */
+  struct ct_point start = { start_x, start_y };
+  struct ct_point end = { start_x + dx, start_y + dy};
+  struct ct_rect rect;
+
+  ct_rect_fill_on_2_points(&rect,&start,&end);
+
+  freelog(LOG_DEBUG, "gui_put_line(...)");
+
+  if (ltype == LINE_NORMAL) {
+    be_draw_line(pcanvas->osda, &start, &end, 1, FALSE, pcolor->color);
+  } else if (ltype == LINE_BORDER) {
+    be_draw_line(pcanvas->osda, &start, &end, 2, TRUE, pcolor->color);
+  } else {
+    assert(0);
+  }
+      
+  if (pcanvas->widget) {
+    sw_window_canvas_background_region_needs_repaint(pcanvas->widget,
+						     &rect);
+  }
+}
+
 /****************************************************************************
   Return the size of the given text in the given font.  This size should
   include the ascent and descent of the text.  Either of width or height
Index: client/gui-stub/canvas.c
===================================================================
--- client/gui-stub/canvas.c	(revision 14681)
+++ client/gui-stub/canvas.c	(working copy)
@@ -118,6 +118,16 @@
 }
 
 /****************************************************************************
+  Draw a 1-pixel-width colored curved line onto the canvas.
+****************************************************************************/
+void canvas_put_bezier_line(struct canvas *pcanvas, struct color *pcolor,
+		  enum line_type ltype, int start_x, int start_y,
+		  int dx, int dy)
+{
+  /* PORTME */
+}
+
+/****************************************************************************
   Return the size of the given text in the given font.  This size should
   include the ascent and descent of the text.  Either of width or height
   may be NULL in which case those values simply shouldn't be filled out.
