diff --git a/app/controllers/characters_controller.rb b/app/controllers/characters_controller.rb
new file mode 100644
index 0000000..0c5ec8f
--- /dev/null
+++ b/app/controllers/characters_controller.rb
@@ -0,0 +1,62 @@
+# frozen_string_literal: true
+
+class CharactersController < ApplicationController
+ before_action :set_character, only: [ :show, :edit, :update, :destroy ]
+
+ def index
+ @characters = Current.user.characters
+ end
+
+ def new
+ @character = Current.user.characters.new
+ end
+
+ def create
+ @character = Current.user.characters.new(character_params)
+ if @character.save
+ redirect_to @character, notice: t(".success")
+ else
+ flash.now[:alert] = t(".error")
+ render :new, status: :unprocessable_entity
+ end
+ end
+
+ def show
+ end
+
+ def edit
+ end
+
+ def update
+ if @character.update(character_params)
+ redirect_to @character, notice: t(".success", name: @character.name)
+ else
+ flash.now[:alert] = t(".error")
+ render :edit, status: :unprocessable_entity
+ end
+ end
+
+ def destroy
+ name = @character.name
+ if @character.destroy
+ redirect_to characters_path, notice: t(".success", name:)
+ else
+ flash[:alert] = t(".error")
+ redirect_to characters_path
+ end
+ end
+
+ private
+
+ def set_character
+ @character = Current.user.characters.find(params[:id])
+ end
+
+ def character_params
+ params.require(:character).permit(
+ :name,
+ :game_system_id,
+ :table_id,
+ )
+ end
+end
diff --git a/app/views/characters/_character.html.erb b/app/views/characters/_character.html.erb
new file mode 100644
index 0000000..ad913dc
--- /dev/null
+++ b/app/views/characters/_character.html.erb
@@ -0,0 +1,4 @@
+
>
+
<%= link_to character.name, character %>
+
<%= character.game_system.name %>
+
diff --git a/app/views/characters/_form.html.erb b/app/views/characters/_form.html.erb
new file mode 100644
index 0000000..51673bc
--- /dev/null
+++ b/app/views/characters/_form.html.erb
@@ -0,0 +1,17 @@
+<%# locals: (button_text:) -%>
+
+<%= form_with model: @character do |f| %>
+ <%= f.label :name %>
+ <%= f.text_field :name%>
+ <%= display_form_errors(@character, :name) %>
+
+ <%= f.label :game_system_id %>
+ <%= f.collection_select :game_system_id, GameSystem.all, :id, :name, required: true, include_blank: " " %>
+ <%= display_form_errors(@character, :game_system) %>
+
+ <%= f.label :table_id %>
+ <%= f.collection_select :table_id, Current.user.tables, :id, :name, required: true, include_blank: " " %>
+ <%= display_form_errors(@character, :table) %>
+
+ <%= f.submit button_text %>
+<% end %>
diff --git a/app/views/characters/edit.html.erb b/app/views/characters/edit.html.erb
new file mode 100644
index 0000000..f884835
--- /dev/null
+++ b/app/views/characters/edit.html.erb
@@ -0,0 +1,7 @@
+<% content_for :title, t(".edit_character", name: @character.name) %>
+
+<%= t(".edit_character", name: @character.name) %>
+
+<%= link_to t(".delete_character", name: @character.name), character_path(@character),
+ data: { turbo_method: :delete, turbo_confirm: t(".delete_character_confirmation", name: @character.name) } %>
+<%= render partial: "form", locals: { button_text: t(".update") } %>
diff --git a/app/views/characters/index.html.erb b/app/views/characters/index.html.erb
new file mode 100644
index 0000000..1e84238
--- /dev/null
+++ b/app/views/characters/index.html.erb
@@ -0,0 +1,11 @@
+<% content_for :title, t(".my_characters") %>
+
+<%= t(".my_characters") %>
+
+<%= link_to t(".add_character"), new_character_path %>
+
+<% if @characters.any? %>
+ <%= render @characters %>
+<% else %>
+ <%= t(".no_characters") %>
+<% end %>
diff --git a/app/views/characters/new.html.erb b/app/views/characters/new.html.erb
new file mode 100644
index 0000000..c1760f2
--- /dev/null
+++ b/app/views/characters/new.html.erb
@@ -0,0 +1,5 @@
+<% content_for :title, t(".new_character") %>
+
+<%= t(".new_character") %>
+
+<%= render partial: "form", locals: { button_text: t(".create") } %>
diff --git a/app/views/characters/show.html.erb b/app/views/characters/show.html.erb
new file mode 100644
index 0000000..df61176
--- /dev/null
+++ b/app/views/characters/show.html.erb
@@ -0,0 +1,16 @@
+<% content_for :title, @character.name %>
+
+<%= @character.name %>
+
+<%= link_to t(".edit"), edit_character_path(@character) %>
+
+
+ - <%= t(".owner") %>
+ - <%= link_to @character.user.username, @character.user %>
+ - <%= t(".game_system") %>
+ - <%= @character.game_system.name %>
+ <% if @character.table && @character.table.users.include?(Current.user) %>
+ - <%= t(".table") %>
+ - <%= link_to @character.table.name, @character.table %>
+ <% end %>
+
diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb
index 7c547c8..bed8668 100644
--- a/app/views/layouts/application.html.erb
+++ b/app/views/layouts/application.html.erb
@@ -18,6 +18,7 @@