diff --git a/src/database/Database.go b/src/database/Database.go
index 7f52689ac43cfe81b620b77c121bc78d764e572b..ee28160143f2a99b2a1c6b2dcbfcf2ca9c218835 100644
--- a/src/database/Database.go
+++ b/src/database/Database.go
@@ -51,6 +51,7 @@ func initialize() {
 	dbInstance.AutoMigrate(&models.PendaftaranTA{})
 	dbInstance.AutoMigrate(&models.Ruangan{})
 	dbInstance.AutoMigrate(&models.PendaftaranSidSem{})
+	dbInstance.AutoMigrate(&models.PeriodPendaftaran{})
 	dbInstance.AutoMigrate(&models.PengujiSidsem{})
 	dbInstance.AutoMigrate(&models.DosenBimbingan{})
 	dbInstance.AutoMigrate(&models.UsulanJudul{})
diff --git a/src/handler/handler.go b/src/handler/handler.go
index 66939c2f2fd73055acca2584a75504c4306a5623..d9f5c953353ca9d8806914d9b8b1341f08017a6e 100644
--- a/src/handler/handler.go
+++ b/src/handler/handler.go
@@ -20,6 +20,8 @@ import (
 	pendaftaranSidSemTransport "gitlab.informatika.org/k-01-11/graduit-be/src/module/pendaftaran_sidsem/transport"
 	periodePendaftaranConfig "gitlab.informatika.org/k-01-11/graduit-be/src/module/period_pendaftaran/config"
 	periodePendaftaranTransport "gitlab.informatika.org/k-01-11/graduit-be/src/module/period_pendaftaran/transport"
+	ruanganConfig "gitlab.informatika.org/k-01-11/graduit-be/src/module/ruangan/config"
+	ruanganTransport "gitlab.informatika.org/k-01-11/graduit-be/src/module/ruangan/transport"
 	schedulingConfig "gitlab.informatika.org/k-01-11/graduit-be/src/module/scheduling/config"
 	schedulingTransport "gitlab.informatika.org/k-01-11/graduit-be/src/module/scheduling/transport"
 	systemLogConfig "gitlab.informatika.org/k-01-11/graduit-be/src/module/system_log/config"
@@ -29,6 +31,7 @@ import (
 )
 
 type Service struct {
+	AdminRuanganHandler               *ruanganTransport.AdminRuanganHandler
 	InternalSystemLogHandler          *systemLogTransport.InternalSystemLogHandler
 	AdminSytemLogHandler              *systemLogTransport.AdminSystemLogHandler
 	AdminBimbinganLogHandler          *bimbinganLogTransport.AdminBimbinganLogHandler
@@ -45,7 +48,7 @@ type Service struct {
 	DosbingBimbinganLogHandler        *bimbinganLogTransport.DosbingimbinganLogHandler
 	TIMTASchedulingHandler            *schedulingTransport.TIMTASchedulingHandler
 	MahasiswaPendaftaranSidSemHandler *pendaftaranSidSemTransport.MahasiswaPendaftaranSidSemHandler
-	TIMTAPendaftaranSidSemHandler		*pendaftaranSidSemTransport.TIMTAPendaftaranSidSemHandler
+	TIMTAPendaftaranSidSemHandler     *pendaftaranSidSemTransport.TIMTAPendaftaranSidSemHandler
 }
 
 func MakeHandler() *Service {
@@ -106,7 +109,7 @@ func MakeHandler() *Service {
 	})
 
 	TIMTAPendaftaranSidSemHandler := pendaftaranSidSemTransport.NewTIMTAPendaftaranSidSemHandler(pendaftaranSidSemConfig.PendaftaranSidSemTransportConfig{
-		DBRead: dbRead,
+		DBRead:  dbRead,
 		DBWrite: dbWrite,
 	})
 
@@ -119,7 +122,10 @@ func MakeHandler() *Service {
 		DBWrite: dbWrite,
 		DBRead:  dbRead,
 	})
-
+	AdminRuanganHandler := ruanganTransport.NewAdminRuanganHandler(ruanganConfig.RuanganTransportConfig{
+		DBWrite: dbWrite,
+		DBRead:  dbRead,
+	})
 	MahasiswaPendaftaranSidSemHandler := pendaftaranSidSemTransport.NewMahasiswaPendaftaranSidSemHandler(pendaftaranSidSemConfig.PendaftaranSidSemTransportConfig{
 		DBWrite: dbWrite,
 		DBRead:  dbRead,
@@ -142,6 +148,7 @@ func MakeHandler() *Service {
 		AdminDashboardTimTugasHandler:     AdminDashboardTimTugasHandler,
 		TIMTASchedulingHandler:            TIMTASchedulingHandlerHandler,
 		MahasiswaPendaftaranSidSemHandler: MahasiswaPendaftaranSidSemHandler,
-		TIMTAPendaftaranSidSemHandler:  	TIMTAPendaftaranSidSemHandler,
+		TIMTAPendaftaranSidSemHandler:     TIMTAPendaftaranSidSemHandler,
+		AdminRuanganHandler:               AdminRuanganHandler,
 	}
 }
diff --git a/src/handler/server.go b/src/handler/server.go
index 53b2d86baa7459f5ab88c8dafd5d81285ea878db..dd64b3778d9061e73d91305b2fabbf22256790fb 100644
--- a/src/handler/server.go
+++ b/src/handler/server.go
@@ -46,6 +46,7 @@ func (s *Service) InitializeRoutes() *echo.Echo {
 	s.AdminPendaftaranHandler.MountAdmin(adminGroup)
 	s.AdminPeriodePendaftaranHandler.MountAdmin(adminGroup)
 	s.AdminDashboardTimTugasHandler.MountAdmin(adminGroup)
+	s.AdminRuanganHandler.MountAdmin(adminGroup)
 
 	mahasiswaGroup := e.Group("api/mahasiswa")
 	mahasiswaGroup.Use(middleware.Validator("S1_MAHASISWA"))
diff --git a/src/module/ruangan/config/common.go b/src/module/ruangan/config/common.go
new file mode 100644
index 0000000000000000000000000000000000000000..6b84f4b3d6b233cb8d0c947862be0c2a903812e3
--- /dev/null
+++ b/src/module/ruangan/config/common.go
@@ -0,0 +1,8 @@
+package config
+
+import "gorm.io/gorm"
+
+type RuanganTransportConfig struct {
+	DBWrite *gorm.DB
+	DBRead  *gorm.DB
+}
diff --git a/src/module/ruangan/entity/ruangan.go b/src/module/ruangan/entity/ruangan.go
new file mode 100644
index 0000000000000000000000000000000000000000..7aa7499f818f37d902b57a59dc22c81274dc47d7
--- /dev/null
+++ b/src/module/ruangan/entity/ruangan.go
@@ -0,0 +1,11 @@
+package entity
+
+type Ruangan struct {
+	ID   string `gorm:"type:uuid;primaryKey;default:gen_random_uuid()"`
+	Nama string `gorm:"type:text"`
+}
+
+type ParamValues struct {
+	Limit  int
+	Offset int
+}
diff --git a/src/module/ruangan/internal/repository/ruangan.go b/src/module/ruangan/internal/repository/ruangan.go
new file mode 100644
index 0000000000000000000000000000000000000000..e7d7263e74f0783a7d6d7650f774946f613f82f0
--- /dev/null
+++ b/src/module/ruangan/internal/repository/ruangan.go
@@ -0,0 +1,56 @@
+package repository
+
+import (
+	"github.com/google/uuid"
+	"gitlab.informatika.org/k-01-11/graduit-be/src/module/ruangan/entity"
+	"gorm.io/gorm"
+)
+
+type RuanganRepo struct {
+	DBWrite *gorm.DB
+	DBRead  *gorm.DB
+}
+
+func NewRuanganRepository(dbWrite *gorm.DB, dbRead *gorm.DB) *RuanganRepo {
+	return &RuanganRepo{
+		DBWrite: dbWrite,
+		DBRead:  dbRead,
+	}
+}
+
+func (repo *RuanganRepo) NewRuangan(ruangan entity.Ruangan) (output entity.Ruangan, err error) {
+	ruangan.ID = uuid.New().String()
+
+	result := repo.DBWrite.Create(&ruangan)
+	if result.Error != nil {
+		return entity.Ruangan{}, result.Error
+	}
+	return ruangan, nil
+}
+
+func (repo *RuanganRepo) GetRuangan(limit int, offset int) (output []entity.Ruangan, err error) {
+	var ruangan []entity.Ruangan
+	result := repo.DBRead.Limit(limit).Offset(offset).Find(&ruangan)
+	if result.Error != nil {
+		return nil, err
+	}
+	return ruangan, nil
+}
+
+func (repo *RuanganRepo) GetRuanganById(id string) (output entity.Ruangan, err error) {
+	var ruangan entity.Ruangan
+	result := repo.DBRead.Where("id = ?", id).Find(&ruangan)
+	if result.Error != nil {
+		return entity.Ruangan{}, err
+	}
+	return ruangan, nil
+}
+
+func (repo *RuanganRepo) GetAllRuangan() (output []entity.Ruangan, err error) {
+	var ruangan []entity.Ruangan
+	result := repo.DBRead.Find(&ruangan)
+	if result.Error != nil {
+		return nil, err
+	}
+	return ruangan, nil
+}
diff --git a/src/module/ruangan/internal/usecase/repository.go b/src/module/ruangan/internal/usecase/repository.go
new file mode 100644
index 0000000000000000000000000000000000000000..e69045c33a7998475319f5f6392ec91a5e8eac56
--- /dev/null
+++ b/src/module/ruangan/internal/usecase/repository.go
@@ -0,0 +1,10 @@
+package usecase
+
+import "gitlab.informatika.org/k-01-11/graduit-be/src/module/ruangan/entity"
+
+type RuanganRepository interface {
+	NewRuangan(ruangan entity.Ruangan) (output entity.Ruangan, err error)
+	GetRuangan(limit int, offset int) (output []entity.Ruangan, err error)
+	GetRuanganById(id string) (output entity.Ruangan, err error)
+	GetAllRuangan() (output []entity.Ruangan, err error)
+}
diff --git a/src/module/ruangan/internal/usecase/ruangan.go b/src/module/ruangan/internal/usecase/ruangan.go
new file mode 100644
index 0000000000000000000000000000000000000000..8f64ec6249504452c20cfa605bd93afe1e7a1ca6
--- /dev/null
+++ b/src/module/ruangan/internal/usecase/ruangan.go
@@ -0,0 +1,46 @@
+package usecase
+
+import (
+	"gitlab.informatika.org/k-01-11/graduit-be/src/module/ruangan/entity"
+	"gitlab.informatika.org/k-01-11/graduit-be/src/utils"
+)
+
+type RuanganUsecase interface {
+	AddRuangan(ruangan entity.Ruangan) (entity.Ruangan, error)
+	GetRuangan(param utils.LimitOffset) ([]entity.Ruangan, error)
+	GetRuanganById(id string) (entity.Ruangan, error)
+	GetAllRuangan() ([]entity.Ruangan, error)
+}
+
+type RuanganUc struct {
+	ruanganRepo RuanganRepository
+}
+
+func NewRuanganUseCase(ruanganRepo RuanganRepository) *RuanganUc {
+	return &RuanganUc{
+		ruanganRepo: ruanganRepo,
+	}
+}
+
+func (uc *RuanganUc) AddRuangan(ruangan entity.Ruangan) (entity.Ruangan, error) {
+	newRuangan, err := uc.ruanganRepo.NewRuangan(ruangan)
+
+	if err != nil {
+		return newRuangan, err
+	}
+
+	return newRuangan, nil
+
+}
+
+func (uc *RuanganUc) GetRuangan(param utils.LimitOffset) ([]entity.Ruangan, error) {
+	return uc.ruanganRepo.GetRuangan(param.Limit, param.Offset)
+}
+
+func (uc *RuanganUc) GetRuanganById(id string) (entity.Ruangan, error) {
+	return uc.ruanganRepo.GetRuanganById(id)
+}
+
+func (uc *RuanganUc) GetAllRuangan() ([]entity.Ruangan, error) {
+	return uc.ruanganRepo.GetAllRuangan()
+}
diff --git a/src/module/ruangan/transport/admin_handler.go b/src/module/ruangan/transport/admin_handler.go
new file mode 100644
index 0000000000000000000000000000000000000000..25c4d9fc0719b6f6e58cd181082e19ee9e4a9d83
--- /dev/null
+++ b/src/module/ruangan/transport/admin_handler.go
@@ -0,0 +1,117 @@
+package transport
+
+import (
+	"net/http"
+
+	"github.com/labstack/echo/v4"
+	"gitlab.informatika.org/k-01-11/graduit-be/src/module/ruangan/config"
+	"gitlab.informatika.org/k-01-11/graduit-be/src/module/ruangan/entity"
+	"gitlab.informatika.org/k-01-11/graduit-be/src/module/ruangan/internal/repository"
+	"gitlab.informatika.org/k-01-11/graduit-be/src/module/ruangan/internal/usecase"
+	"gitlab.informatika.org/k-01-11/graduit-be/src/utils"
+)
+
+type AdminRuanganHandler struct {
+	ruanganUsecase usecase.RuanganUsecase
+}
+
+func NewAdminRuanganHandler(cfg config.RuanganTransportConfig) *AdminRuanganHandler {
+	ruanganRepository := repository.NewRuanganRepository(cfg.DBWrite, cfg.DBRead)
+	ruanganUsecase := usecase.NewRuanganUseCase(ruanganRepository)
+
+	return &AdminRuanganHandler{
+		ruanganUsecase: ruanganUsecase,
+	}
+
+}
+
+func (t *AdminRuanganHandler) MountAdmin(group *echo.Group) {
+	group.GET("/ruangan", t.GetRuangan)
+	group.GET("/ruangan-id", t.GetRuanganById)
+	group.GET("/ruangan-all", t.GetAllRuangan)
+	group.POST("/ruangan", t.AddRuangan)
+}
+
+// AddRuangan adds a new entity for Ruangan
+// @Summary Add new Ruangan entity
+// @Description Adds a new entity for ruangan
+// @Tags Ruang
+// @Accept json
+// @Produce json
+// @Param batch body entity.Ruangan true "Ruangan object"
+// @Success 200 {object} entity.Ruangan "Ruangan successfully added"
+// @Router /api/admin/ruangan [post]
+func (t *AdminRuanganHandler) AddRuangan(c echo.Context) error {
+	request := new(entity.Ruangan)
+	if err := c.Bind(&request); err != nil {
+		return c.JSON(http.StatusBadRequest, utils.ResponseDetailOutput(false, http.StatusBadRequest, err.Error(), nil))
+	}
+
+	ruangan, err := t.ruanganUsecase.AddRuangan(*request)
+	if err != nil {
+		return c.JSON(http.StatusBadRequest, utils.ResponseDetailOutput(false, http.StatusBadRequest, err.Error(), nil))
+	}
+
+	return c.JSON(http.StatusOK, utils.ResponseDetailOutput(true, http.StatusOK, "Ruangan successfully added", ruangan))
+}
+
+// GetRuangan retrieves a list of ruangan in table ruangan
+// @Summary Retrieve list of ruangan
+// @Description Retrieves a list of ruangan in table ruangan with specific offset and limit
+// @Tags Ruang
+// @Accept json
+// @Produce json
+// @Param limit query int false "Limit number of ruangan per page"
+// @Param offset query int false "Offset for pagination"
+// @Success 200 {object} entity.Ruangan "Ruangan successfully added"
+// @Router /api/admin/ruangan [get]
+func (t *AdminRuanganHandler) GetRuangan(c echo.Context) error {
+	param, err := utils.GetLimitOffset(c.QueryParams())
+	if err != nil {
+		return c.JSON(http.StatusInternalServerError, utils.ResponseDetailOutput(false, http.StatusInternalServerError, err.Error(), nil))
+	}
+
+	ruangan, err := t.ruanganUsecase.GetRuangan(param)
+	if err != nil {
+		return c.JSON(http.StatusBadRequest, utils.ResponseDetailOutput(false, http.StatusBadRequest, err.Error(), nil))
+	}
+
+	return c.JSON(http.StatusOK, utils.ResponseDetailOutput(true, http.StatusOK, "Ruangan successfully retreived", ruangan))
+}
+
+// GetRuangan retrieves a ruangan entity with specific ID
+// @Summary Retrieve list of ruangan
+// @Description Retrieves a ruangan entity in table ruangan with specific ID
+// @Tags Ruang
+// @Accept json
+// @Produce json
+// @Param id query string true "ID of Ruangan"
+// @Success 200 {object} entity.Ruangan "Ruangan successfully added"
+// @Router /api/admin/ruangan-id [get]
+func (t *AdminRuanganHandler) GetRuanganById(c echo.Context) error {
+	id := c.QueryParam("id")
+
+	ruangan, err := t.ruanganUsecase.GetRuanganById(id)
+	if err != nil {
+		return c.JSON(http.StatusBadRequest, utils.ResponseDetailOutput(false, http.StatusBadRequest, err.Error(), nil))
+	}
+
+	return c.JSON(http.StatusOK, utils.ResponseDetailOutput(true, http.StatusOK, "Ruangan successfully retreived", ruangan))
+}
+
+// GetRuangan retrieves a list of ruangan in table ruangan
+// @Summary Retrieve list of ruangan
+// @Description Retrieves a list of ruangan in table ruangan
+// @Tags Ruang
+// @Accept json
+// @Produce json
+// @Success 200 {object} entity.Ruangan "Ruangan successfully added"
+// @Router /api/admin/ruangan-all [get]
+func (t *AdminRuanganHandler) GetAllRuangan(c echo.Context) error {
+	ruangan, err := t.ruanganUsecase.GetAllRuangan()
+	if err != nil {
+		return c.JSON(http.StatusBadRequest, utils.ResponseDetailOutput(false, http.StatusBadRequest, err.Error(), nil))
+	}
+
+	return c.JSON(http.StatusOK, utils.ResponseDetailOutput(true, http.StatusOK, "Ruangan successfully retreived", ruangan))
+}