diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.html b/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.html
new file mode 100644
index 0000000000..c3529e99ff
--- /dev/null
+++ b/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.html
@@ -0,0 +1,11 @@
+
diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.scss b/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.scss
new file mode 100644
index 0000000000..facbd8b838
--- /dev/null
+++ b/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.scss
@@ -0,0 +1,12 @@
+.toast-container {
+ position: fixed;
+ display: flex;
+ flex-direction: column;
+ align-items: center;
+ justify-content: flex-end;
+ min-width: 350px;
+ min-height: 80px;
+ &.new-on-top {
+ flex-direction: column-reverse;
+ }
+}
diff --git a/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.ts b/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.ts
new file mode 100644
index 0000000000..4c664bb5d2
--- /dev/null
+++ b/npm/ng-packs/packages/theme-shared/src/lib/components/toast-container/toast-container.component.ts
@@ -0,0 +1,46 @@
+import { Component, Input, OnInit } from '@angular/core';
+import { Toaster } from '../../models';
+import { toastInOut } from '../../animations';
+import { ToasterService } from '../../services/toaster.service';
+
+@Component({
+ selector: 'abp-toast-container',
+ templateUrl: './toast-container.component.html',
+ styleUrls: ['./toast-container.component.scss'],
+ animations: [toastInOut],
+})
+export class ToastContainerComponent implements OnInit {
+ toasts = [] as Toaster.Toast[];
+
+ @Input()
+ top: number;
+
+ @Input()
+ right: number;
+
+ @Input()
+ bottom: number;
+
+ @Input()
+ left: number;
+
+ @Input()
+ toastKey: string;
+
+ constructor(private toastService: ToasterService) {}
+
+ ngOnInit() {
+ this.toastService.toasts$.subscribe(toasts => {
+ this.toasts = this.toastKey
+ ? toasts.filter(t => {
+ return t.options && t.options.containerKey !== this.toastKey;
+ })
+ : toasts;
+ });
+ }
+
+ trackByFunc(index, toast) {
+ if (!toast) return null;
+ return toast.options.id;
+ }
+}