diff --git a/CHANGELOG.MD b/CHANGELOG.MD
new file mode 100644
index 0000000..1cc9e2e
--- /dev/null
+++ b/CHANGELOG.MD
@@ -0,0 +1,6 @@
+# Changelog
+
+All notable changes to this project will automatically be documented in this file.
+
+The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
+and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..48617dc
--- /dev/null
+++ b/README.md
@@ -0,0 +1,72 @@
+# terraform-aws-mcaf-route53-resolver
+
+Terraform module to create Route53 resolver. This will be useful when creating the Route53 Resolver either inbound or outbound.
+
+Please note that this module does not cover the Resolver query logging.
+
+IMPORTANT: We do not pin modules to versions in our examples. We highly recommend that in your code you pin the version to the exact version you are using so that your infrastructure remains stable.
+
+## Terraform AWS Route53 Resolver Module
+
+
+
+## Requirements
+
+| Name | Version |
+|------|---------|
+| [terraform](#requirement_terraform) | >= 1.9 |
+| [aws](#requirement_aws) | >= 5.32 |
+
+## Providers
+
+| Name | Version |
+|------|---------|
+| [aws](#provider_aws) | >= 5.32 |
+
+## Modules
+
+| Name | Source | Version |
+|------|--------|---------|
+| [security_group](#security_group) | schubergphilis/mcaf-security-group/aws | 0.1.0 |
+
+## Resources
+
+| Name | Type |
+|------|------|
+| [aws_route53_resolver_endpoint.default](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/route53_resolver_endpoint) | resource |
+
+## Inputs
+
+| Name | Description | Type | Default | Required |
+|------|-------------|------|---------|:--------:|
+| [create_security_group](#input_create_security_group) | Whether to create Security Groups for Route53 Resolver Endpoints | `bool` | `true` | no |
+| [direction](#input_direction) | The resolver endpoint flow direction | `string` | `"INBOUND"` | no |
+| [ip_address](#input_ip_address) | A list of IP addresses and subnets where Route53 resolver endpoints will be deployed | `list(object({ ip = optional(string), subnet_id = string }))` | `[]` | no |
+| [name](#input_name) | The resolver endpoint name | `string` | n/a | yes |
+| [protocols](#input_protocols) | The resolver endpoint protocols | `list(string)` | `[]` | no |
+| [security_group_description](#input_security_group_description) | Security group description for DNS resolver | `string` | `null` | no |
+| [security_group_egress_cidr_blocks](#input_security_group_egress_cidr_blocks) | CIDR blocks allowed in security group egress rules | `string` | `"0.0.0.0/0"` | no |
+| [security_group_ids](#input_security_group_ids) | A list of security group IDs | `list(string)` | `[]` | no |
+| [security_group_ingress_cidr_blocks](#input_security_group_ingress_cidr_blocks) | CIDR blocks allowed in security group ingress rules | `string` | `""` | no |
+| [security_group_name](#input_security_group_name) | The name of the security group | `string` | `null` | no |
+| [security_group_name_prefix](#input_security_group_name_prefix) | Prefix for the security group name | `string` | `null` | no |
+| [subnet_ids](#input_subnet_ids) | List of subnets where Route53 resolver endpoints will be deployed | `list(string)` | `[]` | no |
+| [tags](#input_tags) | A map of tags for the Route53 resolver endpoint | `map(string)` | `{}` | no |
+| [type](#input_type) | The resolver endpoint IP type | `string` | `"IPV4"` | no |
+| [vpc_id](#input_vpc_id) | The VPC ID for all the Route53 Resolver Endpoints | `string` | `""` | no |
+
+## Outputs
+
+| Name | Description |
+|------|-------------|
+| [route53_resolver_endpoint_id](#output_route53_resolver_endpoint_id) | The ID of the Resolver Endpoint |
+| [route53_resolver_endpoint_arn](#output_route53_resolver_endpoint_arn) | The ARN of the Resolver Endpoint |
+| [route53_resolver_endpoint_host_vpc_id](#output_route53_resolver_endpoint_host_vpc_id) | The VPC ID used by the Resolver Endpoint |
+| [route53_resolver_endpoint_security_group_ids](#output_route53_resolver_endpoint_security_group_ids) | Security Group IDs mapped to Resolver Endpoint |
+| [route53_resolver_endpoint_ip_addresses](#output_route53_resolver_endpoint_ip_addresses) | Resolver Endpoint IP Addresses |
+
+
+
+## Licensing
+
+100% Open Source and licensed under the Apache License Version 2.0. See [LICENSE](https://github.com/schubergphilis/terraform-aws-mcaf-user/blob/master/LICENSE) for full details.
diff --git a/examples/basic/main.tf b/examples/basic/main.tf
new file mode 100644
index 0000000..9158b0f
--- /dev/null
+++ b/examples/basic/main.tf
@@ -0,0 +1,29 @@
+provider "aws" {
+ region = "eu-west-1"
+}
+
+# Example to create the Route53 Inbound Resolver.
+module "inbound_resolver_endpoints" {
+ source = "../.."
+
+ direction = "INBOUND"
+ name = "resolver-endpoints-example"
+ protocols = ["Do53", "DoH"]
+ security_group_ingress_cidr_blocks = module.vpc.vpc_cidr_block
+ security_group_name_prefix = "resolver-endpoints-example-"
+ subnet_ids = module.vpc.private_subnets
+ vpc_id = module.vpc.vpc_id
+}
+
+# Example to create the Route53 Outbound Resolver
+module "outbound_resolver_endpoints" {
+ source = "../.."
+
+ direction = "OUTBOUND"
+ name = "resolver-endpoints-example"
+ protocols = ["Do53", "DoH"]
+ security_group_ingress_cidr_blocks = module.vpc.vpc_cidr_block
+ security_group_name_prefix = "resolver-endpoints-example-"
+ subnet_ids = module.vpc.private_subnets
+ vpc_id = module.vpc.vpc_id
+}
diff --git a/examples/basic/terraform.tf b/examples/basic/terraform.tf
new file mode 100644
index 0000000..1eb03bc
--- /dev/null
+++ b/examples/basic/terraform.tf
@@ -0,0 +1,10 @@
+terraform {
+ required_version = ">= 1.9"
+
+ required_providers {
+ aws = {
+ source = "hashicorp/aws"
+ version = ">= 5.32"
+ }
+ }
+}
diff --git a/main.tf b/main.tf
new file mode 100644
index 0000000..54691dc
--- /dev/null
+++ b/main.tf
@@ -0,0 +1,55 @@
+locals {
+ security_group_ids = var.create_security_group ? [module.security_group[0].id] : var.security_group_ids
+ subnet_ids = [for subnet in var.subnet_ids : { subnet_id = subnet }]
+}
+
+resource "aws_route53_resolver_endpoint" "default" {
+ direction = var.direction
+ name = var.name
+ protocols = var.protocols
+ resolver_endpoint_type = var.type
+ security_group_ids = local.security_group_ids
+ tags = var.tags
+
+ dynamic "ip_address" {
+ for_each = length(var.ip_address) == 0 ? local.subnet_ids : var.ip_address
+
+ content {
+ ip = lookup(ip_address.value, "ip", null)
+ subnet_id = ip_address.value.subnet_id
+ }
+ }
+}
+
+module "security_group" {
+ count = var.create_security_group ? 1 : 0
+
+ source = "schubergphilis/mcaf-security-group/aws"
+ version = "0.1.0"
+
+ description = var.security_group_description
+ name = var.security_group_name
+ name_prefix = var.security_group_name_prefix
+ tags = var.tags
+ vpc_id = var.vpc_id
+
+ egress_rules = {
+ for protocol in toset(["tcp", "udp"]) : "${protocol}-53" => {
+ description = "Allow DNS for outside world"
+ ip_protocol = protocol
+ from_port = 53
+ to_port = 53
+ cidr_ipv4 = var.security_group_egress_cidr_blocks
+ }
+ }
+
+ ingress_rules = {
+ for protocol in toset(["tcp", "udp"]) : "${protocol}-53" => {
+ description = "Allow DNS on port 53 for defined CIDR blocks"
+ ip_protocol = protocol
+ from_port = 53
+ to_port = 53
+ cidr_ipv4 = var.security_group_ingress_cidr_blocks
+ }
+ }
+}
diff --git a/outputs.tf b/outputs.tf
new file mode 100644
index 0000000..42e7a50
--- /dev/null
+++ b/outputs.tf
@@ -0,0 +1,24 @@
+output "route53_resolver_endpoint_id" {
+ description = "The ID of the Resolver Endpoint"
+ value = aws_route53_resolver_endpoint.default.id
+}
+
+output "route53_resolver_endpoint_arn" {
+ description = "The ARN of the Resolver Endpoint"
+ value = aws_route53_resolver_endpoint.default.arn
+}
+
+output "route53_resolver_endpoint_host_vpc_id" {
+ description = "The VPC ID used by the Resolver Endpoint"
+ value = aws_route53_resolver_endpoint.default.host_vpc_id
+}
+
+output "route53_resolver_endpoint_security_group_ids" {
+ description = "Security Group IDs mapped to Resolver Endpoint"
+ value = aws_route53_resolver_endpoint.default.security_group_ids
+}
+
+output "route53_resolver_endpoint_ip_addresses" {
+ description = "Resolver Endpoint IP Addresses"
+ value = aws_route53_resolver_endpoint.default.ip_address
+}
diff --git a/terraform.tf b/terraform.tf
new file mode 100644
index 0000000..1eb03bc
--- /dev/null
+++ b/terraform.tf
@@ -0,0 +1,10 @@
+terraform {
+ required_version = ">= 1.9"
+
+ required_providers {
+ aws = {
+ source = "hashicorp/aws"
+ version = ">= 5.32"
+ }
+ }
+}
diff --git a/variables.tf b/variables.tf
new file mode 100644
index 0000000..58df678
--- /dev/null
+++ b/variables.tf
@@ -0,0 +1,97 @@
+variable "create_security_group" {
+ type = bool
+ default = true
+ description = "Whether to create Security Groups for Route53 Resolver Endpoints"
+}
+
+variable "direction" {
+ type = string
+ default = "INBOUND"
+ description = "The resolver endpoint flow direction"
+}
+
+variable "ip_address" {
+ type = list(object({
+ ip = optional(string)
+ subnet_id = string
+ }))
+ default = []
+ description = "A list of IP addresses and subnets where Route53 resolver endpoints will be deployed"
+}
+
+variable "name" {
+ type = string
+ description = "The resolver endpoint name"
+}
+
+variable "protocols" {
+ type = list(string)
+ default = []
+ description = "The resolver endpoint protocols"
+}
+
+variable "security_group_description" {
+ type = string
+ default = null
+ description = "This security group is created to allow port 53 for DNS resolver"
+}
+
+variable "security_group_egress_cidr_blocks" {
+ type = string
+ default = "0.0.0.0/0"
+ description = "A list of CIDR blocks to allow on security group egress rules"
+ nullable = false
+}
+
+variable "security_group_ids" {
+ type = list(string)
+ default = []
+ description = "A list of security group IDs"
+}
+
+variable "security_group_ingress_cidr_blocks" {
+ type = string
+ default = ""
+ description = "A list of CIDR blocks to allow on security group ingress rules"
+}
+
+variable "security_group_name" {
+ type = string
+ default = null
+ description = "The name of the security group"
+}
+
+variable "security_group_name_prefix" {
+ type = string
+ default = null
+ description = "The prefix of the security group"
+}
+
+variable "subnet_ids" {
+ type = list(string)
+ default = []
+ description = "A list of subnets where Route53 resolver endpoints will be deployed"
+
+ validation {
+ condition = length(var.subnet_ids) == 0 || length(var.ip_address) == 0
+ error_message = "Either 'subnet_ids' or 'ip_address' can be defined."
+ }
+}
+
+variable "tags" {
+ type = map(string)
+ default = {}
+ description = "A map of tags for the Route53 resolver endpoint"
+}
+
+variable "type" {
+ type = string
+ default = "IPV4"
+ description = "The resolver endpoint IP type"
+}
+
+variable "vpc_id" {
+ type = string
+ default = ""
+ description = "The VPC ID for all the Route53 Resolver Endpoints"
+}