diff --git a/ospfd/ospf_zebra.c b/ospfd/ospf_zebra.c
index a8e1630..baba11d 100644
--- a/ospfd/ospf_zebra.c
+++ b/ospfd/ospf_zebra.c
@@ -59,6 +59,7 @@
 ospf_interface_add (int command, struct zclient *zclient, zebra_size_t length)
 {
   struct interface *ifp;
+  struct ospf *ospf = ospf_top;
 
   ifp = zebra_interface_add_read (zclient->ibuf);
 
@@ -81,7 +82,7 @@
 	IF_DEF_PARAMS (ifp)->type = OSPF_IFTYPE_LOOPBACK;
     }
 
-  ospf_if_update ();
+  ospf_if_update (ospf);
 
 #ifdef HAVE_SNMP
   ospf_snmp_if_update (ifp);
@@ -245,6 +246,7 @@
 ospf_interface_address_add (int command, struct zclient *zclient,
 			    zebra_size_t length)
 {
+  struct ospf *ospf = ospf_top;
   struct connected *c;
 
   c = zebra_interface_address_add_read (zclient->ibuf);
@@ -252,19 +254,7 @@
   if (c == NULL)
     return 0;
 
-#if 0
-  if (IS_DEBUG_OSPF (zebra, ZEBRA_INTERFACE))
-    {
-      struct prefix *p;
-
-      p = c->address;
-      if (p->family == AF_INET)
-	zlog_info (" connected address %s/%d", 
-		   inet_atop (p->u.prefix4), p->prefixlen);
-    }
-#endif
-
-  ospf_if_update ();
+  ospf_if_update (ospf);
 
 #ifdef HAVE_SNMP
   ospf_snmp_if_update (c->ifp);
@@ -277,6 +267,7 @@
 ospf_interface_address_delete (int command, struct zclient *zclient,
 			       zebra_size_t length)
 {
+  struct ospf *ospf = ospf_top;
   struct connected *c;
   struct interface *ifp;
   struct ospf_interface *oi;
@@ -308,7 +299,7 @@
 
   connected_free (c);
 
-  ospf_if_update();
+  ospf_if_update (ospf);
 
   return 0;
 }
@@ -482,42 +473,43 @@
 int
 ospf_redistribute_set (int type, int mtype, int mvalue)
 {
+  struct ospf *ospf = ospf_top;
   int force = 0;
   
   if (ospf_is_type_redistributed (type))
     {
-      if (mtype != ospf_top->dmetric[type].type)
+      if (mtype != ospf->dmetric[type].type)
 	{
-	  ospf_top->dmetric[type].type = mtype;
+	  ospf->dmetric[type].type = mtype;
 	  force = LSA_REFRESH_FORCE;
 	}
-      if (mvalue != ospf_top->dmetric[type].value)
+      if (mvalue != ospf->dmetric[type].value)
 	{
-	  ospf_top->dmetric[type].value = mvalue;
+	  ospf->dmetric[type].value = mvalue;
 	  force = LSA_REFRESH_FORCE;
 	}
 	  
-      ospf_external_lsa_refresh_type (type, force);
+      ospf_external_lsa_refresh_type (ospf, type, force);
       
       if (IS_DEBUG_OSPF (zebra, ZEBRA_REDISTRIBUTE))
 	zlog_info ("Redistribute[%s]: Refresh  Type[%d], Metric[%d]",
 		   LOOKUP (ospf_redistributed_proto, type),
-		   metric_type (type), metric_value (type));
+		   metric_type (ospf, type), metric_value (ospf, type));
       
       return CMD_SUCCESS;
     }
 
-  ospf_top->dmetric[type].type = mtype;
-  ospf_top->dmetric[type].value = mvalue;
+  ospf->dmetric[type].type = mtype;
+  ospf->dmetric[type].value = mvalue;
 
   zclient_redistribute_set (zclient, type);
 
   if (IS_DEBUG_OSPF (zebra, ZEBRA_REDISTRIBUTE))
     zlog_info ("Redistribute[%s]: Start  Type[%d], Metric[%d]",
 	       LOOKUP (ospf_redistributed_proto, type),
-	       metric_type (type), metric_value (type));
+	       metric_type (ospf, type), metric_value (ospf, type));
   
-  ospf_asbr_status_update (++ospf_top->redistribute);
+  ospf_asbr_status_update (ospf, ++ospf->redistribute);
 
   return CMD_SUCCESS;
 }
@@ -525,6 +517,8 @@
 int
 ospf_redistribute_unset (int type)
 {
+  struct ospf *ospf = ospf_top;
+
   if (type == zclient->redist_default)
     return CMD_SUCCESS;
 
@@ -537,13 +531,13 @@
     zlog_info ("Redistribute[%s]: Stop",
 	       LOOKUP (ospf_redistributed_proto, type));
 
-  ospf_top->dmetric[type].type = -1;
-  ospf_top->dmetric[type].value = -1;
+  ospf->dmetric[type].type = -1;
+  ospf->dmetric[type].value = -1;
 
   /* Remove the routes from OSPF table. */
   ospf_redistribute_withdraw (type);
 
-  ospf_asbr_status_update (--ospf_top->redistribute);
+  ospf_asbr_status_update (ospf, --ospf->redistribute);
 
   return CMD_SUCCESS;
 }
@@ -551,48 +545,50 @@
 int
 ospf_redistribute_default_set (int originate, int mtype, int mvalue)
 {
+  struct ospf *ospf = ospf_top;
+
   int force = 0;
   if (ospf_is_type_redistributed (DEFAULT_ROUTE))
     {
-      if (mtype != ospf_top->dmetric[DEFAULT_ROUTE].type)
+      if (mtype != ospf->dmetric[DEFAULT_ROUTE].type)
 	{
-	  ospf_top->dmetric[DEFAULT_ROUTE].type = mtype;
+	  ospf->dmetric[DEFAULT_ROUTE].type = mtype;
 	  force = 1;
 	}
-      if (mvalue != ospf_top->dmetric[DEFAULT_ROUTE].value)
+      if (mvalue != ospf->dmetric[DEFAULT_ROUTE].value)
 	{
 	  force = 1;
-	  ospf_top->dmetric[DEFAULT_ROUTE].value = mvalue;
+	  ospf->dmetric[DEFAULT_ROUTE].value = mvalue;
 	}
       
-      ospf_external_lsa_refresh_default ();
+      ospf_external_lsa_refresh_default (ospf);
       
       if (IS_DEBUG_OSPF (zebra, ZEBRA_REDISTRIBUTE))
 	zlog_info ("Redistribute[%s]: Refresh  Type[%d], Metric[%d]",
 		   LOOKUP (ospf_redistributed_proto, DEFAULT_ROUTE),
-		   metric_type (DEFAULT_ROUTE),
-		   metric_value (DEFAULT_ROUTE));
+		   metric_type (ospf, DEFAULT_ROUTE),
+		   metric_value (ospf, DEFAULT_ROUTE));
       return CMD_SUCCESS;
     }
 
-  ospf_top->default_originate = originate;
-  ospf_top->dmetric[DEFAULT_ROUTE].type = mtype;
-  ospf_top->dmetric[DEFAULT_ROUTE].value = mvalue;
+  ospf->default_originate = originate;
+  ospf->dmetric[DEFAULT_ROUTE].type = mtype;
+  ospf->dmetric[DEFAULT_ROUTE].value = mvalue;
 
   zclient_redistribute_default_set (zclient);
   
   if (IS_DEBUG_OSPF (zebra, ZEBRA_REDISTRIBUTE))
     zlog_info ("Redistribute[DEFAULT]: Start  Type[%d], Metric[%d]",
-	       metric_type (DEFAULT_ROUTE), metric_value (DEFAULT_ROUTE));
+	       metric_type (ospf, DEFAULT_ROUTE),
+	       metric_value (ospf, DEFAULT_ROUTE));
 
-
-  if (ospf_top->router_id.s_addr == 0)
-    ospf_top->external_origin |= (1 << DEFAULT_ROUTE);
+  if (ospf->router_id.s_addr == 0)
+    ospf->external_origin |= (1 << DEFAULT_ROUTE);
   else
     thread_add_timer (master, ospf_default_originate_timer,
-		      &ospf_top->default_originate, 1);
+		      &ospf->default_originate, 1);
 
-  ospf_asbr_status_update (++ospf_top->redistribute);
+  ospf_asbr_status_update (ospf, ++ospf->redistribute);
 
   return CMD_SUCCESS;
 }
@@ -600,19 +596,21 @@
 int
 ospf_redistribute_default_unset ()
 {
+  struct ospf *ospf = ospf_top;
+
   if (!ospf_is_type_redistributed (DEFAULT_ROUTE))
     return CMD_SUCCESS;
 
-  ospf_top->default_originate = DEFAULT_ORIGINATE_NONE;
-  ospf_top->dmetric[DEFAULT_ROUTE].type = -1;
-  ospf_top->dmetric[DEFAULT_ROUTE].value = -1;
+  ospf->default_originate = DEFAULT_ORIGINATE_NONE;
+  ospf->dmetric[DEFAULT_ROUTE].type = -1;
+  ospf->dmetric[DEFAULT_ROUTE].value = -1;
 
   zclient_redistribute_default_unset (zclient);
 
   if (IS_DEBUG_OSPF (zebra, ZEBRA_REDISTRIBUTE))
     zlog_info ("Redistribute[DEFAULT]: Stop");
   
-  ospf_asbr_status_update (--ospf_top->redistribute);
+  ospf_asbr_status_update (ospf, --ospf->redistribute);
 
   return CMD_SUCCESS;
 }
@@ -620,6 +618,8 @@
 int
 ospf_external_lsa_originate_check (struct external_info *ei)
 {
+  struct ospf *ospf = ospf_top;
+
   /* If prefix is multicast, then do not originate LSA. */
   if (IN_MULTICAST (htonl (ei->p.prefix.s_addr)))
     {
@@ -630,7 +630,7 @@
 
   /* Take care of default-originate. */
   if (is_prefix_default (&ei->p))
-    if (ospf_top->default_originate == DEFAULT_ORIGINATE_NONE)
+    if (ospf->default_originate == DEFAULT_ORIGINATE_NONE)
       {
 	zlog_info ("LSA[Type5:0.0.0.0]: Not originate AS-exntenal-LSA "
 		   "for default");
@@ -642,21 +642,26 @@
 
 /* If connected prefix is OSPF enable interface, then do not announce. */
 int
-ospf_distribute_check_connected (struct external_info *ei)
+ospf_distribute_check_connected (struct ospf *ospf,
+				 struct external_info *ei)
 {
   struct route_node *rn;
 
-  for (rn = route_top (ospf_top->networks); rn; rn = route_next (rn))
+  for (rn = route_top (ospf->networks); rn; rn = route_next (rn))
     if (rn->info != NULL)
       if (prefix_match (&rn->p, (struct prefix *)&ei->p))
-	return 0;
+	{
+	  route_unlock_node (rn);
+	  return 0;
+	}
 
   return 1;
 }
 
 /* return 1 if external LSA must be originated, 0 otherwise */
 int
-ospf_redistribute_check (struct external_info *ei, int *changed)
+ospf_redistribute_check (struct ospf *ospf,
+			 struct external_info *ei, int *changed)
 {
   struct route_map_set_values save_values;
   struct prefix_ipv4 *p = &ei->p;
@@ -669,7 +674,8 @@
     return 0;
 
   /* Take care connected route. */
-  if (type == ZEBRA_ROUTE_CONNECT && !ospf_distribute_check_connected (ei))
+  if (type == ZEBRA_ROUTE_CONNECT &&
+      !ospf_distribute_check_connected (ospf, ei))
     return 0;
 
   if (!DEFAULT_ROUTE_TYPE (type) && DISTRIBUTE_NAME (type))
@@ -746,6 +752,7 @@
   struct in_addr nexthop;
   struct prefix_ipv4 p;
   struct external_info *ei;
+  struct ospf *ospf = ospf_top;
 
   s = zclient->ibuf;
   ifindex = 0;
@@ -782,25 +789,26 @@
     {
       ei = ospf_external_info_add (api.type, p, ifindex, nexthop);
 
-      if (ospf_top->router_id.s_addr == 0)
+      if (ospf->router_id.s_addr == 0)
 	/* Set flags to generate AS-external-LSA originate event
 	   for each redistributed protocols later. */
-	ospf_top->external_origin |= (1 << api.type);
+	ospf->external_origin |= (1 << api.type);
       else
 	{
 	  if (ei)
 	    {
 	      if (is_prefix_default (&p))
-		ospf_external_lsa_refresh_default ();
+		ospf_external_lsa_refresh_default (ospf);
 	      else
 		{
 		  struct ospf_lsa *current;
 
-		  current = ospf_external_info_find_lsa (&ei->p);
+		  current = ospf_external_info_find_lsa (ospf, &ei->p);
 		  if (!current)
-		    ospf_external_lsa_originate (ei);
+		    ospf_external_lsa_originate (ospf, ei);
 		  else if (IS_LSA_MAXAGE (current))
-		    ospf_external_lsa_refresh (current, ei, LSA_REFRESH_FORCE);
+		    ospf_external_lsa_refresh (ospf, current,
+					       ei, LSA_REFRESH_FORCE);
 		  else
 		    zlog_warn ("ospf_zebra_read_ipv4() : %s already exists",
 			       inet_ntoa (p.prefix));
@@ -812,9 +820,9 @@
     {
       ospf_external_info_delete (api.type, p);
       if ( !is_prefix_default (&p))
-	ospf_external_lsa_flush (api.type, &p, ifindex, nexthop);
+	ospf_external_lsa_flush (ospf, api.type, &p, ifindex, nexthop);
       else
-	ospf_external_lsa_refresh_default ();
+	ospf_external_lsa_refresh_default (ospf);
     }
 
   return 0;
@@ -822,7 +830,7 @@
 
 
 int
-ospf_distribute_list_out_set (int type, char *name)
+ospf_distribute_list_out_set (struct ospf *ospf, int type, char *name)
 {
   /* Lookup access-list for distribute-list. */
   DISTRIBUTE_LIST (type) = access_list_lookup (AFI_IP, name);
@@ -836,17 +844,17 @@
 
   /* If access-list have been set, schedule update timer. */
   if (DISTRIBUTE_LIST (type))
-    ospf_distribute_list_update (type);
+    ospf_distribute_list_update (ospf, type);
 
   return CMD_SUCCESS;
 }
 
 int
-ospf_distribute_list_out_unset (int type, char *name)
+ospf_distribute_list_out_unset (struct ospf *ospf, int type, char *name)
 {
   /* Schedule update timer. */
   if (DISTRIBUTE_LIST (type))
-    ospf_distribute_list_update (type);
+    ospf_distribute_list_update (ospf, type);
 
   /* Unset distribute-list. */
   DISTRIBUTE_LIST (type) = NULL;
@@ -869,11 +877,12 @@
   struct route_table *rt;
   struct ospf_lsa *lsa;
   u_char type;
+  struct ospf *ospf = ospf_top;
 
   type = (int) THREAD_ARG (thread);
   rt = EXTERNAL_INFO (type);
 
-  ospf_top->t_distribute_update = NULL;
+  ospf->t_distribute_update = NULL;
 
   zlog_info ("Zebra[Redistribute]: distribute-list update timer fired!");
 
@@ -883,11 +892,11 @@
       if ((ei = rn->info) != NULL)
 	{
 	  if (is_prefix_default (&ei->p))
-	    ospf_external_lsa_refresh_default ();
-	  else if ((lsa = ospf_external_info_find_lsa (&ei->p)))
-	    ospf_external_lsa_refresh (lsa, ei, LSA_REFRESH_IF_CHANGED);
+	    ospf_external_lsa_refresh_default (ospf);
+	  else if ((lsa = ospf_external_info_find_lsa (ospf, &ei->p)))
+	    ospf_external_lsa_refresh (ospf, lsa, ei, LSA_REFRESH_IF_CHANGED);
 	  else
-	    ospf_external_lsa_originate (ei);
+	    ospf_external_lsa_originate (ospf, ei);
 	}
   return 0;
 }
@@ -896,49 +905,45 @@
 
 /* Update distribute-list and set timer to apply access-list. */
 void
-ospf_distribute_list_update (int type)
+ospf_distribute_list_update (struct ospf *ospf, int type)
 {
   struct route_table *rt;
   
-  zlog_info ("ospf_distribute_list_update(): start");
-
   /* External info does not exist. */
   if (!(rt = EXTERNAL_INFO (type)))
     return;
 
   /* If exists previously invoked thread, then cancel it. */
-  if (ospf_top->t_distribute_update)
-    OSPF_TIMER_OFF (ospf_top->t_distribute_update);
+  if (ospf->t_distribute_update)
+    OSPF_TIMER_OFF (ospf->t_distribute_update);
 
   /* Set timer. */
-  ospf_top->t_distribute_update =
+  ospf->t_distribute_update =
     thread_add_timer (master, ospf_distribute_list_update_timer,
 		      (void *) type, OSPF_DISTRIBUTE_UPDATE_DELAY);
-
-  zlog_info ("ospf_distribute_list_update(): stop");
 }
 
 /* If access-list is updated, apply some check. */
 void
 ospf_filter_update (struct access_list *access)
 {
+  struct ospf *ospf = ospf_top;
   int type;
   int abr_inv = 0;
   struct ospf_area *area;
   listnode node;
 
   /* If OSPF instatnce does not exist, return right now. */
-  if (!ospf_top)
+  if (ospf == NULL)
     return;
 
-
   /* Update distribute-list, and apply filter. */
   for (type = 0; type < ZEBRA_ROUTE_MAX; type++)
     {
       if (ROUTEMAP (type) != NULL)
 	{
 	  /* if route-map is not NULL it may be using this access list */
-	  ospf_distribute_list_update (type);
+	  ospf_distribute_list_update (ospf, type);
 	  continue;
 	}
       
@@ -959,12 +964,12 @@
 	  /* Schedule distribute-list update timer. */
 	  if (DISTRIBUTE_LIST (type) == NULL ||
 	      strcmp (DISTRIBUTE_NAME (type), access->name) == 0)
-	    ospf_distribute_list_update (type);
+	    ospf_distribute_list_update (ospf, type);
 	}
     }
 
   /* Update Area access-list. */
-  for (node = listhead (ospf_top->areas); node; nextnode (node))
+  for (node = listhead (ospf->areas); node; nextnode (node))
     if ((area = getdata (node)) != NULL)
       {
 	if (EXPORT_NAME (area))
@@ -982,7 +987,7 @@
 
   /* Schedule ABR tasks -- this will be changed -- takada. */
   if (OSPF_IS_ABR && abr_inv)
-    ospf_schedule_abr_task ();
+    ospf_schedule_abr_task (ospf);
 }
 
 
@@ -1010,6 +1015,7 @@
   u_char distance;
   struct route_node *rn;
   struct ospf_distance *odistance;
+  struct ospf *ospf = ospf_top;
 
   ret = str2prefix_ipv4 (ip_str, &p);
   if (ret == 0)
@@ -1021,7 +1027,7 @@
   distance = atoi (distance_str);
 
   /* Get OSPF distance node. */
-  rn = route_node_get (ospf_top->distance_table, (struct prefix *) &p);
+  rn = route_node_get (ospf->distance_table, (struct prefix *) &p);
   if (rn->info)
     {
       odistance = rn->info;
@@ -1057,6 +1063,7 @@
   u_char distance;
   struct route_node *rn;
   struct ospf_distance *odistance;
+  struct ospf *ospf = ospf_top;
 
   ret = str2prefix_ipv4 (ip_str, &p);
   if (ret == 0)
@@ -1067,7 +1074,7 @@
 
   distance = atoi (distance_str);
 
-  rn = route_node_lookup (ospf_top->distance_table, (struct prefix *)&p);
+  rn = route_node_lookup (ospf->distance_table, (struct prefix *)&p);
   if (! rn)
     {
       vty_out (vty, "Can't find specified prefix%s", VTY_NEWLINE);
@@ -1088,12 +1095,12 @@
 }
 
 void
-ospf_distance_reset ()
+ospf_distance_reset (struct ospf *ospf)
 {
   struct route_node *rn;
   struct ospf_distance *odistance;
 
-  for (rn = route_top (ospf_top->distance_table); rn; rn = route_next (rn))
+  for (rn = route_top (ospf->distance_table); rn; rn = route_next (rn))
     if ((odistance = rn->info) != NULL)
       {
 	if (odistance->access_list)
@@ -1107,58 +1114,26 @@
 u_char
 ospf_distance_apply (struct prefix_ipv4 *p, struct ospf_route *or)
 {
-#if 0
-  struct route_node *rn;
-  struct ospf_distance *odistance;
-  struct access_list *alist;
-  struct prefix_ipv4 q;
+  struct ospf *ospf = ospf_top;
 
-  memset (&q, 0, sizeof (struct prefix_ipv4));
-  q.family = AF_INET;
-  /* q.prefix =  */
-  q.prefixlen = IPV4_MAX_BITLEN;
-#endif /* 0 */
-
-  if (! ospf_top)
+  if (ospf == NULL)
     return 0;
 
-#if 0
-  rn = route_node_match (ospf_top->distance_table, (struct prefix *) &q);
-  if (rn)
-    {
-      odistance = rn->info;
-      route_unlock_node (rn);
-
-      if (odistance->access_list)
-	{
-	  alist = access_list_lookup (AFI_IP, odistance->access_list);
-	  if (alist == NULL)
-	    return 0;
-	  if (access_list_apply (alist, (struct prefix *) p) == FILTER_DENY)
-	    return 0;
-
-	  return odistance->distance;
-	}
-      else
-	return odistance->distance;
-    }
-#endif /* 0 */
-
-  if (ospf_top->distance_intra)
+  if (ospf->distance_intra)
     if (or->path_type == OSPF_PATH_INTRA_AREA)
-      return ospf_top->distance_intra;
+      return ospf->distance_intra;
 
-  if (ospf_top->distance_inter)
+  if (ospf->distance_inter)
     if (or->path_type == OSPF_PATH_INTER_AREA)
-      return ospf_top->distance_inter;
+      return ospf->distance_inter;
 
-  if (ospf_top->distance_external)
+  if (ospf->distance_external)
     if (or->path_type == OSPF_PATH_TYPE1_EXTERNAL
 	|| or->path_type == OSPF_PATH_TYPE2_EXTERNAL)
-      return ospf_top->distance_external;
+      return ospf->distance_external;
   
-  if (ospf_top->distance_all)
-    return ospf_top->distance_all;
+  if (ospf->distance_all)
+    return ospf->distance_all;
 
   return 0;
 }
