Index: src/cmenu.c
===================================================================
--- src/cmenu.c	(revision 6)
+++ src/cmenu.c	(revision 7)
@@ -262,13 +262,43 @@
 }
 
 static gboolean
+add_poi_at_unit_xy(gint x, gint y)
+{
+    static gint poi_cat = -1;
+    gint poi_id;
+    PoiInfo poi;
+    printf("%s()\n", __PRETTY_FUNCTION__);
+
+    poi_id = poi_get_next_id();
+
+    poi.poi_id = -1;
+    poi.cat_id = poi_cat;
+    unit2latlon(x, y, poi.lat, poi.lon);
+    if (poi_id != -1)
+        poi.label = g_strdup_printf("Point%06d", poi_id); /* TODO: l10n */
+    else
+        poi.label = g_strdup("");
+    poi.desc = g_strdup("");
+    poi.clabel = NULL;
+
+    poi_dialog(_window, &poi, TRUE);
+    poi_cat = poi.cat_id;
+
+    g_free(poi.label);
+    g_free(poi.desc);
+    g_free(poi.clabel);
+
+    vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
+}
+
+static gboolean
 cmenu_cb_loc_add_poi(GtkMenuItem *item)
 {
     gint unitx, unity;
     printf("%s()\n", __PRETTY_FUNCTION__);
 
     screen2unit(_cmenu_position_x, _cmenu_position_y, unitx, unity);
-    poi_add_dialog(_window, unitx, unity);
+    add_poi_at_unit_xy(unitx, unity);
 
     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
     return TRUE;
@@ -533,7 +563,7 @@
 
     screen2unit(_cmenu_position_x, _cmenu_position_y, unitx, unity);
     if((way = find_nearest_waypoint(unitx, unity)))
-        poi_add_dialog(_window, way->point->unitx, way->point->unity);
+        add_poi_at_unit_xy(way->point->unitx, way->point->unity);
     else
     {
         MACRO_BANNER_SHOW_INFO(_window, _("There are no waypoints."));
@@ -626,19 +656,16 @@
     gint unitx, unity;
     printf("%s()\n", __PRETTY_FUNCTION__);
 
-    memset(&poi, 0, sizeof(poi));
     screen2unit(_cmenu_position_x, _cmenu_position_y, unitx, unity);
     if(!select_poi(unitx, unity, &poi, FALSE)) /* FALSE = not quick */
         return FALSE;
 
-    poi_view_dialog(_window, &poi);
-    if(poi.label)
-        g_free(poi.label);
-    if(poi.desc)
-        g_free(poi.desc);
-    if(poi.clabel)
-        g_free(poi.clabel);
+    poi_dialog(_window, &poi, FALSE);
 
+    g_free(poi.label);
+    g_free(poi.desc);
+    g_free(poi.clabel);
+
     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
     return TRUE;
 }
Index: src/poi.c
===================================================================
--- src/poi.c	(revision 6)
+++ src/poi.c	(revision 7)
@@ -1144,446 +1144,176 @@
 }
 
 gboolean
-poi_add_dialog(GtkWidget *parent, gint unitx, gint unity)
+poi_dialog(GtkWidget *parent, PoiInfo *poi, gboolean is_add_dialog)
 {
-    static PoiInfo poi;
-    static GtkWidget *dialog;
-    static GtkWidget *table;
-    static GtkWidget *label;
-    static GtkWidget *txt_label;
-    static GtkWidget *txt_lat;
-    static GtkWidget *txt_lon;
-    static GtkWidget *cmb_category;
-    static GtkWidget *txt_desc;
-    static GtkWidget *btn_catedit;
-    static GtkWidget *hbox;
-    static GtkWidget *txt_scroll;
-    static GtkTextBuffer *desc_txt;
-    static GtkTextIter begin, end;
-    static DeletePOI dpoi = {NULL, NULL, 0};
-    static PoiCategoryEditInfo pcedit;
     static int last_deg_format = 0;
+    GtkTreeIter iter;
+    GtkWidget *dialog;
+    GtkWidget *table;
+    GtkWidget *label;
+    GtkWidget *txt_label;
+    GtkWidget *txt_lat;
+    GtkWidget *txt_lon;
+    GtkWidget *cmb_category;
+    GtkWidget *txt_desc;
+    GtkWidget *btn_delete;
+    GtkWidget *btn_catedit;
+    GtkWidget *hbox;
+    GtkWidget *txt_scroll;
+    GtkTextBuffer *desc_txt;
+    GtkTextIter begin, end;
+    DeletePOI dpoi;
+    PoiCategoryEditInfo pcedit;
+
+    gchar tmp1[LL_FMT_LEN], tmp2[LL_FMT_LEN];
     
     printf("%s()\n", __PRETTY_FUNCTION__);
-
-    unit2latlon(unitx, unity, poi.lat, poi.lon);
-
     
     gint fallback_deg_format = _degformat;
     
-    if(!coord_system_check_lat_lon (poi.lat, poi.lon, &fallback_deg_format))
+    if(!coord_system_check_lat_lon(poi->lat, poi->lon, &fallback_deg_format))
     {
     	last_deg_format = _degformat;
     	_degformat = fallback_deg_format;
-    	
-    	if(dialog != NULL) gtk_widget_destroy(dialog);
-    	dialog = NULL;
     }
     else if(_degformat != last_deg_format)
-    {
     	last_deg_format = _degformat;
-    	
-		if(dialog != NULL) gtk_widget_destroy(dialog);
-    	dialog = NULL;
-    }
-    
-    
 
-
-    if(dialog == NULL)
+    if (is_add_dialog)
     {
         dialog = gtk_dialog_new_with_buttons(_("Add POI"),
-            GTK_WINDOW(parent), GTK_DIALOG_MODAL,
-            GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
-            GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
-            NULL);
-
-        /* Set the lat/lon strings. */
-        gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
-                table = gtk_table_new(6, 4, FALSE), TRUE, TRUE, 0);
-
-        gtk_table_attach(GTK_TABLE(table),
-                label = gtk_label_new(DEG_FORMAT_ENUM_TEXT[_degformat].short_field_1),
-                0, 1, 0, 1, GTK_FILL, 0, 2, 0);
-        gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
-        gtk_table_attach(GTK_TABLE(table),
-                txt_lat = gtk_entry_new(),
-                1, (DEG_FORMAT_ENUM_TEXT[_degformat].field_2_in_use ? 2 : 4), 
-                0, 1, GTK_FILL, 0, 2, 0);
-
-        if(DEG_FORMAT_ENUM_TEXT[_degformat].field_2_in_use )
-        {
-	        gtk_table_attach(GTK_TABLE(table),
-	                label = gtk_label_new(DEG_FORMAT_ENUM_TEXT[_degformat].short_field_2),
-	                2, 3, 0, 1, GTK_FILL, 0, 2, 0);
-	        gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
-	        gtk_table_attach(GTK_TABLE(table),
-	                txt_lon = gtk_entry_new(),
-	                3, 4, 0, 1, GTK_FILL, 0, 2, 0);
-        }
-        
-        gtk_table_attach(GTK_TABLE(table),
-                label = gtk_label_new(_("Label")),
-                0, 1, 1, 2, GTK_FILL, 0, 2, 0);
-        gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
-        gtk_table_attach(GTK_TABLE(table),
-                txt_label = gtk_entry_new(),
-                1, 4, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 0);
-
-        gtk_table_attach(GTK_TABLE(table),
-                label = gtk_label_new(_("Category")),
-                0, 1, 3, 4, GTK_FILL, 0, 2, 0);
-        gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
-        gtk_table_attach(GTK_TABLE(table),
-                hbox = gtk_hbox_new(FALSE, 4),
-                1, 4, 3, 4, GTK_EXPAND | GTK_FILL, 0, 2, 0);
-        gtk_box_pack_start(GTK_BOX(hbox),
-                cmb_category = poi_create_cat_combo(),
-                FALSE, FALSE, 0);
-
-        gtk_box_pack_start(GTK_BOX(hbox),
-                btn_catedit = gtk_button_new_with_label(
-                    _("Edit Categories...")),
-                FALSE, FALSE, 0);
-
-        gtk_table_attach(GTK_TABLE(table),
-                label = gtk_label_new(_("Description")),
-                0, 1, 5, 6, GTK_FILL, GTK_FILL, 2, 0);
-        gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.0f);
-
-        txt_scroll = gtk_scrolled_window_new(NULL, NULL);
-        gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(txt_scroll),
-                GTK_SHADOW_IN);
-        gtk_table_attach(GTK_TABLE(table),
-                txt_scroll,
-                1, 4, 5, 6, GTK_EXPAND | GTK_FILL, 0, 2, 0);
-
-        gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(txt_scroll),
-                GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-
-        txt_desc = gtk_text_view_new ();
-        gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(txt_desc), GTK_WRAP_WORD);
-
-        gtk_container_add(GTK_CONTAINER(txt_scroll), txt_desc);
-        gtk_widget_set_size_request(GTK_WIDGET(txt_scroll), 550, 120);
-
-        desc_txt = gtk_text_view_get_buffer(GTK_TEXT_VIEW (txt_desc));
-
-        g_signal_connect(G_OBJECT(btn_catedit), "clicked",
-                G_CALLBACK(poi_edit_cat), &pcedit);
+                GTK_WINDOW(parent), GTK_DIALOG_MODAL,
+                GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
+                GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT,
+                NULL);
     }
-
-    poi.poi_id = -1;
-    poi.cat_id = -1;
-    poi.clabel = NULL;
-    poi.desc = g_strdup("");
-
-    /* Lat/Lon */
-    {
-        gchar tmp1[LL_FMT_LEN], tmp2[LL_FMT_LEN];
-
-        format_lat_lon(poi.lat, poi.lon, tmp1, tmp2);
-        //lat_format(poi.lat, tmp1);
-        //lon_format(poi.lon, tmp2);
-
-        gtk_entry_set_text(GTK_ENTRY(txt_lat), tmp1);
-        
-        if(txt_lon != NULL)
-        	gtk_entry_set_text(GTK_ENTRY(txt_lon), tmp2);
-    }
-
-    /* Label */
-    if(SQLITE_ROW == sqlite3_step(_stmt_nextlabel_poi))
-        poi.label = g_strdup_printf("Point%06d",
-                sqlite3_column_int(_stmt_nextlabel_poi, 0));
     else
-        poi.label = g_strdup("");
-    sqlite3_reset(_stmt_nextlabel_poi);
-    gtk_entry_set_text(GTK_ENTRY(txt_label), poi.label);
-
-    /* POI Desc. */
-    gtk_text_buffer_set_text(desc_txt, "", -1);
-
-    /* Category. */
     {
-        GtkTreeIter iter;
-        gint cat_id = -1;
-        gboolean had_cat_id = FALSE;
-
-        if(gtk_combo_box_get_active_iter(
-                GTK_COMBO_BOX(cmb_category), &iter))
-        {
-            gtk_tree_model_get(
-                    gtk_combo_box_get_model(GTK_COMBO_BOX(cmb_category)),&iter,
-                    0, &cat_id,
-                    -1);
-            had_cat_id = TRUE;
-        }
-        gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(
-                        GTK_COMBO_BOX(cmb_category))));
-        if(poi_populate_categories(GTK_LIST_STORE(gtk_combo_box_get_model(
-                    GTK_COMBO_BOX(cmb_category))), cat_id, &iter)
-                && had_cat_id)
-        {
-            gtk_combo_box_set_active_iter(GTK_COMBO_BOX(cmb_category), &iter);
-        }
-    }
-
-    pcedit.dialog = dialog;
-    pcedit.cmb_category = cmb_category;
-    pcedit.cat_id = poi.cat_id;
-
-    gtk_widget_show_all(dialog);
-
-    while(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog)))
-    {
-        GtkTreeIter iter;
-        const gchar *lat, *lon = NULL;
-
-        lat = gtk_entry_get_text(GTK_ENTRY(txt_lat));
-        
-        if(txt_lon != NULL)
-        	lon = gtk_entry_get_text(GTK_ENTRY(txt_lon));
-        
-        if(!parse_coords(lat, lon, &poi.lat, &poi.lon))
-        {
-        	popup_error(dialog, _("Invalid Coordinate specified"));
-        	continue;
-        }
-        
-        if(strlen(gtk_entry_get_text(GTK_ENTRY(txt_label))))
-        {
-            if(poi.label)
-                g_free(poi.label);
-            poi.label = g_strdup(gtk_entry_get_text(GTK_ENTRY(txt_label)));
-        }
-        else
-        {
-            popup_error(dialog, _("Please specify a name."));
-            continue;
-        }
-
-        if(!gtk_combo_box_get_active_iter(
-                GTK_COMBO_BOX(cmb_category), &iter))
-        {
-            popup_error(dialog, _("Please specify a category."));
-            continue;
-        }
-
-        gtk_text_buffer_get_iter_at_offset(desc_txt, &begin,0 );
-        gtk_text_buffer_get_end_iter (desc_txt, &end);
-        if(poi.desc)
-            g_free(poi.desc);
-        poi.desc = gtk_text_buffer_get_text(desc_txt, &begin, &end, TRUE);
-
-        if(poi.clabel)
-            g_free(poi.clabel);
-        gtk_tree_model_get(
-                gtk_combo_box_get_model(GTK_COMBO_BOX(cmb_category)), &iter,
-                0, &poi.cat_id,
-                1, &poi.clabel,
-                -1);
-
-        /* add poi */
-        if(SQLITE_OK != sqlite3_bind_double(_stmt_insert_poi, 1, poi.lat)
-        || SQLITE_OK != sqlite3_bind_double(_stmt_insert_poi, 2, poi.lon)
-        || SQLITE_OK != sqlite3_bind_text(_stmt_insert_poi, 3, poi.label,
-               -1, SQLITE_STATIC)
-        || SQLITE_OK != sqlite3_bind_text(_stmt_insert_poi, 4, poi.desc,
-               -1, SQLITE_STATIC)
-        || SQLITE_OK != sqlite3_bind_int(_stmt_insert_poi, 5, poi.cat_id)
-        || SQLITE_DONE != sqlite3_step(_stmt_insert_poi))
-        {
-            MACRO_BANNER_SHOW_INFO(parent, _("Error adding POI"));
-        }
-
-        sqlite3_reset(_stmt_insert_poi);
-
-        /* We're done. */
-        break;
-    }
-
-    g_free(poi.label);
-    g_free(poi.desc);
-    g_free(dpoi.txt_label);
-
-    map_force_redraw();
-
-    gtk_widget_hide(dialog);
-
-    _degformat = last_deg_format;
-    	
-    vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
-    return !dpoi.deleted;
-}
-
-gboolean
-poi_view_dialog(GtkWidget *parent, PoiInfo *poi)
-{
-    GtkTreeIter iter;
-    static GtkWidget *dialog;
-    static GtkWidget *table;
-    static GtkWidget *label;
-    static GtkWidget *txt_label;
-    static GtkWidget *txt_lat;
-    static GtkWidget *txt_lon;
-    static GtkWidget *cmb_category;
-    static GtkWidget *txt_desc;
-    static GtkWidget *btn_delete = NULL;
-    static GtkWidget *btn_catedit;
-    static GtkWidget *hbox;
-    static GtkWidget *txt_scroll;
-    static GtkTextBuffer *desc_txt;
-    static GtkTextIter begin, end;
-    static DeletePOI dpoi = {NULL, NULL, 0};
-    static PoiCategoryEditInfo pcedit;
-    static int last_deg_format = 0;
-    
-    printf("%s()\n", __PRETTY_FUNCTION__);
-    
-    gint fallback_deg_format = _degformat;
-    
-    if(!coord_system_check_lat_lon (poi->lat, poi->lon, &fallback_deg_format))
-    {
-    	last_deg_format = _degformat;
-    	_degformat = fallback_deg_format;
-    	
-    	if(dialog != NULL) gtk_widget_destroy(dialog);
-    	dialog = NULL;
-    }
-    else if(_degformat != last_deg_format)
-    {
-    	last_deg_format = _degformat;
-    	
-		if(dialog != NULL) gtk_widget_destroy(dialog);
-    	dialog = NULL;
-    }
-
-    if(dialog == NULL)
-    {
         dialog = gtk_dialog_new_with_buttons(_("Edit POI"),
-            GTK_WINDOW(parent), GTK_DIALOG_MODAL,
-            GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
-            NULL);
+                GTK_WINDOW(parent), GTK_DIALOG_MODAL,
+                GTK_STOCK_OK, GTK_RESPONSE_ACCEPT,
+                NULL);
 
         gtk_container_add(GTK_CONTAINER(GTK_DIALOG(dialog)->action_area),
                 btn_delete = gtk_button_new_with_label(_("Delete...")));
 
         gtk_dialog_add_button(GTK_DIALOG(dialog),
                 GTK_STOCK_CANCEL, GTK_RESPONSE_REJECT);
+    }
 
-        /* Set the lat/lon strings. */
-        gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
-                table = gtk_table_new(6, 4, FALSE), TRUE, TRUE, 0);
+    /* Set the lat/lon strings. */
+    gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox),
+            table = gtk_table_new(6, 4, FALSE), TRUE, TRUE, 0);
 
-        gtk_table_attach(GTK_TABLE(table),
-                label = gtk_label_new(DEG_FORMAT_ENUM_TEXT[_degformat].short_field_1),
-                0, 1, 0, 1, GTK_FILL, 0, 2, 0);
-        gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
-        gtk_table_attach(GTK_TABLE(table),
-                txt_lat = gtk_entry_new(),
-                1, 2, 0, 1, GTK_FILL, 0, 2, 0);
+    gtk_table_attach(GTK_TABLE(table),
+            label = gtk_label_new(DEG_FORMAT_ENUM_TEXT[_degformat]
+                .short_field_1),
+            0, 1, 0, 1, GTK_FILL, 0, 2, 0);
+    gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
+    gtk_table_attach(GTK_TABLE(table),
+            txt_lat = gtk_entry_new(),
+            1, (DEG_FORMAT_ENUM_TEXT[_degformat].field_2_in_use ? 2 : 4), 
+            0, 1, GTK_FILL, 0, 2, 0);
 
-        if(DEG_FORMAT_ENUM_TEXT[_degformat].field_2_in_use)
-        {
-	        gtk_table_attach(GTK_TABLE(table),
-	                label = gtk_label_new(DEG_FORMAT_ENUM_TEXT[_degformat].short_field_2),
-	                2, 3, 0, 1, GTK_FILL, 0, 2, 0);
-	        gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
-	        gtk_table_attach(GTK_TABLE(table),
-	                txt_lon = gtk_entry_new(),
-	                3, 4, 0, 1, GTK_FILL, 0, 2, 0);
-        }
-        
+    if(DEG_FORMAT_ENUM_TEXT[_degformat].field_2_in_use)
+    {
         gtk_table_attach(GTK_TABLE(table),
-                label = gtk_label_new(_("Label")),
-                0, 1, 1, 2, GTK_FILL, 0, 2, 0);
+                label = gtk_label_new(DEG_FORMAT_ENUM_TEXT[_degformat]
+                    .short_field_2),
+                2, 3, 0, 1, GTK_FILL, 0, 2, 0);
         gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
         gtk_table_attach(GTK_TABLE(table),
-                txt_label = gtk_entry_new(),
-                1, 4, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 0);
+                txt_lon = gtk_entry_new(),
+                3, 4, 0, 1, GTK_FILL, 0, 2, 0);
+    }
 
-        gtk_table_attach(GTK_TABLE(table),
-                label = gtk_label_new(_("Category")),
-                0, 1, 3, 4, GTK_FILL, 0, 2, 0);
-        gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
-        gtk_table_attach(GTK_TABLE(table),
-                hbox = gtk_hbox_new(FALSE, 4),
-                1, 4, 3, 4, GTK_EXPAND | GTK_FILL, 0, 2, 0);
-        gtk_box_pack_start(GTK_BOX(hbox),
-                cmb_category = poi_create_cat_combo(),
-                FALSE, FALSE, 0);
+    gtk_table_attach(GTK_TABLE(table),
+            label = gtk_label_new(_("Label")),
+            0, 1, 1, 2, GTK_FILL, 0, 2, 0);
+    gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
+    gtk_table_attach(GTK_TABLE(table),
+            txt_label = gtk_entry_new(),
+            1, 4, 1, 2, GTK_EXPAND | GTK_FILL, 0, 2, 0);
 
-        gtk_box_pack_start(GTK_BOX(hbox),
-                btn_catedit = gtk_button_new_with_label(
-                    _("Edit Categories...")),
-                FALSE, FALSE, 0);
+    gtk_table_attach(GTK_TABLE(table),
+            label = gtk_label_new(_("Category")),
+            0, 1, 3, 4, GTK_FILL, 0, 2, 0);
+    gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.5f);
+    gtk_table_attach(GTK_TABLE(table),
+            hbox = gtk_hbox_new(FALSE, 4),
+            1, 4, 3, 4, GTK_EXPAND | GTK_FILL, 0, 2, 0);
+    gtk_box_pack_start(GTK_BOX(hbox),
+            cmb_category = poi_create_cat_combo(),
+            FALSE, FALSE, 0);
 
-        gtk_table_attach(GTK_TABLE(table),
-                label = gtk_label_new(_("Description")),
-                0, 1, 5, 6, GTK_FILL, GTK_FILL, 2, 0);
-        gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.0f);
+    gtk_box_pack_start(GTK_BOX(hbox),
+            btn_catedit = gtk_button_new_with_label(
+                _("Edit Categories...")),
+            FALSE, FALSE, 0);
 
-        txt_scroll = gtk_scrolled_window_new(NULL, NULL);
-        gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(txt_scroll),
-                GTK_SHADOW_IN);
-        gtk_table_attach(GTK_TABLE(table),
-                txt_scroll,
-                1, 4, 5, 6, GTK_EXPAND | GTK_FILL, 0, 2, 0);
+    gtk_table_attach(GTK_TABLE(table),
+            label = gtk_label_new(_("Description")),
+            0, 1, 5, 6, GTK_FILL, GTK_FILL, 2, 0);
+    gtk_misc_set_alignment(GTK_MISC(label), 1.f, 0.0f);
 
-        gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(txt_scroll),
-                GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+    txt_scroll = gtk_scrolled_window_new(NULL, NULL);
+    gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(txt_scroll),
+            GTK_SHADOW_IN);
+    gtk_table_attach(GTK_TABLE(table),
+            txt_scroll,
+            1, 4, 5, 6, GTK_EXPAND | GTK_FILL, 0, 2, 0);
 
-        txt_desc = gtk_text_view_new ();
-        gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(txt_desc), GTK_WRAP_WORD);
+    gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(txt_scroll),
+            GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
 
-        gtk_container_add(GTK_CONTAINER(txt_scroll), txt_desc);
-        gtk_widget_set_size_request(GTK_WIDGET(txt_scroll), 550, 120);
+    txt_desc = gtk_text_view_new();
+    gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(txt_desc), GTK_WRAP_WORD);
 
-        desc_txt = gtk_text_view_get_buffer (GTK_TEXT_VIEW (txt_desc));
+    gtk_container_add(GTK_CONTAINER(txt_scroll), txt_desc);
+    gtk_widget_set_size_request(GTK_WIDGET(txt_scroll), 550, 120);
 
-        g_signal_connect(G_OBJECT(btn_delete), "clicked",
-                          G_CALLBACK(poi_delete), &dpoi);
+    desc_txt = gtk_text_view_get_buffer(GTK_TEXT_VIEW (txt_desc));
 
-        g_signal_connect(G_OBJECT(btn_catedit), "clicked",
-                G_CALLBACK(poi_edit_cat), &pcedit);
-    }
+    g_signal_connect(G_OBJECT(btn_catedit), "clicked",
+            G_CALLBACK(poi_edit_cat), &pcedit);
 
-    dpoi.dialog = dialog;
-    dpoi.txt_label = g_strdup(poi->label);
-    dpoi.id = poi->poi_id;
+    dpoi.txt_label = NULL;
     dpoi.deleted = FALSE;
-
-    /* Lat/Lon */
+    if (!is_add_dialog)
     {
-        gchar tmp1[LL_FMT_LEN], tmp2[LL_FMT_LEN];
+        dpoi.dialog = dialog;
+        dpoi.txt_label = g_strdup(poi->label);
+        dpoi.id = poi->poi_id;
 
-        format_lat_lon(poi->lat, poi->lon, tmp1, tmp2);
-        //lat_format(poi->lat, tmp1);
-        //lon_format(poi->lon, tmp2);
+        g_signal_connect(G_OBJECT(btn_delete), "clicked",
+                G_CALLBACK(poi_delete), &dpoi);
+    }
 
-        gtk_entry_set_text(GTK_ENTRY(txt_lat), tmp1);
+    /* Lat/Lon */
+    format_lat_lon(poi->lat, poi->lon, tmp1, tmp2);
+    //lat_format(poi->lat, tmp1);
+    //lon_format(poi->lon, tmp2);
+
+    gtk_entry_set_text(GTK_ENTRY(txt_lat), tmp1);
         
-        if(DEG_FORMAT_ENUM_TEXT[_degformat].field_2_in_use)
-        	gtk_entry_set_text(GTK_ENTRY(txt_lon), tmp2);
-        else
-        	gtk_entry_set_text(GTK_ENTRY(txt_lon), g_strdup(""));
-    }
+    if(DEG_FORMAT_ENUM_TEXT[_degformat].field_2_in_use)
+        gtk_entry_set_text(GTK_ENTRY(txt_lon), tmp2);
+    else
+        gtk_entry_set_text(GTK_ENTRY(txt_lon), "");
 
-    /* label */
+    /* Label */
     gtk_entry_set_text(GTK_ENTRY(txt_label), poi->label);
 
-    /* poi_desc */
+    /* Poi_desc */
     gtk_text_buffer_set_text(desc_txt, poi->desc, -1);
 
     /* Category. */
     gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(
                     GTK_COMBO_BOX(cmb_category))));
     if(poi_populate_categories(GTK_LIST_STORE(gtk_combo_box_get_model(
-                GTK_COMBO_BOX(cmb_category))), poi->cat_id, &iter))
+                        GTK_COMBO_BOX(cmb_category))), poi->cat_id, &iter))
         gtk_combo_box_set_active_iter(GTK_COMBO_BOX(cmb_category), &iter);
 
-    /* Connect Signals */
     pcedit.dialog = dialog;
     pcedit.cmb_category = cmb_category;
     pcedit.cat_id = poi->cat_id;
@@ -1592,22 +1322,22 @@
 
     while(GTK_RESPONSE_ACCEPT == gtk_dialog_run(GTK_DIALOG(dialog)))
     {
-        const gchar *text_lat, *text_lon;
+        GtkTreeIter iter;
+        const gchar *lat, *lon = NULL;
 
-        text_lat = gtk_entry_get_text(GTK_ENTRY(txt_lat));
-        text_lon = gtk_entry_get_text(GTK_ENTRY(txt_lon));
-        
-        if(!parse_coords(text_lat, text_lon, &poi->lat, &poi->lon))
+        lat = gtk_entry_get_text(GTK_ENTRY(txt_lat));
+        if(txt_lon != NULL)
+            lon = gtk_entry_get_text(GTK_ENTRY(txt_lon));
+
+        if(!parse_coords(lat, lon, &poi->lat, &poi->lon))
         {
-        	popup_error(dialog, _("Invalid coordinate specified"));
-        	continue;
+            popup_error(dialog, _("Invalid Coordinate specified"));
+            continue;
         }
-
         
         if(strlen(gtk_entry_get_text(GTK_ENTRY(txt_label))))
         {
-            if(poi->label)
-                g_free(poi->label);
+            g_free(poi->label);
             poi->label = g_strdup(gtk_entry_get_text(GTK_ENTRY(txt_label)));
         }
         else
@@ -1617,62 +1347,80 @@
         }
 
         if(!gtk_combo_box_get_active_iter(
-                GTK_COMBO_BOX(cmb_category), &iter))
+                    GTK_COMBO_BOX(cmb_category), &iter))
         {
             popup_error(dialog, _("Please specify a category."));
             continue;
         }
 
-        gtk_text_buffer_get_iter_at_offset(desc_txt, &begin,0 );
-        gtk_text_buffer_get_end_iter (desc_txt, &end);
-        if(poi->desc)
-            g_free(poi->desc);
+        gtk_text_buffer_get_iter_at_offset(desc_txt, &begin, 0);
+        gtk_text_buffer_get_end_iter(desc_txt, &end);
+        g_free(poi->desc);
         poi->desc = gtk_text_buffer_get_text(desc_txt, &begin, &end, TRUE);
 
-        if(poi->clabel)
-            g_free(poi->clabel);
+        g_free(poi->clabel);
         gtk_tree_model_get(
                 gtk_combo_box_get_model(GTK_COMBO_BOX(cmb_category)), &iter,
                 0, &poi->cat_id,
                 1, &poi->clabel,
                 -1);
 
-        /* edit poi */
-        if(SQLITE_OK != sqlite3_bind_double(
-                    _stmt_update_poi, 1, poi->lat) ||
-           SQLITE_OK != sqlite3_bind_double(
-               _stmt_update_poi, 2, poi->lon) ||
-           SQLITE_OK != sqlite3_bind_text(_stmt_update_poi, 3, poi->label,
-                    -1, SQLITE_STATIC) ||
-           SQLITE_OK != sqlite3_bind_text(_stmt_update_poi, 4, poi->desc,
-               -1, SQLITE_STATIC) ||
-           SQLITE_OK != sqlite3_bind_int(
-               _stmt_update_poi, 5, poi->cat_id) ||
-           SQLITE_OK != sqlite3_bind_int(
-               _stmt_update_poi, 6, poi->poi_id) ||
-           SQLITE_DONE != sqlite3_step(_stmt_update_poi))
+        if (is_add_dialog)
         {
-            MACRO_BANNER_SHOW_INFO(parent, _("Error updating POI"));
+            if(SQLITE_OK != sqlite3_bind_double(_stmt_insert_poi, 1, poi->lat)
+            || SQLITE_OK != sqlite3_bind_double(_stmt_insert_poi, 2, poi->lon)
+            || SQLITE_OK != sqlite3_bind_text(_stmt_insert_poi, 3, poi->label,
+                -1, SQLITE_STATIC)
+            || SQLITE_OK != sqlite3_bind_text(_stmt_insert_poi, 4, poi->desc,
+                -1, SQLITE_STATIC)
+            || SQLITE_OK != sqlite3_bind_int(_stmt_insert_poi, 5, poi->cat_id)
+            || SQLITE_DONE != sqlite3_step(_stmt_insert_poi))
+            {
+                MACRO_BANNER_SHOW_INFO(parent, _("Error adding POI"));
+            }
+            sqlite3_reset(_stmt_insert_poi);
         }
-
-        sqlite3_reset(_stmt_update_poi);
-
-        /* We're done. */
+        else
+        {
+            if(SQLITE_OK != sqlite3_bind_double(_stmt_update_poi, 1, poi->lat)
+            || SQLITE_OK != sqlite3_bind_double(_stmt_update_poi, 2, poi->lon)
+            || SQLITE_OK != sqlite3_bind_text(_stmt_update_poi, 3, poi->label,
+                -1, SQLITE_STATIC)
+            || SQLITE_OK != sqlite3_bind_text(_stmt_update_poi, 4, poi->desc,
+                -1, SQLITE_STATIC)
+            || SQLITE_OK != sqlite3_bind_int(_stmt_update_poi, 5, poi->cat_id)
+            || SQLITE_OK != sqlite3_bind_int(_stmt_update_poi, 6, poi->poi_id)
+            || SQLITE_DONE != sqlite3_step(_stmt_update_poi))
+            {
+                MACRO_BANNER_SHOW_INFO(parent, _("Error updating POI"));
+            }
+            sqlite3_reset(_stmt_update_poi);
+        }
         break;
     }
 
     g_free(dpoi.txt_label);
-
     map_force_redraw();
+    _degformat = last_deg_format;
 
-    gtk_widget_hide(dialog); /* Destroying causes a crash.... ??? */
+    gtk_widget_destroy(dialog);
 
-    _degformat = last_deg_format;
-    
     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
     return !dpoi.deleted;
 }
 
+gint
+poi_get_next_id()
+{
+    gint id;
+    if(SQLITE_ROW == sqlite3_step(_stmt_nextlabel_poi))
+        id = sqlite3_column_int(_stmt_nextlabel_poi, 0);
+    else
+        id = -1;
+    sqlite3_reset(_stmt_nextlabel_poi);
+    return id;
+}
+
 static gint
 poi_list_insert(GtkWidget *parent, GList *poi_list, GtkComboBox *cmb_category)
 {
@@ -2014,7 +1762,7 @@
                 POI_CLABEL, &(poi.clabel),
                 -1);
 
-        if(poi_view_dialog(pli->dialog, &poi))
+        if(poi_dialog(pli->dialog, &poi, FALSE))
         {
             gtk_list_store_set(store, &iter,
                     POI_POIID, poi.poi_id,
@@ -2031,6 +1779,9 @@
             /* POI was deleted. */
             gtk_list_store_remove(store, &iter);
         }
+        g_free(poi.label);
+        g_free(poi.desc);
+        g_free(poi.clabel);
     }
 
     vprintf("%s(): return TRUE\n", __PRETTY_FUNCTION__);
Index: src/poi.h
===================================================================
--- src/poi.h	(revision 6)
+++ src/poi.h	(revision 7)
@@ -32,12 +32,13 @@
 
 gboolean category_list_dialog(GtkWidget *parent);
 
-gboolean poi_add_dialog(GtkWidget *parent, gint unitx, gint unity);
-gboolean poi_view_dialog(GtkWidget *parent, PoiInfo *poi);
+gboolean poi_dialog(GtkWidget *parent, PoiInfo *poi, gboolean is_add_dialog);
 gboolean poi_import_dialog(gint unitx, gint unity);
 gboolean poi_download_dialog(gint unitx, gint unity);
 gboolean poi_browse_dialog(gint unitx, gint unity);
 
+gint poi_get_next_id();
+
 void map_render_poi(void);
 
 void poi_destroy(void);
