diff -ru etherape-0.9.20.orig/glade/etherape.ui etherape-0.9.20/glade/etherape.ui
--- etherape-0.9.20.orig/glade/etherape.ui	2020-05-27 07:22:43.000000000 -0400
+++ etherape-0.9.20/glade/etherape.ui	2020-05-29 09:14:08.073933917 -0400
@@ -439,6 +439,25 @@
                         <signal name="activate" handler="on_status_bar_check_activate" swapped="no"/>
                       </object>
                     </child>
+                    <child>
+                      <object class="GtkSeparatorMenuItem" id="separatorrefresh1">
+                        <property name="visible">True</property>
+                        <property name="can_focus">False</property>
+                      </object>
+                    </child>
+                    <child>
+                      <object class="GtkImageMenuItem" id="refresh_menuitem">
+                        <property name="label" translatable="yes">Refresh</property>
+                        <property name="visible">True</property>
+                        <property name="sensitive">True</property>
+                        <property name="can_focus">False</property>
+                        <property name="has_tooltip">True</property>
+                        <property name="use_underline">True</property>
+                        <property name="use_stock">False</property>
+                        <signal name="activate" handler="on_refresh_menuitem_activate" swapped="no"/>
+                        <accelerator key="l" signal="activate" modifiers="GDK_CONTROL_MASK"/>
+                      </object>
+                    </child>
                   </object>
                 </child>
               </object>
diff -ru etherape-0.9.20.orig/src/diagram.c etherape-0.9.20/src/diagram.c
--- etherape-0.9.20.orig/src/diagram.c	2020-05-27 07:22:43.000000000 -0400
+++ etherape-0.9.20/src/diagram.c	2020-05-29 08:16:14.758659910 -0400
@@ -158,6 +158,7 @@
 
 static long canvas_obj_count = 0; /* counter of canvas objects */
 static GooCanvas *gcanvas_ = NULL; /* drawing canvas */
+static GtkContainer *garea_ = NULL; /* drawing container */
 static GooCanvasText *pcap_stats_text_item = NULL;
 
 /***************************************************************************
@@ -290,7 +291,6 @@
  * signals to callback functions */
 void init_diagram(GtkBuilder *xml)
 {
-  GtkContainer *area;
   GooCanvasItem *rootitem;
   GooCanvasItem *item;
   GtkAllocation windowsize;
@@ -302,9 +302,9 @@
   g_assert(gcanvas_ == NULL);
 
   /* get containing window and size */
-  area = GTK_CONTAINER(gtk_builder_get_object(xml, "diagramwindow"));
-  g_assert(area != NULL);
-  gtk_widget_get_allocation(GTK_WIDGET(area), &windowsize);
+  garea_ = GTK_CONTAINER(gtk_builder_get_object(xml, "diagramwindow"));
+  g_assert(garea_ != NULL);
+  gtk_widget_get_allocation(GTK_WIDGET(garea_), &windowsize);
 
   /* Creates trees */
   canvas_nodes = g_tree_new_full((GCompareDataFunc)canvas_node_compare,
@@ -328,7 +328,7 @@
 
   gtk_widget_show(GTK_WIDGET(gcanvas_));
 
-  gtk_container_add(area, GTK_WIDGET(gcanvas_));
+  gtk_container_add(garea_, GTK_WIDGET(gcanvas_));
 
   rootitem = goo_canvas_get_root_item(gcanvas_);
 
@@ -362,7 +362,7 @@
   pcap_stats_text_item = GOO_CANVAS_TEXT(item);
   addref_canvas_obj(G_OBJECT(pcap_stats_text_item));
 
-  sig_id = g_signal_connect(G_OBJECT(area), "size-allocate",
+  sig_id = g_signal_connect(G_OBJECT(garea_), "size-allocate",
                             G_CALLBACK(diagram_resize_event), gcanvas_);
   g_assert(sig_id > 0);
   sig_id = g_signal_connect(G_OBJECT(pcap_stats_text_item), "enter-notify-event",
@@ -1854,3 +1854,16 @@
   update_diagram(gcanvas_);
   return TRUE;
 }
+
+gboolean refresh_diagram(void)
+{
+  GtkAllocation windowsize;
+  /* Simulate a window resize */
+  gtk_widget_get_allocation(GTK_WIDGET(garea_), &windowsize);
+  goo_canvas_set_bounds(gcanvas_,
+                        -windowsize.width/2, -windowsize.height/2,
+                        windowsize.width/2, windowsize.height/2);
+  redraw_canvas_background(gcanvas_);
+  diagram_reposition(gcanvas_);
+  return TRUE;
+}
diff -ru etherape-0.9.20.orig/src/diagram.h etherape-0.9.20/src/diagram.h
--- etherape-0.9.20.orig/src/diagram.h	2020-05-27 07:22:43.000000000 -0400
+++ etherape-0.9.20/src/diagram.h	2020-05-29 07:38:05.316757643 -0400
@@ -25,6 +25,7 @@
 extern gboolean stop_requested; /* True if there is a pending stop request */
 
 gboolean update_diagram_callback(gpointer data);
+gboolean refresh_diagram(void);
 void init_diagram(GtkBuilder *xml);
 void set_statusbar_msg(gchar *str);
 void delete_gui_protocols(void);
diff -ru etherape-0.9.20.orig/src/menus.c etherape-0.9.20/src/menus.c
--- etherape-0.9.20.orig/src/menus.c	2020-05-27 07:22:43.000000000 -0400
+++ etherape-0.9.20/src/menus.c	2020-05-29 07:38:38.830693034 -0400
@@ -259,6 +259,11 @@
 }                               /* on_stop_menuitem_activate */
 
 
+void on_refresh_menuitem_activate(GtkMenuItem *menuitem, gpointer user_data)
+{
+  refresh_diagram();
+}                               /* on_refresh_menuitem_activate */
+
 
 /* View menu */
 
diff -ru etherape-0.9.20.orig/src/menus.h etherape-0.9.20/src/menus.h
--- etherape-0.9.20.orig/src/menus.h	2020-05-27 07:22:43.000000000 -0400
+++ etherape-0.9.20/src/menus.h	2020-05-28 16:55:27.401794243 -0400
@@ -28,6 +28,7 @@
 void on_mode_radio_activate(GtkRadioMenuItem *menuitem, gpointer user_data);
 void on_start_menuitem_activate(GtkMenuItem *menuitem, gpointer user_data);
 void on_stop_menuitem_activate(GtkMenuItem *menuitem, gpointer user_data);
+void on_refresh_menuitem_activate(GtkMenuItem *menuitem, gpointer user_data);
 void on_pause_menuitem_activate(GtkMenuItem *menuitem, gpointer user_data);
 void on_next_menuitem_activate(GtkMenuItem *menuitem, gpointer user_data);
