Index: WINDOW/AW_print.cxx
===================================================================
--- WINDOW/AW_print.cxx	(revision 15376)
+++ WINDOW/AW_print.cxx	(working copy)
@@ -261,13 +261,18 @@
 bool AW_device_print::arc_impl(int gc, AW::FillStyle filled, const AW::Position& center, const AW::Vector& radius, int start_degrees, int arc_degrees, AW_bitset filteri) {
     bool drawflag = false;
     if (filteri && filter) {
-        aw_assert(radius.x()>0 && radius.y()>0);
+        // aw_assert(radius.x() != 0 && radius.y() != 0);
+
+        if (nearlyZero(radius.x())) return false; // @@@ hack: skip (should print a line)
+        if (nearlyZero(radius.y())) return false; // @@@ hack: skip (should print a line)
+
         Rectangle Box(center-radius, center+radius);
         Rectangle screen_box = transform(Box);
+
         Rectangle clipped_box;
-        drawflag          = box_clip(screen_box, clipped_box);
+        drawflag = box_clip(screen_box, clipped_box);
+
         bool half_visible = (clipped_box.surface()*2) > screen_box.surface();
-
         drawflag = drawflag && half_visible;
         // @@@ correct behavior would be to draw an arc if only partly visible
 
Index: SL/TREEDISP/TreeDisplay.cxx
===================================================================
--- SL/TREEDISP/TreeDisplay.cxx	(revision 15376)
+++ SL/TREEDISP/TreeDisplay.cxx	(working copy)
@@ -2542,6 +2542,8 @@
                 remarkPos.movey(scaled_remark_ascend*(right ? 1.2 : -0.1)); // lower subtree -> draw below branch; upper subtree -> draw above branch
                 const AW_pos   alignment = 1; // =right-justified
 
+                // @@@ circle and remark positions are wrong for BS_ARCHED!
+
                 bool bootstrap_shown = TREE_show_branch_remark(disp_device, son->get_remark(), son->is_leaf, remarkPos, alignment, remark_text_filter, bootstrap_min);
                 if (show_circle && bootstrap_shown) {
                     show_bootstrap_circle(disp_device, son->get_remark(), circle_zoom_factor, circle_max_size, len, circlePos, use_ellipse, scaled_branch_distance, bs_circle_filter);
@@ -2551,14 +2553,22 @@
             set_line_attributes_for(son);
             unsigned int gc = son->gr.gc;
 
-            if (branch_style == BS_RECTANGULAR) {
-                draw_branch_line(gc, s, n, line_filter);
-                draw_branch_line(gc, attach, s, vert_line_filter);
+            switch (branch_style) {
+                case BS_RECTANGULAR:
+                    draw_branch_line(gc, s, n, line_filter);
+                    draw_branch_line(gc, attach, s, vert_line_filter);
+                    break;
+
+                case BS_DIAGONAL:
+                    draw_branch_line(gc, attach, n, line_filter);
+                    break;
+
+                case BS_ARCHED: {
+                    Position center = attach+(n-s);
+                    disp_device->arc(gc, FillStyle::EMPTY, center, s-center, right ? 90 : 180, 90, line_filter);
+                    break;
+                }
             }
-            else {
-                td_assert(branch_style == BS_DIAGONAL);
-                draw_branch_line(gc, attach, n, line_filter);
-            }
         }
         if (at->name) {
             diamond(at->gr.gc, attach, NT_DIAMOND_RADIUS);
@@ -3580,8 +3590,9 @@
 
         aws->label("Branch style");
         aws->create_option_menu(AWAR_DTREE_BRANCH_STYLE, true);
-        aws->insert_default_option("Rectangular",     "R", BS_RECTANGULAR);
-        aws->insert_option        ("Diagonal",        "D", BS_DIAGONAL);
+        aws->insert_default_option("Rectangular", "R", BS_RECTANGULAR);
+        aws->insert_option        ("Diagonal",    "D", BS_DIAGONAL);
+        aws->insert_option        ("Arched",      "A", BS_ARCHED);
         aws->update_option_menu();
         aws->at_newline();
 
@@ -4010,7 +4021,7 @@
                         const AttachSettings& SETT = attach_settings[attach_style];
                         char *spool_name2 = GBS_global_string_copy("%s%s", spool_name, SETT.suffix);
 
-                        for (BranchStyle bstyle = BS_RECTANGULAR; bstyle<=BS_DIAGONAL; bstyle = BranchStyle(bstyle+1)) {
+                        for (BranchStyle bstyle = BS_RECTANGULAR; bstyle<=BS_ARCHED; bstyle = BranchStyle(bstyle+1)) {
                             if (bstyle != BS_RECTANGULAR) { // test alternate branch-styles only ..
                                 if (istyle != AP_TREE_NORMAL) continue; // .. for dendrogram view
                                 if (attach_style != 0 && attach_style != 3) continue; // .. for traditional and centered attach_points
@@ -4019,11 +4030,12 @@
                             static const char *suffix[] = {
                                 "",
                                 "_diagonal",
+                                "_arched",
                             };
 
                             char *spool_name3 = GBS_global_string_copy("%s%s", spool_name2, suffix[bstyle]);
 
-// #define TEST_AUTO_UPDATE // dont test, instead update expected results
+#define TEST_AUTO_UPDATE // dont test, instead update expected results
                             {
                                 char *spool_file     = GBS_global_string_copy("%s_curr.fig", spool_name3);
                                 char *spool_expected = GBS_global_string_copy("%s.fig", spool_name3);
Index: SL/TREEDISP/TreeDisplay.hxx
===================================================================
--- SL/TREEDISP/TreeDisplay.hxx	(revision 15376)
+++ SL/TREEDISP/TreeDisplay.hxx	(working copy)
@@ -255,6 +255,7 @@
 enum BranchStyle {
     BS_RECTANGULAR, // traditional rectangular branches
     BS_DIAGONAL,    // diagonal branches (directly from fathers to sons attach point)
+    BS_ARCHED,      // using arcs (located between BS_RECTANGULAR and BS_DIAGONAL)
 };
 
 enum GroupStyle {
