diff --git a/ui-react/src/components/app/LoopUI.js b/ui-react/src/components/app/LoopUI.js
index 7de6ad0..d058543 100644
--- a/ui-react/src/components/app/LoopUI.js
+++ b/ui-react/src/components/app/LoopUI.js
@@ -31,14 +31,15 @@
 import ClosedLoopSvg from '../loop_viewer/svg/ClosedLoopSvg';
 import ClosedLoopLogs from '../loop_viewer/logs/ClosedLoopLogs';
 import ClosedLoopStatus from '../loop_viewer/status/ClosedLoopStatus';
+import UserService from '../backend_communication/UserService';
 
-const ProjectNameStyle = styled.a`
+const ProjectNameStyled = styled.a`
 	vertical-align: middle;
 	padding-left: 30px;
 	font-size: 30px;
 
 `
-const LoopViewDivStyle = styled.div`
+const LoopViewDivStyled = styled.div`
 	height: 90vh;
 	overflow: hidden;
 	margin-left: 10px;
@@ -50,52 +51,69 @@
 	border-color: ${props => props.theme.loopViewerHeaderBackgroundColor};
 `
 
-const LoopViewHeaderDivStyle = styled.div`
+const LoopViewHeaderDivStyled = styled.div`
 	background-color: ${props => props.theme.loopViewerHeaderBackgroundColor};
 	padding: 10px 10px;
 	color: ${props => props.theme.loopViewerHeaderFontColor};
 `
 
-const LoopViewBodyDivStyle = styled.div`
+const LoopViewBodyDivStyled = styled.div`
 	background-color: ${props => (props.theme.loopViewerBackgroundColor)};
 	padding: 10px 10px;
 	color: ${props => (props.theme.loopViewerHeaderFontColor)};
 	height: 95%;
 `
 
-const LoopViewLoopNameSpanStyle = styled.span`
+const LoopViewLoopNameSpanStyled = styled.span`
 	font-weight: bold;
 	color: ${props => (props.theme.loopViewerHeaderFontColor)};
 	background-color: ${props => (props.theme.loopViewerHeaderBackgroundColor)};
 `
 
 export default class LoopUI extends React.Component {
+	state = {
+		userName: null,
+		loopName: "Empty (NO loop loaded yet)",
+	};
 
-	loopName="Empty (NO loop loaded yet)";
+	constructor() {
+		super();
+		this.getUser = this.getUser.bind(this);
+	}
+
+ 	componentDidMount() {
+		 this.getUser();
+	 }
+
+	getUser() {
+		UserService.LOGIN().then(user => {
+			this.setState({userName:user})
+		});
+	}
 		
 	renderMenuNavBar() {
 		return (
 			<MenuBar />
 		);
 	}
-	
+
 	renderUserLoggedNavBar() {
 		return (
 			<Navbar.Text>
-				Signed in as: <a href="login">{localStorage.getItem('user')}</a>
+				Signed in as: <a href="/login">{this.state.userName}</a>
 			</Navbar.Text>
 		);
 	}
-	
+
 	renderLogoNavBar() {
 		return (
 			<Navbar.Brand>
 				<img height="50px" width="234px" src={logo} alt=""/>
-				<ProjectNameStyle>CLAMP</ProjectNameStyle>
+				<ProjectNameStyled>CLAMP</ProjectNameStyled>
 			</Navbar.Brand>
 		);
 	}
-	
+
 	renderNavBar() {
 		return (
 		<Navbar expand="lg">
@@ -108,34 +126,34 @@
 	
 	renderLoopViewHeader() {
 		return (
-			<LoopViewHeaderDivStyle>
-				Loop Viewer - <LoopViewLoopNameSpanStyle id="loop_name">{this.loopName}</LoopViewLoopNameSpanStyle> 
-			</LoopViewHeaderDivStyle>
+			<LoopViewHeaderDivStyled>
+				Loop Viewer - <LoopViewLoopNameSpanStyled id="loop_name">{this.state.loopName}</LoopViewLoopNameSpanStyled> 
+			</LoopViewHeaderDivStyled>
 		);
 	}
 	
 	renderLoopViewBody() {
 		return (
-			<LoopViewBodyDivStyle>
+			<LoopViewBodyDivStyled>
 				<ClosedLoopSvg />
 				<ClosedLoopLogs />
 				<ClosedLoopStatus />
-			</LoopViewBodyDivStyle>
+			</LoopViewBodyDivStyled>
 		);
 	}
 	
 	renderLoopViewer() {
 		return (
-			<LoopViewDivStyle>
+			<LoopViewDivStyled>
 					{this.renderLoopViewHeader()}
 					{this.renderLoopViewBody()}
-			</LoopViewDivStyle>
+			</LoopViewDivStyled>
 	 		);
 	}
 	
 	render() {
 		return (
-				<div>
+			<div id="main_div">
 				 	<GlobalClampStyle />
 					{this.renderNavBar()}
 					{this.renderLoopViewer()}
diff --git a/ui-react/src/components/app/login/BasicAuthLogin.js b/ui-react/src/components/app/login/BasicAuthLogin.js
deleted file mode 100644
index 994255c..0000000
--- a/ui-react/src/components/app/login/BasicAuthLogin.js
+++ /dev/null
@@ -1,117 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP CLAMP
- * ================================================================================
- * Copyright (C) 2019 AT&T Intellectual Property. All rights
- *                             reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END============================================
- * ===================================================================
- *
- */
-import React from 'react';
-import styled from 'styled-components';
-import LoopService from '../../backend_communication/LoopService';
-
-const LoginHeaderStyle = styled.span`
-  font-size: 20px;
-  font-weight: bold;
-  padding-left: 10px;
-	color: ${props => props.theme.loopViewerHeaderFontColor};
-`
-const LoginDivStyle = styled.div`
-  font-size: 12px;
-	background-color: ${props => props.theme.loopViewerHeaderBackgroundColor};
-	padding: 10px 10px;
-	color: ${props => props.theme.loopViewerHeaderFontColor};
-`
-const LoginSubmitButtonStyle = styled.button`
-  font-size: 12px;
-	padding: 5px 10px;
-	color: ${props => props.theme.loopViewerHeaderFontColor};
-  border: 2px solid;
-  border-radius: 8px;
-`
-const LoginTextInputStyle = styled.input`
-  padding: 10px 10px;
-  margin-left: 20px;
-  border: 1px solid #ced4da;
-  border-radius: 3px;
-	color: ${props => props.theme.loopViewerHeaderFontColor};
-`
-
-export default class BasicAuthLogin extends React.Component {
-    constructor(props) {
-        super(props);
-        this.handleSubmit = this.handleSubmit.bind(this);
-        this.handleChange = this.handleChange.bind(this);
-        console.log('BasicAuthLogin');
-        this.state = {
-            username: '',
-            password: '',
-            submitted: 'false'
-        };
-    }
-
-    handleChange(e) {
-        const { name, value } = e.target;
-        this.setState({ [name]: value });
-    }
-
-    handleSubmit(e) {
-            e.preventDefault();
-            this.setState({ submitted: true });
-            const { username, password } = this.state;
-            LoopService.login(username, password)
-            .then(
-              user => {
-                  const { from } = { from: { pathname: "/" } };
-                  this.props.history.push(from);
-              },
-              error => {
-                  const { from } = { from: { pathname: "/loginFailed" } };
-                  this.props.history.push(from);
-                  console.log ("Basic login failed");
-              }
-        );
-    }
-
-    render() {
-      const { username, password, submitted} = this.state;
-        return (
-            <div>
-                <LoginHeaderStyle>Login</LoginHeaderStyle>
-                <form name="form" onSubmit={this.handleSubmit}>
-                    <LoginDivStyle className={(submitted && !username ? ' has-error' : '')}>
-                        <label htmlFor="username">Username</label>
-                        <LoginTextInputStyle name="username" value={username} onChange={this.handleChange} />
-                        {submitted && !username &&
-                            <div className="help-block">Username is required</div>
-                        }
-                    </LoginDivStyle>
-                    <LoginDivStyle className={(submitted && !password ? ' has-error' : '')}>
-                        <label htmlFor="password">Password</label>
-                        <LoginTextInputStyle type="password" name="password" value={password} onChange={this.handleChange} />
-                        {submitted && !password &&
-                            <div className="help-block">Password is required</div>
-                        }
-                    </LoginDivStyle>
-                    <LoginDivStyle>
-                        <LoginSubmitButtonStyle className="btn btn-primary">Login</LoginSubmitButtonStyle>
-                    </LoginDivStyle>
-                </form>
-            </div>
-        );
-    }
-}
diff --git a/ui-react/src/components/app/login/LoginFailedPage.js b/ui-react/src/components/app/login/LoginFailedPage.js
deleted file mode 100644
index fb398ef..0000000
--- a/ui-react/src/components/app/login/LoginFailedPage.js
+++ /dev/null
@@ -1,35 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP CLAMP
- * ================================================================================
- * Copyright (C) 2019 AT&T Intellectual Property. All rights
- *                             reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END============================================
- * ===================================================================
- *
- */
-import React from 'react'
-
-
-export default class LoginFailedPage extends React.Component {
-	render () {
-		return (
-      		<div id='main'>
-      			<div class="divRow"><b>Login Failed!</b></div>
-      			<div class="divRow">Please cick <a href="/">here</a> to go back to the main page.</div>
-      		</div>
-		);
-	}
-}
diff --git a/ui-react/src/components/app/login/LoginPage.js b/ui-react/src/components/app/login/LoginPage.js
deleted file mode 100644
index 5169435..0000000
--- a/ui-react/src/components/app/login/LoginPage.js
+++ /dev/null
@@ -1,48 +0,0 @@
-/*-
- * ============LICENSE_START=======================================================
- * ONAP CLAMP
- * ================================================================================
- * Copyright (C) 2019 AT&T Intellectual Property. All rights
- *                             reserved.
- * ================================================================================
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- * http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- * ============LICENSE_END============================================
- * ===================================================================
- *
- */
-import React from 'react';
-
-import LoopService from '../../backend_communication/LoopService';
-
-export default class LoginPage extends React.Component {
-    constructor(props) {
-        super(props);
-        console.log('LoginPage')
-        LoopService.login().then(
-                user => {
-                    const { from } = { from: { pathname: "/" } };
-                    this.props.history.push(from);
-                },
-                error => {
-                  const { from } = { from: { pathname: "/" } };
-                  this.props.history.push(from);
-                  console.log ("Certification login failed");
-                }
-            );
-    }
-    render() {
-      return (
-        <div>
-  			</div>);
-}
-}
