diff --git a/client/src/components/ListItemLink.jsx b/client/src/components/ListItemLink.jsx
deleted file mode 100644
index b56e87d..0000000
--- a/client/src/components/ListItemLink.jsx
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (C) 2022 Savoir-faire Linux Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation; either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public
- * License along with this program.  If not, see
- * <https://www.gnu.org/licenses/>.
- */
-import ListItem from '@mui/material/ListItem';
-import ListItemIcon from '@mui/material/ListItemIcon';
-import ListItemText from '@mui/material/ListItemText';
-import PropTypes from 'prop-types';
-import { forwardRef, useMemo } from 'react';
-import { Link as RouterLink } from 'react-router-dom';
-
-function ListItemLink(props) {
-  const { icon, primary, secondary, to, account } = props;
-
-  const renderLink = useMemo(
-    () =>
-      forwardRef((itemProps, ref) => {
-        console.log('LIST ITEM LINK: ', account, itemProps);
-        return <RouterLink to={to} ref={ref} {...itemProps} state={account} />;
-      }),
-    [account, to]
-  );
-
-  return (
-    <ListItem button component={renderLink}>
-      {icon ? <ListItemIcon>{icon}</ListItemIcon> : null}
-      <ListItemText primary={primary} secondary={secondary} />
-    </ListItem>
-  );
-}
-
-ListItemLink.propTypes = {
-  icon: PropTypes.element,
-  primary: PropTypes.string.isRequired,
-  secondary: PropTypes.string,
-  to: PropTypes.string.isRequired,
-  account: PropTypes.object,
-};
-
-export default ListItemLink;
diff --git a/client/src/components/UsernameChooser.jsx b/client/src/components/UsernameChooser.jsx
deleted file mode 100644
index dee5b19..0000000
--- a/client/src/components/UsernameChooser.jsx
+++ /dev/null
@@ -1,85 +0,0 @@
-/*
- * Copyright (C) 2022 Savoir-faire Linux Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation; either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public
- * License along with this program.  If not, see
- * <https://www.gnu.org/licenses/>.
- */
-import SearchRounded from '@mui/icons-material/SearchRounded';
-import { InputAdornment, TextField } from '@mui/material';
-import axios from 'axios';
-import { useEffect, useState } from 'react';
-
-import { apiUrl } from '../utils/constants';
-
-const isInputValid = (input) => input && input.length > 2;
-
-export default function UsernameChooser({ setName, ...props }) {
-  const [query, setQuery] = useState('');
-  const [isLoading, setIsLoading] = useState(true);
-  const [error, setError] = useState();
-  const [data, setData] = useState();
-
-  useEffect(() => {
-    if (isInputValid(query)) {
-      setIsLoading(true);
-      axios.get(`/ns/username/${query}`, { baseURL: apiUrl }).then((res) => {
-        setIsLoading(false);
-        if (res.status === 200) {
-          setData(res.data);
-        } else {
-          throw res.status;
-        }
-      });
-    } else {
-      setError(400);
-    }
-  }, [query]);
-
-  useEffect(() => {
-    if (!isLoading) {
-      if (error === 404) setName(query);
-      else setName('');
-    }
-  }, [setName, query, isLoading, data, error]);
-
-  const handleChange = (event) => setQuery(event.target.value);
-
-  return (
-    <TextField
-      className="main-search-input"
-      type="search"
-      placeholder="Register a unique name"
-      error={!error}
-      label={
-        isLoading
-          ? 'Searching...'
-          : error && error !== 400
-          ? 'This name is available'
-          : data && data.address
-          ? 'This name is not available'
-          : ''
-      }
-      value={query}
-      disabled={props.disabled}
-      onChange={handleChange}
-      InputProps={{
-        startAdornment: (
-          <InputAdornment position="start">
-            <SearchRounded />
-          </InputAdornment>
-        ),
-      }}
-    />
-  );
-}
diff --git a/client/src/pages/AccountCreation.tsx b/client/src/pages/AccountCreation.tsx
deleted file mode 100644
index d98688c..0000000
--- a/client/src/pages/AccountCreation.tsx
+++ /dev/null
@@ -1,75 +0,0 @@
-/*
- * Copyright (C) 2022 Savoir-faire Linux Inc.
- *
- * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation; either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public
- * License along with this program.  If not, see
- * <https://www.gnu.org/licenses/>.
- */
-import { DialerSipRounded, GroupOutlined, RoomRounded } from '@mui/icons-material';
-import { Avatar, Card, CardContent, Container, Divider, List, Typography } from '@mui/material';
-
-import ListItemLink from '../components/ListItemLink';
-
-export default function AccountCreationDialog() {
-  return (
-    <Container>
-      <Card>
-        <CardContent>
-          <Typography gutterBottom variant="h5" component="h2">
-            Create new account
-          </Typography>
-          <Typography variant="body2" color="textSecondary" component="p">
-            Welcome to the Jami web node setup.
-            <br />
-            Let&apos;s start by creating a new administrator account to control access to the server configuration.
-          </Typography>
-        </CardContent>
-
-        <List>
-          <ListItemLink
-            to="/newAccount/rendezVous"
-            icon={
-              <Avatar>
-                <RoomRounded />
-              </Avatar>
-            }
-            primary="Rendez-vous point"
-            secondary="A Rendez-vous account provides a unique space suitable to easily organize meetings"
-          />
-          <Divider />
-          <ListItemLink
-            to="/newAccount/jami"
-            icon={
-              <Avatar>
-                <GroupOutlined />
-              </Avatar>
-            }
-            primary="Jami account"
-            secondary="A pesonal communication account to join a Rendez-vous point or directly contact other Jami users"
-          />
-          <Divider />
-          <ListItemLink
-            to="/newAccount/sip"
-            icon={
-              <Avatar>
-                <DialerSipRounded />
-              </Avatar>
-            }
-            primary="SIP Account"
-            secondary="Connect with standard SIP communication providers or classic telephony services"
-          />
-        </List>
-      </Card>
-    </Container>
-  );
-}
