diff --git a/jams-react-client/package-lock.json b/jams-react-client/package-lock.json
index 5eb224ea42f92274a365e0fb5d693f57ad15c1cc..0a7f35fee272e2e38464b2e052331fdd46165d31 100644
--- a/jams-react-client/package-lock.json
+++ b/jams-react-client/package-lock.json
@@ -9359,6 +9359,27 @@
         }
       }
     },
+    "material-ui-popup-state": {
+      "version": "1.6.1",
+      "resolved": "https://registry.npmjs.org/material-ui-popup-state/-/material-ui-popup-state-1.6.1.tgz",
+      "integrity": "sha512-I1Cu8hc3RPPTZ7p946q6qQB+n68JuhoiOxclV+wft8bplYGHFLjbNmF59wQMTN6oRZD42QuVtTxDv7LIi0eB8w==",
+      "requires": {
+        "@babel/runtime": "^7.1.5",
+        "@material-ui/types": "^4.1.1",
+        "classnames": "^2.2.6",
+        "prop-types": "^15.0.0"
+      },
+      "dependencies": {
+        "@material-ui/types": {
+          "version": "4.1.1",
+          "resolved": "https://registry.npmjs.org/@material-ui/types/-/types-4.1.1.tgz",
+          "integrity": "sha512-AN+GZNXytX9yxGi0JOfxHrRTbhFybjUJ05rnsBVjcB+16e466Z0Xe5IxawuOayVZgTBNDxmPKo5j4V6OnMtaSQ==",
+          "requires": {
+            "@types/react": "*"
+          }
+        }
+      }
+    },
     "md5.js": {
       "version": "1.3.5",
       "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
diff --git a/jams-react-client/package.json b/jams-react-client/package.json
index fcef796dd4ea99c01dbc9ffe50331a929f7a3092..21bacc3ab2cfef8ff5a96fca1061785d0d13bfbf 100644
--- a/jams-react-client/package.json
+++ b/jams-react-client/package.json
@@ -12,6 +12,7 @@
     "chartist": "0.10.1",
     "classnames": "2.2.6",
     "history": "4.10.1",
+    "material-ui-popup-state": "^1.6.1",
     "perfect-scrollbar": "1.5.0",
     "prop-types": "15.7.2",
     "react": "16.13.1",
diff --git a/jams-react-client/src/api.js b/jams-react-client/src/api.js
index 243e464975ba1541312f7583269b98f8304561e5..47a685b137e2a8a82d23e949b2b2aad4ddbe3542 100644
--- a/jams-react-client/src/api.js
+++ b/jams-react-client/src/api.js
@@ -62,7 +62,7 @@ export default function configApiCall(api_path, request_type, data, credentials)
         url: url_path + ":" + url_port + api_path,
         method: request_type,
         crossDomain: true,
-        dataType: "json"
+        dataType: "json",
     };
 
     // pass credentials in the header
@@ -102,7 +102,6 @@ export default function configApiCall(api_path, request_type, data, credentials)
             } else {
                 config['headers'] = {
                     "Content-type": "application/json"
-
                 }
             }
 
@@ -113,9 +112,3 @@ export default function configApiCall(api_path, request_type, data, credentials)
     isSearch = false;
     return config;
 }
-
-// function setJWT(value) {
-//     window.localStorage.removeItem('access_token');
-//     window.localStorage.setItem('access_token', value.access_token);
-// }
-
diff --git a/jams-react-client/src/auth.js b/jams-react-client/src/auth.js
index 6dc9a8090cc70e0c3d0798c886c26f80e878af6e..810ad0cdea602dcfcb1f908b36032ad163f313d4 100644
--- a/jams-react-client/src/auth.js
+++ b/jams-react-client/src/auth.js
@@ -1,25 +1,47 @@
 import configApiCall from "api.js";
 import axios from 'axios';
 
-import { api_path_post_install_admin, api_path_post_auth_login } from "globalUrls";
+import { 
+    api_path_post_install_admin, 
+    api_path_post_auth_login,
+    api_path_get_server_status,
+    api_path_get_install_lastKnownStep,
+} from "globalUrls";
 
 class Auth {
     constructor() {
         this.authenticated = false
         this.admin = false
+        this.installed = false
+        this.uri = ''
+    }
+
+    setJWT(access_token) {
+        window.localStorage.removeItem('access_token');
+        window.localStorage.setItem('access_token', access_token);
+    }
+
+    deleteJWT(){
+        window.localStorage.removeItem('access_token');
     }
 
     login(jsonData, cb) {
+        this.deleteJWT()
         axios(configApiCall(api_path_post_auth_login, "POST", jsonData, null)).then((response) => {
-            this.authenticated = true
+            if(response.status == 200){
+                this.setJWT(response.data['access_token'])
+                this.authenticated = true
+            }
             cb()
-        }).catch(() => {
+        }).catch((error) => {
             //setErrorMessage(true);
-            console.log("Error");
+            console.log("Error: " + error);
+            cb()
         });
     }
 
     logout(cb) {
+        this.deleteJWT()
         this.authenticated = false
         cb()
     }
@@ -32,7 +54,6 @@ class Auth {
         axios(configApiCall(api_path_post_install_admin, "GET", null, null)).then((response) => {
             if (response['headers']['showlogin'] == "true") {
                 this.admin = true
-                console.log("True")
             }
             cb()
         }).catch((error) => {
@@ -40,9 +61,40 @@ class Auth {
         });
     }
 
+    isServerInstalled(cb) {
+        axios(configApiCall(api_path_get_server_status, "GET", null, null)).then((response) => {                       
+            if (response.data['installed'] == 'true') {
+                this.installed = true
+                console.log("Server is insalled")
+            } else {
+                this.installed = false
+                console.log("Server is not insalled")
+            }
+            cb()
+        }).catch((error) => {
+            console.log("Error during API request on checkServerIsInstalled: " + error);
+        });
+    }
+
+    checkLastKnowStep(cb) {
+        axios(configApiCall(api_path_get_install_lastKnownStep, 'GET', null, null)).then((response) => {
+            this.uri = response.data['uri']
+            this.authenticated = true
+            cb()
+        }).catch((error) => {
+            console.log("Error during API request on checkLastKnowStep: " + error);
+            this.authenticated = false
+            cb()
+        })
+    }
+
     hasAdmin() {
         return this.admin
     }
+
+    isInstalled() {
+        return this.installed
+    }
 }
 
 export default new Auth()
\ No newline at end of file
diff --git a/jams-react-client/src/components/CaSetup/CaSetup.js b/jams-react-client/src/components/CaSetup/CaSetup.js
new file mode 100644
index 0000000000000000000000000000000000000000..09226fb70401ee700a0d2f4d907bbe4d86326029
--- /dev/null
+++ b/jams-react-client/src/components/CaSetup/CaSetup.js
@@ -0,0 +1,281 @@
+import React from 'react';
+import {useHistory} from "react-router-dom";
+import Button from '@material-ui/core/Button';
+import TextField from '@material-ui/core/TextField';
+import { makeStyles } from '@material-ui/core/styles';
+
+import CountrySelect from "components/CountrySelect/CountrySelect.js";
+import CustomizedSteppers from '../CustomizedSteppers/CustomizedSteppers'
+
+import auth from '../../auth'
+import axios from 'axios';
+import configApiCall from '../../api'
+import { api_path_post_install_ca } from '../../globalUrls'
+import Select from "@material-ui/core/Select";
+import buildSelectMenuItems from "../../tools";
+import Input from "@material-ui/core/Input";
+import Typography from "@material-ui/core/Typography";
+
+const useStyles = makeStyles((theme) => ({
+    paper: {
+        marginTop: theme.spacing(8),
+        display: 'flex',
+        flexDirection: 'column',
+        alignItems: 'center',
+    },
+    avatar: {
+        margin: theme.spacing(1),
+        backgroundColor: theme.palette.secondary.main,
+    },
+    form: {
+        width: '100%', // Fix IE 11 issue.
+        marginTop: theme.spacing(1),
+    },
+    submit: {
+        margin: theme.spacing(3, 0, 2),
+    },
+}));
+
+export default function CaSetup(props) {
+    const history = useHistory();
+    const [error, setError] = React.useState(false);
+    const [errorMessage, setErrorMessage] = React.useState("");
+
+    const getCertificateOptions = [
+        {value: 0, label: "Create a self-signed Certificate Authority"},
+        {value: 1, label: "Import existing Certificate Authority"},
+    ];
+
+    const validityPeriods = [
+        {value: 157784630000, label: "5 years"},
+        {value: 315569260000, label: "10 years"},
+    ];
+
+    const certificateOptionsItems = buildSelectMenuItems(getCertificateOptions);
+    const validityPeriodsItems = buildSelectMenuItems(validityPeriods);
+    const classes = useStyles();
+
+    const [commonname, setCommonName] = React.useState("");
+    const [state, setState] = React.useState("");
+    const [city, setCity] = React.useState("");
+    const [organization, setOrganization] = React.useState("");
+    const [organizationUnit, setOrganizationUnit] = React.useState("");
+    const [country, setCountry] = React.useState("");
+    const [certificateFile, setCertificateFile] = React.useState("");
+    const [privKeyFile, setPrivKeyFile] = React.useState("");
+
+
+
+
+    const [certificateOpt, setCertificateOpt] = React.useState(getCertificateOptions[0]);
+    const [validityPeriod, setValidityPeriod] = React.useState(validityPeriods[0]);
+
+
+    function handleInstallCA(data) {
+        if(data.status == 500 || data.status == 512 || data.status == 513) {
+            props.setError(true)
+            props.setErrorMessage("An unknown error occurred while installing the CA. Please try again.");
+        }
+        else if (data.status == 200){
+            auth.uri = '/api/install/auth';
+            history.push('/');
+        }
+
+    }
+
+    function onCountryChange(values) {
+        setCountry(values['country'].label);
+    }
+
+    const handleCertifOptionChange = (event) => {
+        props.setError(false);
+        setCertificateOpt(getCertificateOptions[event.target.value]);
+    };
+
+    const handleValidPeriodChange = (event) => {
+        props.setError(false);
+        setValidityPeriod(validityPeriods[event.target.value]);
+    };
+
+    const handleCertificateFileChange = (event) => {
+        console.log(certificateFile);
+        setCertificateFile(event.target.files[0])
+        console.log(certificateFile);
+
+    }
+
+    const handlePrivKeyFileChange = (event) => {
+        setPrivKeyFile(event.target.files[0])
+    }
+
+    function handleSubmit(e) {
+        e.preventDefault();
+        let jsonData = {};
+        if(certificateOpt.value == 0){
+            jsonData = {
+                'commonName': commonname,
+                'organizationalUnit': organizationUnit,
+                'organization': organization,
+                'city': city,
+                'state': state,
+                'country': country,
+                'lifetime': validityPeriod.value
+            }
+        }
+        else if(certificateOpt.value == 1){
+            jsonData = {
+                'caCertificate': certificateFile,
+                'caKey': privKeyFile
+            }
+            console.log(certificateFile);
+            console.log(privKeyFile);
+        }
+
+        axios(configApiCall(api_path_post_install_ca, "POST", jsonData, null)).then((response)=>{
+            handleInstallCA(response);
+            console.log(response);
+        }).catch((error)=>{
+            props.setError(error);
+            console.log('Error creating admin account: ' + error );
+        })
+    }
+    if(certificateOpt.value == 0){
+        return (
+            <form className={classes.form} noValidate onSubmit={handleSubmit}>
+                <h4>
+                    Select an option for setting-up the certificate authority that will be used to sign all Jami accounts generated on this JAMS instance.
+                </h4>
+                <Select
+                    labelId="demo-simple-select-label"
+                    fullWidth
+                    value={certificateOpt.value}
+                    onChange={handleCertifOptionChange}
+                    variant="outlined"
+                    children={certificateOptionsItems}
+                />
+
+                <TextField
+                    variant="outlined"
+                    margin="normal"
+                    required
+                    fullWidth
+                    id="commonname"
+                    label="Common Name"
+                    name="commonname"
+                    autoComplete="commonname"
+                    autoFocus
+                    onChange={e => setCommonName(e.target.value)}
+                />
+
+                <CountrySelect onCountryChange={onCountryChange} />
+
+                <TextField
+                    variant="outlined"
+                    margin="normal"
+                    required
+                    fullWidth
+                    name="state"
+                    label="State"
+                    id="state"
+                    autoComplete="state"
+                    onChange={e => setState(e.target.value)}
+                />
+                <TextField
+                    variant="outlined"
+                    margin="normal"
+                    required
+                    fullWidth
+                    name="city"
+                    label="City"
+                    id="city"
+                    autoComplete="city"
+                    onChange={e => setCity(e.target.value)}
+                />
+                <TextField
+                    variant="outlined"
+                    margin="normal"
+                    required
+                    fullWidth
+                    name="organization"
+                    label="Organization"
+                    id="organization"
+                    autoComplete="organization"
+                    onChange={e => setOrganization(e.target.value)}
+                />
+                <TextField
+                    variant="outlined"
+                    margin="normal"
+                    required
+                    fullWidth
+                    name="organizationunit"
+                    label="Organization Unit"
+                    id="organizationunit"
+                    autoComplete="organizationunit"
+                    onChange={e => setOrganizationUnit(e.target.value)}
+                />
+                <Select
+                    labelId="demo-simple-select-label"
+                    margin="normal"
+                    fullWidth
+                    variant="outlined"
+                    value={validityPeriod.value}
+                    onChange={handleValidPeriodChange}
+                    variant="outlined"
+                    children={validityPeriodsItems}
+                />
+
+                <Button
+                    type="submit"
+                    fullWidth
+                    variant="contained"
+                    color="primary"
+                    className={classes.submit}
+                >
+                    Generate Self-Signed Certificate Authority
+                </Button>
+
+            </form>
+        );
+    }
+    else if(certificateOpt.value == 1){
+        return (
+            <form className={classes.form} noValidate onSubmit={handleSubmit}>
+                <h4>
+                    Select an option for setting-up the certificate authority that will be used to sign all Jami accounts generated on this JAMS instance.
+                </h4>
+
+                <Select
+                    labelId="demo-simple-select-label"
+                    fullWidth
+                    value={certificateOpt.value}
+                    onChange={handleCertifOptionChange}
+                    variant="outlined"
+                    children={certificateOptionsItems}
+                />
+                <Typography variant="subtitle1" gutterBottom >CA file (PEM-encoded)</Typography>
+                <Input
+                    fullWidth
+                    type="file"
+                    onChange={handleCertificateFileChange}
+                />
+                <Typography variant="subtitle1" gutterBottom >Key File (PEM-encoded)</Typography>
+                <Input
+                    fullWidth
+                    type="file"
+                    onChange={handlePrivKeyFileChange}
+                />
+
+                <Button
+                    type="submit"
+                    fullWidth
+                    variant="contained"
+                    color="primary"
+                    className={classes.submit}
+                >
+                    Import Certificate Authority
+                </Button>
+
+            </form>
+        );
+    }
+}
\ No newline at end of file
diff --git a/jams-react-client/src/components/CountrySelect/CountrySelect.js b/jams-react-client/src/components/CountrySelect/CountrySelect.js
new file mode 100644
index 0000000000000000000000000000000000000000..d98a3b067edc559eaeed5e94cc8a47b17b0f10bc
--- /dev/null
+++ b/jams-react-client/src/components/CountrySelect/CountrySelect.js
@@ -0,0 +1,316 @@
+import React from 'react';
+import TextField from '@material-ui/core/TextField';
+import Autocomplete from '@material-ui/lab/Autocomplete';
+import { makeStyles } from '@material-ui/core/styles';
+
+// ISO 3166-1 alpha-2
+// ⚠️ No support for IE 11
+function countryToFlag(isoCode) {
+    return typeof String.fromCodePoint !== 'undefined'
+        ? isoCode
+            .toUpperCase()
+            .replace(/./g, (char) => String.fromCodePoint(char.charCodeAt(0) + 127397))
+        : isoCode;
+}
+
+const useStyles = makeStyles({
+    option: {
+        fontSize: 15,
+        '& > span': {
+            marginRight: 10,
+            fontSize: 18,
+        },
+    },
+});
+
+export default function CountrySelect(props) {
+    const classes = useStyles();
+
+    const handleCountryChange = (event, values) => {
+        props.onCountryChange({
+            "country": values
+        });
+    };
+
+    return (
+        <Autocomplete
+            id="country-select-demo"
+            options={countries}
+            classes={{
+                option: classes.option,
+            }}
+            onChange={handleCountryChange}
+            autoHighlight
+            getOptionLabel={(option) => countryToFlag(option.code) + " "+ option.label}
+            renderOption={(option) => (
+                <React.Fragment>
+                    <span>{countryToFlag(option.code)}</span>
+                    {option.label}
+                </React.Fragment>
+            )}
+            renderInput={(params) => (
+                <TextField
+                    {...params}
+                    label="Choose a country"
+                    variant="outlined"
+                    inputProps={{
+                        ...params.inputProps,
+                        autoComplete: 'new-password', // disable autocomplete and autofill
+                    }}
+                />
+            )}
+        />
+    );
+}
+
+// From https://bitbucket.org/atlassian/atlaskit-mk-2/raw/4ad0e56649c3e6c973e226b7efaeb28cb240ccb0/packages/core/select/src/data/countries.js
+const countries = [
+    { code: 'AD', label: 'Andorra' },
+    { code: 'AE', label: 'United Arab Emirates' },
+    { code: 'AF', label: 'Afghanistan' },
+    { code: 'AG', label: 'Antigua and Barbuda' },
+    { code: 'AI', label: 'Anguilla' },
+    { code: 'AL', label: 'Albania' },
+    { code: 'AM', label: 'Armenia' },
+    { code: 'AO', label: 'Angola' },
+    { code: 'AQ', label: 'Antarctica' },
+    { code: 'AR', label: 'Argentina' },
+    { code: 'AS', label: 'American Samoa' },
+    { code: 'AT', label: 'Austria' },
+    { code: 'AU', label: 'Australia', suggested: true },
+    { code: 'AW', label: 'Aruba' },
+    { code: 'AX', label: 'Alland Islands' },
+    { code: 'AZ', label: 'Azerbaijan' },
+    { code: 'BA', label: 'Bosnia and Herzegovina' },
+    { code: 'BB', label: 'Barbados' },
+    { code: 'BD', label: 'Bangladesh' },
+    { code: 'BE', label: 'Belgium' },
+    { code: 'BF', label: 'Burkina Faso' },
+    { code: 'BG', label: 'Bulgaria' },
+    { code: 'BH', label: 'Bahrain' },
+    { code: 'BI', label: 'Burundi' },
+    { code: 'BJ', label: 'Benin' },
+    { code: 'BL', label: 'Saint Barthelemy' },
+    { code: 'BM', label: 'Bermuda' },
+    { code: 'BN', label: 'Brunei Darussalam' },
+    { code: 'BO', label: 'Bolivia' },
+    { code: 'BR', label: 'Brazil' },
+    { code: 'BS', label: 'Bahamas' },
+    { code: 'BT', label: 'Bhutan' },
+    { code: 'BV', label: 'Bouvet Island' },
+    { code: 'BW', label: 'Botswana' },
+    { code: 'BY', label: 'Belarus' },
+    { code: 'BZ', label: 'Belize' },
+    { code: 'CA', label: 'Canada', suggested: true },
+    { code: 'CC', label: 'Cocos (Keeling) Islands' },
+    { code: 'CD', label: 'Congo, Democratic Republic of the' },
+    { code: 'CF', label: 'Central African Republic' },
+    { code: 'CG', label: 'Congo, Republic of the' },
+    { code: 'CH', label: 'Switzerland' },
+    { code: 'CI', label: "Cote d'Ivoire" },
+    { code: 'CK', label: 'Cook Islands' },
+    { code: 'CL', label: 'Chile' },
+    { code: 'CM', label: 'Cameroon' },
+    { code: 'CN', label: 'China' },
+    { code: 'CO', label: 'Colombia' },
+    { code: 'CR', label: 'Costa Rica' },
+    { code: 'CU', label: 'Cuba' },
+    { code: 'CV', label: 'Cape Verde' },
+    { code: 'CW', label: 'Curacao' },
+    { code: 'CX', label: 'Christmas Island' },
+    { code: 'CY', label: 'Cyprus' },
+    { code: 'CZ', label: 'Czech Republic' },
+    { code: 'DE', label: 'Germany', suggested: true },
+    { code: 'DJ', label: 'Djibouti' },
+    { code: 'DK', label: 'Denmark' },
+    { code: 'DM', label: 'Dominica' },
+    { code: 'DO', label: 'Dominican Republic' },
+    { code: 'DZ', label: 'Algeria' },
+    { code: 'EC', label: 'Ecuador' },
+    { code: 'EE', label: 'Estonia' },
+    { code: 'EG', label: 'Egypt' },
+    { code: 'EH', label: 'Western Sahara' },
+    { code: 'ER', label: 'Eritrea' },
+    { code: 'ES', label: 'Spain' },
+    { code: 'ET', label: 'Ethiopia' },
+    { code: 'FI', label: 'Finland' },
+    { code: 'FJ', label: 'Fiji' },
+    { code: 'FK', label: 'Falkland Islands (Malvinas)' },
+    { code: 'FM', label: 'Micronesia, Federated States of' },
+    { code: 'FO', label: 'Faroe Islands' },
+    { code: 'FR', label: 'France', suggested: true },
+    { code: 'GA', label: 'Gabon' },
+    { code: 'GB', label: 'United Kingdom' },
+    { code: 'GD', label: 'Grenada' },
+    { code: 'GE', label: 'Georgia' },
+    { code: 'GF', label: 'French Guiana' },
+    { code: 'GG', label: 'Guernsey' },
+    { code: 'GH', label: 'Ghana' },
+    { code: 'GI', label: 'Gibraltar' },
+    { code: 'GL', label: 'Greenland' },
+    { code: 'GM', label: 'Gambia' },
+    { code: 'GN', label: 'Guinea' },
+    { code: 'GP', label: 'Guadeloupe' },
+    { code: 'GQ', label: 'Equatorial Guinea' },
+    { code: 'GR', label: 'Greece' },
+    { code: 'GS', label: 'South Georgia and the South Sandwich Islands' },
+    { code: 'GT', label: 'Guatemala' },
+    { code: 'GU', label: 'Guam' },
+    { code: 'GW', label: 'Guinea-Bissau' },
+    { code: 'GY', label: 'Guyana' },
+    { code: 'HK', label: 'Hong Kong' },
+    { code: 'HM', label: 'Heard Island and McDonald Islands' },
+    { code: 'HN', label: 'Honduras' },
+    { code: 'HR', label: 'Croatia' },
+    { code: 'HT', label: 'Haiti' },
+    { code: 'HU', label: 'Hungary' },
+    { code: 'ID', label: 'Indonesia' },
+    { code: 'IE', label: 'Ireland' },
+    { code: 'IL', label: 'Israel' },
+    { code: 'IM', label: 'Isle of Man' },
+    { code: 'IN', label: 'India' },
+    { code: 'IO', label: 'British Indian Ocean Territory' },
+    { code: 'IQ', label: 'Iraq' },
+    { code: 'IR', label: 'Iran, Islamic Republic of' },
+    { code: 'IS', label: 'Iceland' },
+    { code: 'IT', label: 'Italy' },
+    { code: 'JE', label: 'Jersey' },
+    { code: 'JM', label: 'Jamaica' },
+    { code: 'JO', label: 'Jordan' },
+    { code: 'JP', label: 'Japan', suggested: true },
+    { code: 'KE', label: 'Kenya' },
+    { code: 'KG', label: 'Kyrgyzstan' },
+    { code: 'KH', label: 'Cambodia' },
+    { code: 'KI', label: 'Kiribati' },
+    { code: 'KM', label: 'Comoros' },
+    { code: 'KN', label: 'Saint Kitts and Nevis' },
+    { code: 'KP', label: "Korea, Democratic People's Republic of" },
+    { code: 'KR', label: 'Korea, Republic of' },
+    { code: 'KW', label: 'Kuwait' },
+    { code: 'KY', label: 'Cayman Islands' },
+    { code: 'KZ', label: 'Kazakhstan' },
+    { code: 'LA', label: "Lao People's Democratic Republic" },
+    { code: 'LB', label: 'Lebanon' },
+    { code: 'LC', label: 'Saint Lucia' },
+    { code: 'LI', label: 'Liechtenstein' },
+    { code: 'LK', label: 'Sri Lanka' },
+    { code: 'LR', label: 'Liberia' },
+    { code: 'LS', label: 'Lesotho' },
+    { code: 'LT', label: 'Lithuania' },
+    { code: 'LU', label: 'Luxembourg' },
+    { code: 'LV', label: 'Latvia' },
+    { code: 'LY', label: 'Libya' },
+    { code: 'MA', label: 'Morocco' },
+    { code: 'MC', label: 'Monaco' },
+    { code: 'MD', label: 'Moldova, Republic of' },
+    { code: 'ME', label: 'Montenegro' },
+    { code: 'MF', label: 'Saint Martin (French part)' },
+    { code: 'MG', label: 'Madagascar' },
+    { code: 'MH', label: 'Marshall Islands' },
+    { code: 'MK', label: 'Macedonia, the Former Yugoslav Republic of' },
+    { code: 'ML', label: 'Mali' },
+    { code: 'MM', label: 'Myanmar' },
+    { code: 'MN', label: 'Mongolia' },
+    { code: 'MO', label: 'Macao' },
+    { code: 'MP', label: 'Northern Mariana Islands' },
+    { code: 'MQ', label: 'Martinique' },
+    { code: 'MR', label: 'Mauritania' },
+    { code: 'MS', label: 'Montserrat' },
+    { code: 'MT', label: 'Malta' },
+    { code: 'MU', label: 'Mauritius' },
+    { code: 'MV', label: 'Maldives' },
+    { code: 'MW', label: 'Malawi' },
+    { code: 'MX', label: 'Mexico' },
+    { code: 'MY', label: 'Malaysia' },
+    { code: 'MZ', label: 'Mozambique' },
+    { code: 'NA', label: 'Namibia' },
+    { code: 'NC', label: 'New Caledonia' },
+    { code: 'NE', label: 'Niger' },
+    { code: 'NF', label: 'Norfolk Island' },
+    { code: 'NG', label: 'Nigeria' },
+    { code: 'NI', label: 'Nicaragua' },
+    { code: 'NL', label: 'Netherlands' },
+    { code: 'NO', label: 'Norway' },
+    { code: 'NP', label: 'Nepal' },
+    { code: 'NR', label: 'Nauru' },
+    { code: 'NU', label: 'Niue' },
+    { code: 'NZ', label: 'New Zealand' },
+    { code: 'OM', label: 'Oman' },
+    { code: 'PA', label: 'Panama' },
+    { code: 'PE', label: 'Peru' },
+    { code: 'PF', label: 'French Polynesia' },
+    { code: 'PG', label: 'Papua New Guinea' },
+    { code: 'PH', label: 'Philippines' },
+    { code: 'PK', label: 'Pakistan' },
+    { code: 'PL', label: 'Poland' },
+    { code: 'PM', label: 'Saint Pierre and Miquelon' },
+    { code: 'PN', label: 'Pitcairn' },
+    { code: 'PR', label: 'Puerto Rico' },
+    { code: 'PS', label: 'Palestine, State of' },
+    { code: 'PT', label: 'Portugal' },
+    { code: 'PW', label: 'Palau' },
+    { code: 'PY', label: 'Paraguay' },
+    { code: 'QA', label: 'Qatar' },
+    { code: 'RE', label: 'Reunion' },
+    { code: 'RO', label: 'Romania' },
+    { code: 'RS', label: 'Serbia' },
+    { code: 'RU', label: 'Russian Federation' },
+    { code: 'RW', label: 'Rwanda' },
+    { code: 'SA', label: 'Saudi Arabia' },
+    { code: 'SB', label: 'Solomon Islands' },
+    { code: 'SC', label: 'Seychelles' },
+    { code: 'SD', label: 'Sudan' },
+    { code: 'SE', label: 'Sweden' },
+    { code: 'SG', label: 'Singapore' },
+    { code: 'SH', label: 'Saint Helena' },
+    { code: 'SI', label: 'Slovenia' },
+    { code: 'SJ', label: 'Svalbard and Jan Mayen' },
+    { code: 'SK', label: 'Slovakia' },
+    { code: 'SL', label: 'Sierra Leone' },
+    { code: 'SM', label: 'San Marino' },
+    { code: 'SN', label: 'Senegal' },
+    { code: 'SO', label: 'Somalia' },
+    { code: 'SR', label: 'Suriname' },
+    { code: 'SS', label: 'South Sudan' },
+    { code: 'ST', label: 'Sao Tome and Principe' },
+    { code: 'SV', label: 'El Salvador' },
+    { code: 'SX', label: 'Sint Maarten (Dutch part)' },
+    { code: 'SY', label: 'Syrian Arab Republic' },
+    { code: 'SZ', label: 'Swaziland' },
+    { code: 'TC', label: 'Turks and Caicos Islands' },
+    { code: 'TD', label: 'Chad' },
+    { code: 'TF', label: 'French Southern Territories' },
+    { code: 'TG', label: 'Togo' },
+    { code: 'TH', label: 'Thailand' },
+    { code: 'TJ', label: 'Tajikistan' },
+    { code: 'TK', label: 'Tokelau' },
+    { code: 'TL', label: 'Timor-Leste' },
+    { code: 'TM', label: 'Turkmenistan' },
+    { code: 'TN', label: 'Tunisia' },
+    { code: 'TO', label: 'Tonga' },
+    { code: 'TR', label: 'Turkey' },
+    { code: 'TT', label: 'Trinidad and Tobago' },
+    { code: 'TV', label: 'Tuvalu' },
+    { code: 'TW', label: 'Taiwan, Province of China' },
+    { code: 'TZ', label: 'United Republic of Tanzania' },
+    { code: 'UA', label: 'Ukraine' },
+    { code: 'UG', label: 'Uganda' },
+    { code: 'US', label: 'United States', suggested: true },
+    { code: 'UY', label: 'Uruguay' },
+    { code: 'UZ', label: 'Uzbekistan' },
+    { code: 'VA', label: 'Holy See (Vatican City State)' },
+    { code: 'VC', label: 'Saint Vincent and the Grenadines' },
+    { code: 'VE', label: 'Venezuela' },
+    { code: 'VG', label: 'British Virgin Islands' },
+    { code: 'VI', label: 'US Virgin Islands' },
+    { code: 'VN', label: 'Vietnam' },
+    { code: 'VU', label: 'Vanuatu' },
+    { code: 'WF', label: 'Wallis and Futuna' },
+    { code: 'WS', label: 'Samoa' },
+    { code: 'XK', label: 'Kosovo' },
+    { code: 'YE', label: 'Yemen' },
+    { code: 'YT', label: 'Mayotte' },
+    { code: 'ZA', label: 'South Africa' },
+    { code: 'ZM', label: 'Zambia' },
+    { code: 'ZW', label: 'Zimbabwe' },
+];
\ No newline at end of file
diff --git a/jams-react-client/src/components/CreateAdmin/CreateAdmin.js b/jams-react-client/src/components/CreateAdmin/CreateAdmin.js
new file mode 100644
index 0000000000000000000000000000000000000000..0a07914c47fe2a3059e0c607ddb26c5233fea93a
--- /dev/null
+++ b/jams-react-client/src/components/CreateAdmin/CreateAdmin.js
@@ -0,0 +1,145 @@
+import React from 'react';
+import { useHistory } from "react-router-dom";
+import Avatar from '@material-ui/core/Avatar';
+import Button from '@material-ui/core/Button';
+import CssBaseline from '@material-ui/core/CssBaseline';
+import TextField from '@material-ui/core/TextField';
+import FormControlLabel from '@material-ui/core/FormControlLabel';
+import Checkbox from '@material-ui/core/Checkbox';
+import Link from '@material-ui/core/Link';
+import Grid from '@material-ui/core/Grid';
+import Box from '@material-ui/core/Box';
+import LockOutlinedIcon from '@material-ui/icons/LockOutlined';
+import Typography from '@material-ui/core/Typography';
+import { makeStyles } from '@material-ui/core/styles';
+import Container from '@material-ui/core/Container';
+import MuiAlert from '@material-ui/lab/Alert';
+
+import axios from 'axios';
+import configApiCall from '../../api'
+import { api_path_post_install_admin } from '../../globalUrls'
+
+import auth from '../../auth'
+
+const useStyles = makeStyles((theme) => ({
+    paper: {
+        marginTop: theme.spacing(8),
+        display: 'flex',
+        flexDirection: 'column',
+        alignItems: 'center',
+    },
+    avatar: {
+        margin: theme.spacing(1),
+        backgroundColor: theme.palette.secondary.main,
+    },
+    form: {
+        width: '100%', // Fix IE 11 issue.
+        marginTop: theme.spacing(1),
+    },
+    submit: {
+        margin: theme.spacing(3, 0, 2),
+    },
+}));
+
+export default function CreateAdmin(props) {
+    const classes = useStyles();
+    const history = useHistory();
+    const [username, setUsername] = React.useState("");
+    const [password, setPassword] = React.useState("");
+    const [confirmPassword, setConfirmPassword] = React.useState("");
+    const [error, setError] = React.useState(props.error);
+    const [errorMessage, setErrorMessage] = React.useState(props.errorMessage);
+
+    function createAdminCallBackHandler(response) {
+        auth.setJWT(response.data['access_token'])
+        auth.admin = true
+        auth.authenticated = true
+        auth.uri = 'start'
+        history.push('/');
+    }
+
+    function handleSubmit(e) {
+        e.preventDefault();
+        const jsonData = {
+            "username": username,
+            "password": password
+        }
+
+        if(password != confirmPassword) {
+            props.setErrorMessage("Passwords didn't match !");
+            props.setError(true)
+        }else {
+
+            axios(configApiCall(api_path_post_install_admin, "PUT", jsonData, null)).then((response)=>{
+                createAdminCallBackHandler(response);
+            }).catch((error)=>{
+                props.setErrorMessage(error)
+                props.setError(true)
+            })
+        }
+    }
+
+    return (
+        <form className={classes.form} noValidate onSubmit={handleSubmit}>
+            <Typography variant="h5" gutterBottom color="primary">Create Administrator</Typography>
+            <Grid container spacing={3}>
+                <Grid item xs={12}>
+                        <TextField
+                            variant="outlined"
+                            margin="normal"
+                            required
+                            fullWidth
+                            id="username"
+                            label="Username"
+                            name="username"
+                            autoComplete="email"
+                            autoFocus
+                            onChange={e => setUsername(e.target.value)}
+                        />
+                </Grid>
+                <Grid item xs={6}>
+                    <TextField
+                        variant="outlined"
+                        margin="normal"
+                        required
+                        fullWidth
+                        name="password"
+                        label="Password"
+                        type="password"
+                        id="password"
+                        autoComplete="current-password"
+                        onChange={e => setPassword(e.target.value)}
+                    />
+                </Grid>
+
+                <Grid item xs={6}>
+
+                <TextField
+                        variant="outlined"
+                        margin="normal"
+                        required
+                        fullWidth
+                        name="confirmPassword"
+                        label="Confirm password"
+                        type="password"
+                        id="confirmPassword"
+                        autoComplete="current-password"
+                        onChange={e => setConfirmPassword(e.target.value)}
+                    />
+
+                </Grid>
+            </Grid>
+
+            <Button
+                type="submit"
+                fullWidth
+                variant="contained"
+                color="primary"
+                className={classes.submit}
+            >
+                Continue
+            </Button>
+
+        </form>
+    );
+}
\ No newline at end of file
diff --git a/jams-react-client/src/components/CustomPopupState/CustomPopupState.js b/jams-react-client/src/components/CustomPopupState/CustomPopupState.js
new file mode 100644
index 0000000000000000000000000000000000000000..09d69ee7b2b5dac54f238b4d9f289a28ed78b8fe
--- /dev/null
+++ b/jams-react-client/src/components/CustomPopupState/CustomPopupState.js
@@ -0,0 +1,40 @@
+import React from 'react';
+import InfoIcon from '@material-ui/icons/Info';
+import Popover from '@material-ui/core/Popover';
+import PopupState, { bindTrigger, bindPopover } from 'material-ui-popup-state';
+import IconButton from '@material-ui/core/IconButton';
+import Box from '@material-ui/core/Box';
+import Typography from '@material-ui/core/Typography';
+
+
+export default function CustomPopupState(props) {
+
+    const [message, setMessage] = React.useState(props.message);
+    return(
+<IconButton>
+
+<PopupState variant="popover" popupId="demo-popup-popover">
+    {(popupState) => (
+        <div>
+        <InfoIcon color="primary" fontSize="small" {...bindTrigger(popupState)} />
+        <Popover
+            {...bindPopover(popupState)}
+            anchorOrigin={{
+            vertical: 'top',
+            horizontal: 'left',
+            }}
+            transformOrigin={{
+            vertical: 'bottom',
+            horizontal: 'left',
+            }}
+        >
+            <Box p={1}>
+        <Typography>{message}</Typography>
+            </Box>
+        </Popover>
+        </div>
+    )}
+</PopupState>
+</IconButton>
+    );
+}
\ No newline at end of file
diff --git a/jams-react-client/src/components/CustomizedSteppers/CustomizedSteppers.js b/jams-react-client/src/components/CustomizedSteppers/CustomizedSteppers.js
new file mode 100644
index 0000000000000000000000000000000000000000..9bbb31dbbcd1016eb532a3405eb051ad725442ea
--- /dev/null
+++ b/jams-react-client/src/components/CustomizedSteppers/CustomizedSteppers.js
@@ -0,0 +1,171 @@
+import React from 'react';
+import PropTypes from 'prop-types';
+import { makeStyles, withStyles } from '@material-ui/core/styles';
+import clsx from 'clsx';
+import Stepper from '@material-ui/core/Stepper';
+import Step from '@material-ui/core/Step';
+import StepLabel from '@material-ui/core/StepLabel';
+import Check from '@material-ui/icons/Check';
+import SettingsIcon from '@material-ui/icons/Settings';
+import GroupAddIcon from '@material-ui/icons/GroupAdd';
+import VideoLabelIcon from '@material-ui/icons/VideoLabel';
+import StepConnector from '@material-ui/core/StepConnector';
+import Button from '@material-ui/core/Button';
+import Typography from '@material-ui/core/Typography';
+
+
+const useQontoStepIconStyles = makeStyles({
+  root: {
+    color: '#eaeaf0',
+    display: 'flex',
+    height: 22,
+    alignItems: 'center',
+  },
+  active: {
+    color: '#784af4',
+  },
+  circle: {
+    width: 8,
+    height: 8,
+    borderRadius: '50%',
+    backgroundColor: 'currentColor',
+  },
+  completed: {
+    color: '#784af4',
+    zIndex: 1,
+    fontSize: 18,
+  },
+});
+
+function QontoStepIcon(props) {
+  const classes = useQontoStepIconStyles();
+  const { active, completed } = props;
+
+  return (
+    <div
+      className={clsx(classes.root, {
+        [classes.active]: active,
+      })}
+    >
+      {completed ? <Check className={classes.completed} /> : <div className={classes.circle} />}
+    </div>
+  );
+}
+
+QontoStepIcon.propTypes = {
+  /**
+   * Whether this step is active.
+   */
+  active: PropTypes.bool,
+  /**
+   * Mark the step as completed. Is passed to child components.
+   */
+  completed: PropTypes.bool,
+};
+
+const useColorlibStepIconStyles = makeStyles({
+  root: {
+    backgroundColor: '#ccc',
+    zIndex: 1,
+    color: '#fff',
+    width: 50,
+    height: 50,
+    display: 'flex',
+    borderRadius: '50%',
+    justifyContent: 'center',
+    alignItems: 'center',
+  },
+  active: {
+    backgroundImage:
+      'linear-gradient( 136deg, rgb(242,113,33) 0%, rgb(233,64,87) 50%, rgb(138,35,135) 100%)',
+    boxShadow: '0 4px 10px 0 rgba(0,0,0,.25)',
+  },
+  completed: {
+    backgroundImage:
+      'linear-gradient( 136deg, rgb(242,113,33) 0%, rgb(233,64,87) 50%, rgb(138,35,135) 100%)',
+  },
+});
+
+function ColorlibStepIcon(props) {
+  const classes = useColorlibStepIconStyles();
+  const { active, completed } = props;
+
+  const icons = {
+    1: <SettingsIcon />,
+    2: <GroupAddIcon />,
+    3: <VideoLabelIcon />,
+  };
+
+  return (
+    <div
+      className={clsx(classes.root, {
+        [classes.active]: active,
+        [classes.completed]: completed,
+      })}
+    >
+      {icons[String(props.icon)]}
+    </div>
+  );
+}
+
+ColorlibStepIcon.propTypes = {
+  /**
+   * Whether this step is active.
+   */
+  active: PropTypes.bool,
+  /**
+   * Mark the step as completed. Is passed to child components.
+   */
+  completed: PropTypes.bool,
+  /**
+   * The label displayed in the step icon.
+   */
+  icon: PropTypes.node,
+};
+
+const useStyles = makeStyles((theme) => ({
+  root: {
+    width: '100%',
+  },
+  button: {
+    marginRight: theme.spacing(1),
+  },
+  instructions: {
+    marginTop: theme.spacing(1),
+    marginBottom: theme.spacing(1),
+  },
+}));
+
+function getSteps() {
+  return ['Create admin', 'CA Setup', 'Identity Management', 'Server parameters'];
+}
+
+export default function CustomizedSteppers(props) {
+  const classes = useStyles();
+  const [activeStep, setActiveStep] = React.useState(props.step);
+  const steps = getSteps();
+
+  const handleNext = () => {
+    setActiveStep((prevActiveStep) => prevActiveStep + 1);
+  };
+
+  const handleBack = () => {
+    setActiveStep((prevActiveStep) => prevActiveStep - 1);
+  };
+
+  const handleReset = () => {
+    setActiveStep(0);
+  };
+
+  return (
+    <div className={classes.root}>
+      <Stepper alternativeLabel activeStep={activeStep}>
+        {steps.map((label) => (
+          <Step key={label}>
+            <StepLabel>{label}</StepLabel>
+          </Step>
+        ))}
+      </Stepper>
+    </div>
+  );
+}
diff --git a/jams-react-client/src/components/IdentityManagement/AdStorageForm.js b/jams-react-client/src/components/IdentityManagement/AdStorageForm.js
new file mode 100644
index 0000000000000000000000000000000000000000..4ae77f98be2a0d4066c50781398e65d6f4fb8dea
--- /dev/null
+++ b/jams-react-client/src/components/IdentityManagement/AdStorageForm.js
@@ -0,0 +1,99 @@
+import React from 'react';
+import FormControlLabel from '@material-ui/core/FormControlLabel';
+import Checkbox from '@material-ui/core/Checkbox';
+import Typography from '@material-ui/core/Typography';
+import Grid from '@material-ui/core/Grid';
+
+import TextField from '@material-ui/core/TextField';
+import Radio from '@material-ui/core/Radio';
+import RadioGroup from '@material-ui/core/RadioGroup';
+import CustomPopupState from '../CustomPopupState/CustomPopupState'
+
+export default function AdStorageForm(props) {
+
+    return (
+            <Grid container spacing={3}>
+                <Grid item xs={12}>
+                    <Typography variant="subtitle1" gutterBottom color="primary">Active directory server informations</Typography>
+                </Grid>
+                <Grid item xs={6}>
+                    <TextField
+                        variant="outlined"
+                        margin="normal"
+                        required
+                        fullWidth
+                        id="port"
+                        label="Port"
+                        name="port"
+                        autoComplete="port"
+                        autoFocus
+                        onChange={e => props.setPort(e.target.value)}
+                    />
+                </Grid>
+                <Grid item xs={6}>
+                    <TextField
+                        variant="outlined"
+                        margin="normal"
+                        required
+                        fullWidth
+                        id="host"
+                        label="Host"
+                        name="host"
+                        autoComplete="host"
+                        autoFocus
+                        onChange={e => props.setHost(e.target.value)}
+                    />
+                </Grid>
+                <Grid item xs={6}>
+                    <TextField
+                        variant="outlined"
+                        margin="normal"
+                        required
+                        fullWidth
+                        id="adminusername"
+                        label="Admin username"
+                        name="adminusername"
+                        autoComplete="adminusername"
+                        autoFocus
+                        onChange={e => props.setAdminUsername(e.target.value)}
+                    />
+                </Grid>
+                <Grid item xs={6}>
+                    <TextField
+                        variant="outlined"
+                        margin="normal"
+                        required
+                        fullWidth
+                        id="password"
+                        label="Password"
+                        name="password"
+                        autoComplete="password"
+                        type="password"
+                        autoFocus
+                        onChange={e => props.setPassword(e.target.value)}
+                    />
+                </Grid>
+                <Grid item xs={12}>
+                    <TextField
+                        variant="outlined"
+                        margin="normal"
+                        required
+                        fullWidth
+                        id="domainname"
+                        label="Domain Name"
+                        name="domainname"
+                        autoComplete="domainname"
+                        autoFocus
+                        onChange={e => props.setDomainName(e.target.value)}
+                    />
+                </Grid>
+                <Grid item xs={12}>
+                    <Typography variant="subtitle1" gutterBottom color="primary">Use SSL</Typography>
+                    <RadioGroup row aria-label="isSSL" name="isSSL" value={props.isSSL} onChange={props.handleIsSSLChange} >
+                        <FormControlLabel value="true" control={<Radio color="primary"/>} label="Yes" />
+                        <FormControlLabel value="false" control={<Radio color="default"/>} label="No" />
+                    </RadioGroup>
+                </Grid>
+            </Grid>
+    );
+}
\ No newline at end of file
diff --git a/jams-react-client/src/components/IdentityManagement/IdentityManagement.js b/jams-react-client/src/components/IdentityManagement/IdentityManagement.js
new file mode 100644
index 0000000000000000000000000000000000000000..16816abdb16167f6cba34ac89130912af515c60c
--- /dev/null
+++ b/jams-react-client/src/components/IdentityManagement/IdentityManagement.js
@@ -0,0 +1,280 @@
+import React from 'react';
+import { useHistory } from 'react-router-dom';
+import Button from '@material-ui/core/Button';
+import Typography from '@material-ui/core/Typography';
+import Grid from '@material-ui/core/Grid';
+import { makeStyles } from '@material-ui/core/styles';
+import MuiAlert from '@material-ui/lab/Alert';
+import Select from '@material-ui/core/Select';
+
+import buildSelectMenuItems from '../../tools'
+
+import axios from 'axios';
+import configApiCall from '../../api'
+import { api_path_post_install_auth } from '../../globalUrls'
+
+import LocalStorageForm from './LocalStorageForm'
+import LdapForm from './LdapStorageForm'
+import AdStorageForm from './AdStorageForm'
+
+import auth from '../../auth'
+
+
+function Alert(props) {
+    return <MuiAlert elevation={6} variant="filled" {...props} />;
+}
+
+const useStyles = makeStyles((theme) => ({
+    paper: {
+        marginTop: theme.spacing(8),
+        display: 'flex',
+        flexDirection: 'column',
+        alignItems: 'center',
+    },
+    avatar: {
+        margin: theme.spacing(1),
+        backgroundColor: theme.palette.secondary.main,
+    },
+    form: {
+        width: '100%', // Fix IE 11 issue.
+        marginTop: theme.spacing(1),
+    },
+    submit: {
+        margin: theme.spacing(3, 0, 2),
+    },
+}));
+
+export default function IdentityManagement(props) {
+
+    const directoryTypes = [
+        {value: 0, label: "Local Database"},
+        {value: 1, label: "LDAP Server"},
+        {value: 2, label: "Active Directory"},
+    ];
+    
+    const directoryTypesItems = buildSelectMenuItems(directoryTypes);
+
+    const classes = useStyles();
+    const history = useHistory();
+    const [error, setError] = React.useState(false);
+    const [errorMessage, setErrorMessage] = React.useState("");
+    const [directory, setDirectory] = React.useState(directoryTypes[0]);
+
+    /**
+     * General states for LDAP and AD Storages
+     */
+
+    const [adminUsername, setAdminUsername] = React.useState("");
+    const [password, setPassword] = React.useState("");
+
+
+    /**
+     * Local storage Config
+     */
+
+    const [nameServerChecked, setNameServerChecked] = React.useState(false);
+
+    /**
+     * LDAP storage Config
+     * 
+     */
+    const ldapFiltersTypes = [
+        {value: 0, label: "UID"},
+    ];
+
+    const [baseDN, setBaseDN] = React.useState("");
+    const ldapFiltersTypesItems = buildSelectMenuItems(ldapFiltersTypes);
+    const [useStartTLS, setUseStartTLS] = React.useState("false")
+    const [ldapFilter, setLdapFilter] = React.useState(ldapFiltersTypes[0]);
+
+    const handleFilterIdChange = (event) => {
+        setLdapFilter(ldapFiltersTypes[event.target.value]);
+    }
+    const handleUseStartTLSChange = (event) => {
+        setUseStartTLS(event.target.value)
+    }
+    
+    const handleNameServerChange = (event) => {
+        setNameServerChecked(event.target.checked)
+    }
+
+
+    /**
+     * Active Directory Storage Config
+     */
+
+    const [port, setPort] = React.useState("");
+    const [host, setHost] = React.useState("");
+    const [domainName, setDomainName] = React.useState("");
+    const [isSSL, setIsSSL] = React.useState("false")
+
+    const handleIsSSLChange = (event) => {
+        setIsSSL(event.target.value)
+    }
+
+    /**
+     * Form handle submit and server call
+     */
+
+    function setLocalStorageData(){
+        const authSource = {};
+        const settings = {
+            "publicNameServer": "http://ns.jami.net",
+            "publicNames": nameServerChecked
+        };
+    
+        authSource['type'] = 'LOCAL';
+        authSource['localAuthSettings'] = settings;
+        return authSource;
+    }
+
+    function setLdapStorageData(){
+        const authSource = {};
+        const settings = {};
+
+        settings['useStartTLS'] = (useStartTLS === 'true')
+        settings['host'] = host
+        settings['username'] = adminUsername
+        settings['password'] = password
+        settings['baseDN'] = baseDN
+        settings['usernameField'] = ldapFilter.label
+
+        settings['fieldMappings'] = {};
+        settings['fieldMappings']['givenName'] = "FirstName";
+        settings['fieldMappings']['sn'] = "LastName";
+        settings['fieldMappings']['jpegPhoto'] = "ProfilePicture";
+        settings['fieldMappings']['mail'] = "Email";
+        settings['fieldMappings']['telephoneNumber'] = "PhoneNumber";
+        settings['fieldMappings']['mobile'] = "MobileNumber";
+        settings['fieldMappings']['facsimileTelephoneNumber'] = "FaxNumber";
+        settings['fieldMappings']['extensionName'] = "PhoneNumberExtension";
+        settings['fieldMappings']['o'] = "Organization";
+        settings['fieldMappings']['uid'] = "Username";
+      
+        authSource['type'] = 'LDAP';
+        authSource['ldapSettings'] = settings;
+        return authSource;
+    }
+
+    function setAdStorageData(){
+        const authSource = {};
+        const settings = {};
+
+        settings['isSSL'] = (isSSL === 'true')
+        settings['host'] = host
+        settings['port'] = parseInt(port, 10)
+        settings['realm'] = domainName
+        settings['username'] = adminUsername
+        settings['password'] = password
+    
+        settings['fieldMappings'] = {};
+        settings['fieldMappings']['sAMAccountName'] = "Username"
+        settings['fieldMappings']['givenName'] = "FirstName";
+        settings['fieldMappings']['sn'] = "LastName";
+        settings['fieldMappings']['jpegPhoto'] = "ProfilePicture";
+        settings['fieldMappings']['mail'] = "Email";
+        settings['fieldMappings']['telephoneNumber'] = "PhoneNumber";
+        settings['fieldMappings']['mobile'] = "MobileNumber";
+        settings['fieldMappings']['facsimileTelephoneNumber'] = "FaxNumber";
+        settings['fieldMappings']['extensionName'] = "PhoneNumberExtension";
+        settings['fieldMappings']['o'] = "Organization";
+        settings['fieldMappings']['uid'] = "Username";
+    
+        authSource['type'] = 'AD';
+        authSource['activeDirectorySettings'] = settings;
+        return authSource;
+    }
+
+    function callbackIdentityManagement(){
+        auth.uri = '/api/install/settings'
+        history.push('/');
+    }
+
+    function handleSubmit(e) {
+        e.preventDefault();
+
+        let data = {}
+        if(directory.value == 0){
+            data = setLocalStorageData()
+        }else if(directory.value == 1){
+            data = setLdapStorageData()
+        }else{
+            data = setAdStorageData()
+        }
+
+        axios(configApiCall(api_path_post_install_auth,'POST',data,null)).then((response)=>{
+            console.log(response)
+            callbackIdentityManagement()
+        }).catch(()=>{
+            props.setErrorMessage('The information provided appears to be incorrect, the connection to the directory has failed. Please check the information and credentials provided and try again.')
+            props.setError(true)
+        })
+
+    }
+
+    const handleChangeDirectoryType = (event) => {
+        props.setError(false);
+        setDirectory(directoryTypes[event.target.value]);
+    };
+
+    function returnForm(){
+        if(directory.value == 0){
+            return <LocalStorageForm 
+                    nameServerChecked={nameServerChecked}
+                    handleNameServerChange={handleNameServerChange} 
+                    />
+        }else if (directory.value == 1){
+            return <LdapForm 
+                    setAdminUsername={setAdminUsername}
+                    setPassword={setPassword}
+                    setHost={setHost}
+                    setBaseDN={setBaseDN}
+                    useStartTLS={useStartTLS}
+                    handleUseStartTLSChange={handleUseStartTLSChange}
+                    ldapFilter={ldapFilter}
+                    ldapFiltersTypesItems={ldapFiltersTypesItems}
+                    handleFilterIdChange={handleFilterIdChange}
+                    />
+        }else{
+            return <AdStorageForm
+                    setAdminUsername={setAdminUsername}
+                    setPassword={setPassword}
+                    setPort={setPort}
+                    setHost={setHost}
+                    setDomainName={setDomainName}
+                    isSSL={isSSL}
+                    handleIsSSLChange={handleIsSSLChange}
+                    />
+        }
+    }
+
+    return (
+            
+            <form className={classes.form} noValidate onSubmit={handleSubmit}>
+                <Typography variant="h5" gutterBottom color="primary">Identity Management</Typography>
+                <Grid container spacing={3}>
+                    <Grid item xs={12}>
+                        <Typography variant="body1" gutterBottom >Select the type of user directory to be integrated with JAMS</Typography>
+                        <Select
+                        labelId="demo-simple-select-label"
+                        fullWidth
+                        value={directory.value}
+                        onChange={handleChangeDirectoryType}
+                        variant="outlined"
+                        children={directoryTypesItems}
+                        />
+                    </Grid>                    
+                </Grid>
+                {returnForm()}
+                <Button
+                    type="submit"
+                    fullWidth
+                    variant="contained"
+                    color="primary"
+                    className={classes.submit}
+                >
+                    Set identity parameters
+                </Button>
+            </form>
+    );
+}
\ No newline at end of file
diff --git a/jams-react-client/src/components/IdentityManagement/LdapStorageForm.js b/jams-react-client/src/components/IdentityManagement/LdapStorageForm.js
new file mode 100644
index 0000000000000000000000000000000000000000..20e7b17955411d65819aae5ab25039b3f0259066
--- /dev/null
+++ b/jams-react-client/src/components/IdentityManagement/LdapStorageForm.js
@@ -0,0 +1,96 @@
+import React from 'react';
+import FormControlLabel from '@material-ui/core/FormControlLabel';
+import Typography from '@material-ui/core/Typography';
+import Grid from '@material-ui/core/Grid';
+
+import TextField from '@material-ui/core/TextField';
+import Radio from '@material-ui/core/Radio';
+import RadioGroup from '@material-ui/core/RadioGroup';
+import Select from '@material-ui/core/Select';
+import CustomPopupState from '../CustomPopupState/CustomPopupState'
+
+export default function LdapStorageForm(props) {
+    
+    return (
+            <Grid container spacing={3}>
+                <Grid item xs={12}>
+                    <Typography variant="subtitle1" gutterBottom color="primary">LDAP Server informations</Typography>
+                </Grid>
+                <Grid item xs={12}>
+                    <TextField
+                    variant="outlined"
+                    margin="normal"
+                    required
+                    fullWidth
+                    id="servername"
+                    label="Server Address"
+                    name="servername"
+                    autoComplete="servername"
+                    autoFocus
+                    onChange={e => props.setHost(e.target.value)}
+                    />
+                </Grid>
+
+                <Grid item xs={6}>
+                    <TextField
+                    variant="outlined"
+                    margin="normal"
+                    required
+                    fullWidth
+                    id="adminusername"
+                    label="Administrator Username"
+                    name="adminusername"
+                    autoComplete="adminusername"
+                    autoFocus
+                    onChange={e => props.setAdminUsername(e.target.value)}
+                    />
+                </Grid>
+                <Grid item xs={6}>
+                    <TextField
+                        variant="outlined"
+                        margin="normal"
+                        required
+                        fullWidth
+                        id="password"
+                        label="Password"
+                        name="password"
+                        autoComplete="password"
+                        type="password"
+                        autoFocus
+                        onChange={e => props.setPassword(e.target.value)}
+                    />
+                </Grid>
+                <Grid item xs={12}>
+                    <TextField
+                    variant="outlined"
+                    id="basedn"
+                    label="Base DN (Please use LDAP convention)"
+                    name="basedn"
+                    autoComplete="basedn"
+                    required
+                    fullWidth
+                    autoFocus
+                    onChange={e => props.setBaseDN(e.target.value)}
+                />
+                </Grid>
+                <Grid item xs={12}>
+                    <Typography variant="subtitle1" gutterBottom color="primary">Use Start TLS</Typography>
+                    <RadioGroup row aria-label="useStartTLS" name="useStartTLS" value={props.useStartTLS} onChange={props.handleUseStartTLSChange} >
+                        <FormControlLabel value="true" control={<Radio color="primary"/>} label="Yes" />
+                        <FormControlLabel value="false" control={<Radio color="default"/>} label="No" />
+                    </RadioGroup>
+                </Grid>
+                <Grid item xs={12}>
+                    <Typography variant="subtitle1" gutterBottom color="primary">Filter<CustomPopupState message="This is the field in your LDAP structure which contains the username."/></Typography>
+                        <Select
+                        labelId="filter-ldap-select"
+                        fullWidth
+                        value={props.ldapFilter.value}
+                        onChange={props.handleFilterIdChange}
+                        variant="outlined"
+                        children={props.ldapFiltersTypesItems}
+                        />
+                </Grid>
+            </Grid>
+    );
+}
\ No newline at end of file
diff --git a/jams-react-client/src/components/IdentityManagement/LocalStorageForm.js b/jams-react-client/src/components/IdentityManagement/LocalStorageForm.js
new file mode 100644
index 0000000000000000000000000000000000000000..ac410572ce07c41897eb79fc4081e48636447ec7
--- /dev/null
+++ b/jams-react-client/src/components/IdentityManagement/LocalStorageForm.js
@@ -0,0 +1,32 @@
+import React from 'react';
+import FormControlLabel from '@material-ui/core/FormControlLabel';
+import Checkbox from '@material-ui/core/Checkbox';
+import Typography from '@material-ui/core/Typography';
+import Grid from '@material-ui/core/Grid';
+import CustomPopupState from '../CustomPopupState/CustomPopupState'
+
+
+export default function LocalStorageForm(props) {
+    
+    return (
+            <Grid container spacing={3}>
+                <Grid item xs={12}>
+                    <Typography variant="subtitle1" gutterBottom color="primary">Advanced settings</Typography>
+                </Grid>
+                <Grid item xs={12}>
+                    <FormControlLabel
+                    control={
+                        <Checkbox
+                        checked={props.nameServerChecked}
+                        onChange={props.handleNameServerChange}
+                        inputProps={{ 'aria-label': 'primary checkbox' }}
+                        color="primary"
+                        />
+                    }
+                    label="Use public nameserver"
+                    />
+                    <CustomPopupState message="Check this box if you want to register your usernames on Jami's public nameserver."/>
+                </Grid>
+            </Grid>
+    );
+}
\ No newline at end of file
diff --git a/jams-react-client/src/components/ServerParameters/ServerParameters.js b/jams-react-client/src/components/ServerParameters/ServerParameters.js
new file mode 100644
index 0000000000000000000000000000000000000000..d178aff4066a8c2d1798927e102f1f86ed081ade
--- /dev/null
+++ b/jams-react-client/src/components/ServerParameters/ServerParameters.js
@@ -0,0 +1,206 @@
+import React from 'react';
+import Avatar from '@material-ui/core/Avatar';
+import Button from '@material-ui/core/Button';
+import CssBaseline from '@material-ui/core/CssBaseline';
+import TextField from '@material-ui/core/TextField';
+import FormControlLabel from '@material-ui/core/FormControlLabel';
+import Checkbox from '@material-ui/core/Checkbox';
+import Link from '@material-ui/core/Link';
+import Grid from '@material-ui/core/Grid';
+import Box from '@material-ui/core/Box';
+import LockOutlinedIcon from '@material-ui/icons/LockOutlined';
+import Typography from '@material-ui/core/Typography';
+import { makeStyles } from '@material-ui/core/styles';
+import Container from '@material-ui/core/Container';
+import MuiAlert from '@material-ui/lab/Alert';
+import CustomPopupState from '../CustomPopupState/CustomPopupState';
+import Select from '@material-ui/core/Select';
+import Input from '@material-ui/core/Input';
+
+import buildSelectMenuItems from "../../tools";
+
+import axios from 'axios';
+import configApiCall from '../../api'
+import {api_path_post_install_server} from '../../globalUrls'
+
+const useStyles = makeStyles((theme) => ({
+    paper: {
+        marginTop: theme.spacing(8),
+        display: 'flex',
+        flexDirection: 'column',
+        alignItems: 'center',
+    },
+    avatar: {
+        margin: theme.spacing(1),
+        backgroundColor: theme.palette.secondary.main,
+    },
+    form: {
+        width: '100%', // Fix IE 11 issue.
+        marginTop: theme.spacing(1),
+    },
+    submit: {
+        margin: theme.spacing(3, 0, 2),
+    },
+}));
+
+export default function ServerParameters(props) {
+
+    const certificateRevocationTypes = [
+        {value: 300000, label: "5 minutes"},
+        {value: 600000, label: "10 minutes"},
+        {value: 900000, label: "15 minutes"},
+        {value: 1800000, label: "30 minutes"},
+        {value: 3600000, label: "60 minutes"},
+    ];
+
+    const deviceLifetimeTypes = [
+        {value: 2629746000, label: "1 Month"},
+        {value: 7889238000, label: "3 Months"},
+        {value: 15778476000, label: "6 Months"},
+        {value: 31556952000, label: "1 Year"},
+        {value: 157784760000, label: "5 Years"},
+    ]
+
+    const userAccountLifetimeTypes = [
+        {value: 31556952000, label: "1 Year"},
+        {value: 157784760000, label: "5 Years"},
+        {value: 315569520000, label: "10 Years"},
+    ]
+
+    const certificateRevocationTypesItems = buildSelectMenuItems(certificateRevocationTypes);
+    const deviceLifetimeTypesItems = buildSelectMenuItems(deviceLifetimeTypes);
+    const userAccountLifetimeTypesItems = buildSelectMenuItems(userAccountLifetimeTypes);
+
+    const classes = useStyles();
+    //const history = useHistory();
+    const [error, setError] = React.useState(props.error);
+    const [domain, setDomain] = React.useState("");
+    const [certificateRevocation, setCertificateRevocation] = React.useState(certificateRevocationTypes[0])
+    const [deviceLifetime, setDeviceLifetime] = React.useState(deviceLifetimeTypes[0])
+    const [userAccountLifetime, setUserAccountLifetime] = React.useState(userAccountLifetimeTypes[0])
+    const [sipConfigurationTemplate, setSIPCertificateTemplate] = React.useState(null);
+    const [userlifeDisabled, setUserlifeDisabled] = React.useState(false);
+
+    function handleSubmit(e) {
+        e.preventDefault();
+        let jsonData = {};
+        let re = new RegExp(/^http[s]?:\/\/\w+(\.\w+)*(:[0-9]+)?\/?(\/[.\w]*)*$/);
+        if(domain.match(re)){
+            jsonData = {
+                'serverDomain': domain,
+                'crlLifetime': certificateRevocation,
+                'deviceLifetime': deviceLifetime,
+                'userLifetime': userAccountLifetime,
+                'sipConfig': sipConfigurationTemplate,
+                'signingAlgorithm': "SHA512WITHRSA"
+            }
+            axios(configApiCall(api_path_post_install_server, "POST", jsonData, null)).then((response)=>{
+                console.log(response);
+            }).catch((error)=>{
+                setError(error);
+                console.log('Error creating admin account: ' + error );
+            })
+        }
+        else{
+            props.setError(true)
+            props.setErrorMessage("Please enter a valid CORS domain URL.");
+        }
+        // Check https://www.geeksforgeeks.org/file-uploading-in-react-js/ for the file upload
+    }
+
+    const handleCertificateRevocationChange = (event) => {
+        setCertificateRevocation(event.target.value)
+    }
+
+    const handleDeviceLifetimeChange = (event) => {
+        setDeviceLifetime(event.target.value)
+        if(parseInt(deviceLifetime) <= parseInt(userAccountLifetime)){
+            setUserlifeDisabled(false);
+        }
+        else{
+            setUserlifeDisabled(true);
+        }
+    }
+
+    const handleUserAccountLifetimeChange = (event) => {
+        setUserAccountLifetime(event.target.value)
+        if(parseInt(deviceLifetime) <= parseInt(userAccountLifetime)){
+            setUserlifeDisabled(false);
+        }
+        else{
+            setUserlifeDisabled(true);
+        }
+
+    }
+
+    const handleSipConfigurationTemplateChange = (event) => {
+        setSIPCertificateTemplate(event.target.files[0])
+    }
+
+
+    return (
+        <form className={classes.form} noValidate onSubmit={handleSubmit}>
+            <Typography variant="h5" gutterBottom color="primary">Server Parameters</Typography>
+            <Typography variant="body1" gutterBottom >The global parameters cover the general configuration of the server's engine.</Typography>
+            <Typography variant="subtitle1" gutterBottom >CORS Domain Name<CustomPopupState message="Set the domain of the web client server to connect to the JAMS admin dashboard and Jami accounts. It is also used to define where the clients should download CRLs and submit OCSP queries. In case you are running a proxied instance (i.e. JAMS behind IIS), please make sure to set this field correctly, otherwise devices will not be able to download CRLs or validate certificates."/></Typography>
+            <Typography variant="body1" gutterBottom >The domain name of your web client server. Requires http:// or https://</Typography>
+            <TextField
+                variant="outlined"
+                margin="normal"
+                required
+                fullWidth
+                id="domain"
+                label="Domain"
+                name="domain"
+                autoComplete="domain"
+                autoFocus
+                onChange={e => setDomain(e.target.value)}
+            />
+            <Typography variant="subtitle1" gutterBottom >Certificate Revocation List Lifetime<CustomPopupState message="Set the domain of the web client server to connect to the JAMS admin dashboard and Jami accounts. It is also used to define where the clients should download CRLs and submit OCSP queries. In case you are running a proxied instance (i.e. JAMS behind IIS), please make sure to set this field correctly, otherwise devices will not be able to download CRLs or validate certificates."/></Typography>
+            <Select
+            labelId="certificate-revocation-select-label"
+            fullWidth
+            value={certificateRevocation.id}
+            onChange={handleCertificateRevocationChange}
+            variant="outlined"
+            children={certificateRevocationTypesItems}
+            />
+            <Typography variant="subtitle1" gutterBottom >Device Lifetime</Typography>
+            <Select
+            labelId="device-lifetime-select-label"
+            fullWidth
+            value={deviceLifetime.id}
+            onChange={handleDeviceLifetimeChange}
+            variant="outlined"
+            children={deviceLifetimeTypesItems}
+            />
+            <Typography variant="subtitle1" gutterBottom >User Account Lifetime</Typography>
+            <Select
+            labelId="user-account-lifetime-select-label"
+            fullWidth
+            value={userAccountLifetime.id}
+            onChange={handleUserAccountLifetimeChange}
+            disabled={userlifeDisabled}
+            variant="outlined"
+            children={userAccountLifetimeTypesItems}
+            />
+            <Typography variant="subtitle1" gutterBottom >SIP Configuration Template</Typography>
+            <Input
+            fullWidth
+            type="file"
+            onChange={handleSipConfigurationTemplateChange}
+            />
+
+            <Button
+                type="submit"
+                fullWidth
+                variant="contained"
+                color="primary"
+                className={classes.submit}
+            >
+                Set Server Parameters
+            </Button>
+
+        </form>
+    );
+}
\ No newline at end of file
diff --git a/jams-react-client/src/configured.route.js b/jams-react-client/src/configured.route.js
index 3417e4e6c3ea1beae138bb0b7815378dfb2222ae..0e10c355082a884dd0311cb70086b1745b20794f 100644
--- a/jams-react-client/src/configured.route.js
+++ b/jams-react-client/src/configured.route.js
@@ -2,7 +2,8 @@
 import React from 'react'
 import { Route, Redirect } from 'react-router-dom'
 import auth from './auth'
-import SignUp from "layouts/SignUp.js";
+import SignUp from "layouts/SignUp";
+import SignIn from "layouts/SignIn";
 
 export const ConfiguredRoute = ({ component: Component, ...rest }) => {
     return (
@@ -10,12 +11,25 @@ export const ConfiguredRoute = ({ component: Component, ...rest }) => {
             
             (props) => {
                 if (auth.hasAdmin()) {
-                    console.log('Admin already exits please signin');
-                    return <Component {...props} />
-
+                    if(auth.isInstalled()){
+                        return <Component {...props} />
+                    }else if(!auth.isInstalled() && auth.isAuthenticated()){
+                        if(auth.uri == '/api/install/ca' || auth.uri == 'start'){
+                            return <SignUp step={1}/>
+                        }
+                        else if (auth.uri == '/api/install/auth'){
+                            return <SignUp step={2}/>
+                        } else if (auth.uri == '/api/install/settings'){
+                            return <SignUp step={3}/>
+                        } else {
+                            console.log('Error no matching path for configuration')
+                        }
+                        
+                    } else{
+                        return <SignIn />
+                    }
                 } else {
-                    console.log('Not Admin Please signup and configure');
-                    return <SignUp />
+                    return <SignUp step={0}/>
                 }
 
             }
diff --git a/jams-react-client/src/index.js b/jams-react-client/src/index.js
index 057ca5b8602b5809e11469467f2217dd9b2a9bdb..b8c9d5b5fbf53ad622ecddd7e2684b6cd2d597f8 100644
--- a/jams-react-client/src/index.js
+++ b/jams-react-client/src/index.js
@@ -31,17 +31,21 @@ import SignIn from "layouts/SignIn.js";
 import "assets/css/material-dashboard-react.css?v=1.9.0";
 
 const hist = createBrowserHistory();
-auth.checkAdminAccountStatus(() => {
-  ReactDOM.render(
-    <Router history={hist}>
-      <Switch>
-        <ConfiguredRoute path="/signin" component={SignIn} />
-        <ProtectedRoute path="/admin" component={Admin} />
-        {/*<Route path="/rtl" component={RTL} />*/}
-        <Redirect from="/" to="/signin" />
-      </Switch>
-    </Router>,
-    document.getElementById("root")
-  );
-})
+auth.isServerInstalled(() => {
+  auth.checkAdminAccountStatus(() => {
+    auth.checkLastKnowStep(() => {
+      ReactDOM.render(
+        <Router history={hist}>
+          <Switch>
+            <ConfiguredRoute path="/signin" component={SignIn} />
+            <ProtectedRoute path="/admin" component={Admin} />
+            {/*<Route path="/rtl" component={RTL} />*/}
+            <Redirect from="/" to="/signin" />
+          </Switch>
+        </Router>,
+        document.getElementById("root")
+      ); 
+    });
+  });
+});
 
diff --git a/jams-react-client/src/layouts/Admin.js b/jams-react-client/src/layouts/Admin.js
index cb0dc58aeae69b640e15578ab34b5108e47be678..bc63075e4de1c19487418e756ddeca567e861e48 100644
--- a/jams-react-client/src/layouts/Admin.js
+++ b/jams-react-client/src/layouts/Admin.js
@@ -1,4 +1,4 @@
-import React, { useEffect } from "react";
+import React from "react";
 import { Switch, Route, Redirect } from "react-router-dom";
 // creates a beautiful scrollbar
 import PerfectScrollbar from "perfect-scrollbar";
@@ -18,11 +18,6 @@ import styles from "assets/jss/material-dashboard-react/layouts/adminStyle.js";
 import bgImage from "assets/img/sidebar-2.jpg";
 import logo from "assets/img/logo-jams.svg";
 
-import configApiCall from "api.js";
-import axios from 'axios';
-
-import { api_path_post_install_admin } from "globalUrls";
-
 let ps;
 
 const switchRoutes = (
diff --git a/jams-react-client/src/layouts/SignIn.js b/jams-react-client/src/layouts/SignIn.js
index cbe264ad5ea20839eb9598e7cbf0ff39b7626ec7..a25a71f275f8d5cee8ba8966575ed86e6d6973b6 100644
--- a/jams-react-client/src/layouts/SignIn.js
+++ b/jams-react-client/src/layouts/SignIn.js
@@ -60,7 +60,8 @@ export default function SignIn(props) {
     const history = useHistory();
     const [username, setUsername] = React.useState("");
     const [password, setPassword] = React.useState("");
-    const [errorMessage, setErrorMessage] = React.useState(false);
+    const [error, setError] = React.useState(false);
+    const [errorMessage, setErrorMessage] = React.useState("");
 
     function handleSubmit(e) {
         e.preventDefault();
@@ -68,8 +69,15 @@ export default function SignIn(props) {
             "username": username,
             "password": password
         }
-        auth.login(jsonData, () => { 
-            props.history.push('/admin'); 
+        auth.login(jsonData, () => {
+            if(auth.authenticated && auth.access_token != ""){
+                auth.checkLastKnowStep(()=>{
+                    history.push('/');
+                })
+            }else{
+                setError(true)
+                setErrorMessage("Login failed check your credentials")
+            }
         })
     }
 
@@ -80,7 +88,8 @@ export default function SignIn(props) {
                 <img src={logo} style={{ width: "25em", paddingBottom: "20px" }} />
                 <Typography component="h1" variant="h5">
                     Sign in
-        </Typography>
+                </Typography>
+                {error && <Alert severity="error">{errorMessage}</Alert>}
                 <form className={classes.form} noValidate onSubmit={handleSubmit}>
                     <TextField
                         variant="outlined"
@@ -136,7 +145,6 @@ export default function SignIn(props) {
             <Box mt={8}>
                 <Copyright />
             </Box>
-            {errorMessage && <Alert severity="error">Error login wrong credentials!</Alert>}
         </Container>
     );
 }
\ No newline at end of file
diff --git a/jams-react-client/src/layouts/SignUp.js b/jams-react-client/src/layouts/SignUp.js
index b7b5e2ff5524db63ac43330dc66a8fbe684918d2..ae0c522d5219758255f7890d9e4a76e0d4c7d9af 100644
--- a/jams-react-client/src/layouts/SignUp.js
+++ b/jams-react-client/src/layouts/SignUp.js
@@ -1,4 +1,4 @@
-import React from 'react';
+import React, { useEffect } from 'react';
 import Avatar from '@material-ui/core/Avatar';
 import Button from '@material-ui/core/Button';
 import CssBaseline from '@material-ui/core/CssBaseline';
@@ -12,9 +12,21 @@ import LockOutlinedIcon from '@material-ui/icons/LockOutlined';
 import Typography from '@material-ui/core/Typography';
 import { makeStyles } from '@material-ui/core/styles';
 import Container from '@material-ui/core/Container';
+import MuiAlert from '@material-ui/lab/Alert';
+import Paper from '@material-ui/core/Paper';
 
 import logo from "assets/img/logo-jams-blue.svg";
-import auth from 'auth.js';
+
+import CustomizedSteppers from 'components/CustomizedSteppers/CustomizedSteppers';
+import CreateAdmin from 'components/CreateAdmin/CreateAdmin';
+import CaSetup from 'components/CaSetup/CaSetup';
+import IdentityManagement from 'components/IdentityManagement/IdentityManagement';
+import ServerParameters from 'components/ServerParameters/ServerParameters';
+
+function Alert(props) {
+    return <MuiAlert elevation={6} variant="filled" {...props} />;
+}
+
 
 function Copyright() {
     return (
@@ -47,96 +59,58 @@ const useStyles = makeStyles((theme) => ({
     submit: {
         margin: theme.spacing(3, 0, 2),
     },
+    paper: {
+        marginTop: theme.spacing(3),
+        marginBottom: theme.spacing(3),
+        padding: theme.spacing(2),
+        [theme.breakpoints.up(600 + theme.spacing(3) * 2)]: {
+          marginTop: theme.spacing(6),
+          marginBottom: theme.spacing(6),
+          padding: theme.spacing(3),
+        },
+    },
+    logo: {
+        width: "25em",
+        display: "block",
+        marginLeft: "auto",
+        marginRight: "auto",
+    }
 }));
 
 export default function SignUp(props) {
     const classes = useStyles();
-    const [username, setUsername] = React.useState("");
-    const [password, setPassword] = React.useState("");
-    const [confirmPassword, setConfirmPassword] = React.useState("");
+    const [error, setError] = React.useState(false);
+    const [errorMessage, setErrorMessage] = React.useState("Test");
+    const [step, setStep] = React.useState(props.step);
 
-    function createAdminCallBackHandler() {
-        props.signedIn = true;
-        console.log("Done");
-    }
+    useEffect(()=>{
+        //request the server to check for the step to return
+    });
 
-    function handleSubmit(e) {
-        e.preventDefault();
-        const jsonData = {
-            "username": username,
-            "password": password
+    function returnStep(){
+        if(step == 0) {
+            return <CreateAdmin setError={setError} setErrorMessage={setErrorMessage}  />
+        }else if (step == 1) {
+            return <CaSetup setError={setError} setErrorMessage={setErrorMessage} />
+        }else if (step == 2) {
+            return <IdentityManagement setError={setError} setErrorMessage={setErrorMessage} />
+        }else if (step == 3) {
+            return <ServerParameters setError={setError} setErrorMessage={setErrorMessage} />
         }
-
-        auth.login(jsonData, createAdminCallBackHandler)
     }
-
     return (
-        <Container component="main" maxWidth="xs">
+        <Container component="main" maxWidth="sm">
+            <Paper className={classes.paper}>
             <CssBaseline />
-            <div className={classes.paper}>
-                <img src={logo} style={{ width: "25em", paddingBottom: "20px" }} />
-                <Typography component="h1" variant="h5">
-                    Administrator account creation
-                </Typography>
-                <p>
-                    Create the account that will have administrative control over JAMS.
-                </p>
-                <form className={classes.form} noValidate onSubmit={handleSubmit}>
-                    <TextField
-                        variant="outlined"
-                        margin="normal"
-                        required
-                        fullWidth
-                        id="username"
-                        label="Username"
-                        name="username"
-                        autoComplete="email"
-                        autoFocus
-                        onChange={e => setUsername(e.target.value)}
-                    />
-                    <TextField
-                        variant="outlined"
-                        margin="normal"
-                        required
-                        fullWidth
-                        name="password"
-                        label="Password"
-                        type="password"
-                        id="password"
-                        autoComplete="current-password"
-                        onChange={e => setPassword(e.target.value)}
-                    />
-                    <TextField
-                        variant="outlined"
-                        margin="normal"
-                        required
-                        fullWidth
-                        name="confirmPassword"
-                        label="Confirm password"
-                        type="password"
-                        id="confirmPassword"
-                        autoComplete="current-password"
-                        onChange={e => setConfirmPassword(e.target.value)}
-                    />
-                    <FormControlLabel
-                        control={<Checkbox value="remember" color="primary" />}
-                        label="Remember me"
-                    />
-                    <Button
-                        type="submit"
-                        fullWidth
-                        variant="contained"
-                        color="primary"
-                        className={classes.submit}
-                    >
-                        Continue
-                    </Button>
-
-                </form>
-            </div>
+                <img src={logo} className={classes.logo} />
+            <CustomizedSteppers step={step}/>
+            {error && errorMessage && <Alert severity="error">{errorMessage}</Alert>}
+            {returnStep()}
+        
             <Box mt={8}>
-                <Copyright />
+                <Copyright/>
             </Box>
+            </Paper>
         </Container>
     );
 }
\ No newline at end of file
diff --git a/jams-react-client/src/protected.route.js b/jams-react-client/src/protected.route.js
index 7376a98c02836c3a09ef3d215ff42f4402b17f19..49810b918985bd9e0c167a8663aea56d7c5ecd00 100644
--- a/jams-react-client/src/protected.route.js
+++ b/jams-react-client/src/protected.route.js
@@ -7,7 +7,7 @@ export const ProtectedRoute = ({ component: Component, ...rest }) => {
         <Route {...rest} render={
             (props) => {
 
-                if (auth.isAuthenticated()) {
+                if (auth.isAuthenticated() && auth.hasAdmin() && auth.isInstalled()) {
                     return <Component {...props} />
                 }
                 else {
diff --git a/jams-react-client/src/routes.js b/jams-react-client/src/routes.js
index f96f17aab90e0038b8a0522dbbb4c5342b273d52..9f4f58fa1407adbe2479e80213f5aa49e1e7ac16 100644
--- a/jams-react-client/src/routes.js
+++ b/jams-react-client/src/routes.js
@@ -16,30 +16,14 @@
 
 */
 // @material-ui/icons
-import Dashboard from "@material-ui/icons/Dashboard";
 import Person from "@material-ui/icons/Person";
 import Group from "@material-ui/icons/Group";
 import AllInbox from "@material-ui/icons/AllInbox"
-import LibraryBooks from "@material-ui/icons/LibraryBooks";
-import BubbleChart from "@material-ui/icons/BubbleChart";
-import LocationOn from "@material-ui/icons/LocationOn";
-import Notifications from "@material-ui/icons/Notifications";
-import Unarchive from "@material-ui/icons/Unarchive";
-import Language from "@material-ui/icons/Language";
 // core components/views for Admin layout
-import DashboardPage from "views/Dashboard/Dashboard.js";
 import Users from "views/Users/Users.js";
 import Groups from "views/Groups/Groups.js";
 import Blueprints from "views/Blueprints/Blueprints.js";
-import UserProfile from "views/UserProfile/UserProfile.js";
-import TableList from "views/TableList/TableList.js";
-import Typography from "views/Typography/Typography.js";
-import Icons from "views/Icons/Icons.js";
-import Maps from "views/Maps/Maps.js";
-import NotificationsPage from "views/Notifications/Notifications.js";
-import UpgradeToPro from "views/UpgradeToPro/UpgradeToPro.js";
 // core components/views for RTL layout
-import RTLPage from "views/RTLPage/RTLPage.js";
 
 const dashboardRoutes = [
   {
diff --git a/jams-react-client/src/tools.js b/jams-react-client/src/tools.js
new file mode 100644
index 0000000000000000000000000000000000000000..0f0a7075fe343bceae7043c764085afc55f58aa8
--- /dev/null
+++ b/jams-react-client/src/tools.js
@@ -0,0 +1,11 @@
+import React from 'react';
+import MenuItem from '@material-ui/core/MenuItem';
+
+function buildSelectMenuItems(elements) {
+    return elements.map((d) =>
+        <MenuItem value={d.value}>{d.label}</MenuItem>
+    )
+}
+
+
+export default buildSelectMenuItems;
\ No newline at end of file