diff --git a/src/queue/processors/http/process-inbox.ts b/src/queue/processors/http/process-inbox.ts
index a2fdaa3ad..3cc13cbda 100644
--- a/src/queue/processors/http/process-inbox.ts
+++ b/src/queue/processors/http/process-inbox.ts
@@ -6,7 +6,7 @@ import perform from '../../../remote/activitypub/perform';
 import { resolvePerson, updatePerson } from '../../../remote/activitypub/models/person';
 import { toUnicode } from 'punycode';
 import { URL } from 'url';
-import { publishApLogStream } from '../../../stream';
+import { publishApLogStream } from '../../../services/stream';
 import Logger from '../../../misc/logger';
 
 const logger = new Logger('inbox');
diff --git a/src/remote/activitypub/request.ts b/src/remote/activitypub/request.ts
index 519c8026b..e820d0c94 100644
--- a/src/remote/activitypub/request.ts
+++ b/src/remote/activitypub/request.ts
@@ -7,7 +7,7 @@ import * as promiseAny from 'promise-any';
 
 import config from '../../config';
 import { ILocalUser } from '../../models/user';
-import { publishApLogStream } from '../../stream';
+import { publishApLogStream } from '../../services/stream';
 import { apLogger } from './logger';
 
 export const logger = apLogger.createSubLogger('deliver');
diff --git a/src/server/api/common/read-messaging-message.ts b/src/server/api/common/read-messaging-message.ts
index 63080d22a..9f1e7e6ab 100644
--- a/src/server/api/common/read-messaging-message.ts
+++ b/src/server/api/common/read-messaging-message.ts
@@ -2,9 +2,9 @@ import * as mongo from 'mongodb';
 import isObjectId from '../../../misc/is-objectid';
 import Message from '../../../models/messaging-message';
 import { IMessagingMessage as IMessage } from '../../../models/messaging-message';
-import { publishMainStream } from '../../../stream';
-import { publishMessagingStream } from '../../../stream';
-import { publishMessagingIndexStream } from '../../../stream';
+import { publishMainStream } from '../../../services/stream';
+import { publishMessagingStream } from '../../../services/stream';
+import { publishMessagingIndexStream } from '../../../services/stream';
 import User from '../../../models/user';
 
 /**
diff --git a/src/server/api/common/read-notification.ts b/src/server/api/common/read-notification.ts
index 27d3f1be3..436130511 100644
--- a/src/server/api/common/read-notification.ts
+++ b/src/server/api/common/read-notification.ts
@@ -1,7 +1,7 @@
 import * as mongo from 'mongodb';
 import isObjectId from '../../../misc/is-objectid';
 import { default as Notification, INotification } from '../../../models/notification';
-import { publishMainStream } from '../../../stream';
+import { publishMainStream } from '../../../services/stream';
 import Mute from '../../../models/mute';
 import User from '../../../models/user';
 
diff --git a/src/server/api/endpoints/drive/files/delete.ts b/src/server/api/endpoints/drive/files/delete.ts
index 214d211d8..c322587d8 100644
--- a/src/server/api/endpoints/drive/files/delete.ts
+++ b/src/server/api/endpoints/drive/files/delete.ts
@@ -2,7 +2,7 @@ import $ from 'cafy';
 import ID, { transform } from '../../../../../misc/cafy-id';
 import DriveFile from '../../../../../models/drive-file';
 import del from '../../../../../services/drive/delete-file';
-import { publishDriveStream } from '../../../../../stream';
+import { publishDriveStream } from '../../../../../services/stream';
 import define from '../../../define';
 
 export const meta = {
diff --git a/src/server/api/endpoints/drive/files/update.ts b/src/server/api/endpoints/drive/files/update.ts
index 52d20af64..4db493c1d 100644
--- a/src/server/api/endpoints/drive/files/update.ts
+++ b/src/server/api/endpoints/drive/files/update.ts
@@ -2,7 +2,7 @@ import $ from 'cafy';
 import ID, { transform } from '../../../../../misc/cafy-id';
 import DriveFolder from '../../../../../models/drive-folder';
 import DriveFile, { validateFileName, pack } from '../../../../../models/drive-file';
-import { publishDriveStream } from '../../../../../stream';
+import { publishDriveStream } from '../../../../../services/stream';
 import define from '../../../define';
 import Note from '../../../../../models/note';
 
diff --git a/src/server/api/endpoints/drive/folders/create.ts b/src/server/api/endpoints/drive/folders/create.ts
index b7a7e6c88..1aca521a7 100644
--- a/src/server/api/endpoints/drive/folders/create.ts
+++ b/src/server/api/endpoints/drive/folders/create.ts
@@ -1,7 +1,7 @@
 import $ from 'cafy';
 import ID, { transform } from '../../../../../misc/cafy-id';
 import DriveFolder, { isValidFolderName, pack } from '../../../../../models/drive-folder';
-import { publishDriveStream } from '../../../../../stream';
+import { publishDriveStream } from '../../../../../services/stream';
 import define from '../../../define';
 
 export const meta = {
diff --git a/src/server/api/endpoints/drive/folders/delete.ts b/src/server/api/endpoints/drive/folders/delete.ts
index 5259fe784..228e262cc 100644
--- a/src/server/api/endpoints/drive/folders/delete.ts
+++ b/src/server/api/endpoints/drive/folders/delete.ts
@@ -2,7 +2,7 @@ import $ from 'cafy';
 import ID, { transform } from '../../../../../misc/cafy-id';
 import DriveFolder from '../../../../../models/drive-folder';
 import define from '../../../define';
-import { publishDriveStream } from '../../../../../stream';
+import { publishDriveStream } from '../../../../../services/stream';
 import DriveFile from '../../../../../models/drive-file';
 
 export const meta = {
diff --git a/src/server/api/endpoints/drive/folders/update.ts b/src/server/api/endpoints/drive/folders/update.ts
index af4f2fcf6..320759436 100644
--- a/src/server/api/endpoints/drive/folders/update.ts
+++ b/src/server/api/endpoints/drive/folders/update.ts
@@ -1,7 +1,7 @@
 import $ from 'cafy';
 import ID, { transform } from '../../../../../misc/cafy-id';
 import DriveFolder, { isValidFolderName, pack } from '../../../../../models/drive-folder';
-import { publishDriveStream } from '../../../../../stream';
+import { publishDriveStream } from '../../../../../services/stream';
 import define from '../../../define';
 
 export const meta = {
diff --git a/src/server/api/endpoints/games/reversi/games/surrender.ts b/src/server/api/endpoints/games/reversi/games/surrender.ts
index 7a8d45b31..a19743fee 100644
--- a/src/server/api/endpoints/games/reversi/games/surrender.ts
+++ b/src/server/api/endpoints/games/reversi/games/surrender.ts
@@ -1,7 +1,7 @@
 import $ from 'cafy';
 import ID, { transform } from '../../../../../../misc/cafy-id';
 import ReversiGame, { pack } from '../../../../../../models/games/reversi/game';
-import { publishReversiGameStream } from '../../../../../../stream';
+import { publishReversiGameStream } from '../../../../../../services/stream';
 import define from '../../../../define';
 
 export const meta = {
diff --git a/src/server/api/endpoints/games/reversi/match.ts b/src/server/api/endpoints/games/reversi/match.ts
index 67e6dde3d..febf81506 100644
--- a/src/server/api/endpoints/games/reversi/match.ts
+++ b/src/server/api/endpoints/games/reversi/match.ts
@@ -3,7 +3,7 @@ import ID, { transform } from '../../../../../misc/cafy-id';
 import Matching, { pack as packMatching } from '../../../../../models/games/reversi/matching';
 import ReversiGame, { pack as packGame } from '../../../../../models/games/reversi/game';
 import User from '../../../../../models/user';
-import { publishMainStream, publishReversiStream } from '../../../../../stream';
+import { publishMainStream, publishReversiStream } from '../../../../../services/stream';
 import { eighteight } from '../../../../../games/reversi/maps';
 import define from '../../../define';
 
diff --git a/src/server/api/endpoints/i/read_all_messaging_messages.ts b/src/server/api/endpoints/i/read_all_messaging_messages.ts
index a1fe82c4c..739acf93c 100644
--- a/src/server/api/endpoints/i/read_all_messaging_messages.ts
+++ b/src/server/api/endpoints/i/read_all_messaging_messages.ts
@@ -1,5 +1,5 @@
 import User from '../../../../models/user';
-import { publishMainStream } from '../../../../stream';
+import { publishMainStream } from '../../../../services/stream';
 import Message from '../../../../models/messaging-message';
 import define from '../../define';
 
diff --git a/src/server/api/endpoints/i/read_all_unread_notes.ts b/src/server/api/endpoints/i/read_all_unread_notes.ts
index 7d63de4e1..509450e43 100644
--- a/src/server/api/endpoints/i/read_all_unread_notes.ts
+++ b/src/server/api/endpoints/i/read_all_unread_notes.ts
@@ -1,5 +1,5 @@
 import User from '../../../../models/user';
-import { publishMainStream } from '../../../../stream';
+import { publishMainStream } from '../../../../services/stream';
 import NoteUnread from '../../../../models/note-unread';
 import define from '../../define';
 
diff --git a/src/server/api/endpoints/i/regenerate_token.ts b/src/server/api/endpoints/i/regenerate_token.ts
index 5dfc3cd66..16c298318 100644
--- a/src/server/api/endpoints/i/regenerate_token.ts
+++ b/src/server/api/endpoints/i/regenerate_token.ts
@@ -1,7 +1,7 @@
 import $ from 'cafy';
 import * as bcrypt from 'bcryptjs';
 import User from '../../../../models/user';
-import { publishMainStream } from '../../../../stream';
+import { publishMainStream } from '../../../../services/stream';
 import generateUserToken from '../../common/generate-native-user-token';
 import define from '../../define';
 
diff --git a/src/server/api/endpoints/i/update.ts b/src/server/api/endpoints/i/update.ts
index 88e184b18..0ad7e0f33 100644
--- a/src/server/api/endpoints/i/update.ts
+++ b/src/server/api/endpoints/i/update.ts
@@ -1,7 +1,7 @@
 import $ from 'cafy';
 import ID, { transform } from '../../../../misc/cafy-id';
 import User, { isValidName, isValidDescription, isValidLocation, isValidBirthday, pack } from '../../../../models/user';
-import { publishMainStream } from '../../../../stream';
+import { publishMainStream } from '../../../../services/stream';
 import DriveFile from '../../../../models/drive-file';
 import acceptAllFollowRequests from '../../../../services/following/requests/accept-all';
 import { publishToFollowers } from '../../../../services/i/update';
diff --git a/src/server/api/endpoints/i/update_client_setting.ts b/src/server/api/endpoints/i/update_client_setting.ts
index 66435ec9b..2b2f3d3c7 100644
--- a/src/server/api/endpoints/i/update_client_setting.ts
+++ b/src/server/api/endpoints/i/update_client_setting.ts
@@ -1,6 +1,6 @@
 import $ from 'cafy';
 import User from '../../../../models/user';
-import { publishMainStream } from '../../../../stream';
+import { publishMainStream } from '../../../../services/stream';
 import define from '../../define';
 
 export const meta = {
diff --git a/src/server/api/endpoints/i/update_email.ts b/src/server/api/endpoints/i/update_email.ts
index eeac46079..c3aafc8d8 100644
--- a/src/server/api/endpoints/i/update_email.ts
+++ b/src/server/api/endpoints/i/update_email.ts
@@ -1,6 +1,6 @@
 import $ from 'cafy';
 import User, { pack } from '../../../../models/user';
-import { publishMainStream } from '../../../../stream';
+import { publishMainStream } from '../../../../services/stream';
 import define from '../../define';
 import * as nodemailer from 'nodemailer';
 import fetchMeta from '../../../../misc/fetch-meta';
diff --git a/src/server/api/endpoints/i/update_home.ts b/src/server/api/endpoints/i/update_home.ts
index f472600ee..805c52d72 100644
--- a/src/server/api/endpoints/i/update_home.ts
+++ b/src/server/api/endpoints/i/update_home.ts
@@ -1,6 +1,6 @@
 import $ from 'cafy';
 import User from '../../../../models/user';
-import { publishMainStream } from '../../../../stream';
+import { publishMainStream } from '../../../../services/stream';
 import define from '../../define';
 
 export const meta = {
diff --git a/src/server/api/endpoints/i/update_mobile_home.ts b/src/server/api/endpoints/i/update_mobile_home.ts
index 792c4b787..0e1c3313e 100644
--- a/src/server/api/endpoints/i/update_mobile_home.ts
+++ b/src/server/api/endpoints/i/update_mobile_home.ts
@@ -1,6 +1,6 @@
 import $ from 'cafy';
 import User from '../../../../models/user';
-import { publishMainStream } from '../../../../stream';
+import { publishMainStream } from '../../../../services/stream';
 import define from '../../define';
 
 export const meta = {
diff --git a/src/server/api/endpoints/i/update_widget.ts b/src/server/api/endpoints/i/update_widget.ts
index da96ec6fc..e3e91c1f0 100644
--- a/src/server/api/endpoints/i/update_widget.ts
+++ b/src/server/api/endpoints/i/update_widget.ts
@@ -1,6 +1,6 @@
 import $ from 'cafy';
 import User from '../../../../models/user';
-import { publishMainStream } from '../../../../stream';
+import { publishMainStream } from '../../../../services/stream';
 import define from '../../define';
 
 export const meta = {
diff --git a/src/server/api/endpoints/messaging/messages/create.ts b/src/server/api/endpoints/messaging/messages/create.ts
index bcb3c7309..8300f69e5 100644
--- a/src/server/api/endpoints/messaging/messages/create.ts
+++ b/src/server/api/endpoints/messaging/messages/create.ts
@@ -6,9 +6,9 @@ import User from '../../../../../models/user';
 import Mute from '../../../../../models/mute';
 import DriveFile from '../../../../../models/drive-file';
 import { pack } from '../../../../../models/messaging-message';
-import { publishMainStream } from '../../../../../stream';
-import { publishMessagingStream, publishMessagingIndexStream } from '../../../../../stream';
-import pushSw from '../../../../../push-sw';
+import { publishMainStream } from '../../../../../services/stream';
+import { publishMessagingStream, publishMessagingIndexStream } from '../../../../../services/stream';
+import pushSw from '../../../../../services/push-notification';
 import define from '../../../define';
 
 export const meta = {
diff --git a/src/server/api/endpoints/messaging/messages/delete.ts b/src/server/api/endpoints/messaging/messages/delete.ts
index 103b680da..4f3fabb4c 100644
--- a/src/server/api/endpoints/messaging/messages/delete.ts
+++ b/src/server/api/endpoints/messaging/messages/delete.ts
@@ -2,7 +2,7 @@ import $ from 'cafy';
 import ID, { transform } from '../../../../../misc/cafy-id';
 import Message from '../../../../../models/messaging-message';
 import define from '../../../define';
-import { publishMessagingStream } from '../../../../../stream';
+import { publishMessagingStream } from '../../../../../services/stream';
 import * as ms from 'ms';
 
 export const meta = {
diff --git a/src/server/api/endpoints/notes/polls/vote.ts b/src/server/api/endpoints/notes/polls/vote.ts
index 574193243..68c3898e0 100644
--- a/src/server/api/endpoints/notes/polls/vote.ts
+++ b/src/server/api/endpoints/notes/polls/vote.ts
@@ -4,8 +4,8 @@ import Vote from '../../../../../models/poll-vote';
 import Note from '../../../../../models/note';
 import Watching from '../../../../../models/note-watching';
 import watch from '../../../../../services/note/watch';
-import { publishNoteStream } from '../../../../../stream';
-import notify from '../../../../../notify';
+import { publishNoteStream } from '../../../../../services/stream';
+import notify from '../../../../../services/create-notification';
 import define from '../../../define';
 import createNote from '../../../../../services/note/create';
 import User from '../../../../../models/user';
diff --git a/src/server/api/endpoints/notifications/mark_all_as_read.ts b/src/server/api/endpoints/notifications/mark_all_as_read.ts
index 1b5208d44..de5a12707 100644
--- a/src/server/api/endpoints/notifications/mark_all_as_read.ts
+++ b/src/server/api/endpoints/notifications/mark_all_as_read.ts
@@ -1,5 +1,5 @@
 import Notification from '../../../../models/notification';
-import { publishMainStream } from '../../../../stream';
+import { publishMainStream } from '../../../../services/stream';
 import User from '../../../../models/user';
 import define from '../../define';
 
diff --git a/src/server/api/endpoints/users/lists/pull.ts b/src/server/api/endpoints/users/lists/pull.ts
index ed44977a7..86eaa1dd8 100644
--- a/src/server/api/endpoints/users/lists/pull.ts
+++ b/src/server/api/endpoints/users/lists/pull.ts
@@ -2,7 +2,7 @@ import $ from 'cafy';
 import ID, { transform } from '../../../../../misc/cafy-id';
 import UserList from '../../../../../models/user-list';
 import User, { pack as packUser } from '../../../../../models/user';
-import { publishUserListStream } from '../../../../../stream';
+import { publishUserListStream } from '../../../../../services/stream';
 import define from '../../../define';
 
 export const meta = {
diff --git a/src/server/api/endpoints/users/lists/push.ts b/src/server/api/endpoints/users/lists/push.ts
index 8be498ec2..6e2dbed51 100644
--- a/src/server/api/endpoints/users/lists/push.ts
+++ b/src/server/api/endpoints/users/lists/push.ts
@@ -2,7 +2,7 @@ import $ from 'cafy';
 import ID, { transform } from '../../../../../misc/cafy-id';
 import UserList from '../../../../../models/user-list';
 import User, { pack as packUser, isRemoteUser, fetchProxyAccount } from '../../../../../models/user';
-import { publishUserListStream } from '../../../../../stream';
+import { publishUserListStream } from '../../../../../services/stream';
 import { renderActivity } from '../../../../../remote/activitypub/renderer';
 import renderFollow from '../../../../../remote/activitypub/renderer/follow';
 import { deliver } from '../../../../../queue';
diff --git a/src/server/api/endpoints/users/report-abuse.ts b/src/server/api/endpoints/users/report-abuse.ts
index d63f3e55a..c592e5cfd 100644
--- a/src/server/api/endpoints/users/report-abuse.ts
+++ b/src/server/api/endpoints/users/report-abuse.ts
@@ -3,7 +3,7 @@ import ID, { transform } from '../../../../misc/cafy-id';
 import define from '../../define';
 import User from '../../../../models/user';
 import AbuseUserReport from '../../../../models/abuse-user-report';
-import { publishAdminStream } from '../../../../stream';
+import { publishAdminStream } from '../../../../services/stream';
 
 export const meta = {
 	desc: {
diff --git a/src/server/api/private/signin.ts b/src/server/api/private/signin.ts
index 629252784..40bcd2c5d 100644
--- a/src/server/api/private/signin.ts
+++ b/src/server/api/private/signin.ts
@@ -3,7 +3,7 @@ import * as bcrypt from 'bcryptjs';
 import * as speakeasy from 'speakeasy';
 import User, { ILocalUser } from '../../../models/user';
 import Signin, { pack } from '../../../models/signin';
-import { publishMainStream } from '../../../stream';
+import { publishMainStream } from '../../../services/stream';
 import signin from '../common/signin';
 import config from '../../../config';
 
diff --git a/src/server/api/service/discord.ts b/src/server/api/service/discord.ts
index 30f077d22..af0c43b48 100644
--- a/src/server/api/service/discord.ts
+++ b/src/server/api/service/discord.ts
@@ -4,7 +4,7 @@ import * as request from 'request';
 import { OAuth2 } from 'oauth';
 import User, { pack, ILocalUser } from '../../../models/user';
 import config from '../../../config';
-import { publishMainStream } from '../../../stream';
+import { publishMainStream } from '../../../services/stream';
 import redis from '../../../db/redis';
 import * as uuid from 'uuid';
 import signin from '../common/signin';
diff --git a/src/server/api/service/github.ts b/src/server/api/service/github.ts
index c8ce494a9..d6d5d1ecc 100644
--- a/src/server/api/service/github.ts
+++ b/src/server/api/service/github.ts
@@ -4,7 +4,7 @@ import * as request from 'request';
 import { OAuth2 } from 'oauth';
 import User, { pack, ILocalUser } from '../../../models/user';
 import config from '../../../config';
-import { publishMainStream } from '../../../stream';
+import { publishMainStream } from '../../../services/stream';
 import redis from '../../../db/redis';
 import * as uuid from 'uuid';
 import signin from '../common/signin';
diff --git a/src/server/api/service/twitter.ts b/src/server/api/service/twitter.ts
index f7f023d82..fc23808e2 100644
--- a/src/server/api/service/twitter.ts
+++ b/src/server/api/service/twitter.ts
@@ -4,7 +4,7 @@ import * as uuid from 'uuid';
 import autwh from 'autwh';
 import redis from '../../../db/redis';
 import User, { pack, ILocalUser } from '../../../models/user';
-import { publishMainStream } from '../../../stream';
+import { publishMainStream } from '../../../services/stream';
 import config from '../../../config';
 import signin from '../common/signin';
 import fetchMeta from '../../../misc/fetch-meta';
diff --git a/src/server/api/stream/channels/games/reversi-game.ts b/src/server/api/stream/channels/games/reversi-game.ts
index 1cb077c8c..87df9e194 100644
--- a/src/server/api/stream/channels/games/reversi-game.ts
+++ b/src/server/api/stream/channels/games/reversi-game.ts
@@ -2,7 +2,7 @@ import autobind from 'autobind-decorator';
 import * as CRC32 from 'crc-32';
 import * as mongo from 'mongodb';
 import ReversiGame, { pack } from '../../../../../models/games/reversi/game';
-import { publishReversiGameStream } from '../../../../../stream';
+import { publishReversiGameStream } from '../../../../../services/stream';
 import Reversi from '../../../../../games/reversi/core';
 import * as maps from '../../../../../games/reversi/maps';
 import Channel from '../../channel';
diff --git a/src/server/api/stream/channels/games/reversi.ts b/src/server/api/stream/channels/games/reversi.ts
index b40709617..1b1ad187a 100644
--- a/src/server/api/stream/channels/games/reversi.ts
+++ b/src/server/api/stream/channels/games/reversi.ts
@@ -1,7 +1,7 @@
 import autobind from 'autobind-decorator';
 import * as mongo from 'mongodb';
 import Matching, { pack } from '../../../../../models/games/reversi/matching';
-import { publishMainStream } from '../../../../../stream';
+import { publishMainStream } from '../../../../../services/stream';
 import Channel from '../../channel';
 
 export default class extends Channel {
diff --git a/src/services/blocking/create.ts b/src/services/blocking/create.ts
index f82eeae2b..2b46d6b94 100644
--- a/src/services/blocking/create.ts
+++ b/src/services/blocking/create.ts
@@ -1,7 +1,7 @@
 import User, { isLocalUser, isRemoteUser, pack as packUser, IUser } from '../../models/user';
 import Following from '../../models/following';
 import FollowRequest from '../../models/follow-request';
-import { publishMainStream } from '../../stream';
+import { publishMainStream } from '../stream';
 import { renderActivity } from '../../remote/activitypub/renderer';
 import renderFollow from '../../remote/activitypub/renderer/follow';
 import renderUndo from '../../remote/activitypub/renderer/undo';
diff --git a/src/notify.ts b/src/services/create-notification.ts
similarity index 87%
rename from src/notify.ts
rename to src/services/create-notification.ts
index 522f4c52d..3e000ef2e 100644
--- a/src/notify.ts
+++ b/src/services/create-notification.ts
@@ -1,10 +1,10 @@
 import * as mongo from 'mongodb';
-import Notification from './models/notification';
-import Mute from './models/mute';
-import { pack } from './models/notification';
+import Notification from '../models/notification';
+import Mute from '../models/mute';
+import { pack } from '../models/notification';
 import { publishMainStream } from './stream';
-import User from './models/user';
-import pushSw from './push-sw';
+import User from '../models/user';
+import pushSw from './push-notification';
 
 export default (
 	notifiee: mongo.ObjectID,
diff --git a/src/services/drive/add-file.ts b/src/services/drive/add-file.ts
index 2b3b923b9..31902b242 100644
--- a/src/services/drive/add-file.ts
+++ b/src/services/drive/add-file.ts
@@ -12,7 +12,7 @@ import * as isSvg from 'is-svg';
 import DriveFile, { IMetadata, getDriveFileBucket, IDriveFile } from '../../models/drive-file';
 import DriveFolder from '../../models/drive-folder';
 import { pack } from '../../models/drive-file';
-import { publishMainStream, publishDriveStream } from '../../stream';
+import { publishMainStream, publishDriveStream } from '../stream';
 import { isLocalUser, IUser, IRemoteUser } from '../../models/user';
 import delFile from './delete-file';
 import config from '../../config';
diff --git a/src/services/following/create.ts b/src/services/following/create.ts
index 9c0984b6d..936655d7d 100644
--- a/src/services/following/create.ts
+++ b/src/services/following/create.ts
@@ -1,8 +1,8 @@
 import User, { isLocalUser, isRemoteUser, pack as packUser, IUser } from '../../models/user';
 import Following from '../../models/following';
 import Blocking from '../../models/blocking';
-import { publishMainStream } from '../../stream';
-import notify from '../../notify';
+import { publishMainStream } from '../stream';
+import notify from '../../services/create-notification';
 import { renderActivity } from '../../remote/activitypub/renderer';
 import renderFollow from '../../remote/activitypub/renderer/follow';
 import renderAccept from '../../remote/activitypub/renderer/accept';
diff --git a/src/services/following/delete.ts b/src/services/following/delete.ts
index 1c5e8272f..d56edd3cc 100644
--- a/src/services/following/delete.ts
+++ b/src/services/following/delete.ts
@@ -1,6 +1,6 @@
 import User, { isLocalUser, isRemoteUser, pack as packUser, IUser } from '../../models/user';
 import Following from '../../models/following';
-import { publishMainStream } from '../../stream';
+import { publishMainStream } from '../stream';
 import { renderActivity } from '../../remote/activitypub/renderer';
 import renderFollow from '../../remote/activitypub/renderer/follow';
 import renderUndo from '../../remote/activitypub/renderer/undo';
diff --git a/src/services/following/requests/accept.ts b/src/services/following/requests/accept.ts
index 76bb67afa..8c42b5a78 100644
--- a/src/services/following/requests/accept.ts
+++ b/src/services/following/requests/accept.ts
@@ -5,7 +5,7 @@ import renderFollow from '../../../remote/activitypub/renderer/follow';
 import renderAccept from '../../../remote/activitypub/renderer/accept';
 import { deliver } from '../../../queue';
 import Following from '../../../models/following';
-import { publishMainStream } from '../../../stream';
+import { publishMainStream } from '../../stream';
 import perUserFollowingChart from '../../../chart/per-user-following';
 import Logger from '../../../misc/logger';
 
diff --git a/src/services/following/requests/cancel.ts b/src/services/following/requests/cancel.ts
index 731e25f9c..375c14d5e 100644
--- a/src/services/following/requests/cancel.ts
+++ b/src/services/following/requests/cancel.ts
@@ -4,7 +4,7 @@ import { renderActivity } from '../../../remote/activitypub/renderer';
 import renderFollow from '../../../remote/activitypub/renderer/follow';
 import renderUndo from '../../../remote/activitypub/renderer/undo';
 import { deliver } from '../../../queue';
-import { publishMainStream } from '../../../stream';
+import { publishMainStream } from '../../stream';
 
 export default async function(followee: IUser, follower: IUser) {
 	if (isRemoteUser(followee)) {
diff --git a/src/services/following/requests/create.ts b/src/services/following/requests/create.ts
index 6507cadb7..10c534f52 100644
--- a/src/services/following/requests/create.ts
+++ b/src/services/following/requests/create.ts
@@ -1,6 +1,6 @@
 import User, { isLocalUser, isRemoteUser, pack as packUser, IUser } from '../../../models/user';
-import { publishMainStream } from '../../../stream';
-import notify from '../../../notify';
+import { publishMainStream } from '../../stream';
+import notify from '../../../services/create-notification';
 import { renderActivity } from '../../../remote/activitypub/renderer';
 import renderFollow from '../../../remote/activitypub/renderer/follow';
 import { deliver } from '../../../queue';
diff --git a/src/services/following/requests/reject.ts b/src/services/following/requests/reject.ts
index 0f121a18f..cb924df81 100644
--- a/src/services/following/requests/reject.ts
+++ b/src/services/following/requests/reject.ts
@@ -4,7 +4,7 @@ import { renderActivity } from '../../../remote/activitypub/renderer';
 import renderFollow from '../../../remote/activitypub/renderer/follow';
 import renderReject from '../../../remote/activitypub/renderer/reject';
 import { deliver } from '../../../queue';
-import { publishMainStream } from '../../../stream';
+import { publishMainStream } from '../../stream';
 
 export default async function(followee: IUser, follower: IUser) {
 	if (isRemoteUser(follower)) {
diff --git a/src/services/note/create.ts b/src/services/note/create.ts
index 7b6120b1e..9ccf3be9e 100644
--- a/src/services/note/create.ts
+++ b/src/services/note/create.ts
@@ -1,7 +1,7 @@
 import es from '../../db/elasticsearch';
 import Note, { pack, INote, IChoice } from '../../models/note';
 import User, { isLocalUser, IUser, isRemoteUser, IRemoteUser, ILocalUser } from '../../models/user';
-import { publishMainStream, publishHomeTimelineStream, publishLocalTimelineStream, publishHybridTimelineStream, publishGlobalTimelineStream, publishUserListStream, publishHashtagStream } from '../../stream';
+import { publishMainStream, publishHomeTimelineStream, publishLocalTimelineStream, publishHybridTimelineStream, publishGlobalTimelineStream, publishUserListStream, publishHashtagStream } from '../stream';
 import Following from '../../models/following';
 import { deliver } from '../../queue';
 import renderNote from '../../remote/activitypub/renderer/note';
@@ -9,7 +9,7 @@ import renderCreate from '../../remote/activitypub/renderer/create';
 import renderAnnounce from '../../remote/activitypub/renderer/announce';
 import { renderActivity } from '../../remote/activitypub/renderer';
 import DriveFile, { IDriveFile } from '../../models/drive-file';
-import notify from '../../notify';
+import notify from '../../services/create-notification';
 import NoteWatching from '../../models/note-watching';
 import watch from './watch';
 import Mute from '../../models/mute';
diff --git a/src/services/note/delete.ts b/src/services/note/delete.ts
index aaaa79afd..557872d75 100644
--- a/src/services/note/delete.ts
+++ b/src/services/note/delete.ts
@@ -1,6 +1,6 @@
 import Note, { INote } from '../../models/note';
 import { IUser, isLocalUser } from '../../models/user';
-import { publishNoteStream } from '../../stream';
+import { publishNoteStream } from '../stream';
 import renderDelete from '../../remote/activitypub/renderer/delete';
 import { renderActivity } from '../../remote/activitypub/renderer';
 import { deliver } from '../../queue';
diff --git a/src/services/note/polls/vote.ts b/src/services/note/polls/vote.ts
index dafd59331..115b071b4 100644
--- a/src/services/note/polls/vote.ts
+++ b/src/services/note/polls/vote.ts
@@ -2,8 +2,8 @@ import Vote from '../../../models/poll-vote';
 import Note, { INote } from '../../../models/note';
 import Watching from '../../../models/note-watching';
 import watch from '../../../services/note/watch';
-import { publishNoteStream } from '../../../stream';
-import notify from '../../../notify';
+import { publishNoteStream } from '../../stream';
+import notify from '../../../services/create-notification';
 import { isLocalUser, IUser } from '../../../models/user';
 
 export default (user: IUser, note: INote, choice: number) => new Promise(async (res, rej) => {
diff --git a/src/services/note/reaction/create.ts b/src/services/note/reaction/create.ts
index 96d1dd8e5..e6a9fe7d6 100644
--- a/src/services/note/reaction/create.ts
+++ b/src/services/note/reaction/create.ts
@@ -1,8 +1,8 @@
 import { IUser, isLocalUser, isRemoteUser } from '../../../models/user';
 import Note, { INote } from '../../../models/note';
 import NoteReaction from '../../../models/note-reaction';
-import { publishNoteStream } from '../../../stream';
-import notify from '../../../notify';
+import { publishNoteStream } from '../../stream';
+import notify from '../../create-notification';
 import NoteWatching from '../../../models/note-watching';
 import watch from '../watch';
 import renderLike from '../../../remote/activitypub/renderer/like';
diff --git a/src/services/note/reaction/delete.ts b/src/services/note/reaction/delete.ts
index 868973043..ee3a9e13d 100644
--- a/src/services/note/reaction/delete.ts
+++ b/src/services/note/reaction/delete.ts
@@ -1,7 +1,7 @@
 import { IUser, isLocalUser, isRemoteUser } from '../../../models/user';
 import Note, { INote } from '../../../models/note';
 import Reaction from '../../../models/note-reaction';
-import { publishNoteStream } from '../../../stream';
+import { publishNoteStream } from '../../stream';
 import renderLike from '../../../remote/activitypub/renderer/like';
 import renderUndo from '../../../remote/activitypub/renderer/undo';
 import { renderActivity } from '../../../remote/activitypub/renderer';
diff --git a/src/services/note/read.ts b/src/services/note/read.ts
index f2c121336..8b52445cf 100644
--- a/src/services/note/read.ts
+++ b/src/services/note/read.ts
@@ -1,6 +1,6 @@
 import * as mongo from 'mongodb';
 import isObjectId from '../../misc/is-objectid';
-import { publishMainStream } from '../../stream';
+import { publishMainStream } from '../stream';
 import User from '../../models/user';
 import NoteUnread from '../../models/note-unread';
 
diff --git a/src/services/note/unread.ts b/src/services/note/unread.ts
index e84ac2a4b..e70c63c76 100644
--- a/src/services/note/unread.ts
+++ b/src/services/note/unread.ts
@@ -2,7 +2,7 @@ import NoteUnread from '../../models/note-unread';
 import User, { IUser } from '../../models/user';
 import { INote } from '../../models/note';
 import Mute from '../../models/mute';
-import { publishMainStream } from '../../stream';
+import { publishMainStream } from '../stream';
 
 export default async function(user: IUser, note: INote, isSpecified = false) {
 	//#region ミュートしているなら無視
diff --git a/src/push-sw.ts b/src/services/push-notification.ts
similarity index 88%
rename from src/push-sw.ts
rename to src/services/push-notification.ts
index 8fd2dc137..ceb762b2f 100644
--- a/src/push-sw.ts
+++ b/src/services/push-notification.ts
@@ -1,9 +1,9 @@
 import * as push from 'web-push';
 import * as mongo from 'mongodb';
-import Subscription from './models/sw-subscription';
-import config from './config';
-import fetchMeta from './misc/fetch-meta';
-import { IMeta } from './models/meta';
+import Subscription from '../models/sw-subscription';
+import config from '../config';
+import fetchMeta from '../misc/fetch-meta';
+import { IMeta } from '../models/meta';
 
 let meta: IMeta = null;
 
diff --git a/src/stream.ts b/src/services/stream.ts
similarity index 99%
rename from src/stream.ts
rename to src/services/stream.ts
index 098d49ecd..813c9eb7c 100644
--- a/src/stream.ts
+++ b/src/services/stream.ts
@@ -1,5 +1,5 @@
 import * as mongo from 'mongodb';
-import redis from './db/redis';
+import redis from '../db/redis';
 import Xev from 'xev';
 
 type ID = string | mongo.ObjectID;