diff --git a/ospfd/ospf_abr.c b/ospfd/ospf_abr.c
index ec3b153..638cf1c 100644
--- a/ospfd/ospf_abr.c
+++ b/ospfd/ospf_abr.c
@@ -201,9 +201,9 @@
 {
   struct ospf_area *area;
   struct ospf_area_range *range;
-  int ret = OSPF_AREA_ID_FORMAT_DECIMAL;
+  int ret = OSPF_AREA_ID_FORMAT_ADDRESS;
 
-  area = ospf_area_get (area_id, ret);
+  area = ospf_area_get (ospf, area_id, ret);
   if (area == NULL)
     return 0;
 
@@ -214,13 +214,13 @@
 	   && !CHECK_FLAG (advertise, OSPF_AREA_RANGE_ADVERTISE))
 	  || (!CHECK_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE)
 	      && CHECK_FLAG (advertise, OSPF_AREA_RANGE_ADVERTISE)))
-	ospf_schedule_abr_task ();
+	ospf_schedule_abr_task (ospf);
     }
   else
     {
       range = ospf_area_range_new (p);
       ospf_area_range_add (area, range);
-      ospf_schedule_abr_task ();
+      ospf_schedule_abr_task (ospf);
     }
 
   if (CHECK_FLAG (advertise, OSPF_AREA_RANGE_ADVERTISE))
@@ -237,9 +237,9 @@
 {
   struct ospf_area *area;
   struct ospf_area_range *range;
-  int ret = OSPF_AREA_ID_FORMAT_DECIMAL;
+  int ret = OSPF_AREA_ID_FORMAT_ADDRESS;
 
-  area = ospf_area_get (area_id, ret);
+  area = ospf_area_get (ospf, area_id, ret);
   if (area == NULL)
     return 0;
 
@@ -251,7 +251,7 @@
     {
       range->cost_config = cost;
       if (ospf_area_range_active (range))
-	ospf_schedule_abr_task ();
+	ospf_schedule_abr_task (ospf);
     }
 
   return 1;
@@ -264,7 +264,7 @@
   struct ospf_area *area;
   struct ospf_area_range *range;
 
-  area = ospf_area_lookup_by_area_id (area_id);
+  area = ospf_area_lookup_by_area_id (ospf, area_id);
   if (area == NULL)
     return 0;
 
@@ -273,7 +273,7 @@
     return 0;
 
   if (ospf_area_range_active (range))
-    ospf_schedule_abr_task ();
+    ospf_schedule_abr_task (ospf);
 
   ospf_area_range_delete (area, range);
 
@@ -286,22 +286,22 @@
 {
   struct ospf_area *area;
   struct ospf_area_range *range;
-  int ret = OSPF_AREA_ID_FORMAT_DECIMAL;
+  int ret = OSPF_AREA_ID_FORMAT_ADDRESS;
 
-  area = ospf_area_get (area_id, ret);
+  area = ospf_area_get (ospf, area_id, ret);
   range = ospf_area_range_lookup (area, p);
 
   if (range != NULL)
     {
       if (!CHECK_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE) ||
 	  !CHECK_FLAG (range->flags, OSPF_AREA_RANGE_SUBSTITUTE))
-	ospf_schedule_abr_task ();
+	ospf_schedule_abr_task (ospf);
     }
   else
     {
       range = ospf_area_range_new (p);
       ospf_area_range_add (area, range);
-      ospf_schedule_abr_task ();
+      ospf_schedule_abr_task (ospf);
     }
 
   SET_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE);
@@ -319,7 +319,7 @@
   struct ospf_area *area;
   struct ospf_area_range *range;
 
-  area = ospf_area_lookup_by_area_id (area_id);
+  area = ospf_area_lookup_by_area_id (ospf, area_id);
   if (area == NULL)
     return 0;
 
@@ -329,7 +329,7 @@
 
   if (CHECK_FLAG (range->flags, OSPF_AREA_RANGE_SUBSTITUTE))
     if (ospf_area_range_active (range))
-      ospf_schedule_abr_task ();
+      ospf_schedule_abr_task (ospf);
 
   UNSET_FLAG (range->flags, OSPF_AREA_RANGE_SUBSTITUTE);
   range->subst_addr.s_addr = 0;
@@ -339,17 +339,17 @@
 }
 
 int
-ospf_act_bb_connection ()
+ospf_act_bb_connection (struct ospf *ospf)
 {
-  if (ospf_top->backbone == NULL)
+  if (ospf->backbone == NULL)
     return 0;
 
-  return ospf_top->backbone->full_nbrs;
+  return ospf->backbone->full_nbrs;
 }
 
 /* Check area border router status. */
 void
-ospf_check_abr_status ()
+ospf_check_abr_status (struct ospf *ospf)
 {
   struct ospf_area *area;
   listnode node;
@@ -357,13 +357,12 @@
   int bb_act_attached = 0;
   int areas_configured = 0;
   int areas_act_attached = 0;
-
-  u_char new_flags = ospf_top->flags;
+  u_char new_flags = ospf->flags;
 
   if (IS_DEBUG_OSPF_EVENT)
     zlog_info ("ospf_check_abr_status(): Start");
 
-  for (node = listhead (ospf_top->areas); node; nextnode (node))
+  for (node = listhead (ospf->areas); node; nextnode (node))
     {
       area = getdata (node);
 
@@ -396,7 +395,7 @@
 		 areas_act_attached);
     }
 
-  switch (ospf_top->abr_type)
+  switch (ospf->abr_type)
     {
     case OSPF_ABR_SHORTCUT:
     case OSPF_ABR_STAND:
@@ -423,13 +422,13 @@
       break;
     }
 
-  if (new_flags != ospf_top->flags)
+  if (new_flags != ospf->flags)
     {
-      ospf_spf_calculate_schedule ();
+      ospf_spf_calculate_schedule (ospf);
       if (IS_DEBUG_OSPF_EVENT)
 	zlog_info ("ospf_check_abr_status(): new router flags: %x",new_flags);
-      ospf_top->flags = new_flags;
-      OSPF_TIMER_ON (ospf_top->t_router_lsa_update,
+      ospf->flags = new_flags;
+      OSPF_TIMER_ON (ospf->t_router_lsa_update,
 		     ospf_router_lsa_update_timer, OSPF_LSA_UPDATE_DELAY);
     }
 }
@@ -490,7 +489,7 @@
 
 /* ospf_abr_translate_nssa */
 int
-ospf_abr_translate_nssa (struct ospf_lsa *lsa, void *p_arg, int int_arg)
+ospf_abr_translate_nssa (struct ospf_area *area, struct ospf_lsa *lsa)
 {
   /* Incoming Type-7 or later aggregated Type-7 
 
@@ -531,9 +530,9 @@
 
   ospf_lsa_checksum (dup->data);
 
-  ospf_lsa_install (NULL, dup); /* Install this Type-5 into LSDB, Lock = 2. */
+  ospf_lsa_install (area->ospf, NULL, dup);  /* Install this Type-5 into LSDB, Lock = 2. */
 
-  ospf_flood_through_as (NULL, dup); /* flood non-NSSA/STUB areas */
+  ospf_flood_through_as (area->ospf, NULL, dup); /* flood non-NSSA/STUB areas */
   
   /* This translated Type-5 will go to all non-NSSA areas connected to
      this ABR; The Type-5 could come from any of the NSSA's connected
@@ -560,8 +559,8 @@
   if (IS_DEBUG_OSPF_EVENT)
     zlog_info ("ospf_abr_announce_network_to_area(): Start");
 
-  old = OSPF_SUMMARY_LSA_SELF_FIND_BY_PREFIX (area, p);
-
+  old = ospf_lsa_lookup_by_prefix (area->lsdb, OSPF_SUMMARY_LSA, p,
+				   area->ospf->router_id);
   if (old)
     {
       if (IS_DEBUG_OSPF_EVENT)
@@ -590,7 +589,7 @@
 	{
 
 	  set_metric (old, cost);
-	  lsa = ospf_summary_lsa_refresh (old);
+	  lsa = ospf_summary_lsa_refresh (area->ospf, old);
 	  /* This will flood through area. */
 	}
       else
@@ -682,21 +681,22 @@
 }
 
 void
-ospf_abr_announce_network (struct route_node *n, struct ospf_route *or)
+ospf_abr_announce_network (struct ospf *ospf,
+			   struct route_node *n, struct ospf_route *or)
 {
-  listnode node;
   struct ospf_area_range *range;
-  struct prefix_ipv4 *p;
   struct ospf_area *area, *or_area;
+  struct prefix_ipv4 *p;
+  listnode node;
 
   if (IS_DEBUG_OSPF_EVENT)
     zlog_info ("ospf_abr_announce_network(): Start");
   p = (struct prefix_ipv4 *) &n->p;
 
-  or_area = ospf_area_lookup_by_area_id (or->u.std.area_id); 
+  or_area = ospf_area_lookup_by_area_id (ospf, or->u.std.area_id); 
   assert (or_area);
 
-  for (node = listhead (ospf_top->areas); node; nextnode (node))
+  for (node = listhead (ospf->areas); node; nextnode (node))
     {
       area = getdata (node);
 
@@ -764,9 +764,12 @@
 }
 
 int
-ospf_abr_should_announce (struct prefix *p, struct ospf_route *or)
+ospf_abr_should_announce (struct ospf *ospf,
+			  struct prefix *p, struct ospf_route *or)
 {
-  struct ospf_area *area = ospf_area_lookup_by_area_id (or->u.std.area_id);
+  struct ospf_area *area;
+
+  area = ospf_area_lookup_by_area_id (ospf, or->u.std.area_id);
 
   assert (area);
   
@@ -785,7 +788,7 @@
 
 #ifdef HAVE_NSSA
 void
-ospf_abr_process_nssa_translates ()
+ospf_abr_process_nssa_translates (struct ospf *ospf)
 {
   /* Scan through all NSSA_LSDB records for all areas;
 
@@ -795,11 +798,13 @@
      remaining UNAPPROVED Type-5's (Aggregate is for future ) */
   listnode node;
   struct ospf_area *area;
+  struct route_node *rn;
+  struct ospf_lsa *lsa;
 
   if (IS_DEBUG_OSPF_NSSA)
     zlog_info ("ospf_abr_process_nssa_translates(): Start");
 
-  for (node = listhead (ospf_top->areas); node; nextnode (node))
+  for (node = listhead (ospf->areas); node; nextnode (node))
     {
       area = getdata (node);
 
@@ -813,7 +818,8 @@
 	zlog_info ("ospf_abr_process_nssa_translates(): "
 		   "looking at area %s", inet_ntoa (area->area_id));
       
-      foreach_lsa (NSSA_LSDB (area), area, 0, ospf_abr_translate_nssa);
+      LSDB_LOOP (NSSA_LSDB (area), rn, lsa)
+	ospf_abr_translate_nssa (area, lsa);
     }
  
   if (IS_DEBUG_OSPF_NSSA)
@@ -823,11 +829,12 @@
 #endif /* HAVE_NSSA */
 
 void
-ospf_abr_process_network_rt (struct route_table *rt)
+ospf_abr_process_network_rt (struct ospf *ospf,
+			     struct route_table *rt)
 {
-  struct route_node *rn;
-  struct ospf_route *or;
   struct ospf_area *area;
+  struct ospf_route *or;
+  struct route_node *rn;
 
   if (IS_DEBUG_OSPF_EVENT)
     zlog_info ("ospf_abr_process_network_rt(): Start");
@@ -837,7 +844,7 @@
       if ((or = rn->info) == NULL)
 	continue;
 
-      if (!(area = ospf_area_lookup_by_area_id (or->u.std.area_id)))
+      if (!(area = ospf_area_lookup_by_area_id (ospf, or->u.std.area_id)))
 	{
 	  if (IS_DEBUG_OSPF_EVENT)
 	    zlog_info ("ospf_abr_process_network_rt(): area %s no longer exists",
@@ -873,7 +880,7 @@
 	}
 
       if (or->path_type == OSPF_PATH_INTRA_AREA &&
-	  !ospf_abr_should_announce (&rn->p, or))
+	  !ospf_abr_should_announce (ospf, &rn->p, or))
 	{
 	  if (IS_DEBUG_OSPF_EVENT)
 	    zlog_info("ospf_abr_process_network_rt(): denied by export-list");
@@ -898,10 +905,10 @@
 	}
 
 
-      if ((ospf_top->abr_type == OSPF_ABR_CISCO) ||
-          (ospf_top->abr_type == OSPF_ABR_IBM))
+      if ((ospf->abr_type == OSPF_ABR_CISCO) ||
+          (ospf->abr_type == OSPF_ABR_IBM))
 
-          if (!ospf_act_bb_connection () &&
+          if (!ospf_act_bb_connection (ospf) &&
               or->path_type != OSPF_PATH_INTRA_AREA)
 	     {
 	       if (IS_DEBUG_OSPF_EVENT)
@@ -912,7 +919,7 @@
 
       if (IS_DEBUG_OSPF_EVENT)
 	zlog_info ("ospf_abr_process_network_rt(): announcing");
-      ospf_abr_announce_network (rn, or);
+      ospf_abr_announce_network (ospf, rn, or);
     }
 
   if (IS_DEBUG_OSPF_EVENT)
@@ -929,9 +936,8 @@
   if (IS_DEBUG_OSPF_EVENT)
     zlog_info ("ospf_abr_announce_rtr_to_area(): Start");
 
-  old = OSPF_SUMMARY_ASBR_LSA_SELF_FIND_BY_PREFIX (area, p);
-  /* old = ospf_find_self_summary_asbr_lsa_by_prefix (area, p); */
-
+  old = ospf_lsa_lookup_by_prefix (area->lsdb, OSPF_ASBR_SUMMARY_LSA,
+				   p, area->ospf->router_id);
   if (old)
     {
       if (IS_DEBUG_OSPF_EVENT)
@@ -958,7 +964,7 @@
       if (old) 
 	{ 
 	  set_metric (old, cost);
-	  lsa = ospf_summary_asbr_lsa_refresh (old);
+	  lsa = ospf_summary_asbr_lsa_refresh (area->ospf, old);
 	}
       else
 	lsa = ospf_summary_asbr_lsa_originate (p, cost, area);
@@ -980,7 +986,8 @@
 
 
 void
-ospf_abr_announce_rtr (struct prefix_ipv4 *p, struct ospf_route *or)
+ospf_abr_announce_rtr (struct ospf *ospf,
+		       struct prefix_ipv4 *p, struct ospf_route *or)
 {
   listnode node;
   struct ospf_area *area;
@@ -988,7 +995,7 @@
   if (IS_DEBUG_OSPF_EVENT)
     zlog_info ("ospf_abr_announce_rtr(): Start");
 
-  for (node = listhead (ospf_top->areas); node; nextnode (node))
+  for (node = listhead (ospf->areas); node; nextnode (node))
     {
       area = getdata (node);
 
@@ -1034,10 +1041,10 @@
 }
 
 void
-ospf_abr_process_router_rt (struct route_table *rt)
+ospf_abr_process_router_rt (struct ospf *ospf, struct route_table *rt)
 {
-  struct route_node *rn;
   struct ospf_route *or;
+  struct route_node *rn;
   struct list *l;
 
   if (IS_DEBUG_OSPF_EVENT)
@@ -1064,7 +1071,7 @@
 	  if (or == NULL)
 	    continue;
 
-	  if (!ospf_area_lookup_by_area_id (or->u.std.area_id))
+	  if (!ospf_area_lookup_by_area_id (ospf, or->u.std.area_id))
 	    {
 	      if (IS_DEBUG_OSPF_EVENT)
 		zlog_info ("ospf_abr_process_router_rt(): area %s no longer exists",
@@ -1083,7 +1090,8 @@
 
 	  if (!flag)
 	    {
-	      best = ospf_find_asbr_route (rt, (struct prefix_ipv4 *) &rn->p);
+	      best = ospf_find_asbr_route (ospf, rt,
+					   (struct prefix_ipv4 *) &rn->p);
 	      flag = 1;
 	    }
 	  
@@ -1115,10 +1123,10 @@
 	    continue;
 	  }
 
-        if (ospf_top->abr_type == OSPF_ABR_CISCO ||
-            ospf_top->abr_type == OSPF_ABR_IBM)
-	  if (!ospf_act_bb_connection () &&
-	      or->path_type != OSPF_PATH_INTRA_AREA)
+        if (ospf->abr_type == OSPF_ABR_CISCO
+	    || ospf->abr_type == OSPF_ABR_IBM)
+	  if (!ospf_act_bb_connection (ospf)
+	      && or->path_type != OSPF_PATH_INTRA_AREA)
 	    {
 	      if (IS_DEBUG_OSPF_EVENT)
 		zlog_info("ospf_abr_process_network_rt(): ALT ABR: "
@@ -1126,7 +1134,7 @@
 	      continue;
 	    }
 
-        ospf_abr_announce_rtr ((struct prefix_ipv4 *) &rn->p, or);
+        ospf_abr_announce_rtr (ospf, (struct prefix_ipv4 *) &rn->p, or);
 
 	}
 
@@ -1137,62 +1145,48 @@
 }
 
 #ifdef HAVE_NSSA
-int
-ospf_abr_unapprove_translates_apply (struct ospf_lsa *lsa, void *p_arg,
-				    int int_arg)
-{
-  /* Could be a mix of Normal Type-5's, self-originated, or Type-7s
-      that are Locally ABR Translated */
-
-  if (CHECK_FLAG (lsa->flags, OSPF_LSA_LOCAL_XLT))
-    UNSET_FLAG (lsa->flags, OSPF_LSA_APPROVED);
-  
-  return 0;
-}
-
 void
-ospf_abr_unapprove_translates () /* For NSSA Translations */
+ospf_abr_unapprove_translates (struct ospf *ospf) /* For NSSA Translations */
 {
+  struct ospf_lsa *lsa;
+  struct route_node *rn;
+
   if (IS_DEBUG_OSPF_NSSA)
     zlog_info ("ospf_abr_unapprove_translates(): Start");
 
   /* NSSA Translator is not checked, because it may have gone away,
     and we would want to flush any residuals anyway */
 
-  foreach_lsa (EXTERNAL_LSDB (ospf_top), NULL, 0,
-	       ospf_abr_unapprove_translates_apply);
+  LSDB_LOOP (EXTERNAL_LSDB (ospf), rn, lsa)
+    if (CHECK_FLAG (lsa->flags, OSPF_LSA_LOCAL_XLT))
+      UNSET_FLAG (lsa->flags, OSPF_LSA_APPROVED);
 
   if (IS_DEBUG_OSPF_NSSA)
     zlog_info ("ospf_abr_unapprove_translates(): Stop");
 }
 #endif /* HAVE_NSSA */
 
-int
-ospf_abr_unapprove_summaries_apply (struct ospf_lsa *lsa, void *p_arg,
-				    int int_arg)
-{
-  if (ospf_lsa_is_self_originated (lsa))
-    UNSET_FLAG (lsa->flags, OSPF_LSA_APPROVED);
-
-  return 0;
-}
-
 void
-ospf_abr_unapprove_summaries ()
+ospf_abr_unapprove_summaries (struct ospf *ospf)
 {
   listnode node;
   struct ospf_area *area;
+  struct route_node *rn;
+  struct ospf_lsa *lsa;
 
   if (IS_DEBUG_OSPF_EVENT)
     zlog_info ("ospf_abr_unapprove_summaries(): Start");
 
-  for (node = listhead (ospf_top->areas); node; nextnode (node))
+  for (node = listhead (ospf->areas); node; nextnode (node))
     {
       area = getdata (node);
-      foreach_lsa (SUMMARY_LSDB (area), NULL, 0,
-		   ospf_abr_unapprove_summaries_apply);
-      foreach_lsa (ASBR_SUMMARY_LSDB (area), NULL, 0,
-		   ospf_abr_unapprove_summaries_apply);
+      LSDB_LOOP (SUMMARY_LSDB (area), rn, lsa)
+	if (ospf_lsa_is_self_originated (ospf, lsa))
+	  UNSET_FLAG (lsa->flags, OSPF_LSA_APPROVED);
+
+      LSDB_LOOP (ASBR_SUMMARY_LSDB (area), rn, lsa)
+	if (ospf_lsa_is_self_originated (ospf, lsa))
+	  UNSET_FLAG (lsa->flags, OSPF_LSA_APPROVED);
     }
 
   if (IS_DEBUG_OSPF_EVENT)
@@ -1200,7 +1194,7 @@
 }
 
 void
-ospf_abr_prepare_aggregates ()
+ospf_abr_prepare_aggregates (struct ospf *ospf)
 {
   listnode node;
   struct route_node *rn;
@@ -1209,7 +1203,7 @@
   if (IS_DEBUG_OSPF_EVENT)
     zlog_info ("ospf_abr_prepare_aggregates(): Start");
 
-  for (node = listhead (ospf_top->areas); node; nextnode (node))
+  for (node = listhead (ospf->areas); node; nextnode (node))
     {
       struct ospf_area *area = getdata (node);
 
@@ -1226,7 +1220,7 @@
 }
 
 void
-ospf_abr_announce_aggregates ()
+ospf_abr_announce_aggregates (struct ospf *ospf)
 {
   struct ospf_area *area, *ar;
   struct ospf_area_range *range;
@@ -1237,7 +1231,7 @@
   if (IS_DEBUG_OSPF_EVENT)
     zlog_info ("ospf_abr_announce_aggregates(): Start");
 
-  for (node = listhead (ospf_top->areas); node; nextnode (node))
+  for (node = listhead (ospf->areas); node; nextnode (node))
     {
       area = getdata (node);
 
@@ -1277,7 +1271,7 @@
 		if (IS_DEBUG_OSPF_EVENT)
 		  zlog_info ("ospf_abr_announce_aggregates(): active range");
 
-		for (n = listhead (ospf_top->areas); n; nextnode (n))
+		for (n = listhead (ospf->areas); n; nextnode (n))
 		  {
 		    ar = getdata (n);
 		    if (ar == area)
@@ -1311,7 +1305,7 @@
 
 #ifdef HAVE_NSSA
 void
-ospf_abr_send_nssa_aggregates () /* temporarily turned off */
+ospf_abr_send_nssa_aggregates (struct ospf *ospf) /* temporarily turned off */
 {
   listnode node; /*, n; */
   struct ospf_area *area; /*, *ar; */
@@ -1322,7 +1316,7 @@
   if (IS_DEBUG_OSPF_NSSA)
     zlog_info ("ospf_abr_send_nssa_aggregates(): Start");
 
-  for (node = listhead (ospf_top->areas); node; nextnode (node))
+  for (node = listhead (ospf->areas); node; nextnode (node))
     {
       area = getdata (node);
 
@@ -1381,13 +1375,13 @@
 }
 
 void
-ospf_abr_announce_nssa_defaults () /* By ABR-Translator */
+ospf_abr_announce_nssa_defaults (struct ospf *ospf) /* By ABR-Translator */
 {
   listnode node;
   struct ospf_area *area;
   struct prefix_ipv4 p;
 
-  if (! OSPF_IS_ABR)
+  if (! IS_OSPF_ABR (ospf))
     return;
 
   if (IS_DEBUG_OSPF_NSSA)
@@ -1397,7 +1391,7 @@
   p.prefix.s_addr = OSPF_DEFAULT_DESTINATION;
   p.prefixlen = 0;
 
-  for (node = listhead (ospf_top->areas); node; nextnode (node))
+  for (node = listhead (ospf->areas); node; nextnode (node))
     {
       area = getdata (node);
       if (IS_DEBUG_OSPF_NSSA)
@@ -1423,13 +1417,13 @@
 #endif /* HAVE_NSSA */
 
 void
-ospf_abr_announce_stub_defaults ()
+ospf_abr_announce_stub_defaults (struct ospf *ospf)
 {
   listnode node;
   struct ospf_area *area;
   struct prefix_ipv4 p;
 
-  if (! OSPF_IS_ABR)
+  if (! IS_OSPF_ABR (ospf))
     return;
 
   if (IS_DEBUG_OSPF_EVENT)
@@ -1439,7 +1433,7 @@
   p.prefix.s_addr = OSPF_DEFAULT_DESTINATION;
   p.prefixlen = 0;
 
-  for (node = listhead (ospf_top->areas); node; nextnode (node))
+  for (node = listhead (ospf->areas); node; nextnode (node))
     {
       area = getdata (node);
       if (IS_DEBUG_OSPF_EVENT)
@@ -1468,8 +1462,8 @@
 
 #ifdef HAVE_NSSA
 int
-ospf_abr_remove_unapproved_translates_apply (struct ospf_lsa *lsa, void *p_arg,
-					     int int_arg)
+ospf_abr_remove_unapproved_translates_apply (struct ospf *ospf,
+					     struct ospf_lsa *lsa)
 {
   if (CHECK_FLAG (lsa->flags, OSPF_LSA_LOCAL_XLT)
       && ! CHECK_FLAG (lsa->flags, OSPF_LSA_APPROVED))
@@ -1479,7 +1473,7 @@
 		 inet_ntoa (lsa->data->id));
 
       /* FLUSH THROUGHOUT AS */
-      ospf_lsa_flush_as (lsa);
+      ospf_lsa_flush_as (ospf, lsa);
 
       /* DISCARD from LSDB  */
     }
@@ -1487,51 +1481,36 @@
 }
 
 void
-ospf_abr_remove_unapproved_translates () /* For NSSA Translations */
+ospf_abr_remove_unapproved_translates (struct ospf *ospf)
 {
+  struct route_node *rn;
+  struct ospf_lsa *lsa;
+
   /* All AREA PROCESS should have APPROVED necessary LSAs */
   /* Remove any left over and not APPROVED */
   if (IS_DEBUG_OSPF_NSSA)
     zlog_info ("ospf_abr_remove_unapproved_translates(): Start");
 
-  foreach_lsa (EXTERNAL_LSDB (ospf_top), NULL, 0,
-	       ospf_abr_remove_unapproved_translates_apply);
+  LSDB_LOOP (EXTERNAL_LSDB (ospf), rn, lsa)
+    ospf_abr_remove_unapproved_translates_apply (ospf, lsa);
  
   if (IS_DEBUG_OSPF_NSSA)
     zlog_info ("ospf_abr_remove_unapproved_translates(): Stop");
 }
 #endif /* HAVE_NSSA */
 
-int
-ospf_abr_remove_unapproved_summaries_apply (struct ospf_lsa *lsa, void *p_arg,
-					    int int_arg)
-{
-  struct ospf_area *area;
-
-  area = (struct ospf_area *) p_arg;
-
-  if (ospf_lsa_is_self_originated (lsa) &&
-      !CHECK_FLAG (lsa->flags, OSPF_LSA_APPROVED))
-    {
-      if (IS_DEBUG_OSPF_EVENT)
-	zlog_info ("ospf_abr_remove_unapproved_summaries(): "
-		   "removing unapproved summary, ID: %s",
-		   inet_ntoa (lsa->data->id));
-      ospf_lsa_flush_area (lsa, area);
-    }
-  return 0;
-}
-
 void
-ospf_abr_remove_unapproved_summaries ()
+ospf_abr_remove_unapproved_summaries (struct ospf *ospf)
 {
   listnode node;
   struct ospf_area *area;
+  struct route_node *rn;
+  struct ospf_lsa *lsa;
 
   if (IS_DEBUG_OSPF_EVENT)
     zlog_info ("ospf_abr_remove_unapproved_summaries(): Start");
 
-  for (node = listhead (ospf_top->areas); node; nextnode (node))
+  for (node = listhead (ospf->areas); node; nextnode (node))
     {
       area = getdata (node);
 
@@ -1539,10 +1518,15 @@
 	zlog_info ("ospf_abr_remove_unapproved_summaries(): "
 		   "looking at area %s", inet_ntoa (area->area_id));
 
-      foreach_lsa (SUMMARY_LSDB (area), area, 0,
-		   ospf_abr_remove_unapproved_summaries_apply);
-      foreach_lsa (ASBR_SUMMARY_LSDB (area), area, 0,
-		   ospf_abr_remove_unapproved_summaries_apply);
+      LSDB_LOOP (SUMMARY_LSDB (area), rn, lsa)
+	if (ospf_lsa_is_self_originated (ospf, lsa))
+	  if (!CHECK_FLAG (lsa->flags, OSPF_LSA_APPROVED))
+	    ospf_lsa_flush_area (lsa, area);
+
+      LSDB_LOOP (ASBR_SUMMARY_LSDB (area), rn, lsa)
+	if (ospf_lsa_is_self_originated (ospf, lsa))
+	  if (!CHECK_FLAG (lsa->flags, OSPF_LSA_APPROVED))
+	    ospf_lsa_flush_area (lsa, area);
     }
  
   if (IS_DEBUG_OSPF_EVENT)
@@ -1550,21 +1534,21 @@
 }
 
 void
-ospf_abr_manage_discard_routes ()
+ospf_abr_manage_discard_routes (struct ospf *ospf)
 {
   listnode node;
   struct route_node *rn;
   struct ospf_area *area;
   struct ospf_area_range *range;
 
-  for (node = listhead (ospf_top->areas); node; nextnode (node))
+  for (node = listhead (ospf->areas); node; nextnode (node))
     if ((area = node->data) != NULL)
       for (rn = route_top (area->ranges); rn; rn = route_next (rn))
 	if ((range = rn->info) != NULL)
 	  if (CHECK_FLAG (range->flags, OSPF_AREA_RANGE_ADVERTISE))
 	    {
 	      if (range->specifics)
-		ospf_add_discard_route (ospf_top->new_table, area,
+		ospf_add_discard_route (ospf->new_table, area,
 					(struct prefix_ipv4 *) &rn->p);
 	      else
 		ospf_delete_discard_route ((struct prefix_ipv4 *) &rn->p);
@@ -1598,15 +1582,15 @@
    any ABR-non-NSSA areas use the Type-5 GLOBAL-LSDB. */
 
 void
-ospf_abr_nssa_task () /* called only if any_nssa */
+ospf_abr_nssa_task (struct ospf *ospf) /* called only if any_nssa */
 {
   if (IS_DEBUG_OSPF_NSSA)
     zlog_info ("Check for NSSA-ABR Tasks():");
 
-  if (! OSPF_IS_ABR)
+  if (! IS_OSPF_ABR (ospf))
     return;
 
-  if (! ospf_top->anyNSSA)
+  if (! ospf->anyNSSA)
     return;
 
   /* Each area must confirm TranslatorRole */
@@ -1617,7 +1601,7 @@
   if (IS_DEBUG_OSPF_NSSA)
     zlog_info ("ospf_abr_nssa_task(): unapprove translates");
 
-  ospf_abr_unapprove_translates ();
+  ospf_abr_unapprove_translates (ospf);
 
   /* RESET all Ranges in every Area, same as summaries */
   if (IS_DEBUG_OSPF_NSSA)
@@ -1631,7 +1615,7 @@
   if (IS_DEBUG_OSPF_NSSA)
     zlog_info ("ospf_abr_nssa_task(): process translates");
 
-  ospf_abr_process_nssa_translates (ospf_top->new_table);
+  ospf_abr_process_nssa_translates (ospf);
 
   /* Translate/Send any "ranged" aggregates, and also 5-Install and
      Approve */
@@ -1644,14 +1628,14 @@
   /* Send any NSSA defaults as Type-5 */
   if (IS_DEBUG_OSPF_NSSA)
     zlog_info ("ospf_abr_nssa_task(): announce nssa defaults");
-  ospf_abr_announce_nssa_defaults ();
+  ospf_abr_announce_nssa_defaults (ospf);
    
   /* Flush any unapproved previous translates from Global Data Base */
   if (IS_DEBUG_OSPF_NSSA)
     zlog_info ("ospf_abr_nssa_task(): remove unapproved translates");
-  ospf_abr_remove_unapproved_translates ();
+  ospf_abr_remove_unapproved_translates (ospf);
 
-  ospf_abr_manage_discard_routes (); /* same as normal...discard */
+  ospf_abr_manage_discard_routes (ospf); /* same as normal...discard */
 
   if (IS_DEBUG_OSPF_NSSA)
     zlog_info ("ospf_abr_nssa_task(): Stop");
@@ -1661,12 +1645,12 @@
 /* This is the function taking care about ABR stuff, i.e.
    summary-LSA origination and flooding. */
 void
-ospf_abr_task ()
+ospf_abr_task (struct ospf *ospf)
 {
   if (IS_DEBUG_OSPF_EVENT)
     zlog_info ("ospf_abr_task(): Start");
 
-  if (ospf_top->new_table == NULL || ospf_top->new_rtrs == NULL)
+  if (ospf->new_table == NULL || ospf->new_rtrs == NULL)
     {
       if (IS_DEBUG_OSPF_EVENT)
 	zlog_info ("ospf_abr_task(): Routing tables are not yet ready");
@@ -1675,39 +1659,39 @@
 
   if (IS_DEBUG_OSPF_EVENT)
     zlog_info ("ospf_abr_task(): unapprove summaries");
-  ospf_abr_unapprove_summaries ();
+  ospf_abr_unapprove_summaries (ospf);
 
   if (IS_DEBUG_OSPF_EVENT)
     zlog_info ("ospf_abr_task(): prepare aggregates");
-  ospf_abr_prepare_aggregates ();
+  ospf_abr_prepare_aggregates (ospf);
 
-  if (OSPF_IS_ABR)
+  if (IS_OSPF_ABR (ospf))
     {
       if (IS_DEBUG_OSPF_EVENT)
 	zlog_info ("ospf_abr_task(): process network RT");
-      ospf_abr_process_network_rt (ospf_top->new_table);
+      ospf_abr_process_network_rt (ospf, ospf->new_table);
 
       if (IS_DEBUG_OSPF_EVENT)
 	zlog_info ("ospf_abr_task(): process router RT");
-      ospf_abr_process_router_rt (ospf_top->new_rtrs);
+      ospf_abr_process_router_rt (ospf, ospf->new_rtrs);
 
       if (IS_DEBUG_OSPF_EVENT)
 	zlog_info ("ospf_abr_task(): announce aggregates");
-      ospf_abr_announce_aggregates ();
+      ospf_abr_announce_aggregates (ospf);
 
       if (IS_DEBUG_OSPF_EVENT)
 	zlog_info ("ospf_abr_task(): announce stub defaults");
-      ospf_abr_announce_stub_defaults ();
+      ospf_abr_announce_stub_defaults (ospf);
     }
 
   if (IS_DEBUG_OSPF_EVENT)
     zlog_info ("ospf_abr_task(): remove unapproved summaries");
-  ospf_abr_remove_unapproved_summaries ();
+  ospf_abr_remove_unapproved_summaries (ospf);
 
-  ospf_abr_manage_discard_routes ();
+  ospf_abr_manage_discard_routes (ospf);
 
 #ifdef HAVE_NSSA
-  ospf_abr_nssa_task(); /* if nssa-abr, then scan Type-7 LSDB */
+  ospf_abr_nssa_task (ospf); /* if nssa-abr, then scan Type-7 LSDB */
 #endif /* HAVE_NSSA */
 
   if (IS_DEBUG_OSPF_EVENT)
@@ -1716,26 +1700,29 @@
 
 
 int
-ospf_abr_task_timer (struct thread *t)
+ospf_abr_task_timer (struct thread *thread)
 {
-  ospf_top->t_abr_task = 0;
+  struct ospf *ospf = THREAD_ARG (thread);
+
+  ospf->t_abr_task = 0;
 
   if (IS_DEBUG_OSPF_EVENT)
     zlog_info ("Running ABR task on timer");
 
-  ospf_check_abr_status ();
+  ospf_check_abr_status (ospf);
 
-  ospf_abr_task ();
+  ospf_abr_task (ospf);
 
- return 0;
+  return 0;
 }
 
 void
-ospf_schedule_abr_task ()
+ospf_schedule_abr_task (struct ospf *ospf)
 {
   if (IS_DEBUG_OSPF_EVENT)
     zlog_info ("Scheduling ABR task");
-  if (! ospf_top->t_abr_task)
-    ospf_top->t_abr_task = thread_add_timer (master, ospf_abr_task_timer,
-					     0, OSPF_ABR_TASK_DELAY);
+
+  if (ospf->t_abr_task == NULL)
+    ospf->t_abr_task = thread_add_timer (master, ospf_abr_task_timer,
+					 ospf, OSPF_ABR_TASK_DELAY);
 }
diff --git a/ospfd/ospfd.c b/ospfd/ospfd.c
index cc6368e..d8646f0 100644
--- a/ospfd/ospfd.c
+++ b/ospfd/ospfd.c
@@ -634,7 +634,7 @@
   struct ospf_area *area;
   struct route_node *rn;
   struct external_info *ei;
-  int ret = OSPF_AREA_ID_FORMAT_DECIMAL;
+  int ret = OSPF_AREA_ID_FORMAT_ADDRESS;
 
   rn = route_node_get (ospf->networks, (struct prefix *)p);
   if (rn->info)
@@ -1046,7 +1046,7 @@
 ospf_area_stub_set (struct ospf *ospf, struct in_addr area_id)
 {
   struct ospf_area *area;
-  int format = OSPF_AREA_ID_FORMAT_DECIMAL;
+  int format = OSPF_AREA_ID_FORMAT_ADDRESS;
 
   area = ospf_area_get (ospf, area_id, format);
   if (ospf_area_vlink_count (ospf, area))
@@ -1079,7 +1079,7 @@
 ospf_area_no_summary_set (struct ospf *ospf, struct in_addr area_id)
 {
   struct ospf_area *area;
-  int format = OSPF_AREA_ID_FORMAT_DECIMAL;
+  int format = OSPF_AREA_ID_FORMAT_ADDRESS;
 
   area = ospf_area_get (ospf, area_id, format);
   area->no_summary = 1;
@@ -1106,7 +1106,7 @@
 ospf_area_nssa_set (struct ospf *ospf, struct in_addr area_id)
 {
   struct ospf_area *area;
-  int format = OSPF_AREA_ID_FORMAT_DECIMAL;
+  int format = OSPF_AREA_ID_FORMAT_ADDRESS;
 
   area = ospf_area_get (ospf, area_id, format);
   if (ospf_area_vlink_count (ospf, area))
