diff --git a/src/main/kotlin/dev/usbharu/hideout/Application.kt b/src/main/kotlin/dev/usbharu/hideout/Application.kt
index dc4d2788..0acd75e5 100644
--- a/src/main/kotlin/dev/usbharu/hideout/Application.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/Application.kt
@@ -15,17 +15,17 @@ import dev.usbharu.hideout.plugins.*
 import dev.usbharu.hideout.query.FollowerQueryService
 import dev.usbharu.hideout.query.UserQueryService
 import dev.usbharu.hideout.routing.register
-import dev.usbharu.hideout.service.activitypub.ActivityPubService
-import dev.usbharu.hideout.service.activitypub.ActivityPubUserService
-import dev.usbharu.hideout.service.api.IPostApiService
-import dev.usbharu.hideout.service.api.IUserApiService
+import dev.usbharu.hideout.service.ap.APService
+import dev.usbharu.hideout.service.ap.APUserService
+import dev.usbharu.hideout.service.api.PostApiService
+import dev.usbharu.hideout.service.api.UserApiService
 import dev.usbharu.hideout.service.api.UserAuthApiService
 import dev.usbharu.hideout.service.api.WebFingerApiService
 import dev.usbharu.hideout.service.auth.HttpSignatureVerifyService
 import dev.usbharu.hideout.service.core.*
 import dev.usbharu.hideout.service.job.JobQueueParentService
 import dev.usbharu.hideout.service.job.KJobJobQueueParentService
-import dev.usbharu.hideout.service.user.IUserService
+import dev.usbharu.hideout.service.user.UserService
 import dev.usbharu.kjob.exposed.ExposedKJob
 import io.ktor.client.*
 import io.ktor.client.engine.cio.*
@@ -94,26 +94,26 @@ fun Application.parent() {
     configureKoin(module, HideoutModule().module)
     configureStatusPages()
     runBlocking {
-        inject<IServerInitialiseService>().value.init()
+        inject<ServerInitialiseService>().value.init()
     }
     configureCompression()
     configureHTTP()
     configureStaticRouting()
     configureMonitoring()
     configureSerialization()
-    register(inject<IUserApiService>().value)
+    register(inject<UserApiService>().value)
     configureSecurity(
 
         inject<JwkProvider>().value,
-        inject<IMetaService>().value
+        inject<MetaService>().value
     )
     configureRouting(
         httpSignatureVerifyService = inject<HttpSignatureVerifyService>().value,
-        activityPubService = inject<ActivityPubService>().value,
-        userService = inject<IUserService>().value,
-        activityPubUserService = inject<ActivityPubUserService>().value,
-        postService = inject<IPostApiService>().value,
-        userApiService = inject<IUserApiService>().value,
+        apService = inject<APService>().value,
+        userService = inject<UserService>().value,
+        apUserService = inject<APUserService>().value,
+        postService = inject<PostApiService>().value,
+        userApiService = inject<UserApiService>().value,
         userQueryService = inject<UserQueryService>().value,
         followerQueryService = inject<FollowerQueryService>().value,
         userAuthApiService = inject<UserAuthApiService>().value,
@@ -128,28 +128,28 @@ fun Application.worker() {
         connectionDatabase = inject<Database>().value
     }.start()
 
-    val activityPubService = inject<ActivityPubService>().value
+    val apService = inject<APService>().value
 
     kJob.register(ReceiveFollowJob) {
         execute {
-            activityPubService.processActivity(this, it)
+            apService.processActivity(this, it)
         }
     }
     kJob.register(DeliverPostJob) {
         execute {
-            activityPubService.processActivity(this, it)
+            apService.processActivity(this, it)
         }
     }
 
     kJob.register(DeliverReactionJob) {
         execute {
-            activityPubService.processActivity(this, it)
+            apService.processActivity(this, it)
         }
     }
 
     kJob.register(DeliverRemoveReactionJob) {
         execute {
-            activityPubService.processActivity(this, it)
+            apService.processActivity(this, it)
         }
     }
 }
diff --git a/src/main/kotlin/dev/usbharu/hideout/domain/model/ap/ObjectDeserializer.kt b/src/main/kotlin/dev/usbharu/hideout/domain/model/ap/ObjectDeserializer.kt
index d3b47879..66af888a 100644
--- a/src/main/kotlin/dev/usbharu/hideout/domain/model/ap/ObjectDeserializer.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/domain/model/ap/ObjectDeserializer.kt
@@ -4,7 +4,7 @@ import com.fasterxml.jackson.core.JsonParser
 import com.fasterxml.jackson.databind.DeserializationContext
 import com.fasterxml.jackson.databind.JsonDeserializer
 import com.fasterxml.jackson.databind.JsonNode
-import dev.usbharu.hideout.service.activitypub.ExtendedActivityVocabulary
+import dev.usbharu.hideout.service.ap.ExtendedActivityVocabulary
 
 class ObjectDeserializer : JsonDeserializer<Object>() {
     @Suppress("LongMethod", "CyclomaticComplexMethod")
diff --git a/src/main/kotlin/dev/usbharu/hideout/plugins/ActivityPub.kt b/src/main/kotlin/dev/usbharu/hideout/plugins/ActivityPub.kt
index bb30773b..f501fa98 100644
--- a/src/main/kotlin/dev/usbharu/hideout/plugins/ActivityPub.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/plugins/ActivityPub.kt
@@ -4,7 +4,7 @@ import dev.usbharu.hideout.config.Config
 import dev.usbharu.hideout.domain.model.ap.JsonLd
 import dev.usbharu.hideout.query.UserQueryService
 import dev.usbharu.hideout.service.core.Transaction
-import dev.usbharu.hideout.service.user.UserAuthService
+import dev.usbharu.hideout.service.user.UserAuthServiceImpl
 import dev.usbharu.hideout.util.HttpUtil.Activity
 import io.ktor.client.*
 import io.ktor.client.plugins.api.*
@@ -73,7 +73,7 @@ val httpSignaturePlugin = createClientPlugin("HttpSign", ::HttpSignaturePluginCo
             println("Digest !!")
 //            UserAuthService.sha256.reset()
             val digest =
-                Base64.getEncoder().encodeToString(UserAuthService.sha256.digest(body.toByteArray(Charsets.UTF_8)))
+                Base64.getEncoder().encodeToString(UserAuthServiceImpl.sha256.digest(body.toByteArray(Charsets.UTF_8)))
             request.headers.append("Digest", "sha-256=$digest")
         }
 
diff --git a/src/main/kotlin/dev/usbharu/hideout/plugins/Routing.kt b/src/main/kotlin/dev/usbharu/hideout/plugins/Routing.kt
index 5fcd18de..178127b5 100644
--- a/src/main/kotlin/dev/usbharu/hideout/plugins/Routing.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/plugins/Routing.kt
@@ -9,15 +9,15 @@ import dev.usbharu.hideout.routing.api.internal.v1.auth
 import dev.usbharu.hideout.routing.api.internal.v1.posts
 import dev.usbharu.hideout.routing.api.internal.v1.users
 import dev.usbharu.hideout.routing.wellknown.webfinger
-import dev.usbharu.hideout.service.activitypub.ActivityPubService
-import dev.usbharu.hideout.service.activitypub.ActivityPubUserService
-import dev.usbharu.hideout.service.api.IPostApiService
-import dev.usbharu.hideout.service.api.IUserApiService
+import dev.usbharu.hideout.service.ap.APService
+import dev.usbharu.hideout.service.ap.APUserService
+import dev.usbharu.hideout.service.api.PostApiService
+import dev.usbharu.hideout.service.api.UserApiService
 import dev.usbharu.hideout.service.api.UserAuthApiService
 import dev.usbharu.hideout.service.api.WebFingerApiService
 import dev.usbharu.hideout.service.auth.HttpSignatureVerifyService
 import dev.usbharu.hideout.service.core.Transaction
-import dev.usbharu.hideout.service.user.IUserService
+import dev.usbharu.hideout.service.user.UserService
 import io.ktor.server.application.*
 import io.ktor.server.plugins.autohead.*
 import io.ktor.server.routing.*
@@ -25,11 +25,11 @@ import io.ktor.server.routing.*
 @Suppress("LongParameterList")
 fun Application.configureRouting(
     httpSignatureVerifyService: HttpSignatureVerifyService,
-    activityPubService: ActivityPubService,
-    userService: IUserService,
-    activityPubUserService: ActivityPubUserService,
-    postService: IPostApiService,
-    userApiService: IUserApiService,
+    apService: APService,
+    userService: UserService,
+    apUserService: APUserService,
+    postService: PostApiService,
+    userApiService: UserApiService,
     userQueryService: UserQueryService,
     followerQueryService: FollowerQueryService,
     userAuthApiService: UserAuthApiService,
@@ -38,9 +38,9 @@ fun Application.configureRouting(
 ) {
     install(AutoHeadResponse)
     routing {
-        inbox(httpSignatureVerifyService, activityPubService)
+        inbox(httpSignatureVerifyService, apService)
         outbox()
-        usersAP(activityPubUserService, userQueryService, followerQueryService, transaction)
+        usersAP(apUserService, userQueryService, followerQueryService, transaction)
         webfinger(webFingerApiService)
         route("/api/internal/v1") {
             posts(postService)
diff --git a/src/main/kotlin/dev/usbharu/hideout/plugins/Security.kt b/src/main/kotlin/dev/usbharu/hideout/plugins/Security.kt
index 84966882..a4d7d34d 100644
--- a/src/main/kotlin/dev/usbharu/hideout/plugins/Security.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/plugins/Security.kt
@@ -2,7 +2,7 @@ package dev.usbharu.hideout.plugins
 
 import com.auth0.jwk.JwkProvider
 import dev.usbharu.hideout.config.Config
-import dev.usbharu.hideout.service.core.IMetaService
+import dev.usbharu.hideout.service.core.MetaService
 import dev.usbharu.hideout.util.JsonWebKeyUtil
 import io.ktor.http.*
 import io.ktor.server.application.*
@@ -16,7 +16,7 @@ const val TOKEN_AUTH = "jwt-auth"
 @Suppress("MagicNumber")
 fun Application.configureSecurity(
     jwkProvider: JwkProvider,
-    metaService: IMetaService
+    metaService: MetaService
 ) {
     val issuer = Config.configData.url
     install(Authentication) {
diff --git a/src/main/kotlin/dev/usbharu/hideout/repository/IUserRepository.kt b/src/main/kotlin/dev/usbharu/hideout/repository/IUserRepository.kt
deleted file mode 100644
index e717f7b0..00000000
--- a/src/main/kotlin/dev/usbharu/hideout/repository/IUserRepository.kt
+++ /dev/null
@@ -1,18 +0,0 @@
-package dev.usbharu.hideout.repository
-
-import dev.usbharu.hideout.domain.model.hideout.entity.User
-
-@Suppress("TooManyFunctions")
-interface IUserRepository {
-    suspend fun save(user: User): User
-
-    suspend fun findById(id: Long): User?
-
-    suspend fun delete(id: Long)
-
-    suspend fun deleteFollowRequest(id: Long, follower: Long)
-
-    suspend fun findFollowRequestsById(id: Long, follower: Long): Boolean
-
-    suspend fun nextId(): Long
-}
diff --git a/src/main/kotlin/dev/usbharu/hideout/repository/IJwtRefreshTokenRepository.kt b/src/main/kotlin/dev/usbharu/hideout/repository/JwtRefreshTokenRepository.kt
similarity index 88%
rename from src/main/kotlin/dev/usbharu/hideout/repository/IJwtRefreshTokenRepository.kt
rename to src/main/kotlin/dev/usbharu/hideout/repository/JwtRefreshTokenRepository.kt
index 19f8774a..d6bc5638 100644
--- a/src/main/kotlin/dev/usbharu/hideout/repository/IJwtRefreshTokenRepository.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/repository/JwtRefreshTokenRepository.kt
@@ -2,7 +2,7 @@ package dev.usbharu.hideout.repository
 
 import dev.usbharu.hideout.domain.model.hideout.entity.JwtRefreshToken
 
-interface IJwtRefreshTokenRepository {
+interface JwtRefreshTokenRepository {
     suspend fun generateId(): Long
 
     suspend fun save(token: JwtRefreshToken)
diff --git a/src/main/kotlin/dev/usbharu/hideout/repository/JwtRefreshTokenRepositoryImpl.kt b/src/main/kotlin/dev/usbharu/hideout/repository/JwtRefreshTokenRepositoryImpl.kt
index d93797d2..0fdc79dd 100644
--- a/src/main/kotlin/dev/usbharu/hideout/repository/JwtRefreshTokenRepositoryImpl.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/repository/JwtRefreshTokenRepositoryImpl.kt
@@ -13,7 +13,7 @@ class JwtRefreshTokenRepositoryImpl(
     private val database: Database,
     private val idGenerateService: IdGenerateService
 ) :
-    IJwtRefreshTokenRepository {
+    JwtRefreshTokenRepository {
 
     init {
         transaction(database) {
diff --git a/src/main/kotlin/dev/usbharu/hideout/repository/IMetaRepository.kt b/src/main/kotlin/dev/usbharu/hideout/repository/MetaRepository.kt
similarity index 85%
rename from src/main/kotlin/dev/usbharu/hideout/repository/IMetaRepository.kt
rename to src/main/kotlin/dev/usbharu/hideout/repository/MetaRepository.kt
index b90be212..5fda5200 100644
--- a/src/main/kotlin/dev/usbharu/hideout/repository/IMetaRepository.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/repository/MetaRepository.kt
@@ -2,7 +2,7 @@ package dev.usbharu.hideout.repository
 
 import dev.usbharu.hideout.domain.model.hideout.entity.Meta
 
-interface IMetaRepository {
+interface MetaRepository {
 
     suspend fun save(meta: Meta)
 
diff --git a/src/main/kotlin/dev/usbharu/hideout/repository/MetaRepositoryImpl.kt b/src/main/kotlin/dev/usbharu/hideout/repository/MetaRepositoryImpl.kt
index 86dbc786..d0de63a1 100644
--- a/src/main/kotlin/dev/usbharu/hideout/repository/MetaRepositoryImpl.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/repository/MetaRepositoryImpl.kt
@@ -7,7 +7,7 @@ import org.koin.core.annotation.Single
 import java.util.*
 
 @Single
-class MetaRepositoryImpl(private val database: Database) : IMetaRepository {
+class MetaRepositoryImpl(private val database: Database) : MetaRepository {
 
     init {
         transaction(database) {
diff --git a/src/main/kotlin/dev/usbharu/hideout/repository/IPostRepository.kt b/src/main/kotlin/dev/usbharu/hideout/repository/PostRepository.kt
similarity index 90%
rename from src/main/kotlin/dev/usbharu/hideout/repository/IPostRepository.kt
rename to src/main/kotlin/dev/usbharu/hideout/repository/PostRepository.kt
index 2e0faf91..21a9bec8 100644
--- a/src/main/kotlin/dev/usbharu/hideout/repository/IPostRepository.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/repository/PostRepository.kt
@@ -3,7 +3,7 @@ package dev.usbharu.hideout.repository
 import dev.usbharu.hideout.domain.model.hideout.entity.Post
 
 @Suppress("LongParameterList")
-interface IPostRepository {
+interface PostRepository {
     suspend fun generateId(): Long
     suspend fun save(post: Post): Post
     suspend fun delete(id: Long)
diff --git a/src/main/kotlin/dev/usbharu/hideout/repository/PostRepositoryImpl.kt b/src/main/kotlin/dev/usbharu/hideout/repository/PostRepositoryImpl.kt
index b9ca5f77..8782a54f 100644
--- a/src/main/kotlin/dev/usbharu/hideout/repository/PostRepositoryImpl.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/repository/PostRepositoryImpl.kt
@@ -9,7 +9,7 @@ import org.jetbrains.exposed.sql.transactions.transaction
 import org.koin.core.annotation.Single
 
 @Single
-class PostRepositoryImpl(database: Database, private val idGenerateService: IdGenerateService) : IPostRepository {
+class PostRepositoryImpl(database: Database, private val idGenerateService: IdGenerateService) : PostRepository {
 
     init {
         transaction(database) {
diff --git a/src/main/kotlin/dev/usbharu/hideout/repository/UserRepository.kt b/src/main/kotlin/dev/usbharu/hideout/repository/UserRepository.kt
index b9064bf8..17344d24 100644
--- a/src/main/kotlin/dev/usbharu/hideout/repository/UserRepository.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/repository/UserRepository.kt
@@ -1,137 +1,18 @@
 package dev.usbharu.hideout.repository
 
 import dev.usbharu.hideout.domain.model.hideout.entity.User
-import dev.usbharu.hideout.service.core.IdGenerateService
-import org.jetbrains.exposed.dao.id.LongIdTable
-import org.jetbrains.exposed.sql.*
-import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
-import org.jetbrains.exposed.sql.transactions.transaction
-import org.koin.core.annotation.Single
-import java.time.Instant
 
-@Single
-class UserRepository(private val database: Database, private val idGenerateService: IdGenerateService) :
-    IUserRepository {
-    init {
-        transaction(database) {
-            SchemaUtils.create(Users)
-            SchemaUtils.create(UsersFollowers)
-            SchemaUtils.createMissingTablesAndColumns(Users)
-            SchemaUtils.createMissingTablesAndColumns(UsersFollowers)
-            SchemaUtils.create(FollowRequests)
-            SchemaUtils.createMissingTablesAndColumns(FollowRequests)
-        }
-    }
+@Suppress("TooManyFunctions")
+interface UserRepository {
+    suspend fun save(user: User): User
 
-    override suspend fun save(user: User): User {
-        val singleOrNull = Users.select { Users.id eq user.id }.singleOrNull()
-        if (singleOrNull == null) {
-            Users.insert {
-                it[id] = user.id
-                it[name] = user.name
-                it[domain] = user.domain
-                it[screenName] = user.screenName
-                it[description] = user.description
-                it[password] = user.password
-                it[inbox] = user.inbox
-                it[outbox] = user.outbox
-                it[url] = user.url
-                it[createdAt] = user.createdAt.toEpochMilli()
-                it[publicKey] = user.publicKey
-                it[privateKey] = user.privateKey
-            }
-        } else {
-            Users.update({ Users.id eq user.id }) {
-                it[name] = user.name
-                it[domain] = user.domain
-                it[screenName] = user.screenName
-                it[description] = user.description
-                it[password] = user.password
-                it[inbox] = user.inbox
-                it[outbox] = user.outbox
-                it[url] = user.url
-                it[createdAt] = user.createdAt.toEpochMilli()
-                it[publicKey] = user.publicKey
-                it[privateKey] = user.privateKey
-            }
-        }
-        return user
-    }
+    suspend fun findById(id: Long): User?
 
-    override suspend fun findById(id: Long): User? {
-        return Users.select { Users.id eq id }.map {
-            it.toUser()
-        }.singleOrNull()
-    }
+    suspend fun delete(id: Long)
 
-    override suspend fun deleteFollowRequest(id: Long, follower: Long) {
-        FollowRequests.deleteWhere { userId.eq(id) and followerId.eq(follower) }
-    }
+    suspend fun deleteFollowRequest(id: Long, follower: Long)
 
-    override suspend fun findFollowRequestsById(id: Long, follower: Long): Boolean {
-        return FollowRequests.select { (FollowRequests.userId eq id) and (FollowRequests.followerId eq follower) }
-            .singleOrNull() != null
-    }
+    suspend fun findFollowRequestsById(id: Long, follower: Long): Boolean
 
-    override suspend fun delete(id: Long) {
-        Users.deleteWhere { Users.id.eq(id) }
-    }
-
-    override suspend fun nextId(): Long = idGenerateService.generateId()
-}
-
-object Users : Table("users") {
-    val id = long("id")
-    val name = varchar("name", length = 64)
-    val domain = varchar("domain", length = 255)
-    val screenName = varchar("screen_name", length = 64)
-    val description = varchar("description", length = 600)
-    val password = varchar("password", length = 255).nullable()
-    val inbox = varchar("inbox", length = 255).uniqueIndex()
-    val outbox = varchar("outbox", length = 255).uniqueIndex()
-    val url = varchar("url", length = 255).uniqueIndex()
-    val publicKey = varchar("public_key", length = 10000)
-    val privateKey = varchar("private_key", length = 10000).nullable()
-    val createdAt = long("created_at")
-
-    override val primaryKey: PrimaryKey = PrimaryKey(id)
-
-    init {
-        uniqueIndex(name, domain)
-    }
-}
-
-fun ResultRow.toUser(): User {
-    return User(
-        id = this[Users.id],
-        name = this[Users.name],
-        domain = this[Users.domain],
-        screenName = this[Users.screenName],
-        description = this[Users.description],
-        password = this[Users.password],
-        inbox = this[Users.inbox],
-        outbox = this[Users.outbox],
-        url = this[Users.url],
-        publicKey = this[Users.publicKey],
-        privateKey = this[Users.privateKey],
-        createdAt = Instant.ofEpochMilli((this[Users.createdAt]))
-    )
-}
-
-object UsersFollowers : LongIdTable("users_followers") {
-    val userId = long("user_id").references(Users.id).index()
-    val followerId = long("follower_id").references(Users.id)
-
-    init {
-        uniqueIndex(userId, followerId)
-    }
-}
-
-object FollowRequests : LongIdTable("follow_requests") {
-    val userId = long("user_id").references(Users.id)
-    val followerId = long("follower_id").references(Users.id)
-
-    init {
-        uniqueIndex(userId, followerId)
-    }
+    suspend fun nextId(): Long
 }
diff --git a/src/main/kotlin/dev/usbharu/hideout/repository/UserRepositoryImpl.kt b/src/main/kotlin/dev/usbharu/hideout/repository/UserRepositoryImpl.kt
new file mode 100644
index 00000000..43ea37ef
--- /dev/null
+++ b/src/main/kotlin/dev/usbharu/hideout/repository/UserRepositoryImpl.kt
@@ -0,0 +1,137 @@
+package dev.usbharu.hideout.repository
+
+import dev.usbharu.hideout.domain.model.hideout.entity.User
+import dev.usbharu.hideout.service.core.IdGenerateService
+import org.jetbrains.exposed.dao.id.LongIdTable
+import org.jetbrains.exposed.sql.*
+import org.jetbrains.exposed.sql.SqlExpressionBuilder.eq
+import org.jetbrains.exposed.sql.transactions.transaction
+import org.koin.core.annotation.Single
+import java.time.Instant
+
+@Single
+class UserRepositoryImpl(private val database: Database, private val idGenerateService: IdGenerateService) :
+    UserRepository {
+    init {
+        transaction(database) {
+            SchemaUtils.create(Users)
+            SchemaUtils.create(UsersFollowers)
+            SchemaUtils.createMissingTablesAndColumns(Users)
+            SchemaUtils.createMissingTablesAndColumns(UsersFollowers)
+            SchemaUtils.create(FollowRequests)
+            SchemaUtils.createMissingTablesAndColumns(FollowRequests)
+        }
+    }
+
+    override suspend fun save(user: User): User {
+        val singleOrNull = Users.select { Users.id eq user.id }.singleOrNull()
+        if (singleOrNull == null) {
+            Users.insert {
+                it[id] = user.id
+                it[name] = user.name
+                it[domain] = user.domain
+                it[screenName] = user.screenName
+                it[description] = user.description
+                it[password] = user.password
+                it[inbox] = user.inbox
+                it[outbox] = user.outbox
+                it[url] = user.url
+                it[createdAt] = user.createdAt.toEpochMilli()
+                it[publicKey] = user.publicKey
+                it[privateKey] = user.privateKey
+            }
+        } else {
+            Users.update({ Users.id eq user.id }) {
+                it[name] = user.name
+                it[domain] = user.domain
+                it[screenName] = user.screenName
+                it[description] = user.description
+                it[password] = user.password
+                it[inbox] = user.inbox
+                it[outbox] = user.outbox
+                it[url] = user.url
+                it[createdAt] = user.createdAt.toEpochMilli()
+                it[publicKey] = user.publicKey
+                it[privateKey] = user.privateKey
+            }
+        }
+        return user
+    }
+
+    override suspend fun findById(id: Long): User? {
+        return Users.select { Users.id eq id }.map {
+            it.toUser()
+        }.singleOrNull()
+    }
+
+    override suspend fun deleteFollowRequest(id: Long, follower: Long) {
+        FollowRequests.deleteWhere { userId.eq(id) and followerId.eq(follower) }
+    }
+
+    override suspend fun findFollowRequestsById(id: Long, follower: Long): Boolean {
+        return FollowRequests.select { (FollowRequests.userId eq id) and (FollowRequests.followerId eq follower) }
+            .singleOrNull() != null
+    }
+
+    override suspend fun delete(id: Long) {
+        Users.deleteWhere { Users.id.eq(id) }
+    }
+
+    override suspend fun nextId(): Long = idGenerateService.generateId()
+}
+
+object Users : Table("users") {
+    val id = long("id")
+    val name = varchar("name", length = 64)
+    val domain = varchar("domain", length = 255)
+    val screenName = varchar("screen_name", length = 64)
+    val description = varchar("description", length = 600)
+    val password = varchar("password", length = 255).nullable()
+    val inbox = varchar("inbox", length = 255).uniqueIndex()
+    val outbox = varchar("outbox", length = 255).uniqueIndex()
+    val url = varchar("url", length = 255).uniqueIndex()
+    val publicKey = varchar("public_key", length = 10000)
+    val privateKey = varchar("private_key", length = 10000).nullable()
+    val createdAt = long("created_at")
+
+    override val primaryKey: PrimaryKey = PrimaryKey(id)
+
+    init {
+        uniqueIndex(name, domain)
+    }
+}
+
+fun ResultRow.toUser(): User {
+    return User(
+        id = this[Users.id],
+        name = this[Users.name],
+        domain = this[Users.domain],
+        screenName = this[Users.screenName],
+        description = this[Users.description],
+        password = this[Users.password],
+        inbox = this[Users.inbox],
+        outbox = this[Users.outbox],
+        url = this[Users.url],
+        publicKey = this[Users.publicKey],
+        privateKey = this[Users.privateKey],
+        createdAt = Instant.ofEpochMilli((this[Users.createdAt]))
+    )
+}
+
+object UsersFollowers : LongIdTable("users_followers") {
+    val userId = long("user_id").references(Users.id).index()
+    val followerId = long("follower_id").references(Users.id)
+
+    init {
+        uniqueIndex(userId, followerId)
+    }
+}
+
+object FollowRequests : LongIdTable("follow_requests") {
+    val userId = long("user_id").references(Users.id)
+    val followerId = long("follower_id").references(Users.id)
+
+    init {
+        uniqueIndex(userId, followerId)
+    }
+}
diff --git a/src/main/kotlin/dev/usbharu/hideout/routing/RegisterRouting.kt b/src/main/kotlin/dev/usbharu/hideout/routing/RegisterRouting.kt
index 2e01c939..8628f340 100644
--- a/src/main/kotlin/dev/usbharu/hideout/routing/RegisterRouting.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/routing/RegisterRouting.kt
@@ -1,6 +1,6 @@
 package dev.usbharu.hideout.routing
 
-import dev.usbharu.hideout.service.api.IUserApiService
+import dev.usbharu.hideout.service.api.UserApiService
 import io.ktor.http.*
 import io.ktor.server.application.*
 import io.ktor.server.auth.*
@@ -8,7 +8,7 @@ import io.ktor.server.request.*
 import io.ktor.server.response.*
 import io.ktor.server.routing.*
 
-fun Application.register(userApiService: IUserApiService) {
+fun Application.register(userApiService: UserApiService) {
     routing {
         get("/register") {
             val principal = call.principal<UserIdPrincipal>()
diff --git a/src/main/kotlin/dev/usbharu/hideout/routing/activitypub/InboxRouting.kt b/src/main/kotlin/dev/usbharu/hideout/routing/activitypub/InboxRouting.kt
index 92a216bb..dbdcd666 100644
--- a/src/main/kotlin/dev/usbharu/hideout/routing/activitypub/InboxRouting.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/routing/activitypub/InboxRouting.kt
@@ -13,7 +13,7 @@ import io.ktor.server.routing.*
 
 fun Routing.inbox(
     httpSignatureVerifyService: HttpSignatureVerifyService,
-    activityPubService: dev.usbharu.hideout.service.activitypub.ActivityPubService
+    apService: dev.usbharu.hideout.service.ap.APService
 ) {
     route("/inbox") {
         get {
@@ -25,9 +25,9 @@ fun Routing.inbox(
             }
             val json = call.receiveText()
             call.application.log.trace("Received: $json")
-            val activityTypes = activityPubService.parseActivity(json)
+            val activityTypes = apService.parseActivity(json)
             call.application.log.debug("ActivityTypes: ${activityTypes.name}")
-            val response = activityPubService.processActivity(json, activityTypes)
+            val response = apService.processActivity(json, activityTypes)
             when (response) {
                 is ActivityPubObjectResponse -> call.respond(
                     response.httpStatusCode,
@@ -54,9 +54,9 @@ fun Routing.inbox(
             }
             val json = call.receiveText()
             call.application.log.trace("Received: $json")
-            val activityTypes = activityPubService.parseActivity(json)
+            val activityTypes = apService.parseActivity(json)
             call.application.log.debug("ActivityTypes: ${activityTypes.name}")
-            val response = activityPubService.processActivity(json, activityTypes)
+            val response = apService.processActivity(json, activityTypes)
             when (response) {
                 is ActivityPubObjectResponse -> call.respond(
                     response.httpStatusCode,
diff --git a/src/main/kotlin/dev/usbharu/hideout/routing/activitypub/UserRouting.kt b/src/main/kotlin/dev/usbharu/hideout/routing/activitypub/UserRouting.kt
index 734c45c8..c4b03cba 100644
--- a/src/main/kotlin/dev/usbharu/hideout/routing/activitypub/UserRouting.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/routing/activitypub/UserRouting.kt
@@ -5,7 +5,7 @@ import dev.usbharu.hideout.exception.ParameterNotExistException
 import dev.usbharu.hideout.plugins.respondAp
 import dev.usbharu.hideout.query.FollowerQueryService
 import dev.usbharu.hideout.query.UserQueryService
-import dev.usbharu.hideout.service.activitypub.ActivityPubUserService
+import dev.usbharu.hideout.service.ap.APUserService
 import dev.usbharu.hideout.service.core.Transaction
 import dev.usbharu.hideout.util.HttpUtil.Activity
 import dev.usbharu.hideout.util.HttpUtil.JsonLd
@@ -16,7 +16,7 @@ import io.ktor.server.response.*
 import io.ktor.server.routing.*
 
 fun Routing.usersAP(
-    activityPubUserService: ActivityPubUserService,
+    apUserService: APUserService,
     userQueryService: UserQueryService,
     followerQueryService: FollowerQueryService,
     transaction: Transaction
@@ -27,7 +27,7 @@ fun Routing.usersAP(
             call.application.log.debug("Authorization: ${call.request.header("Authorization")}")
             val name =
                 call.parameters["name"] ?: throw ParameterNotExistException("Parameter(name='name') does not exist.")
-            val person = activityPubUserService.getPersonByName(name)
+            val person = apUserService.getPersonByName(name)
             return@handle call.respondAp(
                 person,
                 HttpStatusCode.OK
diff --git a/src/main/kotlin/dev/usbharu/hideout/routing/api/internal/v1/Posts.kt b/src/main/kotlin/dev/usbharu/hideout/routing/api/internal/v1/Posts.kt
index bbc23835..a3c3cd23 100644
--- a/src/main/kotlin/dev/usbharu/hideout/routing/api/internal/v1/Posts.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/routing/api/internal/v1/Posts.kt
@@ -4,7 +4,7 @@ import dev.usbharu.hideout.domain.model.hideout.form.Post
 import dev.usbharu.hideout.domain.model.hideout.form.Reaction
 import dev.usbharu.hideout.exception.ParameterNotExistException
 import dev.usbharu.hideout.plugins.TOKEN_AUTH
-import dev.usbharu.hideout.service.api.IPostApiService
+import dev.usbharu.hideout.service.api.PostApiService
 import dev.usbharu.hideout.util.InstantParseUtil
 import io.ktor.http.*
 import io.ktor.server.application.*
@@ -15,7 +15,7 @@ import io.ktor.server.response.*
 import io.ktor.server.routing.*
 
 @Suppress("LongMethod")
-fun Route.posts(postApiService: IPostApiService) {
+fun Route.posts(postApiService: PostApiService) {
     route("/posts") {
         authenticate(TOKEN_AUTH) {
             post {
diff --git a/src/main/kotlin/dev/usbharu/hideout/routing/api/internal/v1/Users.kt b/src/main/kotlin/dev/usbharu/hideout/routing/api/internal/v1/Users.kt
index 6bf0e5ad..1a73c694 100644
--- a/src/main/kotlin/dev/usbharu/hideout/routing/api/internal/v1/Users.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/routing/api/internal/v1/Users.kt
@@ -5,8 +5,8 @@ import dev.usbharu.hideout.domain.model.hideout.dto.UserCreateDto
 import dev.usbharu.hideout.domain.model.hideout.form.UserCreate
 import dev.usbharu.hideout.exception.ParameterNotExistException
 import dev.usbharu.hideout.plugins.TOKEN_AUTH
-import dev.usbharu.hideout.service.api.IUserApiService
-import dev.usbharu.hideout.service.user.IUserService
+import dev.usbharu.hideout.service.api.UserApiService
+import dev.usbharu.hideout.service.user.UserService
 import dev.usbharu.hideout.util.AcctUtil
 import io.ktor.http.*
 import io.ktor.server.application.*
@@ -17,7 +17,7 @@ import io.ktor.server.response.*
 import io.ktor.server.routing.*
 
 @Suppress("LongMethod", "CognitiveComplexMethod")
-fun Route.users(userService: IUserService, userApiService: IUserApiService) {
+fun Route.users(userService: UserService, userApiService: UserApiService) {
     route("/users") {
         get {
             call.respond(userApiService.findAll())
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubAcceptService.kt b/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubAcceptService.kt
deleted file mode 100644
index d0746c44..00000000
--- a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubAcceptService.kt
+++ /dev/null
@@ -1,8 +0,0 @@
-package dev.usbharu.hideout.service.activitypub
-
-import dev.usbharu.hideout.domain.model.ActivityPubResponse
-import dev.usbharu.hideout.domain.model.ap.Accept
-
-interface ActivityPubAcceptService {
-    suspend fun receiveAccept(accept: Accept): ActivityPubResponse
-}
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubCreateService.kt b/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubCreateService.kt
deleted file mode 100644
index 632c801e..00000000
--- a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubCreateService.kt
+++ /dev/null
@@ -1,8 +0,0 @@
-package dev.usbharu.hideout.service.activitypub
-
-import dev.usbharu.hideout.domain.model.ActivityPubResponse
-import dev.usbharu.hideout.domain.model.ap.Create
-
-interface ActivityPubCreateService {
-    suspend fun receiveCreate(create: Create): ActivityPubResponse
-}
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubLikeService.kt b/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubLikeService.kt
deleted file mode 100644
index 19d3f341..00000000
--- a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubLikeService.kt
+++ /dev/null
@@ -1,8 +0,0 @@
-package dev.usbharu.hideout.service.activitypub
-
-import dev.usbharu.hideout.domain.model.ActivityPubResponse
-import dev.usbharu.hideout.domain.model.ap.Like
-
-interface ActivityPubLikeService {
-    suspend fun receiveLike(like: Like): ActivityPubResponse
-}
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubNoteService.kt b/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubNoteService.kt
deleted file mode 100644
index 2c289415..00000000
--- a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubNoteService.kt
+++ /dev/null
@@ -1,15 +0,0 @@
-package dev.usbharu.hideout.service.activitypub
-
-import dev.usbharu.hideout.domain.model.ap.Note
-import dev.usbharu.hideout.domain.model.hideout.entity.Post
-import dev.usbharu.hideout.domain.model.job.DeliverPostJob
-import kjob.core.job.JobProps
-
-interface ActivityPubNoteService {
-
-    suspend fun createNote(post: Post)
-    suspend fun createNoteJob(props: JobProps<DeliverPostJob>)
-
-    suspend fun fetchNote(url: String, targetActor: String? = null): Note
-    suspend fun fetchNote(note: Note, targetActor: String? = null): Note
-}
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubReactionService.kt b/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubReactionService.kt
deleted file mode 100644
index f3ac458c..00000000
--- a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubReactionService.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package dev.usbharu.hideout.service.activitypub
-
-import dev.usbharu.hideout.domain.model.hideout.entity.Reaction
-import dev.usbharu.hideout.domain.model.job.DeliverReactionJob
-import dev.usbharu.hideout.domain.model.job.DeliverRemoveReactionJob
-import kjob.core.job.JobProps
-
-interface ActivityPubReactionService {
-    suspend fun reaction(like: Reaction)
-    suspend fun removeReaction(like: Reaction)
-    suspend fun reactionJob(props: JobProps<DeliverReactionJob>)
-    suspend fun removeReactionJob(props: JobProps<DeliverRemoveReactionJob>)
-}
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubReceiveFollowService.kt b/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubReceiveFollowService.kt
deleted file mode 100644
index 378b0db6..00000000
--- a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubReceiveFollowService.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-package dev.usbharu.hideout.service.activitypub
-
-import dev.usbharu.hideout.domain.model.ActivityPubResponse
-import dev.usbharu.hideout.domain.model.ap.Follow
-import dev.usbharu.hideout.domain.model.job.ReceiveFollowJob
-import kjob.core.job.JobProps
-
-interface ActivityPubReceiveFollowService {
-    suspend fun receiveFollow(follow: Follow): ActivityPubResponse
-    suspend fun receiveFollowJob(props: JobProps<ReceiveFollowJob>)
-}
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubSendFollowService.kt b/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubSendFollowService.kt
deleted file mode 100644
index 8d0dd1f2..00000000
--- a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubSendFollowService.kt
+++ /dev/null
@@ -1,7 +0,0 @@
-package dev.usbharu.hideout.service.activitypub
-
-import dev.usbharu.hideout.domain.model.hideout.dto.SendFollowDto
-
-interface ActivityPubSendFollowService {
-    suspend fun sendFollow(sendFollowDto: SendFollowDto)
-}
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubService.kt b/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubService.kt
deleted file mode 100644
index bec7f2fb..00000000
--- a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubService.kt
+++ /dev/null
@@ -1,164 +0,0 @@
-package dev.usbharu.hideout.service.activitypub
-
-import dev.usbharu.hideout.domain.model.ActivityPubResponse
-import dev.usbharu.hideout.domain.model.job.HideoutJob
-import kjob.core.dsl.JobContextWithProps
-
-interface ActivityPubService {
-    fun parseActivity(json: String): ActivityType
-
-    suspend fun processActivity(json: String, type: ActivityType): ActivityPubResponse?
-
-    suspend fun <T : HideoutJob> processActivity(job: JobContextWithProps<T>, hideoutJob: HideoutJob)
-}
-
-enum class ActivityType {
-    Accept,
-    Add,
-    Announce,
-    Arrive,
-    Block,
-    Create,
-    Delete,
-    Dislike,
-    Flag,
-    Follow,
-    Ignore,
-    Invite,
-    Join,
-    Leave,
-    Like,
-    Listen,
-    Move,
-    Offer,
-    Question,
-    Reject,
-    Read,
-    Remove,
-    TentativeReject,
-    TentativeAccept,
-    Travel,
-    Undo,
-    Update,
-    View,
-    Other
-}
-
-enum class ActivityVocabulary {
-    Object,
-    Link,
-    Activity,
-    IntransitiveActivity,
-    Collection,
-    OrderedCollection,
-    CollectionPage,
-    OrderedCollectionPage,
-    Accept,
-    Add,
-    Announce,
-    Arrive,
-    Block,
-    Create,
-    Delete,
-    Dislike,
-    Flag,
-    Follow,
-    Ignore,
-    Invite,
-    Join,
-    Leave,
-    Like,
-    Listen,
-    Move,
-    Offer,
-    Question,
-    Reject,
-    Read,
-    Remove,
-    TentativeReject,
-    TentativeAccept,
-    Travel,
-    Undo,
-    Update,
-    View,
-    Application,
-    Group,
-    Organization,
-    Person,
-    Service,
-    Article,
-    Audio,
-    Document,
-    Event,
-    Image,
-    Note,
-    Page,
-    Place,
-    Profile,
-    Relationship,
-    Tombstone,
-    Video,
-    Mention,
-}
-
-enum class ExtendedActivityVocabulary {
-    Object,
-    Link,
-    Activity,
-    IntransitiveActivity,
-    Collection,
-    OrderedCollection,
-    CollectionPage,
-    OrderedCollectionPage,
-    Accept,
-    Add,
-    Announce,
-    Arrive,
-    Block,
-    Create,
-    Delete,
-    Dislike,
-    Flag,
-    Follow,
-    Ignore,
-    Invite,
-    Join,
-    Leave,
-    Like,
-    Listen,
-    Move,
-    Offer,
-    Question,
-    Reject,
-    Read,
-    Remove,
-    TentativeReject,
-    TentativeAccept,
-    Travel,
-    Undo,
-    Update,
-    View,
-    Application,
-    Group,
-    Organization,
-    Person,
-    Service,
-    Article,
-    Audio,
-    Document,
-    Event,
-    Image,
-    Note,
-    Page,
-    Place,
-    Profile,
-    Relationship,
-    Tombstone,
-    Video,
-    Mention,
-    Emoji
-}
-
-enum class ExtendedVocabulary {
-    Emoji
-}
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubServiceImpl.kt b/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubServiceImpl.kt
deleted file mode 100644
index 95355d2a..00000000
--- a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubServiceImpl.kt
+++ /dev/null
@@ -1,79 +0,0 @@
-package dev.usbharu.hideout.service.activitypub
-
-import com.fasterxml.jackson.databind.JsonNode
-import com.fasterxml.jackson.module.kotlin.readValue
-import dev.usbharu.hideout.config.Config.configData
-import dev.usbharu.hideout.domain.model.ActivityPubResponse
-import dev.usbharu.hideout.domain.model.ap.Follow
-import dev.usbharu.hideout.domain.model.job.*
-import dev.usbharu.hideout.exception.JsonParseException
-import kjob.core.dsl.JobContextWithProps
-import kjob.core.job.JobProps
-import org.koin.core.annotation.Single
-import org.slf4j.Logger
-import org.slf4j.LoggerFactory
-
-@Single
-class ActivityPubServiceImpl(
-    private val activityPubReceiveFollowService: ActivityPubReceiveFollowService,
-    private val activityPubNoteService: ActivityPubNoteService,
-    private val activityPubUndoService: ActivityPubUndoService,
-    private val activityPubAcceptService: ActivityPubAcceptService,
-    private val activityPubCreateService: ActivityPubCreateService,
-    private val activityPubLikeService: ActivityPubLikeService,
-    private val activityPubReactionService: ActivityPubReactionService
-) : ActivityPubService {
-
-    val logger: Logger = LoggerFactory.getLogger(this::class.java)
-    override fun parseActivity(json: String): ActivityType {
-        val readTree = configData.objectMapper.readTree(json)
-        logger.trace("readTree: {}", readTree)
-        if (readTree.isObject.not()) {
-            throw JsonParseException("Json is not object.")
-        }
-        val type = readTree["type"]
-        if (type.isArray) {
-            return type.firstNotNullOf { jsonNode: JsonNode ->
-                ActivityType.values().firstOrNull { it.name.equals(jsonNode.asText(), true) }
-            }
-        }
-        return ActivityType.values().first { it.name.equals(type.asText(), true) }
-    }
-
-    @Suppress("CyclomaticComplexMethod", "NotImplementedDeclaration")
-    override suspend fun processActivity(json: String, type: ActivityType): ActivityPubResponse {
-        logger.debug("proccess activity: {}", type)
-        return when (type) {
-            ActivityType.Accept -> activityPubAcceptService.receiveAccept(configData.objectMapper.readValue(json))
-            ActivityType.Follow -> activityPubReceiveFollowService.receiveFollow(
-                configData.objectMapper.readValue(
-                    json,
-                    Follow::class.java
-                )
-            )
-
-            ActivityType.Create -> activityPubCreateService.receiveCreate(configData.objectMapper.readValue(json))
-            ActivityType.Like -> activityPubLikeService.receiveLike(configData.objectMapper.readValue(json))
-            ActivityType.Undo -> activityPubUndoService.receiveUndo(configData.objectMapper.readValue(json))
-
-            else -> {
-                throw IllegalArgumentException("$type is not supported.")
-            }
-        }
-    }
-
-    override suspend fun <T : HideoutJob> processActivity(job: JobContextWithProps<T>, hideoutJob: HideoutJob) {
-        logger.debug("processActivity: ${hideoutJob.name}")
-        when (hideoutJob) {
-            ReceiveFollowJob -> activityPubReceiveFollowService.receiveFollowJob(
-                job.props as JobProps<ReceiveFollowJob>
-            )
-
-            DeliverPostJob -> activityPubNoteService.createNoteJob(job.props as JobProps<DeliverPostJob>)
-            DeliverReactionJob -> activityPubReactionService.reactionJob(job.props as JobProps<DeliverReactionJob>)
-            DeliverRemoveReactionJob -> activityPubReactionService.removeReactionJob(
-                job.props as JobProps<DeliverRemoveReactionJob>
-            )
-        }
-    }
-}
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubUndoService.kt b/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubUndoService.kt
deleted file mode 100644
index d0972608..00000000
--- a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubUndoService.kt
+++ /dev/null
@@ -1,8 +0,0 @@
-package dev.usbharu.hideout.service.activitypub
-
-import dev.usbharu.hideout.domain.model.ActivityPubResponse
-import dev.usbharu.hideout.domain.model.ap.Undo
-
-interface ActivityPubUndoService {
-    suspend fun receiveUndo(undo: Undo): ActivityPubResponse
-}
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubUserService.kt b/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubUserService.kt
deleted file mode 100644
index 3ee34667..00000000
--- a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubUserService.kt
+++ /dev/null
@@ -1,16 +0,0 @@
-package dev.usbharu.hideout.service.activitypub
-
-import dev.usbharu.hideout.domain.model.ap.Person
-
-interface ActivityPubUserService {
-    suspend fun getPersonByName(name: String): Person
-
-    /**
-     * Fetch person
-     *
-     * @param url
-     * @param targetActor 署名するユーザー
-     * @return
-     */
-    suspend fun fetchPerson(url: String, targetActor: String? = null): Person
-}
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubAcceptServiceImpl.kt b/src/main/kotlin/dev/usbharu/hideout/service/ap/APAcceptService.kt
similarity index 81%
rename from src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubAcceptServiceImpl.kt
rename to src/main/kotlin/dev/usbharu/hideout/service/ap/APAcceptService.kt
index 19df2c97..b1fbc9b2 100644
--- a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubAcceptServiceImpl.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/service/ap/APAcceptService.kt
@@ -1,4 +1,4 @@
-package dev.usbharu.hideout.service.activitypub
+package dev.usbharu.hideout.service.ap
 
 import dev.usbharu.hideout.domain.model.ActivityPubResponse
 import dev.usbharu.hideout.domain.model.ActivityPubStringResponse
@@ -6,15 +6,19 @@ import dev.usbharu.hideout.domain.model.ap.Accept
 import dev.usbharu.hideout.domain.model.ap.Follow
 import dev.usbharu.hideout.exception.ap.IllegalActivityPubObjectException
 import dev.usbharu.hideout.query.UserQueryService
-import dev.usbharu.hideout.service.user.IUserService
+import dev.usbharu.hideout.service.user.UserService
 import io.ktor.http.*
 import org.koin.core.annotation.Single
 
+interface APAcceptService {
+    suspend fun receiveAccept(accept: Accept): ActivityPubResponse
+}
+
 @Single
-class ActivityPubAcceptServiceImpl(
-    private val userService: IUserService,
+class APAcceptServiceImpl(
+    private val userService: UserService,
     private val userQueryService: UserQueryService
-) : ActivityPubAcceptService {
+) : APAcceptService {
     override suspend fun receiveAccept(accept: Accept): ActivityPubResponse {
         val value = accept.`object` ?: throw IllegalActivityPubObjectException("object is null")
         if (value.type.contains("Follow").not()) {
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubCreateServiceImpl.kt b/src/main/kotlin/dev/usbharu/hideout/service/ap/APCreateService.kt
similarity index 77%
rename from src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubCreateServiceImpl.kt
rename to src/main/kotlin/dev/usbharu/hideout/service/ap/APCreateService.kt
index 85e88b57..b3e84557 100644
--- a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubCreateServiceImpl.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/service/ap/APCreateService.kt
@@ -1,4 +1,4 @@
-package dev.usbharu.hideout.service.activitypub
+package dev.usbharu.hideout.service.ap
 
 import dev.usbharu.hideout.domain.model.ActivityPubResponse
 import dev.usbharu.hideout.domain.model.ActivityPubStringResponse
@@ -9,11 +9,15 @@ import dev.usbharu.hideout.service.core.Transaction
 import io.ktor.http.*
 import org.koin.core.annotation.Single
 
+interface APCreateService {
+    suspend fun receiveCreate(create: Create): ActivityPubResponse
+}
+
 @Single
-class ActivityPubCreateServiceImpl(
-    private val activityPubNoteService: ActivityPubNoteService,
+class APCreateServiceImpl(
+    private val apNoteService: APNoteService,
     private val transaction: Transaction
-) : ActivityPubCreateService {
+) : APCreateService {
     override suspend fun receiveCreate(create: Create): ActivityPubResponse {
         val value = create.`object` ?: throw IllegalActivityPubObjectException("object is null")
         if (value.type.contains("Note").not()) {
@@ -22,7 +26,7 @@ class ActivityPubCreateServiceImpl(
 
         return transaction.transaction {
             val note = value as Note
-            activityPubNoteService.fetchNote(note)
+            apNoteService.fetchNote(note)
             ActivityPubStringResponse(HttpStatusCode.OK, "Created")
         }
     }
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubLikeServiceImpl.kt b/src/main/kotlin/dev/usbharu/hideout/service/ap/APLikeService.kt
similarity index 74%
rename from src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubLikeServiceImpl.kt
rename to src/main/kotlin/dev/usbharu/hideout/service/ap/APLikeService.kt
index a9f12cfa..0313acf8 100644
--- a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubLikeServiceImpl.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/service/ap/APLikeService.kt
@@ -1,4 +1,4 @@
-package dev.usbharu.hideout.service.activitypub
+package dev.usbharu.hideout.service.ap
 
 import dev.usbharu.hideout.domain.model.ActivityPubResponse
 import dev.usbharu.hideout.domain.model.ActivityPubStringResponse
@@ -7,26 +7,30 @@ import dev.usbharu.hideout.exception.ap.IllegalActivityPubObjectException
 import dev.usbharu.hideout.query.PostQueryService
 import dev.usbharu.hideout.query.UserQueryService
 import dev.usbharu.hideout.service.core.Transaction
-import dev.usbharu.hideout.service.reaction.IReactionService
+import dev.usbharu.hideout.service.reaction.ReactionService
 import io.ktor.http.*
 import org.koin.core.annotation.Single
 
+interface APLikeService {
+    suspend fun receiveLike(like: Like): ActivityPubResponse
+}
+
 @Single
-class ActivityPubLikeServiceImpl(
-    private val reactionService: IReactionService,
-    private val activityPubUserService: ActivityPubUserService,
-    private val activityPubNoteService: ActivityPubNoteService,
+class APLikeServiceImpl(
+    private val reactionService: ReactionService,
+    private val apUserService: APUserService,
+    private val apNoteService: APNoteService,
     private val userQueryService: UserQueryService,
     private val postQueryService: PostQueryService,
     private val transaction: Transaction
-) : ActivityPubLikeService {
+) : APLikeService {
     override suspend fun receiveLike(like: Like): ActivityPubResponse {
         val actor = like.actor ?: throw IllegalActivityPubObjectException("actor is null")
         val content = like.content ?: throw IllegalActivityPubObjectException("content is null")
         like.`object` ?: throw IllegalActivityPubObjectException("object is null")
         transaction.transaction {
-            val person = activityPubUserService.fetchPerson(actor)
-            activityPubNoteService.fetchNote(like.`object`!!)
+            val person = apUserService.fetchPerson(actor)
+            apNoteService.fetchNote(like.`object`!!)
 
             val user = userQueryService.findByUrl(
                 person.url
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubNoteServiceImpl.kt b/src/main/kotlin/dev/usbharu/hideout/service/ap/APNoteService.kt
similarity index 87%
rename from src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubNoteServiceImpl.kt
rename to src/main/kotlin/dev/usbharu/hideout/service/ap/APNoteService.kt
index a6cdce08..2cf9d080 100644
--- a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubNoteServiceImpl.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/service/ap/APNoteService.kt
@@ -1,4 +1,4 @@
-package dev.usbharu.hideout.service.activitypub
+package dev.usbharu.hideout.service.ap
 
 import com.fasterxml.jackson.module.kotlin.readValue
 import dev.usbharu.hideout.config.Config
@@ -13,7 +13,7 @@ import dev.usbharu.hideout.plugins.postAp
 import dev.usbharu.hideout.query.FollowerQueryService
 import dev.usbharu.hideout.query.PostQueryService
 import dev.usbharu.hideout.query.UserQueryService
-import dev.usbharu.hideout.repository.IPostRepository
+import dev.usbharu.hideout.repository.PostRepository
 import dev.usbharu.hideout.service.job.JobQueueParentService
 import io.ktor.client.*
 import io.ktor.client.statement.*
@@ -22,16 +22,25 @@ import org.koin.core.annotation.Single
 import org.slf4j.LoggerFactory
 import java.time.Instant
 
+interface APNoteService {
+
+    suspend fun createNote(post: Post)
+    suspend fun createNoteJob(props: JobProps<DeliverPostJob>)
+
+    suspend fun fetchNote(url: String, targetActor: String? = null): Note
+    suspend fun fetchNote(note: Note, targetActor: String? = null): Note
+}
+
 @Single
-class ActivityPubNoteServiceImpl(
+class APNoteServiceImpl(
     private val httpClient: HttpClient,
     private val jobQueueParentService: JobQueueParentService,
-    private val postRepository: IPostRepository,
-    private val activityPubUserService: ActivityPubUserService,
+    private val postRepository: PostRepository,
+    private val apUserService: APUserService,
     private val userQueryService: UserQueryService,
     private val followerQueryService: FollowerQueryService,
     private val postQueryService: PostQueryService
-) : ActivityPubNoteService {
+) : APNoteService {
 
     private val logger = LoggerFactory.getLogger(this::class.java)
 
@@ -41,9 +50,9 @@ class ActivityPubNoteServiceImpl(
         val note = Config.configData.objectMapper.writeValueAsString(post)
         followers.forEach { followerEntity ->
             jobQueueParentService.schedule(DeliverPostJob) {
-                props[it.actor] = userEntity.url
-                props[it.post] = note
-                props[it.inbox] = followerEntity.inbox
+                props[DeliverPostJob.actor] = userEntity.url
+                props[DeliverPostJob.post] = note
+                props[DeliverPostJob.inbox] = followerEntity.inbox
             }
         }
     }
@@ -75,9 +84,12 @@ class ActivityPubNoteServiceImpl(
 
     override suspend fun fetchNote(url: String, targetActor: String?): Note {
         val post = postQueryService.findByUrl(url)
-        if (post != null) {
+        try {
             return postToNote(post)
+        } catch (_: NoSuchElementException) {
+        } catch (_: IllegalArgumentException) {
         }
+
         val response = httpClient.getAp(
             url,
             targetActor?.let { "$targetActor#pubkey" }
@@ -118,7 +130,7 @@ class ActivityPubNoteServiceImpl(
     }
 
     private suspend fun internalNote(note: Note, targetActor: String?, url: String): Note {
-        val person = activityPubUserService.fetchPerson(
+        val person = apUserService.fetchPerson(
             note.attributedTo ?: throw IllegalActivityPubObjectException("note.attributedTo is null"),
             targetActor
         )
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubReactionServiceImpl.kt b/src/main/kotlin/dev/usbharu/hideout/service/ap/APReactionService.kt
similarity index 74%
rename from src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubReactionServiceImpl.kt
rename to src/main/kotlin/dev/usbharu/hideout/service/ap/APReactionService.kt
index 3a6f1771..a7ca1533 100644
--- a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubReactionServiceImpl.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/service/ap/APReactionService.kt
@@ -1,4 +1,4 @@
-package dev.usbharu.hideout.service.activitypub
+package dev.usbharu.hideout.service.ap
 
 import com.fasterxml.jackson.module.kotlin.readValue
 import dev.usbharu.hideout.config.Config
@@ -11,22 +11,29 @@ import dev.usbharu.hideout.plugins.postAp
 import dev.usbharu.hideout.query.FollowerQueryService
 import dev.usbharu.hideout.query.PostQueryService
 import dev.usbharu.hideout.query.UserQueryService
-import dev.usbharu.hideout.repository.IPostRepository
+import dev.usbharu.hideout.repository.PostRepository
 import dev.usbharu.hideout.service.job.JobQueueParentService
 import io.ktor.client.*
 import kjob.core.job.JobProps
 import org.koin.core.annotation.Single
 import java.time.Instant
 
+interface APReactionService {
+    suspend fun reaction(like: Reaction)
+    suspend fun removeReaction(like: Reaction)
+    suspend fun reactionJob(props: JobProps<DeliverReactionJob>)
+    suspend fun removeReactionJob(props: JobProps<DeliverRemoveReactionJob>)
+}
+
 @Single
-class ActivityPubReactionServiceImpl(
+class APReactionServiceImpl(
     private val jobQueueParentService: JobQueueParentService,
-    private val iPostRepository: IPostRepository,
+    private val postRepository: PostRepository,
     private val httpClient: HttpClient,
     private val userQueryService: UserQueryService,
     private val followerQueryService: FollowerQueryService,
     private val postQueryService: PostQueryService
-) : ActivityPubReactionService {
+) : APReactionService {
     override suspend fun reaction(like: Reaction) {
         val followers = followerQueryService.findFollowersById(like.userId)
         val user = userQueryService.findById(like.userId)
@@ -34,11 +41,11 @@ class ActivityPubReactionServiceImpl(
             postQueryService.findById(like.postId)
         followers.forEach { follower ->
             jobQueueParentService.schedule(DeliverReactionJob) {
-                props[it.actor] = user.url
-                props[it.reaction] = "❤"
-                props[it.inbox] = follower.inbox
-                props[it.postUrl] = post.url
-                props[it.id] = post.id.toString()
+                props[DeliverReactionJob.actor] = user.url
+                props[DeliverReactionJob.reaction] = "❤"
+                props[DeliverReactionJob.inbox] = follower.inbox
+                props[DeliverReactionJob.postUrl] = post.url
+                props[DeliverReactionJob.id] = post.id.toString()
             }
         }
     }
@@ -50,10 +57,10 @@ class ActivityPubReactionServiceImpl(
             postQueryService.findById(like.postId)
         followers.forEach { follower ->
             jobQueueParentService.schedule(DeliverRemoveReactionJob) {
-                props[it.actor] = user.url
-                props[it.inbox] = follower.inbox
-                props[it.id] = post.id.toString()
-                props[it.like] = Config.configData.objectMapper.writeValueAsString(like)
+                props[DeliverRemoveReactionJob.actor] = user.url
+                props[DeliverRemoveReactionJob.inbox] = follower.inbox
+                props[DeliverRemoveReactionJob.id] = post.id.toString()
+                props[DeliverRemoveReactionJob.like] = Config.configData.objectMapper.writeValueAsString(like)
             }
         }
     }
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubReceiveFollowServiceImpl.kt b/src/main/kotlin/dev/usbharu/hideout/service/ap/APReceiveFollowService.kt
similarity index 75%
rename from src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubReceiveFollowServiceImpl.kt
rename to src/main/kotlin/dev/usbharu/hideout/service/ap/APReceiveFollowService.kt
index 94392412..9156abfd 100644
--- a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubReceiveFollowServiceImpl.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/service/ap/APReceiveFollowService.kt
@@ -1,4 +1,4 @@
-package dev.usbharu.hideout.service.activitypub
+package dev.usbharu.hideout.service.ap
 
 import com.fasterxml.jackson.module.kotlin.readValue
 import dev.usbharu.hideout.config.Config
@@ -11,27 +11,32 @@ import dev.usbharu.hideout.plugins.postAp
 import dev.usbharu.hideout.query.UserQueryService
 import dev.usbharu.hideout.service.core.Transaction
 import dev.usbharu.hideout.service.job.JobQueueParentService
-import dev.usbharu.hideout.service.user.IUserService
+import dev.usbharu.hideout.service.user.UserService
 import io.ktor.client.*
 import io.ktor.http.*
 import kjob.core.job.JobProps
 import org.koin.core.annotation.Single
 
+interface APReceiveFollowService {
+    suspend fun receiveFollow(follow: Follow): ActivityPubResponse
+    suspend fun receiveFollowJob(props: JobProps<ReceiveFollowJob>)
+}
+
 @Single
-class ActivityPubReceiveFollowServiceImpl(
+class APReceiveFollowServiceImpl(
     private val jobQueueParentService: JobQueueParentService,
-    private val activityPubUserService: ActivityPubUserService,
-    private val userService: IUserService,
+    private val apUserService: APUserService,
+    private val userService: UserService,
     private val httpClient: HttpClient,
     private val userQueryService: UserQueryService,
     private val transaction: Transaction
-) : ActivityPubReceiveFollowService {
+) : APReceiveFollowService {
     override suspend fun receiveFollow(follow: Follow): ActivityPubResponse {
         // TODO: Verify HTTP  Signature
         jobQueueParentService.schedule(ReceiveFollowJob) {
-            props[it.actor] = follow.actor
-            props[it.follow] = Config.configData.objectMapper.writeValueAsString(follow)
-            props[it.targetActor] = follow.`object`
+            props[ReceiveFollowJob.actor] = follow.actor
+            props[ReceiveFollowJob.follow] = Config.configData.objectMapper.writeValueAsString(follow)
+            props[ReceiveFollowJob.targetActor] = follow.`object`
         }
         return ActivityPubStringResponse(HttpStatusCode.OK, "{}", ContentType.Application.Json)
     }
@@ -40,7 +45,7 @@ class ActivityPubReceiveFollowServiceImpl(
         transaction.transaction {
             val actor = props[ReceiveFollowJob.actor]
             val targetActor = props[ReceiveFollowJob.targetActor]
-            val person = activityPubUserService.fetchPerson(actor, targetActor)
+            val person = apUserService.fetchPerson(actor, targetActor)
             val follow = Config.configData.objectMapper.readValue<Follow>(props[ReceiveFollowJob.follow])
             httpClient.postAp(
                 urlString = person.inbox ?: throw IllegalArgumentException("inbox is not found"),
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubSendFollowServiceImpl.kt b/src/main/kotlin/dev/usbharu/hideout/service/ap/APSendFollowService.kt
similarity index 74%
rename from src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubSendFollowServiceImpl.kt
rename to src/main/kotlin/dev/usbharu/hideout/service/ap/APSendFollowService.kt
index e73e9266..58ae74f5 100644
--- a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubSendFollowServiceImpl.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/service/ap/APSendFollowService.kt
@@ -1,4 +1,4 @@
-package dev.usbharu.hideout.service.activitypub
+package dev.usbharu.hideout.service.ap
 
 import dev.usbharu.hideout.domain.model.ap.Follow
 import dev.usbharu.hideout.domain.model.hideout.dto.SendFollowDto
@@ -6,8 +6,12 @@ import dev.usbharu.hideout.plugins.postAp
 import io.ktor.client.*
 import org.koin.core.annotation.Single
 
+interface APSendFollowService {
+    suspend fun sendFollow(sendFollowDto: SendFollowDto)
+}
+
 @Single
-class ActivityPubSendFollowServiceImpl(private val httpClient: HttpClient) : ActivityPubSendFollowService {
+class APSendFollowServiceImpl(private val httpClient: HttpClient) : APSendFollowService {
     override suspend fun sendFollow(sendFollowDto: SendFollowDto) {
         val follow = Follow(
             name = "Follow",
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/ap/APService.kt b/src/main/kotlin/dev/usbharu/hideout/service/ap/APService.kt
new file mode 100644
index 00000000..baf1b023
--- /dev/null
+++ b/src/main/kotlin/dev/usbharu/hideout/service/ap/APService.kt
@@ -0,0 +1,238 @@
+package dev.usbharu.hideout.service.ap
+
+import com.fasterxml.jackson.databind.JsonNode
+import com.fasterxml.jackson.module.kotlin.readValue
+import dev.usbharu.hideout.config.Config
+import dev.usbharu.hideout.domain.model.ActivityPubResponse
+import dev.usbharu.hideout.domain.model.ap.Follow
+import dev.usbharu.hideout.domain.model.job.*
+import dev.usbharu.hideout.exception.JsonParseException
+import kjob.core.dsl.JobContextWithProps
+import kjob.core.job.JobProps
+import org.koin.core.annotation.Single
+import org.slf4j.Logger
+import org.slf4j.LoggerFactory
+
+interface APService {
+    fun parseActivity(json: String): ActivityType
+
+    suspend fun processActivity(json: String, type: ActivityType): ActivityPubResponse?
+
+    suspend fun <T : HideoutJob> processActivity(job: JobContextWithProps<T>, hideoutJob: HideoutJob)
+}
+
+enum class ActivityType {
+    Accept,
+    Add,
+    Announce,
+    Arrive,
+    Block,
+    Create,
+    Delete,
+    Dislike,
+    Flag,
+    Follow,
+    Ignore,
+    Invite,
+    Join,
+    Leave,
+    Like,
+    Listen,
+    Move,
+    Offer,
+    Question,
+    Reject,
+    Read,
+    Remove,
+    TentativeReject,
+    TentativeAccept,
+    Travel,
+    Undo,
+    Update,
+    View,
+    Other
+}
+
+enum class ActivityVocabulary {
+    Object,
+    Link,
+    Activity,
+    IntransitiveActivity,
+    Collection,
+    OrderedCollection,
+    CollectionPage,
+    OrderedCollectionPage,
+    Accept,
+    Add,
+    Announce,
+    Arrive,
+    Block,
+    Create,
+    Delete,
+    Dislike,
+    Flag,
+    Follow,
+    Ignore,
+    Invite,
+    Join,
+    Leave,
+    Like,
+    Listen,
+    Move,
+    Offer,
+    Question,
+    Reject,
+    Read,
+    Remove,
+    TentativeReject,
+    TentativeAccept,
+    Travel,
+    Undo,
+    Update,
+    View,
+    Application,
+    Group,
+    Organization,
+    Person,
+    Service,
+    Article,
+    Audio,
+    Document,
+    Event,
+    Image,
+    Note,
+    Page,
+    Place,
+    Profile,
+    Relationship,
+    Tombstone,
+    Video,
+    Mention,
+}
+
+enum class ExtendedActivityVocabulary {
+    Object,
+    Link,
+    Activity,
+    IntransitiveActivity,
+    Collection,
+    OrderedCollection,
+    CollectionPage,
+    OrderedCollectionPage,
+    Accept,
+    Add,
+    Announce,
+    Arrive,
+    Block,
+    Create,
+    Delete,
+    Dislike,
+    Flag,
+    Follow,
+    Ignore,
+    Invite,
+    Join,
+    Leave,
+    Like,
+    Listen,
+    Move,
+    Offer,
+    Question,
+    Reject,
+    Read,
+    Remove,
+    TentativeReject,
+    TentativeAccept,
+    Travel,
+    Undo,
+    Update,
+    View,
+    Application,
+    Group,
+    Organization,
+    Person,
+    Service,
+    Article,
+    Audio,
+    Document,
+    Event,
+    Image,
+    Note,
+    Page,
+    Place,
+    Profile,
+    Relationship,
+    Tombstone,
+    Video,
+    Mention,
+    Emoji
+}
+
+enum class ExtendedVocabulary {
+    Emoji
+}
+
+@Single
+class APServiceImpl(
+    private val apReceiveFollowService: APReceiveFollowService,
+    private val apNoteService: APNoteService,
+    private val apUndoService: APUndoService,
+    private val apAcceptService: APAcceptService,
+    private val apCreateService: APCreateService,
+    private val apLikeService: APLikeService,
+    private val apReactionService: APReactionService
+) : APService {
+
+    val logger: Logger = LoggerFactory.getLogger(this::class.java)
+    override fun parseActivity(json: String): ActivityType {
+        val readTree = Config.configData.objectMapper.readTree(json)
+        logger.trace("readTree: {}", readTree)
+        if (readTree.isObject.not()) {
+            throw JsonParseException("Json is not object.")
+        }
+        val type = readTree["type"]
+        if (type.isArray) {
+            return type.firstNotNullOf { jsonNode: JsonNode ->
+                ActivityType.values().firstOrNull { it.name.equals(jsonNode.asText(), true) }
+            }
+        }
+        return ActivityType.values().first { it.name.equals(type.asText(), true) }
+    }
+
+    @Suppress("CyclomaticComplexMethod", "NotImplementedDeclaration")
+    override suspend fun processActivity(json: String, type: ActivityType): ActivityPubResponse {
+        logger.debug("proccess activity: {}", type)
+        return when (type) {
+            ActivityType.Accept -> apAcceptService.receiveAccept(Config.configData.objectMapper.readValue(json))
+            ActivityType.Follow -> apReceiveFollowService.receiveFollow(
+                Config.configData.objectMapper.readValue(
+                    json,
+                    Follow::class.java
+                )
+            )
+
+            ActivityType.Create -> apCreateService.receiveCreate(Config.configData.objectMapper.readValue(json))
+            ActivityType.Like -> apLikeService.receiveLike(Config.configData.objectMapper.readValue(json))
+            ActivityType.Undo -> apUndoService.receiveUndo(Config.configData.objectMapper.readValue(json))
+
+            else -> {
+                throw IllegalArgumentException("$type is not supported.")
+            }
+        }
+    }
+
+    override suspend fun <T : HideoutJob> processActivity(job: JobContextWithProps<T>, hideoutJob: HideoutJob) {
+        logger.debug("processActivity: ${hideoutJob.name}")
+        when (hideoutJob) {
+            ReceiveFollowJob -> apReceiveFollowService.receiveFollowJob(
+                job.props as JobProps<ReceiveFollowJob>
+            )
+
+            DeliverPostJob -> apNoteService.createNoteJob(job.props as JobProps<DeliverPostJob>)
+            DeliverReactionJob -> apReactionService.reactionJob(job.props as JobProps<DeliverReactionJob>)
+            DeliverRemoveReactionJob -> apReactionService.removeReactionJob(
+                job.props as JobProps<DeliverRemoveReactionJob>
+            )
+        }
+    }
+}
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubUndoServiceImpl.kt b/src/main/kotlin/dev/usbharu/hideout/service/ap/APUndoService.kt
similarity index 80%
rename from src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubUndoServiceImpl.kt
rename to src/main/kotlin/dev/usbharu/hideout/service/ap/APUndoService.kt
index 612146a6..8ae5ab13 100644
--- a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubUndoServiceImpl.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/service/ap/APUndoService.kt
@@ -1,4 +1,4 @@
-package dev.usbharu.hideout.service.activitypub
+package dev.usbharu.hideout.service.ap
 
 import dev.usbharu.hideout.domain.model.ActivityPubResponse
 import dev.usbharu.hideout.domain.model.ActivityPubStringResponse
@@ -6,18 +6,22 @@ import dev.usbharu.hideout.domain.model.ap.Follow
 import dev.usbharu.hideout.domain.model.ap.Undo
 import dev.usbharu.hideout.query.UserQueryService
 import dev.usbharu.hideout.service.core.Transaction
-import dev.usbharu.hideout.service.user.IUserService
+import dev.usbharu.hideout.service.user.UserService
 import io.ktor.http.*
 import org.koin.core.annotation.Single
 
+interface APUndoService {
+    suspend fun receiveUndo(undo: Undo): ActivityPubResponse
+}
+
 @Single
 @Suppress("UnsafeCallOnNullableType")
-class ActivityPubUndoServiceImpl(
-    private val userService: IUserService,
-    private val activityPubUserService: ActivityPubUserService,
+class APUndoServiceImpl(
+    private val userService: UserService,
+    private val apUserService: APUserService,
     private val userQueryService: UserQueryService,
     private val transaction: Transaction
-) : ActivityPubUndoService {
+) : APUndoService {
     override suspend fun receiveUndo(undo: Undo): ActivityPubResponse {
         if (undo.actor == null) {
             return ActivityPubStringResponse(HttpStatusCode.BadRequest, "actor is null")
@@ -36,7 +40,7 @@ class ActivityPubUndoServiceImpl(
                     return ActivityPubStringResponse(HttpStatusCode.BadRequest, "object.object is null")
                 }
                 transaction.transaction {
-                    activityPubUserService.fetchPerson(undo.actor!!, follow.`object`)
+                    apUserService.fetchPerson(undo.actor!!, follow.`object`)
                     val follower = userQueryService.findByUrl(undo.actor!!)
                     val target = userQueryService.findByUrl(follow.`object`!!)
                     userService.unfollow(target.id, follower.id)
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubUserServiceImpl.kt b/src/main/kotlin/dev/usbharu/hideout/service/ap/APUserService.kt
similarity index 90%
rename from src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubUserServiceImpl.kt
rename to src/main/kotlin/dev/usbharu/hideout/service/ap/APUserService.kt
index 504bbdba..caf9f91b 100644
--- a/src/main/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubUserServiceImpl.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/service/ap/APUserService.kt
@@ -1,4 +1,4 @@
-package dev.usbharu.hideout.service.activitypub
+package dev.usbharu.hideout.service.ap
 
 import com.fasterxml.jackson.module.kotlin.readValue
 import dev.usbharu.hideout.config.Config
@@ -10,7 +10,7 @@ import dev.usbharu.hideout.exception.ap.IllegalActivityPubObjectException
 import dev.usbharu.hideout.plugins.getAp
 import dev.usbharu.hideout.query.UserQueryService
 import dev.usbharu.hideout.service.core.Transaction
-import dev.usbharu.hideout.service.user.IUserService
+import dev.usbharu.hideout.service.user.UserService
 import dev.usbharu.hideout.util.HttpUtil.Activity
 import io.ktor.client.*
 import io.ktor.client.request.*
@@ -18,14 +18,27 @@ import io.ktor.client.statement.*
 import io.ktor.http.*
 import org.koin.core.annotation.Single
 
+interface APUserService {
+    suspend fun getPersonByName(name: String): Person
+
+    /**
+     * Fetch person
+     *
+     * @param url
+     * @param targetActor 署名するユーザー
+     * @return
+     */
+    suspend fun fetchPerson(url: String, targetActor: String? = null): Person
+}
+
 @Single
-class ActivityPubUserServiceImpl(
-    private val userService: IUserService,
+class APUserServiceImpl(
+    private val userService: UserService,
     private val httpClient: HttpClient,
     private val userQueryService: UserQueryService,
     private val transaction: Transaction
 ) :
-    ActivityPubUserService {
+    APUserService {
 
     override suspend fun getPersonByName(name: String): Person {
         val userEntity = transaction.transaction {
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/api/IPostApiService.kt b/src/main/kotlin/dev/usbharu/hideout/service/api/IPostApiService.kt
deleted file mode 100644
index 3ce027fb..00000000
--- a/src/main/kotlin/dev/usbharu/hideout/service/api/IPostApiService.kt
+++ /dev/null
@@ -1,33 +0,0 @@
-package dev.usbharu.hideout.service.api
-
-import dev.usbharu.hideout.domain.model.hideout.dto.PostResponse
-import dev.usbharu.hideout.domain.model.hideout.dto.ReactionResponse
-import java.time.Instant
-
-@Suppress("LongParameterList")
-interface IPostApiService {
-    suspend fun createPost(postForm: dev.usbharu.hideout.domain.model.hideout.form.Post, userId: Long): PostResponse
-    suspend fun getById(id: Long, userId: Long?): PostResponse
-    suspend fun getAll(
-        since: Instant? = null,
-        until: Instant? = null,
-        minId: Long? = null,
-        maxId: Long? = null,
-        limit: Int? = null,
-        userId: Long? = null
-    ): List<PostResponse>
-
-    suspend fun getByUser(
-        nameOrId: String,
-        since: Instant? = null,
-        until: Instant? = null,
-        minId: Long? = null,
-        maxId: Long? = null,
-        limit: Int? = null,
-        userId: Long? = null
-    ): List<PostResponse>
-
-    suspend fun getReactionByPostId(postId: Long, userId: Long? = null): List<ReactionResponse>
-    suspend fun appendReaction(reaction: String, userId: Long, postId: Long)
-    suspend fun removeReaction(userId: Long, postId: Long)
-}
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/api/IUserApiService.kt b/src/main/kotlin/dev/usbharu/hideout/service/api/IUserApiService.kt
deleted file mode 100644
index 7d902de3..00000000
--- a/src/main/kotlin/dev/usbharu/hideout/service/api/IUserApiService.kt
+++ /dev/null
@@ -1,24 +0,0 @@
-package dev.usbharu.hideout.service.api
-
-import dev.usbharu.hideout.domain.model.Acct
-import dev.usbharu.hideout.domain.model.hideout.dto.UserResponse
-
-interface IUserApiService {
-    suspend fun findAll(limit: Int? = 100, offset: Long = 0): List<UserResponse>
-
-    suspend fun findById(id: Long): UserResponse
-
-    suspend fun findByIds(ids: List<Long>): List<UserResponse>
-
-    suspend fun findByAcct(acct: Acct): UserResponse
-
-    suspend fun findFollowers(userId: Long): List<UserResponse>
-
-    suspend fun findFollowings(userId: Long): List<UserResponse>
-
-    suspend fun findFollowersByAcct(acct: Acct): List<UserResponse>
-
-    suspend fun findFollowingsByAcct(acct: Acct): List<UserResponse>
-
-    suspend fun createUser(username: String, password: String): UserResponse
-}
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/api/PostApiServiceImpl.kt b/src/main/kotlin/dev/usbharu/hideout/service/api/PostApiService.kt
similarity index 68%
rename from src/main/kotlin/dev/usbharu/hideout/service/api/PostApiServiceImpl.kt
rename to src/main/kotlin/dev/usbharu/hideout/service/api/PostApiService.kt
index ee08b7d9..8edee9a7 100644
--- a/src/main/kotlin/dev/usbharu/hideout/service/api/PostApiServiceImpl.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/service/api/PostApiService.kt
@@ -4,27 +4,55 @@ import dev.usbharu.hideout.config.Config
 import dev.usbharu.hideout.domain.model.hideout.dto.PostCreateDto
 import dev.usbharu.hideout.domain.model.hideout.dto.PostResponse
 import dev.usbharu.hideout.domain.model.hideout.dto.ReactionResponse
+import dev.usbharu.hideout.domain.model.hideout.form.Post
 import dev.usbharu.hideout.query.PostResponseQueryService
 import dev.usbharu.hideout.query.ReactionQueryService
-import dev.usbharu.hideout.repository.IUserRepository
+import dev.usbharu.hideout.repository.UserRepository
 import dev.usbharu.hideout.service.core.Transaction
-import dev.usbharu.hideout.service.post.IPostService
-import dev.usbharu.hideout.service.reaction.IReactionService
+import dev.usbharu.hideout.service.post.PostService
+import dev.usbharu.hideout.service.reaction.ReactionService
 import dev.usbharu.hideout.util.AcctUtil
 import org.koin.core.annotation.Single
 import java.time.Instant
-import dev.usbharu.hideout.domain.model.hideout.form.Post as FormPost
+
+@Suppress("LongParameterList")
+interface PostApiService {
+    suspend fun createPost(postForm: dev.usbharu.hideout.domain.model.hideout.form.Post, userId: Long): PostResponse
+    suspend fun getById(id: Long, userId: Long?): PostResponse
+    suspend fun getAll(
+        since: Instant? = null,
+        until: Instant? = null,
+        minId: Long? = null,
+        maxId: Long? = null,
+        limit: Int? = null,
+        userId: Long? = null
+    ): List<PostResponse>
+
+    suspend fun getByUser(
+        nameOrId: String,
+        since: Instant? = null,
+        until: Instant? = null,
+        minId: Long? = null,
+        maxId: Long? = null,
+        limit: Int? = null,
+        userId: Long? = null
+    ): List<PostResponse>
+
+    suspend fun getReactionByPostId(postId: Long, userId: Long? = null): List<ReactionResponse>
+    suspend fun appendReaction(reaction: String, userId: Long, postId: Long)
+    suspend fun removeReaction(userId: Long, postId: Long)
+}
 
 @Single
 class PostApiServiceImpl(
-    private val postService: IPostService,
-    private val userRepository: IUserRepository,
+    private val postService: PostService,
+    private val userRepository: UserRepository,
     private val postResponseQueryService: PostResponseQueryService,
     private val reactionQueryService: ReactionQueryService,
-    private val reactionService: IReactionService,
+    private val reactionService: ReactionService,
     private val transaction: Transaction
-) : IPostApiService {
-    override suspend fun createPost(postForm: FormPost, userId: Long): PostResponse {
+) : PostApiService {
+    override suspend fun createPost(postForm: Post, userId: Long): PostResponse {
         return transaction.transaction {
             val createdPost = postService.createLocal(
                 PostCreateDto(
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/api/UserApiServiceImpl.kt b/src/main/kotlin/dev/usbharu/hideout/service/api/UserApiService.kt
similarity index 77%
rename from src/main/kotlin/dev/usbharu/hideout/service/api/UserApiServiceImpl.kt
rename to src/main/kotlin/dev/usbharu/hideout/service/api/UserApiService.kt
index 0cd675c2..fb8ce555 100644
--- a/src/main/kotlin/dev/usbharu/hideout/service/api/UserApiServiceImpl.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/service/api/UserApiService.kt
@@ -8,17 +8,37 @@ import dev.usbharu.hideout.exception.UsernameAlreadyExistException
 import dev.usbharu.hideout.query.FollowerQueryService
 import dev.usbharu.hideout.query.UserQueryService
 import dev.usbharu.hideout.service.core.Transaction
-import dev.usbharu.hideout.service.user.IUserService
+import dev.usbharu.hideout.service.user.UserService
 import org.koin.core.annotation.Single
 import kotlin.math.min
 
+interface UserApiService {
+    suspend fun findAll(limit: Int? = 100, offset: Long = 0): List<UserResponse>
+
+    suspend fun findById(id: Long): UserResponse
+
+    suspend fun findByIds(ids: List<Long>): List<UserResponse>
+
+    suspend fun findByAcct(acct: Acct): UserResponse
+
+    suspend fun findFollowers(userId: Long): List<UserResponse>
+
+    suspend fun findFollowings(userId: Long): List<UserResponse>
+
+    suspend fun findFollowersByAcct(acct: Acct): List<UserResponse>
+
+    suspend fun findFollowingsByAcct(acct: Acct): List<UserResponse>
+
+    suspend fun createUser(username: String, password: String): UserResponse
+}
+
 @Single
 class UserApiServiceImpl(
     private val userQueryService: UserQueryService,
     private val followerQueryService: FollowerQueryService,
-    private val userService: IUserService,
+    private val userService: UserService,
     private val transaction: Transaction
-) : IUserApiService {
+) : UserApiService {
     override suspend fun findAll(limit: Int?, offset: Long): List<UserResponse> =
         userQueryService.findAll(min(limit ?: 100, 100), offset).map { UserResponse.from(it) }
 
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/api/UserAuthApiService.kt b/src/main/kotlin/dev/usbharu/hideout/service/api/UserAuthApiService.kt
index 0c8d35f5..e576f8ef 100644
--- a/src/main/kotlin/dev/usbharu/hideout/service/api/UserAuthApiService.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/service/api/UserAuthApiService.kt
@@ -1,9 +1,40 @@
 package dev.usbharu.hideout.service.api
 
+import dev.usbharu.hideout.config.Config
 import dev.usbharu.hideout.domain.model.hideout.dto.JwtToken
 import dev.usbharu.hideout.domain.model.hideout.form.RefreshToken
+import dev.usbharu.hideout.exception.InvalidUsernameOrPasswordException
+import dev.usbharu.hideout.query.UserQueryService
+import dev.usbharu.hideout.service.auth.JwtService
+import dev.usbharu.hideout.service.core.Transaction
+import dev.usbharu.hideout.service.user.UserAuthServiceImpl
+import org.koin.core.annotation.Single
 
 interface UserAuthApiService {
     suspend fun login(username: String, password: String): JwtToken
     suspend fun refreshToken(refreshToken: RefreshToken): JwtToken
 }
+
+@Single
+class UserAuthApiServiceImpl(
+    private val userAuthService: UserAuthServiceImpl,
+    private val userQueryService: UserQueryService,
+    private val jwtService: JwtService,
+    private val transaction: Transaction
+) : UserAuthApiService {
+    override suspend fun login(username: String, password: String): JwtToken {
+        return transaction.transaction {
+            if (userAuthService.verifyAccount(username, password).not()) {
+                throw InvalidUsernameOrPasswordException()
+            }
+            val user = userQueryService.findByNameAndDomain(username, Config.configData.domain)
+            jwtService.createToken(user)
+        }
+    }
+
+    override suspend fun refreshToken(refreshToken: RefreshToken): JwtToken {
+        return transaction.transaction {
+            jwtService.refreshToken(refreshToken)
+        }
+    }
+}
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/api/UserAuthApiServiceImpl.kt b/src/main/kotlin/dev/usbharu/hideout/service/api/UserAuthApiServiceImpl.kt
deleted file mode 100644
index 6896419b..00000000
--- a/src/main/kotlin/dev/usbharu/hideout/service/api/UserAuthApiServiceImpl.kt
+++ /dev/null
@@ -1,35 +0,0 @@
-package dev.usbharu.hideout.service.api
-
-import dev.usbharu.hideout.config.Config
-import dev.usbharu.hideout.domain.model.hideout.dto.JwtToken
-import dev.usbharu.hideout.domain.model.hideout.form.RefreshToken
-import dev.usbharu.hideout.exception.InvalidUsernameOrPasswordException
-import dev.usbharu.hideout.query.UserQueryService
-import dev.usbharu.hideout.service.auth.IJwtService
-import dev.usbharu.hideout.service.core.Transaction
-import dev.usbharu.hideout.service.user.UserAuthService
-import org.koin.core.annotation.Single
-
-@Single
-class UserAuthApiServiceImpl(
-    private val userAuthService: UserAuthService,
-    private val userQueryService: UserQueryService,
-    private val jwtService: IJwtService,
-    private val transaction: Transaction
-) : UserAuthApiService {
-    override suspend fun login(username: String, password: String): JwtToken {
-        return transaction.transaction {
-            if (userAuthService.verifyAccount(username, password).not()) {
-                throw InvalidUsernameOrPasswordException()
-            }
-            val user = userQueryService.findByNameAndDomain(username, Config.configData.domain)
-            jwtService.createToken(user)
-        }
-    }
-
-    override suspend fun refreshToken(refreshToken: RefreshToken): JwtToken {
-        return transaction.transaction {
-            jwtService.refreshToken(refreshToken)
-        }
-    }
-}
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/api/WebFingerApiService.kt b/src/main/kotlin/dev/usbharu/hideout/service/api/WebFingerApiService.kt
index cdda80b7..5311723c 100644
--- a/src/main/kotlin/dev/usbharu/hideout/service/api/WebFingerApiService.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/service/api/WebFingerApiService.kt
@@ -1,7 +1,20 @@
 package dev.usbharu.hideout.service.api
 
 import dev.usbharu.hideout.domain.model.hideout.entity.User
+import dev.usbharu.hideout.query.UserQueryService
+import dev.usbharu.hideout.service.core.Transaction
+import org.koin.core.annotation.Single
 
 interface WebFingerApiService {
     suspend fun findByNameAndDomain(name: String, domain: String): User
 }
+
+@Single
+class WebFingerApiServiceImpl(private val transaction: Transaction, private val userQueryService: UserQueryService) :
+    WebFingerApiService {
+    override suspend fun findByNameAndDomain(name: String, domain: String): User {
+        return transaction.transaction {
+            userQueryService.findByNameAndDomain(name, domain)
+        }
+    }
+}
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/api/WebFingerApiServiceImpl.kt b/src/main/kotlin/dev/usbharu/hideout/service/api/WebFingerApiServiceImpl.kt
deleted file mode 100644
index 66934625..00000000
--- a/src/main/kotlin/dev/usbharu/hideout/service/api/WebFingerApiServiceImpl.kt
+++ /dev/null
@@ -1,16 +0,0 @@
-package dev.usbharu.hideout.service.api
-
-import dev.usbharu.hideout.domain.model.hideout.entity.User
-import dev.usbharu.hideout.query.UserQueryService
-import dev.usbharu.hideout.service.core.Transaction
-import org.koin.core.annotation.Single
-
-@Single
-class WebFingerApiServiceImpl(private val transaction: Transaction, private val userQueryService: UserQueryService) :
-    WebFingerApiService {
-    override suspend fun findByNameAndDomain(name: String, domain: String): User {
-        return transaction.transaction {
-            userQueryService.findByNameAndDomain(name, domain)
-        }
-    }
-}
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/auth/HttpSignatureVerifyService.kt b/src/main/kotlin/dev/usbharu/hideout/service/auth/HttpSignatureVerifyService.kt
index ad326e3b..eb30c903 100644
--- a/src/main/kotlin/dev/usbharu/hideout/service/auth/HttpSignatureVerifyService.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/service/auth/HttpSignatureVerifyService.kt
@@ -1,7 +1,33 @@
 package dev.usbharu.hideout.service.auth
 
+import dev.usbharu.hideout.plugins.KtorKeyMap
+import dev.usbharu.hideout.query.UserQueryService
+import dev.usbharu.hideout.service.core.Transaction
 import io.ktor.http.*
+import org.koin.core.annotation.Single
+import tech.barbero.http.message.signing.SignatureHeaderVerifier
 
 interface HttpSignatureVerifyService {
     fun verify(headers: Headers): Boolean
 }
+
+@Single
+class HttpSignatureVerifyServiceImpl(
+    private val userQueryService: UserQueryService,
+    private val transaction: Transaction
+) : HttpSignatureVerifyService {
+    override fun verify(headers: Headers): Boolean {
+        val build = SignatureHeaderVerifier.builder().keyMap(KtorKeyMap(userQueryService, transaction)).build()
+        return true
+//        build.verify(object : HttpMessage {
+//            override fun headerValues(name: String?): MutableList<String> {
+//                return name?.let { headers.getAll(it) }?.toMutableList() ?: mutableListOf()
+//            }
+//
+//            override fun addHeader(name: String?, value: String?) {
+//                TODO()
+//            }
+//
+//        })
+    }
+}
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/auth/HttpSignatureVerifyServiceImpl.kt b/src/main/kotlin/dev/usbharu/hideout/service/auth/HttpSignatureVerifyServiceImpl.kt
deleted file mode 100644
index e9282d34..00000000
--- a/src/main/kotlin/dev/usbharu/hideout/service/auth/HttpSignatureVerifyServiceImpl.kt
+++ /dev/null
@@ -1,29 +0,0 @@
-package dev.usbharu.hideout.service.auth
-
-import dev.usbharu.hideout.plugins.KtorKeyMap
-import dev.usbharu.hideout.query.UserQueryService
-import dev.usbharu.hideout.service.core.Transaction
-import io.ktor.http.*
-import org.koin.core.annotation.Single
-import tech.barbero.http.message.signing.SignatureHeaderVerifier
-
-@Single
-class HttpSignatureVerifyServiceImpl(
-    private val userQueryService: UserQueryService,
-    private val transaction: Transaction
-) : HttpSignatureVerifyService {
-    override fun verify(headers: Headers): Boolean {
-        val build = SignatureHeaderVerifier.builder().keyMap(KtorKeyMap(userQueryService, transaction)).build()
-        return true
-//        build.verify(object : HttpMessage {
-//            override fun headerValues(name: String?): MutableList<String> {
-//                return name?.let { headers.getAll(it) }?.toMutableList() ?: mutableListOf()
-//            }
-//
-//            override fun addHeader(name: String?, value: String?) {
-//                TODO()
-//            }
-//
-//        })
-    }
-}
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/auth/IJwtService.kt b/src/main/kotlin/dev/usbharu/hideout/service/auth/IJwtService.kt
deleted file mode 100644
index e1976818..00000000
--- a/src/main/kotlin/dev/usbharu/hideout/service/auth/IJwtService.kt
+++ /dev/null
@@ -1,14 +0,0 @@
-package dev.usbharu.hideout.service.auth
-
-import dev.usbharu.hideout.domain.model.hideout.dto.JwtToken
-import dev.usbharu.hideout.domain.model.hideout.entity.User
-import dev.usbharu.hideout.domain.model.hideout.form.RefreshToken
-
-interface IJwtService {
-    suspend fun createToken(user: User): JwtToken
-    suspend fun refreshToken(refreshToken: RefreshToken): JwtToken
-
-    suspend fun revokeToken(refreshToken: RefreshToken)
-    suspend fun revokeToken(user: User)
-    suspend fun revokeAll()
-}
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/auth/JwtServiceImpl.kt b/src/main/kotlin/dev/usbharu/hideout/service/auth/JwtService.kt
similarity index 86%
rename from src/main/kotlin/dev/usbharu/hideout/service/auth/JwtServiceImpl.kt
rename to src/main/kotlin/dev/usbharu/hideout/service/auth/JwtService.kt
index a04dc2f9..462430ac 100644
--- a/src/main/kotlin/dev/usbharu/hideout/service/auth/JwtServiceImpl.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/service/auth/JwtService.kt
@@ -10,8 +10,8 @@ import dev.usbharu.hideout.domain.model.hideout.form.RefreshToken
 import dev.usbharu.hideout.exception.InvalidRefreshTokenException
 import dev.usbharu.hideout.query.JwtRefreshTokenQueryService
 import dev.usbharu.hideout.query.UserQueryService
-import dev.usbharu.hideout.repository.IJwtRefreshTokenRepository
-import dev.usbharu.hideout.service.core.IMetaService
+import dev.usbharu.hideout.repository.JwtRefreshTokenRepository
+import dev.usbharu.hideout.service.core.MetaService
 import dev.usbharu.hideout.util.RsaUtil
 import kotlinx.coroutines.runBlocking
 import org.koin.core.annotation.Single
@@ -19,14 +19,23 @@ import java.time.Instant
 import java.time.temporal.ChronoUnit
 import java.util.*
 
+interface JwtService {
+    suspend fun createToken(user: User): JwtToken
+    suspend fun refreshToken(refreshToken: RefreshToken): JwtToken
+
+    suspend fun revokeToken(refreshToken: RefreshToken)
+    suspend fun revokeToken(user: User)
+    suspend fun revokeAll()
+}
+
 @Suppress("InjectDispatcher")
 @Single
 class JwtServiceImpl(
-    private val metaService: IMetaService,
-    private val refreshTokenRepository: IJwtRefreshTokenRepository,
+    private val metaService: MetaService,
+    private val refreshTokenRepository: JwtRefreshTokenRepository,
     private val userQueryService: UserQueryService,
     private val refreshTokenQueryService: JwtRefreshTokenQueryService
-) : IJwtService {
+) : JwtService {
 
     private val privateKey = runBlocking {
         RsaUtil.decodeRsaPrivateKey(metaService.getJwtMeta().privateKey)
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/core/IMetaService.kt b/src/main/kotlin/dev/usbharu/hideout/service/core/MetaService.kt
similarity index 91%
rename from src/main/kotlin/dev/usbharu/hideout/service/core/IMetaService.kt
rename to src/main/kotlin/dev/usbharu/hideout/service/core/MetaService.kt
index 763dc96a..91da1a90 100644
--- a/src/main/kotlin/dev/usbharu/hideout/service/core/IMetaService.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/service/core/MetaService.kt
@@ -3,7 +3,7 @@ package dev.usbharu.hideout.service.core
 import dev.usbharu.hideout.domain.model.hideout.entity.Jwt
 import dev.usbharu.hideout.domain.model.hideout.entity.Meta
 
-interface IMetaService {
+interface MetaService {
     suspend fun getMeta(): Meta
     suspend fun updateMeta(meta: Meta)
     suspend fun getJwtMeta(): Jwt
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/core/MetaServiceImpl.kt b/src/main/kotlin/dev/usbharu/hideout/service/core/MetaServiceImpl.kt
index c971c177..e35ff3f7 100644
--- a/src/main/kotlin/dev/usbharu/hideout/service/core/MetaServiceImpl.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/service/core/MetaServiceImpl.kt
@@ -3,12 +3,12 @@ package dev.usbharu.hideout.service.core
 import dev.usbharu.hideout.domain.model.hideout.entity.Jwt
 import dev.usbharu.hideout.domain.model.hideout.entity.Meta
 import dev.usbharu.hideout.exception.NotInitException
-import dev.usbharu.hideout.repository.IMetaRepository
+import dev.usbharu.hideout.repository.MetaRepository
 import org.koin.core.annotation.Single
 
 @Single
-class MetaServiceImpl(private val metaRepository: IMetaRepository, private val transaction: Transaction) :
-    IMetaService {
+class MetaServiceImpl(private val metaRepository: MetaRepository, private val transaction: Transaction) :
+    MetaService {
     override suspend fun getMeta(): Meta =
         transaction.transaction { metaRepository.get() ?: throw NotInitException("Meta is null") }
 
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/core/IServerInitialiseService.kt b/src/main/kotlin/dev/usbharu/hideout/service/core/ServerInitialiseService.kt
similarity index 64%
rename from src/main/kotlin/dev/usbharu/hideout/service/core/IServerInitialiseService.kt
rename to src/main/kotlin/dev/usbharu/hideout/service/core/ServerInitialiseService.kt
index c54eaccc..d65f8fa6 100644
--- a/src/main/kotlin/dev/usbharu/hideout/service/core/IServerInitialiseService.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/service/core/ServerInitialiseService.kt
@@ -1,5 +1,5 @@
 package dev.usbharu.hideout.service.core
 
-interface IServerInitialiseService {
+interface ServerInitialiseService {
     suspend fun init()
 }
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/core/ServerInitialiseServiceImpl.kt b/src/main/kotlin/dev/usbharu/hideout/service/core/ServerInitialiseServiceImpl.kt
index 1ca3c25f..4fc950c1 100644
--- a/src/main/kotlin/dev/usbharu/hideout/service/core/ServerInitialiseServiceImpl.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/service/core/ServerInitialiseServiceImpl.kt
@@ -2,7 +2,7 @@ package dev.usbharu.hideout.service.core
 
 import dev.usbharu.hideout.domain.model.hideout.entity.Jwt
 import dev.usbharu.hideout.domain.model.hideout.entity.Meta
-import dev.usbharu.hideout.repository.IMetaRepository
+import dev.usbharu.hideout.repository.MetaRepository
 import dev.usbharu.hideout.util.ServerUtil
 import org.koin.core.annotation.Single
 import org.slf4j.Logger
@@ -12,10 +12,10 @@ import java.util.*
 
 @Single
 class ServerInitialiseServiceImpl(
-    private val metaRepository: IMetaRepository,
+    private val metaRepository: MetaRepository,
     private val transaction: Transaction
 ) :
-    IServerInitialiseService {
+    ServerInitialiseService {
 
     val logger: Logger = LoggerFactory.getLogger(ServerInitialiseServiceImpl::class.java)
 
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/post/IPostService.kt b/src/main/kotlin/dev/usbharu/hideout/service/post/PostService.kt
similarity index 90%
rename from src/main/kotlin/dev/usbharu/hideout/service/post/IPostService.kt
rename to src/main/kotlin/dev/usbharu/hideout/service/post/PostService.kt
index 4459b8d2..28c90710 100644
--- a/src/main/kotlin/dev/usbharu/hideout/service/post/IPostService.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/service/post/PostService.kt
@@ -3,6 +3,6 @@ package dev.usbharu.hideout.service.post
 import dev.usbharu.hideout.domain.model.hideout.dto.PostCreateDto
 import dev.usbharu.hideout.domain.model.hideout.entity.Post
 
-interface IPostService {
+interface PostService {
     suspend fun createLocal(post: PostCreateDto): Post
 }
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/post/PostServiceImpl.kt b/src/main/kotlin/dev/usbharu/hideout/service/post/PostServiceImpl.kt
index fbd204e8..d184cbae 100644
--- a/src/main/kotlin/dev/usbharu/hideout/service/post/PostServiceImpl.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/service/post/PostServiceImpl.kt
@@ -3,18 +3,18 @@ package dev.usbharu.hideout.service.post
 import dev.usbharu.hideout.domain.model.hideout.dto.PostCreateDto
 import dev.usbharu.hideout.domain.model.hideout.entity.Post
 import dev.usbharu.hideout.exception.UserNotFoundException
-import dev.usbharu.hideout.repository.IPostRepository
-import dev.usbharu.hideout.repository.IUserRepository
-import dev.usbharu.hideout.service.activitypub.ActivityPubNoteService
+import dev.usbharu.hideout.repository.PostRepository
+import dev.usbharu.hideout.repository.UserRepository
+import dev.usbharu.hideout.service.ap.APNoteService
 import org.koin.core.annotation.Single
 import java.time.Instant
 
 @Single
 class PostServiceImpl(
-    private val postRepository: IPostRepository,
-    private val userRepository: IUserRepository,
-    private val activityPubNoteService: ActivityPubNoteService
-) : IPostService {
+    private val postRepository: PostRepository,
+    private val userRepository: UserRepository,
+    private val apNoteService: APNoteService
+) : PostService {
     override suspend fun createLocal(post: PostCreateDto): Post {
         val user = userRepository.findById(post.userId) ?: throw UserNotFoundException("${post.userId} was not found")
         val id = postRepository.generateId()
@@ -29,7 +29,7 @@ class PostServiceImpl(
             repostId = null,
             replyId = null
         )
-        activityPubNoteService.createNote(createPost)
+        apNoteService.createNote(createPost)
         return internalCreate(createPost)
     }
 
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/reaction/IReactionService.kt b/src/main/kotlin/dev/usbharu/hideout/service/reaction/ReactionService.kt
similarity index 90%
rename from src/main/kotlin/dev/usbharu/hideout/service/reaction/IReactionService.kt
rename to src/main/kotlin/dev/usbharu/hideout/service/reaction/ReactionService.kt
index 28b56673..a7b9ed0d 100644
--- a/src/main/kotlin/dev/usbharu/hideout/service/reaction/IReactionService.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/service/reaction/ReactionService.kt
@@ -1,6 +1,6 @@
 package dev.usbharu.hideout.service.reaction
 
-interface IReactionService {
+interface ReactionService {
     suspend fun receiveReaction(name: String, domain: String, userId: Long, postId: Long)
     suspend fun sendReaction(name: String, userId: Long, postId: Long)
     suspend fun removeReaction(userId: Long, postId: Long)
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/reaction/ReactionServiceImpl.kt b/src/main/kotlin/dev/usbharu/hideout/service/reaction/ReactionServiceImpl.kt
index b9166326..f8c24df9 100644
--- a/src/main/kotlin/dev/usbharu/hideout/service/reaction/ReactionServiceImpl.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/service/reaction/ReactionServiceImpl.kt
@@ -3,15 +3,15 @@ package dev.usbharu.hideout.service.reaction
 import dev.usbharu.hideout.domain.model.hideout.entity.Reaction
 import dev.usbharu.hideout.query.ReactionQueryService
 import dev.usbharu.hideout.repository.ReactionRepository
-import dev.usbharu.hideout.service.activitypub.ActivityPubReactionService
+import dev.usbharu.hideout.service.ap.APReactionService
 import org.koin.core.annotation.Single
 
 @Single
 class ReactionServiceImpl(
     private val reactionRepository: ReactionRepository,
-    private val activityPubReactionService: ActivityPubReactionService,
+    private val apReactionService: APReactionService,
     private val reactionQueryService: ReactionQueryService
-) : IReactionService {
+) : ReactionService {
     override suspend fun receiveReaction(name: String, domain: String, userId: Long, postId: Long) {
         if (reactionQueryService.reactionAlreadyExist(postId, userId, 0).not()) {
             reactionRepository.save(
@@ -27,7 +27,7 @@ class ReactionServiceImpl(
         } else {
             val reaction = Reaction(reactionRepository.generateId(), 0, postId, userId)
             reactionRepository.save(reaction)
-            activityPubReactionService.reaction(reaction)
+            apReactionService.reaction(reaction)
         }
     }
 
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/user/IUserAuthService.kt b/src/main/kotlin/dev/usbharu/hideout/service/user/IUserAuthService.kt
deleted file mode 100644
index 35896355..00000000
--- a/src/main/kotlin/dev/usbharu/hideout/service/user/IUserAuthService.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package dev.usbharu.hideout.service.user
-
-import java.security.KeyPair
-
-interface IUserAuthService {
-    fun hash(password: String): String
-
-    suspend fun usernameAlreadyUse(username: String): Boolean
-
-    suspend fun generateKeyPair(): KeyPair
-
-    suspend fun verifyAccount(username: String, password: String): Boolean
-}
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/user/IUserService.kt b/src/main/kotlin/dev/usbharu/hideout/service/user/IUserService.kt
deleted file mode 100644
index 14c6d8ab..00000000
--- a/src/main/kotlin/dev/usbharu/hideout/service/user/IUserService.kt
+++ /dev/null
@@ -1,34 +0,0 @@
-package dev.usbharu.hideout.service.user
-
-import dev.usbharu.hideout.domain.model.hideout.dto.RemoteUserCreateDto
-import dev.usbharu.hideout.domain.model.hideout.dto.UserCreateDto
-import dev.usbharu.hideout.domain.model.hideout.entity.User
-
-@Suppress("TooManyFunctions")
-interface IUserService {
-
-    suspend fun usernameAlreadyUse(username: String): Boolean
-
-    suspend fun createLocalUser(user: UserCreateDto): User
-
-    suspend fun createRemoteUser(user: RemoteUserCreateDto): User
-
-    /**
-     * フォローリクエストを送信する
-     *
-     * @param id
-     * @param followerId
-     * @return リクエストが成功したか
-     */
-    suspend fun followRequest(id: Long, followerId: Long): Boolean
-
-    /**
-     * フォローする
-     *
-     * @param id
-     * @param followerId
-     */
-    suspend fun follow(id: Long, followerId: Long)
-
-    suspend fun unfollow(id: Long, followerId: Long): Boolean
-}
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/user/UserAuthService.kt b/src/main/kotlin/dev/usbharu/hideout/service/user/UserAuthService.kt
index c32249dc..61853b73 100644
--- a/src/main/kotlin/dev/usbharu/hideout/service/user/UserAuthService.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/service/user/UserAuthService.kt
@@ -1,53 +1,13 @@
 package dev.usbharu.hideout.service.user
 
-import dev.usbharu.hideout.config.Config
-import dev.usbharu.hideout.query.UserQueryService
-import io.ktor.util.*
-import org.koin.core.annotation.Single
-import java.security.*
-import java.util.*
+import java.security.KeyPair
 
-@Single
-class UserAuthService(
-    val userQueryService: UserQueryService
-) : IUserAuthService {
+interface UserAuthService {
+    fun hash(password: String): String
 
-    override fun hash(password: String): String {
-        val digest = sha256.digest(password.toByteArray(Charsets.UTF_8))
-        return hex(digest)
-    }
+    suspend fun usernameAlreadyUse(username: String): Boolean
 
-    override suspend fun usernameAlreadyUse(username: String): Boolean {
-        userQueryService.findByName(username)
-        return true
-    }
+    suspend fun generateKeyPair(): KeyPair
 
-    override suspend fun verifyAccount(username: String, password: String): Boolean {
-        val userEntity = userQueryService.findByNameAndDomain(username, Config.configData.domain)
-        return userEntity.password == hash(password)
-    }
-
-    override suspend fun generateKeyPair(): KeyPair {
-        val keyPairGenerator = KeyPairGenerator.getInstance("RSA")
-        keyPairGenerator.initialize(keySize)
-        return keyPairGenerator.generateKeyPair()
-    }
-
-    companion object {
-        val sha256: MessageDigest = MessageDigest.getInstance("SHA-256")
-        const val keySize = 2048
-        const val pemSize = 64
-    }
-}
-
-fun PublicKey.toPem(): String {
-    return "-----BEGIN PUBLIC KEY-----\n" +
-        Base64.getEncoder().encodeToString(encoded).chunked(UserAuthService.pemSize).joinToString("\n") +
-        "\n-----END PUBLIC KEY-----\n"
-}
-
-fun PrivateKey.toPem(): String {
-    return "-----BEGIN PRIVATE KEY-----\n" +
-        Base64.getEncoder().encodeToString(encoded).chunked(UserAuthService.pemSize).joinToString("\n") +
-        "\n-----END PRIVATE KEY-----\n"
+    suspend fun verifyAccount(username: String, password: String): Boolean
 }
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/user/UserAuthServiceImpl.kt b/src/main/kotlin/dev/usbharu/hideout/service/user/UserAuthServiceImpl.kt
new file mode 100644
index 00000000..0c234430
--- /dev/null
+++ b/src/main/kotlin/dev/usbharu/hideout/service/user/UserAuthServiceImpl.kt
@@ -0,0 +1,53 @@
+package dev.usbharu.hideout.service.user
+
+import dev.usbharu.hideout.config.Config
+import dev.usbharu.hideout.query.UserQueryService
+import io.ktor.util.*
+import org.koin.core.annotation.Single
+import java.security.*
+import java.util.*
+
+@Single
+class UserAuthServiceImpl(
+    val userQueryService: UserQueryService
+) : UserAuthService {
+
+    override fun hash(password: String): String {
+        val digest = sha256.digest(password.toByteArray(Charsets.UTF_8))
+        return hex(digest)
+    }
+
+    override suspend fun usernameAlreadyUse(username: String): Boolean {
+        userQueryService.findByName(username)
+        return true
+    }
+
+    override suspend fun verifyAccount(username: String, password: String): Boolean {
+        val userEntity = userQueryService.findByNameAndDomain(username, Config.configData.domain)
+        return userEntity.password == hash(password)
+    }
+
+    override suspend fun generateKeyPair(): KeyPair {
+        val keyPairGenerator = KeyPairGenerator.getInstance("RSA")
+        keyPairGenerator.initialize(keySize)
+        return keyPairGenerator.generateKeyPair()
+    }
+
+    companion object {
+        val sha256: MessageDigest = MessageDigest.getInstance("SHA-256")
+        const val keySize = 2048
+        const val pemSize = 64
+    }
+}
+
+fun PublicKey.toPem(): String {
+    return "-----BEGIN PUBLIC KEY-----\n" +
+        Base64.getEncoder().encodeToString(encoded).chunked(UserAuthServiceImpl.pemSize).joinToString("\n") +
+        "\n-----END PUBLIC KEY-----\n"
+}
+
+fun PrivateKey.toPem(): String {
+    return "-----BEGIN PRIVATE KEY-----\n" +
+        Base64.getEncoder().encodeToString(encoded).chunked(UserAuthServiceImpl.pemSize).joinToString("\n") +
+        "\n-----END PRIVATE KEY-----\n"
+}
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/user/UserService.kt b/src/main/kotlin/dev/usbharu/hideout/service/user/UserService.kt
index 89876aaf..a141fa24 100644
--- a/src/main/kotlin/dev/usbharu/hideout/service/user/UserService.kt
+++ b/src/main/kotlin/dev/usbharu/hideout/service/user/UserService.kt
@@ -1,97 +1,34 @@
 package dev.usbharu.hideout.service.user
 
-import dev.usbharu.hideout.config.Config
 import dev.usbharu.hideout.domain.model.hideout.dto.RemoteUserCreateDto
-import dev.usbharu.hideout.domain.model.hideout.dto.SendFollowDto
 import dev.usbharu.hideout.domain.model.hideout.dto.UserCreateDto
 import dev.usbharu.hideout.domain.model.hideout.entity.User
-import dev.usbharu.hideout.exception.UserNotFoundException
-import dev.usbharu.hideout.query.FollowerQueryService
-import dev.usbharu.hideout.query.UserQueryService
-import dev.usbharu.hideout.repository.IUserRepository
-import dev.usbharu.hideout.service.activitypub.ActivityPubSendFollowService
-import org.koin.core.annotation.Single
-import java.time.Instant
 
-@Single
-class UserService(
-    private val userRepository: IUserRepository,
-    private val userAuthService: IUserAuthService,
-    private val activityPubSendFollowService: ActivityPubSendFollowService,
-    private val userQueryService: UserQueryService,
-    private val followerQueryService: FollowerQueryService
-) :
-    IUserService {
+@Suppress("TooManyFunctions")
+interface UserService {
 
-    override suspend fun usernameAlreadyUse(username: String): Boolean {
-        val findByNameAndDomain = userQueryService.findByNameAndDomain(username, Config.configData.domain)
-        return findByNameAndDomain != null
-    }
+    suspend fun usernameAlreadyUse(username: String): Boolean
 
-    override suspend fun createLocalUser(user: UserCreateDto): User {
-        val nextId = userRepository.nextId()
-        val hashedPassword = userAuthService.hash(user.password)
-        val keyPair = userAuthService.generateKeyPair()
-        val userEntity = User(
-            id = nextId,
-            name = user.name,
-            domain = Config.configData.domain,
-            screenName = user.screenName,
-            description = user.description,
-            password = hashedPassword,
-            inbox = "${Config.configData.url}/users/${user.name}/inbox",
-            outbox = "${Config.configData.url}/users/${user.name}/outbox",
-            url = "${Config.configData.url}/users/${user.name}",
-            publicKey = keyPair.public.toPem(),
-            privateKey = keyPair.private.toPem(),
-            createdAt = Instant.now()
-        )
-        return userRepository.save(userEntity)
-    }
+    suspend fun createLocalUser(user: UserCreateDto): User
 
-    override suspend fun createRemoteUser(user: RemoteUserCreateDto): User {
-        val nextId = userRepository.nextId()
-        val userEntity = User(
-            id = nextId,
-            name = user.name,
-            domain = user.domain,
-            screenName = user.screenName,
-            description = user.description,
-            inbox = user.inbox,
-            outbox = user.outbox,
-            url = user.url,
-            publicKey = user.publicKey,
-            createdAt = Instant.now()
-        )
-        return userRepository.save(userEntity)
-    }
+    suspend fun createRemoteUser(user: RemoteUserCreateDto): User
 
-    // TODO APのフォロー処理を作る
-    override suspend fun followRequest(id: Long, followerId: Long): Boolean {
-        val user = userRepository.findById(id) ?: throw UserNotFoundException("$id was not found.")
-        val follower = userRepository.findById(followerId) ?: throw UserNotFoundException("$followerId was not found.")
-        return if (user.domain == Config.configData.domain) {
-            follow(id, followerId)
-            true
-        } else {
-            if (userRepository.findFollowRequestsById(id, followerId)) {
-                // do-nothing
-            } else {
-                activityPubSendFollowService.sendFollow(SendFollowDto(follower, user))
-            }
-            false
-        }
-    }
+    /**
+     * フォローリクエストを送信する
+     *
+     * @param id
+     * @param followerId
+     * @return リクエストが成功したか
+     */
+    suspend fun followRequest(id: Long, followerId: Long): Boolean
 
-    override suspend fun follow(id: Long, followerId: Long) {
-        followerQueryService.appendFollower(id, followerId)
-        if (userRepository.findFollowRequestsById(id, followerId)) {
-            userRepository.deleteFollowRequest(id, followerId)
-        }
-    }
+    /**
+     * フォローする
+     *
+     * @param id
+     * @param followerId
+     */
+    suspend fun follow(id: Long, followerId: Long)
 
-    override suspend fun unfollow(id: Long, followerId: Long): Boolean {
-        followerQueryService.removeFollower(id, followerId)
-        return false
-    }
+    suspend fun unfollow(id: Long, followerId: Long): Boolean
 }
diff --git a/src/main/kotlin/dev/usbharu/hideout/service/user/UserServiceImpl.kt b/src/main/kotlin/dev/usbharu/hideout/service/user/UserServiceImpl.kt
new file mode 100644
index 00000000..6558d770
--- /dev/null
+++ b/src/main/kotlin/dev/usbharu/hideout/service/user/UserServiceImpl.kt
@@ -0,0 +1,97 @@
+package dev.usbharu.hideout.service.user
+
+import dev.usbharu.hideout.config.Config
+import dev.usbharu.hideout.domain.model.hideout.dto.RemoteUserCreateDto
+import dev.usbharu.hideout.domain.model.hideout.dto.SendFollowDto
+import dev.usbharu.hideout.domain.model.hideout.dto.UserCreateDto
+import dev.usbharu.hideout.domain.model.hideout.entity.User
+import dev.usbharu.hideout.exception.UserNotFoundException
+import dev.usbharu.hideout.query.FollowerQueryService
+import dev.usbharu.hideout.query.UserQueryService
+import dev.usbharu.hideout.repository.UserRepository
+import dev.usbharu.hideout.service.ap.APSendFollowService
+import org.koin.core.annotation.Single
+import java.time.Instant
+
+@Single
+class UserServiceImpl(
+    private val userRepository: UserRepository,
+    private val userAuthService: UserAuthService,
+    private val apSendFollowService: APSendFollowService,
+    private val userQueryService: UserQueryService,
+    private val followerQueryService: FollowerQueryService
+) :
+    UserService {
+
+    override suspend fun usernameAlreadyUse(username: String): Boolean {
+        val findByNameAndDomain = userQueryService.findByNameAndDomain(username, Config.configData.domain)
+        return findByNameAndDomain != null
+    }
+
+    override suspend fun createLocalUser(user: UserCreateDto): User {
+        val nextId = userRepository.nextId()
+        val hashedPassword = userAuthService.hash(user.password)
+        val keyPair = userAuthService.generateKeyPair()
+        val userEntity = User(
+            id = nextId,
+            name = user.name,
+            domain = Config.configData.domain,
+            screenName = user.screenName,
+            description = user.description,
+            password = hashedPassword,
+            inbox = "${Config.configData.url}/users/${user.name}/inbox",
+            outbox = "${Config.configData.url}/users/${user.name}/outbox",
+            url = "${Config.configData.url}/users/${user.name}",
+            publicKey = keyPair.public.toPem(),
+            privateKey = keyPair.private.toPem(),
+            createdAt = Instant.now()
+        )
+        return userRepository.save(userEntity)
+    }
+
+    override suspend fun createRemoteUser(user: RemoteUserCreateDto): User {
+        val nextId = userRepository.nextId()
+        val userEntity = User(
+            id = nextId,
+            name = user.name,
+            domain = user.domain,
+            screenName = user.screenName,
+            description = user.description,
+            inbox = user.inbox,
+            outbox = user.outbox,
+            url = user.url,
+            publicKey = user.publicKey,
+            createdAt = Instant.now()
+        )
+        return userRepository.save(userEntity)
+    }
+
+    // TODO APのフォロー処理を作る
+    override suspend fun followRequest(id: Long, followerId: Long): Boolean {
+        val user = userRepository.findById(id) ?: throw UserNotFoundException("$id was not found.")
+        val follower = userRepository.findById(followerId) ?: throw UserNotFoundException("$followerId was not found.")
+        return if (user.domain == Config.configData.domain) {
+            follow(id, followerId)
+            true
+        } else {
+            if (userRepository.findFollowRequestsById(id, followerId)) {
+                // do-nothing
+            } else {
+                apSendFollowService.sendFollow(SendFollowDto(follower, user))
+            }
+            false
+        }
+    }
+
+    override suspend fun follow(id: Long, followerId: Long) {
+        followerQueryService.appendFollower(id, followerId)
+        if (userRepository.findFollowRequestsById(id, followerId)) {
+            userRepository.deleteFollowRequest(id, followerId)
+        }
+    }
+
+    override suspend fun unfollow(id: Long, followerId: Long): Boolean {
+        followerQueryService.removeFollower(id, followerId)
+        return false
+    }
+}
diff --git a/src/test/kotlin/dev/usbharu/hideout/plugins/SecurityKtTest.kt b/src/test/kotlin/dev/usbharu/hideout/plugins/SecurityKtTest.kt
index ff3e89f9..0d91ce6f 100644
--- a/src/test/kotlin/dev/usbharu/hideout/plugins/SecurityKtTest.kt
+++ b/src/test/kotlin/dev/usbharu/hideout/plugins/SecurityKtTest.kt
@@ -18,9 +18,9 @@ import dev.usbharu.hideout.exception.InvalidUsernameOrPasswordException
 import dev.usbharu.hideout.query.UserQueryService
 import dev.usbharu.hideout.routing.api.internal.v1.auth
 import dev.usbharu.hideout.service.api.UserAuthApiService
-import dev.usbharu.hideout.service.auth.IJwtService
-import dev.usbharu.hideout.service.core.IMetaService
-import dev.usbharu.hideout.service.user.IUserAuthService
+import dev.usbharu.hideout.service.auth.JwtService
+import dev.usbharu.hideout.service.core.MetaService
+import dev.usbharu.hideout.service.user.UserAuthService
 import dev.usbharu.hideout.util.Base64Util
 import dev.usbharu.hideout.util.JsonWebKeyUtil
 import io.ktor.client.request.*
@@ -51,7 +51,7 @@ class SecurityKtTest {
         val userAuthService = mock<UserAuthApiService> {
             onBlocking { login(eq("testUser"), eq("password")) } doReturn jwtToken
         }
-        val metaService = mock<IMetaService>()
+        val metaService = mock<MetaService>()
         val userQueryService = mock<UserQueryService> {
             onBlocking { findByNameAndDomain(eq("testUser"), eq("example.com")) } doReturn User(
                 id = 1L,
@@ -93,12 +93,12 @@ class SecurityKtTest {
                 config = ApplicationConfig("empty.conf")
             }
             Config.configData = ConfigData(url = "http://example.com", objectMapper = jacksonObjectMapper())
-            mock<IUserAuthService> {
+            mock<UserAuthService> {
                 onBlocking { verifyAccount(anyString(), anyString()) }.doReturn(false)
             }
-            val metaService = mock<IMetaService>()
+            val metaService = mock<MetaService>()
             mock<UserQueryService>()
-            mock<IJwtService>()
+            mock<JwtService>()
             val jwkProvider = mock<JwkProvider>()
             val userAuthApiService = mock<UserAuthApiService> {
                 onBlocking { login(anyString(), anyString()) } doThrow InvalidUsernameOrPasswordException()
@@ -126,7 +126,7 @@ class SecurityKtTest {
             config = ApplicationConfig("empty.conf")
         }
         Config.configData = ConfigData(url = "http://example.com", objectMapper = jacksonObjectMapper())
-        val metaService = mock<IMetaService>()
+        val metaService = mock<MetaService>()
         val jwkProvider = mock<JwkProvider>()
         val userAuthApiService = mock<UserAuthApiService> {
             onBlocking { login(anyString(), eq("InvalidPassword")) } doThrow InvalidUsernameOrPasswordException()
@@ -247,7 +247,7 @@ class SecurityKtTest {
             .withClaim("uid", 123456L)
             .withExpiresAt(now.plus(30, ChronoUnit.MINUTES))
             .sign(Algorithm.RSA256(rsaPublicKey, keyPair.private as RSAPrivateKey))
-        val metaService = mock<IMetaService> {
+        val metaService = mock<MetaService> {
             onBlocking { getJwtMeta() }.doReturn(
                 Jwt(
                     kid,
@@ -308,7 +308,7 @@ class SecurityKtTest {
             .withClaim("uid", 123345L)
             .withExpiresAt(now.minus(30, ChronoUnit.MINUTES))
             .sign(Algorithm.RSA256(rsaPublicKey, keyPair.private as RSAPrivateKey))
-        val metaService = mock<IMetaService> {
+        val metaService = mock<MetaService> {
             onBlocking { getJwtMeta() }.doReturn(
                 Jwt(
                     kid,
@@ -367,7 +367,7 @@ class SecurityKtTest {
             .withClaim("uid", 12345L)
             .withExpiresAt(now.plus(30, ChronoUnit.MINUTES))
             .sign(Algorithm.RSA256(rsaPublicKey, keyPair.private as RSAPrivateKey))
-        val metaService = mock<IMetaService> {
+        val metaService = mock<MetaService> {
             onBlocking { getJwtMeta() }.doReturn(
                 Jwt(
                     kid,
@@ -426,7 +426,7 @@ class SecurityKtTest {
             .withClaim("uid", null as Long?)
             .withExpiresAt(now.plus(30, ChronoUnit.MINUTES))
             .sign(Algorithm.RSA256(rsaPublicKey, keyPair.private as RSAPrivateKey))
-        val metaService = mock<IMetaService> {
+        val metaService = mock<MetaService> {
             onBlocking { getJwtMeta() }.doReturn(
                 Jwt(
                     kid,
@@ -484,7 +484,7 @@ class SecurityKtTest {
             .withKeyId(kid.toString())
             .withExpiresAt(now.plus(30, ChronoUnit.MINUTES))
             .sign(Algorithm.RSA256(rsaPublicKey, keyPair.private as RSAPrivateKey))
-        val metaService = mock<IMetaService> {
+        val metaService = mock<MetaService> {
             onBlocking { getJwtMeta() }.doReturn(
                 Jwt(
                     kid,
diff --git a/src/test/kotlin/dev/usbharu/hideout/routing/activitypub/InboxRoutingKtTest.kt b/src/test/kotlin/dev/usbharu/hideout/routing/activitypub/InboxRoutingKtTest.kt
index 9260848c..75a2c335 100644
--- a/src/test/kotlin/dev/usbharu/hideout/routing/activitypub/InboxRoutingKtTest.kt
+++ b/src/test/kotlin/dev/usbharu/hideout/routing/activitypub/InboxRoutingKtTest.kt
@@ -3,10 +3,10 @@ package dev.usbharu.hideout.routing.activitypub
 import dev.usbharu.hideout.exception.JsonParseException
 import dev.usbharu.hideout.plugins.configureSerialization
 import dev.usbharu.hideout.plugins.configureStatusPages
-import dev.usbharu.hideout.service.activitypub.ActivityPubService
-import dev.usbharu.hideout.service.activitypub.ActivityPubUserService
+import dev.usbharu.hideout.service.ap.APService
+import dev.usbharu.hideout.service.ap.APUserService
 import dev.usbharu.hideout.service.auth.HttpSignatureVerifyService
-import dev.usbharu.hideout.service.user.IUserService
+import dev.usbharu.hideout.service.user.UserService
 import io.ktor.client.request.*
 import io.ktor.http.*
 import io.ktor.server.config.*
@@ -44,16 +44,16 @@ class InboxRoutingKtTest {
         val httpSignatureVerifyService = mock<HttpSignatureVerifyService> {
             on { verify(any()) } doReturn true
         }
-        val activityPubService = mock<ActivityPubService> {
+        val apService = mock<APService> {
             on { parseActivity(any()) } doThrow JsonParseException()
         }
-        mock<IUserService>()
-        mock<ActivityPubUserService>()
+        mock<UserService>()
+        mock<APUserService>()
         application {
             configureStatusPages()
             configureSerialization()
             routing {
-                inbox(httpSignatureVerifyService, activityPubService)
+                inbox(httpSignatureVerifyService, apService)
             }
         }
         client.post("/inbox").let {
@@ -85,16 +85,16 @@ class InboxRoutingKtTest {
         val httpSignatureVerifyService = mock<HttpSignatureVerifyService> {
             on { verify(any()) } doReturn true
         }
-        val activityPubService = mock<ActivityPubService> {
+        val apService = mock<APService> {
             on { parseActivity(any()) } doThrow JsonParseException()
         }
-        mock<IUserService>()
-        mock<ActivityPubUserService>()
+        mock<UserService>()
+        mock<APUserService>()
         application {
             configureStatusPages()
             configureSerialization()
             routing {
-                inbox(httpSignatureVerifyService, activityPubService)
+                inbox(httpSignatureVerifyService, apService)
             }
         }
         client.post("/users/test/inbox").let {
diff --git a/src/test/kotlin/dev/usbharu/hideout/routing/activitypub/UsersAPTest.kt b/src/test/kotlin/dev/usbharu/hideout/routing/activitypub/UsersAPTest.kt
index 3aaa4168..8fbb324f 100644
--- a/src/test/kotlin/dev/usbharu/hideout/routing/activitypub/UsersAPTest.kt
+++ b/src/test/kotlin/dev/usbharu/hideout/routing/activitypub/UsersAPTest.kt
@@ -12,7 +12,7 @@ import dev.usbharu.hideout.domain.model.ap.Person
 import dev.usbharu.hideout.domain.model.hideout.entity.User
 import dev.usbharu.hideout.plugins.configureSerialization
 import dev.usbharu.hideout.query.UserQueryService
-import dev.usbharu.hideout.service.activitypub.ActivityPubUserService
+import dev.usbharu.hideout.service.ap.APUserService
 import dev.usbharu.hideout.util.HttpUtil.Activity
 import dev.usbharu.hideout.util.HttpUtil.JsonLd
 import io.ktor.client.request.*
@@ -63,14 +63,14 @@ class UsersAPTest {
         )
         person.context = listOf("https://www.w3.org/ns/activitystreams")
 
-        val activityPubUserService = mock<ActivityPubUserService> {
+        val apUserService = mock<APUserService> {
             onBlocking { getPersonByName(anyString()) } doReturn person
         }
 
         application {
             configureSerialization()
             routing {
-                usersAP(activityPubUserService, mock(), mock(), TestTransaction)
+                usersAP(apUserService, mock(), mock(), TestTransaction)
             }
         }
         client.get("/users/test") {
@@ -121,14 +121,14 @@ class UsersAPTest {
         )
         person.context = listOf("https://www.w3.org/ns/activitystreams")
 
-        val activityPubUserService = mock<ActivityPubUserService> {
+        val apUserService = mock<APUserService> {
             onBlocking { getPersonByName(anyString()) } doReturn person
         }
 
         application {
             configureSerialization()
             routing {
-                usersAP(activityPubUserService, mock(), mock(), TestTransaction)
+                usersAP(apUserService, mock(), mock(), TestTransaction)
             }
         }
         client.get("/users/test") {
diff --git a/src/test/kotlin/dev/usbharu/hideout/routing/api/internal/v1/PostsTest.kt b/src/test/kotlin/dev/usbharu/hideout/routing/api/internal/v1/PostsTest.kt
index 4a8fb0e8..81f9e66c 100644
--- a/src/test/kotlin/dev/usbharu/hideout/routing/api/internal/v1/PostsTest.kt
+++ b/src/test/kotlin/dev/usbharu/hideout/routing/api/internal/v1/PostsTest.kt
@@ -10,7 +10,7 @@ import dev.usbharu.hideout.domain.model.hideout.entity.Visibility
 import dev.usbharu.hideout.plugins.TOKEN_AUTH
 import dev.usbharu.hideout.plugins.configureSecurity
 import dev.usbharu.hideout.plugins.configureSerialization
-import dev.usbharu.hideout.service.api.IPostApiService
+import dev.usbharu.hideout.service.api.PostApiService
 import io.ktor.client.request.*
 import io.ktor.client.statement.*
 import io.ktor.http.*
@@ -60,7 +60,7 @@ class PostsTest {
                 url = "https://example.com/posts/2"
             )
         )
-        val postService = mock<IPostApiService> {
+        val postService = mock<PostApiService> {
             onBlocking {
                 getAll(
                     since = anyOrNull(),
@@ -135,7 +135,7 @@ class PostsTest {
             )
         )
 
-        val postService = mock<IPostApiService> {
+        val postService = mock<PostApiService> {
             onBlocking {
                 getAll(
                     since = anyOrNull(),
@@ -191,7 +191,7 @@ class PostsTest {
             createdAt = Instant.now().toEpochMilli(),
             url = "https://example.com/posts/1"
         )
-        val postService = mock<IPostApiService> {
+        val postService = mock<PostApiService> {
             onBlocking { getById(any(), anyOrNull()) } doReturn post
         }
         application {
@@ -230,7 +230,7 @@ class PostsTest {
             createdAt = Instant.now().toEpochMilli(),
             url = "https://example.com/posts/1"
         )
-        val postService = mock<IPostApiService> {
+        val postService = mock<PostApiService> {
             onBlocking { getById(any(), isNotNull()) } doReturn post
         }
         val claim = mock<Claim> {
@@ -273,7 +273,7 @@ class PostsTest {
         val payload = mock<Payload> {
             on { getClaim(eq("uid")) } doReturn claim
         }
-        val postService = mock<IPostApiService> {
+        val postService = mock<PostApiService> {
             onBlocking { createPost(any(), any()) } doAnswer {
                 val argument = it.getArgument<dev.usbharu.hideout.domain.model.hideout.form.Post>(0)
                 val userId = it.getArgument<Long>(1)
@@ -360,7 +360,7 @@ class PostsTest {
                 url = "https://example.com/posts/2"
             )
         )
-        val postService = mock<IPostApiService> {
+        val postService = mock<PostApiService> {
             onBlocking {
                 getByUser(
                     nameOrId = any(),
@@ -421,7 +421,7 @@ class PostsTest {
                 url = "https://example.com/posts/2"
             )
         )
-        val postService = mock<IPostApiService> {
+        val postService = mock<PostApiService> {
             onBlocking {
                 getByUser(
                     nameOrId = eq("test1"),
@@ -482,7 +482,7 @@ class PostsTest {
                 url = "https://example.com/posts/2"
             )
         )
-        val postService = mock<IPostApiService> {
+        val postService = mock<PostApiService> {
             onBlocking {
                 getByUser(
                     nameOrId = eq("test1@example.com"),
@@ -543,7 +543,7 @@ class PostsTest {
                 url = "https://example.com/posts/2"
             )
         )
-        val postService = mock<IPostApiService> {
+        val postService = mock<PostApiService> {
             onBlocking {
                 getByUser(
                     nameOrId = eq("@test1@example.com"),
@@ -593,7 +593,7 @@ class PostsTest {
             createdAt = Instant.now().toEpochMilli(),
             url = "https://example.com/posts/2"
         )
-        val postService = mock<IPostApiService> {
+        val postService = mock<PostApiService> {
             onBlocking { getById(eq(12345L), anyOrNull()) } doReturn post
         }
         application {
@@ -633,7 +633,7 @@ class PostsTest {
             createdAt = Instant.now().toEpochMilli(),
             url = "https://example.com/posts/2"
         )
-        val postService = mock<IPostApiService> {
+        val postService = mock<PostApiService> {
             onBlocking { getById(eq(12345L), anyOrNull()) } doReturn post
         }
         application {
@@ -673,7 +673,7 @@ class PostsTest {
             createdAt = Instant.now().toEpochMilli(),
             url = "https://example.com/posts/2"
         )
-        val postService = mock<IPostApiService> {
+        val postService = mock<PostApiService> {
             onBlocking { getById(eq(12345L), anyOrNull()) } doReturn post
         }
         application {
@@ -713,7 +713,7 @@ class PostsTest {
             createdAt = Instant.now().toEpochMilli(),
             url = "https://example.com/posts/2"
         )
-        val postService = mock<IPostApiService> {
+        val postService = mock<PostApiService> {
             onBlocking { getById(eq(12345L), anyOrNull()) } doReturn post
         }
         application {
diff --git a/src/test/kotlin/dev/usbharu/hideout/routing/api/internal/v1/UsersTest.kt b/src/test/kotlin/dev/usbharu/hideout/routing/api/internal/v1/UsersTest.kt
index a29245df..18f70364 100644
--- a/src/test/kotlin/dev/usbharu/hideout/routing/api/internal/v1/UsersTest.kt
+++ b/src/test/kotlin/dev/usbharu/hideout/routing/api/internal/v1/UsersTest.kt
@@ -10,8 +10,8 @@ import dev.usbharu.hideout.domain.model.hideout.form.UserCreate
 import dev.usbharu.hideout.plugins.TOKEN_AUTH
 import dev.usbharu.hideout.plugins.configureSecurity
 import dev.usbharu.hideout.plugins.configureSerialization
-import dev.usbharu.hideout.service.api.IUserApiService
-import dev.usbharu.hideout.service.user.IUserService
+import dev.usbharu.hideout.service.api.UserApiService
+import dev.usbharu.hideout.service.user.UserService
 import io.ktor.client.request.*
 import io.ktor.client.statement.*
 import io.ktor.http.*
@@ -53,7 +53,7 @@ class UsersTest {
                 Instant.now().toEpochMilli()
             ),
         )
-        val userService = mock<IUserApiService> {
+        val userService = mock<UserApiService> {
             onBlocking { findAll(anyOrNull(), anyOrNull()) } doReturn users
         }
         application {
@@ -77,7 +77,7 @@ class UsersTest {
             config = ApplicationConfig("empty.conf")
         }
         val userCreateDto = UserCreate("test", "XXXXXXX")
-        val userService = mock<IUserService> {
+        val userService = mock<UserService> {
             onBlocking { usernameAlreadyUse(any()) } doReturn false
             onBlocking { createLocalUser(any()) } doReturn User(
                 id = 12345,
@@ -122,7 +122,7 @@ class UsersTest {
             config = ApplicationConfig("empty.conf")
         }
         val userCreateDto = UserCreate("test", "XXXXXXX")
-        val userService = mock<IUserService> {
+        val userService = mock<UserService> {
             onBlocking { usernameAlreadyUse(any()) } doReturn true
         }
         application {
@@ -157,7 +157,7 @@ class UsersTest {
             "https://example.com/test",
             Instant.now().toEpochMilli()
         )
-        val userApiService = mock<IUserApiService> {
+        val userApiService = mock<UserApiService> {
             onBlocking { findByAcct(any()) } doReturn userResponse
         }
         application {
@@ -190,7 +190,7 @@ class UsersTest {
             "https://example.com/test",
             Instant.now().toEpochMilli()
         )
-        val userApiService = mock<IUserApiService> {
+        val userApiService = mock<UserApiService> {
             onBlocking { findById(any()) } doReturn userResponse
         }
         application {
@@ -223,7 +223,7 @@ class UsersTest {
             "https://example.com/test",
             Instant.now().toEpochMilli()
         )
-        val userApiService = mock<IUserApiService> {
+        val userApiService = mock<UserApiService> {
             onBlocking { findByAcct(any()) } doReturn userResponse
         }
         application {
@@ -256,7 +256,7 @@ class UsersTest {
             "https://example.com/test",
             Instant.now().toEpochMilli()
         )
-        val userApiService = mock<IUserApiService> {
+        val userApiService = mock<UserApiService> {
             onBlocking { findByAcct(any()) } doReturn userResponse
         }
         application {
@@ -301,7 +301,7 @@ class UsersTest {
                 Instant.now().toEpochMilli()
             )
         )
-        val userApiService = mock<IUserApiService> {
+        val userApiService = mock<UserApiService> {
             onBlocking { findFollowersByAcct(any()) } doReturn followers
         }
         application {
@@ -346,7 +346,7 @@ class UsersTest {
                 Instant.now().toEpochMilli()
             )
         )
-        val userApiService = mock<IUserApiService> {
+        val userApiService = mock<UserApiService> {
             onBlocking { findFollowersByAcct(any()) } doReturn followers
         }
         application {
@@ -391,7 +391,7 @@ class UsersTest {
                 Instant.now().toEpochMilli()
             )
         )
-        val userApiService = mock<IUserApiService> {
+        val userApiService = mock<UserApiService> {
             onBlocking { findFollowers(any()) } doReturn followers
         }
         application {
@@ -423,7 +423,7 @@ class UsersTest {
             on { getClaim(eq("uid")) } doReturn claim
         }
 
-        val userApiService = mock<IUserApiService> {
+        val userApiService = mock<UserApiService> {
             onBlocking { findByAcct(any()) } doReturn UserResponse(
                 "1235",
                 "follower1",
@@ -434,7 +434,7 @@ class UsersTest {
                 Instant.now().toEpochMilli()
             )
         }
-        val userService = mock<IUserService> {
+        val userService = mock<UserService> {
             onBlocking { followRequest(eq(1235), eq(1234)) } doReturn true
         }
         application {
@@ -473,7 +473,7 @@ class UsersTest {
             on { getClaim(eq("uid")) } doReturn claim
         }
 
-        val userApiService = mock<IUserApiService> {
+        val userApiService = mock<UserApiService> {
             onBlocking { findByAcct(any()) } doReturn UserResponse(
                 "1235",
                 "follower1",
@@ -484,7 +484,7 @@ class UsersTest {
                 Instant.now().toEpochMilli()
             )
         }
-        val userService = mock<IUserService> {
+        val userService = mock<UserService> {
             onBlocking { followRequest(eq(1235), eq(1234)) } doReturn false
         }
         application {
@@ -523,7 +523,7 @@ class UsersTest {
             on { getClaim(eq("uid")) } doReturn claim
         }
 
-        val userApiService = mock<IUserApiService> {
+        val userApiService = mock<UserApiService> {
             onBlocking { findById(any()) } doReturn UserResponse(
                 "1235",
                 "follower1",
@@ -534,7 +534,7 @@ class UsersTest {
                 Instant.now().toEpochMilli()
             )
         }
-        val userService = mock<IUserService> {
+        val userService = mock<UserService> {
             onBlocking { followRequest(eq(1235), eq(1234)) } doReturn false
         }
         application {
@@ -586,7 +586,7 @@ class UsersTest {
                 Instant.now().toEpochMilli()
             )
         )
-        val userApiService = mock<IUserApiService> {
+        val userApiService = mock<UserApiService> {
             onBlocking { findFollowingsByAcct(any()) } doReturn followers
         }
         application {
@@ -631,7 +631,7 @@ class UsersTest {
                 Instant.now().toEpochMilli()
             )
         )
-        val userApiService = mock<IUserApiService> {
+        val userApiService = mock<UserApiService> {
             onBlocking { findFollowingsByAcct(any()) } doReturn followers
         }
         application {
@@ -676,7 +676,7 @@ class UsersTest {
                 Instant.now().toEpochMilli()
             )
         )
-        val userApiService = mock<IUserApiService> {
+        val userApiService = mock<UserApiService> {
             onBlocking { findFollowings(any()) } doReturn followers
         }
         application {
diff --git a/src/test/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubNoteServiceImplTest.kt b/src/test/kotlin/dev/usbharu/hideout/service/ap/APNoteServiceImplTest.kt
similarity index 95%
rename from src/test/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubNoteServiceImplTest.kt
rename to src/test/kotlin/dev/usbharu/hideout/service/ap/APNoteServiceImplTest.kt
index c02f65ae..df22d1e1 100644
--- a/src/test/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubNoteServiceImplTest.kt
+++ b/src/test/kotlin/dev/usbharu/hideout/service/ap/APNoteServiceImplTest.kt
@@ -1,7 +1,7 @@
 @file:OptIn(ExperimentalCoroutinesApi::class)
 @file:Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
 
-package dev.usbharu.hideout.service.activitypub
+package dev.usbharu.hideout.service.ap
 
 import dev.usbharu.hideout.config.Config
 import dev.usbharu.hideout.config.ConfigData
@@ -25,7 +25,7 @@ import utils.JsonObjectMapper
 import java.time.Instant
 import kotlin.test.assertEquals
 
-class ActivityPubNoteServiceImplTest {
+class APNoteServiceImplTest {
     @Test
     fun `createPost 新しい投稿`() = runTest {
         val followers = listOf<User>(
@@ -76,7 +76,7 @@ class ActivityPubNoteServiceImplTest {
         }
         val jobQueueParentService = mock<JobQueueParentService>()
         val activityPubNoteService =
-            ActivityPubNoteServiceImpl(
+            APNoteServiceImpl(
                 mock(),
                 jobQueueParentService,
                 mock(),
@@ -107,7 +107,7 @@ class ActivityPubNoteServiceImplTest {
                 respondOk()
             }
         )
-        val activityPubNoteService = ActivityPubNoteServiceImpl(
+        val activityPubNoteService = APNoteServiceImpl(
             httpClient,
             mock(),
             mock(),
diff --git a/src/test/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubReceiveFollowServiceImplTest.kt b/src/test/kotlin/dev/usbharu/hideout/service/ap/APReceiveFollowServiceImplTest.kt
similarity index 93%
rename from src/test/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubReceiveFollowServiceImplTest.kt
rename to src/test/kotlin/dev/usbharu/hideout/service/ap/APReceiveFollowServiceImplTest.kt
index 66f7b338..7b7f2c21 100644
--- a/src/test/kotlin/dev/usbharu/hideout/service/activitypub/ActivityPubReceiveFollowServiceImplTest.kt
+++ b/src/test/kotlin/dev/usbharu/hideout/service/ap/APReceiveFollowServiceImplTest.kt
@@ -1,7 +1,7 @@
 @file:OptIn(ExperimentalCoroutinesApi::class)
 @file:Suppress("INVISIBLE_MEMBER", "INVISIBLE_REFERENCE")
 
-package dev.usbharu.hideout.service.activitypub
+package dev.usbharu.hideout.service.ap
 
 import com.fasterxml.jackson.module.kotlin.readValue
 import dev.usbharu.hideout.config.Config
@@ -11,7 +11,7 @@ import dev.usbharu.hideout.domain.model.hideout.entity.User
 import dev.usbharu.hideout.domain.model.job.ReceiveFollowJob
 import dev.usbharu.hideout.query.UserQueryService
 import dev.usbharu.hideout.service.job.JobQueueParentService
-import dev.usbharu.hideout.service.user.IUserService
+import dev.usbharu.hideout.service.user.UserService
 import io.ktor.client.*
 import io.ktor.client.engine.mock.*
 import kjob.core.dsl.ScheduleContext
@@ -27,14 +27,14 @@ import utils.JsonObjectMapper
 import utils.TestTransaction
 import java.time.Instant
 
-class ActivityPubReceiveFollowServiceImplTest {
+class APReceiveFollowServiceImplTest {
     @Test
     fun `receiveFollow フォロー受付処理`() = runTest {
         val jobQueueParentService = mock<JobQueueParentService> {
             onBlocking { schedule(eq(ReceiveFollowJob), any()) } doReturn Unit
         }
         val activityPubFollowService =
-            ActivityPubReceiveFollowServiceImpl(jobQueueParentService, mock(), mock(), mock(), mock(), TestTransaction)
+            APReceiveFollowServiceImpl(jobQueueParentService, mock(), mock(), mock(), mock(), TestTransaction)
         activityPubFollowService.receiveFollow(
             Follow(
                 emptyList(),
@@ -96,7 +96,7 @@ class ActivityPubReceiveFollowServiceImplTest {
             )
 
         )
-        val activityPubUserService = mock<ActivityPubUserService> {
+        val apUserService = mock<APUserService> {
             onBlocking { fetchPerson(anyString(), any()) } doReturn person
         }
         val userQueryService = mock<UserQueryService> {
@@ -128,13 +128,13 @@ class ActivityPubReceiveFollowServiceImplTest {
                 )
         }
 
-        val userService = mock<IUserService> {
+        val userService = mock<UserService> {
             onBlocking { followRequest(any(), any()) } doReturn false
         }
         val activityPubFollowService =
-            ActivityPubReceiveFollowServiceImpl(
+            APReceiveFollowServiceImpl(
                 mock(),
-                activityPubUserService,
+                apUserService,
                 userService,
                 HttpClient(
                     MockEngine { httpRequestData ->
diff --git a/src/test/kotlin/dev/usbharu/hideout/service/auth/JwtServiceImplTest.kt b/src/test/kotlin/dev/usbharu/hideout/service/auth/JwtServiceImplTest.kt
index e4f37934..44fc2844 100644
--- a/src/test/kotlin/dev/usbharu/hideout/service/auth/JwtServiceImplTest.kt
+++ b/src/test/kotlin/dev/usbharu/hideout/service/auth/JwtServiceImplTest.kt
@@ -14,8 +14,8 @@ import dev.usbharu.hideout.domain.model.hideout.form.RefreshToken
 import dev.usbharu.hideout.exception.InvalidRefreshTokenException
 import dev.usbharu.hideout.query.JwtRefreshTokenQueryService
 import dev.usbharu.hideout.query.UserQueryService
-import dev.usbharu.hideout.repository.IJwtRefreshTokenRepository
-import dev.usbharu.hideout.service.core.IMetaService
+import dev.usbharu.hideout.repository.JwtRefreshTokenRepository
+import dev.usbharu.hideout.service.core.MetaService
 import dev.usbharu.hideout.util.Base64Util
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.test.runTest
@@ -42,14 +42,14 @@ class JwtServiceImplTest {
         keyPairGenerator.initialize(2048)
         val generateKeyPair = keyPairGenerator.generateKeyPair()
 
-        val metaService = mock<IMetaService> {
+        val metaService = mock<MetaService> {
             onBlocking { getJwtMeta() } doReturn Jwt(
                 kid,
                 Base64Util.encode(generateKeyPair.private.encoded),
                 Base64Util.encode(generateKeyPair.public.encoded)
             )
         }
-        val refreshTokenRepository = mock<IJwtRefreshTokenRepository> {
+        val refreshTokenRepository = mock<JwtRefreshTokenRepository> {
             onBlocking { generateId() } doReturn 1L
         }
         val jwtService = JwtServiceImpl(metaService, refreshTokenRepository, mock(), mock())
@@ -94,7 +94,7 @@ class JwtServiceImplTest {
         keyPairGenerator.initialize(2048)
         val generateKeyPair = keyPairGenerator.generateKeyPair()
 
-        val refreshTokenRepository = mock<IJwtRefreshTokenRepository> {
+        val refreshTokenRepository = mock<JwtRefreshTokenRepository> {
             onBlocking { generateId() } doReturn 2L
         }
 
@@ -123,7 +123,7 @@ class JwtServiceImplTest {
                 createdAt = Instant.now()
             )
         }
-        val metaService = mock<IMetaService> {
+        val metaService = mock<MetaService> {
             onBlocking { getJwtMeta() } doReturn Jwt(
                 kid,
                 Base64Util.encode(generateKeyPair.private.encoded),
@@ -160,7 +160,7 @@ class JwtServiceImplTest {
         keyPairGenerator.initialize(2048)
         val generateKeyPair = keyPairGenerator.generateKeyPair()
 
-        val metaService = mock<IMetaService> {
+        val metaService = mock<MetaService> {
             onBlocking { getJwtMeta() } doReturn Jwt(
                 kid,
                 Base64Util.encode(generateKeyPair.private.encoded),
@@ -187,7 +187,7 @@ class JwtServiceImplTest {
         keyPairGenerator.initialize(2048)
         val generateKeyPair = keyPairGenerator.generateKeyPair()
 
-        val metaService = mock<IMetaService> {
+        val metaService = mock<MetaService> {
             onBlocking { getJwtMeta() } doReturn Jwt(
                 kid,
                 Base64Util.encode(generateKeyPair.private.encoded),
@@ -214,7 +214,7 @@ class JwtServiceImplTest {
         keyPairGenerator.initialize(2048)
         val generateKeyPair = keyPairGenerator.generateKeyPair()
 
-        val metaService = mock<IMetaService> {
+        val metaService = mock<MetaService> {
             onBlocking { getJwtMeta() } doReturn Jwt(
                 kid,
                 Base64Util.encode(generateKeyPair.private.encoded),
diff --git a/src/test/kotlin/dev/usbharu/hideout/service/core/MetaServiceImplTest.kt b/src/test/kotlin/dev/usbharu/hideout/service/core/MetaServiceImplTest.kt
index 02cf9e7e..546dab35 100644
--- a/src/test/kotlin/dev/usbharu/hideout/service/core/MetaServiceImplTest.kt
+++ b/src/test/kotlin/dev/usbharu/hideout/service/core/MetaServiceImplTest.kt
@@ -5,7 +5,7 @@ package dev.usbharu.hideout.service.core
 import dev.usbharu.hideout.domain.model.hideout.entity.Jwt
 import dev.usbharu.hideout.domain.model.hideout.entity.Meta
 import dev.usbharu.hideout.exception.NotInitException
-import dev.usbharu.hideout.repository.IMetaRepository
+import dev.usbharu.hideout.repository.MetaRepository
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.test.runTest
 import org.junit.jupiter.api.Test
@@ -19,7 +19,7 @@ class MetaServiceImplTest {
     @Test
     fun `getMeta メタデータを取得できる`() = runTest {
         val meta = Meta("1.0.0", Jwt(UUID.randomUUID(), "sdfsdjk", "adafda"))
-        val metaRepository = mock<IMetaRepository> {
+        val metaRepository = mock<MetaRepository> {
             onBlocking { get() } doReturn meta
         }
         val metaService = MetaServiceImpl(metaRepository, TestTransaction)
@@ -29,7 +29,7 @@ class MetaServiceImplTest {
 
     @Test
     fun `getMeta メタデータが無いときはNotInitExceptionがthrowされる`() = runTest {
-        val metaRepository = mock<IMetaRepository> {
+        val metaRepository = mock<MetaRepository> {
             onBlocking { get() } doReturn null
         }
         val metaService = MetaServiceImpl(metaRepository, TestTransaction)
@@ -39,7 +39,7 @@ class MetaServiceImplTest {
     @Test
     fun `updateMeta メタデータを保存できる`() = runTest {
         val meta = Meta("1.0.1", Jwt(UUID.randomUUID(), "sdfsdjk", "adafda"))
-        val metaRepository = mock<IMetaRepository> {
+        val metaRepository = mock<MetaRepository> {
             onBlocking { save(any()) } doReturn Unit
         }
         val metaServiceImpl = MetaServiceImpl(metaRepository, TestTransaction)
@@ -53,7 +53,7 @@ class MetaServiceImplTest {
     @Test
     fun `getJwtMeta Jwtメタデータを取得できる`() = runTest {
         val meta = Meta("1.0.0", Jwt(UUID.randomUUID(), "sdfsdjk", "adafda"))
-        val metaRepository = mock<IMetaRepository> {
+        val metaRepository = mock<MetaRepository> {
             onBlocking { get() } doReturn meta
         }
         val metaService = MetaServiceImpl(metaRepository, TestTransaction)
@@ -63,7 +63,7 @@ class MetaServiceImplTest {
 
     @Test
     fun `getJwtMeta メタデータが無いときはNotInitExceptionがthrowされる`() = runTest {
-        val metaRepository = mock<IMetaRepository> {
+        val metaRepository = mock<MetaRepository> {
             onBlocking { get() } doReturn null
         }
         val metaService = MetaServiceImpl(metaRepository, TestTransaction)
diff --git a/src/test/kotlin/dev/usbharu/hideout/service/core/ServerInitialiseServiceImplTest.kt b/src/test/kotlin/dev/usbharu/hideout/service/core/ServerInitialiseServiceImplTest.kt
index c854754f..e7f87517 100644
--- a/src/test/kotlin/dev/usbharu/hideout/service/core/ServerInitialiseServiceImplTest.kt
+++ b/src/test/kotlin/dev/usbharu/hideout/service/core/ServerInitialiseServiceImplTest.kt
@@ -4,7 +4,7 @@ package dev.usbharu.hideout.service.core
 
 import dev.usbharu.hideout.domain.model.hideout.entity.Jwt
 import dev.usbharu.hideout.domain.model.hideout.entity.Meta
-import dev.usbharu.hideout.repository.IMetaRepository
+import dev.usbharu.hideout.repository.MetaRepository
 import dev.usbharu.hideout.util.ServerUtil
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.test.runTest
@@ -17,7 +17,7 @@ import kotlin.test.assertEquals
 class ServerInitialiseServiceImplTest {
     @Test
     fun `init メタデータが無いときに初期化を実行する`() = runTest {
-        val metaRepository = mock<IMetaRepository> {
+        val metaRepository = mock<MetaRepository> {
             onBlocking { get() } doReturn null
             onBlocking { save(any()) } doReturn Unit
         }
@@ -30,7 +30,7 @@ class ServerInitialiseServiceImplTest {
     @Test
     fun `init メタデータが存在して同じバージョンのときは何もしない`() = runTest {
         val meta = Meta(ServerUtil.getImplementationVersion(), Jwt(UUID.randomUUID(), "aaafafd", "afafasdf"))
-        val metaRepository = mock<IMetaRepository> {
+        val metaRepository = mock<MetaRepository> {
             onBlocking { get() } doReturn meta
         }
         val serverInitialiseServiceImpl = ServerInitialiseServiceImpl(metaRepository, TestTransaction)
@@ -41,7 +41,7 @@ class ServerInitialiseServiceImplTest {
     @Test
     fun `init メタデータが存在して違うバージョンのときはバージョンを変更する`() = runTest {
         val meta = Meta("1.0.0", Jwt(UUID.randomUUID(), "aaafafd", "afafasdf"))
-        val metaRepository = mock<IMetaRepository> {
+        val metaRepository = mock<MetaRepository> {
             onBlocking { get() } doReturn meta
             onBlocking { save(any()) } doReturn Unit
         }
diff --git a/src/test/kotlin/dev/usbharu/hideout/service/user/UserServiceTest.kt b/src/test/kotlin/dev/usbharu/hideout/service/user/UserServiceTest.kt
index 4aed672e..e32ca6f1 100644
--- a/src/test/kotlin/dev/usbharu/hideout/service/user/UserServiceTest.kt
+++ b/src/test/kotlin/dev/usbharu/hideout/service/user/UserServiceTest.kt
@@ -6,7 +6,7 @@ import dev.usbharu.hideout.config.Config
 import dev.usbharu.hideout.config.ConfigData
 import dev.usbharu.hideout.domain.model.hideout.dto.RemoteUserCreateDto
 import dev.usbharu.hideout.domain.model.hideout.dto.UserCreateDto
-import dev.usbharu.hideout.repository.IUserRepository
+import dev.usbharu.hideout.repository.UserRepository
 import kotlinx.coroutines.ExperimentalCoroutinesApi
 import kotlinx.coroutines.test.runTest
 import org.junit.jupiter.api.Test
@@ -20,15 +20,15 @@ class UserServiceTest {
     @Test
     fun `createLocalUser ローカルユーザーを作成できる`() = runTest {
         Config.configData = ConfigData(domain = "example.com", url = "https://example.com")
-        val userRepository = mock<IUserRepository> {
+        val userRepository = mock<UserRepository> {
             onBlocking { nextId() } doReturn 110001L
         }
         val generateKeyPair = KeyPairGenerator.getInstance("RSA").generateKeyPair()
-        val userAuthService = mock<IUserAuthService> {
+        val userAuthService = mock<UserAuthService> {
             onBlocking { hash(anyString()) } doReturn "hashedPassword"
             onBlocking { generateKeyPair() } doReturn generateKeyPair
         }
-        val userService = UserService(userRepository, userAuthService, mock(), mock(), mock())
+        val userService = UserServiceImpl(userRepository, userAuthService, mock(), mock(), mock())
         userService.createLocalUser(UserCreateDto("test", "testUser", "XXXXXXXXXXXXX", "test"))
         verify(userRepository, times(1)).save(any())
         argumentCaptor<dev.usbharu.hideout.domain.model.hideout.entity.User> {
@@ -51,10 +51,10 @@ class UserServiceTest {
     fun `createRemoteUser リモートユーザーを作成できる`() = runTest {
         Config.configData = ConfigData(domain = "example.com", url = "https://example.com")
 
-        val userRepository = mock<IUserRepository> {
+        val userRepository = mock<UserRepository> {
             onBlocking { nextId() } doReturn 113345L
         }
-        val userService = UserService(userRepository, mock(), mock(), mock(), mock())
+        val userService = UserServiceImpl(userRepository, mock(), mock(), mock(), mock())
         val user = RemoteUserCreateDto(
             "test",
             "example.com",