--- linux/include/net/rose.h	2006-11-29 22:57:37.000000000 +0100
+++ /temp/linux/include/net/rose.h	2008-09-28 23:31:32.000000000 +0200
@@ -201,7 +201,7 @@ extern void rose_link_device_down(struct
 extern struct net_device *rose_dev_first(void);
 extern struct net_device *rose_dev_get(rose_address *);
 extern struct rose_route *rose_route_free_lci(unsigned int, struct rose_neigh *);
-extern struct rose_neigh *rose_get_neigh(rose_address *, unsigned char *, unsigned char *);
+extern struct rose_neigh *rose_get_neigh(rose_address *, unsigned char *, unsigned char *, int);
 extern int  rose_rt_ioctl(unsigned int, void __user *);
 extern void rose_link_failed(ax25_cb *, int);
 extern int  rose_route_frame(struct sk_buff *, ax25_cb *);
diff -ruNp linux/net/rose/af_rose.c /temp/linux/net/rose/af_rose.c
--- linux/net/rose/af_rose.c	2006-11-29 22:57:37.000000000 +0100
+++ /temp/linux/net/rose/af_rose.c	2008-09-28 23:30:43.000000000 +0200
@@ -735,7 +735,7 @@ static int rose_connect(struct socket *s
 		return -EINVAL;
 
 	rose->neighbour = rose_get_neigh(&addr->srose_addr, &cause,
-					 &diagnostic);
+					 &diagnostic, 0);
 	if (!rose->neighbour)
 		return -ENETUNREACH;
 
@@ -819,7 +819,7 @@ rose_try_next_neigh:
 
 	if (sk->sk_state != TCP_ESTABLISHED) {
 	/* Try next neighbour */
-		rose->neighbour = rose_get_neigh(&addr->srose_addr, &cause, &diagnostic);
+		rose->neighbour = rose_get_neigh(&addr->srose_addr, &cause, &diagnostic, 0);
 		if (rose->neighbour)
 			goto rose_try_next_neigh;
 	/* No more neighbour */
diff -ruNp linux/net/rose/rose_route.c /temp/linux/net/rose/rose_route.c
--- linux/net/rose/rose_route.c	2006-11-29 22:57:37.000000000 +0100
+++ /temp/linux/net/rose/rose_route.c	2008-09-28 23:30:44.000000000 +0200
@@ -659,27 +659,34 @@ struct rose_route *rose_route_free_lci(u
 }
 
 /*
- *	Find a neighbour given a ROSE address.
+ *	Find a neighbour or a route given a ROSE address.
  */
 struct rose_neigh *rose_get_neigh(rose_address *addr, unsigned char *cause,
-	unsigned char *diagnostic)
+	unsigned char *diagnostic, int new)
 {
 	struct rose_neigh *res = NULL;
 	struct rose_node *node;
 	int failed = 0;
 	int i;
 
-	spin_lock_bh(&rose_node_list_lock);
+	if (!new) spin_lock_bh(&rose_node_list_lock);
 	for (node = rose_node_list; node != NULL; node = node->next) {
 		if (rosecmpm(addr, &node->address, node->mask) == 0) {
 			for (i = 0; i < node->count; i++) {
-				if (!rose_ftimer_running(node->neighbour[i])) {
-					res = node->neighbour[i];
-					goto out;
-				} else
-					failed = 1;
+				if (new) {
+					if (node->neighbour[i]->restarted) {
+						res = node->neighbour[i];
+						goto out;
+					}
+				}
+				else {
+					if (!rose_ftimer_running(node->neighbour[i])) {
+						res = node->neighbour[i];
+						goto out;
+					} else
+						failed = 1;
+				}
 			}
-			break;
 		}
 	}
 
@@ -692,7 +699,7 @@ struct rose_neigh *rose_get_neigh(rose_a
 	}
 
 out:
-	spin_unlock_bh(&rose_node_list_lock);
+	if (!new) spin_unlock_bh(&rose_node_list_lock);
 
 	return res;
 }
@@ -854,7 +861,6 @@ int rose_route_frame(struct sk_buff *skb
 	src_addr  = (rose_address *)(skb->data + 9);
 	dest_addr = (rose_address *)(skb->data + 4);
 
-	spin_lock_bh(&rose_node_list_lock);
 	spin_lock_bh(&rose_neigh_list_lock);
 	spin_lock_bh(&rose_route_list_lock);
 
@@ -1016,7 +1022,7 @@ int rose_route_frame(struct sk_buff *skb
 		rose_route = rose_route->next;
 	}
 
-	if ((new_neigh = rose_get_neigh(dest_addr, &cause, &diagnostic)) == NULL) {
+	if ((new_neigh = rose_get_neigh(dest_addr, &cause, &diagnostic, 1)) == NULL) {
 		rose_transmit_clear_request(rose_neigh, lci, cause, diagnostic);
 		goto out;
 	}
@@ -1057,7 +1063,6 @@ int rose_route_frame(struct sk_buff *skb
 out:
 	spin_unlock_bh(&rose_route_list_lock);
 	spin_unlock_bh(&rose_neigh_list_lock);
-	spin_unlock_bh(&rose_node_list_lock);
 
 	return res;
 }
diff -ruNp a/net/rose/af_rose.c b/net/rose/af_rose.c
+++ a/net/rose/af_rose.c	2008-07-14 21:17:13.000000000 +0200
+++ b/net/rose/af_rose.c	2008-07-14 21:17:13.000000000 +0200
@@ -161,7 +161,10 @@ void rose_kill_by_neigh(struct rose_neig
 
 		if (rose->neighbour == neigh) {
 			rose_disconnect(s, ENETUNREACH, ROSE_OUT_OF_ORDER, 0);
-			rose->neighbour->use--;
+			if (rose->neighbour->use > 0 ) 
+				rose->neighbour->use--;
+			else
+				printk(KERN_WARNING "ROSE: rose_kill_by_neigh() - neighbour->use-- could be < 0\n");
 			rose->neighbour = NULL;
 		}
 	}
