diff --git a/src/api/SwaggerApi.js b/src/api/SwaggerApi.js
index e150a094cd08504a56fa3fcdd7b1ee3be75b4f93..fe3e035ea569dbd5c79ec740d0bdbb5af5ebe676 100644
--- a/src/api/SwaggerApi.js
+++ b/src/api/SwaggerApi.js
@@ -41,39 +41,42 @@ export function UserProvider({ children }) {
     setLoginError(message);
   }  
 
-  const [user, setUser] = useState();
+  const [user, getUser, resetUser, userLoading] = useUser();
   const [loginError, setLoginError] = useState();
-  const [userRoles, getUserRoles, resetUserRoles] = useUserRoles();
-  const [userInfo, getUserInfo] = useUserInfo();
   const [loginResponse, loginFcn] = useLogin(onLoginError);
   const logoutFcn = useLogout();
 
   const resetLoginError = useCallback(() => setLoginError(null), [setLoginError]);
 
   console.log("rendering UserProvider")
-  console.log(user);
-
-  useEffect(getUserInfo, [Boolean(loginResponse), getUserInfo]);
-  useEffect(() => userInfo && setUser(userInfo), [setUser, userInfo]);
-
-  useEffect(getUserRoles, [Boolean(loginResponse), getUserRoles]);
+  useEffect(getUser, [Boolean(loginResponse), getUser]);
 
   const logout = useCallback(async () => {
     console.log("Logging out!")
-    setUser(null);
-    resetUserRoles();
+    resetUser();
     logoutFcn();
-  }, [setUser, resetUserRoles, logoutFcn])
+  }, [resetUser, logoutFcn])
 
   const login = useCallback(async (username, password) => {
     console.log("Logging in!");
     await loginFcn(username, password);
-    await getUserRoles();
-    setUser(await getUserInfo());
-  }, [loginFcn, getUserRoles, getUserInfo, setUser])
+    getUser();
+  }, [loginFcn, getUser])
+
+  const createValue = useCallback(() => {
+    return { user: user?.userInfo, userRoles: user?.userRoles, getUser, login, loginError, resetLoginError, logout };
+  }, [user, getUser, login, loginError, resetLoginError, logout ]);
+
+  const [value, setValue] = useState(createValue());
+
+  useEffect(() => {
+    if (!userLoading) {
+      setValue(createValue())
+    }
+  }, [userLoading, setValue, createValue])
 
   return (
-    <userContext.Provider value={{ user, userRoles, getUserRoles, login, loginError, resetLoginError, logout }}>
+    <userContext.Provider value={value}>
       {children}
     </userContext.Provider>
   );
@@ -521,6 +524,37 @@ export function unpackUser(user) {
   return { ...user };
 }
 
+export function useUser() {
+  const [userInfo, getUserInfo, resetUserInfo, userInfoLoading] = useUserInfo();
+  const [userRoles, getUserRoles, resetUserRoles, userRolesLoading] = useUserRoles();
+  const [user, setUser] = useState();
+
+  useEffect(() => {
+    // userInfo and user Roles should:
+    // - both be defined when logged in
+    // - both be undefined when logged out
+    const loginStateConsistent = Boolean(userInfo) === Boolean(userRoles);
+    if (loginStateConsistent) {
+      setUser({userInfo, userRoles});
+    }
+  }, [userInfo, userRoles])
+
+  const getUser = useCallback(() => {
+    getUserInfo();
+    getUserRoles();
+  }, [getUserInfo, getUserRoles]);
+
+  const resetUser = useCallback(() => {
+    resetUserInfo();
+    resetUserRoles();
+  }, [resetUserInfo, resetUserRoles]);
+
+  const loading = userInfoLoading || userRolesLoading;
+
+  return [user, getUser, resetUser, loading]
+}
+
+
 export function useUserInfo() {
   const api = useContext(apiContext);
   const method = useCallAndUnpack(api.apis.Git.userInfo, unpackUser);