diff --git a/scripts/init-db.js b/scripts/init-db.js
index 910179178dc0fea08ce23861614fd7936ed8d9fc..8b54dae609f2d7cf6a92e9efd1e7a899664ed712 100644
--- a/scripts/init-db.js
+++ b/scripts/init-db.js
@@ -143,6 +143,7 @@ const structuresSchema = mongoose.Schema({
   nbScanners: Number,
   hours: Object,
   coord: [],
+  toBeDeletedAt: Date,
   deletedAt: Date,
   accountVerified: Boolean,
 });
diff --git a/src/admin/admin.controller.ts b/src/admin/admin.controller.ts
index 0369680c357607af9c9729c8362ef36d0744943e..8a09736c0b5a0d2689d8a642ac896b77d0352d7c 100644
--- a/src/admin/admin.controller.ts
+++ b/src/admin/admin.controller.ts
@@ -190,9 +190,10 @@ export class AdminController {
   public async deleteUser(@Param() params) {
     const user = await this.usersService.deleteOneId(params.id);
     user.structuresLink.forEach((structureId) => {
-      this.usersService.isStructureClaimed(structureId.toString()).then((userFound) => {
+      this.usersService.isStructureClaimed(structureId.toString()).then(async (userFound) => {
         if (!userFound) {
-          this.structuresService.deleteOne(structureId.toString());
+          const structure = await this.structuresService.findOne(structureId.toString());
+          this.structuresService.deleteOne(structure);
         }
       });
     });
diff --git a/src/configuration/config.ts b/src/configuration/config.ts
index 67e56cc1eccac899f0a3b2f65ee2596b0cd24911..f53310aedbb4c529ef6714938eecd3f924d5d23c 100644
--- a/src/configuration/config.ts
+++ b/src/configuration/config.ts
@@ -61,6 +61,14 @@ export const config = {
       ejs: 'structureDeletionNotification.ejs',
       json: 'structureDeletionNotification.json',
     },
+    structureToBeDeleted: {
+      ejs: 'structureToBeDeleted.ejs',
+      json: 'structureToBeDeleted.json',
+    },
+    structureCancelDelete: {
+      ejs: 'structureCancelDelete.ejs',
+      json: 'structureCancelDelete.json',
+    },
     adminJobCreate: {
       ejs: 'adminJobCreate.ejs',
       json: 'adminJobCreate.json',
diff --git a/src/mailer/mail-templates/adminStructureClaim.ejs b/src/mailer/mail-templates/adminStructureClaim.ejs
index 91f347bac1cfa065a9e27a049e518796852e5f14..cf9935dfb2fee9644d8c6872f7cd7a53a4f6299b 100644
--- a/src/mailer/mail-templates/adminStructureClaim.ejs
+++ b/src/mailer/mail-templates/adminStructureClaim.ejs
@@ -3,7 +3,7 @@ Bonjour,<br />
 La structure <%= structureName %> a été revendiquée par <%= user.name %> <%= user.surname %>.
 <br />
 Voici les informations de la structure : <br />
-<%= structureAdress %><br />
+<%= structureAddress %><br />
 <%= structureDescription %><br />
 Et du demandeur : <br />
 <%= user.email %><br />
diff --git a/src/mailer/mail-templates/structureCancelDelete.ejs b/src/mailer/mail-templates/structureCancelDelete.ejs
new file mode 100644
index 0000000000000000000000000000000000000000..972812db92e34d6f79c05d4d99ca2ab84da7e517
--- /dev/null
+++ b/src/mailer/mail-templates/structureCancelDelete.ejs
@@ -0,0 +1,4 @@
+Bonjour,<br />
+<br />
+<%= name %> <%= surname %> a annulé la suppression de votre structure <%= structureName %>, celle-ci restera visible sur
+la cartographie de Res'in.
diff --git a/src/mailer/mail-templates/structureCancelDelete.json b/src/mailer/mail-templates/structureCancelDelete.json
new file mode 100644
index 0000000000000000000000000000000000000000..5e56bc8c4851d40a968d9157602acf62fa15b0a4
--- /dev/null
+++ b/src/mailer/mail-templates/structureCancelDelete.json
@@ -0,0 +1,3 @@
+{
+  "subject": "La suppression d'une structure a été annulée, Réseau des Acteurs de la Médiation Numérique de la Métropole de Lyon"
+}
diff --git a/src/mailer/mail-templates/structureDeletionNotification.json b/src/mailer/mail-templates/structureDeletionNotification.json
index 3fabb0edbd05f73e363f5f035dafd55614d4a33f..ac9e6bdfe46b2d488bace943fb4292a20c2c0dcb 100644
--- a/src/mailer/mail-templates/structureDeletionNotification.json
+++ b/src/mailer/mail-templates/structureDeletionNotification.json
@@ -1,3 +1,3 @@
 {
-  "subject": "Une structure à été supprimé de Res'in, Réseau des Acteurs de la Médiation Numérique de la Métropole de Lyon"
+  "subject": "Une structure a été supprimée de Res'in, Réseau des Acteurs de la Médiation Numérique de la Métropole de Lyon"
 }
diff --git a/src/mailer/mail-templates/structureToBeDeleted.ejs b/src/mailer/mail-templates/structureToBeDeleted.ejs
new file mode 100644
index 0000000000000000000000000000000000000000..05e4659acb9cd5def4180fd568a5a27880bc77f9
--- /dev/null
+++ b/src/mailer/mail-templates/structureToBeDeleted.ejs
@@ -0,0 +1,15 @@
+Bonjour,<br />
+<br />
+<%= name %> <%= surname %> a demandé la suppression de votre structure <%= structureName %> dans Res'in.<br />
+Cette suppression sera effective le <%= toBeDeletedAt %>. Jusqu'à cette date, vous pouvez annuler cette demande de
+suppression en cliquant sur le lien ci-dessous.
+<br />
+<br />
+<br />
+
+<div style="text-align: center">
+  <a
+    href="<%= config.protocol %>://<%= config.host %><%= config.port ? ':' + config.port : '' %>/profile/structures-management"
+    >Gérer mes structures</a
+  >
+</div>
diff --git a/src/mailer/mail-templates/structureToBeDeleted.json b/src/mailer/mail-templates/structureToBeDeleted.json
new file mode 100644
index 0000000000000000000000000000000000000000..7909fbb34398bd67b9c184e187af66fdba394a44
--- /dev/null
+++ b/src/mailer/mail-templates/structureToBeDeleted.json
@@ -0,0 +1,3 @@
+{
+  "subject": "Une structure va être supprimée de Res'in, Réseau des Acteurs de la Médiation Numérique de la Métropole de Lyon"
+}
diff --git a/src/structures/dto/structure.dto.ts b/src/structures/dto/structure.dto.ts
index cf647c26a260ae17768b2c2949479f954940f06f..d72c0413df304414f5c6789b433825779ee8ad36 100644
--- a/src/structures/dto/structure.dto.ts
+++ b/src/structures/dto/structure.dto.ts
@@ -9,6 +9,7 @@ export class StructureDto {
   numero: string;
   createdAt: Date;
   updatedAt: Date;
+  toBeDeletedAt: Date;
   deletedAt: Date;
 
   @IsNotEmpty()
diff --git a/src/structures/schemas/structure.schema.ts b/src/structures/schemas/structure.schema.ts
index f2f807dac434f111b4aa3b2533ca640239d91ac9..d708615ad5fdc8bac95aabc626afb317151e9aad 100644
--- a/src/structures/schemas/structure.schema.ts
+++ b/src/structures/schemas/structure.schema.ts
@@ -177,6 +177,9 @@ export class Structure {
   @Prop()
   coord: number[];
 
+  @Prop()
+  toBeDeletedAt: Date;
+
   @Prop()
   deletedAt: Date;
 
diff --git a/src/structures/services/structure.service.spec.ts b/src/structures/services/structure.service.spec.ts
index d71dfb428f4963104e3868fe39b597833baa6390..7bb4585e3980e45bc0bed7c48b9b6a1f31690697 100644
--- a/src/structures/services/structure.service.spec.ts
+++ b/src/structures/services/structure.service.spec.ts
@@ -7,6 +7,7 @@ import * as bcrypt from 'bcrypt';
 import { Types } from 'mongoose';
 import { personalOffersDataMock } from '../../../test/mock/data/personalOffers.mock.data';
 import { structureMockDto, structuresDocumentDataMock } from '../../../test/mock/data/structures.mock.data';
+import { userDetails } from '../../../test/mock/data/users.mock.data';
 import { mockParametersModel } from '../../../test/mock/services/parameters.mock.service';
 import { UsersServiceMock } from '../../../test/mock/services/user.mock.service';
 import { CategoriesFormationsService } from '../../categories/services/categories-formations.service';
@@ -18,7 +19,6 @@ import { PersonalOfferDocument } from '../../personal-offers/schemas/personal-of
 import { SearchModule } from '../../search/search.module';
 import { IUser } from '../../users/interfaces/user.interface';
 import { UsersService } from '../../users/services/users.service';
-import { StructureDto } from '../dto/structure.dto';
 import { Structure, StructureDocument } from '../schemas/structure.schema';
 import { StructuresSearchService } from './structures-search.service';
 import { StructuresService } from './structures.service';
@@ -389,6 +389,16 @@ describe('StructuresService', () => {
     // });
   });
 
+  it('should set structure to be deleted', async () => {
+    const res = await service.setToBeDeleted(userDetails[0], structuresDocumentDataMock[0]);
+    expect(res.toBeDeletedAt).toBeTruthy();
+  });
+
+  it('should cancel structure delete', async () => {
+    const res = await service.cancelDelete(userDetails[0], structuresDocumentDataMock[0]);
+    expect(res.toBeDeletedAt).toBeNull();
+  });
+
   it('should search structure', () => {
     const filters = [{ nbPrinters: '1' }];
     let res = service.search('', filters);
diff --git a/src/structures/services/structures.service.ts b/src/structures/services/structures.service.ts
index f638e0edf52ec22a9d1b0520b11028c4a11c6507..a7977222eb2ca3d5fbc1ada6704ace7d045efbf5 100644
--- a/src/structures/services/structures.service.ts
+++ b/src/structures/services/structures.service.ts
@@ -574,13 +574,96 @@ export class StructuresService {
     return this.httpService.get(encodeURI(req));
   }
 
-  public async deleteOne(id: string): Promise<Structure> {
-    const structure = await this.structureModel.findById(Types.ObjectId(id)).exec();
+  /**
+   * Set the structure to be deleted in 5 weeks
+   * @param user IUser
+   * @param structure StructureDocument
+   */
+  public async setToBeDeleted(user: IUser, structure: StructureDocument): Promise<Structure> {
+    if (!structure) {
+      throw new HttpException('Invalid structure id', HttpStatus.BAD_REQUEST);
+    }
+    structure.toBeDeletedAt = DateTime.local().plus({ weeks: 5 }).setZone('Europe/Paris').toString();
+    structure.save();
+
+    this.sendToBeDeletedNotification(user, structure);
+    return structure;
+  }
+
+  /**
+   * Send an email to structure owners (except the one who asked for the deletion) to inform the structure is will be deleted in 5 weeks
+   * @param user User
+   */
+  public async sendToBeDeletedNotification(user: IUser, structure: StructureDocument): Promise<void> {
+    const config = this.mailerService.config;
+    const ejsPath = this.mailerService.getTemplateLocation(config.templates.structureToBeDeleted.ejs);
+    const jsonConfig = this.mailerService.loadJsonConfig(config.templates.structureToBeDeleted.json);
+
+    const html = await ejs.renderFile(ejsPath, {
+      config,
+      structureName: structure.structureName,
+      name: user.name,
+      surname: user.surname,
+      toBeDeletedAt: DateTime.fromISO(structure.toBeDeletedAt.toISOString())
+        .plus({ days: 1 })
+        .toLocaleString(DateTime.DATE_SHORT),
+    });
+    const owners = await this.getOwners(structure._id);
+    owners.forEach((owner) => {
+      if (!owner._id.equals(user._id)) {
+        this.mailerService.send(owner.email, jsonConfig.subject, html);
+      }
+    });
+  }
+
+  /**
+   * Cancel the structure deletion when one of the structure owners had asked the structure for deletion
+   * @param user IUser
+   * @param structure StructureDocument
+   */
+  public async cancelDelete(user: IUser, structure: StructureDocument): Promise<Structure> {
+    if (!structure) {
+      throw new HttpException('Invalid structure id', HttpStatus.BAD_REQUEST);
+    }
+    if (!structure.deletedAt) {
+      structure.toBeDeletedAt = null;
+      structure.save();
+
+      this.sendCancelDeleteNotification(user, structure);
+    }
+    return structure;
+  }
+
+  /**
+   * Send an email to other structure owners to inform an owner cancelled the structure deletion
+   * @param user User
+   */
+  public async sendCancelDeleteNotification(user: IUser, structure: StructureDocument): Promise<void> {
+    const config = this.mailerService.config;
+    const ejsPath = this.mailerService.getTemplateLocation(config.templates.structureCancelDelete.ejs);
+    const jsonConfig = this.mailerService.loadJsonConfig(config.templates.structureCancelDelete.json);
+
+    const html = await ejs.renderFile(ejsPath, {
+      config,
+      structureName: structure.structureName,
+      name: user.name,
+      surname: user.surname,
+    });
+    const owners = await this.getOwners(structure._id);
+    owners.forEach((owner) => {
+      if (!owner._id.equals(user._id)) {
+        this.mailerService.send(owner.email, jsonConfig.subject, html);
+      }
+    });
+  }
+
+  public async deleteOne(structure: StructureDocument): Promise<Structure> {
     if (!structure) {
       throw new HttpException('Invalid structure id', HttpStatus.BAD_REQUEST);
     }
     this.structuresSearchService.deleteIndexStructure(structure);
     structure.structureType = null;
+    if (structure.toBeDeletedAt) structure.toBeDeletedAt = null;
     structure.deletedAt = DateTime.local().setZone('Europe/Paris').toString();
     this.anonymizeStructure(structure).save();
     // Remove structure from owners (and check if there is a newly unattached user)
@@ -608,7 +691,6 @@ export class StructuresService {
       }
     );
 
-    //ici récupérer le user Actuel avec le service afin de remplir le mail.
     const config = this.mailerService.config;
     const ejsPath = this.mailerService.getTemplateLocation(templateLocation);
     const jsonConfig = this.mailerService.loadJsonConfig(jsonConfigLocation);
@@ -616,10 +698,8 @@ export class StructuresService {
       config,
       id: structure ? structure._id : 0,
       structureName: structure ? structure.structureName : '',
-      structureAdress: structure
-        ? structure.address.numero
-          ? `${structure.address.numero} ${structure.address.street} ${structure.address.commune}`
-          : `${structure.address.street} ${structure.address.commune}`
+      structureAddress: structure
+        ? `${structure.address.numero || ''} ${structure.address.street} ${structure.address.commune}`
         : '',
       structureDescription: structure ? structure.otherDescription : '',
       user: user,
@@ -638,8 +718,37 @@ export class StructuresService {
   }
 
   @Cron(CronExpression.EVERY_DAY_AT_4AM)
-  public async checkOutdatedStructuresInfo(): Promise<void> {
-    this.logger.debug('checkOutdatedStructuresInfo');
+  public async structuresTasksProcess(): Promise<void> {
+    this.logger.debug('structuresTasksProcess');
+
+    await this.processToBeDeletedStructures().catch((error) => {
+      this.logger.error(error);
+    });
+
+    await this.processOutdatedStructures().catch((error) => {
+      this.logger.error(error);
+    });
+  }
+
+  private async processToBeDeletedStructures(): Promise<void> {
+    this.logger.debug('processToBeDeletedStructures');
+
+    const structures = await this.structureModel
+      .find()
+      .where('toBeDeletedAt')
+      .lte(DateTime.local())
+      .where('deletedAt')
+      .exists(false)
+      .exec();
+
+    structures.forEach((structure) => {
+      this.logger.debug(`delete structure : ${structure.structureName} (${structure._id})`);
+      this.deleteOne(structure);
+    });
+  }
+
+  private async processOutdatedStructures(): Promise<void> {
+    this.logger.debug('processOutdatedStructures');
     const OUTDATED_MONTH_TO_CHECK = 6;
     const structureList = await this.findAll();
     // Get outdated structures
@@ -696,7 +805,7 @@ export class StructuresService {
   }
 
   /**
-   * Send an email to structure owner's in order to accept or decline a join request
+   * Send an email to structure owners in order to accept or decline a join request
    * @param user User
    */
   public async sendStructureJoinRequest(user: IUser, structure: StructureDocument): Promise<void> {
diff --git a/src/structures/structures.controller.spec.ts b/src/structures/structures.controller.spec.ts
index 8338823da2de46ee0a47fa0f76e7bd05b3644db6..426f5098443bb45bbde61a7eaef147480d27eceb 100644
--- a/src/structures/structures.controller.spec.ts
+++ b/src/structures/structures.controller.spec.ts
@@ -174,7 +174,14 @@ describe('AuthController', () => {
   });
 
   it('should delete struct', async () => {
-    const res = controller.delete('6093ba0e2ab5775cfc01ed3e');
+    const req = { user: { _id: '6036721022462b001334c4bb' } };
+    const res = controller.delete(req, '6093ba0e2ab5775cfc01ed3e');
+    expect(res).toBeTruthy();
+  });
+
+  it('should cancel struct delete', async () => {
+    const req = { user: { _id: '6036721022462b001334c4bb' } };
+    const res = controller.cancelDelete(req, '6093ba0e2ab5775cfc01ed3e');
     expect(res).toBeTruthy();
   });
 
diff --git a/src/structures/structures.controller.ts b/src/structures/structures.controller.ts
index 73ddd47dfe47732b5b43807e40e67d0744b00acb..b838b55f5f37edeb59afabb681d2784fde3f739b 100644
--- a/src/structures/structures.controller.ts
+++ b/src/structures/structures.controller.ts
@@ -12,6 +12,7 @@ import {
   Post,
   Put,
   Query,
+  Request,
   UseGuards,
 } from '@nestjs/common';
 import { ApiOperation, ApiParam, ApiTags } from '@nestjs/swagger';
@@ -26,6 +27,7 @@ import { Roles } from '../users/decorators/roles.decorator';
 import { IsStructureOwnerGuard } from '../users/guards/isStructureOwner.guard';
 import { RolesGuard } from '../users/guards/roles.guard';
 import { User } from '../users/schemas/user.schema';
+import { IUser } from '../users/interfaces/user.interface';
 import { UsersService } from '../users/services/users.service';
 import { depRegex } from './common/regex';
 import { CreateStructureDto } from './dto/create-structure.dto';
@@ -159,10 +161,31 @@ export class StructuresController {
 
   @Delete(':id')
   @UseGuards(JwtAuthGuard, IsStructureOwnerGuard)
-  @Roles('admin')
   @ApiParam({ name: 'id', type: String, required: true })
-  public async delete(@Param('id') id: string) {
-    return this.structureService.deleteOne(id);
+  public async delete(@Request() req, @Param('id') id: string) {
+    const structure = await this.structureService.findOne(id);
+    if (!structure) {
+      throw new HttpException('Invalid Structure', HttpStatus.NOT_FOUND);
+    }
+    const otherOwners: IUser[] = (await this.userService.getStructureOwners(id)).filter((owner) => {
+      return !owner._id.equals(req.user._id);
+    });
+    if (otherOwners.length) {
+      return this.structureService.setToBeDeleted(req.user, structure);
+    } else {
+      return this.structureService.deleteOne(structure);
+    }
+  }
+
+  @Post(':id/cancelDelete')
+  @UseGuards(JwtAuthGuard, IsStructureOwnerGuard)
+  @ApiParam({ name: 'id', type: String, required: true })
+  public async cancelDelete(@Request() req, @Param('id') id: string): Promise<Structure> {
+    const structure = await this.structureService.findOne(id);
+    if (!structure) {
+      throw new HttpException('Invalid Structure', HttpStatus.NOT_FOUND);
+    }
+    return this.structureService.cancelDelete(req.user, structure);
   }
 
   @Post(':id/addOwner')
diff --git a/src/users/controllers/users.controller.spec.ts b/src/users/controllers/users.controller.spec.ts
index 71d9c2ecee32192f641fdb04664282c9b61f2caa..c976f486c8c143de7c090c5d737b770b994d1416 100644
--- a/src/users/controllers/users.controller.spec.ts
+++ b/src/users/controllers/users.controller.spec.ts
@@ -388,7 +388,7 @@ describe('UsersController', () => {
     it('should call isStructureClaimed for each structure linked', async () => {
       const userDeleteOneSpyer = jest.spyOn(userServiceMock, 'deleteOne');
       const isStructureClaimedSpyer = jest.spyOn(userServiceMock, 'isStructureClaimed');
-      const structureDeleteOneSpyer = jest.spyOn(structureServiceMock, 'deleteOne');
+      const structureFindOne = jest.spyOn(structureServiceMock, 'findOne');
       const userWithThreeStructures = usersMockData[3];
       userServiceMock.deleteOne.mockResolvedValueOnce(userWithThreeStructures);
       userServiceMock.isStructureClaimed.mockResolvedValue(null);
@@ -396,7 +396,7 @@ describe('UsersController', () => {
       await controller.delete({ user: { _id: '36', email: 'a@a.com' } });
       expect(userDeleteOneSpyer).toBeCalledTimes(1);
       expect(isStructureClaimedSpyer).toBeCalledTimes(3);
-      expect(structureDeleteOneSpyer).toBeCalledTimes(2);
+      expect(structureFindOne).toBeCalledTimes(2);
     });
   });
 
diff --git a/src/users/controllers/users.controller.ts b/src/users/controllers/users.controller.ts
index ac7859f292cebf6428acb466fa2b842554dfb9bf..666ce7ddc0a9ba4f96dc829aaf28ecbb593b9970 100644
--- a/src/users/controllers/users.controller.ts
+++ b/src/users/controllers/users.controller.ts
@@ -179,9 +179,10 @@ export class UsersController {
   public async delete(@Req() req) {
     const user = await this.usersService.deleteOne(req.user.email);
     user.structuresLink.forEach((structureId) => {
-      this.usersService.isStructureClaimed(structureId.toString()).then((userFound) => {
+      this.usersService.isStructureClaimed(structureId.toString()).then(async (userFound) => {
         if (!userFound) {
-          this.structureService.deleteOne(structureId.toString());
+          const structure = await this.structureService.findOne(structureId.toString());
+          this.structureService.deleteOne(structure);
         }
       });
     });
diff --git a/src/users/services/users.service.ts b/src/users/services/users.service.ts
index d2d5b80b5b90025e68c6e1dc3ff0efa6732aeb58..c5a934cacdda6ccb1e8125dc4a88228851dc8792 100644
--- a/src/users/services/users.service.ts
+++ b/src/users/services/users.service.ts
@@ -480,10 +480,8 @@ export class UsersService {
       config,
       id: structure ? structure._id : 0,
       structureName: structure ? structure.structureName : '',
-      structureAdress: structure
-        ? structure.address.numero
-          ? `${structure.address.numero} ${structure.address.street} ${structure.address.commune}`
-          : `${structure.address.street} ${structure.address.commune}`
+      structureAddress: structure
+        ? `${structure.address.numero || ''} ${structure.address.street} ${structure.address.commune}`
         : '',
       structureDescription: structure ? structure.otherDescription : '',
       user: user,
diff --git a/test/mock/data/structures.mock.data.ts b/test/mock/data/structures.mock.data.ts
index e387288426bb4b4ec15567a5616a9a68e259b94f..ddc26b41a27d88d32661ba31c9892f803064311c 100644
--- a/test/mock/data/structures.mock.data.ts
+++ b/test/mock/data/structures.mock.data.ts
@@ -240,6 +240,7 @@ export const structureMockDto: StructureDto = {
   personalOffers: [],
   createdAt: new Date(),
   updatedAt: new Date(),
+  toBeDeletedAt: new Date(),
   deletedAt: new Date(),
   remoteAccompaniment: true,
   dataShareConsentDate: new Date(),