diff --git a/src/main/java/org/apache/ws/scout/registry/BusinessQueryManagerImpl.java b/src/main/java/org/apache/ws/scout/registry/BusinessQueryManagerImpl.java
index 4bb37e1..f93deb6 100644
--- a/src/main/java/org/apache/ws/scout/registry/BusinessQueryManagerImpl.java
+++ b/src/main/java/org/apache/ws/scout/registry/BusinessQueryManagerImpl.java
@@ -171,8 +171,18 @@
         {
             ConnectionImpl con = ((RegistryServiceImpl)getRegistryService()).getConnection();
             AuthToken auth = this.getAuthToken(con,registry);
-            PublisherAssertions result =
-                    registry.getPublisherAssertions(auth.getAuthInfo());
+            PublisherAssertions result = null;
+            try {
+                    result = registry.getPublisherAssertions(auth.getAuthInfo());
+        	} catch (RegistryException rve) {
+        		String username = getUsernameFromCredentials(con.getCredentials());
+        		if (AuthTokenSingleton.getToken(username) != null) {
+        			AuthTokenSingleton.deleteAuthToken(username);
+        		}
+        		auth = getAuthToken(con, registry);
+                result = registry.getPublisherAssertions(auth.getAuthInfo());
+        	}
+
             List<PublisherAssertion> publisherAssertionList = result.getPublisherAssertion();
             LinkedHashSet<Association> col = new LinkedHashSet<Association>();
             for (PublisherAssertion pas : publisherAssertionList) {
@@ -230,8 +240,17 @@
                  if(caller  && !other   )
                         confirm = Constants.COMPLETION_STATUS_TOKEY_INCOMPLETE;
 
-            report = registry.getAssertionStatusReport(auth.getAuthInfo(),confirm);
-            
+            report = null;
+            try {
+            	report = registry.getAssertionStatusReport(auth.getAuthInfo(),confirm);
+        	} catch (RegistryException rve) {
+        		String username = getUsernameFromCredentials(con.getCredentials());
+        		if (AuthTokenSingleton.getToken(username) != null) {
+        			AuthTokenSingleton.deleteAuthToken(username);
+        		}
+        		auth = getAuthToken(con, registry);
+            	report = registry.getAssertionStatusReport(auth.getAuthInfo(),confirm);
+        	}
             
             List<AssertionStatusItem> assertionStatusItemList = report.getAssertionStatusItem();
             LinkedHashSet<Association> col = new LinkedHashSet<Association>();
@@ -843,8 +862,19 @@
         	
             try
             {
-            	RegisteredInfo ri = registry.getRegisteredInfo(auth.getAuthInfo());
-                if (ri != null) {
+            	RegisteredInfo ri = null;
+            	try {
+            		ri = registry.getRegisteredInfo(auth.getAuthInfo());
+            	} catch (RegistryException rve) {
+            		String username = getUsernameFromCredentials(con.getCredentials());
+            		if (AuthTokenSingleton.getToken(username) != null) {
+            			AuthTokenSingleton.deleteAuthToken(username);
+            		}
+            		auth = getAuthToken(con, registry);
+            		ri = registry.getRegisteredInfo(auth.getAuthInfo());
+            	}
+
+            	if (ri != null) {
 						for (String key:keys) {
 							BusinessDetail detail = registry.getBusinessDetail(key);
                             col.add(((BusinessLifeCycleManagerImpl)registryService.getLifeCycleManagerImpl()).createOrganization(detail));
@@ -910,7 +940,18 @@
     		LinkedHashSet<Organization> orgs = null;
             try
             {
-            	RegisteredInfo ri = registry.getRegisteredInfo(auth.getAuthInfo());
+            	RegisteredInfo ri = null;
+            	try {
+            		ri = registry.getRegisteredInfo(auth.getAuthInfo());
+            	} catch (RegistryException rve) {
+            		String username = getUsernameFromCredentials(con.getCredentials());
+            		if (AuthTokenSingleton.getToken(username) != null) {
+            			AuthTokenSingleton.deleteAuthToken(username);
+            		}
+            		auth = getAuthToken(con, registry);
+            		ri = registry.getRegisteredInfo(auth.getAuthInfo());
+            	}
+
             	if (ri != null && ri.getBusinessInfos()!=null) {
             		List<BusinessInfo> bizInfoList = ri.getBusinessInfos().getBusinessInfo();
             		orgs = new LinkedHashSet<Organization>();
@@ -1002,6 +1043,11 @@
             username = pass.getUserName();
             pwd = new String(pass.getPassword());
         }
+        
+        if (AuthTokenSingleton.getToken(username) != null) {
+        	return (AuthToken) AuthTokenSingleton.getToken(username);
+        }
+        
         AuthToken token = null;
         try {
             token = ireg.getAuthToken(username, pwd);
@@ -1009,6 +1055,22 @@
         catch (Exception e) {
             throw new JAXRException(e);
         }
+        AuthTokenSingleton.addAuthToken(username, token);
+        
         return token;
     }
+    
+    private String getUsernameFromCredentials(Set credentials) {
+        String username = "", pwd = "";
+                
+        if (credentials != null) {
+        	Iterator it = credentials.iterator();
+        	while (it.hasNext()) {
+        		PasswordAuthentication pass = (PasswordAuthentication) it.next();
+        		username = pass.getUserName();
+        	}
+        }
+        return username;
+    }
+
 }
diff --git a/src/main/java/org/apache/ws/scout/registry/BusinessQueryManagerV3Impl.java b/src/main/java/org/apache/ws/scout/registry/BusinessQueryManagerV3Impl.java
index 5344928..ce99d52 100644
--- a/src/main/java/org/apache/ws/scout/registry/BusinessQueryManagerV3Impl.java
+++ b/src/main/java/org/apache/ws/scout/registry/BusinessQueryManagerV3Impl.java
@@ -148,8 +148,18 @@
         {
             ConnectionImpl con = ((RegistryServiceImpl)getRegistryService()).getConnection();
             AuthToken auth = this.getAuthToken(con,registry);
-            PublisherAssertions result =
-                    registry.getPublisherAssertions(auth.getAuthInfo());
+            PublisherAssertions result = null;
+            try {
+                    result = registry.getPublisherAssertions(auth.getAuthInfo());
+        	} catch (RegistryV3Exception rve) {
+        		String username = getUsernameFromCredentials(con.getCredentials());
+        		if (AuthTokenV3Singleton.getToken(username) != null) {
+        			AuthTokenV3Singleton.deleteAuthToken(username);
+        		}
+        		auth = getAuthToken(con, registry);
+                result = registry.getPublisherAssertions(auth.getAuthInfo());
+        	}
+
             List<PublisherAssertion> publisherAssertionList = result.getPublisherAssertion();
             LinkedHashSet<Association> col = new LinkedHashSet<Association>();
             for (PublisherAssertion pas : publisherAssertionList) {
@@ -202,8 +212,17 @@
                  if(caller  && !other   )
                         confirm = Constants.COMPLETION_STATUS_TOKEY_INCOMPLETE;
 
-            report = registry.getAssertionStatusReport(auth.getAuthInfo(),confirm);
-            
+            try { 
+            	report = registry.getAssertionStatusReport(auth.getAuthInfo(),confirm);
+        	} catch (RegistryV3Exception rve) {
+        		String username = getUsernameFromCredentials(con.getCredentials());
+        		if (AuthTokenV3Singleton.getToken(username) != null) {
+        			AuthTokenV3Singleton.deleteAuthToken(username);
+        		}
+        		auth = getAuthToken(con, registry);
+            	report = registry.getAssertionStatusReport(auth.getAuthInfo(),confirm);
+        	}
+
             
             List<AssertionStatusItem> assertionStatusItemList = report.getAssertionStatusItem();
             LinkedHashSet<Association> col = new LinkedHashSet<Association>();
@@ -815,7 +834,18 @@
         	
             try
             {
-            	RegisteredInfo ri = registry.getRegisteredInfo(auth.getAuthInfo());
+            	RegisteredInfo ri = null;
+            	try {
+            		ri = registry.getRegisteredInfo(auth.getAuthInfo());
+            	} catch (RegistryV3Exception rve) {
+            		String username = getUsernameFromCredentials(con.getCredentials());
+            		if (AuthTokenV3Singleton.getToken(username) != null) {
+            			AuthTokenV3Singleton.deleteAuthToken(username);
+            		}
+            		auth = getAuthToken(con, registry);
+            		ri = registry.getRegisteredInfo(auth.getAuthInfo());
+            	}
+
                 if (ri != null) {
                     BusinessInfos infos = ri.getBusinessInfos();
                     if (infos != null) {
@@ -885,7 +915,18 @@
     		LinkedHashSet<Organization> orgs = null;
             try
             {
-            	RegisteredInfo ri = registry.getRegisteredInfo(auth.getAuthInfo());
+            	RegisteredInfo ri = null;
+            	try {
+            		ri = registry.getRegisteredInfo(auth.getAuthInfo());
+            	} catch (RegistryV3Exception rve) {
+            		String username = getUsernameFromCredentials(con.getCredentials());
+            		if (AuthTokenV3Singleton.getToken(username) != null) {
+            			AuthTokenV3Singleton.deleteAuthToken(username);
+            		}
+            		auth = getAuthToken(con, registry);
+            		ri = registry.getRegisteredInfo(auth.getAuthInfo());
+            	}
+
             	if (ri != null && ri.getBusinessInfos()!=null) {
             		List<BusinessInfo> bizInfoList = ri.getBusinessInfos().getBusinessInfo();
             		orgs = new LinkedHashSet<Organization>();
@@ -977,6 +1018,11 @@
             username = pass.getUserName();
             pwd = new String(pass.getPassword());
         }
+
+        if (AuthTokenV3Singleton.getToken(username) != null) {
+        	return (AuthToken) AuthTokenV3Singleton.getToken(username);
+        }
+        
         AuthToken token = null;
         try {
             token = ireg.getAuthToken(username, pwd);
@@ -984,6 +1030,22 @@
         catch (Exception e) {
             throw new JAXRException(e);
         }
+        AuthTokenV3Singleton.addAuthToken(username, token);
+
         return token;
     }
+    
+    private String getUsernameFromCredentials(Set credentials) {
+        String username = "", pwd = "";
+                
+        if (credentials != null) {
+        	Iterator it = credentials.iterator();
+        	while (it.hasNext()) {
+        		PasswordAuthentication pass = (PasswordAuthentication) it.next();
+        		username = pass.getUserName();
+        	}
+        }
+        return username;
+    }
+
 }
