diff --git a/config/docker.env b/config/docker.env
index 33390b86e773eed73ab587f677b95f67ab21549b..f9b7b0ed77658704188956a4047ef706c891fcf2 100644
--- a/config/docker.env
+++ b/config/docker.env
@@ -1,4 +1,4 @@
-SECRET_KEY_BASE=REALLY_LONG_SECRET              ## Generate it with "mix phx.gen.secret"
+SECRET_KEY_BASE=REALLY_LONG_SECRET             ## Generate it with "mix phx.gen.secret"
 GUARDIAN_SECRET_KEY_BASE=REALLY_LONG_SECRET     ## Generate it with "guardian phx.gen.secret"
 DATABASE_USER=postgres
 DATABASE_HOST=db
diff --git a/lib/diskuy/surveys.ex b/lib/diskuy/surveys.ex
new file mode 100644
index 0000000000000000000000000000000000000000..3b1ac5b8c83f3571cc517330d886c9cd3ad592d4
--- /dev/null
+++ b/lib/diskuy/surveys.ex
@@ -0,0 +1,319 @@
+defmodule Diskuy.Surveys do
+  @moduledoc """
+  The Surveys context.
+  """
+
+  import Ecto.Query, warn: false
+  alias Diskuy.Repo
+
+  alias Diskuy.Surveys.Survey
+
+  @doc """
+  Returns the list of surveys.
+
+  ## Examples
+
+      iex> list_surveys()
+      [%Survey{}, ...]
+
+  """
+  def list_surveys do
+    Repo.all(Survey)
+  end
+
+  @doc """
+  Gets a single survey.
+
+  Raises `Ecto.NoResultsError` if the Survey does not exist.
+
+  ## Examples
+
+      iex> get_survey!(123)
+      %Survey{}
+
+      iex> get_survey!(456)
+      ** (Ecto.NoResultsError)
+
+  """
+  def get_survey!(id), do: Repo.get!(Survey, id)
+
+  @doc """
+  Creates a survey.
+
+  ## Examples
+
+      iex> create_survey(%{field: value})
+      {:ok, %Survey{}}
+
+      iex> create_survey(%{field: bad_value})
+      {:error, %Ecto.Changeset{}}
+
+  """
+  def create_survey(attrs \\ %{}) do
+    %Survey{}
+    |> Survey.changeset(attrs)
+    |> Repo.insert()
+  end
+
+  @doc """
+  Updates a survey.
+
+  ## Examples
+
+      iex> update_survey(survey, %{field: new_value})
+      {:ok, %Survey{}}
+
+      iex> update_survey(survey, %{field: bad_value})
+      {:error, %Ecto.Changeset{}}
+
+  """
+  def update_survey(%Survey{} = survey, attrs) do
+    survey
+    |> Survey.changeset(attrs)
+    |> Repo.update()
+  end
+
+  @doc """
+  Deletes a survey.
+
+  ## Examples
+
+      iex> delete_survey(survey)
+      {:ok, %Survey{}}
+
+      iex> delete_survey(survey)
+      {:error, %Ecto.Changeset{}}
+
+  """
+  def delete_survey(%Survey{} = survey) do
+    Repo.delete(survey)
+  end
+
+  @doc """
+  Returns an `%Ecto.Changeset{}` for tracking survey changes.
+
+  ## Examples
+
+      iex> change_survey(survey)
+      %Ecto.Changeset{data: %Survey{}}
+
+  """
+  def change_survey(%Survey{} = survey, attrs \\ %{}) do
+    Survey.changeset(survey, attrs)
+  end
+
+  alias Diskuy.Surveys.Question
+
+  @doc """
+  Returns the list of questions.
+
+  ## Examples
+
+      iex> list_questions()
+      [%Question{}, ...]
+
+  """
+  def list_questions do
+    Repo.all(Question)
+  end
+
+  @doc """
+  Gets a single question.
+
+  Raises `Ecto.NoResultsError` if the Question does not exist.
+
+  ## Examples
+
+      iex> get_question!(123)
+      %Question{}
+
+      iex> get_question!(456)
+      ** (Ecto.NoResultsError)
+
+  """
+  def get_question!(id), do: Repo.get!(Question, id)
+
+  def get_questions_by_survey_id!(survey_id) do
+    Question
+    |> where([q], q.survey_id == ^survey_id)
+    |> select([q], %{
+      id: q.id,
+      question: q.question
+    })
+    |> Repo.all()
+  end
+
+  @doc """
+  Creates a question.
+
+  ## Examples
+
+      iex> create_question(%{field: value})
+      {:ok, %Question{}}
+
+      iex> create_question(%{field: bad_value})
+      {:error, %Ecto.Changeset{}}
+
+  """
+  def create_question(attrs \\ %{}) do
+    %Question{}
+    |> Question.changeset(attrs)
+    |> Repo.insert()
+  end
+
+  @doc """
+  Updates a question.
+
+  ## Examples
+
+      iex> update_question(question, %{field: new_value})
+      {:ok, %Question{}}
+
+      iex> update_question(question, %{field: bad_value})
+      {:error, %Ecto.Changeset{}}
+
+  """
+  def update_question(%Question{} = question, attrs) do
+    question
+    |> Question.changeset(attrs)
+    |> Repo.update()
+  end
+
+  @doc """
+  Deletes a question.
+
+  ## Examples
+
+      iex> delete_question(question)
+      {:ok, %Question{}}
+
+      iex> delete_question(question)
+      {:error, %Ecto.Changeset{}}
+
+  """
+  def delete_question(%Question{} = question) do
+    Repo.delete(question)
+  end
+
+  @doc """
+  Returns an `%Ecto.Changeset{}` for tracking question changes.
+
+  ## Examples
+
+      iex> change_question(question)
+      %Ecto.Changeset{data: %Question{}}
+
+  """
+  def change_question(%Question{} = question, attrs \\ %{}) do
+    Question.changeset(question, attrs)
+  end
+
+  alias Diskuy.Surveys.Answer
+
+  @doc """
+  Returns the list of answers.
+
+  ## Examples
+
+      iex> list_answers()
+      [%Answer{}, ...]
+
+  """
+  def list_answers do
+    Repo.all(Answer)
+  end
+
+  @doc """
+  Gets a single answer.
+
+  Raises `Ecto.NoResultsError` if the Answer does not exist.
+
+  ## Examples
+
+      iex> get_answer!(123)
+      %Answer{}
+
+      iex> get_answer!(456)
+      ** (Ecto.NoResultsError)
+
+  """
+  def get_answer!(id), do: Repo.get!(Answer, id)
+
+  def get_grouped_answers_by_query!(survey_id, question_id) do
+    Answer
+    |> join(:inner, [a], q in Question, on: a.question_id == q.id)
+    |> where([a, q], a.question_id == ^question_id)
+    |> where([a, q], q.survey_id == ^survey_id)
+    |> select([a], %{
+      answer: a.answer,
+      answer_count: count(a.id)
+    })
+    |> group_by([a], a.answer)
+    |> Repo.all()
+  end
+
+  @doc """
+  Creates a answer.
+
+  ## Examples
+
+      iex> create_answer(%{field: value})
+      {:ok, %Answer{}}
+
+      iex> create_answer(%{field: bad_value})
+      {:error, %Ecto.Changeset{}}
+
+  """
+  def create_answer(attrs \\ %{}) do
+    %Answer{}
+    |> Answer.changeset(attrs)
+    |> Repo.insert()
+  end
+
+  @doc """
+  Updates a answer.
+
+  ## Examples
+
+      iex> update_answer(answer, %{field: new_value})
+      {:ok, %Answer{}}
+
+      iex> update_answer(answer, %{field: bad_value})
+      {:error, %Ecto.Changeset{}}
+
+  """
+  def update_answer(%Answer{} = answer, attrs) do
+    answer
+    |> Answer.changeset(attrs)
+    |> Repo.update()
+  end
+
+  @doc """
+  Deletes a answer.
+
+  ## Examples
+
+      iex> delete_answer(answer)
+      {:ok, %Answer{}}
+
+      iex> delete_answer(answer)
+      {:error, %Ecto.Changeset{}}
+
+  """
+  def delete_answer(%Answer{} = answer) do
+    Repo.delete(answer)
+  end
+
+  @doc """
+  Returns an `%Ecto.Changeset{}` for tracking answer changes.
+
+  ## Examples
+
+      iex> change_answer(answer)
+      %Ecto.Changeset{data: %Answer{}}
+
+  """
+  def change_answer(%Answer{} = answer, attrs \\ %{}) do
+    Answer.changeset(answer, attrs)
+  end
+end
diff --git a/lib/diskuy/surveys/README.md b/lib/diskuy/surveys/README.md
new file mode 100644
index 0000000000000000000000000000000000000000..ce5273e1fac945899b35e28af6dd1b780a1fb890
--- /dev/null
+++ b/lib/diskuy/surveys/README.md
@@ -0,0 +1,14 @@
+# Diskuy Survey Backend
+
+## Tentang fitur
+
+Fitur ini adalah sebuah fitur yang ditujukan untuk memfasilitasi pengguna Diskuy apabila akan mengadakan survey. Pengguna dapat mengadakan suatu survey lalu meminta pengguna lain untuk mengisi surveynya. Pembuat survey dapat melihat hasil survey apabila masa survey telah berakhir.
+
+## Authors
+Kelompok MemePro
+
+* Qadzif Kamil Zahari - NPM: 1806205565
+* Iqrar Agalosi Nureyza - NPM: 1806204902
+* Christopher Samuel - NPM: 1806141151
+* Kezia Sulami - NPM: 1806133755
+* Ashila Ghassani - NPM : 1806205395
diff --git a/lib/diskuy/surveys/answer.ex b/lib/diskuy/surveys/answer.ex
new file mode 100644
index 0000000000000000000000000000000000000000..a7c1ad8b4077b358b3f0bf79d0f2c7d22e4272b5
--- /dev/null
+++ b/lib/diskuy/surveys/answer.ex
@@ -0,0 +1,19 @@
+defmodule Diskuy.Surveys.Answer do
+  use Ecto.Schema
+  import Ecto.Changeset
+
+  schema "answers" do
+    field :answer, :string
+    field :question_id, :id
+    field :user_id, :id
+
+    timestamps()
+  end
+
+  @doc false
+  def changeset(answer, attrs) do
+    answer
+    |> cast(attrs, [:answer, :question_id, :user_id])
+    |> validate_required([:answer, :question_id, :user_id])
+  end
+end
diff --git a/lib/diskuy/surveys/question.ex b/lib/diskuy/surveys/question.ex
new file mode 100644
index 0000000000000000000000000000000000000000..cb3296d5392b0f838f0e6c5e911ff44b503e8ff3
--- /dev/null
+++ b/lib/diskuy/surveys/question.ex
@@ -0,0 +1,19 @@
+defmodule Diskuy.Surveys.Question do
+  use Ecto.Schema
+  import Ecto.Changeset
+
+  schema "questions" do
+    field :question, :string
+    field :survey_id, :id
+    field :user_id, :id
+
+    timestamps()
+  end
+
+  @doc false
+  def changeset(question, attrs) do
+    question
+    |> cast(attrs, [:question, :survey_id, :user_id])
+    |> validate_required([:question, :survey_id, :user_id])
+  end
+end
diff --git a/lib/diskuy/surveys/survey.ex b/lib/diskuy/surveys/survey.ex
new file mode 100644
index 0000000000000000000000000000000000000000..049974559648448eda960f96818706823fad392a
--- /dev/null
+++ b/lib/diskuy/surveys/survey.ex
@@ -0,0 +1,18 @@
+defmodule Diskuy.Surveys.Survey do
+  use Ecto.Schema
+  import Ecto.Changeset
+
+  schema "surveys" do
+    field :user_id, :id
+    field :title, :string
+
+    timestamps()
+  end
+
+  @doc false
+  def changeset(survey, attrs) do
+    survey
+    |> cast(attrs, [:title, :user_id])
+    |> validate_required([:title, :user_id])
+  end
+end
diff --git a/lib/diskuy/surveys_page.ex b/lib/diskuy/surveys_page.ex
new file mode 100644
index 0000000000000000000000000000000000000000..61438cd7960b0449e30f20dc1a9b654d65d775a6
--- /dev/null
+++ b/lib/diskuy/surveys_page.ex
@@ -0,0 +1,40 @@
+defmodule Diskuy.SurveysPage do
+  @moduledoc """
+  The Query Builder For Paging Thread Schema.
+  """
+
+  import Ecto.Query, warn: false
+  alias Diskuy.Account.User
+  alias Diskuy.Surveys.Survey
+
+  def page_recent do
+    query = query_start()
+            |> order_by([s], desc: s.inserted_at, asc: s.title)
+    query
+  end
+
+  def page_top do
+    query_start()
+    |> order_by([s], desc: s.inserted_at, asc: s.title)
+  end
+
+  def page_search(title)do
+    query_start()
+    |> where([s], ilike(s.title, ^"%#{String.replace(title, ~r/[%_(\\)]/, "\\\\\\0") }%"))
+    |> order_by([s], asc: s.title , desc: s.inserted_at )
+  end
+
+  def page_per_user(username) do
+    query_start()
+    |> where([s, u], u.username == ^username)
+    |> order_by([s], desc: s.inserted_at, asc: s.title)
+  end
+
+  defp query_start do
+    Survey
+    |> join(:inner, [s], u in User, as: :users, on: s.user_id == u.id)
+    |> select([s, u], %{survey: %{id: s.id, title: s.title,
+                        user_id: s.user_id, username: u.username,
+                        inserted_at: s.inserted_at, updated_at: s.updated_at}})
+  end
+end
diff --git a/lib/diskuy_web/controllers/answer_controller.ex b/lib/diskuy_web/controllers/answer_controller.ex
new file mode 100644
index 0000000000000000000000000000000000000000..06353ce1d9c424a989c195671e0b2e43f8ae4b87
--- /dev/null
+++ b/lib/diskuy_web/controllers/answer_controller.ex
@@ -0,0 +1,55 @@
+defmodule DiskuyWeb.AnswerController do
+  use DiskuyWeb, :controller
+
+  alias Diskuy.Surveys
+  alias Diskuy.Surveys.Answer
+  alias DiskuyWeb.Auth.Guardian
+
+  action_fallback DiskuyWeb.FallbackController
+
+  def index(conn, _params) do
+    answers = Surveys.list_answers()
+    render(conn, "index.json", answers: answers)
+  end
+
+  def create(conn, %{"answer" => answer_params}) do
+    new_params = put_user_id(conn, %{"answer" => answer_params})
+    with {:ok, %Answer{} = answer} <- Surveys.create_answer(new_params) do
+      conn
+      |> put_status(:created)
+      |> put_resp_header("location", Routes.answer_path(conn, :show, answer))
+      |> render("show.json", answer: answer)
+    end
+  end
+
+  def show(conn, %{"id" => id}) do
+    answer = Surveys.get_answer!(id)
+    render(conn, "show.json", answer: answer)
+  end
+
+  def show_grouped_answers(conn, %{"survey_id" => survey_id, "question_id" => question_id}) do
+    json(conn, Surveys.get_grouped_answers_by_query!(survey_id, question_id))
+  end
+
+  def update(conn, %{"id" => id, "answer" => answer_params}) do
+    answer = Surveys.get_answer!(id)
+
+    with {:ok, %Answer{} = answer} <- Surveys.update_answer(answer, answer_params) do
+      render(conn, "show.json", answer: answer)
+    end
+  end
+
+  def delete(conn, %{"id" => id}) do
+    answer = Surveys.get_answer!(id)
+
+    with {:ok, %Answer{}} <- Surveys.delete_answer(answer) do
+      send_resp(conn, :no_content, "")
+    end
+  end
+
+  defp put_user_id(conn, %{"answer" => answer_params}) do
+    current_user = Guardian.Plug.current_resource(conn)
+    new_params = Map.put(answer_params, "user_id", current_user.id)
+    new_params
+  end
+end
diff --git a/lib/diskuy_web/controllers/question_controller.ex b/lib/diskuy_web/controllers/question_controller.ex
new file mode 100644
index 0000000000000000000000000000000000000000..6726edff341f514223db443697da5d5fddb7fd7b
--- /dev/null
+++ b/lib/diskuy_web/controllers/question_controller.ex
@@ -0,0 +1,55 @@
+defmodule DiskuyWeb.QuestionController do
+  use DiskuyWeb, :controller
+
+  alias Diskuy.Surveys
+  alias Diskuy.Surveys.Question
+  alias DiskuyWeb.Auth.Guardian
+
+  action_fallback DiskuyWeb.FallbackController
+
+  def index(conn, _params) do
+    questions = Surveys.list_questions()
+    render(conn, "index.json", questions: questions)
+  end
+
+  def create(conn, %{"question" => question_params}) do
+    new_params = put_user_id(conn, %{"question" => question_params})
+    with {:ok, %Question{} = question} <- Surveys.create_question(new_params) do
+      conn
+      |> put_status(:created)
+      |> put_resp_header("location", Routes.question_path(conn, :show, question))
+      |> render("show.json", question: question)
+    end
+  end
+
+  def show(conn, %{"id" => id}) do
+    question = Surveys.get_question!(id)
+    render(conn, "show.json", question: question)
+  end
+
+  def show_all_questions_by_survey_id(conn, %{"survey_id" => survey_id}) do
+    render(conn, "index.json", questions: Surveys.get_questions_by_survey_id!(survey_id))
+  end
+
+  def update(conn, %{"id" => id, "question" => question_params}) do
+    question = Surveys.get_question!(id)
+
+    with {:ok, %Question{} = question} <- Surveys.update_question(question, question_params) do
+      render(conn, "show.json", question: question)
+    end
+  end
+
+  def delete(conn, %{"id" => id}) do
+    question = Surveys.get_question!(id)
+
+    with {:ok, %Question{}} <- Surveys.delete_question(question) do
+      send_resp(conn, :no_content, "")
+    end
+  end
+
+  defp put_user_id(conn, %{"question" => question_params}) do
+    current_user = Guardian.Plug.current_resource(conn)
+    new_params = Map.put(question_params, "user_id", current_user.id)
+    new_params
+  end
+end
diff --git a/lib/diskuy_web/controllers/survey_controller.ex b/lib/diskuy_web/controllers/survey_controller.ex
new file mode 100644
index 0000000000000000000000000000000000000000..2d07a10026eefb41238d02df9ee0737e98d915c8
--- /dev/null
+++ b/lib/diskuy_web/controllers/survey_controller.ex
@@ -0,0 +1,58 @@
+defmodule DiskuyWeb.SurveyController do
+  use DiskuyWeb, :controller
+
+  alias Diskuy.Surveys
+  alias Diskuy.Surveys.Survey
+  alias DiskuyWeb.Auth.Guardian
+
+  action_fallback DiskuyWeb.FallbackController
+
+  def index(conn, _params) do
+    surveys = Surveys.list_surveys()
+    render(conn, "index.json", surveys: surveys)
+  end
+
+  def create(conn, %{"survey" => survey_params}) do
+    new_params = put_user_id(conn, %{"survey" => survey_params})
+    with {:ok, %Survey{} = survey} <- Surveys.create_survey(new_params) do
+      conn
+      |> put_status(:created)
+      |> put_resp_header("location", Routes.survey_path(conn, :show, survey))
+      |> render("show.json", survey: survey)
+    end
+  end
+
+  def show(conn, %{"id" => id}) do
+    survey = Surveys.get_survey!(id)
+    render(conn, "show.json", survey: survey)
+  end
+
+  def show_all_survey_questions(conn, %{"survey_id" => survey_id}) do
+    questions = Surveys.get_questions_by_survey_id!(survey_id)
+    survey = Surveys.get_survey!(survey_id)
+    result = %{title: survey.title, questions: questions}
+    json(conn, result)
+  end
+
+  def update(conn, %{"id" => id, "survey" => survey_params}) do
+    survey = Surveys.get_survey!(id)
+
+    with {:ok, %Survey{} = survey} <- Surveys.update_survey(survey, survey_params) do
+      render(conn, "show.json", survey: survey)
+    end
+  end
+
+  def delete(conn, %{"id" => id}) do
+    survey = Surveys.get_survey!(id)
+
+    with {:ok, %Survey{}} <- Surveys.delete_survey(survey) do
+      send_resp(conn, :no_content, "")
+    end
+  end
+
+  defp put_user_id(conn, %{"survey" => survey_params}) do
+    current_user = Guardian.Plug.current_resource(conn)
+    new_params = Map.put(survey_params, "user_id", current_user.id)
+    new_params
+  end
+end
diff --git a/lib/diskuy_web/controllers/survey_pages_controller.ex b/lib/diskuy_web/controllers/survey_pages_controller.ex
new file mode 100644
index 0000000000000000000000000000000000000000..1fb9d9954b84a3adc5f349ffe15986f4d16098e0
--- /dev/null
+++ b/lib/diskuy_web/controllers/survey_pages_controller.ex
@@ -0,0 +1,52 @@
+defmodule DiskuyWeb.SurveyPagesController do
+  use DiskuyWeb, :controller
+  alias Diskuy.SurveysPage
+  alias Diskuy.Repo
+
+  action_fallback DiskuyWeb.FallbackController
+
+  # Pages Top Pattern Matching
+  def pages_top(conn, _params) do
+    query = SurveysPage.page_top()
+    paginate_and_render(conn, query)
+  end
+
+
+  # Pages Recent Pattern Matching
+  def pages_recent(conn, _params) do
+    query = SurveysPage.page_recent()
+    paginate_and_render(conn, query)
+  end
+
+
+  # Pages Search Pattern Matching
+  def pages_search(conn, %{"title" => title}) do
+    query = SurveysPage.page_search(title)
+    paginate_and_render(conn, query)
+  end
+
+  # Pages Per User
+  def pages_user(conn, %{"username" => username}) do
+    query = SurveysPage.page_per_user(username)
+    paginate_and_render(conn, query)
+  end
+
+
+  defp paginate_and_render(conn, query) do
+    case conn.params do
+      %{"page" => page_num} ->
+        query
+        |> Repo.paginate(page: page_num) |> render_helper(conn)
+      _ ->
+        query
+        |> Repo.paginate(page: 1) |> render_helper(conn)
+    end
+  end
+
+  defp render_helper(page, conn) do
+    with %{entries: _entries} <- page do
+      render(conn, "pages.json", %{page: page})
+    end
+  end
+
+end
diff --git a/lib/diskuy_web/router.ex b/lib/diskuy_web/router.ex
index 269ac2c1b3a3f29f62b45e892d50a1a6358ab6b9..d74fea47d1606d150f6c32e567c6b26e70d415ea 100644
--- a/lib/diskuy_web/router.ex
+++ b/lib/diskuy_web/router.ex
@@ -23,6 +23,18 @@ defmodule DiskuyWeb.Router do
     resources "/topics", TopicController, except: [:new, :edit, :show, :index]
     resources "/post", PostController, except: [:new, :edit, :show, :index]
 
+    resources "/surveys", SurveyController, except: [:new, :edit]
+    options "/surveys", SurveyController, :options
+    options "/surveys/:id", SurveyController, :options
+
+    resources "/questions", QuestionController, except: [:new, :edit]
+    options "/questions", QuestionController, :options
+    options "/questions/:id", QuestionController, :options
+
+    resources "/answers", AnswerController, except: [:new, :edit]
+    options "/answers", AnswerController, :options
+    options "/answers/:id", AnswerController, :options
+
     put "/users/update", UserController, :update
     options "/users/update", UserController, :options
 
@@ -40,6 +52,12 @@ defmodule DiskuyWeb.Router do
     get "/post/checklike/:id", PostLikeController, :check_like
     options "/post/checklike/:id", PostLikeController, :options
 
+    get "/surveys/show_questions/:survey_id", SurveyController, :show_all_survey_questions
+    options "/surveys/show_questions/:survey_id", SurveyController, :options
+
+    get "/answers/:survey_id/:question_id/", AnswerController, :show_grouped_answers
+    options "/answers/:survey_id/:question_id/", AnswerController, :options
+
   end
 
   scope "/api", DiskuyWeb do
@@ -66,6 +84,15 @@ defmodule DiskuyWeb.Router do
     get "/threads/pages/user/:username",  ThreadPagesController, :pages_user
     options "/threads/pages/user/:username",  ThreadPagesController, :options
 
+    get "/surveys/pages/recent",  SurveyPagesController, :pages_recent
+    options "/surveys/pages/recent",  SurveyPagesController, :options
+    get "/surveys/pages/top",  SurveyPagesController, :pages_top
+    options "/surveys/pages/top",  SurveyPagesController, :options
+    get "/surveys/pages/search/:title",  SurveyPagesController, :pages_search
+    options "/surveys/pages/search/:title",  SurveyPagesController, :options
+    get "/surveys/pages/user/:username",  SurveyPagesController, :pages_user
+    options "/surveys/pages/user/:username",  SurveyPagesController, :options
+
 
     resources "/threads", ThreadController, except: [:new, :edit, :create, :update, :delete]
     options   "/threads", ThreadController, :options
diff --git a/lib/diskuy_web/views/answer_view.ex b/lib/diskuy_web/views/answer_view.ex
new file mode 100644
index 0000000000000000000000000000000000000000..2616819f32903ed5e963b6c0e1af3d88f790c8e3
--- /dev/null
+++ b/lib/diskuy_web/views/answer_view.ex
@@ -0,0 +1,18 @@
+defmodule DiskuyWeb.AnswerView do
+  use DiskuyWeb, :view
+  alias DiskuyWeb.AnswerView
+
+  def render("index.json", %{answers: answers}) do
+    %{data: render_many(answers, AnswerView, "answer.json")}
+  end
+
+  def render("show.json", %{answer: answer}) do
+    %{data: render_one(answer, AnswerView, "answer.json")}
+  end
+
+  def render("answer.json", %{answer: answer}) do
+    %{id: answer.id,
+      answer: answer.answer,
+      question_id: answer.question_id}
+  end
+end
diff --git a/lib/diskuy_web/views/question_view.ex b/lib/diskuy_web/views/question_view.ex
new file mode 100644
index 0000000000000000000000000000000000000000..db0a1f7acf05afbf1008a79581e846aaf67e8cef
--- /dev/null
+++ b/lib/diskuy_web/views/question_view.ex
@@ -0,0 +1,18 @@
+defmodule DiskuyWeb.QuestionView do
+  use DiskuyWeb, :view
+  alias DiskuyWeb.QuestionView
+
+  def render("index.json", %{questions: questions}) do
+    %{data: render_many(questions, QuestionView, "question.json")}
+  end
+
+  def render("show.json", %{question: question}) do
+    %{data: render_one(question, QuestionView, "question.json")}
+  end
+
+  def render("question.json", %{question: question}) do
+    %{id: question.id,
+      question: question.question,
+      survey_id: question.survey_id}
+  end
+end
diff --git a/lib/diskuy_web/views/survey_pages_view.ex b/lib/diskuy_web/views/survey_pages_view.ex
new file mode 100644
index 0000000000000000000000000000000000000000..c4a1b8862c01d8e86ba169ecd4e8b065b295312c
--- /dev/null
+++ b/lib/diskuy_web/views/survey_pages_view.ex
@@ -0,0 +1,15 @@
+defmodule DiskuyWeb.SurveyPagesView do
+  use DiskuyWeb, :view
+
+  def render("pages.json", %{page: page}) do
+    %{
+      data: Enum.map(page.entries, fn x -> x.survey end),
+      metadata: %{
+        page_number: page.page_number,
+        page_size: page.page_size,
+        total_data: page.total_entries,
+        total_pages: page.total_pages
+      }
+    }
+  end
+end
diff --git a/lib/diskuy_web/views/survey_view.ex b/lib/diskuy_web/views/survey_view.ex
new file mode 100644
index 0000000000000000000000000000000000000000..8e6668cbc7ad8056bd69529cdf9a54262f496599
--- /dev/null
+++ b/lib/diskuy_web/views/survey_view.ex
@@ -0,0 +1,22 @@
+defmodule DiskuyWeb.SurveyView do
+  use DiskuyWeb, :view
+  alias DiskuyWeb.SurveyView
+  alias Diskuy.Account
+
+  def render("index.json", %{surveys: surveys}) do
+    %{data: render_many(surveys, SurveyView, "survey.json")}
+  end
+
+  def render("show.json", %{survey: survey}) do
+    %{data: render_one(survey, SurveyView, "survey.json")}
+  end
+
+  def render("survey.json", %{survey: survey}) do
+    user = Account.get_user!(survey.user_id)
+    %{id: survey.id,
+      title: survey.title,
+      username: user.username,
+      inserted_at: survey.inserted_at,
+      updated_at: survey.updated_at}
+  end
+end
diff --git a/priv/repo/migrations/20211125070017_create_surveys.exs b/priv/repo/migrations/20211125070017_create_surveys.exs
new file mode 100644
index 0000000000000000000000000000000000000000..ebb49a9af2143afb1929c6032df25dd14d2705c9
--- /dev/null
+++ b/priv/repo/migrations/20211125070017_create_surveys.exs
@@ -0,0 +1,12 @@
+defmodule Diskuy.Repo.Migrations.CreateSurveys do
+  use Ecto.Migration
+
+  def change do
+    create table(:surveys) do
+      add :title, :string
+
+      timestamps()
+    end
+
+  end
+end
diff --git a/priv/repo/migrations/20211125075953_create_questions.exs b/priv/repo/migrations/20211125075953_create_questions.exs
new file mode 100644
index 0000000000000000000000000000000000000000..457e12408194936a3c17cf6e60c349c2f6f2c142
--- /dev/null
+++ b/priv/repo/migrations/20211125075953_create_questions.exs
@@ -0,0 +1,16 @@
+defmodule Diskuy.Repo.Migrations.CreateQuestions do
+  use Ecto.Migration
+
+  def change do
+    create table(:questions) do
+      add :question, :string
+      add :survey_id, references(:surveys, on_delete: :nothing)
+      add :user_id, references(:users, on_delete: :nothing)
+
+      timestamps()
+    end
+
+    create index(:questions, [:survey_id])
+    create index(:questions, [:user_id])
+  end
+end
diff --git a/priv/repo/migrations/20211125080109_create_answers.exs b/priv/repo/migrations/20211125080109_create_answers.exs
new file mode 100644
index 0000000000000000000000000000000000000000..4cb19358a11c0608707499571e18c69cf3829e3c
--- /dev/null
+++ b/priv/repo/migrations/20211125080109_create_answers.exs
@@ -0,0 +1,16 @@
+defmodule Diskuy.Repo.Migrations.CreateAnswers do
+  use Ecto.Migration
+
+  def change do
+    create table(:answers) do
+      add :answer, :string
+      add :question_id, references(:questions, on_delete: :nothing)
+      add :user_id, references(:users, on_delete: :nothing)
+
+      timestamps()
+    end
+
+    create index(:answers, [:question_id])
+    create index(:answers, [:user_id])
+  end
+end
diff --git a/priv/repo/migrations/20211211084707_update_surveys.exs b/priv/repo/migrations/20211211084707_update_surveys.exs
new file mode 100644
index 0000000000000000000000000000000000000000..0086b1029c98002d3d26c58e88cc77358d7e48e6
--- /dev/null
+++ b/priv/repo/migrations/20211211084707_update_surveys.exs
@@ -0,0 +1,9 @@
+defmodule Diskuy.Repo.Migrations.UpdateSurveys do
+  use Ecto.Migration
+
+  def change do
+    alter table(:surveys) do
+      add :user_id, references(:users, on_delete: :nothing)
+    end
+  end
+end
diff --git a/priv/repo/migrations/20211213095711_update_survey_fk.exs b/priv/repo/migrations/20211213095711_update_survey_fk.exs
new file mode 100644
index 0000000000000000000000000000000000000000..f848791a3c9706cacfbc8568e8eef79186370162
--- /dev/null
+++ b/priv/repo/migrations/20211213095711_update_survey_fk.exs
@@ -0,0 +1,10 @@
+defmodule Diskuy.Repo.Migrations.UpdateSurveyFk do
+  use Ecto.Migration
+
+  def change do
+    drop constraint(:surveys, "surveys_user_id_fkey")
+    alter table(:surveys) do
+      modify :user_id, references(:users, on_delete: :delete_all, type: :id)
+    end
+  end
+end
diff --git a/priv/repo/migrations/20211213100227_update_questions_fk.exs b/priv/repo/migrations/20211213100227_update_questions_fk.exs
new file mode 100644
index 0000000000000000000000000000000000000000..d93be4942344c759861ef244b8f34b909af4a328
--- /dev/null
+++ b/priv/repo/migrations/20211213100227_update_questions_fk.exs
@@ -0,0 +1,12 @@
+defmodule Diskuy.Repo.Migrations.UpdateQuestionsFk do
+  use Ecto.Migration
+
+  def change do
+    drop constraint(:questions, "questions_user_id_fkey")
+    drop constraint(:questions, "questions_survey_id_fkey")
+    alter table(:questions) do
+      modify :user_id, references(:users, on_delete: :delete_all, type: :id)
+      modify :survey_id, references(:surveys, on_delete: :delete_all, type: :id)
+    end
+  end
+end
diff --git a/priv/repo/migrations/20211213100337_update_answers_fk.exs b/priv/repo/migrations/20211213100337_update_answers_fk.exs
new file mode 100644
index 0000000000000000000000000000000000000000..66ee6e64824b7cf7f63c5e8e1c4e74d0a27dc309
--- /dev/null
+++ b/priv/repo/migrations/20211213100337_update_answers_fk.exs
@@ -0,0 +1,12 @@
+defmodule Diskuy.Repo.Migrations.UpdateAnswersFk do
+  use Ecto.Migration
+
+  def change do
+    drop constraint(:answers, "answers_user_id_fkey")
+    drop constraint(:answers, "answers_question_id_fkey")
+    alter table(:answers) do
+      modify :user_id, references(:users, on_delete: :delete_all, type: :id)
+      modify :question_id, references(:questions, on_delete: :delete_all, type: :id)
+    end
+  end
+end
diff --git a/test/diskuy/surveys_test.exs b/test/diskuy/surveys_test.exs
new file mode 100644
index 0000000000000000000000000000000000000000..f304101344c9a7938b7e6d8fd88a06e6e54c0673
--- /dev/null
+++ b/test/diskuy/surveys_test.exs
@@ -0,0 +1,182 @@
+defmodule Diskuy.SurveysTest do
+  use Diskuy.DataCase
+
+  alias Diskuy.Surveys
+
+  describe "surveys" do
+    alias Diskuy.Surveys.Survey
+
+    @valid_attrs %{title: "some title"}
+    @update_attrs %{title: "some updated title"}
+    @invalid_attrs %{title: nil}
+
+    def survey_fixture(attrs \\ %{}) do
+      {:ok, survey} =
+        attrs
+        |> Enum.into(@valid_attrs)
+        |> Surveys.create_survey()
+
+      survey
+    end
+
+    test "list_surveys/0 returns all surveys" do
+      survey = survey_fixture()
+      assert Surveys.list_surveys() == [survey]
+    end
+
+    test "get_survey!/1 returns the survey with given id" do
+      survey = survey_fixture()
+      assert Surveys.get_survey!(survey.id) == survey
+    end
+
+    test "create_survey/1 with valid data creates a survey" do
+      assert {:ok, %Survey{} = survey} = Surveys.create_survey(@valid_attrs)
+      assert survey.title == "some title"
+    end
+
+    test "create_survey/1 with invalid data returns error changeset" do
+      assert {:error, %Ecto.Changeset{}} = Surveys.create_survey(@invalid_attrs)
+    end
+
+    test "update_survey/2 with valid data updates the survey" do
+      survey = survey_fixture()
+      assert {:ok, %Survey{} = survey} = Surveys.update_survey(survey, @update_attrs)
+      assert survey.title == "some updated title"
+    end
+
+    test "update_survey/2 with invalid data returns error changeset" do
+      survey = survey_fixture()
+      assert {:error, %Ecto.Changeset{}} = Surveys.update_survey(survey, @invalid_attrs)
+      assert survey == Surveys.get_survey!(survey.id)
+    end
+
+    test "delete_survey/1 deletes the survey" do
+      survey = survey_fixture()
+      assert {:ok, %Survey{}} = Surveys.delete_survey(survey)
+      assert_raise Ecto.NoResultsError, fn -> Surveys.get_survey!(survey.id) end
+    end
+
+    test "change_survey/1 returns a survey changeset" do
+      survey = survey_fixture()
+      assert %Ecto.Changeset{} = Surveys.change_survey(survey)
+    end
+  end
+
+  describe "questions" do
+    alias Diskuy.Surveys.Question
+
+    @valid_attrs %{question: "some question"}
+    @update_attrs %{question: "some updated question"}
+    @invalid_attrs %{question: nil}
+
+    def question_fixture(attrs \\ %{}) do
+      {:ok, question} =
+        attrs
+        |> Enum.into(@valid_attrs)
+        |> Surveys.create_question()
+
+      question
+    end
+
+    test "list_questions/0 returns all questions" do
+      question = question_fixture()
+      assert Surveys.list_questions() == [question]
+    end
+
+    test "get_question!/1 returns the question with given id" do
+      question = question_fixture()
+      assert Surveys.get_question!(question.id) == question
+    end
+
+    test "create_question/1 with valid data creates a question" do
+      assert {:ok, %Question{} = question} = Surveys.create_question(@valid_attrs)
+      assert question.question == "some question"
+    end
+
+    test "create_question/1 with invalid data returns error changeset" do
+      assert {:error, %Ecto.Changeset{}} = Surveys.create_question(@invalid_attrs)
+    end
+
+    test "update_question/2 with valid data updates the question" do
+      question = question_fixture()
+      assert {:ok, %Question{} = question} = Surveys.update_question(question, @update_attrs)
+      assert question.question == "some updated question"
+    end
+
+    test "update_question/2 with invalid data returns error changeset" do
+      question = question_fixture()
+      assert {:error, %Ecto.Changeset{}} = Surveys.update_question(question, @invalid_attrs)
+      assert question == Surveys.get_question!(question.id)
+    end
+
+    test "delete_question/1 deletes the question" do
+      question = question_fixture()
+      assert {:ok, %Question{}} = Surveys.delete_question(question)
+      assert_raise Ecto.NoResultsError, fn -> Surveys.get_question!(question.id) end
+    end
+
+    test "change_question/1 returns a question changeset" do
+      question = question_fixture()
+      assert %Ecto.Changeset{} = Surveys.change_question(question)
+    end
+  end
+
+  describe "answers" do
+    alias Diskuy.Surveys.Answer
+
+    @valid_attrs %{answer: "some answer"}
+    @update_attrs %{answer: "some updated answer"}
+    @invalid_attrs %{answer: nil}
+
+    def answer_fixture(attrs \\ %{}) do
+      {:ok, answer} =
+        attrs
+        |> Enum.into(@valid_attrs)
+        |> Surveys.create_answer()
+
+      answer
+    end
+
+    test "list_answers/0 returns all answers" do
+      answer = answer_fixture()
+      assert Surveys.list_answers() == [answer]
+    end
+
+    test "get_answer!/1 returns the answer with given id" do
+      answer = answer_fixture()
+      assert Surveys.get_answer!(answer.id) == answer
+    end
+
+    test "create_answer/1 with valid data creates a answer" do
+      assert {:ok, %Answer{} = answer} = Surveys.create_answer(@valid_attrs)
+      assert answer.answer == "some answer"
+    end
+
+    test "create_answer/1 with invalid data returns error changeset" do
+      assert {:error, %Ecto.Changeset{}} = Surveys.create_answer(@invalid_attrs)
+    end
+
+    test "update_answer/2 with valid data updates the answer" do
+      answer = answer_fixture()
+      assert {:ok, %Answer{} = answer} = Surveys.update_answer(answer, @update_attrs)
+      assert answer.answer == "some updated answer"
+    end
+
+    test "update_answer/2 with invalid data returns error changeset" do
+      answer = answer_fixture()
+      assert {:error, %Ecto.Changeset{}} = Surveys.update_answer(answer, @invalid_attrs)
+      assert answer == Surveys.get_answer!(answer.id)
+    end
+
+    test "delete_answer/1 deletes the answer" do
+      answer = answer_fixture()
+      assert {:ok, %Answer{}} = Surveys.delete_answer(answer)
+      assert_raise Ecto.NoResultsError, fn -> Surveys.get_answer!(answer.id) end
+    end
+
+    test "change_answer/1 returns a answer changeset" do
+      answer = answer_fixture()
+      assert %Ecto.Changeset{} = Surveys.change_answer(answer)
+    end
+  end
+end
diff --git a/test/diskuy_web/controllers/answer_controller_test.exs b/test/diskuy_web/controllers/answer_controller_test.exs
new file mode 100644
index 0000000000000000000000000000000000000000..1682b4102e56914947a166b7112748a877206ca7
--- /dev/null
+++ b/test/diskuy_web/controllers/answer_controller_test.exs
@@ -0,0 +1,86 @@
+defmodule DiskuyWeb.AnswerControllerTest do
+  use DiskuyWeb.ConnCase
+
+  alias Diskuy.Surveys
+  alias Diskuy.Surveys.Answer
+
+  @create_attrs %{
+
+  }
+  @update_attrs %{
+
+  }
+  @invalid_attrs %{}
+
+  def fixture(:answer) do
+    {:ok, answer} = Surveys.create_answer(@create_attrs)
+    answer
+  end
+
+  setup %{conn: conn} do
+    {:ok, conn: put_req_header(conn, "accept", "application/json")}
+  end
+
+  describe "index" do
+    test "lists all answers", %{conn: conn} do
+      conn = get(conn, Routes.answer_path(conn, :index))
+      assert json_response(conn, 200)["data"] == []
+    end
+  end
+
+  describe "create answer" do
+    test "renders answer when data is valid", %{conn: conn} do
+      conn = post(conn, Routes.answer_path(conn, :create), answer: @create_attrs)
+      assert %{"id" => id} = json_response(conn, 201)["data"]
+
+      conn = get(conn, Routes.answer_path(conn, :show, id))
+
+      assert %{
+               "id" => id
+             } = json_response(conn, 200)["data"]
+    end
+
+    test "renders errors when data is invalid", %{conn: conn} do
+      conn = post(conn, Routes.answer_path(conn, :create), answer: @invalid_attrs)
+      assert json_response(conn, 422)["errors"] != %{}
+    end
+  end
+
+  describe "update answer" do
+    setup [:create_answer]
+
+    test "renders answer when data is valid", %{conn: conn, answer: %Answer{id: id} = answer} do
+      conn = put(conn, Routes.answer_path(conn, :update, answer), answer: @update_attrs)
+      assert %{"id" => ^id} = json_response(conn, 200)["data"]
+
+      conn = get(conn, Routes.answer_path(conn, :show, id))
+
+      assert %{
+               "id" => id
+             } = json_response(conn, 200)["data"]
+    end
+
+    test "renders errors when data is invalid", %{conn: conn, answer: answer} do
+      conn = put(conn, Routes.answer_path(conn, :update, answer), answer: @invalid_attrs)
+      assert json_response(conn, 422)["errors"] != %{}
+    end
+  end
+
+  describe "delete answer" do
+    setup [:create_answer]
+
+    test "deletes chosen answer", %{conn: conn, answer: answer} do
+      conn = delete(conn, Routes.answer_path(conn, :delete, answer))
+      assert response(conn, 204)
+
+      assert_error_sent 404, fn ->
+        get(conn, Routes.answer_path(conn, :show, answer))
+      end
+    end
+  end
+
+  defp create_answer(_) do
+    answer = fixture(:answer)
+    %{answer: answer}
+  end
+end
diff --git a/test/diskuy_web/controllers/question_controller_test.exs b/test/diskuy_web/controllers/question_controller_test.exs
new file mode 100644
index 0000000000000000000000000000000000000000..7b379945db31b2dd2ed6215b68ea7f2412f8d048
--- /dev/null
+++ b/test/diskuy_web/controllers/question_controller_test.exs
@@ -0,0 +1,86 @@
+defmodule DiskuyWeb.QuestionControllerTest do
+  use DiskuyWeb.ConnCase
+
+  alias Diskuy.Surveys
+  alias Diskuy.Surveys.Question
+
+  @create_attrs %{
+
+  }
+  @update_attrs %{
+
+  }
+  @invalid_attrs %{}
+
+  def fixture(:question) do
+    {:ok, question} = Surveys.create_question(@create_attrs)
+    question
+  end
+
+  setup %{conn: conn} do
+    {:ok, conn: put_req_header(conn, "accept", "application/json")}
+  end
+
+  describe "index" do
+    test "lists all questions", %{conn: conn} do
+      conn = get(conn, Routes.question_path(conn, :index))
+      assert json_response(conn, 200)["data"] == []
+    end
+  end
+
+  describe "create question" do
+    test "renders question when data is valid", %{conn: conn} do
+      conn = post(conn, Routes.question_path(conn, :create), question: @create_attrs)
+      assert %{"id" => id} = json_response(conn, 201)["data"]
+
+      conn = get(conn, Routes.question_path(conn, :show, id))
+
+      assert %{
+               "id" => id
+             } = json_response(conn, 200)["data"]
+    end
+
+    test "renders errors when data is invalid", %{conn: conn} do
+      conn = post(conn, Routes.question_path(conn, :create), question: @invalid_attrs)
+      assert json_response(conn, 422)["errors"] != %{}
+    end
+  end
+
+  describe "update question" do
+    setup [:create_question]
+
+    test "renders question when data is valid", %{conn: conn, question: %Question{id: id} = question} do
+      conn = put(conn, Routes.question_path(conn, :update, question), question: @update_attrs)
+      assert %{"id" => ^id} = json_response(conn, 200)["data"]
+
+      conn = get(conn, Routes.question_path(conn, :show, id))
+
+      assert %{
+               "id" => id
+             } = json_response(conn, 200)["data"]
+    end
+
+    test "renders errors when data is invalid", %{conn: conn, question: question} do
+      conn = put(conn, Routes.question_path(conn, :update, question), question: @invalid_attrs)
+      assert json_response(conn, 422)["errors"] != %{}
+    end
+  end
+
+  describe "delete question" do
+    setup [:create_question]
+
+    test "deletes chosen question", %{conn: conn, question: question} do
+      conn = delete(conn, Routes.question_path(conn, :delete, question))
+      assert response(conn, 204)
+
+      assert_error_sent 404, fn ->
+        get(conn, Routes.question_path(conn, :show, question))
+      end
+    end
+  end
+
+  defp create_question(_) do
+    question = fixture(:question)
+    %{question: question}
+  end
+end
diff --git a/test/diskuy_web/controllers/survey_controller_test.exs b/test/diskuy_web/controllers/survey_controller_test.exs
new file mode 100644
index 0000000000000000000000000000000000000000..7340836bbd240d26ef79ef95212ed81cfefd6f55
--- /dev/null
+++ b/test/diskuy_web/controllers/survey_controller_test.exs
@@ -0,0 +1,88 @@
+defmodule DiskuyWeb.SurveyControllerTest do
+  use DiskuyWeb.ConnCase
+
+  alias Diskuy.Surveys
+  alias Diskuy.Surveys.Survey
+
+  @create_attrs %{
+    title: "some title"
+  }
+  @update_attrs %{
+    title: "some updated title"
+  }
+  @invalid_attrs %{title: nil}
+
+  def fixture(:survey) do
+    {:ok, survey} = Surveys.create_survey(@create_attrs)
+    survey
+  end
+
+  setup %{conn: conn} do
+    {:ok, conn: put_req_header(conn, "accept", "application/json")}
+  end
+
+  describe "index" do
+    test "lists all surveys", %{conn: conn} do
+      conn = get(conn, Routes.survey_path(conn, :index))
+      assert json_response(conn, 200)["data"] == []
+    end
+  end
+
+  describe "create survey" do
+    test "renders survey when data is valid", %{conn: conn} do
+      conn = post(conn, Routes.survey_path(conn, :create), survey: @create_attrs)
+      assert %{"id" => id} = json_response(conn, 201)["data"]
+
+      conn = get(conn, Routes.survey_path(conn, :show, id))
+
+      assert %{
+               "id" => id,
+               "title" => "some title"
+             } = json_response(conn, 200)["data"]
+    end
+
+    test "renders errors when data is invalid", %{conn: conn} do
+      conn = post(conn, Routes.survey_path(conn, :create), survey: @invalid_attrs)
+      assert json_response(conn, 422)["errors"] != %{}
+    end
+  end
+
+  describe "update survey" do
+    setup [:create_survey]
+
+    test "renders survey when data is valid", %{conn: conn, survey: %Survey{id: id} = survey} do
+      conn = put(conn, Routes.survey_path(conn, :update, survey), survey: @update_attrs)
+      assert %{"id" => ^id} = json_response(conn, 200)["data"]
+
+      conn = get(conn, Routes.survey_path(conn, :show, id))
+
+      assert %{
+               "id" => id,
+               "title" => "some updated title"
+             } = json_response(conn, 200)["data"]
+    end
+
+    test "renders errors when data is invalid", %{conn: conn, survey: survey} do
+      conn = put(conn, Routes.survey_path(conn, :update, survey), survey: @invalid_attrs)
+      assert json_response(conn, 422)["errors"] != %{}
+    end
+  end
+
+  describe "delete survey" do
+    setup [:create_survey]
+
+    test "deletes chosen survey", %{conn: conn, survey: survey} do
+      conn = delete(conn, Routes.survey_path(conn, :delete, survey))
+      assert response(conn, 204)
+
+      assert_error_sent 404, fn ->
+        get(conn, Routes.survey_path(conn, :show, survey))
+      end
+    end
+  end
+
+  defp create_survey(_) do
+    survey = fixture(:survey)
+    %{survey: survey}
+  end
+end