diff -urN -x'*.swp' ppp.old/pppd/auth.c ppp.dev/pppd/auth.c
--- ppp.old/pppd/auth.c	2004-11-12 11:30:51.000000000 +0100
+++ ppp.dev/pppd/auth.c	2005-07-13 14:54:23.000000000 +0200
@@ -532,6 +532,12 @@
 link_required(unit)
     int unit;
 {
+}
+
+void
+start_link(unit)
+    int unit;
+{
     new_phase(PHASE_SERIALCONN);
 
     devfd = the_channel->connect();
@@ -984,10 +990,12 @@
     int unit, protocol, prot_flavor;
 {
     int bit;
+    const char *prot = "";
 
     switch (protocol) {
     case PPP_CHAP:
 	bit = CHAP_WITHPEER;
+	prot = "CHAP";
 	switch (prot_flavor) {
 	case CHAP_MD5:
 	    bit |= CHAP_MD5_WITHPEER;
@@ -1006,15 +1014,19 @@
 	if (passwd_from_file)
 	    BZERO(passwd, MAXSECRETLEN);
 	bit = PAP_WITHPEER;
+	prot = "PAP";
 	break;
     case PPP_EAP:
 	bit = EAP_WITHPEER;
+	prot = "EAP";
 	break;
     default:
 	warn("auth_withpeer_success: unknown protocol %x", protocol);
 	bit = 0;
     }
 
+    notice("%s authentication succeeded", prot);
+
     /* Save the authentication method for later. */
     auth_done[unit] |= bit;
 
@@ -1648,6 +1660,7 @@
 static void
 plogout()
 {
+    char *tty;
 #ifdef USE_PAM
     int pam_error;
 
@@ -1658,14 +1671,12 @@
     }
     /* Apparently the pam stuff does closelog(). */
     reopen_log();
-#else /* ! USE_PAM */   
-    char *tty;
+#endif /* USE_PAM */
 
     tty = devnam;
     if (strncmp(tty, "/dev/", 5) == 0)
 	tty += 5;
     logwtmp(tty, "", "");		/* Wipe out utmp logout entry */
-#endif /* ! USE_PAM */
     logged_in = 0;
 }
 
diff -urN -x'*.swp' ppp.old/pppd/main.c ppp.dev/pppd/main.c
--- ppp.old/pppd/main.c	2005-07-13 11:34:28.000000000 +0200
+++ ppp.dev/pppd/main.c	2005-07-13 14:49:06.000000000 +0200
@@ -537,6 +537,7 @@
 	script_unsetenv("BYTES_RCVD");
 
 	lcp_open(0);		/* Start protocol */
+	start_link(0);
 	while (phase != PHASE_DEAD) {
 	    handle_events();
 	    get_input();
diff -urN -x'*.swp' ppp.old/pppd/pppd.h ppp.dev/pppd/pppd.h
--- ppp.old/pppd/pppd.h	2005-07-13 11:34:28.000000000 +0200
+++ ppp.dev/pppd/pppd.h	2005-07-13 14:48:56.000000000 +0200
@@ -526,6 +526,7 @@
 
 /* Procedures exported from auth.c */
 void link_required __P((int));	  /* we are starting to use the link */
+void start_link __P((int));	  /* bring the link up now */
 void link_terminated __P((int));  /* we are finished with the link */
 void link_down __P((int));	  /* the LCP layer has left the Opened state */
 void upper_layers_down __P((int));/* take all NCPs down */
diff -urN -x'*.swp' ppp.old/pppd/tty.c ppp.dev/pppd/tty.c
--- ppp.old/pppd/tty.c	2004-11-13 13:07:29.000000000 +0100
+++ ppp.dev/pppd/tty.c	2005-07-13 14:46:57.000000000 +0200
@@ -755,14 +755,6 @@
 		close(pty_master);
 		pty_master = -1;
 	}
-	if (pty_slave >= 0) {
-		close(pty_slave);
-		pty_slave = -1;
-	}
-	if (real_ttyfd >= 0) {
-		close(real_ttyfd);
-		real_ttyfd = -1;
-	}
 	ttyfd = -1;
 	if (got_sigterm)
 		asked_to_quit = 1;
@@ -781,6 +773,7 @@
 	} else {
 		info("Serial link disconnected.");
 	}
+	stop_charshunt(NULL, 0);
 }
 
 void tty_close_fds()
@@ -944,7 +937,6 @@
 	exit(0);
     }
     charshunt_pid = cpid;
-    add_notifier(&sigreceived, stop_charshunt, 0);
     record_child(cpid, "pppd (charshunt)", charshunt_done, NULL);
     return 1;
 }
