You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@fineract.apache.org by my...@apache.org on 2018/06/21 16:19:08 UTC

[fineract-cn-notifications] branch develop created (now f3296bb)

This is an automated email from the ASF dual-hosted git repository.

myrle pushed a change to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract-cn-notifications.git.


      at f3296bb  update

This branch includes the following new commits:

     new 509bf48  Increment One
     new 9f886dd  Increment One
     new 71d5c3e  improved the repositories and entities for the configurations
     new c53c922  additions
     new 13e3802  update
     new 3cb7821  fixed the build error
     new 9b71ab2  fixed the build
     new 75d298a  update to testSample
     new a62f69f  update
     new 041ec34  test
     new 47709b8  Increment One
     new eb95c41  Merge remote-tracking branch 'origin/develop' into develop
     new 5e44714  to test customer
     new 4bf46aa  added dependencies to shared gradle file
     new f3296bb  update

The 15 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.



[fineract-cn-notifications] 01/15: Increment One

Posted by my...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

myrle pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract-cn-notifications.git

commit 509bf489e94df21e73ef551243f404daff4d621b
Author: Ebenezer Graham <eg...@alustudent.com>
AuthorDate: Sun Jun 10 01:03:15 2018 +0400

    Increment One
    
    First increment of the notification Microservice
     - Created eventlisteners
     - Created repositories for configuration
     - Created SMS and Email Sender Objects
---
 README.md | 26 ++++++++++++++++++++++++++
 1 file changed, 26 insertions(+)

diff --git a/README.md b/README.md
new file mode 100644
index 0000000..e94a392
--- /dev/null
+++ b/README.md
@@ -0,0 +1,26 @@
+# Apache Fineract CN Notification
+
+This mircroservice contains all the functionalities for SMS and Email Notification
+
+## Abstract
+Apache Fineract CN is an application framework for digital financial services, a system to support nationwide and cross-national financial transactions and help to level and speed the creation of an inclusive, interconnected digital economy for every nation in the world.
+
+## Versioning
+The version numbers follow the [Semantic Versioning](http://semver.org/) scheme.
+
+In addition to MAJOR.MINOR.PATCH the following postfixes are used to indicate the development state.
+
+* BUILD-SNAPSHOT - A release currently in development. 
+* M - A _milestone_ release include specific sets of functions and are released as soon as the functionality is complete.
+* RC - A _release candidate_ is a version with potential to be a final product, considered _code complete_.
+* RELEASE - _General availability_ indicates that this release is the best available version and is recommended for all usage.
+
+The versioning layout is {MAJOR}.{MINOR}.{PATCH}-{INDICATOR}[.{PATCH}]. Only milestones and release candidates can  have patch versions. Some examples:
+
+1.2.3.BUILD-SNAPSHOT  
+1.3.5.M.1  
+1.5.7.RC.2  
+2.0.0.RELEASE
+
+## License
+See [LICENSE](LICENSE) file.


[fineract-cn-notifications] 11/15: Increment One

Posted by my...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

myrle pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract-cn-notifications.git

commit 47709b8ec2d1db59629cdc9e1302b208a6dcd93f
Author: Ebenezer Graham <eg...@alustudent.com>
AuthorDate: Fri Jun 15 15:36:24 2018 +0400

    Increment One
    
    Commit for increment one
    improved the repositories and entities for the configurations
    
    additions
    
    update
    
    fixed the build error
    
    fixed the build
    
    update to testSample
    
    update
    
    test
---
 .gitignore                                         |   17 +
 .travis.yml                                        |   49 +
 HEADER                                             |   16 +
 LICENSE                                            |  201 +
 NOTICE.txt                                         |    5 +
 api/build.gradle                                   |   57 +
 .../notification/api/v1/PermittableGroupIds.class  |  Bin 0 -> 328 bytes
 .../api/v1/client/IamATeapotException.class        |  Bin 0 -> 392 bytes
 .../api/v1/client/NotificationManager.class        |  Bin 0 -> 1474 bytes
 .../api/v1/domain/EmailConfiguration.class         |  Bin 0 -> 3790 bytes
 .../notification/api/v1/domain/Notification.class  |  Bin 0 -> 1820 bytes
 .../api/v1/domain/SMSConfiguration.class           |  Bin 0 -> 2972 bytes
 .../cn/notification/api/v1/domain/Sample.class     |  Bin 0 -> 1752 bytes
 .../api/v1/events/NotificationEventConstants.class |  Bin 0 -> 666 bytes
 api/settings.gradle                                |   18 +
 .../notification/api/v1/PermittableGroupIds.java   |   25 +
 .../api/v1/client/IamATeapotException.java         |   23 +
 .../api/v1/client/NotificationManager.java         |   59 +
 .../api/v1/domain/EmailConfiguration.java          |  162 +
 .../api/v1/domain/SMSConfiguration.java            |  122 +
 .../cn/notification/api/v1/domain/Sample.java      |   72 +
 .../api/v1/events/NotificationEventConstants.java  |   31 +
 .../cn/notification/api/v1/domain/SampleTest.java  |   57 +
 build.gradle                                       |   60 +
 component-test/build.gradle                        |   56 +
 component-test/settings.gradle                     |   18 +
 .../cn/notification/SuiteTestEnvironment.java      |   48 +
 .../fineract/cn/notification/TestSample.java       |  137 +
 .../apache/fineract/cn/notification/TestSuite.java |   30 +
 .../listener/MigrationEventListener.java           |   50 +
 .../notification/listener/SampleEventListener.java |   50 +
 gradle/wrapper/gradle-wrapper.jar                  |  Bin 0 -> 54212 bytes
 gradle/wrapper/gradle-wrapper.properties           |    6 +
 gradlew                                            |  172 +
 gradlew.bat                                        |   84 +
 service/build.gradle                               |   85 +
 service/out/production/resources/application.yml   |   78 +
 service/out/production/resources/bootstrap.yml     |   22 +
 .../db/migrations/mariadb/V1__initial_setup.sql    |   72 +
 service/settings.gradle                            |   18 +
 .../service/NotificationApplication.java           |   32 +
 .../service/NotificationConfiguration.java         |  103 +
 .../cn/notification/service/ServiceConstants.java  |   23 +
 .../internal/command/InitializeServiceCommand.java |   31 +
 .../service/internal/command/SampleCommand.java    |   42 +
 .../command/handler/MigrationAggregate.java        |   67 +
 .../internal/command/handler/SampleAggregate.java  |   68 +
 .../internal/mapper/EmailConfigurationMapper.java  |   49 +
 .../internal/mapper/SMSConfigurationMapper.java    |   47 +
 .../service/internal/mapper/SampleMapper.java      |   46 +
 .../repository/EmailGatewayConfiguration.java      |  124 +
 .../EmailGatewayConfigurationRepository.java       |   29 +
 .../repository/SMSGatewayConfiguration.java        |   94 +
 .../SMSGatewayConfigurationRepository.java         |   29 +
 .../internal/repository/SampleJpaEntity.java       |   64 +
 .../repository/SampleJpaEntityRepository.java      |   28 +
 .../service/internal/service/EmailSender.java      |   60 +
 .../service/internal/service/SMSSender.java        |   58 +
 .../service/internal/service/SampleService.java    |   48 +
 .../service/listener/AccountingEventListener.java  |  124 +
 .../service/listener/ChequeEventListener.java      |   85 +
 .../service/listener/CustomerEventListener.java    |  200 +
 .../service/listener/DepositEventListener.java     |   61 +
 .../service/listener/IdentityEventListener.java    |   87 +
 .../service/listener/OfficeEventListener.java      |  136 +
 .../service/listener/PayrollEventListener.java     |   61 +
 .../service/listener/PortfolioEventListener.java   |  149 +
 .../service/listener/TellerEventListener.java      |  146 +
 .../service/rest/NotificationRestController.java   |  119 +
 service/src/main/resources/application.yml         |   81 +
 service/src/main/resources/bootstrap.yml           |   22 +
 .../db/migrations/mariadb/V1__initial_setup.sql    |   72 +
 settings.gradle                                    |   23 +
 shared.gradle                                      |  111 +
 system-analysis.mdj                                | 4104 ++++++++++++++++++++
 75 files changed, 8523 insertions(+)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..99b514a
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,17 @@
+.gradle
+.idea
+build/
+target/
+detail
+
+# Ignore Gradle GUI config
+gradle-app.setting
+
+# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
+!gradle-wrapper.jar
+
+*.iml
+
+*.log
+
+*.toDelete
diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..1ee78cd
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,49 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+language: java
+
+jdk: oraclejdk8
+
+sudo: enabled
+
+branches:
+  only:
+    - develop
+
+
+cache:
+  directories:
+  - $HOME/.m2
+
+install:
+ - gradle install
+
+notifications:
+  email: true
+
+  deploy:
+    -
+      on:
+        branch: develop
+      provider: bintray
+      skip_cleanup: true
+      #file: target/bin/bintray.json
+      user: ebenezergraham
+      # key: $BINTRAY_API_KEY
\ No newline at end of file
diff --git a/HEADER b/HEADER
new file mode 100644
index 0000000..90705e0
--- /dev/null
+++ b/HEADER
@@ -0,0 +1,16 @@
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..8dada3e
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "{}"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright {yyyy} {name of copyright owner}
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/NOTICE.txt b/NOTICE.txt
new file mode 100644
index 0000000..41f69b8
--- /dev/null
+++ b/NOTICE.txt
@@ -0,0 +1,5 @@
+Apache Fineract CN Notification
+Copyright [2017-2018] The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
\ No newline at end of file
diff --git a/api/build.gradle b/api/build.gradle
new file mode 100644
index 0000000..5b9924a
--- /dev/null
+++ b/api/build.gradle
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+buildscript {
+    repositories {
+        jcenter()
+    }
+
+    dependencies {
+        classpath 'io.spring.gradle:dependency-management-plugin:0.6.0.RELEASE'
+    }
+}
+
+plugins {
+    id "com.github.hierynomus.license" version "0.13.1"
+    id("org.nosphere.apache.rat") version "0.3.1"
+}
+
+apply from: '../shared.gradle'
+
+dependencies {
+    compile(
+            [group: 'org.springframework.cloud', name: 'spring-cloud-starter-feign'],
+            [group: 'org.apache.fineract.cn', name: 'api', version: versions.frameworkapi],
+            [group: 'org.hibernate', name: 'hibernate-validator', version: versions.validator],
+            [group: 'org.hibernate', name: 'hibernate-validator-annotation-processor', version: versions.validator]
+    )
+
+    testCompile(
+            [group: 'org.apache.fineract.cn', name: 'test', version: versions.frameworktest],
+    )
+}
+
+publishing {
+    publications {
+        api(MavenPublication) {
+            from components.java
+            groupId project.group
+            artifactId project.name
+            version project.version
+        }
+    }
+}
diff --git a/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/PermittableGroupIds.class b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/PermittableGroupIds.class
new file mode 100644
index 0000000..a1dee5e
Binary files /dev/null and b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/PermittableGroupIds.class differ
diff --git a/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/client/IamATeapotException.class b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/client/IamATeapotException.class
new file mode 100644
index 0000000..a197a0a
Binary files /dev/null and b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/client/IamATeapotException.class differ
diff --git a/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/client/NotificationManager.class b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/client/NotificationManager.class
new file mode 100644
index 0000000..741d5f5
Binary files /dev/null and b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/client/NotificationManager.class differ
diff --git a/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/domain/EmailConfiguration.class b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/domain/EmailConfiguration.class
new file mode 100644
index 0000000..dd410b5
Binary files /dev/null and b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/domain/EmailConfiguration.class differ
diff --git a/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/domain/Notification.class b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/domain/Notification.class
new file mode 100644
index 0000000..afe7f46
Binary files /dev/null and b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/domain/Notification.class differ
diff --git a/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/domain/SMSConfiguration.class b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/domain/SMSConfiguration.class
new file mode 100644
index 0000000..f7e3f18
Binary files /dev/null and b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/domain/SMSConfiguration.class differ
diff --git a/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/domain/Sample.class b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/domain/Sample.class
new file mode 100644
index 0000000..818a105
Binary files /dev/null and b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/domain/Sample.class differ
diff --git a/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/events/NotificationEventConstants.class b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/events/NotificationEventConstants.class
new file mode 100644
index 0000000..6b2a09d
Binary files /dev/null and b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/events/NotificationEventConstants.class differ
diff --git a/api/settings.gradle b/api/settings.gradle
new file mode 100644
index 0000000..491f745
--- /dev/null
+++ b/api/settings.gradle
@@ -0,0 +1,18 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+rootProject.name = 'api'
\ No newline at end of file
diff --git a/api/src/main/java/org/apache/fineract/cn/notification/api/v1/PermittableGroupIds.java b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/PermittableGroupIds.java
new file mode 100644
index 0000000..a854460
--- /dev/null
+++ b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/PermittableGroupIds.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.api.v1;
+
+@SuppressWarnings("unused")
+public interface PermittableGroupIds {
+  String SAMPLE_MANAGEMENT = "notification__v1__samples";
+  String SELF_MANAGEMENT = "notification__v1__self";
+}
diff --git a/api/src/main/java/org/apache/fineract/cn/notification/api/v1/client/IamATeapotException.java b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/client/IamATeapotException.java
new file mode 100644
index 0000000..9265ed4
--- /dev/null
+++ b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/client/IamATeapotException.java
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.api.v1.client;
+
+@SuppressWarnings("WeakerAccess")
+public class IamATeapotException extends RuntimeException {
+}
diff --git a/api/src/main/java/org/apache/fineract/cn/notification/api/v1/client/NotificationManager.java b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/client/NotificationManager.java
new file mode 100644
index 0000000..6d0a7b1
--- /dev/null
+++ b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/client/NotificationManager.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.api.v1.client;
+
+import org.apache.fineract.cn.notification.api.v1.domain.Sample;
+import java.util.List;
+import org.apache.fineract.cn.api.annotation.ThrowsException;
+import org.apache.fineract.cn.api.util.CustomFeignClientsConfiguration;
+import org.springframework.cloud.netflix.feign.FeignClient;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+@SuppressWarnings("unused")
+@FeignClient(value="notification-v1", path="/notification/v1", configuration = CustomFeignClientsConfiguration.class)
+public interface NotificationManager {
+
+  @RequestMapping(
+          value = "/notification",
+          method = RequestMethod.GET,
+          produces = MediaType.ALL_VALUE,
+          consumes = MediaType.APPLICATION_JSON_VALUE
+  )
+  List<Sample> findAllEntities();
+
+  @RequestMapping(
+          value = "/notification/{identifier}",
+          method = RequestMethod.GET,
+          produces = MediaType.ALL_VALUE,
+          consumes = MediaType.APPLICATION_JSON_VALUE)
+  Sample getEntity(@PathVariable("identifier") final String identifier);
+
+  @RequestMapping(
+      value = "/notification",
+      method = RequestMethod.POST,
+      produces = MediaType.APPLICATION_JSON_VALUE,
+      consumes = MediaType.APPLICATION_JSON_VALUE
+  )
+  @ThrowsException(status = HttpStatus.I_AM_A_TEAPOT, exception = IamATeapotException.class)
+  void createEntity(final Sample sample);
+}
diff --git a/api/src/main/java/org/apache/fineract/cn/notification/api/v1/domain/EmailConfiguration.java b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/domain/EmailConfiguration.java
new file mode 100644
index 0000000..24aa0dc
--- /dev/null
+++ b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/domain/EmailConfiguration.java
@@ -0,0 +1,162 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.api.v1.domain;
+
+import org.apache.fineract.cn.lang.validation.constraints.ValidIdentifier;
+import org.hibernate.validator.constraints.Length;
+
+import java.util.Objects;
+
+@SuppressWarnings({"WeakerAccess", "unused"})
+public class EmailConfiguration {
+  @ValidIdentifier
+  private String identifier;
+  @Length(max = 512)
+  private String payload;
+  @Length(max = 512)
+  private String host;
+  @Length(max = 512)
+  private String port;
+  @Length(max = 512)
+  private String username;
+  @Length(max = 512)
+  private String app_id;
+  @Length(max = 512)
+  private String smtp_auth;
+  @Length(max = 512)
+  private String start_tls;
+  @Length(max = 512)
+  private String option;
+
+  public EmailConfiguration(){
+    super();
+  }
+
+  public static EmailConfiguration create (String identifier, String payload,
+                            String host, String port,
+                            String username, String app_id,
+                            String smtp_auth, String start_tls,
+                            String option) {
+    EmailConfiguration emailConfiguration = new EmailConfiguration();
+    emailConfiguration.setIdentifier(identifier);
+    emailConfiguration.setPayload(payload);
+    emailConfiguration.setHost(host);
+    emailConfiguration.setPort(port);
+    emailConfiguration.setUsername(username);
+    emailConfiguration.setApp_id(app_id);
+    emailConfiguration.setSmtp_auth(smtp_auth);
+    emailConfiguration.setStart_tls(start_tls);
+    emailConfiguration.setOption(option);
+    return emailConfiguration;
+  }
+
+  public String getIdentifier() {
+    return identifier;
+  }
+
+  public void setIdentifier(String identifier) {
+    this.identifier = identifier;
+  }
+
+  public String getPayload() {
+    return payload;
+  }
+
+  public void setPayload(String payload) {
+    this.payload = payload;
+  }
+
+  public String getHost() {
+    return host;
+  }
+
+  public void setHost(String host) {
+    this.host = host;
+  }
+
+  public String getPort() {
+    return port;
+  }
+
+  public void setPort(String port) {
+    this.port = port;
+  }
+
+  public String getUsername() {
+    return username;
+  }
+
+  public void setUsername(String username) {
+    this.username = username;
+  }
+
+  public String getApp_id() {
+    return app_id;
+  }
+
+  public void setApp_id(String app_id) {
+    this.app_id = app_id;
+  }
+
+  public String getSmtp_auth() {
+    return smtp_auth;
+  }
+
+  public void setSmtp_auth(String smtp_auth) {
+    this.smtp_auth = smtp_auth;
+  }
+
+  public String getStart_tls() {
+    return start_tls;
+  }
+
+  public void setStart_tls(String start_tls) {
+    this.start_tls = start_tls;
+  }
+
+  public String getOption() {
+    return option;
+  }
+
+  public void setOption(String option) {
+    this.option = option;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o == null || getClass() != o.getClass()) return false;
+    EmailConfiguration that = (EmailConfiguration) o;
+    return Objects.equals(identifier, that.identifier) &&
+            Objects.equals(payload, that.payload) &&
+            Objects.equals(host, that.host) &&
+            Objects.equals(port, that.port) &&
+            Objects.equals(username, that.username) &&
+            Objects.equals(app_id, that.app_id) &&
+            Objects.equals(smtp_auth, that.smtp_auth) &&
+            Objects.equals(start_tls, that.start_tls) &&
+            Objects.equals(option, that.option);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(identifier, payload, host, port, username,
+            app_id, smtp_auth, start_tls, option);
+  }
+}
diff --git a/api/src/main/java/org/apache/fineract/cn/notification/api/v1/domain/SMSConfiguration.java b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/domain/SMSConfiguration.java
new file mode 100644
index 0000000..cef7f57
--- /dev/null
+++ b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/domain/SMSConfiguration.java
@@ -0,0 +1,122 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.api.v1.domain;
+
+import org.apache.fineract.cn.lang.validation.constraints.ValidIdentifier;
+import org.hibernate.validator.constraints.Length;
+
+import java.util.Objects;
+
+@SuppressWarnings({"WeakerAccess", "unused"})
+public class SMSConfiguration {
+  @ValidIdentifier
+  private String identifier;
+  @Length(max = 512)
+  private String payload;
+  @Length(max = 512)
+  private String organisation;
+  @Length(max = 512)
+  private String auth_token;
+  @Length(max = 512)
+  private String accountid;
+  @Length(max = 256)
+  private String option;
+
+  public SMSConfiguration() {
+    super();
+  }
+
+  public static SMSConfiguration create(String identifier, String payload, String organisation, String auth_token, String accountid, String option) {
+    SMSConfiguration smsconfiguration = new SMSConfiguration();
+    smsconfiguration.setIdentifier(identifier);
+    smsconfiguration.setPayload(payload);
+    smsconfiguration.setOrganisation(organisation);
+    smsconfiguration.setAuth_token(auth_token);
+    smsconfiguration.setAccountid(accountid);
+    smsconfiguration.setOption(option);
+    return smsconfiguration;
+  }
+
+  public String getIdentifier() {
+    return identifier;
+  }
+
+  public void setIdentifier(String identifier) {
+    this.identifier = identifier;
+  }
+
+  public String getPayload() {
+    return payload;
+  }
+
+  public void setPayload(String payload) {
+    this.payload = payload;
+  }
+
+  public String getOrganisation() {
+    return organisation;
+  }
+
+  public void setOrganisation(String organisation) {
+    this.organisation = organisation;
+  }
+
+  public String getAuth_token() {
+    return auth_token;
+  }
+
+  public void setAuth_token(String auth_token) {
+    this.auth_token = auth_token;
+  }
+
+  public String getAccountid() {
+    return accountid;
+  }
+
+  public void setAccountid(String accountid) {
+    this.accountid = accountid;
+  }
+
+  public String getOption() {
+    return option;
+  }
+
+  public void setOption(String option) {
+    this.option = option;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o == null || getClass() != o.getClass()) return false;
+    SMSConfiguration that = (SMSConfiguration) o;
+    return Objects.equals(identifier, that.identifier) &&
+            Objects.equals(payload, that.payload) &&
+            Objects.equals(organisation, that.organisation) &&
+            Objects.equals(auth_token, that.auth_token) &&
+            Objects.equals(accountid, that.accountid) &&
+            Objects.equals(option, that.option);
+  }
+
+  @Override
+  public int hashCode() {
+
+    return Objects.hash(identifier, payload, organisation, auth_token, accountid, option);
+  }
+}
diff --git a/api/src/main/java/org/apache/fineract/cn/notification/api/v1/domain/Sample.java b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/domain/Sample.java
new file mode 100644
index 0000000..644dda9
--- /dev/null
+++ b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/domain/Sample.java
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.api.v1.domain;
+
+import java.util.Objects;
+import org.apache.fineract.cn.lang.validation.constraints.ValidIdentifier;
+import org.hibernate.validator.constraints.Length;
+
+@SuppressWarnings({"WeakerAccess", "unused"})
+public class Sample {
+  @ValidIdentifier
+  private String identifier;
+  @Length(max = 512)
+  private String payload;
+
+  public Sample() {
+    super();
+  }
+
+  public static Sample create(final String identifier, final String payload) {
+    final Sample sample = new Sample();
+    sample.setIdentifier(identifier);
+    sample.setPayload(payload);
+    return sample;
+  }
+
+  public String getIdentifier() {
+    return this.identifier;
+  }
+
+  public void setIdentifier(final String identifier) {
+    this.identifier = identifier;
+  }
+
+  public String getPayload() {
+    return payload;
+  }
+
+  public void setPayload(String payload) {
+    this.payload = payload;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o == null || getClass() != o.getClass()) return false;
+    Sample sample = (Sample) o;
+    return Objects.equals(identifier, sample.identifier) &&
+            Objects.equals(payload, sample.payload);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(identifier, payload);
+  }
+}
diff --git a/api/src/main/java/org/apache/fineract/cn/notification/api/v1/events/NotificationEventConstants.java b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/events/NotificationEventConstants.java
new file mode 100644
index 0000000..39c6eb0
--- /dev/null
+++ b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/events/NotificationEventConstants.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.api.v1.events;
+
+@SuppressWarnings("unused")
+public interface NotificationEventConstants {
+
+    String DESTINATION = "notification-v1";
+    String SELECTOR_NAME = "action";
+    String INITIALIZE = "initialize";
+    String POST_SAMPLE = "post-sample";
+    String SELECTOR_INITIALIZE = SELECTOR_NAME + " = '" + INITIALIZE + "'";
+    String SELECTOR_POST_SAMPLE = SELECTOR_NAME + " = '" + POST_SAMPLE + "'";
+
+}
diff --git a/api/src/test/java/org/apache/fineract/cn/notification/api/v1/domain/SampleTest.java b/api/src/test/java/org/apache/fineract/cn/notification/api/v1/domain/SampleTest.java
new file mode 100644
index 0000000..65cd1ac
--- /dev/null
+++ b/api/src/test/java/org/apache/fineract/cn/notification/api/v1/domain/SampleTest.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.api.v1.domain;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import org.apache.commons.lang.RandomStringUtils;
+import org.apache.fineract.cn.test.domain.ValidationTest;
+import org.apache.fineract.cn.test.domain.ValidationTestCase;
+import org.junit.runners.Parameterized;
+
+public class SampleTest extends ValidationTest<Sample> {
+
+  public SampleTest(ValidationTestCase<Sample> testCase) {
+    super(testCase);
+  }
+
+  @Override
+  protected Sample createValidTestSubject() {
+    return Sample.create("xxxx", "yyy");
+  }
+
+  @Parameterized.Parameters
+  public static Collection testCases() {
+    final Collection<ValidationTestCase> ret = new ArrayList<>();
+    ret.add(new ValidationTestCase<Sample>("basicCase")
+            .adjustment(x -> {})
+            .valid(true));
+    ret.add(new ValidationTestCase<Sample>("nullIdentifier")
+            .adjustment(x -> x.setIdentifier(null))
+            .valid(false));
+    ret.add(new ValidationTestCase<Sample>("tooShortIdentifier")
+            .adjustment(x -> x.setIdentifier("z"))
+            .valid(false));
+    ret.add(new ValidationTestCase<Sample>("tooLongPayload")
+            .adjustment(x -> x.setPayload(RandomStringUtils.randomAlphanumeric(513)))
+            .valid(false));
+    return ret;
+  }
+
+}
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..ca2370a
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+group 'org.apache.fineract.cn.notification'
+
+task publishApiToMavenLocal {
+    dependsOn gradle.includedBuild('api').task(':publishToMavenLocal')
+}
+
+task publishServiceToMavenLocal {
+    mustRunAfter publishApiToMavenLocal
+    dependsOn gradle.includedBuild('service').task(':publishToMavenLocal')
+}
+
+task publishComponentTestToMavenLocal {
+    mustRunAfter publishApiToMavenLocal
+    mustRunAfter publishServiceToMavenLocal
+    dependsOn gradle.includedBuild('component-test').task(':publishToMavenLocal')
+}
+
+task publishToMavenLocal {
+    group 'all'
+    dependsOn publishApiToMavenLocal
+    dependsOn publishServiceToMavenLocal
+    dependsOn publishComponentTestToMavenLocal
+}
+
+task prepareForTest {
+    group 'all'
+    dependsOn publishToMavenLocal
+    dependsOn gradle.includedBuild('component-test').task(':build')
+}
+
+task licenseFormat {
+    group 'all'
+    dependsOn gradle.includedBuild('api').task(':licenseFormat')
+    dependsOn gradle.includedBuild('service').task(':licenseFormat')
+    dependsOn gradle.includedBuild('component-test').task(':licenseFormat')
+}
+
+task rat {
+    group 'all'
+    dependsOn gradle.includedBuild('api').task(':rat')
+    dependsOn gradle.includedBuild('service').task(':rat')
+    dependsOn gradle.includedBuild('component-test').task(':rat')
+}
diff --git a/component-test/build.gradle b/component-test/build.gradle
new file mode 100644
index 0000000..0348f06
--- /dev/null
+++ b/component-test/build.gradle
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+buildscript {
+    ext {
+        springBootVersion = '1.4.1.RELEASE'
+    }
+
+    repositories {
+        jcenter()
+    }
+
+    dependencies {
+        classpath ("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
+    }
+}
+
+plugins {
+    id "com.github.hierynomus.license" version "0.13.1"
+    id("org.nosphere.apache.rat") version "0.3.1"
+}
+apply from: '../shared.gradle'
+
+dependencies {
+    compile(
+            [group: 'org.apache.fineract.cn.notification', name: 'api', version: project.version],
+            [group: 'org.apache.fineract.cn.notification', name: 'service', version: project.version],
+            [group: 'org.apache.fineract.cn.anubis', name: 'test', version: versions.frameworkanubis],
+            [group: 'org.apache.fineract.cn', name: 'api', version: versions.frameworkapi],
+            [group: 'org.apache.fineract.cn', name: 'test', version: versions.frameworktest],
+            [group: 'org.apache.fineract.cn', name: 'lang', version: versions.frameworklang],
+            [group: 'org.springframework.boot', name: 'spring-boot-starter-test']
+    )
+}
+
+publishing {
+    publications {
+        mavenJava(MavenPublication) {
+            from components.java
+        }
+    }
+}
diff --git a/component-test/settings.gradle b/component-test/settings.gradle
new file mode 100644
index 0000000..a07a3bc
--- /dev/null
+++ b/component-test/settings.gradle
@@ -0,0 +1,18 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+rootProject.name = 'component-test'
\ No newline at end of file
diff --git a/component-test/src/main/java/org/apache/fineract/cn/notification/SuiteTestEnvironment.java b/component-test/src/main/java/org/apache/fineract/cn/notification/SuiteTestEnvironment.java
new file mode 100644
index 0000000..5f2b5f4
--- /dev/null
+++ b/component-test/src/main/java/org/apache/fineract/cn/notification/SuiteTestEnvironment.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification;
+
+import org.apache.fineract.cn.test.env.TestEnvironment;
+import org.apache.fineract.cn.test.fixture.cassandra.CassandraInitializer;
+import org.apache.fineract.cn.test.fixture.mariadb.MariaDBInitializer;
+import org.junit.ClassRule;
+import org.junit.rules.RuleChain;
+import org.junit.rules.RunExternalResourceOnce;
+import org.junit.rules.TestRule;
+
+/**
+ * This contains the database resources required by the test.  They are in a separate
+ * class so that the test suite can initialize them before the classes it calls. This
+ * makes test runs faster and prevents tests from "stepping on each other's toes" when
+ * initializing and de-initializing external resources.
+ */
+public class SuiteTestEnvironment {
+  static final String APP_VERSION = "1";
+  static final String APP_NAME = "notification-v" + APP_VERSION;
+
+  static final TestEnvironment testEnvironment = new TestEnvironment(APP_NAME);
+  static final CassandraInitializer cassandraInitializer = new CassandraInitializer();
+  static final MariaDBInitializer mariaDBInitializer = new MariaDBInitializer();
+
+  @ClassRule
+  public static TestRule orderClassRules = RuleChain
+      .outerRule(new RunExternalResourceOnce(testEnvironment))
+      .around(new RunExternalResourceOnce(cassandraInitializer))
+      .around(new RunExternalResourceOnce(mariaDBInitializer));
+}
diff --git a/component-test/src/main/java/org/apache/fineract/cn/notification/TestSample.java b/component-test/src/main/java/org/apache/fineract/cn/notification/TestSample.java
new file mode 100644
index 0000000..3b2811e
--- /dev/null
+++ b/component-test/src/main/java/org/apache/fineract/cn/notification/TestSample.java
@@ -0,0 +1,137 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification;
+
+import org.apache.fineract.cn.notification.api.v1.client.NotificationManager;
+import org.apache.fineract.cn.notification.api.v1.domain.Sample;
+import org.apache.fineract.cn.notification.api.v1.events.NotificationEventConstants;
+import java.util.List;
+import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.fineract.cn.anubis.test.v1.TenantApplicationSecurityEnvironmentTestRule;
+import org.apache.fineract.cn.api.context.AutoUserContext;
+import org.apache.fineract.cn.notification.service.NotificationConfiguration;
+import org.apache.fineract.cn.test.fixture.TenantDataStoreContextTestRule;
+import org.apache.fineract.cn.test.listener.EnableEventRecording;
+import org.apache.fineract.cn.test.listener.EventRecorder;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.ClassRule;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.cloud.netflix.feign.EnableFeignClients;
+import org.springframework.cloud.netflix.ribbon.RibbonClient;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
+public class TestSample extends SuiteTestEnvironment {
+  private static final String LOGGER_NAME = "test-logger";
+  private static final String TEST_USER = "homer";
+
+
+  @Configuration
+  @EnableEventRecording
+  @EnableFeignClients(basePackages = {"org.apache.fineract.cn.notification.api.v1.client"})
+  @RibbonClient(name = APP_NAME)
+  @Import({NotificationConfiguration.class})
+  @ComponentScan("org.apache.fineract.cn.notification.listener")
+  public static class TestConfiguration {
+    public TestConfiguration() {
+      super();
+    }
+
+    @Bean(name = LOGGER_NAME)
+    public Logger logger() {
+      return LoggerFactory.getLogger(LOGGER_NAME);
+    }
+  }
+
+  @ClassRule
+  public final static TenantDataStoreContextTestRule tenantDataStoreContext = TenantDataStoreContextTestRule.forRandomTenantName(cassandraInitializer, mariaDBInitializer);
+
+  @Rule
+  public final TenantApplicationSecurityEnvironmentTestRule tenantApplicationSecurityEnvironment
+          = new TenantApplicationSecurityEnvironmentTestRule(testEnvironment, this::waitForInitialize);
+
+  private AutoUserContext userContext;
+
+  @Autowired
+  private NotificationManager testSubject;
+
+  @Autowired
+  private EventRecorder eventRecorder;
+
+  @SuppressWarnings("WeakerAccess")
+  @Autowired
+  @Qualifier(LOGGER_NAME)
+  Logger logger;
+
+  public TestSample() {
+    super();
+  }
+
+  @Before
+  public void prepTest() {
+    userContext = tenantApplicationSecurityEnvironment.createAutoUserContext(TestSample.TEST_USER);
+  }
+
+  @After
+  public void cleanTest() {
+    userContext.close();
+    eventRecorder.clear();
+  }
+
+  public boolean waitForInitialize() {
+    try {
+      return this.eventRecorder.wait(NotificationEventConstants.INITIALIZE, APP_VERSION);
+    } catch (final InterruptedException e) {
+      throw new IllegalStateException(e);
+    }
+  }
+
+  @Test
+  public void shouldCreateSample() throws InterruptedException {
+    logger.info("Running test shouldCreateSample.");
+    final Sample sample = Sample.create(RandomStringUtils.randomAlphanumeric(8), RandomStringUtils.randomAlphanumeric(512));
+    this.testSubject.createEntity(sample);
+
+    Assert.assertTrue(this.eventRecorder.wait(NotificationEventConstants.POST_SAMPLE, sample.getIdentifier()));
+
+    final Sample createdSample = this.testSubject.getEntity(sample.getIdentifier());
+    Assert.assertEquals(sample, createdSample);
+  }
+
+  @Test
+  public void shouldListSamples() {
+    logger.info("Running test shouldListSamples.");
+    final List<Sample> allEntities = this.testSubject.findAllEntities();
+    Assert.assertNotNull(allEntities);
+  }
+}
diff --git a/component-test/src/main/java/org/apache/fineract/cn/notification/TestSuite.java b/component-test/src/main/java/org/apache/fineract/cn/notification/TestSuite.java
new file mode 100644
index 0000000..a4d42bf
--- /dev/null
+++ b/component-test/src/main/java/org/apache/fineract/cn/notification/TestSuite.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+@RunWith(Suite.class)
+@Suite.SuiteClasses({
+    TestSample.class,
+    //TODO: when you create a new component test, add it here so you can run it with the suite.
+})
+public class TestSuite extends SuiteTestEnvironment {
+}
diff --git a/component-test/src/main/java/org/apache/fineract/cn/notification/listener/MigrationEventListener.java b/component-test/src/main/java/org/apache/fineract/cn/notification/listener/MigrationEventListener.java
new file mode 100644
index 0000000..c24b97c
--- /dev/null
+++ b/component-test/src/main/java/org/apache/fineract/cn/notification/listener/MigrationEventListener.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.listener;
+
+import org.apache.fineract.cn.notification.api.v1.events.NotificationEventConstants;
+import org.apache.fineract.cn.lang.config.TenantHeaderFilter;
+import org.apache.fineract.cn.test.listener.EventRecorder;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jms.annotation.JmsListener;
+import org.springframework.messaging.handler.annotation.Header;
+import org.springframework.stereotype.Component;
+
+@SuppressWarnings("unused")
+@Component
+public class MigrationEventListener {
+
+  private final EventRecorder eventRecorder;
+
+  @Autowired
+  public MigrationEventListener(@SuppressWarnings("SpringJavaAutowiringInspection") final EventRecorder eventRecorder) {
+    super();
+    this.eventRecorder = eventRecorder;
+  }
+
+  @JmsListener(
+      subscription = NotificationEventConstants.DESTINATION,
+      destination = NotificationEventConstants.DESTINATION,
+      selector = NotificationEventConstants.SELECTOR_INITIALIZE
+  )
+  public void onInitialization(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                               final String payload) {
+    this.eventRecorder.event(tenant, NotificationEventConstants.INITIALIZE, payload, String.class);
+  }
+}
diff --git a/component-test/src/main/java/org/apache/fineract/cn/notification/listener/SampleEventListener.java b/component-test/src/main/java/org/apache/fineract/cn/notification/listener/SampleEventListener.java
new file mode 100644
index 0000000..85abe9e
--- /dev/null
+++ b/component-test/src/main/java/org/apache/fineract/cn/notification/listener/SampleEventListener.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.listener;
+
+import org.apache.fineract.cn.notification.api.v1.events.NotificationEventConstants;
+import org.apache.fineract.cn.lang.config.TenantHeaderFilter;
+import org.apache.fineract.cn.test.listener.EventRecorder;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jms.annotation.JmsListener;
+import org.springframework.messaging.handler.annotation.Header;
+import org.springframework.stereotype.Component;
+
+@SuppressWarnings("unused")
+@Component
+public class SampleEventListener {
+
+  private final EventRecorder eventRecorder;
+
+  @Autowired
+  public SampleEventListener(@SuppressWarnings("SpringJavaAutowiringInspection") final EventRecorder eventRecorder) {
+    super();
+    this.eventRecorder = eventRecorder;
+  }
+
+  @JmsListener(
+      subscription = NotificationEventConstants.DESTINATION,
+      destination = NotificationEventConstants.DESTINATION,
+      selector = NotificationEventConstants.SELECTOR_POST_SAMPLE
+  )
+  public void onCreateSample(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                             final String payload) {
+    this.eventRecorder.event(tenant, NotificationEventConstants.POST_SAMPLE, payload, String.class);
+  }
+}
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..400f155
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..c563c1a
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Fri May 18 16:18:58 MUT 2018
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-3.4.1-all.zip
diff --git a/gradlew b/gradlew
new file mode 100755
index 0000000..4453cce
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,172 @@
+#!/usr/bin/env sh
+
+##############################################################################
+##
+##  Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+    echo "$*"
+}
+
+die ( ) {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+  NONSTOP* )
+    nonstop=true
+    ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+    JAVACMD=`cygpath --unix "$JAVACMD"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=$((i+1))
+    done
+    case $i in
+        (0) set -- ;;
+        (1) set -- "$args0" ;;
+        (2) set -- "$args0" "$args1" ;;
+        (3) set -- "$args0" "$args1" "$args2" ;;
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Escape application args
+save ( ) {
+    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+    echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+  cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000..e95643d
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem  Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/service/build.gradle b/service/build.gradle
new file mode 100644
index 0000000..57f507d
--- /dev/null
+++ b/service/build.gradle
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+buildscript {
+    ext {
+        springBootVersion = '1.4.1.RELEASE'
+    }
+
+    repositories {
+        jcenter()
+    }
+
+    dependencies {
+        classpath ("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
+    }
+}
+
+plugins {
+    id "com.github.hierynomus.license" version "0.13.1"
+    id("org.nosphere.apache.rat") version "0.3.1"
+}
+
+apply from: '../shared.gradle'
+
+apply plugin: 'spring-boot'
+
+springBoot {
+    executable = true
+    classifier = 'boot'
+}
+
+dependencies {
+    compile(
+            [group: 'com.twilio.sdk', name: 'twilio', version: '7.17.+'],
+            [group: 'org.apache.fineract.cn.customer', name: 'api', version: versions.fineractcncustomer],
+            [group: 'org.springframework.cloud', name: 'spring-cloud-starter-config'],
+            [group: 'org.springframework.cloud', name: 'spring-cloud-starter-eureka'],
+            [group: 'org.springframework.boot', name: 'spring-boot-starter-jetty'],
+            //check this dependency
+            [group: 'org.springframework.boot', name: 'spring-boot-starter-mail', version: '1.4.3.RELEASE'],
+            [group: 'org.apache.fineract.cn.notification', name: 'api', version: project.version],
+            [group: 'org.apache.fineract.cn.anubis', name: 'library', version: versions.frameworkanubis],
+            [group: 'com.google.code.gson', name: 'gson'],
+            [group: 'org.apache.fineract.cn', name: 'lang', version: versions.frameworklang],
+            [group: 'org.apache.fineract.cn', name: 'async', version: versions.frameworkasync],
+            [group: 'org.apache.fineract.cn', name: 'cassandra', version: versions.frameworkcassandra],
+            [group: 'org.apache.fineract.cn', name: 'mariadb', version: versions.frameworkmariadb],
+            [group: 'org.apache.fineract.cn', name: 'command', version: versions.frameworkcommand],
+            [group: 'org.hibernate', name: 'hibernate-validator', version: versions.validator]
+    )
+}
+
+publishToMavenLocal.dependsOn bootRepackage
+
+publishing {
+    publications {
+        service(MavenPublication) {
+            from components.java
+            groupId project.group
+            artifactId project.name
+            version project.version
+        }
+        bootService(MavenPublication) {
+            // "boot" jar
+            artifact ("$buildDir/libs/$project.name-$version-boot.jar")
+            groupId project.group
+            artifactId ("$project.name-boot")
+            version project.version
+        }
+    }
+}
diff --git a/service/out/production/resources/application.yml b/service/out/production/resources/application.yml
new file mode 100644
index 0000000..37acaaf
--- /dev/null
+++ b/service/out/production/resources/application.yml
@@ -0,0 +1,78 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+spring:
+  cloud:
+    discovery:
+      enabled: false
+    config:
+      enabled: false
+
+eureka:
+  client:
+    serviceUrl:
+      defaultZone: http://localhost:8761/eureka/
+
+server:
+  port: 8081
+  contextPath: /notification/v1/*
+
+cassandra:
+  clusterName: staging_cluster
+  contactPoints: 127.0.0.1:9042,127.0.0.2:9042,127.0.0.3:9042
+  keyspace: seshat
+  cl:
+    read: LOCAL_QUORUM
+    write: LOCAL_QUORUM
+    delete: LOCAL_QUORUM
+
+mariadb:
+  driverClass: org.mariadb.jdbc.Driver
+  database: seshat
+  host: localhost
+  port: 3306
+  user: root
+  password: mysql
+
+bonecp:
+  idleMaxAgeInMinutes: 240
+  idleConnectionTestPeriodInMinutes: 60
+  maxConnectionsPerPartition: 10
+  minConnectionsPerPartition: 1
+  partitionCount: 2
+  acquireIncrement: 5
+  statementsCacheSize: 100
+
+async:
+  corePoolSize: 32
+  maxPoolSize: 16384
+  queueCapacity: 0
+  threadName: async-processor-
+
+flyway:
+  enabled: false
+
+fineract:
+  customer:
+    accountcreated:
+      message: Dear Valued Customer, Your account has been created.
+    accountclosed:
+      message: Dear Valued Customer, Your account has been successfully closed.
+
+
diff --git a/service/out/production/resources/bootstrap.yml b/service/out/production/resources/bootstrap.yml
new file mode 100644
index 0000000..76c2441
--- /dev/null
+++ b/service/out/production/resources/bootstrap.yml
@@ -0,0 +1,22 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+spring:
+    application:
+        name: notification-v1
diff --git a/service/out/production/resources/db/migrations/mariadb/V1__initial_setup.sql b/service/out/production/resources/db/migrations/mariadb/V1__initial_setup.sql
new file mode 100644
index 0000000..ff9a61f
--- /dev/null
+++ b/service/out/production/resources/db/migrations/mariadb/V1__initial_setup.sql
@@ -0,0 +1,72 @@
+--
+-- Licensed to the Apache Software Foundation (ASF) under one
+-- or more contributor license agreements.  See the NOTICE file
+-- distributed with this work for additional information
+-- regarding copyright ownership.  The ASF licenses this file
+-- to you under the Apache License, Version 2.0 (the
+-- "License"); you may not use this file except in compliance
+-- with the License.  You may obtain a copy of the License at
+--
+--   http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing,
+-- software distributed under the License is distributed on an
+-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+-- KIND, either express or implied.  See the License for the
+-- specific language governing permissions and limitations
+-- under the License.
+--
+
+-- -----------------------------------------------------
+-- Table `fineract-cn-notification`.`email_gateway_configurations`
+-- -----------------------------------------------------
+CREATE TABLE IF NOT EXISTS `fineract-cn-notification`.`email_gateway_configurations` (
+  `id` INT(11) NOT NULL AUTO_INCREMENT,
+  `identifer` VARCHAR(45) NULL DEFAULT NULL,
+  `host` VARCHAR(45) NOT NULL,
+  `port` VARCHAR(45) NOT NULL,
+  `username` VARCHAR(45) NOT NULL,
+  `app_id` VARCHAR(45) NOT NULL,
+  PRIMARY KEY (`id`))
+ENGINE = InnoDB
+DEFAULT CHARACTER SET = latin1;
+
+
+-- -----------------------------------------------------
+-- Table `fineract-cn-notification`.`sms_gateway_configurations`
+-- -----------------------------------------------------
+CREATE TABLE IF NOT EXISTS `fineract-cn-notification`.`sms_gateway_configurations` (
+  `id` INT(11) NOT NULL AUTO_INCREMENT,
+  `identifier` VARCHAR(45) NULL DEFAULT NULL,
+  `accountsid` VARCHAR(255) NOT NULL,
+  `auth_token` VARCHAR(255) NOT NULL,
+  `option` VARCHAR(45) NULL DEFAULT NULL,
+  PRIMARY KEY (`id`))
+ENGINE = InnoDB
+DEFAULT CHARACTER SET = latin1;
+
+
+-- -----------------------------------------------------
+-- Table `fineract-cn-notification`.`templates`
+-- -----------------------------------------------------
+CREATE TABLE IF NOT EXISTS `fineract-cn-notification`.`templates` (
+  `id` INT(11) NOT NULL AUTO_INCREMENT,
+  PRIMARY KEY (`id`))
+ENGINE = InnoDB
+DEFAULT CHARACTER SET = latin1;
+
+-- ------------------------------------------------------
+
+CREATE TABLE sample (
+  id BIGINT NOT NULL AUTO_INCREMENT,
+  identifier VARCHAR(8) NOT NULL,
+  payload VARCHAR(512) NULL,
+  CONSTRAINT notification_pk PRIMARY KEY (id)
+);
+
+CREATE TABLE template_sample (
+  id BIGINT NOT NULL AUTO_INCREMENT,
+  identifier VARCHAR(8) NOT NULL,
+  payload VARCHAR(512) NULL,
+  CONSTRAINT template_sample_pk PRIMARY KEY (id)
+);
\ No newline at end of file
diff --git a/service/settings.gradle b/service/settings.gradle
new file mode 100644
index 0000000..1a4c2fd
--- /dev/null
+++ b/service/settings.gradle
@@ -0,0 +1,18 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+rootProject.name = 'service'
\ No newline at end of file
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/NotificationApplication.java b/service/src/main/java/org/apache/fineract/cn/notification/service/NotificationApplication.java
new file mode 100644
index 0000000..5968d0d
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/NotificationApplication.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service;
+
+import org.springframework.boot.SpringApplication;
+
+public class NotificationApplication {
+
+  public NotificationApplication() {
+    super();
+  }
+
+  public static void main(String[] args) {
+    SpringApplication.run(NotificationConfiguration.class, args);
+  }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/NotificationConfiguration.java b/service/src/main/java/org/apache/fineract/cn/notification/service/NotificationConfiguration.java
new file mode 100644
index 0000000..c38d6bd
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/NotificationConfiguration.java
@@ -0,0 +1,103 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service;
+
+import org.apache.fineract.cn.anubis.config.EnableAnubis;
+import org.apache.fineract.cn.async.config.EnableAsync;
+import org.apache.fineract.cn.cassandra.config.EnableCassandra;
+import org.apache.fineract.cn.command.config.EnableCommandProcessing;
+import org.apache.fineract.cn.lang.config.EnableServiceException;
+import org.apache.fineract.cn.lang.config.EnableTenantContext;
+import org.apache.fineract.cn.mariadb.config.EnableMariaDB;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+import org.springframework.mail.javamail.JavaMailSender;
+import org.springframework.mail.javamail.JavaMailSenderImpl;
+import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
+
+import java.util.Properties;
+
+@SuppressWarnings("WeakerAccess")
+@Configuration
+@EnableAutoConfiguration
+@EnableDiscoveryClient
+@EnableAsync
+@EnableTenantContext
+@EnableCassandra
+@EnableMariaDB
+@EnableCommandProcessing
+@EnableAnubis
+@EnableServiceException
+@ConfigurationProperties(locations = {"details"})
+@ComponentScan({
+    "org.apache.fineract.cn.notification.service.rest",
+    "org.apache.fineract.cn.notification.service.internal.service",
+    "org.apache.fineract.cn.notification.service.internal.repository",
+    "org.apache.fineract.cn.notification.service.internal.command.handler"
+})
+@EnableJpaRepositories({
+    "org.apache.fineract.cn.notification.service.internal.repository"
+})
+public class NotificationConfiguration extends WebMvcConfigurerAdapter {
+
+  public NotificationConfiguration() {
+    super();
+  }
+
+  @Bean(name = ServiceConstants.LOGGER_NAME)
+  public Logger logger() {
+    return LoggerFactory.getLogger(ServiceConstants.LOGGER_NAME);
+  }
+
+  @Override
+  public void configurePathMatch(final PathMatchConfigurer configurer) {
+    configurer.setUseSuffixPatternMatch(Boolean.FALSE);
+  }
+
+
+
+  @Bean
+  @Qualifier("gmail")
+  public JavaMailSender getJavaMailSender() {
+
+    JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
+    mailSender.setHost("smtp.gmail.com");
+    mailSender.setPort(587);
+
+    mailSender.setUsername("ebenezergraham69@gmail.com");
+    mailSender.setPassword("fdzmzbhbmtkafzvq");
+
+    Properties props = mailSender.getJavaMailProperties();
+    props.put("mail.transport.protocol", "smtp");
+    props.put("mail.smtp.auth", "true");
+    props.put("mail.smtp.starttls.enable", "true");
+    props.put("mail.debug", "true");
+
+    return mailSender;
+  }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/ServiceConstants.java b/service/src/main/java/org/apache/fineract/cn/notification/service/ServiceConstants.java
new file mode 100644
index 0000000..cb4e902
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/ServiceConstants.java
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service;
+
+public interface ServiceConstants {
+  String LOGGER_NAME = "rest-logger";
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/command/InitializeServiceCommand.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/command/InitializeServiceCommand.java
new file mode 100644
index 0000000..21335ac
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/command/InitializeServiceCommand.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.command;
+
+public class InitializeServiceCommand {
+
+  public InitializeServiceCommand() {
+    super();
+  }
+
+  @Override
+  public String toString() {
+    return "InitializeServiceCommand{}";
+  }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/command/SampleCommand.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/command/SampleCommand.java
new file mode 100644
index 0000000..3fa3aac
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/command/SampleCommand.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.command;
+
+import org.apache.fineract.cn.notification.api.v1.domain.Sample;
+
+public class SampleCommand {
+
+  private final Sample sample;
+
+  public SampleCommand(final Sample sample) {
+    super();
+    this.sample = sample;
+  }
+
+  public Sample sample() {
+    return this.sample;
+  }
+
+  @Override
+  public String toString() {
+    return "SampleCommand{" +
+        "sample=" + sample.getIdentifier() +
+        '}';
+  }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/command/handler/MigrationAggregate.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/command/handler/MigrationAggregate.java
new file mode 100644
index 0000000..da7cc6e
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/command/handler/MigrationAggregate.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.command.handler;
+
+import org.apache.fineract.cn.notification.api.v1.events.NotificationEventConstants;
+import org.apache.fineract.cn.notification.service.ServiceConstants;
+import org.apache.fineract.cn.notification.service.internal.command.InitializeServiceCommand;
+import javax.sql.DataSource;
+import org.apache.fineract.cn.command.annotation.Aggregate;
+import org.apache.fineract.cn.command.annotation.CommandHandler;
+import org.apache.fineract.cn.command.annotation.CommandLogLevel;
+import org.apache.fineract.cn.command.annotation.EventEmitter;
+import org.apache.fineract.cn.lang.ApplicationName;
+import org.apache.fineract.cn.mariadb.domain.FlywayFactoryBean;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.transaction.annotation.Transactional;
+
+@SuppressWarnings({
+    "unused"
+})
+@Aggregate
+public class MigrationAggregate {
+
+  private final Logger logger;
+  private final DataSource dataSource;
+  private final FlywayFactoryBean flywayFactoryBean;
+  private final ApplicationName applicationName;
+
+  @Autowired
+  public MigrationAggregate(@Qualifier(ServiceConstants.LOGGER_NAME) final Logger logger,
+                            final DataSource dataSource,
+                            final FlywayFactoryBean flywayFactoryBean,
+                            final ApplicationName applicationName) {
+    super();
+    this.logger = logger;
+    this.dataSource = dataSource;
+    this.flywayFactoryBean = flywayFactoryBean;
+    this.applicationName = applicationName;
+  }
+
+  @CommandHandler(logStart = CommandLogLevel.INFO, logFinish = CommandLogLevel.INFO)
+  @Transactional
+  @EventEmitter(selectorName = NotificationEventConstants.SELECTOR_NAME, selectorValue = NotificationEventConstants.INITIALIZE)
+  public String initialize(final InitializeServiceCommand initializeServiceCommand) {
+    this.logger.debug("Start service migration.");
+    this.flywayFactoryBean.create(this.dataSource).migrate();
+    return this.applicationName.getVersionString();
+  }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/command/handler/SampleAggregate.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/command/handler/SampleAggregate.java
new file mode 100644
index 0000000..a21589d
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/command/handler/SampleAggregate.java
@@ -0,0 +1,68 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.command.handler;
+
+import org.apache.fineract.cn.notification.api.v1.events.NotificationEventConstants;
+import org.apache.fineract.cn.notification.service.internal.command.SampleCommand;
+import org.apache.fineract.cn.command.annotation.Aggregate;
+import org.apache.fineract.cn.command.annotation.CommandHandler;
+import org.apache.fineract.cn.command.annotation.CommandLogLevel;
+import org.apache.fineract.cn.command.annotation.EventEmitter;
+import org.apache.fineract.cn.notification.service.internal.repository.SampleJpaEntity;
+import org.apache.fineract.cn.notification.service.internal.repository.SampleJpaEntityRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+
+@SuppressWarnings("unused")
+@Aggregate
+public class SampleAggregate {
+
+  private final SampleJpaEntityRepository sampleJpaEntityRepository;
+
+  @Autowired
+  public SampleAggregate(final SampleJpaEntityRepository sampleJpaEntityRepository) {
+    super();
+    this.sampleJpaEntityRepository = sampleJpaEntityRepository;
+  }
+
+  //TODO: Think about your command handler logging, then delete this comment.
+  // The log levels provided in the command handler cause log messages to be emitted each time this
+  // command handler is called before and after the call. Before the call, the command is logged
+  // using its toString() method, and after the call, the emitted event is logged via its toString()
+  // method.
+  //
+  // If you wish to adjust the information in the log messages, do so via the toString() methods.
+  // Financial transactions, passwords, and customer address data are examples of information which
+  // should not be placed in the logs.
+  //
+  // If a command handler should not emit a log message, change logStart and logFinish to:
+  // CommandLogLevel.NONE.
+  @CommandHandler(logStart = CommandLogLevel.INFO, logFinish = CommandLogLevel.INFO)
+  @Transactional
+  @EventEmitter(selectorName = NotificationEventConstants.SELECTOR_NAME, selectorValue = NotificationEventConstants.POST_SAMPLE)
+  public String sample(final SampleCommand sampleCommand) {
+
+    final SampleJpaEntity entity = new SampleJpaEntity();
+    entity.setIdentifier(sampleCommand.sample().getIdentifier());
+    entity.setPayload(sampleCommand.sample().getPayload());
+    this.sampleJpaEntityRepository.save(entity);
+
+    return sampleCommand.sample().getIdentifier();
+  }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/mapper/EmailConfigurationMapper.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/mapper/EmailConfigurationMapper.java
new file mode 100644
index 0000000..10e4a86
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/mapper/EmailConfigurationMapper.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.mapper;
+
+import org.apache.fineract.cn.notification.api.v1.domain.EmailConfiguration;
+import org.apache.fineract.cn.notification.service.internal.repository.EmailGatewayConfiguration;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class EmailConfigurationMapper {
+
+  private EmailConfigurationMapper() {
+    super();
+  }
+
+  public static EmailConfiguration map(final EmailGatewayConfiguration emailGatewayConfiguration) {
+    final EmailConfiguration emailConfiguration = new EmailConfiguration();
+    emailConfiguration.setIdentifier(emailGatewayConfiguration.getIdentifier());
+    emailConfiguration.setHost(emailGatewayConfiguration.getHost());
+    emailConfiguration.setPort(emailGatewayConfiguration.getPort());
+    emailConfiguration.setUsername(emailGatewayConfiguration.getUsername());
+    emailConfiguration.setApp_id(emailGatewayConfiguration.getApp_id());
+    return emailConfiguration;
+  }
+
+//  public static List<EmailGatewayConfiguration> map(final List<EmailGatewayConfiguration> emailGatewayConfiguration) {
+//    final ArrayList<EmailGatewayConfiguration> entities = new ArrayList<>(emailGatewayConfiguration.size());
+//    entities.addAll(emailGatewayConfiguration.stream().map(EmailGatewayConfiguration::map).collect(Collectors.toList()));
+//    return entities;
+//  }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/mapper/SMSConfigurationMapper.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/mapper/SMSConfigurationMapper.java
new file mode 100644
index 0000000..43e6c1c
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/mapper/SMSConfigurationMapper.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.mapper;
+
+import org.apache.fineract.cn.notification.api.v1.domain.SMSConfiguration;
+import org.apache.fineract.cn.notification.service.internal.repository.SMSGatewayConfiguration;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class SMSConfigurationMapper {
+
+  private SMSConfigurationMapper() {
+    super();
+  }
+
+  public static SMSConfiguration map(final SMSGatewayConfiguration smsGatewayConfiguration) {
+    final SMSConfiguration smsConfiguration = new SMSConfiguration();
+    smsConfiguration.setIdentifier(smsGatewayConfiguration.getIdentifier());
+    smsConfiguration.setAccountid(smsGatewayConfiguration.getAccountid());
+    smsConfiguration.setAuth_token(smsGatewayConfiguration.getAuth_token());
+    return smsConfiguration;
+  }
+
+//  public static List<SMSGatewayConfiguration> map(final List<SMSGatewayConfiguration> smsGatewayConfiguration) {
+//    final ArrayList<SMSGatewayConfiguration> entities = new ArrayList<>(smsGatewayConfiguration.size());
+//    entities.addAll(smsGatewayConfiguration.stream().map(SMSConfigurationMapper::map).collect(Collectors.toList()));
+//    return entities;
+//  }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/mapper/SampleMapper.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/mapper/SampleMapper.java
new file mode 100644
index 0000000..a56b7aa
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/mapper/SampleMapper.java
@@ -0,0 +1,46 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.mapper;
+
+import org.apache.fineract.cn.notification.api.v1.domain.Sample;
+import org.apache.fineract.cn.notification.service.internal.repository.SampleJpaEntity;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class SampleMapper {
+
+  private SampleMapper() {
+    super();
+  }
+
+  public static Sample map(final SampleJpaEntity sampleJpaEntity) {
+    final Sample sample = new Sample();
+    sample.setIdentifier(sampleJpaEntity.getIdentifier());
+    sample.setPayload(sampleJpaEntity.getPayload());
+    return sample;
+  }
+
+  public static List<Sample> map(final List<SampleJpaEntity> sampleJpaEntities) {
+    final ArrayList<Sample> samples = new ArrayList<>(sampleJpaEntities.size());
+    samples.addAll(sampleJpaEntities.stream().map(SampleMapper::map).collect(Collectors.toList()));
+    return samples;
+  }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/EmailGatewayConfiguration.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/EmailGatewayConfiguration.java
new file mode 100644
index 0000000..c344708
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/EmailGatewayConfiguration.java
@@ -0,0 +1,124 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.repository;
+
+import javax.persistence.*;
+
+@SuppressWarnings("unused")
+@Entity
+@Table(name = "email_gateway_configuration")
+public class EmailGatewayConfiguration {
+
+  @Id
+  @GeneratedValue(strategy = GenerationType.IDENTITY)
+  @Column(name = "id")
+  private Long id;
+  @Column(name = "identifier")
+  private String identifier;
+  @Column(name = "host")
+  private String host;
+  @Column(name = "port")
+  private String port;
+  @Column(name = "username")
+  private String username;
+  @Column(name = "app_id")
+  private String app_id;
+  @Column(name = "smtp_auth")
+  private String smtp_auth;
+  @Column(name = "start_tls")
+  private String start_tls;
+  @Column(name = "option")
+  private String option;
+
+  public EmailGatewayConfiguration() {
+    super();
+  }
+
+  public Long getId() {
+    return id;
+  }
+
+  public void setId(Long id) {
+    this.id = id;
+  }
+
+  public String getIdentifier() {
+    return this.identifier;
+  }
+
+  public void setIdentifier(final String identifier) {
+    this.identifier = identifier;
+  }
+
+  public String getHost() {
+    return host;
+  }
+
+  public void setHost(String host) {
+    this.host = host;
+  }
+
+  public String getPort() {
+    return port;
+  }
+
+  public void setPort(String port) {
+    this.port = port;
+  }
+
+  public String getUsername() {
+    return username;
+  }
+
+  public void setUsername(String username) {
+    this.username = username;
+  }
+
+  public String getApp_id() {
+    return app_id;
+  }
+
+  public void setApp_id(String app_id) {
+    this.app_id = app_id;
+  }
+
+  public String getSmtp_auth() {
+    return smtp_auth;
+  }
+
+  public void setSmtp_auth(String smtp_auth) {
+    this.smtp_auth = smtp_auth;
+  }
+
+  public String getStart_tls() {
+    return start_tls;
+  }
+
+  public void setStart_tls(String start_tls) {
+    this.start_tls = start_tls;
+  }
+
+  public String getOption() {
+    return option;
+  }
+
+  public void setOption(String option) {
+    this.option = option;
+  }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/EmailGatewayConfigurationRepository.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/EmailGatewayConfigurationRepository.java
new file mode 100644
index 0000000..b380def
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/EmailGatewayConfigurationRepository.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.repository;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.Optional;
+
+@Repository
+public interface EmailGatewayConfigurationRepository extends JpaRepository<EmailGatewayConfiguration, Long> {
+  Optional<EmailGatewayConfiguration> findByIdentifier(String identifier);
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/SMSGatewayConfiguration.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/SMSGatewayConfiguration.java
new file mode 100644
index 0000000..770db6a
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/SMSGatewayConfiguration.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.repository;
+
+import javax.persistence.*;
+
+@SuppressWarnings("unused")
+@Entity
+@Table(name = "sms_gateway_configuration")
+public class SMSGatewayConfiguration {
+
+  @Id
+  @GeneratedValue(strategy = GenerationType.IDENTITY)
+  @Column(name = "id")
+  private Long id;
+  @Column(name = "identifier")
+  private String identifier;
+  @Column(name = "organisation")
+  private String organisation;
+  @Column(name = "auth_token")
+  private String auth_token;
+  @Column(name = "accountid")
+  private String accountid;
+  @Column(name = "option")
+  private String option;
+
+  public SMSGatewayConfiguration() {
+    super();
+  }
+
+  public Long getId() {
+    return id;
+  }
+
+  public void setId(Long id) {
+    this.id = id;
+  }
+
+  public String getIdentifier() {
+    return this.identifier;
+  }
+
+  public void setIdentifier(final String identifier) {
+    this.identifier = identifier;
+  }
+
+  public String getOrganisation() {
+    return organisation;
+  }
+
+  public void setOrganisation(String organisation) {
+    this.organisation = organisation;
+  }
+
+  public String getAuth_token() {
+    return auth_token;
+  }
+
+  public void setAuth_token(String auth_token) {
+    this.auth_token = auth_token;
+  }
+
+  public String getAccountid() {
+    return accountid;
+  }
+
+  public void setAccountid(String accountid) {
+    this.accountid = accountid;
+  }
+
+  public String getOption() {
+    return option;
+  }
+
+  public void setOption(String option) {
+    this.option = option;
+  }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/SMSGatewayConfigurationRepository.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/SMSGatewayConfigurationRepository.java
new file mode 100644
index 0000000..7daae78
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/SMSGatewayConfigurationRepository.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.repository;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.Optional;
+
+@Repository
+public interface SMSGatewayConfigurationRepository extends JpaRepository<SMSGatewayConfiguration, Long> {
+  Optional<SMSGatewayConfiguration> findByIdentifier(String identifier);
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/SampleJpaEntity.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/SampleJpaEntity.java
new file mode 100644
index 0000000..f740d85
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/SampleJpaEntity.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.repository;
+
+import javax.persistence.*;
+
+@SuppressWarnings("unused")
+@Entity
+@Table(name = "template_samples")
+public class SampleJpaEntity {
+
+  @Id
+  @GeneratedValue(strategy = GenerationType.IDENTITY)
+  @Column(name = "id")
+  private Long id;
+  @Column(name = "identifier")
+  private String identifier;
+  @Column(name = "payload")
+  private String payload;
+
+  public SampleJpaEntity() {
+    super();
+  }
+
+  public Long getId() {
+    return id;
+  }
+
+  public void setId(Long id) {
+    this.id = id;
+  }
+
+  public String getIdentifier() {
+    return this.identifier;
+  }
+
+  public void setIdentifier(final String identifier) {
+    this.identifier = identifier;
+  }
+
+  public String getPayload() {
+    return payload;
+  }
+
+  public void setPayload(String payload) {
+    this.payload = payload;
+  }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/SampleJpaEntityRepository.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/SampleJpaEntityRepository.java
new file mode 100644
index 0000000..b4d8abd
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/SampleJpaEntityRepository.java
@@ -0,0 +1,28 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.repository;
+
+import java.util.Optional;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+@Repository
+public interface SampleJpaEntityRepository extends JpaRepository<SampleJpaEntity, Long> {
+  Optional<SampleJpaEntity> findByIdentifier(String identifier);
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/EmailSender.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/EmailSender.java
new file mode 100644
index 0000000..bebb3c9
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/EmailSender.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.service;
+
+
+import org.apache.fineract.cn.notification.service.internal.mapper.EmailConfigurationMapper;
+import org.apache.fineract.cn.notification.service.internal.repository.EmailGatewayConfiguration;
+import org.apache.fineract.cn.notification.service.internal.repository.EmailGatewayConfigurationRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.mail.SimpleMailMessage;
+import org.springframework.mail.javamail.JavaMailSender;
+import org.springframework.stereotype.Service;
+
+import java.util.Optional;
+
+@Service
+public class EmailSender {
+
+    @Autowired
+    @Qualifier("gmail")
+    private JavaMailSender sender;
+
+    private final EmailGatewayConfigurationRepository emailGatewayConfigurationRepository;
+
+    @Autowired
+    public EmailSender(final EmailGatewayConfigurationRepository emailGatewayConfigurationRepository) {
+        super();
+        this.emailGatewayConfigurationRepository = emailGatewayConfigurationRepository;
+    }
+
+//    public Optional<EmailGatewayConfiguration> findByIdentifier(final String identifier) {
+//        return this.emailGatewayConfigurationRepository.findByIdentifier(identifier).map(EmailGatewayConfiguration::map);
+//    }
+
+    public void sendEmail(String to, String subject, String message) {
+        SimpleMailMessage mail = new SimpleMailMessage();
+        mail.setTo(to);
+        mail.setSubject(subject);
+        mail.setText(message);
+        sender.send(mail);
+    }
+
+}
\ No newline at end of file
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/SMSSender.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/SMSSender.java
new file mode 100644
index 0000000..d626b22
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/SMSSender.java
@@ -0,0 +1,58 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.service;
+
+
+import com.twilio.Twilio;
+import com.twilio.rest.api.v2010.account.Message;
+import com.twilio.type.PhoneNumber;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
+import com.twilio.rest.api.v2010.account.MessageCreator;
+import org.springframework.stereotype.Service;
+
+@Service
+@ConfigurationProperties(prefix ="smssender")
+public class SMSSender {
+
+    //@Value(value = "${smssender.accountSID}")
+    public String ACCOUNT_SID = "AC1fde2c6f26f367b93231c5fdb944c908";
+
+    //@Value("${smssender.authToken}")
+    public String AUTH_TOKEN = "bc9a53e41745b8471e0ecafc859d86aa";
+
+    //@Value("${smssender.senderNumber}")
+    public String sender = "+1 510-944-1898";
+
+    //@Value("${fineract.customer.accountcreated}")
+
+    public String template = "Test from the demo-server";
+
+    public void sendSMS(String receiver, String template) {
+
+        Twilio.init(ACCOUNT_SID, AUTH_TOKEN);
+
+        MessageCreator messageCreator = Message.creator(ACCOUNT_SID,new PhoneNumber(receiver), new PhoneNumber(sender), template);
+        Message message = messageCreator.create();
+        System.out.println(message.getSid());
+        System.out.println(message.getStatus());
+    }
+
+    }
\ No newline at end of file
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/SampleService.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/SampleService.java
new file mode 100644
index 0000000..a0e4f71
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/SampleService.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.service;
+
+import org.apache.fineract.cn.notification.api.v1.domain.Sample;
+import org.apache.fineract.cn.notification.service.internal.mapper.SampleMapper;
+import org.apache.fineract.cn.notification.service.internal.repository.SampleJpaEntityRepository;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Optional;
+
+@Service
+public class SampleService {
+
+  private final SampleJpaEntityRepository sampleJpaEntityRepository;
+
+  @Autowired
+  public SampleService(final SampleJpaEntityRepository sampleJpaEntityRepository) {
+    super();
+    this.sampleJpaEntityRepository = sampleJpaEntityRepository;
+  }
+
+  public List<Sample> findAllEntities() {
+    return SampleMapper.map(this.sampleJpaEntityRepository.findAll());
+  }
+
+  public Optional<Sample> findByIdentifier(final String identifier) {
+    return this.sampleJpaEntityRepository.findByIdentifier(identifier).map(SampleMapper::map);
+  }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/AccountingEventListener.java b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/AccountingEventListener.java
new file mode 100644
index 0000000..9266b89
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/AccountingEventListener.java
@@ -0,0 +1,124 @@
+ /*
+         * Licensed to the Apache Software Foundation (ASF) under one
+         * or more contributor license agreements.  See the NOTICE file
+         * distributed with this work for additional information
+         * regarding copyright ownership.  The ASF licenses this file
+         * to you under the Apache License, Version 2.0 (the
+         * "License"); you may not use this file except in compliance
+         * with the License.  You may obtain a copy of the License at
+         *
+         *   http://www.apache.org/licenses/LICENSE-2.0
+         *
+         * Unless required by applicable law or agreed to in writing,
+         * software distributed under the License is distributed on an
+         * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+         * KIND, either express or implied.  See the License for the
+         * specific language governing permissions and limitations
+         * under the License.
+         */
+/*
+        package org.apache.fineract.cn.notification.service.listener;
+
+        import org.apache.fineract.cn.lang.config.TenantHeaderFilter;
+        import org.apache.fineract.cn.accounting.service.internal.service.AccountService;
+        import org.apache.fineract.cn.notification.service.internal.service.EmailSender;
+        import org.apache.fineract.cn.notification.service.internal.service.SMSSender;
+        import org.springframework.beans.factory.annotation.Autowired;
+        import org.springframework.jms.annotation.JmsListener;
+        import org.springframework.messaging.handler.annotation.Header;
+        import org.springframework.stereotype.Component;
+        import org.apache.fineract.cn.accounting.api.v1.EventConstants;
+
+
+@SuppressWarnings("unused")
+@Component
+public class AccountingEventListener {
+
+
+    @Autowired
+    public AccountingEventListener( final AccountService accountingManager) {
+        this.accountService = accountingManager;
+    }
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_POST_ACCOUNT,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onCreateAccount(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant, final String payload) {
+        accountService.findAccount(tenant);
+        String receiver = "";
+        String template = "";
+        smsSender.sendSMS(receiver,template);
+        emailSender.sendEmail(receiver,"Hello", "You account has been created");
+    }
+
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_PUT_ACCOUNT,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onChangeAccount(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                final String payload) {
+        this.logger.debug("Account modified.");
+        this.eventRecorder.event(tenant, EventConstants.PUT_ACCOUNT, payload, String.class);
+    }
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_CLOSE_ACCOUNT,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onCloseAccount(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                               final String payload) {
+        this.logger.debug("Account closed.");
+        this.eventRecorder.event(tenant, EventConstants.CLOSE_ACCOUNT, payload, String.class);
+    }
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_LOCK_ACCOUNT,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onLockAccount(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                              final String payload) {
+        this.logger.debug("Account locked.");
+        this.eventRecorder.event(tenant, EventConstants.LOCK_ACCOUNT, payload, String.class);
+    }
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_UNLOCK_ACCOUNT,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onUnlockAccount(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                final String payload) {
+        this.logger.debug("Account unlocked.");
+        this.eventRecorder.event(tenant, EventConstants.UNLOCK_ACCOUNT, payload, String.class);
+    }
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_REOPEN_ACCOUNT,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onReopenAccount(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                final String payload) {
+        this.logger.debug("Account reopened.");
+        this.eventRecorder.event(tenant, EventConstants.REOPEN_ACCOUNT, payload, String.class);
+    }
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_DELETE_ACCOUNT,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onDeleteAccount(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                final String payload) {
+        this.logger.debug("Account deleted.");
+        this.eventRecorder.event(tenant, EventConstants.DELETE_ACCOUNT, payload, String.class);
+    }
+
+}
+ */
\ No newline at end of file
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/ChequeEventListener.java b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/ChequeEventListener.java
new file mode 100644
index 0000000..97dd5e2
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/ChequeEventListener.java
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+package org.apache.fineract.cn.notification.service.listener;
+
+import org.apache.fineract.cn.cheque.AbstractChequeTest;
+import org.apache.fineract.cn.cheque.api.v1.EventConstants;
+import org.apache.fineract.cn.lang.config.TenantHeaderFilter;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.jms.annotation.JmsListener;
+import org.springframework.messaging.handler.annotation.Header;
+import org.springframework.stereotype.Component;
+
+@Component
+public class ChequeEventListener {
+
+    private final Logger logger;
+
+    public ChequeEventListener(@Qualifier(AbstractChequeTest.TEST_LOGGER) final Logger logger) {
+        super();
+        this.logger = logger;
+    }
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_ISSUE_CHEQUES,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onIssueCheques(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                               final String payload) {
+        this.logger.debug("Cheques issued.");
+    }
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_CHEQUE_TRANSACTION,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onChequeTransaction(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                    final String payload) {
+        this.logger.debug("Cheque transaction processed.");
+        this.eventRecorder.event(tenant, EventConstants.CHEQUE_TRANSACTION, payload, String.class);
+    }
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_CHEQUE_TRANSACTION_APPROVED,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onChequeApproved(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                 final String payload) {
+        this.logger.debug("Cheque transaction approved.");
+        this.eventRecorder.event(tenant, EventConstants.CHEQUE_TRANSACTION_APPROVED, payload, String.class);
+    }
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_CHEQUE_TRANSACTION_CANCELED,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onChequeCanceled(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                 final String payload) {
+        this.logger.debug("Cheque transaction canceled.");
+        this.eventRecorder.event(tenant, EventConstants.CHEQUE_TRANSACTION_CANCELED, payload, String.class);
+    }
+
+}
+*/
\ No newline at end of file
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/CustomerEventListener.java b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/CustomerEventListener.java
new file mode 100644
index 0000000..73d3d1d
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/CustomerEventListener.java
@@ -0,0 +1,200 @@
+    /*
+     * Licensed to the Apache Software Foundation (ASF) under one
+     * or more contributor license agreements.  See the NOTICE file
+     * distributed with this work for additional information
+     * regarding copyright ownership.  The ASF licenses this file
+     * to you under the Apache License, Version 2.0 (the
+     * "License"); you may not use this file except in compliance
+     * with the License.  You may obtain a copy of the License at
+     *
+     *   http://www.apache.org/licenses/LICENSE-2.0
+     *
+     * Unless required by applicable law or agreed to in writing,
+     * software distributed under the License is distributed on an
+     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+     * KIND, either express or implied.  See the License for the
+     * specific language governing permissions and limitations
+     * under the License.
+     */
+
+package org.apache.fineract.cn.notification.service.listener;
+
+import org.apache.fineract.cn.customer.api.v1.CustomerEventConstants;
+import org.apache.fineract.cn.lang.config.TenantHeaderFilter;
+import org.apache.fineract.cn.customer.api.v1.client.CustomerManager;
+import org.apache.fineract.cn.customer.api.v1.domain.ContactDetail;
+import org.apache.fineract.cn.customer.api.v1.domain.Customer;
+import org.apache.fineract.cn.notification.service.internal.service.EmailSender;
+import org.apache.fineract.cn.notification.service.internal.service.SMSSender;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jms.annotation.JmsListener;
+import org.springframework.messaging.handler.annotation.Header;
+import org.springframework.stereotype.Component;
+
+
+@Component
+public class CustomerEventListener {
+
+        private CustomerManager customerManager;
+        private SMSSender smsSender;
+        private EmailSender emailSender;
+
+        @Autowired
+        public CustomerEventListener( final CustomerManager customerManager, SMSSender smsSender,
+                                 final EmailSender emailSender ) {
+            this.customerManager = customerManager;
+            this.smsSender = smsSender;
+            this.emailSender = emailSender;
+        }
+
+        @JmsListener(
+                destination = CustomerEventConstants.DESTINATION,
+                selector = CustomerEventConstants.SELECTOR_POST_CUSTOMER
+        )
+        public void customerCreatedEvent(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                         final String payload) {
+
+            Customer customer = customerManager.findCustomer(payload);
+            if (customer.getContactDetails().size() > 0) {
+                customer.getContactDetails().forEach(contactDetail -> {
+                    if (contactDetail.getType().equals(ContactDetail.Type.PHONE)) {
+                        String receiverNumber = customer.getContactDetails().get(0).getValue();
+                        // TODO: pass receiver number for templating and localization.
+                        smsSender.sendSMS(receiverNumber, "Dear Valued Customer, Your account has been created");
+                    } else if (contactDetail.getType().equals(ContactDetail.Type.EMAIL)) {
+                        String emailAddress = customer.getContactDetails().get(0).getValue();
+                        // TODO: pass email address for templating and localization.
+                        emailSender.sendEmail(emailAddress, "Account created", "Dear Valued Customer, Your account has been created");
+                    }
+                });
+            }
+        }
+
+    @JmsListener(
+            destination = CustomerEventConstants.DESTINATION,
+            selector = CustomerEventConstants.SELECTOR_ACTIVATE_CUSTOMER
+    )
+    public void customerActivatedEvent(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                       final String payload) {
+        Customer customer = customerManager.findCustomer(payload);
+        if(customer.getCurrentState().equalsIgnoreCase("ACTIVE")){
+            customer.getContactDetails().forEach(contact-> {
+                if (contact.getType().equals(ContactDetail.Type.PHONE)) {
+                String receiverNumber = customer.getContactDetails().get(0).getValue();
+                smsSender.sendSMS(receiverNumber, "Dear Valued Customer, Your account has been Activated");
+            } else if (contact.getType().equals(ContactDetail.Type.EMAIL)) {
+                String emailAddress = customer.getContactDetails().get(0).getValue();
+                // TODO: pass email address for templating and localization.
+                emailSender.sendEmail(emailAddress, "Account created", "Dear Valued Customer, Your account has been Activated");
+            }
+            });
+        }
+    }
+
+    @JmsListener(
+            destination = CustomerEventConstants.DESTINATION,
+            selector = CustomerEventConstants.SELECTOR_LOCK_CUSTOMER
+    )
+    public void customerLockedEvent(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                    final String payload) {
+        Customer customer = customerManager.findCustomer(payload);
+        if(customer.getCurrentState().equalsIgnoreCase("LOCKED")){
+            customer.getContactDetails().forEach(contact-> {
+                if (contact.getType().equals(ContactDetail.Type.PHONE)) {
+                    String receiverNumber = customer.getContactDetails().get(0).getValue();
+                    smsSender.sendSMS(receiverNumber, "Dear Valued Customer, Your account has been Locked");
+                } else if (contact.getType().equals(ContactDetail.Type.EMAIL)) {
+                    String emailAddress = customer.getContactDetails().get(0).getValue();
+                    // TODO: pass email address for templating and localization.
+                    emailSender.sendEmail(emailAddress, "Account created", "Dear Valued Customer, Your account has been Locked");
+                }
+            });
+        }
+    }
+
+    @JmsListener(
+            destination = CustomerEventConstants.DESTINATION,
+            selector = CustomerEventConstants.SELECTOR_UNLOCK_CUSTOMER
+    )
+    public void customerUnlockedEvent(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                      final String payload) {
+        Customer customer = customerManager.findCustomer(payload);
+        if(customer.getCurrentState().equalsIgnoreCase("LOCKED")){
+            customer.getContactDetails().forEach(contact-> {
+                if (contact.getType().equals(ContactDetail.Type.PHONE)) {
+                    String receiverNumber = customer.getContactDetails().get(0).getValue();
+                    smsSender.sendSMS(receiverNumber, "Dear Valued Customer, Your account has been Unlocked");
+                } else if (contact.getType().equals(ContactDetail.Type.EMAIL)) {
+                    String emailAddress = customer.getContactDetails().get(0).getValue();
+                    // TODO: pass email address for templating and localization.
+                    emailSender.sendEmail(emailAddress, "Account created", "Dear Valued Customer, Your account has been Unlocked");
+                }
+            });
+        }
+    }
+
+    @JmsListener(
+            destination = CustomerEventConstants.DESTINATION,
+            selector = CustomerEventConstants.SELECTOR_CLOSE_CUSTOMER
+    )
+    public void customerClosedEvent(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                    final String payload) {
+        Customer customer = customerManager.findCustomer(payload);
+        if(customer.getCurrentState().equalsIgnoreCase("CLOSED")){
+            customer.getContactDetails().forEach(contact-> {
+                if (contact.getType().equals(ContactDetail.Type.PHONE)) {
+                    String receiverNumber = customer.getContactDetails().get(0).getValue();
+                    smsSender.sendSMS(receiverNumber, "Dear Valued Customer, Your account has been Closed");
+                } else if (contact.getType().equals(ContactDetail.Type.EMAIL)) {
+                    String emailAddress = customer.getContactDetails().get(0).getValue();
+                    // TODO: pass email address for templating and localization.
+                    emailSender.sendEmail(emailAddress, "Account created", "Dear Valued Customer, Your account has been Closed");
+                }
+            });
+        }
+    }
+
+    @JmsListener(
+            destination = CustomerEventConstants.DESTINATION,
+            selector = CustomerEventConstants.SELECTOR_REOPEN_CUSTOMER
+    )
+    public void customerReopenedEvent(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                      final String payload) {
+        Customer customer = customerManager.findCustomer(payload);
+        if(customer.getCurrentState().equalsIgnoreCase("LOCKED")){
+            customer.getContactDetails().forEach(contact-> {
+                if (contact.getType().equals(ContactDetail.Type.PHONE)) {
+                    String receiverNumber = customer.getContactDetails().get(0).getValue();
+                    smsSender.sendSMS(receiverNumber, "Dear Valued Customer, Your account has been reopened");
+                } else if (contact.getType().equals(ContactDetail.Type.EMAIL)) {
+                    String emailAddress = customer.getContactDetails().get(0).getValue();
+                    // TODO: pass email address for templating and localization.
+                    emailSender.sendEmail(emailAddress, "Account Reopened", "Dear Valued Customer, Your account has been reopened");
+                }
+            });
+        }
+    }
+    
+/*
+
+    @JmsListener(
+            destination = CustomerEventConstants.DESTINATION,
+            selector = CustomerEventConstants.SELECTOR_PUT_ADDRESS
+    )
+    public void addressChangedEvent(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                    final String payload) {
+        this.eventRecorder.event(tenant, CustomerEventConstants.PUT_ADDRESS, payload, String.class);
+    }
+
+    @JmsListener(
+            destination = CustomerEventConstants.DESTINATION,
+            selector = CustomerEventConstants.SELECTOR_PUT_IDENTIFICATION_CARD
+    )
+    public void identificationCardChangedEvent(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                               final String payload) {
+        this.eventRecorder.event(tenant, CustomerEventConstants.PUT_IDENTIFICATION_CARD, payload, String.class);
+    }
+
+
+*/
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/DepositEventListener.java b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/DepositEventListener.java
new file mode 100644
index 0000000..fa66ace
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/DepositEventListener.java
@@ -0,0 +1,61 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+package org.apache.fineract.cn.deposit.listener;
+
+import org.apache.fineract.cn.deposit.api.v1.EventConstants;
+import org.apache.fineract.cn.lang.config.TenantHeaderFilter;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.jms.annotation.JmsListener;
+import org.springframework.messaging.handler.annotation.Header;
+import org.springframework.stereotype.Component;
+
+@Component
+public class DepositEventListener {
+
+
+    @Autowired
+    public DepositEventListener() {
+        super();
+    }
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_INTEREST_ACCRUED,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onAccrual(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                          final String payload) {
+    }
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_DIVIDEND_DISTRIBUTION,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onDividendDistribution(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                       final String payload) {
+        this.logger.debug("Dividend distributed for product {}.", payload);
+        this.eventRecorder.event(tenant, EventConstants.DIVIDEND_DISTRIBUTION, payload, String.class);
+    }
+
+}
+*/
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/IdentityEventListener.java b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/IdentityEventListener.java
new file mode 100644
index 0000000..142f138
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/IdentityEventListener.java
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+package org.apache.fineract.cn.notification.service.listener;
+
+import org.apache.fineract.cn.identity.api.v1.events.EventConstants;
+import org.apache.fineract.cn.lang.config.TenantHeaderFilter;
+import org.apache.fineract.cn.test.listener.EventRecorder;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jms.annotation.JmsListener;
+import org.springframework.messaging.handler.annotation.Header;
+import org.springframework.stereotype.Component;
+
+@Component
+public class IdentityEventListener {
+
+    private IdentityManager identityManager;
+
+    @Autowired
+    public IdentityEventListener( final IdentityManager identityManager) {
+        this.identityManager = identityManager;
+    }
+
+
+    @JmsListener(
+            subscription = EventConstants.DESTINATION,
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_POST_USER
+    )
+    public void onCreateUser(
+            @Header(TenantHeaderFilter.TENANT_HEADER)final String tenant,
+            final String payload) throws Exception {
+        eventRecorder.event(tenant, EventConstants.OPERATION_POST_USER, payload, String.class);
+    }
+
+    @JmsListener(
+            subscription = EventConstants.DESTINATION,
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_PUT_USER_ROLEIDENTIFIER
+    )
+    public void onChangeUserRole(
+            @Header(TenantHeaderFilter.TENANT_HEADER)final String tenant,
+            final String payload) throws Exception {
+        eventRecorder.event(tenant, EventConstants.OPERATION_PUT_USER_ROLEIDENTIFIER, payload, String.class);
+    }
+
+    @JmsListener(
+            subscription = EventConstants.DESTINATION,
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_PUT_USER_PASSWORD
+    )
+    public void onChangeUserPassword(
+            @Header(TenantHeaderFilter.TENANT_HEADER)final String tenant,
+            final String payload) throws Exception {
+        eventRecorder.event(tenant, EventConstants.OPERATION_PUT_USER_PASSWORD, payload, String.class);
+    }
+
+    @JmsListener(
+            subscription = EventConstants.DESTINATION,
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_AUTHENTICATE
+    )
+    public void onAuthentication(
+            @Header(TenantHeaderFilter.TENANT_HEADER)final String tenant,
+            final String payload) throws Exception {
+        eventRecorder.event(tenant, EventConstants.OPERATION_AUTHENTICATE, payload, String.class);
+    }
+
+
+}
+*/
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/OfficeEventListener.java b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/OfficeEventListener.java
new file mode 100644
index 0000000..9f083c5
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/OfficeEventListener.java
@@ -0,0 +1,136 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.fineract.cn.notification.service.listener;
+
+import org.apache.fineract.cn.notification.service.internal.service.EmailSender;
+import org.apache.fineract.cn.notification.service.internal.service.SMSSender;
+import org.apache.fineract.cn.office.api.v1.EventConstants;
+import org.apache.fineract.cn.lang.config.TenantHeaderFilter;
+import org.apache.fineract.cn.office.api.v1.client.OrganizationManager;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jms.annotation.JmsListener;
+import org.springframework.messaging.handler.annotation.Header;
+import org.springframework.stereotype.Component;
+
+@Component
+public class OfficeEventListener {
+
+	private OrganizationManager organizationManager;
+	private SMSSender smsSender;
+	private EmailSender emailSender;
+
+	@Autowired
+	public OfficeEventListener(final OrganizationManager organizationManager, SMSSender smsSender,
+	                           final EmailSender emailSender) {
+		this.organizationManager = organizationManager;
+		this.smsSender = smsSender;
+		this.emailSender = emailSender;
+	}
+
+	@JmsListener(
+			subscription = EventConstants.DESTINATION,
+			destination = EventConstants.DESTINATION,
+			selector = EventConstants.SELECTOR_POST_OFFICE
+	)
+	public void onCreateOffice(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+	                           final String payload) {
+		//for testing purposes
+		String office = this.organizationManager.findOfficeByIdentifier(payload).getName();
+		if (office.equalsIgnoreCase("Head Office")) {
+			smsSender.sendSMS("+23058409206", "Test From Demo");
+		}
+	}
+}
+
+/*
+	@JmsListener(
+            subscription = EventConstants.DESTINATION,
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_POST_EMPLOYEE
+    )
+    public void onCreateEmployee(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                 final String eventPayload) throws Exception {
+        this.eventRecorder.event(tenant, EventConstants.OPERATION_POST_EMPLOYEE, eventPayload, String.class);
+    }
+
+    @JmsListener(
+            subscription = EventConstants.DESTINATION,
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_PUT_EMPLOYEE
+    )
+    public void onUpdateEmployee(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                 final String eventPayload) throws Exception {
+        this.eventRecorder.event(tenant, EventConstants.OPERATION_PUT_EMPLOYEE, eventPayload, String.class);
+    }
+
+    @JmsListener(
+            subscription = EventConstants.DESTINATION,
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_DELETE_EMPLOYEE
+    )
+    public void onDeleteEmployee(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                 final String eventPayload) throws Exception {
+        this.eventRecorder.event(tenant, EventConstants.OPERATION_DELETE_EMPLOYEE, eventPayload, String.class);
+    }
+
+    @JmsListener(
+            subscription = EventConstants.DESTINATION,
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_PUT_CONTACT_DETAIL
+    )
+    public void onSetContactDetail(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                   final String eventPayload) throws Exception {
+        this.eventRecorder.event(tenant, EventConstants.OPERATION_PUT_CONTACT_DETAIL, eventPayload, String.class);
+    }
+
+    @JmsListener(
+            subscription = EventConstants.DESTINATION,
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_DELETE_CONTACT_DETAIL
+    )
+    public void onDeleteContactDetail(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                      final String eventPayload) throws Exception {
+        this.eventRecorder.event(tenant, EventConstants.OPERATION_DELETE_CONTACT_DETAIL, eventPayload, String.class);
+    }
+
+    @JmsListener(
+            subscription = EventConstants.DESTINATION,
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_DELETE_OFFICE
+    )
+    public void onDeleteOffice(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                               final String payload)
+            throws Exception {
+        this.eventRecorder.event(tenant, EventConstants.OPERATION_DELETE_OFFICE, payload, String.class);
+    }
+
+    @JmsListener(
+            subscription = EventConstants.DESTINATION,
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_PUT_OFFICE
+    )
+    public void onUpdateOffice(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                               final String payload)
+            throws Exception {
+        this.eventRecorder.event(tenant, EventConstants.OPERATION_PUT_OFFICE, payload, String.class);
+    }
+
+}
+*/
\ No newline at end of file
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/PayrollEventListener.java b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/PayrollEventListener.java
new file mode 100644
index 0000000..ce4cc70
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/PayrollEventListener.java
@@ -0,0 +1,61 @@
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+    /*
+package org.apache.fineract.cn.payroll.listener;
+
+import org.apache.fineract.cn.payroll.api.v1.EventConstants;
+import org.apache.fineract.cn.payroll.service.ServiceConstants;
+import org.apache.fineract.cn.lang.config.TenantHeaderFilter;
+import org.apache.fineract.cn.test.listener.EventRecorder;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.jms.annotation.JmsListener;
+import org.springframework.messaging.handler.annotation.Header;
+import org.springframework.stereotype.Component;
+
+@Component
+public class PayrollEventListener {
+
+    private final Logger logger;
+    private final EventRecorder eventRecorder;
+
+    @Autowired
+    public PayrollEventListener(@Qualifier(ServiceConstants.LOGGER_NAME) final Logger logger,
+                                       final EventRecorder eventRecorder) {
+        super();
+        this.logger = logger;
+        this.eventRecorder = eventRecorder;
+    }
+
+
+    @JmsListener(
+            subscription = EventConstants.DESTINATION,
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_POST_DISTRIBUTION
+    )
+    public void onPostCollection(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                 final String payload) {
+        this.logger.info("Payment distribution with source account {0} processed.", payload);
+        this.eventRecorder.event(tenant, EventConstants.POST_DISTRIBUTION, payload, String.class);
+    }
+
+}
+*/
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/PortfolioEventListener.java b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/PortfolioEventListener.java
new file mode 100644
index 0000000..758e7f0
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/PortfolioEventListener.java
@@ -0,0 +1,149 @@
+package org.apache.fineract.cn.notification.service.listener;/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+    /*
+import org.apache.fineract.cn.individuallending.api.v1.events.IndividualLoanEventConstants;
+import org.apache.fineract.cn.lang.config.TenantHeaderFilter;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jms.annotation.JmsListener;
+import org.springframework.stereotype.Component;
+import org.apache.fineract.cn.portfolio.api.v1.client.PortfolioManager;
+
+@SuppressWarnings("unused")
+@Component
+public class PortfolioEventListener {
+
+    @Autowired
+    public PortfolioEventListener() {
+        super();
+        //PortfolioManager portfolioManager = new PortfolioManager();
+    }
+
+    @JmsListener(
+            subscription = IndividualLoanEventConstants.DESTINATION,
+            destination = IndividualLoanEventConstants.DESTINATION,
+            selector = IndividualLoanEventConstants.SELECTOR_DENY_INDIVIDUALLOAN_CASE
+    )
+    public void onDeny(//@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                       final String payload) {
+
+    }
+
+    @JmsListener(
+            subscription = IndividualLoanEventConstants.DESTINATION,
+            destination = IndividualLoanEventConstants.DESTINATION,
+            selector = IndividualLoanEventConstants.SELECTOR_APPROVE_INDIVIDUALLOAN_CASE
+    )
+    public void onApprove(//@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                          final String payload) {
+
+    }
+
+    @JmsListener(
+            subscription = IndividualLoanEventConstants.DESTINATION,
+            destination = IndividualLoanEventConstants.DESTINATION,
+            selector = IndividualLoanEventConstants.SELECTOR_ACCEPT_PAYMENT_INDIVIDUALLOAN_CASE
+    )
+    public void onAcceptPayment(//@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                final String payload) {
+    }
+
+
+    @JmsListener(
+            subscription = IndividualLoanEventConstants.DESTINATION,
+            destination = IndividualLoanEventConstants.DESTINATION,
+            selector = IndividualLoanEventConstants.SELECTOR_DISBURSE_INDIVIDUALLOAN_CASE
+    )
+    public void onDisburse(//@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                           final String payload) {
+
+    }
+
+    @JmsListener(
+            subscription = IndividualLoanEventConstants.DESTINATION,
+            destination = IndividualLoanEventConstants.DESTINATION,
+            selector = IndividualLoanEventConstants.SELECTOR_CHECK_LATE_INDIVIDUALLOAN_CASE
+    )
+    public void onCheckLate(//@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                            final String payload) {
+
+    }
+
+    @JmsListener(
+            subscription = IndividualLoanEventConstants.DESTINATION,
+            destination = IndividualLoanEventConstants.DESTINATION,
+            selector = IndividualLoanEventConstants.SELECTOR_OPEN_INDIVIDUALLOAN_CASE
+    )
+    public void onOpen(//@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                       final String payload) {
+
+    }
+
+    @JmsListener(
+            subscription = IndividualLoanEventConstants.DESTINATION,
+            destination = IndividualLoanEventConstants.DESTINATION,
+            selector = IndividualLoanEventConstants.SELECTOR_MARK_LATE_INDIVIDUALLOAN_CASE
+    )
+    public void onMarkLate(//@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                           final String payload) {
+
+    }
+
+    @JmsListener(
+            subscription = IndividualLoanEventConstants.DESTINATION,
+            destination = IndividualLoanEventConstants.DESTINATION,
+            selector = IndividualLoanEventConstants.SELECTOR_CLOSE_INDIVIDUALLOAN_CASE
+    )
+    public void onClose(//@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                        final String payload) {
+    }
+
+
+
+        @JmsListener(
+                subscription = EventConstants.DESTINATION,
+                destination = EventConstants.DESTINATION,
+                selector = EventConstants.SELECTOR_POST_GROUP
+        )
+        public void onGroupCreated(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                   final String payload) {
+            this.eventRecorder.event(tenant, EventConstants.POST_GROUP, payload, String.class);
+        }
+
+        @JmsListener(
+                subscription = EventConstants.DESTINATION,
+                destination = EventConstants.DESTINATION,
+                selector = EventConstants.SELECTOR_ACTIVATE_GROUP
+        )
+        public void onGroupActivated(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                     final String payload) {
+            this.eventRecorder.event(tenant, EventConstants.ACTIVATE_GROUP, payload, String.class);
+        }
+
+        @JmsListener(
+                subscription = EventConstants.DESTINATION,
+                destination = EventConstants.DESTINATION,
+                selector = EventConstants.SELECTOR_PUT_GROUP
+        )
+        public void onGroupUpdated(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                   final String payload) {
+            this.eventRecorder.event(tenant, EventConstants.PUT_GROUP, payload, String.class);
+        }
+
+    }
+ */
\ No newline at end of file
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/TellerEventListener.java b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/TellerEventListener.java
new file mode 100644
index 0000000..5b461be
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/TellerEventListener.java
@@ -0,0 +1,146 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+    /*
+package org.apache.fineract.cn.teller.listener;
+
+import org.apache.fineract.cn.teller.AbstractTellerTest;
+import org.apache.fineract.cn.teller.api.v1.EventConstants;
+import org.apache.fineract.cn.lang.config.TenantHeaderFilter;
+import org.apache.fineract.cn.test.listener.EventRecorder;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.jms.annotation.JmsListener;
+import org.springframework.messaging.handler.annotation.Header;
+import org.springframework.stereotype.Component;
+
+@Component
+public class TellerEventListener {
+
+    private final Logger logger;
+    private final EventRecorder eventRecorder;
+
+    public TellerEventListener(@Qualifier(AbstractTellerTest.LOGGER_NAME) final Logger logger,
+                               final EventRecorder eventRecorder) {
+        super();
+        this.logger = logger;
+        this.eventRecorder = eventRecorder;
+    }
+
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_POST_TELLER,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onCreate(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                         final String payload) {
+        this.logger.debug("Teller {} created.", payload);
+        this.eventRecorder.event(tenant, EventConstants.POST_TELLER, payload, String.class);
+    }
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_PUT_TELLER,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onChange(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                         final String payload) {
+        this.logger.debug("Teller {} created.", payload);
+        this.eventRecorder.event(tenant, EventConstants.PUT_TELLER, payload, String.class);
+    }
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_OPEN_TELLER,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onOpen(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                       final String payload) {
+        this.logger.debug("Teller {} created.", payload);
+        this.eventRecorder.event(tenant, EventConstants.OPEN_TELLER, payload, String.class);
+    }
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_CLOSE_TELLER,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onClose(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                        final String payload) {
+        this.logger.debug("Teller {} created.", payload);
+        this.eventRecorder.event(tenant, EventConstants.CLOSE_TELLER, payload, String.class);
+    }
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_AUTHENTICATE_TELLER,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onAuthenticate(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                               final String payload) {
+        this.logger.debug("Teller {} created.", payload);
+        this.eventRecorder.event(tenant, EventConstants.AUTHENTICATE_TELLER, payload, String.class);
+    }
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_PAUSE_TELLER,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onPause(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                        final String payload) {
+        this.logger.debug("Teller {} created.", payload);
+        this.eventRecorder.event(tenant, EventConstants.PAUSE_TELLER, payload, String.class);
+    }
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_CONFIRM_TRANSACTION,
+            subscription = EventConstants.DESTINATION
+    )
+    public void confirmTransaction(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                   final String payload) {
+        this.logger.debug("Teller {} created.", payload);
+        this.eventRecorder.event(tenant, EventConstants.CONFIRM_TRANSACTION, payload, String.class);
+    }
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_DELETE_TELLER,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onDeleteTeller(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                               final String payload) {
+        this.logger.debug("Teller {} created.", payload);
+        this.eventRecorder.event(tenant, EventConstants.DELETE_TELLER, payload, String.class);
+    }
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_SAVE_DENOMINATION,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onSaveDenomination(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                   final String payload) {
+        this.logger.debug("Teller {} created.", payload);
+        this.eventRecorder.event(tenant, EventConstants.SAVE_DENOMINATION, payload, String.class);
+    }
+
+}
+*/
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/rest/NotificationRestController.java b/service/src/main/java/org/apache/fineract/cn/notification/service/rest/NotificationRestController.java
new file mode 100644
index 0000000..983b43e
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/rest/NotificationRestController.java
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.rest;
+
+import org.apache.fineract.cn.notification.api.v1.PermittableGroupIds;
+import org.apache.fineract.cn.notification.api.v1.domain.Sample;
+import org.apache.fineract.cn.notification.service.ServiceConstants;
+import org.apache.fineract.cn.notification.service.internal.command.InitializeServiceCommand;
+import org.apache.fineract.cn.notification.service.internal.command.SampleCommand;
+import org.apache.fineract.cn.notification.service.internal.service.SampleService;
+import java.util.List;
+import javax.validation.Valid;
+import org.apache.fineract.cn.anubis.annotation.AcceptedTokenType;
+import org.apache.fineract.cn.anubis.annotation.Permittable;
+import org.apache.fineract.cn.command.gateway.CommandGateway;
+import org.apache.fineract.cn.lang.ServiceException;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+@SuppressWarnings("unused")
+@RestController
+@RequestMapping("/")
+public class NotificationRestController {
+
+  private final Logger logger;
+  private final CommandGateway commandGateway;
+  private final SampleService sampleService;
+
+  @Autowired
+  public NotificationRestController(@Qualifier(ServiceConstants.LOGGER_NAME) final Logger logger,
+                              final CommandGateway commandGateway,
+                              final SampleService sampleService) {
+    super();
+    this.logger = logger;
+    this.commandGateway = commandGateway;
+    this.sampleService = sampleService;
+  }
+
+  @Permittable(value = AcceptedTokenType.SYSTEM)
+  @RequestMapping(
+      value = "/initialize",
+      method = RequestMethod.POST,
+      consumes = MediaType.ALL_VALUE,
+      produces = MediaType.APPLICATION_JSON_VALUE
+  )
+  public
+  @ResponseBody
+  ResponseEntity<Void> initialize() throws InterruptedException {
+      this.commandGateway.process(new InitializeServiceCommand());
+      return ResponseEntity.accepted().build();
+  }
+
+  @Permittable(value = AcceptedTokenType.TENANT, groupId = PermittableGroupIds.SAMPLE_MANAGEMENT)
+  @RequestMapping(
+          value = "/sample",
+          method = RequestMethod.GET,
+          consumes = MediaType.ALL_VALUE,
+          produces = MediaType.APPLICATION_JSON_VALUE
+  )
+  public
+  @ResponseBody
+  List<Sample> findAllEntities() {
+    return this.sampleService.findAllEntities();
+  }
+
+  @Permittable(value = AcceptedTokenType.TENANT, groupId = PermittableGroupIds.SAMPLE_MANAGEMENT)
+  @RequestMapping(
+          value = "/sample/{identifier}",
+          method = RequestMethod.GET,
+          consumes = MediaType.ALL_VALUE,
+          produces = MediaType.APPLICATION_JSON_VALUE
+  )
+  public
+  @ResponseBody
+  ResponseEntity<Sample> getEntity(@PathVariable("identifier") final String identifier) {
+    return this.sampleService.findByIdentifier(identifier)
+            .map(ResponseEntity::ok)
+            .orElseThrow(() -> ServiceException.notFound("Instance with identifier " + identifier + " doesn't exist."));
+  }
+
+  @Permittable(value = AcceptedTokenType.TENANT, groupId = PermittableGroupIds.SAMPLE_MANAGEMENT)
+  @RequestMapping(
+      value = "/sample",
+      method = RequestMethod.POST,
+      consumes = MediaType.APPLICATION_JSON_VALUE,
+      produces = MediaType.APPLICATION_JSON_VALUE
+  )
+  public
+  @ResponseBody
+  ResponseEntity<Void> createEntity(@RequestBody @Valid final Sample instance) throws InterruptedException {
+    this.commandGateway.process(new SampleCommand(instance));
+    return ResponseEntity.accepted().build();
+  }
+}
diff --git a/service/src/main/resources/application.yml b/service/src/main/resources/application.yml
new file mode 100644
index 0000000..ec163fc
--- /dev/null
+++ b/service/src/main/resources/application.yml
@@ -0,0 +1,81 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+spring:
+  cloud:
+    discovery:
+      enabled: false
+    config:
+      enabled: false
+
+eureka:
+  client:
+    serviceUrl:
+      defaultZone: http://localhost:8761/eureka/
+
+server:
+  port: 8081
+  contextPath: /notification/v1/*
+
+cassandra:
+  clusterName: staging_cluster
+  contactPoints: 127.0.0.1:9042,127.0.0.2:9042,127.0.0.3:9042
+  keyspace: seshat
+  cl:
+    read: LOCAL_QUORUM
+    write: LOCAL_QUORUM
+    delete: LOCAL_QUORUM
+
+mariadb:
+  driverClass: org.mariadb.jdbc.Driver
+  database: seshat
+  host: localhost
+  port: 3306
+  user: root
+  password: mysql
+
+bonecp:
+  idleMaxAgeInMinutes: 240
+  idleConnectionTestPeriodInMinutes: 60
+  maxConnectionsPerPartition: 10
+  minConnectionsPerPartition: 1
+  partitionCount: 2
+  acquireIncrement: 5
+  statementsCacheSize: 100
+
+async:
+  corePoolSize: 32
+  maxPoolSize: 16384
+  queueCapacity: 0
+  threadName: async-processor-
+
+flyway:
+  enabled: false
+
+fineract:
+  customer:
+    accountcreated:
+      message: Dear Valued Customer, Your account has been created.
+    accountclosed:
+      message: Dear Valued Customer, Your account has been successfully closed.
+
+smssender:
+  accountSID: AC1fde2c6f26f367b93231c5fdb944c908
+  authtoken: bc9a53e41745b8471e0ecafc859d86aa
+  senderNumber: +1 510-944-1898
diff --git a/service/src/main/resources/bootstrap.yml b/service/src/main/resources/bootstrap.yml
new file mode 100644
index 0000000..76c2441
--- /dev/null
+++ b/service/src/main/resources/bootstrap.yml
@@ -0,0 +1,22 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+spring:
+    application:
+        name: notification-v1
diff --git a/service/src/main/resources/db/migrations/mariadb/V1__initial_setup.sql b/service/src/main/resources/db/migrations/mariadb/V1__initial_setup.sql
new file mode 100644
index 0000000..ff9a61f
--- /dev/null
+++ b/service/src/main/resources/db/migrations/mariadb/V1__initial_setup.sql
@@ -0,0 +1,72 @@
+--
+-- Licensed to the Apache Software Foundation (ASF) under one
+-- or more contributor license agreements.  See the NOTICE file
+-- distributed with this work for additional information
+-- regarding copyright ownership.  The ASF licenses this file
+-- to you under the Apache License, Version 2.0 (the
+-- "License"); you may not use this file except in compliance
+-- with the License.  You may obtain a copy of the License at
+--
+--   http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing,
+-- software distributed under the License is distributed on an
+-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+-- KIND, either express or implied.  See the License for the
+-- specific language governing permissions and limitations
+-- under the License.
+--
+
+-- -----------------------------------------------------
+-- Table `fineract-cn-notification`.`email_gateway_configurations`
+-- -----------------------------------------------------
+CREATE TABLE IF NOT EXISTS `fineract-cn-notification`.`email_gateway_configurations` (
+  `id` INT(11) NOT NULL AUTO_INCREMENT,
+  `identifer` VARCHAR(45) NULL DEFAULT NULL,
+  `host` VARCHAR(45) NOT NULL,
+  `port` VARCHAR(45) NOT NULL,
+  `username` VARCHAR(45) NOT NULL,
+  `app_id` VARCHAR(45) NOT NULL,
+  PRIMARY KEY (`id`))
+ENGINE = InnoDB
+DEFAULT CHARACTER SET = latin1;
+
+
+-- -----------------------------------------------------
+-- Table `fineract-cn-notification`.`sms_gateway_configurations`
+-- -----------------------------------------------------
+CREATE TABLE IF NOT EXISTS `fineract-cn-notification`.`sms_gateway_configurations` (
+  `id` INT(11) NOT NULL AUTO_INCREMENT,
+  `identifier` VARCHAR(45) NULL DEFAULT NULL,
+  `accountsid` VARCHAR(255) NOT NULL,
+  `auth_token` VARCHAR(255) NOT NULL,
+  `option` VARCHAR(45) NULL DEFAULT NULL,
+  PRIMARY KEY (`id`))
+ENGINE = InnoDB
+DEFAULT CHARACTER SET = latin1;
+
+
+-- -----------------------------------------------------
+-- Table `fineract-cn-notification`.`templates`
+-- -----------------------------------------------------
+CREATE TABLE IF NOT EXISTS `fineract-cn-notification`.`templates` (
+  `id` INT(11) NOT NULL AUTO_INCREMENT,
+  PRIMARY KEY (`id`))
+ENGINE = InnoDB
+DEFAULT CHARACTER SET = latin1;
+
+-- ------------------------------------------------------
+
+CREATE TABLE sample (
+  id BIGINT NOT NULL AUTO_INCREMENT,
+  identifier VARCHAR(8) NOT NULL,
+  payload VARCHAR(512) NULL,
+  CONSTRAINT notification_pk PRIMARY KEY (id)
+);
+
+CREATE TABLE template_sample (
+  id BIGINT NOT NULL AUTO_INCREMENT,
+  identifier VARCHAR(8) NOT NULL,
+  payload VARCHAR(512) NULL,
+  CONSTRAINT template_sample_pk PRIMARY KEY (id)
+);
\ No newline at end of file
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 0000000..868411f
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+rootProject.name = 'notification'
+
+includeBuild 'api'
+includeBuild 'service'
+includeBuild 'component-test'
+
diff --git a/shared.gradle b/shared.gradle
new file mode 100644
index 0000000..4a65927
--- /dev/null
+++ b/shared.gradle
@@ -0,0 +1,111 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+group 'org.apache.fineract.cn.notification'
+version '0.1.0-BUILD-SNAPSHOT'
+
+ext.versions = [
+        fineractcnidentity      : '0.1.0-BUILD-SNAPSHOT',
+        fineractcnprovisioner   : '0.1.0-BUILD-SNAPSHOT',
+        fineractcnrhythm        : '0.1.0-BUILD-SNAPSHOT',
+        fineractcnoffice        : '0.1.0-BUILD-SNAPSHOT',
+        fineractcncustomer      : '0.1.0-BUILD-SNAPSHOT',
+        fineractcnaccounting    : '0.1.0-BUILD-SNAPSHOT',
+        fineractcnportfolio     : '0.1.0-BUILD-SNAPSHOT',
+        fineractcndeposit       : '0.1.0-BUILD-SNAPSHOT',
+        fineractcnteller        : '0.1.0-BUILD-SNAPSHOT',
+        kuelapcheques           : '0.1.0-BUILD-SNAPSHOT',
+        fineractcnpayroll       : '0.1.0-BUILD-SNAPSHOT',
+        fineractcngroup         : '0.1.0-BUILD-SNAPSHOT',
+        frameworkapi            : '0.1.0-BUILD-SNAPSHOT',
+        frameworklang           : '0.1.0-BUILD-SNAPSHOT',
+        frameworkasync          : '0.1.0-BUILD-SNAPSHOT',
+        frameworkcassandra      : '0.1.0-BUILD-SNAPSHOT',
+        frameworkmariadb        : '0.1.0-BUILD-SNAPSHOT',
+        frameworkcommand        : '0.1.0-BUILD-SNAPSHOT',
+        frameworktest           : '0.1.0-BUILD-SNAPSHOT',
+        frameworkanubis         : '0.1.0-BUILD-SNAPSHOT',
+        validator : '5.3.0.Final'
+]
+
+apply plugin: 'java'
+apply plugin: 'idea'
+apply plugin: 'maven-publish'
+apply plugin: 'io.spring.dependency-management'
+
+tasks.withType(JavaCompile) {
+    sourceCompatibility = JavaVersion.VERSION_1_8
+    targetCompatibility = JavaVersion.VERSION_1_8
+}
+
+repositories {
+    jcenter()
+    mavenLocal()
+}
+
+dependencyManagement {
+    imports {
+        mavenBom 'io.spring.platform:platform-bom:Athens-RELEASE'
+        mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Camden.SR1'
+    }
+}
+
+// override certain dependency provided by Spring platform using newer releases
+ext['cassandra.version'] = '3.6'
+ext['cassandra-driver.version'] = '3.1.2'
+ext['activemq.version'] = '5.13.2'
+ext['spring-data-releasetrain.version'] = 'Gosling-SR2A'
+
+dependencies {
+    compile(
+            [group: 'com.google.code.findbugs', name: 'jsr305']
+    )
+
+    testCompile(
+            [group: 'org.springframework.boot', name: 'spring-boot-starter-test']
+    )
+}
+
+jar {
+    from sourceSets.main.allSource
+    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
+}
+
+license {
+    header rootProject.file('../HEADER')
+    strictCheck true
+    mapping {
+        java = 'SLASHSTAR_STYLE'
+        xml = 'XML_STYLE'
+        yml = 'SCRIPT_STYLE'
+        yaml = 'SCRIPT_STYLE'
+    }
+}
+
+rat {
+    // List of exclude directives, defaults to ['**/.gradle/**']
+    excludes = [
+            "**/.idea/**",
+            "**/.gradle/**",
+            "**/gradle/**",
+            "**/build/**",
+            "gradlew",
+            "gradlew.bat",
+            "README.md"
+    ]
+}
+
diff --git a/system-analysis.mdj b/system-analysis.mdj
new file mode 100644
index 0000000..4c7f1af
--- /dev/null
+++ b/system-analysis.mdj
@@ -0,0 +1,4104 @@
+{
+	"_type": "Project",
+	"_id": "AAAAAAFF+h6SjaM2Hec=",
+	"name": "Untitled",
+	"ownedElements": [
+		{
+			"_type": "UMLModel",
+			"_id": "AAAAAAFF+qBWK6M3Z8Y=",
+			"_parent": {
+				"$ref": "AAAAAAFF+h6SjaM2Hec="
+			},
+			"name": "Model",
+			"ownedElements": [
+				{
+					"_type": "UMLClassDiagram",
+					"_id": "AAAAAAFF+qBtyKM79qY=",
+					"_parent": {
+						"$ref": "AAAAAAFF+qBWK6M3Z8Y="
+					},
+					"name": "Main",
+					"visible": true,
+					"defaultDiagram": true
+				},
+				{
+					"_type": "UMLActivity",
+					"_id": "AAAAAAFjqASLHqqfH1M=",
+					"_parent": {
+						"$ref": "AAAAAAFF+qBWK6M3Z8Y="
+					},
+					"name": "Activity1",
+					"ownedElements": [
+						{
+							"_type": "UMLActivityDiagram",
+							"_id": "AAAAAAFjqASLIKqg3FE=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"name": "Notification Activity",
+							"visible": true,
+							"defaultDiagram": false,
+							"ownedViews": [
+								{
+									"_type": "UMLControlNodeView",
+									"_id": "AAAAAAFjqASvhqqmFR0=",
+									"_parent": {
+										"$ref": "AAAAAAFjqASLIKqg3FE="
+									},
+									"model": {
+										"$ref": "AAAAAAFjqASvhaqkmH0="
+									},
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": true,
+									"containerExtending": false,
+									"left": 178,
+									"top": 32,
+									"width": 20,
+									"height": 20,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLActionView",
+									"_id": "AAAAAAFjqATelaqrA88=",
+									"_parent": {
+										"$ref": "AAAAAAFjqASLIKqg3FE="
+									},
+									"model": {
+										"$ref": "AAAAAAFjqATelKqpPIs="
+									},
+									"subViews": [
+										{
+											"_type": "UMLNameCompartmentView",
+											"_id": "AAAAAAFjqATelqqsQwY=",
+											"_parent": {
+												"$ref": "AAAAAAFjqATelaqrA88="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqATelKqpPIs="
+											},
+											"subViews": [
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqATelqqtdxw=",
+													"_parent": {
+														"$ref": "AAAAAAFjqATelqqsQwY="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 32,
+													"top": 0,
+													"width": 0,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqATel6qupnU=",
+													"_parent": {
+														"$ref": "AAAAAAFjqATelqqsQwY="
+													},
+													"visible": true,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;1",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 144,
+													"top": 95,
+													"width": 87,
+													"height": 26,
+													"autoResize": false,
+													"underline": false,
+													"text": "JMSListener injects event",
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": true
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqATemKqvl8w=",
+													"_parent": {
+														"$ref": "AAAAAAFjqATelqqsQwY="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 32,
+													"top": 0,
+													"width": 86,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"text": "(from Activity1)",
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqATemKqwuws=",
+													"_parent": {
+														"$ref": "AAAAAAFjqATelqqsQwY="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 32,
+													"top": 0,
+													"width": 0,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"horizontalAlignment": 1,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												}
+											],
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 139,
+											"top": 88,
+											"width": 97,
+											"height": 38,
+											"autoResize": false,
+											"stereotypeLabel": {
+												"$ref": "AAAAAAFjqATelqqtdxw="
+											},
+											"nameLabel": {
+												"$ref": "AAAAAAFjqATel6qupnU="
+											},
+											"namespaceLabel": {
+												"$ref": "AAAAAAFjqATemKqvl8w="
+											},
+											"propertyLabel": {
+												"$ref": "AAAAAAFjqATemKqwuws="
+											}
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": true,
+									"containerExtending": false,
+									"left": 139,
+									"top": 88,
+									"width": 97,
+									"height": 54,
+									"autoResize": false,
+									"stereotypeDisplay": "label",
+									"showVisibility": true,
+									"showNamespace": false,
+									"showProperty": true,
+									"showType": true,
+									"nameCompartment": {
+										"$ref": "AAAAAAFjqATelqqsQwY="
+									},
+									"wordWrap": true
+								},
+								{
+									"_type": "UMLActionView",
+									"_id": "AAAAAAFjqAWrCqrNuOs=",
+									"_parent": {
+										"$ref": "AAAAAAFjqASLIKqg3FE="
+									},
+									"model": {
+										"$ref": "AAAAAAFjqAWrCarLlr0="
+									},
+									"subViews": [
+										{
+											"_type": "UMLNameCompartmentView",
+											"_id": "AAAAAAFjqAWrCqrOxcc=",
+											"_parent": {
+												"$ref": "AAAAAAFjqAWrCqrNuOs="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqAWrCarLlr0="
+											},
+											"subViews": [
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqAWrC6rPvtY=",
+													"_parent": {
+														"$ref": "AAAAAAFjqAWrCqrOxcc="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": -366,
+													"top": 304,
+													"width": 0,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqAWrC6rQZmc=",
+													"_parent": {
+														"$ref": "AAAAAAFjqAWrCqrOxcc="
+													},
+													"visible": true,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;1",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 45,
+													"top": 351,
+													"width": 95,
+													"height": 52,
+													"autoResize": false,
+													"underline": false,
+													"text": "retrieve receipt SMS and email contact",
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": true
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqAWrC6rRHbU=",
+													"_parent": {
+														"$ref": "AAAAAAFjqAWrCqrOxcc="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": -366,
+													"top": 304,
+													"width": 86,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"text": "(from Activity1)",
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqAWrC6rS8Ik=",
+													"_parent": {
+														"$ref": "AAAAAAFjqAWrCqrOxcc="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": -366,
+													"top": 304,
+													"width": 0,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"horizontalAlignment": 1,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												}
+											],
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 40,
+											"top": 344,
+											"width": 105,
+											"height": 64,
+											"autoResize": false,
+											"stereotypeLabel": {
+												"$ref": "AAAAAAFjqAWrC6rPvtY="
+											},
+											"nameLabel": {
+												"$ref": "AAAAAAFjqAWrC6rQZmc="
+											},
+											"namespaceLabel": {
+												"$ref": "AAAAAAFjqAWrC6rRHbU="
+											},
+											"propertyLabel": {
+												"$ref": "AAAAAAFjqAWrC6rS8Ik="
+											}
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": true,
+									"containerExtending": false,
+									"left": 40,
+									"top": 344,
+									"width": 105,
+									"height": 80,
+									"autoResize": false,
+									"stereotypeDisplay": "label",
+									"showVisibility": true,
+									"showNamespace": false,
+									"showProperty": true,
+									"showType": true,
+									"nameCompartment": {
+										"$ref": "AAAAAAFjqAWrCqrOxcc="
+									},
+									"wordWrap": true
+								},
+								{
+									"_type": "UMLActionView",
+									"_id": "AAAAAAFjqAYmKaro5lo=",
+									"_parent": {
+										"$ref": "AAAAAAFjqASLIKqg3FE="
+									},
+									"model": {
+										"$ref": "AAAAAAFjqAYmKKrmL6s="
+									},
+									"subViews": [
+										{
+											"_type": "UMLNameCompartmentView",
+											"_id": "AAAAAAFjqAYmKarpUFk=",
+											"_parent": {
+												"$ref": "AAAAAAFjqAYmKaro5lo="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqAYmKKrmL6s="
+											},
+											"subViews": [
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqAYmKqrq62s=",
+													"_parent": {
+														"$ref": "AAAAAAFjqAYmKarpUFk="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 322,
+													"top": 224,
+													"width": 0,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqAYmKqrr75M=",
+													"_parent": {
+														"$ref": "AAAAAAFjqAYmKarpUFk="
+													},
+													"visible": true,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;1",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 213,
+													"top": 351,
+													"width": 111,
+													"height": 39,
+													"autoResize": false,
+													"underline": false,
+													"text": "Prepare Message with template created",
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": true
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqAYmK6rsSQ0=",
+													"_parent": {
+														"$ref": "AAAAAAFjqAYmKarpUFk="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 322,
+													"top": 224,
+													"width": 86,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"text": "(from Activity1)",
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqAYmK6rtvPo=",
+													"_parent": {
+														"$ref": "AAAAAAFjqAYmKarpUFk="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 322,
+													"top": 224,
+													"width": 0,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"horizontalAlignment": 1,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												}
+											],
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 208,
+											"top": 344,
+											"width": 121,
+											"height": 51,
+											"autoResize": false,
+											"stereotypeLabel": {
+												"$ref": "AAAAAAFjqAYmKqrq62s="
+											},
+											"nameLabel": {
+												"$ref": "AAAAAAFjqAYmKqrr75M="
+											},
+											"namespaceLabel": {
+												"$ref": "AAAAAAFjqAYmK6rsSQ0="
+											},
+											"propertyLabel": {
+												"$ref": "AAAAAAFjqAYmK6rtvPo="
+											}
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": true,
+									"containerExtending": false,
+									"left": 208,
+									"top": 344,
+									"width": 121,
+									"height": 67,
+									"autoResize": false,
+									"stereotypeDisplay": "label",
+									"showVisibility": true,
+									"showNamespace": false,
+									"showProperty": true,
+									"showType": true,
+									"nameCompartment": {
+										"$ref": "AAAAAAFjqAYmKarpUFk="
+									},
+									"wordWrap": true
+								},
+								{
+									"_type": "UMLActionView",
+									"_id": "AAAAAAFjqAZdgqsCYJQ=",
+									"_parent": {
+										"$ref": "AAAAAAFjqASLIKqg3FE="
+									},
+									"model": {
+										"$ref": "AAAAAAFjqAZdgasAyFA="
+									},
+									"subViews": [
+										{
+											"_type": "UMLNameCompartmentView",
+											"_id": "AAAAAAFjqAZdgqsDDao=",
+											"_parent": {
+												"$ref": "AAAAAAFjqAZdgqsCYJQ="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqAZdgasAyFA="
+											},
+											"subViews": [
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqAZdgqsEhl4=",
+													"_parent": {
+														"$ref": "AAAAAAFjqAZdgqsDDao="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": -240,
+													"top": 528,
+													"width": 0,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqAZdgqsF8Ko=",
+													"_parent": {
+														"$ref": "AAAAAAFjqAZdgqsDDao="
+													},
+													"visible": true,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;1",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 136,
+													"top": 591,
+													"width": 103,
+													"height": 39,
+													"autoResize": false,
+													"underline": false,
+													"text": "Senders Objects transmit the data",
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": true
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqAZdgqsGu+E=",
+													"_parent": {
+														"$ref": "AAAAAAFjqAZdgqsDDao="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": -240,
+													"top": 528,
+													"width": 86,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"text": "(from Activity1)",
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqAZdgqsH70w=",
+													"_parent": {
+														"$ref": "AAAAAAFjqAZdgqsDDao="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": -240,
+													"top": 528,
+													"width": 0,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"horizontalAlignment": 1,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												}
+											],
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 131,
+											"top": 584,
+											"width": 113,
+											"height": 51,
+											"autoResize": false,
+											"stereotypeLabel": {
+												"$ref": "AAAAAAFjqAZdgqsEhl4="
+											},
+											"nameLabel": {
+												"$ref": "AAAAAAFjqAZdgqsF8Ko="
+											},
+											"namespaceLabel": {
+												"$ref": "AAAAAAFjqAZdgqsGu+E="
+											},
+											"propertyLabel": {
+												"$ref": "AAAAAAFjqAZdgqsH70w="
+											}
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": true,
+									"containerExtending": false,
+									"left": 131,
+									"top": 584,
+									"width": 113,
+									"height": 67,
+									"autoResize": false,
+									"stereotypeDisplay": "label",
+									"showVisibility": true,
+									"showNamespace": false,
+									"showProperty": true,
+									"showType": true,
+									"nameCompartment": {
+										"$ref": "AAAAAAFjqAZdgqsDDao="
+									},
+									"wordWrap": true
+								},
+								{
+									"_type": "UMLControlNodeView",
+									"_id": "AAAAAAFjqAbQ96sfooI=",
+									"_parent": {
+										"$ref": "AAAAAAFjqASLIKqg3FE="
+									},
+									"model": {
+										"$ref": "AAAAAAFjqAbQ7asd+Ww="
+									},
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": true,
+									"containerExtending": false,
+									"left": 175,
+									"top": 680,
+									"width": 26,
+									"height": 26,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLActionView",
+									"_id": "AAAAAAFjqA2/Cata4OI=",
+									"_parent": {
+										"$ref": "AAAAAAFjqASLIKqg3FE="
+									},
+									"model": {
+										"$ref": "AAAAAAFjqA2/A6tYai0="
+									},
+									"subViews": [
+										{
+											"_type": "UMLNameCompartmentView",
+											"_id": "AAAAAAFjqA2/C6tbg3o=",
+											"_parent": {
+												"$ref": "AAAAAAFjqA2/Cata4OI="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqA2/A6tYai0="
+											},
+											"subViews": [
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqA2/C6tcNpM=",
+													"_parent": {
+														"$ref": "AAAAAAFjqA2/C6tbg3o="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 178,
+													"top": 336,
+													"width": 0,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqA2/DKtd5Og=",
+													"_parent": {
+														"$ref": "AAAAAAFjqA2/C6tbg3o="
+													},
+													"visible": true,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;1",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 229,
+													"top": 463,
+													"width": 79,
+													"height": 26,
+													"autoResize": false,
+													"underline": false,
+													"text": "Locatize Template",
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": true
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqA2/DateYyA=",
+													"_parent": {
+														"$ref": "AAAAAAFjqA2/C6tbg3o="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 178,
+													"top": 336,
+													"width": 86,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"text": "(from Activity1)",
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqA2/Datf4DQ=",
+													"_parent": {
+														"$ref": "AAAAAAFjqA2/C6tbg3o="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 178,
+													"top": 336,
+													"width": 0,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"horizontalAlignment": 1,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												}
+											],
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 224,
+											"top": 456,
+											"width": 89,
+											"height": 38,
+											"autoResize": false,
+											"stereotypeLabel": {
+												"$ref": "AAAAAAFjqA2/C6tcNpM="
+											},
+											"nameLabel": {
+												"$ref": "AAAAAAFjqA2/DKtd5Og="
+											},
+											"namespaceLabel": {
+												"$ref": "AAAAAAFjqA2/DateYyA="
+											},
+											"propertyLabel": {
+												"$ref": "AAAAAAFjqA2/Datf4DQ="
+											}
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": true,
+									"containerExtending": false,
+									"left": 224,
+									"top": 456,
+									"width": 89,
+									"height": 54,
+									"autoResize": false,
+									"stereotypeDisplay": "label",
+									"showVisibility": true,
+									"showNamespace": false,
+									"showProperty": true,
+									"showType": true,
+									"nameCompartment": {
+										"$ref": "AAAAAAFjqA2/C6tbg3o="
+									},
+									"wordWrap": true
+								},
+								{
+									"_type": "UMLControlNodeView",
+									"_id": "AAAAAAFjqBIJL6ubZ3I=",
+									"_parent": {
+										"$ref": "AAAAAAFjqASLIKqg3FE="
+									},
+									"model": {
+										"$ref": "AAAAAAFjqBIJLquZsRo="
+									},
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": true,
+									"containerExtending": false,
+									"left": 131,
+									"top": 288,
+									"width": 113,
+									"height": 6,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLControlFlowView",
+									"_id": "AAAAAAFjqBIoa6ugHqY=",
+									"_parent": {
+										"$ref": "AAAAAAFjqASLIKqg3FE="
+									},
+									"model": {
+										"$ref": "AAAAAAFjqBIoaquel/4="
+									},
+									"subViews": [
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqBIoa6uhY6U=",
+											"_parent": {
+												"$ref": "AAAAAAFjqBIoa6ugHqY="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqBIoaquel/4="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 201,
+											"top": 151,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 15,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqBIoa6ugHqY="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqBIoa6uivk8=",
+											"_parent": {
+												"$ref": "AAAAAAFjqBIoa6ugHqY="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqBIoaquel/4="
+											},
+											"visible": null,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 216,
+											"top": 151,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 30,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqBIoa6ugHqY="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqBIobKujWVc=",
+											"_parent": {
+												"$ref": "AAAAAAFjqBIoa6ugHqY="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqBIoaquel/4="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 172,
+											"top": 152,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": -1.5707963267948966,
+											"distance": 15,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqBIoa6ugHqY="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"head": {
+										"$ref": "AAAAAAFjqCEih6yTO40="
+									},
+									"tail": {
+										"$ref": "AAAAAAFjqATelaqrA88="
+									},
+									"lineStyle": 1,
+									"points": "187:142;187:175",
+									"stereotypeDisplay": "label",
+									"showVisibility": true,
+									"showProperty": true,
+									"nameLabel": {
+										"$ref": "AAAAAAFjqBIoa6uhY6U="
+									},
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFjqBIoa6uivk8="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFjqBIobKujWVc="
+									}
+								},
+								{
+									"_type": "UMLControlFlowView",
+									"_id": "AAAAAAFjqBKjHquxAW0=",
+									"_parent": {
+										"$ref": "AAAAAAFjqASLIKqg3FE="
+									},
+									"model": {
+										"$ref": "AAAAAAFjqBKjHquv5CM="
+									},
+									"subViews": [
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqBKjHquyqKs=",
+											"_parent": {
+												"$ref": "AAAAAAFjqBKjHquxAW0="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqBKjHquv5CM="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 201,
+											"top": 62,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 15,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqBKjHquxAW0="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqBKjHquzayI=",
+											"_parent": {
+												"$ref": "AAAAAAFjqBKjHquxAW0="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqBKjHquv5CM="
+											},
+											"visible": null,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 216,
+											"top": 62,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 30,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqBKjHquxAW0="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqBKjHqu0+xU=",
+											"_parent": {
+												"$ref": "AAAAAAFjqBKjHquxAW0="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqBKjHquv5CM="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 172,
+											"top": 63,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": -1.5707963267948966,
+											"distance": 15,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqBKjHquxAW0="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"head": {
+										"$ref": "AAAAAAFjqATelaqrA88="
+									},
+									"tail": {
+										"$ref": "AAAAAAFjqASvhqqmFR0="
+									},
+									"lineStyle": 1,
+									"points": "187:52;187:87",
+									"stereotypeDisplay": "label",
+									"showVisibility": true,
+									"showProperty": true,
+									"nameLabel": {
+										"$ref": "AAAAAAFjqBKjHquyqKs="
+									},
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFjqBKjHquzayI="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFjqBKjHqu0+xU="
+									}
+								},
+								{
+									"_type": "UMLControlFlowView",
+									"_id": "AAAAAAFjqBLYAqvEqog=",
+									"_parent": {
+										"$ref": "AAAAAAFjqASLIKqg3FE="
+									},
+									"model": {
+										"$ref": "AAAAAAFjqBLYAqvCSQk="
+									},
+									"subViews": [
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqBLYAqvFiZM=",
+											"_parent": {
+												"$ref": "AAAAAAFjqBLYAqvEqog="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqBLYAqvCSQk="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 282,
+											"top": 426,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 15,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqBLYAqvEqog="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqBLYAqvGPAg=",
+											"_parent": {
+												"$ref": "AAAAAAFjqBLYAqvEqog="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqBLYAqvCSQk="
+											},
+											"visible": null,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 297,
+											"top": 426,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 30,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqBLYAqvEqog="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqBLYAqvHWRk=",
+											"_parent": {
+												"$ref": "AAAAAAFjqBLYAqvEqog="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqBLYAqvCSQk="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 253,
+											"top": 427,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": -1.5707963267948966,
+											"distance": 15,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqBLYAqvEqog="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"head": {
+										"$ref": "AAAAAAFjqA2/Cata4OI="
+									},
+									"tail": {
+										"$ref": "AAAAAAFjqAYmKaro5lo="
+									},
+									"lineStyle": 1,
+									"points": "268:411;268:455",
+									"stereotypeDisplay": "label",
+									"showVisibility": true,
+									"showProperty": true,
+									"nameLabel": {
+										"$ref": "AAAAAAFjqBLYAqvFiZM="
+									},
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFjqBLYAqvGPAg="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFjqBLYAqvHWRk="
+									}
+								},
+								{
+									"_type": "UMLControlFlowView",
+									"_id": "AAAAAAFjqBLqN6vVVDc=",
+									"_parent": {
+										"$ref": "AAAAAAFjqASLIKqg3FE="
+									},
+									"model": {
+										"$ref": "AAAAAAFjqBLqNqvTow0="
+									},
+									"subViews": [
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqBLqOKvWpw0=",
+											"_parent": {
+												"$ref": "AAAAAAFjqBLqN6vVVDc="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqBLqNqvTow0="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 201,
+											"top": 658,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 15,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqBLqN6vVVDc="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqBLqOKvX76Y=",
+											"_parent": {
+												"$ref": "AAAAAAFjqBLqN6vVVDc="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqBLqNqvTow0="
+											},
+											"visible": null,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 216,
+											"top": 658,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 30,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqBLqN6vVVDc="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqBLqOavYEPE=",
+											"_parent": {
+												"$ref": "AAAAAAFjqBLqN6vVVDc="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqBLqNqvTow0="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 172,
+											"top": 659,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": -1.5707963267948966,
+											"distance": 15,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqBLqN6vVVDc="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"head": {
+										"$ref": "AAAAAAFjqAbQ96sfooI="
+									},
+									"tail": {
+										"$ref": "AAAAAAFjqAZdgqsCYJQ="
+									},
+									"lineStyle": 1,
+									"points": "187:651;187:679",
+									"stereotypeDisplay": "label",
+									"showVisibility": true,
+									"showProperty": true,
+									"nameLabel": {
+										"$ref": "AAAAAAFjqBLqOKvWpw0="
+									},
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFjqBLqOKvX76Y="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFjqBLqOavYEPE="
+									}
+								},
+								{
+									"_type": "UMLControlFlowView",
+									"_id": "AAAAAAFjqB0vKqwHDoM=",
+									"_parent": {
+										"$ref": "AAAAAAFjqASLIKqg3FE="
+									},
+									"model": {
+										"$ref": "AAAAAAFjqB0vKawF6iM="
+									},
+									"subViews": [
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqB0vKqwIlNc=",
+											"_parent": {
+												"$ref": "AAAAAAFjqB0vKqwHDoM="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqB0vKawF6iM="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 168,
+											"top": 322,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 15,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqB0vKqwHDoM="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqB0vK6wJ+8E=",
+											"_parent": {
+												"$ref": "AAAAAAFjqB0vKqwHDoM="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqB0vKawF6iM="
+											},
+											"visible": null,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 179,
+											"top": 333,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 30,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqB0vKqwHDoM="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqB0vK6wKDT8=",
+											"_parent": {
+												"$ref": "AAAAAAFjqB0vKqwHDoM="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqB0vKawF6iM="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 147,
+											"top": 301,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": -1.5707963267948966,
+											"distance": 15,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqB0vKqwHDoM="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"head": {
+										"$ref": "AAAAAAFjqAWrCqrNuOs="
+									},
+									"tail": {
+										"$ref": "AAAAAAFjqBIJL6ubZ3I="
+									},
+									"lineStyle": 1,
+									"points": "183:294;133:343",
+									"stereotypeDisplay": "label",
+									"showVisibility": true,
+									"showProperty": true,
+									"nameLabel": {
+										"$ref": "AAAAAAFjqB0vKqwIlNc="
+									},
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFjqB0vK6wJ+8E="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFjqB0vK6wKDT8="
+									}
+								},
+								{
+									"_type": "UMLControlFlowView",
+									"_id": "AAAAAAFjqB14tKwY2QY=",
+									"_parent": {
+										"$ref": "AAAAAAFjqASLIKqg3FE="
+									},
+									"model": {
+										"$ref": "AAAAAAFjqB14s6wWTtM="
+									},
+									"subViews": [
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqB14tKwZWVs=",
+											"_parent": {
+												"$ref": "AAAAAAFjqB14tKwY2QY="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqB14s6wWTtM="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 224,
+											"top": 301,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 15,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqB14tKwY2QY="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqB14tKwaFP8=",
+											"_parent": {
+												"$ref": "AAAAAAFjqB14tKwY2QY="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqB14s6wWTtM="
+											},
+											"visible": null,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 235,
+											"top": 291,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 30,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqB14tKwY2QY="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqB14tKwbJe8=",
+											"_parent": {
+												"$ref": "AAAAAAFjqB14tKwY2QY="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqB14s6wWTtM="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 201,
+											"top": 322,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": -1.5707963267948966,
+											"distance": 15,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqB14tKwY2QY="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"head": {
+										"$ref": "AAAAAAFjqAYmKaro5lo="
+									},
+									"tail": {
+										"$ref": "AAAAAAFjqBIJL6ubZ3I="
+									},
+									"lineStyle": 1,
+									"points": "191:294;236:343",
+									"stereotypeDisplay": "label",
+									"showVisibility": true,
+									"showProperty": true,
+									"nameLabel": {
+										"$ref": "AAAAAAFjqB14tKwZWVs="
+									},
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFjqB14tKwaFP8="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFjqB14tKwbJe8="
+									}
+								},
+								{
+									"_type": "UMLControlNodeView",
+									"_id": "AAAAAAFjqB9/Taw5bl4=",
+									"_parent": {
+										"$ref": "AAAAAAFjqASLIKqg3FE="
+									},
+									"model": {
+										"$ref": "AAAAAAFjqB9/S6w3TKM="
+									},
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": true,
+									"containerExtending": false,
+									"left": 136,
+									"top": 544,
+									"width": 104,
+									"height": 6,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLControlFlowView",
+									"_id": "AAAAAAFjqB+W4qw+0nc=",
+									"_parent": {
+										"$ref": "AAAAAAFjqASLIKqg3FE="
+									},
+									"model": {
+										"$ref": "AAAAAAFjqB+W4qw8vc8="
+									},
+									"subViews": [
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqB+W46w/H0c=",
+											"_parent": {
+												"$ref": "AAAAAAFjqB+W4qw+0nc="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqB+W4qw8vc8="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 201,
+											"top": 559,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 15,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqB+W4qw+0nc="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqB+W46xAJPs=",
+											"_parent": {
+												"$ref": "AAAAAAFjqB+W4qw+0nc="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqB+W4qw8vc8="
+											},
+											"visible": null,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 216,
+											"top": 559,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 30,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqB+W4qw+0nc="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqB+W46xBhSQ=",
+											"_parent": {
+												"$ref": "AAAAAAFjqB+W4qw+0nc="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqB+W4qw8vc8="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 172,
+											"top": 560,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": -1.5707963267948966,
+											"distance": 15,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqB+W4qw+0nc="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"head": {
+										"$ref": "AAAAAAFjqAZdgqsCYJQ="
+									},
+									"tail": {
+										"$ref": "AAAAAAFjqB9/Taw5bl4="
+									},
+									"lineStyle": 1,
+									"points": "187:550;187:583",
+									"stereotypeDisplay": "label",
+									"showVisibility": true,
+									"showProperty": true,
+									"nameLabel": {
+										"$ref": "AAAAAAFjqB+W46w/H0c="
+									},
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFjqB+W46xAJPs="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFjqB+W46xBhSQ="
+									}
+								},
+								{
+									"_type": "UMLControlFlowView",
+									"_id": "AAAAAAFjqB+mdKxPr44=",
+									"_parent": {
+										"$ref": "AAAAAAFjqASLIKqg3FE="
+									},
+									"model": {
+										"$ref": "AAAAAAFjqB+mc6xNTWc="
+									},
+									"subViews": [
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqB+mdKxQpVA=",
+											"_parent": {
+												"$ref": "AAAAAAFjqB+mdKxPr44="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqB+mc6xNTWc="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 221,
+											"top": 531,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 15,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqB+mdKxPr44="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqB+mdKxRB1o=",
+											"_parent": {
+												"$ref": "AAAAAAFjqB+mdKxPr44="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqB+mc6xNTWc="
+											},
+											"visible": null,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 230,
+											"top": 543,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 30,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqB+mdKxPr44="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqB+mdKxSTJo=",
+											"_parent": {
+												"$ref": "AAAAAAFjqB+mdKxPr44="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqB+mc6xNTWc="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 202,
+											"top": 508,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": -1.5707963267948966,
+											"distance": 15,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqB+mdKxPr44="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"head": {
+										"$ref": "AAAAAAFjqB9/Taw5bl4="
+									},
+									"tail": {
+										"$ref": "AAAAAAFjqA2/Cata4OI="
+									},
+									"lineStyle": 1,
+									"points": "233:510;191:543",
+									"stereotypeDisplay": "label",
+									"showVisibility": true,
+									"showProperty": true,
+									"nameLabel": {
+										"$ref": "AAAAAAFjqB+mdKxQpVA="
+									},
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFjqB+mdKxRB1o="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFjqB+mdKxSTJo="
+									}
+								},
+								{
+									"_type": "UMLControlFlowView",
+									"_id": "AAAAAAFjqCBd1Kx5mCs=",
+									"_parent": {
+										"$ref": "AAAAAAFjqASLIKqg3FE="
+									},
+									"model": {
+										"$ref": "AAAAAAFjqCBd06x3DWs="
+									},
+									"subViews": [
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqCBd1Kx6qnM=",
+											"_parent": {
+												"$ref": "AAAAAAFjqCBd1Kx5mCs="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqCBd06x3DWs="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 162,
+											"top": 469,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 15,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqCBd1Kx5mCs="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqCBd1ax7Ky4=",
+											"_parent": {
+												"$ref": "AAAAAAFjqCBd1Kx5mCs="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqCBd06x3DWs="
+											},
+											"visible": null,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 175,
+											"top": 461,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 30,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqCBd1Kx5mCs="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqCBd1ax8vzU=",
+											"_parent": {
+												"$ref": "AAAAAAFjqCBd1Kx5mCs="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqCBd06x3DWs="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 137,
+											"top": 484,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": -1.5707963267948966,
+											"distance": 15,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqCBd1Kx5mCs="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"head": {
+										"$ref": "AAAAAAFjqB9/Taw5bl4="
+									},
+									"tail": {
+										"$ref": "AAAAAAFjqAWrCqrNuOs="
+									},
+									"lineStyle": 1,
+									"points": "116:424;185:543",
+									"stereotypeDisplay": "label",
+									"showVisibility": true,
+									"showProperty": true,
+									"nameLabel": {
+										"$ref": "AAAAAAFjqCBd1Kx6qnM="
+									},
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFjqCBd1ax7Ky4="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFjqCBd1ax8vzU="
+									}
+								},
+								{
+									"_type": "UMLActionView",
+									"_id": "AAAAAAFjqCEih6yTO40=",
+									"_parent": {
+										"$ref": "AAAAAAFjqASLIKqg3FE="
+									},
+									"model": {
+										"$ref": "AAAAAAFjqCEig6yRtTs="
+									},
+									"subViews": [
+										{
+											"_type": "UMLNameCompartmentView",
+											"_id": "AAAAAAFjqCEiiayUplA=",
+											"_parent": {
+												"$ref": "AAAAAAFjqCEih6yTO40="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqCEig6yRtTs="
+											},
+											"subViews": [
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqCEiiqyV3PI=",
+													"_parent": {
+														"$ref": "AAAAAAFjqCEiiayUplA="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Helvetica;12;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": -144,
+													"top": -128,
+													"width": 0,
+													"height": 12,
+													"autoResize": false,
+													"underline": false,
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqCEii6yWXBY=",
+													"_parent": {
+														"$ref": "AAAAAAFjqCEiiayUplA="
+													},
+													"visible": true,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Helvetica;12;1",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 132,
+													"top": 183,
+													"width": 111,
+													"height": 36,
+													"autoResize": false,
+													"underline": false,
+													"text": "Check if Event has been enabled by MFI",
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": true
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqCEii6yXfwg=",
+													"_parent": {
+														"$ref": "AAAAAAFjqCEiiayUplA="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Helvetica;12;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": -144,
+													"top": -128,
+													"width": 80,
+													"height": 12,
+													"autoResize": false,
+													"underline": false,
+													"text": "(from Activity1)",
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqCEii6yYpPQ=",
+													"_parent": {
+														"$ref": "AAAAAAFjqCEiiayUplA="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Helvetica;12;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": -144,
+													"top": -128,
+													"width": 0,
+													"height": 12,
+													"autoResize": false,
+													"underline": false,
+													"horizontalAlignment": 1,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												}
+											],
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 127,
+											"top": 176,
+											"width": 121,
+											"height": 48,
+											"autoResize": false,
+											"stereotypeLabel": {
+												"$ref": "AAAAAAFjqCEiiqyV3PI="
+											},
+											"nameLabel": {
+												"$ref": "AAAAAAFjqCEii6yWXBY="
+											},
+											"namespaceLabel": {
+												"$ref": "AAAAAAFjqCEii6yXfwg="
+											},
+											"propertyLabel": {
+												"$ref": "AAAAAAFjqCEii6yYpPQ="
+											}
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": true,
+									"containerExtending": false,
+									"left": 127,
+									"top": 176,
+									"width": 121,
+									"height": 64,
+									"autoResize": false,
+									"stereotypeDisplay": "label",
+									"showVisibility": true,
+									"showNamespace": false,
+									"showProperty": true,
+									"showType": true,
+									"nameCompartment": {
+										"$ref": "AAAAAAFjqCEiiayUplA="
+									},
+									"wordWrap": true
+								},
+								{
+									"_type": "UMLControlFlowView",
+									"_id": "AAAAAAFjqCJ5HqyxiME=",
+									"_parent": {
+										"$ref": "AAAAAAFjqASLIKqg3FE="
+									},
+									"model": {
+										"$ref": "AAAAAAFjqCJ5HayvTsA="
+									},
+									"subViews": [
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqCJ5H6yynz8=",
+											"_parent": {
+												"$ref": "AAAAAAFjqCJ5HqyxiME="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqCJ5HayvTsA="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 201,
+											"top": 256,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 15,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqCJ5HqyxiME="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqCJ5IKyzLqE=",
+											"_parent": {
+												"$ref": "AAAAAAFjqCJ5HqyxiME="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqCJ5HayvTsA="
+											},
+											"visible": null,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 216,
+											"top": 256,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 30,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqCJ5HqyxiME="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqCJ5IKy0y/c=",
+											"_parent": {
+												"$ref": "AAAAAAFjqCJ5HqyxiME="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqCJ5HayvTsA="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 172,
+											"top": 257,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": -1.5707963267948966,
+											"distance": 15,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqCJ5HqyxiME="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"head": {
+										"$ref": "AAAAAAFjqBIJL6ubZ3I="
+									},
+									"tail": {
+										"$ref": "AAAAAAFjqCEih6yTO40="
+									},
+									"lineStyle": 1,
+									"points": "187:240;187:287",
+									"stereotypeDisplay": "label",
+									"showVisibility": true,
+									"showProperty": true,
+									"nameLabel": {
+										"$ref": "AAAAAAFjqCJ5H6yynz8="
+									},
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFjqCJ5IKyzLqE="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFjqCJ5IKy0y/c="
+									}
+								}
+							]
+						}
+					],
+					"visibility": "public",
+					"isReentrant": true,
+					"isReadOnly": false,
+					"isSingleExecution": false,
+					"nodes": [
+						{
+							"_type": "UMLInitialNode",
+							"_id": "AAAAAAFjqASvhaqkmH0=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"name": "InitialNode1",
+							"visibility": "public"
+						},
+						{
+							"_type": "UMLAction",
+							"_id": "AAAAAAFjqATelKqpPIs=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"name": "JMSListener injects event",
+							"visibility": "public",
+							"kind": "opaque",
+							"isLocallyReentrant": false,
+							"isSynchronous": true
+						},
+						{
+							"_type": "UMLAction",
+							"_id": "AAAAAAFjqAWrCarLlr0=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"name": "retrieve receipt SMS and email contact",
+							"visibility": "public",
+							"kind": "opaque",
+							"isLocallyReentrant": false,
+							"isSynchronous": true
+						},
+						{
+							"_type": "UMLAction",
+							"_id": "AAAAAAFjqAYmKKrmL6s=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"name": "Prepare Message with template created",
+							"visibility": "public",
+							"kind": "opaque",
+							"isLocallyReentrant": false,
+							"isSynchronous": true
+						},
+						{
+							"_type": "UMLAction",
+							"_id": "AAAAAAFjqAZdgasAyFA=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"name": "Senders Objects transmit the data",
+							"visibility": "public",
+							"kind": "opaque",
+							"isLocallyReentrant": false,
+							"isSynchronous": true
+						},
+						{
+							"_type": "UMLActivityFinalNode",
+							"_id": "AAAAAAFjqAbQ7asd+Ww=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"name": "ActivityFinalNode1",
+							"visibility": "public"
+						},
+						{
+							"_type": "UMLAction",
+							"_id": "AAAAAAFjqA2/A6tYai0=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"name": "Locatize Template",
+							"visibility": "public",
+							"kind": "opaque",
+							"isLocallyReentrant": false,
+							"isSynchronous": true
+						},
+						{
+							"_type": "UMLForkNode",
+							"_id": "AAAAAAFjqBHP9auQV5g=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"name": "ForkNode1",
+							"visibility": "public"
+						},
+						{
+							"_type": "UMLForkNode",
+							"_id": "AAAAAAFjqBIJLquZsRo=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"name": "ForkNode2",
+							"visibility": "public"
+						},
+						{
+							"_type": "UMLJoinNode",
+							"_id": "AAAAAAFjqB9/S6w3TKM=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"name": "JoinNode1",
+							"visibility": "public"
+						},
+						{
+							"_type": "UMLAction",
+							"_id": "AAAAAAFjqCEig6yRtTs=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"name": "Check if Event has been enabled by MFI",
+							"visibility": "public",
+							"kind": "opaque",
+							"isLocallyReentrant": false,
+							"isSynchronous": true
+						}
+					],
+					"edges": [
+						{
+							"_type": "UMLControlFlow",
+							"_id": "AAAAAAFjqBEKGKt1+H8=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"source": {
+								"$ref": "AAAAAAFjqATelKqpPIs="
+							},
+							"target": {
+								"$ref": "AAAAAAFjqAWrCarLlr0="
+							},
+							"visibility": "public"
+						},
+						{
+							"_type": "UMLControlFlow",
+							"_id": "AAAAAAFjqBIoaquel/4=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"source": {
+								"$ref": "AAAAAAFjqATelKqpPIs="
+							},
+							"target": {
+								"$ref": "AAAAAAFjqCEig6yRtTs="
+							},
+							"visibility": "public"
+						},
+						{
+							"_type": "UMLControlFlow",
+							"_id": "AAAAAAFjqBKjHquv5CM=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"source": {
+								"$ref": "AAAAAAFjqASvhaqkmH0="
+							},
+							"target": {
+								"$ref": "AAAAAAFjqATelKqpPIs="
+							},
+							"visibility": "public"
+						},
+						{
+							"_type": "UMLControlFlow",
+							"_id": "AAAAAAFjqBLYAqvCSQk=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"source": {
+								"$ref": "AAAAAAFjqAYmKKrmL6s="
+							},
+							"target": {
+								"$ref": "AAAAAAFjqA2/A6tYai0="
+							},
+							"visibility": "public"
+						},
+						{
+							"_type": "UMLControlFlow",
+							"_id": "AAAAAAFjqBLqNqvTow0=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"source": {
+								"$ref": "AAAAAAFjqAZdgasAyFA="
+							},
+							"target": {
+								"$ref": "AAAAAAFjqAbQ7asd+Ww="
+							},
+							"visibility": "public"
+						},
+						{
+							"_type": "UMLControlFlow",
+							"_id": "AAAAAAFjqByuGavpb+Q=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"source": {
+								"$ref": "AAAAAAFjqATelKqpPIs="
+							},
+							"target": {
+								"$ref": "AAAAAAFjqAWrCarLlr0="
+							},
+							"visibility": "public"
+						},
+						{
+							"_type": "UMLControlFlow",
+							"_id": "AAAAAAFjqB0vKawF6iM=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"source": {
+								"$ref": "AAAAAAFjqBIJLquZsRo="
+							},
+							"target": {
+								"$ref": "AAAAAAFjqAWrCarLlr0="
+							},
+							"visibility": "public"
+						},
+						{
+							"_type": "UMLControlFlow",
+							"_id": "AAAAAAFjqB14s6wWTtM=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"source": {
+								"$ref": "AAAAAAFjqBIJLquZsRo="
+							},
+							"target": {
+								"$ref": "AAAAAAFjqAYmKKrmL6s="
+							},
+							"visibility": "public"
+						},
+						{
+							"_type": "UMLControlFlow",
+							"_id": "AAAAAAFjqB+W4qw8vc8=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"source": {
+								"$ref": "AAAAAAFjqB9/S6w3TKM="
+							},
+							"target": {
+								"$ref": "AAAAAAFjqAZdgasAyFA="
+							},
+							"visibility": "public"
+						},
+						{
+							"_type": "UMLControlFlow",
+							"_id": "AAAAAAFjqB+mc6xNTWc=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"source": {
+								"$ref": "AAAAAAFjqA2/A6tYai0="
+							},
+							"target": {
+								"$ref": "AAAAAAFjqB9/S6w3TKM="
+							},
+							"visibility": "public"
+						},
+						{
+							"_type": "UMLControlFlow",
+							"_id": "AAAAAAFjqCBd06x3DWs=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"source": {
+								"$ref": "AAAAAAFjqAWrCarLlr0="
+							},
+							"target": {
+								"$ref": "AAAAAAFjqB9/S6w3TKM="
+							},
+							"visibility": "public"
+						},
+						{
+							"_type": "UMLControlFlow",
+							"_id": "AAAAAAFjqCJ5HayvTsA=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"source": {
+								"$ref": "AAAAAAFjqCEig6yRtTs="
+							},
+							"target": {
+								"$ref": "AAAAAAFjqBIJLquZsRo="
+							},
+							"visibility": "public"
+						}
+					]
+				},
+				{
+					"_type": "UMLCollaboration",
+					"_id": "AAAAAAFjqCY2j5u3ys8=",
+					"_parent": {
+						"$ref": "AAAAAAFF+qBWK6M3Z8Y="
+					},
+					"name": "Collaboration1",
+					"ownedElements": [
+						{
+							"_type": "UMLInteraction",
+							"_id": "AAAAAAFjqCY2kpu4n0I=",
+							"_parent": {
+								"$ref": "AAAAAAFjqCY2j5u3ys8="
+							},
+							"name": "Interaction1",
+							"ownedElements": [
+								{
+									"_type": "UMLSequenceDiagram",
+									"_id": "AAAAAAFjqCY2kpu5KQk=",
+									"_parent": {
+										"$ref": "AAAAAAFjqCY2kpu4n0I="
+									},
+									"name": "SequenceDiagram1",
+									"visible": true,
+									"defaultDiagram": false,
+									"ownedViews": [
+										{
+											"_type": "UMLFrameView",
+											"_id": "AAAAAAFjqCY2k5u6GlA=",
+											"_parent": {
+												"$ref": "AAAAAAFjqCY2kpu5KQk="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqCY2kpu5KQk="
+											},
+											"subViews": [
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqCY2lJu7Oe8=",
+													"_parent": {
+														"$ref": "AAAAAAFjqCY2k5u6GlA="
+													},
+													"visible": true,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Helvetica;12;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 73,
+													"top": 10,
+													"width": 111,
+													"height": 12,
+													"autoResize": false,
+													"underline": false,
+													"text": "SequenceDiagram1",
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqCY2lZu8kXQ=",
+													"_parent": {
+														"$ref": "AAAAAAFjqCY2k5u6GlA="
+													},
+													"visible": true,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Helvetica;12;1",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 10,
+													"top": 10,
+													"width": 58,
+													"height": 12,
+													"autoResize": false,
+													"underline": false,
+													"text": "interaction",
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												}
+											],
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 5,
+											"top": 5,
+											"width": 695,
+											"height": 595,
+											"autoResize": false,
+											"nameLabel": {
+												"$ref": "AAAAAAFjqCY2lJu7Oe8="
+											},
+											"frameTypeLabel": {
+												"$ref": "AAAAAAFjqCY2lZu8kXQ="
+											}
+										},
+										{
+											"_type": "UMLSeqLifelineView",
+											"_id": "AAAAAAFjqCbCSJvIsEM=",
+											"_parent": {
+												"$ref": "AAAAAAFjqCY2kpu5KQk="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqCbCSJvHDpo="
+											},
+											"subViews": [
+												{
+													"_type": "UMLNameCompartmentView",
+													"_id": "AAAAAAFjqCbCSZvJ4ng=",
+													"_parent": {
+														"$ref": "AAAAAAFjqCbCSJvIsEM="
+													},
+													"model": {
+														"$ref": "AAAAAAFjqCbCSJvHDpo="
+													},
+													"subViews": [
+														{
+															"_type": "LabelView",
+															"_id": "AAAAAAFjqCbCSpvKaxs=",
+															"_parent": {
+																"$ref": "AAAAAAFjqCbCSZvJ4ng="
+															},
+															"visible": false,
+															"enabled": true,
+															"lineColor": "#000000",
+															"fillColor": "#ffffff",
+															"fontColor": "#000000",
+															"font": "Helvetica;12;0",
+															"showShadow": true,
+															"containerChangeable": false,
+															"containerExtending": false,
+															"left": 0,
+															"top": 0,
+															"width": 0,
+															"height": 12,
+															"autoResize": false,
+															"underline": false,
+															"horizontalAlignment": 2,
+															"verticalAlignment": 5,
+															"wordWrap": false
+														},
+														{
+															"_type": "LabelView",
+															"_id": "AAAAAAFjqCbCSpvLXu8=",
+															"_parent": {
+																"$ref": "AAAAAAFjqCbCSZvJ4ng="
+															},
+															"visible": true,
+															"enabled": true,
+															"lineColor": "#000000",
+															"fillColor": "#ffffff",
+															"fontColor": "#000000",
+															"font": "Helvetica;12;1",
+															"showShadow": true,
+															"containerChangeable": false,
+															"containerExtending": false,
+															"left": 37,
+															"top": 47,
+															"width": 90,
+															"height": 12,
+															"autoResize": false,
+															"underline": false,
+															"text": "EventListener",
+															"horizontalAlignment": 2,
+															"verticalAlignment": 5,
+															"wordWrap": false
+														},
+														{
+															"_type": "LabelView",
+															"_id": "AAAAAAFjqCbCSpvMWyQ=",
+															"_parent": {
+																"$ref": "AAAAAAFjqCbCSZvJ4ng="
+															},
+															"visible": false,
+															"enabled": true,
+															"lineColor": "#000000",
+															"fillColor": "#ffffff",
+															"fontColor": "#000000",
+															"font": "Helvetica;12;0",
+															"showShadow": true,
+															"containerChangeable": false,
+															"containerExtending": false,
+															"left": 0,
+															"top": 0,
+															"width": 99,
+															"height": 12,
+															"autoResize": false,
+															"underline": false,
+															"text": "(from Interaction1)",
+															"horizontalAlignment": 2,
+															"verticalAlignment": 5,
+															"wordWrap": false
+														},
+														{
+															"_type": "LabelView",
+															"_id": "AAAAAAFjqCbCS5vNZUs=",
+															"_parent": {
+																"$ref": "AAAAAAFjqCbCSZvJ4ng="
+															},
+															"visible": false,
+															"enabled": true,
+															"lineColor": "#000000",
+															"fillColor": "#ffffff",
+															"fontColor": "#000000",
+															"font": "Helvetica;12;0",
+															"showShadow": true,
+															"containerChangeable": false,
+															"containerExtending": false,
+															"left": 0,
+															"top": 0,
+															"width": 0,
+															"height": 12,
+															"autoResize": false,
+															"underline": false,
+															"horizontalAlignment": 1,
+															"verticalAlignment": 5,
+															"wordWrap": false
+														}
+													],
+													"visible": true,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Helvetica;12;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 32,
+													"top": 40,
+													"width": 100,
+													"height": 40,
+													"autoResize": false,
+													"stereotypeLabel": {
+														"$ref": "AAAAAAFjqCbCSpvKaxs="
+													},
+													"nameLabel": {
+														"$ref": "AAAAAAFjqCbCSpvLXu8="
+													},
+													"namespaceLabel": {
+														"$ref": "AAAAAAFjqCbCSpvMWyQ="
+													},
+													"propertyLabel": {
+														"$ref": "AAAAAAFjqCbCS5vNZUs="
+													}
+												},
+												{
+													"_type": "UMLLinePartView",
+													"_id": "AAAAAAFjqCbCS5vOH9k=",
+													"_parent": {
+														"$ref": "AAAAAAFjqCbCSJvIsEM="
+													},
+													"model": {
+														"$ref": "AAAAAAFjqCbCSJvHDpo="
+													},
+													"visible": true,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Helvetica;12;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 82,
+													"top": 80,
+													"width": 1,
+													"height": 160,
+													"autoResize": false
+												}
+											],
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 32,
+											"top": 40,
+											"width": 100,
+											"height": 200,
+											"autoResize": false,
+											"stereotypeDisplay": "label",
+											"showVisibility": true,
+											"showNamespace": false,
+											"showProperty": true,
+											"showType": true,
+											"nameCompartment": {
+												"$ref": "AAAAAAFjqCbCSZvJ4ng="
+											},
+											"wordWrap": false,
+											"linePart": {
+												"$ref": "AAAAAAFjqCbCS5vOH9k="
+											}
+										}
+									],
+									"showSequenceNumber": true,
+									"showSignature": true,
+									"showActivation": true
+								}
+							],
+							"visibility": "public",
+							"isReentrant": true,
+							"participants": [
+								{
+									"_type": "UMLLifeline",
+									"_id": "AAAAAAFjqCbCSJvHDpo=",
+									"_parent": {
+										"$ref": "AAAAAAFjqCY2kpu4n0I="
+									},
+									"name": "EventListener",
+									"visibility": "public",
+									"represent": {
+										"$ref": "AAAAAAFjqCbCR5vGwmU="
+									},
+									"isMultiInstance": false
+								}
+							]
+						}
+					],
+					"visibility": "public",
+					"attributes": [
+						{
+							"_type": "UMLAttribute",
+							"_id": "AAAAAAFjqCbCR5vGwmU=",
+							"_parent": {
+								"$ref": "AAAAAAFjqCY2j5u3ys8="
+							},
+							"name": "Role1",
+							"visibility": "public",
+							"isStatic": false,
+							"isLeaf": false,
+							"type": "",
+							"isReadOnly": false,
+							"isOrdered": false,
+							"isUnique": false,
+							"isDerived": false,
+							"aggregation": "none",
+							"isID": false
+						}
+					],
+					"isAbstract": false,
+					"isFinalSpecialization": false,
+					"isLeaf": false
+				},
+				{
+					"_type": "UMLUseCaseDiagram",
+					"_id": "AAAAAAFjuvxSC6RUg4A=",
+					"_parent": {
+						"$ref": "AAAAAAFF+qBWK6M3Z8Y="
+					},
+					"name": "CustomerUseCase",
+					"visible": true,
+					"defaultDiagram": false,
+					"ownedViews": [
+						{
+							"_type": "UMLUseCaseSubjectView",
+							"_id": "AAAAAAFjuv4gOKRa+jQ=",
+							"_parent": {
+								"$ref": "AAAAAAFjuvxSC6RUg4A="
+							},
+							"model": {
+								"$ref": "AAAAAAFjuv4gOKRYAw8="
+							},
+							"subViews": [
+								{
+									"_type": "UMLNameCompartmentView",
+									"_id": "AAAAAAFjuv4gOaRbEkE=",
+									"_parent": {
+										"$ref": "AAAAAAFjuv4gOKRa+jQ="
+									},
+									"model": {
+										"$ref": "AAAAAAFjuv4gOKRYAw8="
+									},
+									"subViews": [
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFjuv4gOaRczFQ=",
+											"_parent": {
+												"$ref": "AAAAAAFjuv4gOaRbEkE="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 0,
+											"top": 0,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFjuv4gOaRdgAQ=",
+											"_parent": {
+												"$ref": "AAAAAAFjuv4gOaRbEkE="
+											},
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;1",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 213,
+											"top": 39,
+											"width": 478,
+											"height": 12,
+											"autoResize": false,
+											"underline": false,
+											"text": "Notification Microservice",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFjuv4gOaReStM=",
+											"_parent": {
+												"$ref": "AAAAAAFjuv4gOaRbEkE="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 0,
+											"top": 0,
+											"width": 69,
+											"height": 12,
+											"autoResize": false,
+											"underline": false,
+											"text": "(from Model)",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFjuv4gOaRf7IE=",
+											"_parent": {
+												"$ref": "AAAAAAFjuv4gOaRbEkE="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 0,
+											"top": 0,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"underline": false,
+											"horizontalAlignment": 1,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 208,
+									"top": 32,
+									"width": 488,
+									"height": 24,
+									"autoResize": false,
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFjuv4gOaRczFQ="
+									},
+									"nameLabel": {
+										"$ref": "AAAAAAFjuv4gOaRdgAQ="
+									},
+									"namespaceLabel": {
+										"$ref": "AAAAAAFjuv4gOaReStM="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFjuv4gOaRf7IE="
+									}
+								}
+							],
+							"visible": true,
+							"enabled": true,
+							"lineColor": "#000000",
+							"fillColor": "#ffffff",
+							"fontColor": "#000000",
+							"font": "Helvetica;12;0",
+							"showShadow": true,
+							"containerChangeable": false,
+							"containerExtending": false,
+							"left": 208,
+							"top": 32,
+							"width": 488,
+							"height": 608,
+							"autoResize": false,
+							"stereotypeDisplay": "label",
+							"showVisibility": true,
+							"showNamespace": false,
+							"showProperty": true,
+							"showType": true,
+							"nameCompartment": {
+								"$ref": "AAAAAAFjuv4gOaRbEkE="
+							},
+							"wordWrap": false
+						},
+						{
+							"_type": "UMLActorView",
+							"_id": "AAAAAAFjuv6kb6R0A6g=",
+							"_parent": {
+								"$ref": "AAAAAAFjuvxSC6RUg4A="
+							},
+							"model": {
+								"$ref": "AAAAAAFjuv6kbaRyZy0="
+							},
+							"subViews": [
+								{
+									"_type": "UMLNameCompartmentView",
+									"_id": "AAAAAAFjuv6kcKR1JNo=",
+									"_parent": {
+										"$ref": "AAAAAAFjuv6kb6R0A6g="
+									},
+									"model": {
+										"$ref": "AAAAAAFjuv6kbaRyZy0="
+									},
+									"subViews": [
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFjuv6kcKR2baE=",
+											"_parent": {
+												"$ref": "AAAAAAFjuv6kcKR1JNo="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": -112,
+											"top": 352,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFjuv6kcaR3JSY=",
+											"_parent": {
+												"$ref": "AAAAAAFjuv6kcKR1JNo="
+											},
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;1",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 61,
+											"top": 341,
+											"width": 134,
+											"height": 12,
+											"autoResize": false,
+											"underline": false,
+											"text": "customer microservice",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFjuv6kcaR4LTc=",
+											"_parent": {
+												"$ref": "AAAAAAFjuv6kcKR1JNo="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": -112,
+											"top": 352,
+											"width": 69,
+											"height": 12,
+											"autoResize": false,
+											"underline": false,
+											"text": "(from Model)",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFjuv6kcaR5qOc=",
+											"_parent": {
+												"$ref": "AAAAAAFjuv6kcKR1JNo="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": -112,
+											"top": 352,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"underline": false,
+											"horizontalAlignment": 1,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 56,
+									"top": 334,
+									"width": 144,
+									"height": 24,
+									"autoResize": false,
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFjuv6kcKR2baE="
+									},
+									"nameLabel": {
+										"$ref": "AAAAAAFjuv6kcaR3JSY="
+									},
+									"namespaceLabel": {
+										"$ref": "AAAAAAFjuv6kcaR4LTc="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFjuv6kcaR5qOc="
+									}
+								},
+								{
+									"_type": "UMLAttributeCompartmentView",
+									"_id": "AAAAAAFjuv6kcqR6rvs=",
+									"_parent": {
+										"$ref": "AAAAAAFjuv6kb6R0A6g="
+									},
+									"model": {
+										"$ref": "AAAAAAFjuv6kbaRyZy0="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": -56,
+									"top": 176,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLOperationCompartmentView",
+									"_id": "AAAAAAFjuv6kcqR7HEk=",
+									"_parent": {
+										"$ref": "AAAAAAFjuv6kb6R0A6g="
+									},
+									"model": {
+										"$ref": "AAAAAAFjuv6kbaRyZy0="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": -56,
+									"top": 176,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLReceptionCompartmentView",
+									"_id": "AAAAAAFjuv6kc6R8FZ0=",
+									"_parent": {
+										"$ref": "AAAAAAFjuv6kb6R0A6g="
+									},
+									"model": {
+										"$ref": "AAAAAAFjuv6kbaRyZy0="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": -56,
+									"top": 176,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLTemplateParameterCompartmentView",
+									"_id": "AAAAAAFjuv6kdKR9/xc=",
+									"_parent": {
+										"$ref": "AAAAAAFjuv6kb6R0A6g="
+									},
+									"model": {
+										"$ref": "AAAAAAFjuv6kbaRyZy0="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": -56,
+									"top": 176,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								}
+							],
+							"visible": true,
+							"enabled": true,
+							"lineColor": "#000000",
+							"fillColor": "#ffffff",
+							"fontColor": "#000000",
+							"font": "Helvetica;12;0",
+							"showShadow": true,
+							"containerChangeable": true,
+							"containerExtending": false,
+							"left": 56,
+							"top": 280,
+							"width": 144,
+							"height": 79,
+							"autoResize": false,
+							"stereotypeDisplay": "label",
+							"showVisibility": true,
+							"showNamespace": false,
+							"showProperty": true,
+							"showType": true,
+							"nameCompartment": {
+								"$ref": "AAAAAAFjuv6kcKR1JNo="
+							},
+							"wordWrap": false,
+							"suppressAttributes": true,
+							"suppressOperations": true,
+							"suppressReceptions": true,
+							"showMultiplicity": true,
+							"showOperationSignature": true,
+							"attributeCompartment": {
+								"$ref": "AAAAAAFjuv6kcqR6rvs="
+							},
+							"operationCompartment": {
+								"$ref": "AAAAAAFjuv6kcqR7HEk="
+							},
+							"receptionCompartment": {
+								"$ref": "AAAAAAFjuv6kc6R8FZ0="
+							},
+							"templateParameterCompartment": {
+								"$ref": "AAAAAAFjuv6kdKR9/xc="
+							}
+						},
+						{
+							"_type": "UMLUseCaseView",
+							"_id": "AAAAAAFjuv/XzaSib0Y=",
+							"_parent": {
+								"$ref": "AAAAAAFjuvxSC6RUg4A="
+							},
+							"model": {
+								"$ref": "AAAAAAFjuv/XzKSgDcQ="
+							},
+							"subViews": [
+								{
+									"_type": "UMLNameCompartmentView",
+									"_id": "AAAAAAFjuv/XzqSjIc4=",
+									"_parent": {
+										"$ref": "AAAAAAFjuv/XzaSib0Y="
+									},
+									"model": {
+										"$ref": "AAAAAAFjuv/XzKSgDcQ="
+									},
+									"subViews": [
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFjuv/Xz6SkS8o=",
+											"_parent": {
+												"$ref": "AAAAAAFjuv/XzqSjIc4="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": -80,
+											"top": -96,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFjuv/X0KSlY0g=",
+											"_parent": {
+												"$ref": "AAAAAAFjuv/XzqSjIc4="
+											},
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;1",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 330.5,
+											"top": 104,
+											"width": 92,
+											"height": 36,
+											"autoResize": false,
+											"underline": false,
+											"text": "Account Created Notification",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": true
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFjuv/X0KSmuPo=",
+											"_parent": {
+												"$ref": "AAAAAAFjuv/XzqSjIc4="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": -80,
+											"top": -96,
+											"width": 69,
+											"height": 12,
+											"autoResize": false,
+											"underline": false,
+											"text": "(from Model)",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFjuv/X0KSnIG4=",
+											"_parent": {
+												"$ref": "AAAAAAFjuv/XzqSjIc4="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": -80,
+											"top": -96,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"underline": false,
+											"horizontalAlignment": 1,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 325.5,
+									"top": 97,
+									"width": 102,
+									"height": 48,
+									"autoResize": false,
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFjuv/Xz6SkS8o="
+									},
+									"nameLabel": {
+										"$ref": "AAAAAAFjuv/X0KSlY0g="
+									},
+									"namespaceLabel": {
+										"$ref": "AAAAAAFjuv/X0KSmuPo="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFjuv/X0KSnIG4="
+									}
+								},
+								{
+									"_type": "UMLAttributeCompartmentView",
+									"_id": "AAAAAAFjuv/X0aSocII=",
+									"_parent": {
+										"$ref": "AAAAAAFjuv/XzaSib0Y="
+									},
+									"model": {
+										"$ref": "AAAAAAFjuv/XzKSgDcQ="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": -40,
+									"top": -48,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLOperationCompartmentView",
+									"_id": "AAAAAAFjuv/X0qSpfns=",
+									"_parent": {
+										"$ref": "AAAAAAFjuv/XzaSib0Y="
+									},
+									"model": {
+										"$ref": "AAAAAAFjuv/XzKSgDcQ="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": -40,
+									"top": -48,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLReceptionCompartmentView",
+									"_id": "AAAAAAFjuv/X0qSqNoc=",
+									"_parent": {
+										"$ref": "AAAAAAFjuv/XzaSib0Y="
+									},
+									"model": {
+										"$ref": "AAAAAAFjuv/XzKSgDcQ="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": -40,
+									"top": -48,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLTemplateParameterCompartmentView",
+									"_id": "AAAAAAFjuv/X06Sr5DM=",
+									"_parent": {
+										"$ref": "AAAAAAFjuv/XzaSib0Y="
+									},
+									"model": {
+										"$ref": "AAAAAAFjuv/XzKSgDcQ="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": -40,
+									"top": -48,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLExtensionPointCompartmentView",
+									"_id": "AAAAAAFjuv/X1KSsXMU=",
+									"_parent": {
+										"$ref": "AAAAAAFjuv/XzaSib0Y="
+									},
+									"model": {
+										"$ref": "AAAAAAFjuv/XzKSgDcQ="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": -40,
+									"top": -48,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								}
+							],
+							"visible": true,
+							"enabled": true,
+							"lineColor": "#000000",
+							"fillColor": "#ffffff",
+							"fontColor": "#000000",
+							"font": "Helvetica;12;0",
+							"showShadow": true,
+							"containerChangeable": true,
+							"containerExtending": false,
+							"left": 304,
+							"top": 88,
+							"width": 145,
+							"height": 67,
+							"autoResize": false,
+							"stereotypeDisplay": "label",
+							"showVisibility": true,
+							"showNamespace": false,
+							"showProperty": true,
+							"showType": true,
+							"nameCompartment": {
+								"$ref": "AAAAAAFjuv/XzqSjIc4="
+							},
+							"wordWrap": true,
+							"suppressAttributes": true,
+							"suppressOperations": true,
+							"suppressReceptions": true,
+							"showMultiplicity": true,
+							"showOperationSignature": true,
+							"attributeCompartment": {
+								"$ref": "AAAAAAFjuv/X0aSocII="
+							},
+							"operationCompartment": {
+								"$ref": "AAAAAAFjuv/X0qSpfns="
+							},
+							"receptionCompartment": {
+								"$ref": "AAAAAAFjuv/X0qSqNoc="
+							},
+							"templateParameterCompartment": {
+								"$ref": "AAAAAAFjuv/X06Sr5DM="
+							},
+							"extensionPointCompartment": {
+								"$ref": "AAAAAAFjuv/X1KSsXMU="
+							}
+						}
+					]
+				},
+				{
+					"_type": "UMLUseCaseSubject",
+					"_id": "AAAAAAFjuv4gOKRYAw8=",
+					"_parent": {
+						"$ref": "AAAAAAFF+qBWK6M3Z8Y="
+					},
+					"name": "Notification Microservice",
+					"visibility": "public"
+				},
+				{
+					"_type": "UMLActor",
+					"_id": "AAAAAAFjuv6kbaRyZy0=",
+					"_parent": {
+						"$ref": "AAAAAAFF+qBWK6M3Z8Y="
+					},
+					"name": "customer microservice",
+					"visibility": "public",
+					"isAbstract": false,
+					"isFinalSpecialization": false,
+					"isLeaf": false
+				},
+				{
+					"_type": "UMLUseCase",
+					"_id": "AAAAAAFjuv/XzKSgDcQ=",
+					"_parent": {
+						"$ref": "AAAAAAFF+qBWK6M3Z8Y="
+					},
+					"name": "Account Created Notification",
+					"visibility": "public",
+					"isAbstract": false,
+					"isFinalSpecialization": false,
+					"isLeaf": false
+				}
+			],
+			"visibility": "public"
+		}
+	]
+}
\ No newline at end of file


[fineract-cn-notifications] 10/15: test

Posted by my...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

myrle pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract-cn-notifications.git

commit 041ec3473717bfa0d45ca7f73cbafa4634e7bdb5
Author: Ebenezer Graham <eg...@alustudent.com>
AuthorDate: Fri Jun 15 04:04:00 2018 +0400

    test
---
 .../service/listener/OfficeEventListener.java      | 48 ++++++++++++++--------
 1 file changed, 32 insertions(+), 16 deletions(-)

diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/OfficeEventListener.java b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/OfficeEventListener.java
index c77510e..9f083c5 100644
--- a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/OfficeEventListener.java
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/OfficeEventListener.java
@@ -16,12 +16,14 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-/*
+
 package org.apache.fineract.cn.notification.service.listener;
 
-import org.apache.fineract.cn.accounting.api.v1.EventConstants;
+import org.apache.fineract.cn.notification.service.internal.service.EmailSender;
+import org.apache.fineract.cn.notification.service.internal.service.SMSSender;
+import org.apache.fineract.cn.office.api.v1.EventConstants;
 import org.apache.fineract.cn.lang.config.TenantHeaderFilter;
-import org.apache.fineract.cn.test.listener.EventRecorder;
+import org.apache.fineract.cn.office.api.v1.client.OrganizationManager;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.jms.annotation.JmsListener;
 import org.springframework.messaging.handler.annotation.Header;
@@ -30,15 +32,35 @@ import org.springframework.stereotype.Component;
 @Component
 public class OfficeEventListener {
 
-    private final EventRecorder eventRecorder;
+	private OrganizationManager organizationManager;
+	private SMSSender smsSender;
+	private EmailSender emailSender;
 
-    @Autowired
-    public OfficeEventListener(final EventRecorder eventRecorder) {
-        super();
-        this.eventRecorder = eventRecorder;
-    }
+	@Autowired
+	public OfficeEventListener(final OrganizationManager organizationManager, SMSSender smsSender,
+	                           final EmailSender emailSender) {
+		this.organizationManager = organizationManager;
+		this.smsSender = smsSender;
+		this.emailSender = emailSender;
+	}
 
-    @JmsListener(
+	@JmsListener(
+			subscription = EventConstants.DESTINATION,
+			destination = EventConstants.DESTINATION,
+			selector = EventConstants.SELECTOR_POST_OFFICE
+	)
+	public void onCreateOffice(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+	                           final String payload) {
+		//for testing purposes
+		String office = this.organizationManager.findOfficeByIdentifier(payload).getName();
+		if (office.equalsIgnoreCase("Head Office")) {
+			smsSender.sendSMS("+23058409206", "Test From Demo");
+		}
+	}
+}
+
+/*
+	@JmsListener(
             subscription = EventConstants.DESTINATION,
             destination = EventConstants.DESTINATION,
             selector = EventConstants.SELECTOR_POST_EMPLOYEE
@@ -88,12 +110,6 @@ public class OfficeEventListener {
         this.eventRecorder.event(tenant, EventConstants.OPERATION_DELETE_CONTACT_DETAIL, eventPayload, String.class);
     }
 
-    public void onCreateOffice(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
-                               final String payload)
-            throws Exception {
-        this.eventRecorder.event(tenant, EventConstants.OPERATION_POST_OFFICE, payload, String.class);
-    }
-
     @JmsListener(
             subscription = EventConstants.DESTINATION,
             destination = EventConstants.DESTINATION,


[fineract-cn-notifications] 14/15: added dependencies to shared gradle file

Posted by my...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

myrle pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract-cn-notifications.git

commit 4bf46aa995ba4708f651da141b62ac672e2457da
Author: Ebenezer Graham <eg...@alustudent.com>
AuthorDate: Fri Jun 15 18:27:21 2018 +0400

    added dependencies to shared gradle file
---
 service/build.gradle                               | 15 ++++++++--
 .../service/internal/service/SMSSender.java        |  2 +-
 .../service/listener/CustomerEventListener.java    | 34 ++++++++++++++++++++--
 .../service/listener/OfficeEventListener.java      |  1 +
 .../service/listener/PortfolioEventListener.java   | 16 +++-------
 5 files changed, 51 insertions(+), 17 deletions(-)

diff --git a/service/build.gradle b/service/build.gradle
index 57f507d..42b1c6f 100644
--- a/service/build.gradle
+++ b/service/build.gradle
@@ -46,12 +46,23 @@ springBoot {
 dependencies {
     compile(
             [group: 'com.twilio.sdk', name: 'twilio', version: '7.17.+'],
+            [group: 'org.springframework.boot', name: 'spring-boot-starter-mail', version: '1.4.3.RELEASE'],
+
             [group: 'org.apache.fineract.cn.customer', name: 'api', version: versions.fineractcncustomer],
+            [group: 'org.apache.fineract.cn.office', name: 'api', version: versions.fineractcnoffice],
+            [group: 'org.apache.fineract.cn.portfolio', name: 'api', version: versions.fineractcnportfolio],
+            [group: 'org.apache.fineract.cn.group', name: 'api', version: versions.fineractcngroup],
+
+            //[group: 'org.apache.fineract.cn.deposit-account-management', name: 'api', version: versions.fineractcndeposit],
+            //[group: 'org.apache.fineract.cn.teller', name: 'api', version: versions.fineractcnteller],
+            //[group: 'org.apache.fineract.cn.reporting', name: 'api', version: versions.fineractcnreporting],
+            //[group: 'org.apache.fineract.cn.cheques', name: 'api', version: versions.kuelapcheques],
+            //[group: 'org.apache.fineract.cn.payroll', name: 'api', version: versions.fineractcnpayroll],
+            //[group: 'org.apache.fineract.cn.notification', name: 'api', version: versions.fineractcnnotification],
+
             [group: 'org.springframework.cloud', name: 'spring-cloud-starter-config'],
             [group: 'org.springframework.cloud', name: 'spring-cloud-starter-eureka'],
             [group: 'org.springframework.boot', name: 'spring-boot-starter-jetty'],
-            //check this dependency
-            [group: 'org.springframework.boot', name: 'spring-boot-starter-mail', version: '1.4.3.RELEASE'],
             [group: 'org.apache.fineract.cn.notification', name: 'api', version: project.version],
             [group: 'org.apache.fineract.cn.anubis', name: 'library', version: versions.frameworkanubis],
             [group: 'com.google.code.gson', name: 'gson'],
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/SMSSender.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/SMSSender.java
index 48a7ac9..ed98bea 100644
--- a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/SMSSender.java
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/SMSSender.java
@@ -54,4 +54,4 @@ public class SMSSender {
         System.out.println(message.getSid());
         System.out.println(message.getStatus());
     }
-    }
\ No newline at end of file
+}
\ No newline at end of file
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/CustomerEventListener.java b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/CustomerEventListener.java
index 3f4c771..7db634a 100644
--- a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/CustomerEventListener.java
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/CustomerEventListener.java
@@ -26,6 +26,7 @@ import org.apache.fineract.cn.customer.api.v1.domain.ContactDetail;
 import org.apache.fineract.cn.customer.api.v1.domain.Customer;
 import org.apache.fineract.cn.notification.service.internal.service.EmailSender;
 import org.apache.fineract.cn.notification.service.internal.service.SMSSender;
+import org.slf4j.Logger;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.jms.annotation.JmsListener;
 import org.springframework.messaging.handler.annotation.Header;
@@ -38,12 +39,15 @@ public class CustomerEventListener {
         private CustomerManager customerManager;
         private SMSSender smsSender;
         private EmailSender emailSender;
+        private final Logger logger;
 
         @Autowired
-        public CustomerEventListener( final CustomerManager customerManager, SMSSender smsSender, EmailSender emailSender ) {
+        public CustomerEventListener( final CustomerManager customerManager,
+                                      SMSSender smsSender, EmailSender emailSender, @Autowired Logger logger ) {
             this.customerManager = customerManager;
             this.smsSender = smsSender;
             this.emailSender = emailSender;
+            this.logger = logger;
             smsSender.sendSMS("+23058409206","just to be sure listen has been instantiated");
         }
 
@@ -55,7 +59,10 @@ public class CustomerEventListener {
                                          final String payload) {
             System.out.println(payload);
             Customer customer = customerManager.findCustomer(payload);
-            System.out.println("This is the customer created: " + customer.getGivenName());
+            System.out.println("This is the customer created: "
+                    + customer.getGivenName() +"--payload" + payload +"--tenant"+ tenant);
+            this.logger.info("Logger --- This is the customer created: "
+                    + customer.getGivenName() +"--payload" + payload +"--tenant"+ tenant);
             if (customer.getContactDetails().size() > 0) {
                 customer.getContactDetails().forEach(contactDetail -> {
                     if (contactDetail.getType().equals(ContactDetail.Type.PHONE)) {
@@ -77,7 +84,12 @@ public class CustomerEventListener {
     )
     public void customerActivatedEvent(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
                                        final String payload) {
+
         Customer customer = customerManager.findCustomer(payload);
+        System.out.println("This is the customer created: "
+                + customer.getGivenName() +"--payload" + payload +"--tenant"+ tenant);
+        this.logger.info("Logger --- This is the customer created: "
+                + customer.getGivenName() +"--payload" + payload +"--tenant"+ tenant);
         if(customer.getCurrentState().equalsIgnoreCase("ACTIVE")){
             customer.getContactDetails().forEach(contact-> {
                 if (contact.getType().equals(ContactDetail.Type.PHONE)) {
@@ -99,6 +111,10 @@ public class CustomerEventListener {
     public void customerLockedEvent(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
                                     final String payload) {
         Customer customer = customerManager.findCustomer(payload);
+        System.out.println("This is the customer created: "
+                + customer.getGivenName() +"--payload" + payload +"--tenant"+ tenant);
+        this.logger.info("Logger --- This is the customer created: "
+                + customer.getGivenName() +"--payload" + payload +"--tenant"+ tenant);
         if(customer.getCurrentState().equalsIgnoreCase("LOCKED")){
             customer.getContactDetails().forEach(contact-> {
                 if (contact.getType().equals(ContactDetail.Type.PHONE)) {
@@ -120,6 +136,11 @@ public class CustomerEventListener {
     public void customerUnlockedEvent(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
                                       final String payload) {
         Customer customer = customerManager.findCustomer(payload);
+
+        System.out.println("This is the customer created: "
+                + customer.getGivenName() +"--payload" + payload +"--tenant"+ tenant);
+        this.logger.info("Logger --- This is the customer created: "
+                + customer.getGivenName() +"--payload" + payload +"--tenant"+ tenant);
         if(customer.getCurrentState().equalsIgnoreCase("LOCKED")){
             customer.getContactDetails().forEach(contact-> {
                 if (contact.getType().equals(ContactDetail.Type.PHONE)) {
@@ -141,6 +162,11 @@ public class CustomerEventListener {
     public void customerClosedEvent(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
                                     final String payload) {
         Customer customer = customerManager.findCustomer(payload);
+        System.out.println("This is the customer created: "
+                + customer.getGivenName() +"--payload" + payload +"--tenant"+ tenant);
+        this.logger.info("Logger --- This is the customer created: "
+                + customer.getGivenName() +"--payload" + payload +"--tenant"+ tenant);
+
         if(customer.getCurrentState().equalsIgnoreCase("CLOSED")){
             customer.getContactDetails().forEach(contact-> {
                 if (contact.getType().equals(ContactDetail.Type.PHONE)) {
@@ -162,6 +188,10 @@ public class CustomerEventListener {
     public void customerReopenedEvent(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
                                       final String payload) {
         Customer customer = customerManager.findCustomer(payload);
+        System.out.println("This is the customer created: "
+                + customer.getGivenName() +"--payload" + payload +"--tenant"+ tenant);
+        this.logger.info("Logger --- This is the customer created: "
+                + customer.getGivenName() +"--payload" + payload +"--tenant"+ tenant);
         if(customer.getCurrentState().equalsIgnoreCase("LOCKED")){
             customer.getContactDetails().forEach(contact-> {
                 if (contact.getType().equals(ContactDetail.Type.PHONE)) {
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/OfficeEventListener.java b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/OfficeEventListener.java
index 9f083c5..219c830 100644
--- a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/OfficeEventListener.java
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/OfficeEventListener.java
@@ -30,6 +30,7 @@ import org.springframework.messaging.handler.annotation.Header;
 import org.springframework.stereotype.Component;
 
 @Component
+@SuppressWarnings("unused")
 public class OfficeEventListener {
 
 	private OrganizationManager organizationManager;
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/PortfolioEventListener.java b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/PortfolioEventListener.java
index 4f8f9d0..50697b2 100644
--- a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/PortfolioEventListener.java
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/PortfolioEventListener.java
@@ -50,7 +50,8 @@ public class PortfolioEventListener {
             destination = IndividualLoanEventConstants.DESTINATION,
             selector = IndividualLoanEventConstants.SELECTOR_DENY_INDIVIDUALLOAN_CASE
     )
-    public void onDeny(final String payload) {
+    public void onDeny(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                       final String payload) {
 
     }
 
@@ -99,7 +100,7 @@ public class PortfolioEventListener {
             destination = IndividualLoanEventConstants.DESTINATION,
             selector = IndividualLoanEventConstants.SELECTOR_OPEN_INDIVIDUALLOAN_CASE
     )
-    public void onOpen(//@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+    public void onOpen(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
                        final String payload) {
 
     }
@@ -128,7 +129,7 @@ public class PortfolioEventListener {
                 destination = EventConstants.DESTINATION,
                 selector = EventConstants.SELECTOR_POST_GROUP
         )
-        public void onGroupCreated(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+    public void onGroupCreated(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
                                    final String payload) {
 
         }
@@ -142,13 +143,4 @@ public class PortfolioEventListener {
                                      final String payload) {
         }
 
-        @JmsListener(
-                subscription = EventConstants.DESTINATION,
-                destination = EventConstants.DESTINATION,
-                selector = EventConstants.SELECTOR_PUT_GROUP
-        )
-        public void onGroupUpdated(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
-                                   final String payload) {
-        }
-
     }


[fineract-cn-notifications] 12/15: Merge remote-tracking branch 'origin/develop' into develop

Posted by my...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

myrle pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract-cn-notifications.git

commit eb95c41ae22d7d8409a2af2aaf42644262f2123b
Merge: 47709b8 041ec34
Author: Ebenezer Graham <eg...@alustudent.com>
AuthorDate: Fri Jun 15 15:36:42 2018 +0400

    Merge remote-tracking branch 'origin/develop' into develop



[fineract-cn-notifications] 06/15: fixed the build error

Posted by my...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

myrle pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract-cn-notifications.git

commit 3cb782124fe392793fdb22317071af90b8c0995f
Author: Ebenezer Graham <eg...@alustudent.com>
AuthorDate: Thu Jun 14 23:03:30 2018 +0400

    fixed the build error
---
 .travis.yml | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 49 insertions(+)

diff --git a/.travis.yml b/.travis.yml
new file mode 100644
index 0000000..1ee78cd
--- /dev/null
+++ b/.travis.yml
@@ -0,0 +1,49 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+language: java
+
+jdk: oraclejdk8
+
+sudo: enabled
+
+branches:
+  only:
+    - develop
+
+
+cache:
+  directories:
+  - $HOME/.m2
+
+install:
+ - gradle install
+
+notifications:
+  email: true
+
+  deploy:
+    -
+      on:
+        branch: develop
+      provider: bintray
+      skip_cleanup: true
+      #file: target/bin/bintray.json
+      user: ebenezergraham
+      # key: $BINTRAY_API_KEY
\ No newline at end of file


[fineract-cn-notifications] 15/15: update

Posted by my...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

myrle pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract-cn-notifications.git

commit f3296bb4fdc76a2ed0c51df6739c9d299991de71
Author: Ebenezer Graham <eg...@alustudent.com>
AuthorDate: Tue Jun 19 19:13:32 2018 +0400

    update
---
 .../cn/notification/service/NotificationConfiguration.java       | 9 ++++++++-
 1 file changed, 8 insertions(+), 1 deletion(-)

diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/NotificationConfiguration.java b/service/src/main/java/org/apache/fineract/cn/notification/service/NotificationConfiguration.java
index c38d6bd..cdc55ce 100644
--- a/service/src/main/java/org/apache/fineract/cn/notification/service/NotificationConfiguration.java
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/NotificationConfiguration.java
@@ -35,6 +35,8 @@ import org.springframework.context.annotation.Bean;
 import org.springframework.context.annotation.ComponentScan;
 import org.springframework.context.annotation.Configuration;
 import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+import org.springframework.jms.annotation.EnableJms;
+import org.springframework.jms.config.DefaultJmsListenerContainerFactory;
 import org.springframework.mail.javamail.JavaMailSender;
 import org.springframework.mail.javamail.JavaMailSenderImpl;
 import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
@@ -53,7 +55,7 @@ import java.util.Properties;
 @EnableCommandProcessing
 @EnableAnubis
 @EnableServiceException
-@ConfigurationProperties(locations = {"details"})
+@EnableJms
 @ComponentScan({
     "org.apache.fineract.cn.notification.service.rest",
     "org.apache.fineract.cn.notification.service.internal.service",
@@ -74,6 +76,11 @@ public class NotificationConfiguration extends WebMvcConfigurerAdapter {
     return LoggerFactory.getLogger(ServiceConstants.LOGGER_NAME);
   }
 
+//  @Bean
+//  public DefaultJmsListenerContainerFactory myJmsListenerContainerFactory() {
+//    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
+//    return factory;
+//  }
   @Override
   public void configurePathMatch(final PathMatchConfigurer configurer) {
     configurer.setUseSuffixPatternMatch(Boolean.FALSE);


[fineract-cn-notifications] 03/15: improved the repositories and entities for the configurations

Posted by my...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

myrle pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract-cn-notifications.git

commit 71d5c3ed920006f6557279ec02054f8100b3f761
Author: Ebenezer Graham <eg...@alustudent.com>
AuthorDate: Sun Jun 10 18:46:58 2018 +0400

    improved the repositories and entities for the configurations
---
 .../notification/api/v1/domain/Notification.class  | Bin 1782 -> 1820 bytes
 .../cn/notification/api/v1/domain/SampleTest.class | Bin 3710 -> 0 bytes
 .../api/v1/domain/EmailConfiguration.java          | 162 +++++++++++++++++++++
 .../api/v1/domain/SMSConfiguration.java            | 122 ++++++++++++++++
 .../cn/notification/SuiteTestEnvironment.class     | Bin 1528 -> 0 bytes
 .../TestSample$TestConfiguration.class             | Bin 1398 -> 0 bytes
 .../fineract/cn/notification/TestSample.class      | Bin 5890 -> 0 bytes
 .../fineract/cn/notification/TestSuite.class       | Bin 695 -> 0 bytes
 .../listener/MigrationEventListener.class          | Bin 1482 -> 0 bytes
 .../listener/SampleEventListener.class             | Bin 1473 -> 0 bytes
 service/out/production/resources/application.yml   |  18 ---
 .../internal/command/handler/SampleAggregate.java  |   2 +
 .../internal/mapper/EmailConfigurationMapper.java  |  49 +++++++
 .../internal/mapper/SMSConfigurationMapper.java    |  47 ++++++
 .../service/internal/mapper/SampleMapper.java      |   1 +
 .../repository/EmailGatewayConfiguration.java      |  10 ++
 ...ewayConfiguration.java => SampleJpaEntity.java} |  68 ++-------
 .../SampleJpaEntityRepository.java}                |  32 +---
 .../service/internal/service/EmailSender.java      |  18 ++-
 .../service/internal/service/SampleService.java    |   1 +
 .../service/listener/AccountingEventListener.java  |  14 +-
 .../service/listener/ChequeEventListener.java      |   7 +-
 .../service/listener/CustomerEventListener.java    |   1 -
 .../service/listener/DepositEventListener.java     |   7 +-
 .../service/listener/PortfolioEventListener.java   |   3 -
 25 files changed, 440 insertions(+), 122 deletions(-)

diff --git a/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/domain/Notification.class b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/domain/Notification.class
index 16602d7..afe7f46 100644
Binary files a/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/domain/Notification.class and b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/domain/Notification.class differ
diff --git a/api/out/test/classes/org/apache/fineract/cn/notification/api/v1/domain/SampleTest.class b/api/out/test/classes/org/apache/fineract/cn/notification/api/v1/domain/SampleTest.class
deleted file mode 100644
index 8013bfa..0000000
Binary files a/api/out/test/classes/org/apache/fineract/cn/notification/api/v1/domain/SampleTest.class and /dev/null differ
diff --git a/api/src/main/java/org/apache/fineract/cn/notification/api/v1/domain/EmailConfiguration.java b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/domain/EmailConfiguration.java
new file mode 100644
index 0000000..24aa0dc
--- /dev/null
+++ b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/domain/EmailConfiguration.java
@@ -0,0 +1,162 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.api.v1.domain;
+
+import org.apache.fineract.cn.lang.validation.constraints.ValidIdentifier;
+import org.hibernate.validator.constraints.Length;
+
+import java.util.Objects;
+
+@SuppressWarnings({"WeakerAccess", "unused"})
+public class EmailConfiguration {
+  @ValidIdentifier
+  private String identifier;
+  @Length(max = 512)
+  private String payload;
+  @Length(max = 512)
+  private String host;
+  @Length(max = 512)
+  private String port;
+  @Length(max = 512)
+  private String username;
+  @Length(max = 512)
+  private String app_id;
+  @Length(max = 512)
+  private String smtp_auth;
+  @Length(max = 512)
+  private String start_tls;
+  @Length(max = 512)
+  private String option;
+
+  public EmailConfiguration(){
+    super();
+  }
+
+  public static EmailConfiguration create (String identifier, String payload,
+                            String host, String port,
+                            String username, String app_id,
+                            String smtp_auth, String start_tls,
+                            String option) {
+    EmailConfiguration emailConfiguration = new EmailConfiguration();
+    emailConfiguration.setIdentifier(identifier);
+    emailConfiguration.setPayload(payload);
+    emailConfiguration.setHost(host);
+    emailConfiguration.setPort(port);
+    emailConfiguration.setUsername(username);
+    emailConfiguration.setApp_id(app_id);
+    emailConfiguration.setSmtp_auth(smtp_auth);
+    emailConfiguration.setStart_tls(start_tls);
+    emailConfiguration.setOption(option);
+    return emailConfiguration;
+  }
+
+  public String getIdentifier() {
+    return identifier;
+  }
+
+  public void setIdentifier(String identifier) {
+    this.identifier = identifier;
+  }
+
+  public String getPayload() {
+    return payload;
+  }
+
+  public void setPayload(String payload) {
+    this.payload = payload;
+  }
+
+  public String getHost() {
+    return host;
+  }
+
+  public void setHost(String host) {
+    this.host = host;
+  }
+
+  public String getPort() {
+    return port;
+  }
+
+  public void setPort(String port) {
+    this.port = port;
+  }
+
+  public String getUsername() {
+    return username;
+  }
+
+  public void setUsername(String username) {
+    this.username = username;
+  }
+
+  public String getApp_id() {
+    return app_id;
+  }
+
+  public void setApp_id(String app_id) {
+    this.app_id = app_id;
+  }
+
+  public String getSmtp_auth() {
+    return smtp_auth;
+  }
+
+  public void setSmtp_auth(String smtp_auth) {
+    this.smtp_auth = smtp_auth;
+  }
+
+  public String getStart_tls() {
+    return start_tls;
+  }
+
+  public void setStart_tls(String start_tls) {
+    this.start_tls = start_tls;
+  }
+
+  public String getOption() {
+    return option;
+  }
+
+  public void setOption(String option) {
+    this.option = option;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o == null || getClass() != o.getClass()) return false;
+    EmailConfiguration that = (EmailConfiguration) o;
+    return Objects.equals(identifier, that.identifier) &&
+            Objects.equals(payload, that.payload) &&
+            Objects.equals(host, that.host) &&
+            Objects.equals(port, that.port) &&
+            Objects.equals(username, that.username) &&
+            Objects.equals(app_id, that.app_id) &&
+            Objects.equals(smtp_auth, that.smtp_auth) &&
+            Objects.equals(start_tls, that.start_tls) &&
+            Objects.equals(option, that.option);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(identifier, payload, host, port, username,
+            app_id, smtp_auth, start_tls, option);
+  }
+}
diff --git a/api/src/main/java/org/apache/fineract/cn/notification/api/v1/domain/SMSConfiguration.java b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/domain/SMSConfiguration.java
new file mode 100644
index 0000000..cef7f57
--- /dev/null
+++ b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/domain/SMSConfiguration.java
@@ -0,0 +1,122 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.api.v1.domain;
+
+import org.apache.fineract.cn.lang.validation.constraints.ValidIdentifier;
+import org.hibernate.validator.constraints.Length;
+
+import java.util.Objects;
+
+@SuppressWarnings({"WeakerAccess", "unused"})
+public class SMSConfiguration {
+  @ValidIdentifier
+  private String identifier;
+  @Length(max = 512)
+  private String payload;
+  @Length(max = 512)
+  private String organisation;
+  @Length(max = 512)
+  private String auth_token;
+  @Length(max = 512)
+  private String accountid;
+  @Length(max = 256)
+  private String option;
+
+  public SMSConfiguration() {
+    super();
+  }
+
+  public static SMSConfiguration create(String identifier, String payload, String organisation, String auth_token, String accountid, String option) {
+    SMSConfiguration smsconfiguration = new SMSConfiguration();
+    smsconfiguration.setIdentifier(identifier);
+    smsconfiguration.setPayload(payload);
+    smsconfiguration.setOrganisation(organisation);
+    smsconfiguration.setAuth_token(auth_token);
+    smsconfiguration.setAccountid(accountid);
+    smsconfiguration.setOption(option);
+    return smsconfiguration;
+  }
+
+  public String getIdentifier() {
+    return identifier;
+  }
+
+  public void setIdentifier(String identifier) {
+    this.identifier = identifier;
+  }
+
+  public String getPayload() {
+    return payload;
+  }
+
+  public void setPayload(String payload) {
+    this.payload = payload;
+  }
+
+  public String getOrganisation() {
+    return organisation;
+  }
+
+  public void setOrganisation(String organisation) {
+    this.organisation = organisation;
+  }
+
+  public String getAuth_token() {
+    return auth_token;
+  }
+
+  public void setAuth_token(String auth_token) {
+    this.auth_token = auth_token;
+  }
+
+  public String getAccountid() {
+    return accountid;
+  }
+
+  public void setAccountid(String accountid) {
+    this.accountid = accountid;
+  }
+
+  public String getOption() {
+    return option;
+  }
+
+  public void setOption(String option) {
+    this.option = option;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o == null || getClass() != o.getClass()) return false;
+    SMSConfiguration that = (SMSConfiguration) o;
+    return Objects.equals(identifier, that.identifier) &&
+            Objects.equals(payload, that.payload) &&
+            Objects.equals(organisation, that.organisation) &&
+            Objects.equals(auth_token, that.auth_token) &&
+            Objects.equals(accountid, that.accountid) &&
+            Objects.equals(option, that.option);
+  }
+
+  @Override
+  public int hashCode() {
+
+    return Objects.hash(identifier, payload, organisation, auth_token, accountid, option);
+  }
+}
diff --git a/component-test/out/production/classes/org/apache/fineract/cn/notification/SuiteTestEnvironment.class b/component-test/out/production/classes/org/apache/fineract/cn/notification/SuiteTestEnvironment.class
deleted file mode 100644
index d098f6e..0000000
Binary files a/component-test/out/production/classes/org/apache/fineract/cn/notification/SuiteTestEnvironment.class and /dev/null differ
diff --git a/component-test/out/production/classes/org/apache/fineract/cn/notification/TestSample$TestConfiguration.class b/component-test/out/production/classes/org/apache/fineract/cn/notification/TestSample$TestConfiguration.class
deleted file mode 100644
index b125463..0000000
Binary files a/component-test/out/production/classes/org/apache/fineract/cn/notification/TestSample$TestConfiguration.class and /dev/null differ
diff --git a/component-test/out/production/classes/org/apache/fineract/cn/notification/TestSample.class b/component-test/out/production/classes/org/apache/fineract/cn/notification/TestSample.class
deleted file mode 100644
index 5962f3a..0000000
Binary files a/component-test/out/production/classes/org/apache/fineract/cn/notification/TestSample.class and /dev/null differ
diff --git a/component-test/out/production/classes/org/apache/fineract/cn/notification/TestSuite.class b/component-test/out/production/classes/org/apache/fineract/cn/notification/TestSuite.class
deleted file mode 100644
index f083d51..0000000
Binary files a/component-test/out/production/classes/org/apache/fineract/cn/notification/TestSuite.class and /dev/null differ
diff --git a/component-test/out/production/classes/org/apache/fineract/cn/notification/listener/MigrationEventListener.class b/component-test/out/production/classes/org/apache/fineract/cn/notification/listener/MigrationEventListener.class
deleted file mode 100644
index 6a70e37..0000000
Binary files a/component-test/out/production/classes/org/apache/fineract/cn/notification/listener/MigrationEventListener.class and /dev/null differ
diff --git a/component-test/out/production/classes/org/apache/fineract/cn/notification/listener/SampleEventListener.class b/component-test/out/production/classes/org/apache/fineract/cn/notification/listener/SampleEventListener.class
deleted file mode 100644
index 917edfc..0000000
Binary files a/component-test/out/production/classes/org/apache/fineract/cn/notification/listener/SampleEventListener.class and /dev/null differ
diff --git a/service/out/production/resources/application.yml b/service/out/production/resources/application.yml
index 17d03bc..37acaaf 100644
--- a/service/out/production/resources/application.yml
+++ b/service/out/production/resources/application.yml
@@ -23,17 +23,6 @@ spring:
       enabled: false
     config:
       enabled: false
-  mail:
-    host: smtp.gmail.com
-    port: 587
-    username: ebenezergraham69@gmail.com
-    password: fdzmzbhbmtkafzvq
-    properties:
-      mail:
-        smtpauth: true
-        smtp:
-        starttls:
-          enable: true
 
 eureka:
   client:
@@ -79,13 +68,6 @@ async:
 flyway:
   enabled: false
 
-mfi:
-  senderNumber: +15109441898
-
-smssender:
-  accountSID: AC1fde2c6f26f367b93231c5fdb944c908
-  authtoken: bc9a53e41745b8471e0ecafc859d86aa
-
 fineract:
   customer:
     accountcreated:
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/command/handler/SampleAggregate.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/command/handler/SampleAggregate.java
index cf09aca..a21589d 100644
--- a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/command/handler/SampleAggregate.java
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/command/handler/SampleAggregate.java
@@ -24,6 +24,8 @@ import org.apache.fineract.cn.command.annotation.Aggregate;
 import org.apache.fineract.cn.command.annotation.CommandHandler;
 import org.apache.fineract.cn.command.annotation.CommandLogLevel;
 import org.apache.fineract.cn.command.annotation.EventEmitter;
+import org.apache.fineract.cn.notification.service.internal.repository.SampleJpaEntity;
+import org.apache.fineract.cn.notification.service.internal.repository.SampleJpaEntityRepository;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.transaction.annotation.Transactional;
 
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/mapper/EmailConfigurationMapper.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/mapper/EmailConfigurationMapper.java
new file mode 100644
index 0000000..10e4a86
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/mapper/EmailConfigurationMapper.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.mapper;
+
+import org.apache.fineract.cn.notification.api.v1.domain.EmailConfiguration;
+import org.apache.fineract.cn.notification.service.internal.repository.EmailGatewayConfiguration;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class EmailConfigurationMapper {
+
+  private EmailConfigurationMapper() {
+    super();
+  }
+
+  public static EmailConfiguration map(final EmailGatewayConfiguration emailGatewayConfiguration) {
+    final EmailConfiguration emailConfiguration = new EmailConfiguration();
+    emailConfiguration.setIdentifier(emailGatewayConfiguration.getIdentifier());
+    emailConfiguration.setHost(emailGatewayConfiguration.getHost());
+    emailConfiguration.setPort(emailGatewayConfiguration.getPort());
+    emailConfiguration.setUsername(emailGatewayConfiguration.getUsername());
+    emailConfiguration.setApp_id(emailGatewayConfiguration.getApp_id());
+    return emailConfiguration;
+  }
+
+//  public static List<EmailGatewayConfiguration> map(final List<EmailGatewayConfiguration> emailGatewayConfiguration) {
+//    final ArrayList<EmailGatewayConfiguration> entities = new ArrayList<>(emailGatewayConfiguration.size());
+//    entities.addAll(emailGatewayConfiguration.stream().map(EmailGatewayConfiguration::map).collect(Collectors.toList()));
+//    return entities;
+//  }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/mapper/SMSConfigurationMapper.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/mapper/SMSConfigurationMapper.java
new file mode 100644
index 0000000..43e6c1c
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/mapper/SMSConfigurationMapper.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.mapper;
+
+import org.apache.fineract.cn.notification.api.v1.domain.SMSConfiguration;
+import org.apache.fineract.cn.notification.service.internal.repository.SMSGatewayConfiguration;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class SMSConfigurationMapper {
+
+  private SMSConfigurationMapper() {
+    super();
+  }
+
+  public static SMSConfiguration map(final SMSGatewayConfiguration smsGatewayConfiguration) {
+    final SMSConfiguration smsConfiguration = new SMSConfiguration();
+    smsConfiguration.setIdentifier(smsGatewayConfiguration.getIdentifier());
+    smsConfiguration.setAccountid(smsGatewayConfiguration.getAccountid());
+    smsConfiguration.setAuth_token(smsGatewayConfiguration.getAuth_token());
+    return smsConfiguration;
+  }
+
+//  public static List<SMSGatewayConfiguration> map(final List<SMSGatewayConfiguration> smsGatewayConfiguration) {
+//    final ArrayList<SMSGatewayConfiguration> entities = new ArrayList<>(smsGatewayConfiguration.size());
+//    entities.addAll(smsGatewayConfiguration.stream().map(SMSConfigurationMapper::map).collect(Collectors.toList()));
+//    return entities;
+//  }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/mapper/SampleMapper.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/mapper/SampleMapper.java
index 973adee..a56b7aa 100644
--- a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/mapper/SampleMapper.java
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/mapper/SampleMapper.java
@@ -19,6 +19,7 @@
 package org.apache.fineract.cn.notification.service.internal.mapper;
 
 import org.apache.fineract.cn.notification.api.v1.domain.Sample;
+import org.apache.fineract.cn.notification.service.internal.repository.SampleJpaEntity;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/EmailGatewayConfiguration.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/EmailGatewayConfiguration.java
index e0c6d89..c344708 100644
--- a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/EmailGatewayConfiguration.java
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/EmailGatewayConfiguration.java
@@ -43,6 +43,8 @@ public class EmailGatewayConfiguration {
   private String smtp_auth;
   @Column(name = "start_tls")
   private String start_tls;
+  @Column(name = "option")
+  private String option;
 
   public EmailGatewayConfiguration() {
     super();
@@ -111,4 +113,12 @@ public class EmailGatewayConfiguration {
   public void setStart_tls(String start_tls) {
     this.start_tls = start_tls;
   }
+
+  public String getOption() {
+    return option;
+  }
+
+  public void setOption(String option) {
+    this.option = option;
+  }
 }
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/EmailGatewayConfiguration.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/SampleJpaEntity.java
similarity index 53%
copy from service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/EmailGatewayConfiguration.java
copy to service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/SampleJpaEntity.java
index e0c6d89..f740d85 100644
--- a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/EmailGatewayConfiguration.java
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/SampleJpaEntity.java
@@ -22,8 +22,8 @@ import javax.persistence.*;
 
 @SuppressWarnings("unused")
 @Entity
-@Table(name = "email_gateway_configuration")
-public class EmailGatewayConfiguration {
+@Table(name = "template_samples")
+public class SampleJpaEntity {
 
   @Id
   @GeneratedValue(strategy = GenerationType.IDENTITY)
@@ -31,20 +31,10 @@ public class EmailGatewayConfiguration {
   private Long id;
   @Column(name = "identifier")
   private String identifier;
-  @Column(name = "host")
-  private String host;
-  @Column(name = "port")
-  private String port;
-  @Column(name = "username")
-  private String username;
-  @Column(name = "app_id")
-  private String app_id;
-  @Column(name = "smtp_auth")
-  private String smtp_auth;
-  @Column(name = "start_tls")
-  private String start_tls;
+  @Column(name = "payload")
+  private String payload;
 
-  public EmailGatewayConfiguration() {
+  public SampleJpaEntity() {
     super();
   }
 
@@ -64,51 +54,11 @@ public class EmailGatewayConfiguration {
     this.identifier = identifier;
   }
 
-  public String getHost() {
-    return host;
+  public String getPayload() {
+    return payload;
   }
 
-  public void setHost(String host) {
-    this.host = host;
-  }
-
-  public String getPort() {
-    return port;
-  }
-
-  public void setPort(String port) {
-    this.port = port;
-  }
-
-  public String getUsername() {
-    return username;
-  }
-
-  public void setUsername(String username) {
-    this.username = username;
-  }
-
-  public String getApp_id() {
-    return app_id;
-  }
-
-  public void setApp_id(String app_id) {
-    this.app_id = app_id;
-  }
-
-  public String getSmtp_auth() {
-    return smtp_auth;
-  }
-
-  public void setSmtp_auth(String smtp_auth) {
-    this.smtp_auth = smtp_auth;
-  }
-
-  public String getStart_tls() {
-    return start_tls;
-  }
-
-  public void setStart_tls(String start_tls) {
-    this.start_tls = start_tls;
+  public void setPayload(String payload) {
+    this.payload = payload;
   }
 }
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/EmailSender.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/SampleJpaEntityRepository.java
similarity index 51%
copy from service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/EmailSender.java
copy to service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/SampleJpaEntityRepository.java
index e9cc516..b4d8abd 100644
--- a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/EmailSender.java
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/SampleJpaEntityRepository.java
@@ -16,29 +16,13 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.fineract.cn.notification.service.internal.service;
+package org.apache.fineract.cn.notification.service.internal.repository;
 
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.context.annotation.Bean;
-import org.springframework.mail.SimpleMailMessage;
-import org.springframework.mail.javamail.JavaMailSender;
-import org.springframework.stereotype.Service;
+import java.util.Optional;
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
 
-
-@Service
-public class EmailSender {
-
-    @Autowired
-    @Qualifier("gmail")
-    private JavaMailSender sender;
-
-    public void sendEmail(String to, String subject, String message) {
-        SimpleMailMessage mail = new SimpleMailMessage();
-        mail.setTo(to);
-        mail.setSubject(subject);
-        mail.setText(message);
-        sender.send(mail);
-    }
-
-}
\ No newline at end of file
+@Repository
+public interface SampleJpaEntityRepository extends JpaRepository<SampleJpaEntity, Long> {
+  Optional<SampleJpaEntity> findByIdentifier(String identifier);
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/EmailSender.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/EmailSender.java
index e9cc516..bebb3c9 100644
--- a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/EmailSender.java
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/EmailSender.java
@@ -18,13 +18,17 @@
  */
 package org.apache.fineract.cn.notification.service.internal.service;
 
+
+import org.apache.fineract.cn.notification.service.internal.mapper.EmailConfigurationMapper;
+import org.apache.fineract.cn.notification.service.internal.repository.EmailGatewayConfiguration;
+import org.apache.fineract.cn.notification.service.internal.repository.EmailGatewayConfigurationRepository;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Qualifier;
-import org.springframework.context.annotation.Bean;
 import org.springframework.mail.SimpleMailMessage;
 import org.springframework.mail.javamail.JavaMailSender;
 import org.springframework.stereotype.Service;
 
+import java.util.Optional;
 
 @Service
 public class EmailSender {
@@ -33,6 +37,18 @@ public class EmailSender {
     @Qualifier("gmail")
     private JavaMailSender sender;
 
+    private final EmailGatewayConfigurationRepository emailGatewayConfigurationRepository;
+
+    @Autowired
+    public EmailSender(final EmailGatewayConfigurationRepository emailGatewayConfigurationRepository) {
+        super();
+        this.emailGatewayConfigurationRepository = emailGatewayConfigurationRepository;
+    }
+
+//    public Optional<EmailGatewayConfiguration> findByIdentifier(final String identifier) {
+//        return this.emailGatewayConfigurationRepository.findByIdentifier(identifier).map(EmailGatewayConfiguration::map);
+//    }
+
     public void sendEmail(String to, String subject, String message) {
         SimpleMailMessage mail = new SimpleMailMessage();
         mail.setTo(to);
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/SampleService.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/SampleService.java
index bc2d5a8..a0e4f71 100644
--- a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/SampleService.java
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/SampleService.java
@@ -20,6 +20,7 @@ package org.apache.fineract.cn.notification.service.internal.service;
 
 import org.apache.fineract.cn.notification.api.v1.domain.Sample;
 import org.apache.fineract.cn.notification.service.internal.mapper.SampleMapper;
+import org.apache.fineract.cn.notification.service.internal.repository.SampleJpaEntityRepository;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/AccountingEventListener.java b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/AccountingEventListener.java
index a061b1a..9266b89 100644
--- a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/AccountingEventListener.java
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/AccountingEventListener.java
@@ -16,7 +16,7 @@
          * specific language governing permissions and limitations
          * under the License.
          */
-
+/*
         package org.apache.fineract.cn.notification.service.listener;
 
         import org.apache.fineract.cn.lang.config.TenantHeaderFilter;
@@ -34,13 +34,6 @@
 @Component
 public class AccountingEventListener {
 
-    AccountService accountService;
-
-    @Autowired
-    SMSSender smsSender;
-
-    @Autowired
-    EmailSender emailSender;
 
     @Autowired
     public AccountingEventListener( final AccountService accountingManager) {
@@ -60,7 +53,7 @@ public class AccountingEventListener {
         emailSender.sendEmail(receiver,"Hello", "You account has been created");
     }
 
-     /*
+
     @JmsListener(
             destination = EventConstants.DESTINATION,
             selector = EventConstants.SELECTOR_PUT_ACCOUNT,
@@ -126,5 +119,6 @@ public class AccountingEventListener {
         this.logger.debug("Account deleted.");
         this.eventRecorder.event(tenant, EventConstants.DELETE_ACCOUNT, payload, String.class);
     }
- */
+
 }
+ */
\ No newline at end of file
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/ChequeEventListener.java b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/ChequeEventListener.java
index 2c6c2cf..97dd5e2 100644
--- a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/ChequeEventListener.java
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/ChequeEventListener.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
+/*
 package org.apache.fineract.cn.notification.service.listener;
 
 import org.apache.fineract.cn.cheque.AbstractChequeTest;
@@ -47,7 +47,7 @@ public class ChequeEventListener {
                                final String payload) {
         this.logger.debug("Cheques issued.");
     }
-/*
+
     @JmsListener(
             destination = EventConstants.DESTINATION,
             selector = EventConstants.SELECTOR_CHEQUE_TRANSACTION,
@@ -80,5 +80,6 @@ public class ChequeEventListener {
         this.logger.debug("Cheque transaction canceled.");
         this.eventRecorder.event(tenant, EventConstants.CHEQUE_TRANSACTION_CANCELED, payload, String.class);
     }
-*/
+
 }
+*/
\ No newline at end of file
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/CustomerEventListener.java b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/CustomerEventListener.java
index a28d83a..73d3d1d 100644
--- a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/CustomerEventListener.java
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/CustomerEventListener.java
@@ -24,7 +24,6 @@ import org.apache.fineract.cn.lang.config.TenantHeaderFilter;
 import org.apache.fineract.cn.customer.api.v1.client.CustomerManager;
 import org.apache.fineract.cn.customer.api.v1.domain.ContactDetail;
 import org.apache.fineract.cn.customer.api.v1.domain.Customer;
-import org.apache.fineract.cn.notification.api.v1.events.NotificationEventConstants;
 import org.apache.fineract.cn.notification.service.internal.service.EmailSender;
 import org.apache.fineract.cn.notification.service.internal.service.SMSSender;
 import org.springframework.beans.factory.annotation.Autowired;
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/DepositEventListener.java b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/DepositEventListener.java
index bcde220..fa66ace 100644
--- a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/DepositEventListener.java
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/DepositEventListener.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-
+/*
 package org.apache.fineract.cn.deposit.listener;
 
 import org.apache.fineract.cn.deposit.api.v1.EventConstants;
@@ -45,7 +45,7 @@ public class DepositEventListener {
     public void onAccrual(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
                           final String payload) {
     }
-/*
+
     @JmsListener(
             destination = EventConstants.DESTINATION,
             selector = EventConstants.SELECTOR_DIVIDEND_DISTRIBUTION,
@@ -56,5 +56,6 @@ public class DepositEventListener {
         this.logger.debug("Dividend distributed for product {}.", payload);
         this.eventRecorder.event(tenant, EventConstants.DIVIDEND_DISTRIBUTION, payload, String.class);
     }
-*/
+
 }
+*/
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/PortfolioEventListener.java b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/PortfolioEventListener.java
index 88109a7..afbe490 100644
--- a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/PortfolioEventListener.java
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/PortfolioEventListener.java
@@ -17,14 +17,11 @@ package org.apache.fineract.cn.notification.service.listener;/*
  * under the License.
  */
 
-import org.apache.fineract.cn.individuallending.api.v1.events.IndividualLoanCommandEvent;
 import org.apache.fineract.cn.individuallending.api.v1.events.IndividualLoanEventConstants;
 import org.apache.fineract.cn.lang.config.TenantHeaderFilter;
-import org.apache.fineract.cn.reporting.api.v1.domain.Header;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.jms.annotation.JmsListener;
 import org.springframework.stereotype.Component;
-import org.apache.fineract.cn.group.api.v1.EventConstants;
 import org.apache.fineract.cn.portfolio.api.v1.client.PortfolioManager;
 
 @SuppressWarnings("unused")


[fineract-cn-notifications] 05/15: update

Posted by my...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

myrle pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract-cn-notifications.git

commit 13e3802db61dc28190a2a0102376074048af75a0
Author: Ebenezer Graham <eg...@alustudent.com>
AuthorDate: Wed Jun 13 04:27:12 2018 +0400

    update
---
 .../api/v1/client/NotificationManager.class        | Bin 1462 -> 1474 bytes
 .../api/v1/domain/EmailConfiguration.class         | Bin 0 -> 3790 bytes
 .../api/v1/domain/SMSConfiguration.class           | Bin 0 -> 2972 bytes
 .../api/v1/client/NotificationManager.java         |   6 +--
 .../fineract/cn/notification/TestSample.java       |   2 +-
 .../db/migrations/mariadb/V1__initial_setup.sql    |  44 ++++++++++++++++++++-
 .../db/migrations/mariadb/V1__initial_setup.sql    |  44 ++++++++++++++++++++-
 7 files changed, 88 insertions(+), 8 deletions(-)

diff --git a/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/client/NotificationManager.class b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/client/NotificationManager.class
index 3cb4555..741d5f5 100644
Binary files a/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/client/NotificationManager.class and b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/client/NotificationManager.class differ
diff --git a/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/domain/EmailConfiguration.class b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/domain/EmailConfiguration.class
new file mode 100644
index 0000000..dd410b5
Binary files /dev/null and b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/domain/EmailConfiguration.class differ
diff --git a/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/domain/SMSConfiguration.class b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/domain/SMSConfiguration.class
new file mode 100644
index 0000000..f7e3f18
Binary files /dev/null and b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/domain/SMSConfiguration.class differ
diff --git a/api/src/main/java/org/apache/fineract/cn/notification/api/v1/client/NotificationManager.java b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/client/NotificationManager.java
index 3c20ea3..6d0a7b1 100644
--- a/api/src/main/java/org/apache/fineract/cn/notification/api/v1/client/NotificationManager.java
+++ b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/client/NotificationManager.java
@@ -34,7 +34,7 @@ import org.springframework.web.bind.annotation.RequestMethod;
 public interface NotificationManager {
 
   @RequestMapping(
-          value = "/sample",
+          value = "/notification",
           method = RequestMethod.GET,
           produces = MediaType.ALL_VALUE,
           consumes = MediaType.APPLICATION_JSON_VALUE
@@ -42,14 +42,14 @@ public interface NotificationManager {
   List<Sample> findAllEntities();
 
   @RequestMapping(
-          value = "/sample/{identifier}",
+          value = "/notification/{identifier}",
           method = RequestMethod.GET,
           produces = MediaType.ALL_VALUE,
           consumes = MediaType.APPLICATION_JSON_VALUE)
   Sample getEntity(@PathVariable("identifier") final String identifier);
 
   @RequestMapping(
-      value = "/sample",
+      value = "/notification",
       method = RequestMethod.POST,
       produces = MediaType.APPLICATION_JSON_VALUE,
       consumes = MediaType.APPLICATION_JSON_VALUE
diff --git a/component-test/src/main/java/org/apache/fineract/cn/notification/TestSample.java b/component-test/src/main/java/org/apache/fineract/cn/notification/TestSample.java
index 76db357..cc39439 100644
--- a/component-test/src/main/java/org/apache/fineract/cn/notification/TestSample.java
+++ b/component-test/src/main/java/org/apache/fineract/cn/notification/TestSample.java
@@ -21,7 +21,7 @@ package org.apache.fineract.cn.notification;
 import org.apache.fineract.cn.notification.api.v1.client.NotificationManager;
 import org.apache.fineract.cn.notification.api.v1.domain.Sample;
 import org.apache.fineract.cn.notification.api.v1.events.NotificationEventConstants;
-import org.apache.fineract.cn.notification.service.NotificationConfiguration;
+import com.amazonaws.services.autoscaling.model.NotificationConfiguration;
 import java.util.List;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.fineract.cn.anubis.test.v1.TenantApplicationSecurityEnvironmentTestRule;
diff --git a/service/out/production/resources/db/migrations/mariadb/V1__initial_setup.sql b/service/out/production/resources/db/migrations/mariadb/V1__initial_setup.sql
index b68edad..ff9a61f 100644
--- a/service/out/production/resources/db/migrations/mariadb/V1__initial_setup.sql
+++ b/service/out/production/resources/db/migrations/mariadb/V1__initial_setup.sql
@@ -17,7 +17,47 @@
 -- under the License.
 --
 
-CREATE TABLE notification (
+-- -----------------------------------------------------
+-- Table `fineract-cn-notification`.`email_gateway_configurations`
+-- -----------------------------------------------------
+CREATE TABLE IF NOT EXISTS `fineract-cn-notification`.`email_gateway_configurations` (
+  `id` INT(11) NOT NULL AUTO_INCREMENT,
+  `identifer` VARCHAR(45) NULL DEFAULT NULL,
+  `host` VARCHAR(45) NOT NULL,
+  `port` VARCHAR(45) NOT NULL,
+  `username` VARCHAR(45) NOT NULL,
+  `app_id` VARCHAR(45) NOT NULL,
+  PRIMARY KEY (`id`))
+ENGINE = InnoDB
+DEFAULT CHARACTER SET = latin1;
+
+
+-- -----------------------------------------------------
+-- Table `fineract-cn-notification`.`sms_gateway_configurations`
+-- -----------------------------------------------------
+CREATE TABLE IF NOT EXISTS `fineract-cn-notification`.`sms_gateway_configurations` (
+  `id` INT(11) NOT NULL AUTO_INCREMENT,
+  `identifier` VARCHAR(45) NULL DEFAULT NULL,
+  `accountsid` VARCHAR(255) NOT NULL,
+  `auth_token` VARCHAR(255) NOT NULL,
+  `option` VARCHAR(45) NULL DEFAULT NULL,
+  PRIMARY KEY (`id`))
+ENGINE = InnoDB
+DEFAULT CHARACTER SET = latin1;
+
+
+-- -----------------------------------------------------
+-- Table `fineract-cn-notification`.`templates`
+-- -----------------------------------------------------
+CREATE TABLE IF NOT EXISTS `fineract-cn-notification`.`templates` (
+  `id` INT(11) NOT NULL AUTO_INCREMENT,
+  PRIMARY KEY (`id`))
+ENGINE = InnoDB
+DEFAULT CHARACTER SET = latin1;
+
+-- ------------------------------------------------------
+
+CREATE TABLE sample (
   id BIGINT NOT NULL AUTO_INCREMENT,
   identifier VARCHAR(8) NOT NULL,
   payload VARCHAR(512) NULL,
@@ -29,4 +69,4 @@ CREATE TABLE template_sample (
   identifier VARCHAR(8) NOT NULL,
   payload VARCHAR(512) NULL,
   CONSTRAINT template_sample_pk PRIMARY KEY (id)
-);
+);
\ No newline at end of file
diff --git a/service/src/main/resources/db/migrations/mariadb/V1__initial_setup.sql b/service/src/main/resources/db/migrations/mariadb/V1__initial_setup.sql
index b68edad..ff9a61f 100644
--- a/service/src/main/resources/db/migrations/mariadb/V1__initial_setup.sql
+++ b/service/src/main/resources/db/migrations/mariadb/V1__initial_setup.sql
@@ -17,7 +17,47 @@
 -- under the License.
 --
 
-CREATE TABLE notification (
+-- -----------------------------------------------------
+-- Table `fineract-cn-notification`.`email_gateway_configurations`
+-- -----------------------------------------------------
+CREATE TABLE IF NOT EXISTS `fineract-cn-notification`.`email_gateway_configurations` (
+  `id` INT(11) NOT NULL AUTO_INCREMENT,
+  `identifer` VARCHAR(45) NULL DEFAULT NULL,
+  `host` VARCHAR(45) NOT NULL,
+  `port` VARCHAR(45) NOT NULL,
+  `username` VARCHAR(45) NOT NULL,
+  `app_id` VARCHAR(45) NOT NULL,
+  PRIMARY KEY (`id`))
+ENGINE = InnoDB
+DEFAULT CHARACTER SET = latin1;
+
+
+-- -----------------------------------------------------
+-- Table `fineract-cn-notification`.`sms_gateway_configurations`
+-- -----------------------------------------------------
+CREATE TABLE IF NOT EXISTS `fineract-cn-notification`.`sms_gateway_configurations` (
+  `id` INT(11) NOT NULL AUTO_INCREMENT,
+  `identifier` VARCHAR(45) NULL DEFAULT NULL,
+  `accountsid` VARCHAR(255) NOT NULL,
+  `auth_token` VARCHAR(255) NOT NULL,
+  `option` VARCHAR(45) NULL DEFAULT NULL,
+  PRIMARY KEY (`id`))
+ENGINE = InnoDB
+DEFAULT CHARACTER SET = latin1;
+
+
+-- -----------------------------------------------------
+-- Table `fineract-cn-notification`.`templates`
+-- -----------------------------------------------------
+CREATE TABLE IF NOT EXISTS `fineract-cn-notification`.`templates` (
+  `id` INT(11) NOT NULL AUTO_INCREMENT,
+  PRIMARY KEY (`id`))
+ENGINE = InnoDB
+DEFAULT CHARACTER SET = latin1;
+
+-- ------------------------------------------------------
+
+CREATE TABLE sample (
   id BIGINT NOT NULL AUTO_INCREMENT,
   identifier VARCHAR(8) NOT NULL,
   payload VARCHAR(512) NULL,
@@ -29,4 +69,4 @@ CREATE TABLE template_sample (
   identifier VARCHAR(8) NOT NULL,
   payload VARCHAR(512) NULL,
   CONSTRAINT template_sample_pk PRIMARY KEY (id)
-);
+);
\ No newline at end of file


[fineract-cn-notifications] 07/15: fixed the build

Posted by my...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

myrle pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract-cn-notifications.git

commit 9b71ab2a2fb65a0ac83276a56c2beaa086c98307
Author: Ebenezer Graham <eg...@alustudent.com>
AuthorDate: Thu Jun 14 23:06:09 2018 +0400

    fixed the build
---
 shared.gradle | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/shared.gradle b/shared.gradle
index a01bb15..4a65927 100644
--- a/shared.gradle
+++ b/shared.gradle
@@ -16,7 +16,7 @@
  */
 
 group 'org.apache.fineract.cn.notification'
-version '0.1.0.BUILD-SNAPSHOT'
+version '0.1.0-BUILD-SNAPSHOT'
 
 ext.versions = [
         fineractcnidentity      : '0.1.0-BUILD-SNAPSHOT',


[fineract-cn-notifications] 04/15: additions

Posted by my...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

myrle pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract-cn-notifications.git

commit c53c922f5aaf03982f3b05a405ab2f788bce0308
Author: Ebenezer Graham <eg...@alustudent.com>
AuthorDate: Wed Jun 13 02:20:25 2018 +0400

    additions
---
 .../cn/notification/service/listener/PortfolioEventListener.java   | 7 ++++---
 1 file changed, 4 insertions(+), 3 deletions(-)

diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/PortfolioEventListener.java b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/PortfolioEventListener.java
index afbe490..758e7f0 100644
--- a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/PortfolioEventListener.java
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/PortfolioEventListener.java
@@ -16,7 +16,7 @@ package org.apache.fineract.cn.notification.service.listener;/*
  * specific language governing permissions and limitations
  * under the License.
  */
-
+    /*
 import org.apache.fineract.cn.individuallending.api.v1.events.IndividualLoanEventConstants;
 import org.apache.fineract.cn.lang.config.TenantHeaderFilter;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -113,7 +113,7 @@ public class PortfolioEventListener {
                         final String payload) {
     }
 
-    /*
+
 
         @JmsListener(
                 subscription = EventConstants.DESTINATION,
@@ -144,5 +144,6 @@ public class PortfolioEventListener {
                                    final String payload) {
             this.eventRecorder.event(tenant, EventConstants.PUT_GROUP, payload, String.class);
         }
-         */
+
     }
+ */
\ No newline at end of file


[fineract-cn-notifications] 08/15: update to testSample

Posted by my...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

myrle pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract-cn-notifications.git

commit 75d298aed0d5d4621a0f098a20316e184c6777ab
Author: Ebenezer Graham <eg...@alustudent.com>
AuthorDate: Fri Jun 15 00:35:33 2018 +0400

    update to testSample
---
 .../src/main/java/org/apache/fineract/cn/notification/TestSample.java   | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/component-test/src/main/java/org/apache/fineract/cn/notification/TestSample.java b/component-test/src/main/java/org/apache/fineract/cn/notification/TestSample.java
index cc39439..3b2811e 100644
--- a/component-test/src/main/java/org/apache/fineract/cn/notification/TestSample.java
+++ b/component-test/src/main/java/org/apache/fineract/cn/notification/TestSample.java
@@ -21,11 +21,11 @@ package org.apache.fineract.cn.notification;
 import org.apache.fineract.cn.notification.api.v1.client.NotificationManager;
 import org.apache.fineract.cn.notification.api.v1.domain.Sample;
 import org.apache.fineract.cn.notification.api.v1.events.NotificationEventConstants;
-import com.amazonaws.services.autoscaling.model.NotificationConfiguration;
 import java.util.List;
 import org.apache.commons.lang3.RandomStringUtils;
 import org.apache.fineract.cn.anubis.test.v1.TenantApplicationSecurityEnvironmentTestRule;
 import org.apache.fineract.cn.api.context.AutoUserContext;
+import org.apache.fineract.cn.notification.service.NotificationConfiguration;
 import org.apache.fineract.cn.test.fixture.TenantDataStoreContextTestRule;
 import org.apache.fineract.cn.test.listener.EnableEventRecording;
 import org.apache.fineract.cn.test.listener.EventRecorder;


[fineract-cn-notifications] 09/15: update

Posted by my...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

myrle pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract-cn-notifications.git

commit a62f69fb15d5b4d1e181e22b0fbb1f04f83b6c10
Author: Ebenezer Graham <eg...@alustudent.com>
AuthorDate: Fri Jun 15 01:09:12 2018 +0400

    update
---
 .../notification/api/v1/domain/Notification.java   | 76 ----------------------
 .../api/v1/events/NotificationEventConstants.java  |  4 --
 .../service/NotificationConfiguration.java         |  2 +
 .../service/internal/service/SMSSender.java        | 20 +++---
 service/src/main/resources/application.yml         |  5 +-
 5 files changed, 18 insertions(+), 89 deletions(-)

diff --git a/api/src/main/java/org/apache/fineract/cn/notification/api/v1/domain/Notification.java b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/domain/Notification.java
deleted file mode 100644
index c685c5a..0000000
--- a/api/src/main/java/org/apache/fineract/cn/notification/api/v1/domain/Notification.java
+++ /dev/null
@@ -1,76 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package org.apache.fineract.cn.notification.api.v1.domain;
-
-import java.util.Objects;
-import org.apache.fineract.cn.lang.validation.constraints.ValidIdentifier;
-import org.hibernate.validator.constraints.Length;
-
-@SuppressWarnings({"WeakerAccess", "unused"})
-public class Notification {
-  @ValidIdentifier
-  private String identifier;
-  @Length(max = 512)
-  private String payload;
-
-  private String recipient;
-
-  private String message;
-
-  public Notification() {
-    super();
-  }
-
-  public static Notification create(final String identifier, final String payload) {
-    final Notification notification = new Notification();
-    notification.setIdentifier(identifier);
-    notification.setPayload(payload);
-    return notification;
-  }
-
-  public String getIdentifier() {
-    return this.identifier;
-  }
-
-  public void setIdentifier(final String identifier) {
-    this.identifier = identifier;
-  }
-
-  public String getPayload() {
-    return payload;
-  }
-
-  public void setPayload(String payload) {
-    this.payload = payload;
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) return true;
-    if (o == null || getClass() != o.getClass()) return false;
-    Notification notification = (Notification) o;
-    return Objects.equals(identifier, notification.identifier) &&
-            Objects.equals(payload, notification.payload);
-  }
-
-  @Override
-  public int hashCode() {
-    return Objects.hash(identifier, payload);
-  }
-}
diff --git a/api/src/main/java/org/apache/fineract/cn/notification/api/v1/events/NotificationEventConstants.java b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/events/NotificationEventConstants.java
index 3f351c6..39c6eb0 100644
--- a/api/src/main/java/org/apache/fineract/cn/notification/api/v1/events/NotificationEventConstants.java
+++ b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/events/NotificationEventConstants.java
@@ -28,8 +28,4 @@ public interface NotificationEventConstants {
     String SELECTOR_INITIALIZE = SELECTOR_NAME + " = '" + INITIALIZE + "'";
     String SELECTOR_POST_SAMPLE = SELECTOR_NAME + " = '" + POST_SAMPLE + "'";
 
-    //Customer constants;
-    String CUSTOMER_DESTINATION = "customer-v1";
-    String SELECTOR_POST_CUSTOMER = SELECTOR_NAME + " = 'post-customer'";
-
 }
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/NotificationConfiguration.java b/service/src/main/java/org/apache/fineract/cn/notification/service/NotificationConfiguration.java
index 01aa6d3..c38d6bd 100644
--- a/service/src/main/java/org/apache/fineract/cn/notification/service/NotificationConfiguration.java
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/NotificationConfiguration.java
@@ -79,6 +79,8 @@ public class NotificationConfiguration extends WebMvcConfigurerAdapter {
     configurer.setUseSuffixPatternMatch(Boolean.FALSE);
   }
 
+
+
   @Bean
   @Qualifier("gmail")
   public JavaMailSender getJavaMailSender() {
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/SMSSender.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/SMSSender.java
index 6bf7558..d626b22 100644
--- a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/SMSSender.java
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/SMSSender.java
@@ -23,23 +23,27 @@ import com.twilio.Twilio;
 import com.twilio.rest.api.v2010.account.Message;
 import com.twilio.type.PhoneNumber;
 import org.springframework.beans.factory.annotation.Value;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.context.annotation.Configuration;
 import com.twilio.rest.api.v2010.account.MessageCreator;
 import org.springframework.stereotype.Service;
 
 @Service
+@ConfigurationProperties(prefix ="smssender")
 public class SMSSender {
 
-    @Value(value = "${smssender.accountSID}")
-    public static String ACCOUNT_SID;
+    //@Value(value = "${smssender.accountSID}")
+    public String ACCOUNT_SID = "AC1fde2c6f26f367b93231c5fdb944c908";
 
-    @Value("${smssender.authToken}")
-    public static String AUTH_TOKEN;
+    //@Value("${smssender.authToken}")
+    public String AUTH_TOKEN = "bc9a53e41745b8471e0ecafc859d86aa";
 
-    @Value("${mfi.senderNumber}")
-    public static String sender;
+    //@Value("${smssender.senderNumber}")
+    public String sender = "+1 510-944-1898";
 
-    @Value("${fineract.customer.accountcreated}")
-    public String template;
+    //@Value("${fineract.customer.accountcreated}")
+
+    public String template = "Test from the demo-server";
 
     public void sendSMS(String receiver, String template) {
 
diff --git a/service/src/main/resources/application.yml b/service/src/main/resources/application.yml
index 37acaaf..ec163fc 100644
--- a/service/src/main/resources/application.yml
+++ b/service/src/main/resources/application.yml
@@ -75,4 +75,7 @@ fineract:
     accountclosed:
       message: Dear Valued Customer, Your account has been successfully closed.
 
-
+smssender:
+  accountSID: AC1fde2c6f26f367b93231c5fdb944c908
+  authtoken: bc9a53e41745b8471e0ecafc859d86aa
+  senderNumber: +1 510-944-1898


[fineract-cn-notifications] 13/15: to test customer

Posted by my...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

myrle pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract-cn-notifications.git

commit 5e44714f25b138c77fe4f08df54d4f3e66414d86
Author: Ebenezer Graham <eg...@alustudent.com>
AuthorDate: Fri Jun 15 17:31:54 2018 +0400

    to test customer
---
 .../service/internal/service/SMSSender.java        |  1 -
 .../service/listener/CustomerEventListener.java    | 32 +++-------------
 .../service/listener/PortfolioEventListener.java   | 43 ++++++++++++----------
 3 files changed, 29 insertions(+), 47 deletions(-)

diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/SMSSender.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/SMSSender.java
index d626b22..48a7ac9 100644
--- a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/SMSSender.java
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/SMSSender.java
@@ -54,5 +54,4 @@ public class SMSSender {
         System.out.println(message.getSid());
         System.out.println(message.getStatus());
     }
-
     }
\ No newline at end of file
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/CustomerEventListener.java b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/CustomerEventListener.java
index 73d3d1d..3f4c771 100644
--- a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/CustomerEventListener.java
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/CustomerEventListener.java
@@ -31,7 +31,7 @@ import org.springframework.jms.annotation.JmsListener;
 import org.springframework.messaging.handler.annotation.Header;
 import org.springframework.stereotype.Component;
 
-
+@SuppressWarnings("unused")
 @Component
 public class CustomerEventListener {
 
@@ -40,11 +40,11 @@ public class CustomerEventListener {
         private EmailSender emailSender;
 
         @Autowired
-        public CustomerEventListener( final CustomerManager customerManager, SMSSender smsSender,
-                                 final EmailSender emailSender ) {
+        public CustomerEventListener( final CustomerManager customerManager, SMSSender smsSender, EmailSender emailSender ) {
             this.customerManager = customerManager;
             this.smsSender = smsSender;
             this.emailSender = emailSender;
+            smsSender.sendSMS("+23058409206","just to be sure listen has been instantiated");
         }
 
         @JmsListener(
@@ -53,8 +53,9 @@ public class CustomerEventListener {
         )
         public void customerCreatedEvent(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
                                          final String payload) {
-
+            System.out.println(payload);
             Customer customer = customerManager.findCustomer(payload);
+            System.out.println("This is the customer created: " + customer.getGivenName());
             if (customer.getContactDetails().size() > 0) {
                 customer.getContactDetails().forEach(contactDetail -> {
                     if (contactDetail.getType().equals(ContactDetail.Type.PHONE)) {
@@ -174,27 +175,4 @@ public class CustomerEventListener {
             });
         }
     }
-    
-/*
-
-    @JmsListener(
-            destination = CustomerEventConstants.DESTINATION,
-            selector = CustomerEventConstants.SELECTOR_PUT_ADDRESS
-    )
-    public void addressChangedEvent(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
-                                    final String payload) {
-        this.eventRecorder.event(tenant, CustomerEventConstants.PUT_ADDRESS, payload, String.class);
-    }
-
-    @JmsListener(
-            destination = CustomerEventConstants.DESTINATION,
-            selector = CustomerEventConstants.SELECTOR_PUT_IDENTIFICATION_CARD
-    )
-    public void identificationCardChangedEvent(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
-                                               final String payload) {
-        this.eventRecorder.event(tenant, CustomerEventConstants.PUT_IDENTIFICATION_CARD, payload, String.class);
-    }
-
-
-*/
 }
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/PortfolioEventListener.java b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/PortfolioEventListener.java
index 758e7f0..4f8f9d0 100644
--- a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/PortfolioEventListener.java
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/PortfolioEventListener.java
@@ -1,4 +1,4 @@
-package org.apache.fineract.cn.notification.service.listener;/*
+/*
  * Licensed to the Apache Software Foundation (ASF) under one
  * or more contributor license agreements.  See the NOTICE file
  * distributed with this work for additional information
@@ -16,11 +16,16 @@ package org.apache.fineract.cn.notification.service.listener;/*
  * specific language governing permissions and limitations
  * under the License.
  */
-    /*
+package org.apache.fineract.cn.notification.service.listener;
+
+import org.apache.fineract.cn.group.api.v1.EventConstants;
 import org.apache.fineract.cn.individuallending.api.v1.events.IndividualLoanEventConstants;
 import org.apache.fineract.cn.lang.config.TenantHeaderFilter;
+import org.apache.fineract.cn.notification.service.internal.service.EmailSender;
+import org.apache.fineract.cn.notification.service.internal.service.SMSSender;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.jms.annotation.JmsListener;
+import org.springframework.messaging.handler.annotation.Header;
 import org.springframework.stereotype.Component;
 import org.apache.fineract.cn.portfolio.api.v1.client.PortfolioManager;
 
@@ -28,10 +33,16 @@ import org.apache.fineract.cn.portfolio.api.v1.client.PortfolioManager;
 @Component
 public class PortfolioEventListener {
 
+    private PortfolioManager portfolioManager;
+    private SMSSender smsSender;
+    private EmailSender emailSender;
+
     @Autowired
-    public PortfolioEventListener() {
+    public PortfolioEventListener(PortfolioManager portfolioManager, SMSSender smsSender, EmailSender emailSender) {
         super();
-        //PortfolioManager portfolioManager = new PortfolioManager();
+        this.portfolioManager = portfolioManager;
+        this.smsSender = smsSender;
+        this.emailSender = emailSender;
     }
 
     @JmsListener(
@@ -39,8 +50,7 @@ public class PortfolioEventListener {
             destination = IndividualLoanEventConstants.DESTINATION,
             selector = IndividualLoanEventConstants.SELECTOR_DENY_INDIVIDUALLOAN_CASE
     )
-    public void onDeny(//@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
-                       final String payload) {
+    public void onDeny(final String payload) {
 
     }
 
@@ -49,7 +59,7 @@ public class PortfolioEventListener {
             destination = IndividualLoanEventConstants.DESTINATION,
             selector = IndividualLoanEventConstants.SELECTOR_APPROVE_INDIVIDUALLOAN_CASE
     )
-    public void onApprove(//@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+    public void onApprove(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
                           final String payload) {
 
     }
@@ -59,7 +69,7 @@ public class PortfolioEventListener {
             destination = IndividualLoanEventConstants.DESTINATION,
             selector = IndividualLoanEventConstants.SELECTOR_ACCEPT_PAYMENT_INDIVIDUALLOAN_CASE
     )
-    public void onAcceptPayment(//@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+    public void onAcceptPayment(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
                                 final String payload) {
     }
 
@@ -69,7 +79,7 @@ public class PortfolioEventListener {
             destination = IndividualLoanEventConstants.DESTINATION,
             selector = IndividualLoanEventConstants.SELECTOR_DISBURSE_INDIVIDUALLOAN_CASE
     )
-    public void onDisburse(//@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+    public void onDisburse(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
                            final String payload) {
 
     }
@@ -79,7 +89,7 @@ public class PortfolioEventListener {
             destination = IndividualLoanEventConstants.DESTINATION,
             selector = IndividualLoanEventConstants.SELECTOR_CHECK_LATE_INDIVIDUALLOAN_CASE
     )
-    public void onCheckLate(//@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+    public void onCheckLate(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
                             final String payload) {
 
     }
@@ -99,7 +109,7 @@ public class PortfolioEventListener {
             destination = IndividualLoanEventConstants.DESTINATION,
             selector = IndividualLoanEventConstants.SELECTOR_MARK_LATE_INDIVIDUALLOAN_CASE
     )
-    public void onMarkLate(//@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+    public void onMarkLate(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
                            final String payload) {
 
     }
@@ -109,20 +119,18 @@ public class PortfolioEventListener {
             destination = IndividualLoanEventConstants.DESTINATION,
             selector = IndividualLoanEventConstants.SELECTOR_CLOSE_INDIVIDUALLOAN_CASE
     )
-    public void onClose(//@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+    public void onClose(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
                         final String payload) {
     }
 
-
-
-        @JmsListener(
+    @JmsListener(
                 subscription = EventConstants.DESTINATION,
                 destination = EventConstants.DESTINATION,
                 selector = EventConstants.SELECTOR_POST_GROUP
         )
         public void onGroupCreated(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
                                    final String payload) {
-            this.eventRecorder.event(tenant, EventConstants.POST_GROUP, payload, String.class);
+
         }
 
         @JmsListener(
@@ -132,7 +140,6 @@ public class PortfolioEventListener {
         )
         public void onGroupActivated(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
                                      final String payload) {
-            this.eventRecorder.event(tenant, EventConstants.ACTIVATE_GROUP, payload, String.class);
         }
 
         @JmsListener(
@@ -142,8 +149,6 @@ public class PortfolioEventListener {
         )
         public void onGroupUpdated(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
                                    final String payload) {
-            this.eventRecorder.event(tenant, EventConstants.PUT_GROUP, payload, String.class);
         }
 
     }
- */
\ No newline at end of file


[fineract-cn-notifications] 02/15: Increment One

Posted by my...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

myrle pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract-cn-notifications.git

commit 9f886dd56dd4377fcb12a4d47116e9331ba7c3de
Author: Ebenezer Graham <eg...@alustudent.com>
AuthorDate: Sun Jun 10 01:07:54 2018 +0400

    Increment One
    
    Commit for increment one
---
 .gitignore                                         |   17 +
 HEADER                                             |   16 +
 LICENSE                                            |  201 +
 NOTICE.txt                                         |    5 +
 api/build.gradle                                   |   57 +
 .../notification/api/v1/PermittableGroupIds.class  |  Bin 0 -> 328 bytes
 .../api/v1/client/IamATeapotException.class        |  Bin 0 -> 392 bytes
 .../api/v1/client/NotificationManager.class        |  Bin 0 -> 1462 bytes
 .../notification/api/v1/domain/Notification.class  |  Bin 0 -> 1782 bytes
 .../cn/notification/api/v1/domain/Sample.class     |  Bin 0 -> 1752 bytes
 .../api/v1/events/NotificationEventConstants.class |  Bin 0 -> 666 bytes
 .../cn/notification/api/v1/domain/SampleTest.class |  Bin 0 -> 3710 bytes
 api/settings.gradle                                |   18 +
 .../notification/api/v1/PermittableGroupIds.java   |   25 +
 .../api/v1/client/IamATeapotException.java         |   23 +
 .../api/v1/client/NotificationManager.java         |   59 +
 .../notification/api/v1/domain/Notification.java   |   76 +
 .../cn/notification/api/v1/domain/Sample.java      |   72 +
 .../api/v1/events/NotificationEventConstants.java  |   35 +
 .../cn/notification/api/v1/domain/SampleTest.java  |   57 +
 build.gradle                                       |   60 +
 component-test/build.gradle                        |   56 +
 .../cn/notification/SuiteTestEnvironment.class     |  Bin 0 -> 1528 bytes
 .../TestSample$TestConfiguration.class             |  Bin 0 -> 1398 bytes
 .../fineract/cn/notification/TestSample.class      |  Bin 0 -> 5890 bytes
 .../fineract/cn/notification/TestSuite.class       |  Bin 0 -> 695 bytes
 .../listener/MigrationEventListener.class          |  Bin 0 -> 1482 bytes
 .../listener/SampleEventListener.class             |  Bin 0 -> 1473 bytes
 component-test/settings.gradle                     |   18 +
 .../cn/notification/SuiteTestEnvironment.java      |   48 +
 .../fineract/cn/notification/TestSample.java       |  137 +
 .../apache/fineract/cn/notification/TestSuite.java |   30 +
 .../listener/MigrationEventListener.java           |   50 +
 .../notification/listener/SampleEventListener.java |   50 +
 gradle/wrapper/gradle-wrapper.jar                  |  Bin 0 -> 54212 bytes
 gradle/wrapper/gradle-wrapper.properties           |    6 +
 gradlew                                            |  172 +
 gradlew.bat                                        |   84 +
 service/build.gradle                               |   85 +
 service/out/production/resources/application.yml   |   96 +
 service/out/production/resources/bootstrap.yml     |   22 +
 .../db/migrations/mariadb/V1__initial_setup.sql    |   32 +
 service/settings.gradle                            |   18 +
 .../service/NotificationApplication.java           |   32 +
 .../service/NotificationConfiguration.java         |  101 +
 .../cn/notification/service/ServiceConstants.java  |   23 +
 .../internal/command/InitializeServiceCommand.java |   31 +
 .../service/internal/command/SampleCommand.java    |   42 +
 .../command/handler/MigrationAggregate.java        |   67 +
 .../internal/command/handler/SampleAggregate.java  |   66 +
 .../service/internal/mapper/SampleMapper.java      |   45 +
 .../repository/EmailGatewayConfiguration.java      |  114 +
 .../EmailGatewayConfigurationRepository.java       |   29 +
 .../repository/SMSGatewayConfiguration.java        |   94 +
 .../SMSGatewayConfigurationRepository.java         |   29 +
 .../service/internal/service/EmailSender.java      |   44 +
 .../service/internal/service/SMSSender.java        |   54 +
 .../service/internal/service/SampleService.java    |   47 +
 .../service/listener/AccountingEventListener.java  |  130 +
 .../service/listener/ChequeEventListener.java      |   84 +
 .../service/listener/CustomerEventListener.java    |  201 +
 .../service/listener/DepositEventListener.java     |   60 +
 .../service/listener/IdentityEventListener.java    |   87 +
 .../service/listener/OfficeEventListener.java      |  120 +
 .../service/listener/PayrollEventListener.java     |   61 +
 .../service/listener/PortfolioEventListener.java   |  151 +
 .../service/listener/TellerEventListener.java      |  146 +
 .../service/rest/NotificationRestController.java   |  119 +
 service/src/main/resources/application.yml         |   78 +
 service/src/main/resources/bootstrap.yml           |   22 +
 .../db/migrations/mariadb/V1__initial_setup.sql    |   32 +
 settings.gradle                                    |   23 +
 shared.gradle                                      |  111 +
 system-analysis.mdj                                | 4104 ++++++++++++++++++++
 74 files changed, 7972 insertions(+)

diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..99b514a
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,17 @@
+.gradle
+.idea
+build/
+target/
+detail
+
+# Ignore Gradle GUI config
+gradle-app.setting
+
+# Avoid ignoring Gradle wrapper jar file (.jar files are usually ignored)
+!gradle-wrapper.jar
+
+*.iml
+
+*.log
+
+*.toDelete
diff --git a/HEADER b/HEADER
new file mode 100644
index 0000000..90705e0
--- /dev/null
+++ b/HEADER
@@ -0,0 +1,16 @@
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
\ No newline at end of file
diff --git a/LICENSE b/LICENSE
new file mode 100644
index 0000000..8dada3e
--- /dev/null
+++ b/LICENSE
@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "{}"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright {yyyy} {name of copyright owner}
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.
diff --git a/NOTICE.txt b/NOTICE.txt
new file mode 100644
index 0000000..41f69b8
--- /dev/null
+++ b/NOTICE.txt
@@ -0,0 +1,5 @@
+Apache Fineract CN Notification
+Copyright [2017-2018] The Apache Software Foundation
+
+This product includes software developed at
+The Apache Software Foundation (http://www.apache.org/).
\ No newline at end of file
diff --git a/api/build.gradle b/api/build.gradle
new file mode 100644
index 0000000..5b9924a
--- /dev/null
+++ b/api/build.gradle
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+buildscript {
+    repositories {
+        jcenter()
+    }
+
+    dependencies {
+        classpath 'io.spring.gradle:dependency-management-plugin:0.6.0.RELEASE'
+    }
+}
+
+plugins {
+    id "com.github.hierynomus.license" version "0.13.1"
+    id("org.nosphere.apache.rat") version "0.3.1"
+}
+
+apply from: '../shared.gradle'
+
+dependencies {
+    compile(
+            [group: 'org.springframework.cloud', name: 'spring-cloud-starter-feign'],
+            [group: 'org.apache.fineract.cn', name: 'api', version: versions.frameworkapi],
+            [group: 'org.hibernate', name: 'hibernate-validator', version: versions.validator],
+            [group: 'org.hibernate', name: 'hibernate-validator-annotation-processor', version: versions.validator]
+    )
+
+    testCompile(
+            [group: 'org.apache.fineract.cn', name: 'test', version: versions.frameworktest],
+    )
+}
+
+publishing {
+    publications {
+        api(MavenPublication) {
+            from components.java
+            groupId project.group
+            artifactId project.name
+            version project.version
+        }
+    }
+}
diff --git a/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/PermittableGroupIds.class b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/PermittableGroupIds.class
new file mode 100644
index 0000000..a1dee5e
Binary files /dev/null and b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/PermittableGroupIds.class differ
diff --git a/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/client/IamATeapotException.class b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/client/IamATeapotException.class
new file mode 100644
index 0000000..a197a0a
Binary files /dev/null and b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/client/IamATeapotException.class differ
diff --git a/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/client/NotificationManager.class b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/client/NotificationManager.class
new file mode 100644
index 0000000..3cb4555
Binary files /dev/null and b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/client/NotificationManager.class differ
diff --git a/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/domain/Notification.class b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/domain/Notification.class
new file mode 100644
index 0000000..16602d7
Binary files /dev/null and b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/domain/Notification.class differ
diff --git a/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/domain/Sample.class b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/domain/Sample.class
new file mode 100644
index 0000000..818a105
Binary files /dev/null and b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/domain/Sample.class differ
diff --git a/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/events/NotificationEventConstants.class b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/events/NotificationEventConstants.class
new file mode 100644
index 0000000..6b2a09d
Binary files /dev/null and b/api/out/production/classes/org/apache/fineract/cn/notification/api/v1/events/NotificationEventConstants.class differ
diff --git a/api/out/test/classes/org/apache/fineract/cn/notification/api/v1/domain/SampleTest.class b/api/out/test/classes/org/apache/fineract/cn/notification/api/v1/domain/SampleTest.class
new file mode 100644
index 0000000..8013bfa
Binary files /dev/null and b/api/out/test/classes/org/apache/fineract/cn/notification/api/v1/domain/SampleTest.class differ
diff --git a/api/settings.gradle b/api/settings.gradle
new file mode 100644
index 0000000..491f745
--- /dev/null
+++ b/api/settings.gradle
@@ -0,0 +1,18 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+rootProject.name = 'api'
\ No newline at end of file
diff --git a/api/src/main/java/org/apache/fineract/cn/notification/api/v1/PermittableGroupIds.java b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/PermittableGroupIds.java
new file mode 100644
index 0000000..a854460
--- /dev/null
+++ b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/PermittableGroupIds.java
@@ -0,0 +1,25 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.api.v1;
+
+@SuppressWarnings("unused")
+public interface PermittableGroupIds {
+  String SAMPLE_MANAGEMENT = "notification__v1__samples";
+  String SELF_MANAGEMENT = "notification__v1__self";
+}
diff --git a/api/src/main/java/org/apache/fineract/cn/notification/api/v1/client/IamATeapotException.java b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/client/IamATeapotException.java
new file mode 100644
index 0000000..9265ed4
--- /dev/null
+++ b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/client/IamATeapotException.java
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.api.v1.client;
+
+@SuppressWarnings("WeakerAccess")
+public class IamATeapotException extends RuntimeException {
+}
diff --git a/api/src/main/java/org/apache/fineract/cn/notification/api/v1/client/NotificationManager.java b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/client/NotificationManager.java
new file mode 100644
index 0000000..3c20ea3
--- /dev/null
+++ b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/client/NotificationManager.java
@@ -0,0 +1,59 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.api.v1.client;
+
+import org.apache.fineract.cn.notification.api.v1.domain.Sample;
+import java.util.List;
+import org.apache.fineract.cn.api.annotation.ThrowsException;
+import org.apache.fineract.cn.api.util.CustomFeignClientsConfiguration;
+import org.springframework.cloud.netflix.feign.FeignClient;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.MediaType;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+
+@SuppressWarnings("unused")
+@FeignClient(value="notification-v1", path="/notification/v1", configuration = CustomFeignClientsConfiguration.class)
+public interface NotificationManager {
+
+  @RequestMapping(
+          value = "/sample",
+          method = RequestMethod.GET,
+          produces = MediaType.ALL_VALUE,
+          consumes = MediaType.APPLICATION_JSON_VALUE
+  )
+  List<Sample> findAllEntities();
+
+  @RequestMapping(
+          value = "/sample/{identifier}",
+          method = RequestMethod.GET,
+          produces = MediaType.ALL_VALUE,
+          consumes = MediaType.APPLICATION_JSON_VALUE)
+  Sample getEntity(@PathVariable("identifier") final String identifier);
+
+  @RequestMapping(
+      value = "/sample",
+      method = RequestMethod.POST,
+      produces = MediaType.APPLICATION_JSON_VALUE,
+      consumes = MediaType.APPLICATION_JSON_VALUE
+  )
+  @ThrowsException(status = HttpStatus.I_AM_A_TEAPOT, exception = IamATeapotException.class)
+  void createEntity(final Sample sample);
+}
diff --git a/api/src/main/java/org/apache/fineract/cn/notification/api/v1/domain/Notification.java b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/domain/Notification.java
new file mode 100644
index 0000000..c685c5a
--- /dev/null
+++ b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/domain/Notification.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.api.v1.domain;
+
+import java.util.Objects;
+import org.apache.fineract.cn.lang.validation.constraints.ValidIdentifier;
+import org.hibernate.validator.constraints.Length;
+
+@SuppressWarnings({"WeakerAccess", "unused"})
+public class Notification {
+  @ValidIdentifier
+  private String identifier;
+  @Length(max = 512)
+  private String payload;
+
+  private String recipient;
+
+  private String message;
+
+  public Notification() {
+    super();
+  }
+
+  public static Notification create(final String identifier, final String payload) {
+    final Notification notification = new Notification();
+    notification.setIdentifier(identifier);
+    notification.setPayload(payload);
+    return notification;
+  }
+
+  public String getIdentifier() {
+    return this.identifier;
+  }
+
+  public void setIdentifier(final String identifier) {
+    this.identifier = identifier;
+  }
+
+  public String getPayload() {
+    return payload;
+  }
+
+  public void setPayload(String payload) {
+    this.payload = payload;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o == null || getClass() != o.getClass()) return false;
+    Notification notification = (Notification) o;
+    return Objects.equals(identifier, notification.identifier) &&
+            Objects.equals(payload, notification.payload);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(identifier, payload);
+  }
+}
diff --git a/api/src/main/java/org/apache/fineract/cn/notification/api/v1/domain/Sample.java b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/domain/Sample.java
new file mode 100644
index 0000000..644dda9
--- /dev/null
+++ b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/domain/Sample.java
@@ -0,0 +1,72 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.api.v1.domain;
+
+import java.util.Objects;
+import org.apache.fineract.cn.lang.validation.constraints.ValidIdentifier;
+import org.hibernate.validator.constraints.Length;
+
+@SuppressWarnings({"WeakerAccess", "unused"})
+public class Sample {
+  @ValidIdentifier
+  private String identifier;
+  @Length(max = 512)
+  private String payload;
+
+  public Sample() {
+    super();
+  }
+
+  public static Sample create(final String identifier, final String payload) {
+    final Sample sample = new Sample();
+    sample.setIdentifier(identifier);
+    sample.setPayload(payload);
+    return sample;
+  }
+
+  public String getIdentifier() {
+    return this.identifier;
+  }
+
+  public void setIdentifier(final String identifier) {
+    this.identifier = identifier;
+  }
+
+  public String getPayload() {
+    return payload;
+  }
+
+  public void setPayload(String payload) {
+    this.payload = payload;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) return true;
+    if (o == null || getClass() != o.getClass()) return false;
+    Sample sample = (Sample) o;
+    return Objects.equals(identifier, sample.identifier) &&
+            Objects.equals(payload, sample.payload);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(identifier, payload);
+  }
+}
diff --git a/api/src/main/java/org/apache/fineract/cn/notification/api/v1/events/NotificationEventConstants.java b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/events/NotificationEventConstants.java
new file mode 100644
index 0000000..3f351c6
--- /dev/null
+++ b/api/src/main/java/org/apache/fineract/cn/notification/api/v1/events/NotificationEventConstants.java
@@ -0,0 +1,35 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.api.v1.events;
+
+@SuppressWarnings("unused")
+public interface NotificationEventConstants {
+
+    String DESTINATION = "notification-v1";
+    String SELECTOR_NAME = "action";
+    String INITIALIZE = "initialize";
+    String POST_SAMPLE = "post-sample";
+    String SELECTOR_INITIALIZE = SELECTOR_NAME + " = '" + INITIALIZE + "'";
+    String SELECTOR_POST_SAMPLE = SELECTOR_NAME + " = '" + POST_SAMPLE + "'";
+
+    //Customer constants;
+    String CUSTOMER_DESTINATION = "customer-v1";
+    String SELECTOR_POST_CUSTOMER = SELECTOR_NAME + " = 'post-customer'";
+
+}
diff --git a/api/src/test/java/org/apache/fineract/cn/notification/api/v1/domain/SampleTest.java b/api/src/test/java/org/apache/fineract/cn/notification/api/v1/domain/SampleTest.java
new file mode 100644
index 0000000..65cd1ac
--- /dev/null
+++ b/api/src/test/java/org/apache/fineract/cn/notification/api/v1/domain/SampleTest.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.api.v1.domain;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import org.apache.commons.lang.RandomStringUtils;
+import org.apache.fineract.cn.test.domain.ValidationTest;
+import org.apache.fineract.cn.test.domain.ValidationTestCase;
+import org.junit.runners.Parameterized;
+
+public class SampleTest extends ValidationTest<Sample> {
+
+  public SampleTest(ValidationTestCase<Sample> testCase) {
+    super(testCase);
+  }
+
+  @Override
+  protected Sample createValidTestSubject() {
+    return Sample.create("xxxx", "yyy");
+  }
+
+  @Parameterized.Parameters
+  public static Collection testCases() {
+    final Collection<ValidationTestCase> ret = new ArrayList<>();
+    ret.add(new ValidationTestCase<Sample>("basicCase")
+            .adjustment(x -> {})
+            .valid(true));
+    ret.add(new ValidationTestCase<Sample>("nullIdentifier")
+            .adjustment(x -> x.setIdentifier(null))
+            .valid(false));
+    ret.add(new ValidationTestCase<Sample>("tooShortIdentifier")
+            .adjustment(x -> x.setIdentifier("z"))
+            .valid(false));
+    ret.add(new ValidationTestCase<Sample>("tooLongPayload")
+            .adjustment(x -> x.setPayload(RandomStringUtils.randomAlphanumeric(513)))
+            .valid(false));
+    return ret;
+  }
+
+}
\ No newline at end of file
diff --git a/build.gradle b/build.gradle
new file mode 100644
index 0000000..ca2370a
--- /dev/null
+++ b/build.gradle
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+group 'org.apache.fineract.cn.notification'
+
+task publishApiToMavenLocal {
+    dependsOn gradle.includedBuild('api').task(':publishToMavenLocal')
+}
+
+task publishServiceToMavenLocal {
+    mustRunAfter publishApiToMavenLocal
+    dependsOn gradle.includedBuild('service').task(':publishToMavenLocal')
+}
+
+task publishComponentTestToMavenLocal {
+    mustRunAfter publishApiToMavenLocal
+    mustRunAfter publishServiceToMavenLocal
+    dependsOn gradle.includedBuild('component-test').task(':publishToMavenLocal')
+}
+
+task publishToMavenLocal {
+    group 'all'
+    dependsOn publishApiToMavenLocal
+    dependsOn publishServiceToMavenLocal
+    dependsOn publishComponentTestToMavenLocal
+}
+
+task prepareForTest {
+    group 'all'
+    dependsOn publishToMavenLocal
+    dependsOn gradle.includedBuild('component-test').task(':build')
+}
+
+task licenseFormat {
+    group 'all'
+    dependsOn gradle.includedBuild('api').task(':licenseFormat')
+    dependsOn gradle.includedBuild('service').task(':licenseFormat')
+    dependsOn gradle.includedBuild('component-test').task(':licenseFormat')
+}
+
+task rat {
+    group 'all'
+    dependsOn gradle.includedBuild('api').task(':rat')
+    dependsOn gradle.includedBuild('service').task(':rat')
+    dependsOn gradle.includedBuild('component-test').task(':rat')
+}
diff --git a/component-test/build.gradle b/component-test/build.gradle
new file mode 100644
index 0000000..0348f06
--- /dev/null
+++ b/component-test/build.gradle
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+buildscript {
+    ext {
+        springBootVersion = '1.4.1.RELEASE'
+    }
+
+    repositories {
+        jcenter()
+    }
+
+    dependencies {
+        classpath ("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
+    }
+}
+
+plugins {
+    id "com.github.hierynomus.license" version "0.13.1"
+    id("org.nosphere.apache.rat") version "0.3.1"
+}
+apply from: '../shared.gradle'
+
+dependencies {
+    compile(
+            [group: 'org.apache.fineract.cn.notification', name: 'api', version: project.version],
+            [group: 'org.apache.fineract.cn.notification', name: 'service', version: project.version],
+            [group: 'org.apache.fineract.cn.anubis', name: 'test', version: versions.frameworkanubis],
+            [group: 'org.apache.fineract.cn', name: 'api', version: versions.frameworkapi],
+            [group: 'org.apache.fineract.cn', name: 'test', version: versions.frameworktest],
+            [group: 'org.apache.fineract.cn', name: 'lang', version: versions.frameworklang],
+            [group: 'org.springframework.boot', name: 'spring-boot-starter-test']
+    )
+}
+
+publishing {
+    publications {
+        mavenJava(MavenPublication) {
+            from components.java
+        }
+    }
+}
diff --git a/component-test/out/production/classes/org/apache/fineract/cn/notification/SuiteTestEnvironment.class b/component-test/out/production/classes/org/apache/fineract/cn/notification/SuiteTestEnvironment.class
new file mode 100644
index 0000000..d098f6e
Binary files /dev/null and b/component-test/out/production/classes/org/apache/fineract/cn/notification/SuiteTestEnvironment.class differ
diff --git a/component-test/out/production/classes/org/apache/fineract/cn/notification/TestSample$TestConfiguration.class b/component-test/out/production/classes/org/apache/fineract/cn/notification/TestSample$TestConfiguration.class
new file mode 100644
index 0000000..b125463
Binary files /dev/null and b/component-test/out/production/classes/org/apache/fineract/cn/notification/TestSample$TestConfiguration.class differ
diff --git a/component-test/out/production/classes/org/apache/fineract/cn/notification/TestSample.class b/component-test/out/production/classes/org/apache/fineract/cn/notification/TestSample.class
new file mode 100644
index 0000000..5962f3a
Binary files /dev/null and b/component-test/out/production/classes/org/apache/fineract/cn/notification/TestSample.class differ
diff --git a/component-test/out/production/classes/org/apache/fineract/cn/notification/TestSuite.class b/component-test/out/production/classes/org/apache/fineract/cn/notification/TestSuite.class
new file mode 100644
index 0000000..f083d51
Binary files /dev/null and b/component-test/out/production/classes/org/apache/fineract/cn/notification/TestSuite.class differ
diff --git a/component-test/out/production/classes/org/apache/fineract/cn/notification/listener/MigrationEventListener.class b/component-test/out/production/classes/org/apache/fineract/cn/notification/listener/MigrationEventListener.class
new file mode 100644
index 0000000..6a70e37
Binary files /dev/null and b/component-test/out/production/classes/org/apache/fineract/cn/notification/listener/MigrationEventListener.class differ
diff --git a/component-test/out/production/classes/org/apache/fineract/cn/notification/listener/SampleEventListener.class b/component-test/out/production/classes/org/apache/fineract/cn/notification/listener/SampleEventListener.class
new file mode 100644
index 0000000..917edfc
Binary files /dev/null and b/component-test/out/production/classes/org/apache/fineract/cn/notification/listener/SampleEventListener.class differ
diff --git a/component-test/settings.gradle b/component-test/settings.gradle
new file mode 100644
index 0000000..a07a3bc
--- /dev/null
+++ b/component-test/settings.gradle
@@ -0,0 +1,18 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+rootProject.name = 'component-test'
\ No newline at end of file
diff --git a/component-test/src/main/java/org/apache/fineract/cn/notification/SuiteTestEnvironment.java b/component-test/src/main/java/org/apache/fineract/cn/notification/SuiteTestEnvironment.java
new file mode 100644
index 0000000..5f2b5f4
--- /dev/null
+++ b/component-test/src/main/java/org/apache/fineract/cn/notification/SuiteTestEnvironment.java
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification;
+
+import org.apache.fineract.cn.test.env.TestEnvironment;
+import org.apache.fineract.cn.test.fixture.cassandra.CassandraInitializer;
+import org.apache.fineract.cn.test.fixture.mariadb.MariaDBInitializer;
+import org.junit.ClassRule;
+import org.junit.rules.RuleChain;
+import org.junit.rules.RunExternalResourceOnce;
+import org.junit.rules.TestRule;
+
+/**
+ * This contains the database resources required by the test.  They are in a separate
+ * class so that the test suite can initialize them before the classes it calls. This
+ * makes test runs faster and prevents tests from "stepping on each other's toes" when
+ * initializing and de-initializing external resources.
+ */
+public class SuiteTestEnvironment {
+  static final String APP_VERSION = "1";
+  static final String APP_NAME = "notification-v" + APP_VERSION;
+
+  static final TestEnvironment testEnvironment = new TestEnvironment(APP_NAME);
+  static final CassandraInitializer cassandraInitializer = new CassandraInitializer();
+  static final MariaDBInitializer mariaDBInitializer = new MariaDBInitializer();
+
+  @ClassRule
+  public static TestRule orderClassRules = RuleChain
+      .outerRule(new RunExternalResourceOnce(testEnvironment))
+      .around(new RunExternalResourceOnce(cassandraInitializer))
+      .around(new RunExternalResourceOnce(mariaDBInitializer));
+}
diff --git a/component-test/src/main/java/org/apache/fineract/cn/notification/TestSample.java b/component-test/src/main/java/org/apache/fineract/cn/notification/TestSample.java
new file mode 100644
index 0000000..76db357
--- /dev/null
+++ b/component-test/src/main/java/org/apache/fineract/cn/notification/TestSample.java
@@ -0,0 +1,137 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification;
+
+import org.apache.fineract.cn.notification.api.v1.client.NotificationManager;
+import org.apache.fineract.cn.notification.api.v1.domain.Sample;
+import org.apache.fineract.cn.notification.api.v1.events.NotificationEventConstants;
+import org.apache.fineract.cn.notification.service.NotificationConfiguration;
+import java.util.List;
+import org.apache.commons.lang3.RandomStringUtils;
+import org.apache.fineract.cn.anubis.test.v1.TenantApplicationSecurityEnvironmentTestRule;
+import org.apache.fineract.cn.api.context.AutoUserContext;
+import org.apache.fineract.cn.test.fixture.TenantDataStoreContextTestRule;
+import org.apache.fineract.cn.test.listener.EnableEventRecording;
+import org.apache.fineract.cn.test.listener.EventRecorder;
+import org.junit.After;
+import org.junit.Assert;
+import org.junit.Before;
+import org.junit.ClassRule;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.test.context.SpringBootTest;
+import org.springframework.cloud.netflix.feign.EnableFeignClients;
+import org.springframework.cloud.netflix.ribbon.RibbonClient;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.annotation.Import;
+import org.springframework.test.context.junit4.SpringRunner;
+
+@RunWith(SpringRunner.class)
+@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.DEFINED_PORT)
+public class TestSample extends SuiteTestEnvironment {
+  private static final String LOGGER_NAME = "test-logger";
+  private static final String TEST_USER = "homer";
+
+
+  @Configuration
+  @EnableEventRecording
+  @EnableFeignClients(basePackages = {"org.apache.fineract.cn.notification.api.v1.client"})
+  @RibbonClient(name = APP_NAME)
+  @Import({NotificationConfiguration.class})
+  @ComponentScan("org.apache.fineract.cn.notification.listener")
+  public static class TestConfiguration {
+    public TestConfiguration() {
+      super();
+    }
+
+    @Bean(name = LOGGER_NAME)
+    public Logger logger() {
+      return LoggerFactory.getLogger(LOGGER_NAME);
+    }
+  }
+
+  @ClassRule
+  public final static TenantDataStoreContextTestRule tenantDataStoreContext = TenantDataStoreContextTestRule.forRandomTenantName(cassandraInitializer, mariaDBInitializer);
+
+  @Rule
+  public final TenantApplicationSecurityEnvironmentTestRule tenantApplicationSecurityEnvironment
+          = new TenantApplicationSecurityEnvironmentTestRule(testEnvironment, this::waitForInitialize);
+
+  private AutoUserContext userContext;
+
+  @Autowired
+  private NotificationManager testSubject;
+
+  @Autowired
+  private EventRecorder eventRecorder;
+
+  @SuppressWarnings("WeakerAccess")
+  @Autowired
+  @Qualifier(LOGGER_NAME)
+  Logger logger;
+
+  public TestSample() {
+    super();
+  }
+
+  @Before
+  public void prepTest() {
+    userContext = tenantApplicationSecurityEnvironment.createAutoUserContext(TestSample.TEST_USER);
+  }
+
+  @After
+  public void cleanTest() {
+    userContext.close();
+    eventRecorder.clear();
+  }
+
+  public boolean waitForInitialize() {
+    try {
+      return this.eventRecorder.wait(NotificationEventConstants.INITIALIZE, APP_VERSION);
+    } catch (final InterruptedException e) {
+      throw new IllegalStateException(e);
+    }
+  }
+
+  @Test
+  public void shouldCreateSample() throws InterruptedException {
+    logger.info("Running test shouldCreateSample.");
+    final Sample sample = Sample.create(RandomStringUtils.randomAlphanumeric(8), RandomStringUtils.randomAlphanumeric(512));
+    this.testSubject.createEntity(sample);
+
+    Assert.assertTrue(this.eventRecorder.wait(NotificationEventConstants.POST_SAMPLE, sample.getIdentifier()));
+
+    final Sample createdSample = this.testSubject.getEntity(sample.getIdentifier());
+    Assert.assertEquals(sample, createdSample);
+  }
+
+  @Test
+  public void shouldListSamples() {
+    logger.info("Running test shouldListSamples.");
+    final List<Sample> allEntities = this.testSubject.findAllEntities();
+    Assert.assertNotNull(allEntities);
+  }
+}
diff --git a/component-test/src/main/java/org/apache/fineract/cn/notification/TestSuite.java b/component-test/src/main/java/org/apache/fineract/cn/notification/TestSuite.java
new file mode 100644
index 0000000..a4d42bf
--- /dev/null
+++ b/component-test/src/main/java/org/apache/fineract/cn/notification/TestSuite.java
@@ -0,0 +1,30 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification;
+
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
+@RunWith(Suite.class)
+@Suite.SuiteClasses({
+    TestSample.class,
+    //TODO: when you create a new component test, add it here so you can run it with the suite.
+})
+public class TestSuite extends SuiteTestEnvironment {
+}
diff --git a/component-test/src/main/java/org/apache/fineract/cn/notification/listener/MigrationEventListener.java b/component-test/src/main/java/org/apache/fineract/cn/notification/listener/MigrationEventListener.java
new file mode 100644
index 0000000..c24b97c
--- /dev/null
+++ b/component-test/src/main/java/org/apache/fineract/cn/notification/listener/MigrationEventListener.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.listener;
+
+import org.apache.fineract.cn.notification.api.v1.events.NotificationEventConstants;
+import org.apache.fineract.cn.lang.config.TenantHeaderFilter;
+import org.apache.fineract.cn.test.listener.EventRecorder;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jms.annotation.JmsListener;
+import org.springframework.messaging.handler.annotation.Header;
+import org.springframework.stereotype.Component;
+
+@SuppressWarnings("unused")
+@Component
+public class MigrationEventListener {
+
+  private final EventRecorder eventRecorder;
+
+  @Autowired
+  public MigrationEventListener(@SuppressWarnings("SpringJavaAutowiringInspection") final EventRecorder eventRecorder) {
+    super();
+    this.eventRecorder = eventRecorder;
+  }
+
+  @JmsListener(
+      subscription = NotificationEventConstants.DESTINATION,
+      destination = NotificationEventConstants.DESTINATION,
+      selector = NotificationEventConstants.SELECTOR_INITIALIZE
+  )
+  public void onInitialization(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                               final String payload) {
+    this.eventRecorder.event(tenant, NotificationEventConstants.INITIALIZE, payload, String.class);
+  }
+}
diff --git a/component-test/src/main/java/org/apache/fineract/cn/notification/listener/SampleEventListener.java b/component-test/src/main/java/org/apache/fineract/cn/notification/listener/SampleEventListener.java
new file mode 100644
index 0000000..85abe9e
--- /dev/null
+++ b/component-test/src/main/java/org/apache/fineract/cn/notification/listener/SampleEventListener.java
@@ -0,0 +1,50 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.listener;
+
+import org.apache.fineract.cn.notification.api.v1.events.NotificationEventConstants;
+import org.apache.fineract.cn.lang.config.TenantHeaderFilter;
+import org.apache.fineract.cn.test.listener.EventRecorder;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jms.annotation.JmsListener;
+import org.springframework.messaging.handler.annotation.Header;
+import org.springframework.stereotype.Component;
+
+@SuppressWarnings("unused")
+@Component
+public class SampleEventListener {
+
+  private final EventRecorder eventRecorder;
+
+  @Autowired
+  public SampleEventListener(@SuppressWarnings("SpringJavaAutowiringInspection") final EventRecorder eventRecorder) {
+    super();
+    this.eventRecorder = eventRecorder;
+  }
+
+  @JmsListener(
+      subscription = NotificationEventConstants.DESTINATION,
+      destination = NotificationEventConstants.DESTINATION,
+      selector = NotificationEventConstants.SELECTOR_POST_SAMPLE
+  )
+  public void onCreateSample(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                             final String payload) {
+    this.eventRecorder.event(tenant, NotificationEventConstants.POST_SAMPLE, payload, String.class);
+  }
+}
diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar
new file mode 100644
index 0000000..400f155
Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
new file mode 100644
index 0000000..c563c1a
--- /dev/null
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -0,0 +1,6 @@
+#Fri May 18 16:18:58 MUT 2018
+distributionBase=GRADLE_USER_HOME
+distributionPath=wrapper/dists
+zipStoreBase=GRADLE_USER_HOME
+zipStorePath=wrapper/dists
+distributionUrl=https\://services.gradle.org/distributions/gradle-3.4.1-all.zip
diff --git a/gradlew b/gradlew
new file mode 100755
index 0000000..4453cce
--- /dev/null
+++ b/gradlew
@@ -0,0 +1,172 @@
+#!/usr/bin/env sh
+
+##############################################################################
+##
+##  Gradle start up script for UN*X
+##
+##############################################################################
+
+# Attempt to set APP_HOME
+# Resolve links: $0 may be a link
+PRG="$0"
+# Need this for relative symlinks.
+while [ -h "$PRG" ] ; do
+    ls=`ls -ld "$PRG"`
+    link=`expr "$ls" : '.*-> \(.*\)$'`
+    if expr "$link" : '/.*' > /dev/null; then
+        PRG="$link"
+    else
+        PRG=`dirname "$PRG"`"/$link"
+    fi
+done
+SAVED="`pwd`"
+cd "`dirname \"$PRG\"`/" >/dev/null
+APP_HOME="`pwd -P`"
+cd "$SAVED" >/dev/null
+
+APP_NAME="Gradle"
+APP_BASE_NAME=`basename "$0"`
+
+# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+DEFAULT_JVM_OPTS=""
+
+# Use the maximum available, or set MAX_FD != -1 to use that value.
+MAX_FD="maximum"
+
+warn ( ) {
+    echo "$*"
+}
+
+die ( ) {
+    echo
+    echo "$*"
+    echo
+    exit 1
+}
+
+# OS specific support (must be 'true' or 'false').
+cygwin=false
+msys=false
+darwin=false
+nonstop=false
+case "`uname`" in
+  CYGWIN* )
+    cygwin=true
+    ;;
+  Darwin* )
+    darwin=true
+    ;;
+  MINGW* )
+    msys=true
+    ;;
+  NONSTOP* )
+    nonstop=true
+    ;;
+esac
+
+CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
+
+# Determine the Java command to use to start the JVM.
+if [ -n "$JAVA_HOME" ] ; then
+    if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
+        # IBM's JDK on AIX uses strange locations for the executables
+        JAVACMD="$JAVA_HOME/jre/sh/java"
+    else
+        JAVACMD="$JAVA_HOME/bin/java"
+    fi
+    if [ ! -x "$JAVACMD" ] ; then
+        die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+    fi
+else
+    JAVACMD="java"
+    which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+
+Please set the JAVA_HOME variable in your environment to match the
+location of your Java installation."
+fi
+
+# Increase the maximum file descriptors if we can.
+if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
+    MAX_FD_LIMIT=`ulimit -H -n`
+    if [ $? -eq 0 ] ; then
+        if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
+            MAX_FD="$MAX_FD_LIMIT"
+        fi
+        ulimit -n $MAX_FD
+        if [ $? -ne 0 ] ; then
+            warn "Could not set maximum file descriptor limit: $MAX_FD"
+        fi
+    else
+        warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
+    fi
+fi
+
+# For Darwin, add options to specify how the application appears in the dock
+if $darwin; then
+    GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
+fi
+
+# For Cygwin, switch paths to Windows format before running java
+if $cygwin ; then
+    APP_HOME=`cygpath --path --mixed "$APP_HOME"`
+    CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
+    JAVACMD=`cygpath --unix "$JAVACMD"`
+
+    # We build the pattern for arguments to be converted via cygpath
+    ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
+    SEP=""
+    for dir in $ROOTDIRSRAW ; do
+        ROOTDIRS="$ROOTDIRS$SEP$dir"
+        SEP="|"
+    done
+    OURCYGPATTERN="(^($ROOTDIRS))"
+    # Add a user-defined pattern to the cygpath arguments
+    if [ "$GRADLE_CYGPATTERN" != "" ] ; then
+        OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
+    fi
+    # Now convert the arguments - kludge to limit ourselves to /bin/sh
+    i=0
+    for arg in "$@" ; do
+        CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
+        CHECK2=`echo "$arg"|egrep -c "^-"`                                 ### Determine if an option
+
+        if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then                    ### Added a condition
+            eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
+        else
+            eval `echo args$i`="\"$arg\""
+        fi
+        i=$((i+1))
+    done
+    case $i in
+        (0) set -- ;;
+        (1) set -- "$args0" ;;
+        (2) set -- "$args0" "$args1" ;;
+        (3) set -- "$args0" "$args1" "$args2" ;;
+        (4) set -- "$args0" "$args1" "$args2" "$args3" ;;
+        (5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
+        (6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
+        (7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
+        (8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
+        (9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
+    esac
+fi
+
+# Escape application args
+save ( ) {
+    for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
+    echo " "
+}
+APP_ARGS=$(save "$@")
+
+# Collect all arguments for the java command, following the shell quoting and substitution rules
+eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
+
+# by default we should be in the correct project dir, but when run from Finder on Mac, the cwd is wrong
+if [ "$(uname)" = "Darwin" ] && [ "$HOME" = "$PWD" ]; then
+  cd "$(dirname "$0")"
+fi
+
+exec "$JAVACMD" "$@"
diff --git a/gradlew.bat b/gradlew.bat
new file mode 100644
index 0000000..e95643d
--- /dev/null
+++ b/gradlew.bat
@@ -0,0 +1,84 @@
+@if "%DEBUG%" == "" @echo off
+@rem ##########################################################################
+@rem
+@rem  Gradle startup script for Windows
+@rem
+@rem ##########################################################################
+
+@rem Set local scope for the variables with windows NT shell
+if "%OS%"=="Windows_NT" setlocal
+
+set DIRNAME=%~dp0
+if "%DIRNAME%" == "" set DIRNAME=.
+set APP_BASE_NAME=%~n0
+set APP_HOME=%DIRNAME%
+
+@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
+set DEFAULT_JVM_OPTS=
+
+@rem Find java.exe
+if defined JAVA_HOME goto findJavaFromJavaHome
+
+set JAVA_EXE=java.exe
+%JAVA_EXE% -version >NUL 2>&1
+if "%ERRORLEVEL%" == "0" goto init
+
+echo.
+echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:findJavaFromJavaHome
+set JAVA_HOME=%JAVA_HOME:"=%
+set JAVA_EXE=%JAVA_HOME%/bin/java.exe
+
+if exist "%JAVA_EXE%" goto init
+
+echo.
+echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
+echo.
+echo Please set the JAVA_HOME variable in your environment to match the
+echo location of your Java installation.
+
+goto fail
+
+:init
+@rem Get command-line arguments, handling Windows variants
+
+if not "%OS%" == "Windows_NT" goto win9xME_args
+
+:win9xME_args
+@rem Slurp the command line arguments.
+set CMD_LINE_ARGS=
+set _SKIP=2
+
+:win9xME_args_slurp
+if "x%~1" == "x" goto execute
+
+set CMD_LINE_ARGS=%*
+
+:execute
+@rem Setup the command line
+
+set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
+
+@rem Execute Gradle
+"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
+
+:end
+@rem End local scope for the variables with windows NT shell
+if "%ERRORLEVEL%"=="0" goto mainEnd
+
+:fail
+rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
+rem the _cmd.exe /c_ return code!
+if  not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
+exit /b 1
+
+:mainEnd
+if "%OS%"=="Windows_NT" endlocal
+
+:omega
diff --git a/service/build.gradle b/service/build.gradle
new file mode 100644
index 0000000..57f507d
--- /dev/null
+++ b/service/build.gradle
@@ -0,0 +1,85 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+buildscript {
+    ext {
+        springBootVersion = '1.4.1.RELEASE'
+    }
+
+    repositories {
+        jcenter()
+    }
+
+    dependencies {
+        classpath ("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
+    }
+}
+
+plugins {
+    id "com.github.hierynomus.license" version "0.13.1"
+    id("org.nosphere.apache.rat") version "0.3.1"
+}
+
+apply from: '../shared.gradle'
+
+apply plugin: 'spring-boot'
+
+springBoot {
+    executable = true
+    classifier = 'boot'
+}
+
+dependencies {
+    compile(
+            [group: 'com.twilio.sdk', name: 'twilio', version: '7.17.+'],
+            [group: 'org.apache.fineract.cn.customer', name: 'api', version: versions.fineractcncustomer],
+            [group: 'org.springframework.cloud', name: 'spring-cloud-starter-config'],
+            [group: 'org.springframework.cloud', name: 'spring-cloud-starter-eureka'],
+            [group: 'org.springframework.boot', name: 'spring-boot-starter-jetty'],
+            //check this dependency
+            [group: 'org.springframework.boot', name: 'spring-boot-starter-mail', version: '1.4.3.RELEASE'],
+            [group: 'org.apache.fineract.cn.notification', name: 'api', version: project.version],
+            [group: 'org.apache.fineract.cn.anubis', name: 'library', version: versions.frameworkanubis],
+            [group: 'com.google.code.gson', name: 'gson'],
+            [group: 'org.apache.fineract.cn', name: 'lang', version: versions.frameworklang],
+            [group: 'org.apache.fineract.cn', name: 'async', version: versions.frameworkasync],
+            [group: 'org.apache.fineract.cn', name: 'cassandra', version: versions.frameworkcassandra],
+            [group: 'org.apache.fineract.cn', name: 'mariadb', version: versions.frameworkmariadb],
+            [group: 'org.apache.fineract.cn', name: 'command', version: versions.frameworkcommand],
+            [group: 'org.hibernate', name: 'hibernate-validator', version: versions.validator]
+    )
+}
+
+publishToMavenLocal.dependsOn bootRepackage
+
+publishing {
+    publications {
+        service(MavenPublication) {
+            from components.java
+            groupId project.group
+            artifactId project.name
+            version project.version
+        }
+        bootService(MavenPublication) {
+            // "boot" jar
+            artifact ("$buildDir/libs/$project.name-$version-boot.jar")
+            groupId project.group
+            artifactId ("$project.name-boot")
+            version project.version
+        }
+    }
+}
diff --git a/service/out/production/resources/application.yml b/service/out/production/resources/application.yml
new file mode 100644
index 0000000..17d03bc
--- /dev/null
+++ b/service/out/production/resources/application.yml
@@ -0,0 +1,96 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+spring:
+  cloud:
+    discovery:
+      enabled: false
+    config:
+      enabled: false
+  mail:
+    host: smtp.gmail.com
+    port: 587
+    username: ebenezergraham69@gmail.com
+    password: fdzmzbhbmtkafzvq
+    properties:
+      mail:
+        smtpauth: true
+        smtp:
+        starttls:
+          enable: true
+
+eureka:
+  client:
+    serviceUrl:
+      defaultZone: http://localhost:8761/eureka/
+
+server:
+  port: 8081
+  contextPath: /notification/v1/*
+
+cassandra:
+  clusterName: staging_cluster
+  contactPoints: 127.0.0.1:9042,127.0.0.2:9042,127.0.0.3:9042
+  keyspace: seshat
+  cl:
+    read: LOCAL_QUORUM
+    write: LOCAL_QUORUM
+    delete: LOCAL_QUORUM
+
+mariadb:
+  driverClass: org.mariadb.jdbc.Driver
+  database: seshat
+  host: localhost
+  port: 3306
+  user: root
+  password: mysql
+
+bonecp:
+  idleMaxAgeInMinutes: 240
+  idleConnectionTestPeriodInMinutes: 60
+  maxConnectionsPerPartition: 10
+  minConnectionsPerPartition: 1
+  partitionCount: 2
+  acquireIncrement: 5
+  statementsCacheSize: 100
+
+async:
+  corePoolSize: 32
+  maxPoolSize: 16384
+  queueCapacity: 0
+  threadName: async-processor-
+
+flyway:
+  enabled: false
+
+mfi:
+  senderNumber: +15109441898
+
+smssender:
+  accountSID: AC1fde2c6f26f367b93231c5fdb944c908
+  authtoken: bc9a53e41745b8471e0ecafc859d86aa
+
+fineract:
+  customer:
+    accountcreated:
+      message: Dear Valued Customer, Your account has been created.
+    accountclosed:
+      message: Dear Valued Customer, Your account has been successfully closed.
+
+
diff --git a/service/out/production/resources/bootstrap.yml b/service/out/production/resources/bootstrap.yml
new file mode 100644
index 0000000..76c2441
--- /dev/null
+++ b/service/out/production/resources/bootstrap.yml
@@ -0,0 +1,22 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+spring:
+    application:
+        name: notification-v1
diff --git a/service/out/production/resources/db/migrations/mariadb/V1__initial_setup.sql b/service/out/production/resources/db/migrations/mariadb/V1__initial_setup.sql
new file mode 100644
index 0000000..b68edad
--- /dev/null
+++ b/service/out/production/resources/db/migrations/mariadb/V1__initial_setup.sql
@@ -0,0 +1,32 @@
+--
+-- Licensed to the Apache Software Foundation (ASF) under one
+-- or more contributor license agreements.  See the NOTICE file
+-- distributed with this work for additional information
+-- regarding copyright ownership.  The ASF licenses this file
+-- to you under the Apache License, Version 2.0 (the
+-- "License"); you may not use this file except in compliance
+-- with the License.  You may obtain a copy of the License at
+--
+--   http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing,
+-- software distributed under the License is distributed on an
+-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+-- KIND, either express or implied.  See the License for the
+-- specific language governing permissions and limitations
+-- under the License.
+--
+
+CREATE TABLE notification (
+  id BIGINT NOT NULL AUTO_INCREMENT,
+  identifier VARCHAR(8) NOT NULL,
+  payload VARCHAR(512) NULL,
+  CONSTRAINT notification_pk PRIMARY KEY (id)
+);
+
+CREATE TABLE template_sample (
+  id BIGINT NOT NULL AUTO_INCREMENT,
+  identifier VARCHAR(8) NOT NULL,
+  payload VARCHAR(512) NULL,
+  CONSTRAINT template_sample_pk PRIMARY KEY (id)
+);
diff --git a/service/settings.gradle b/service/settings.gradle
new file mode 100644
index 0000000..1a4c2fd
--- /dev/null
+++ b/service/settings.gradle
@@ -0,0 +1,18 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+rootProject.name = 'service'
\ No newline at end of file
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/NotificationApplication.java b/service/src/main/java/org/apache/fineract/cn/notification/service/NotificationApplication.java
new file mode 100644
index 0000000..5968d0d
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/NotificationApplication.java
@@ -0,0 +1,32 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service;
+
+import org.springframework.boot.SpringApplication;
+
+public class NotificationApplication {
+
+  public NotificationApplication() {
+    super();
+  }
+
+  public static void main(String[] args) {
+    SpringApplication.run(NotificationConfiguration.class, args);
+  }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/NotificationConfiguration.java b/service/src/main/java/org/apache/fineract/cn/notification/service/NotificationConfiguration.java
new file mode 100644
index 0000000..01aa6d3
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/NotificationConfiguration.java
@@ -0,0 +1,101 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service;
+
+import org.apache.fineract.cn.anubis.config.EnableAnubis;
+import org.apache.fineract.cn.async.config.EnableAsync;
+import org.apache.fineract.cn.cassandra.config.EnableCassandra;
+import org.apache.fineract.cn.command.config.EnableCommandProcessing;
+import org.apache.fineract.cn.lang.config.EnableServiceException;
+import org.apache.fineract.cn.lang.config.EnableTenantContext;
+import org.apache.fineract.cn.mariadb.config.EnableMariaDB;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
+import org.springframework.boot.context.properties.ConfigurationProperties;
+import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.ComponentScan;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
+import org.springframework.mail.javamail.JavaMailSender;
+import org.springframework.mail.javamail.JavaMailSenderImpl;
+import org.springframework.web.servlet.config.annotation.PathMatchConfigurer;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
+
+import java.util.Properties;
+
+@SuppressWarnings("WeakerAccess")
+@Configuration
+@EnableAutoConfiguration
+@EnableDiscoveryClient
+@EnableAsync
+@EnableTenantContext
+@EnableCassandra
+@EnableMariaDB
+@EnableCommandProcessing
+@EnableAnubis
+@EnableServiceException
+@ConfigurationProperties(locations = {"details"})
+@ComponentScan({
+    "org.apache.fineract.cn.notification.service.rest",
+    "org.apache.fineract.cn.notification.service.internal.service",
+    "org.apache.fineract.cn.notification.service.internal.repository",
+    "org.apache.fineract.cn.notification.service.internal.command.handler"
+})
+@EnableJpaRepositories({
+    "org.apache.fineract.cn.notification.service.internal.repository"
+})
+public class NotificationConfiguration extends WebMvcConfigurerAdapter {
+
+  public NotificationConfiguration() {
+    super();
+  }
+
+  @Bean(name = ServiceConstants.LOGGER_NAME)
+  public Logger logger() {
+    return LoggerFactory.getLogger(ServiceConstants.LOGGER_NAME);
+  }
+
+  @Override
+  public void configurePathMatch(final PathMatchConfigurer configurer) {
+    configurer.setUseSuffixPatternMatch(Boolean.FALSE);
+  }
+
+  @Bean
+  @Qualifier("gmail")
+  public JavaMailSender getJavaMailSender() {
+
+    JavaMailSenderImpl mailSender = new JavaMailSenderImpl();
+    mailSender.setHost("smtp.gmail.com");
+    mailSender.setPort(587);
+
+    mailSender.setUsername("ebenezergraham69@gmail.com");
+    mailSender.setPassword("fdzmzbhbmtkafzvq");
+
+    Properties props = mailSender.getJavaMailProperties();
+    props.put("mail.transport.protocol", "smtp");
+    props.put("mail.smtp.auth", "true");
+    props.put("mail.smtp.starttls.enable", "true");
+    props.put("mail.debug", "true");
+
+    return mailSender;
+  }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/ServiceConstants.java b/service/src/main/java/org/apache/fineract/cn/notification/service/ServiceConstants.java
new file mode 100644
index 0000000..cb4e902
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/ServiceConstants.java
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service;
+
+public interface ServiceConstants {
+  String LOGGER_NAME = "rest-logger";
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/command/InitializeServiceCommand.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/command/InitializeServiceCommand.java
new file mode 100644
index 0000000..21335ac
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/command/InitializeServiceCommand.java
@@ -0,0 +1,31 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.command;
+
+public class InitializeServiceCommand {
+
+  public InitializeServiceCommand() {
+    super();
+  }
+
+  @Override
+  public String toString() {
+    return "InitializeServiceCommand{}";
+  }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/command/SampleCommand.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/command/SampleCommand.java
new file mode 100644
index 0000000..3fa3aac
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/command/SampleCommand.java
@@ -0,0 +1,42 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.command;
+
+import org.apache.fineract.cn.notification.api.v1.domain.Sample;
+
+public class SampleCommand {
+
+  private final Sample sample;
+
+  public SampleCommand(final Sample sample) {
+    super();
+    this.sample = sample;
+  }
+
+  public Sample sample() {
+    return this.sample;
+  }
+
+  @Override
+  public String toString() {
+    return "SampleCommand{" +
+        "sample=" + sample.getIdentifier() +
+        '}';
+  }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/command/handler/MigrationAggregate.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/command/handler/MigrationAggregate.java
new file mode 100644
index 0000000..da7cc6e
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/command/handler/MigrationAggregate.java
@@ -0,0 +1,67 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.command.handler;
+
+import org.apache.fineract.cn.notification.api.v1.events.NotificationEventConstants;
+import org.apache.fineract.cn.notification.service.ServiceConstants;
+import org.apache.fineract.cn.notification.service.internal.command.InitializeServiceCommand;
+import javax.sql.DataSource;
+import org.apache.fineract.cn.command.annotation.Aggregate;
+import org.apache.fineract.cn.command.annotation.CommandHandler;
+import org.apache.fineract.cn.command.annotation.CommandLogLevel;
+import org.apache.fineract.cn.command.annotation.EventEmitter;
+import org.apache.fineract.cn.lang.ApplicationName;
+import org.apache.fineract.cn.mariadb.domain.FlywayFactoryBean;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.transaction.annotation.Transactional;
+
+@SuppressWarnings({
+    "unused"
+})
+@Aggregate
+public class MigrationAggregate {
+
+  private final Logger logger;
+  private final DataSource dataSource;
+  private final FlywayFactoryBean flywayFactoryBean;
+  private final ApplicationName applicationName;
+
+  @Autowired
+  public MigrationAggregate(@Qualifier(ServiceConstants.LOGGER_NAME) final Logger logger,
+                            final DataSource dataSource,
+                            final FlywayFactoryBean flywayFactoryBean,
+                            final ApplicationName applicationName) {
+    super();
+    this.logger = logger;
+    this.dataSource = dataSource;
+    this.flywayFactoryBean = flywayFactoryBean;
+    this.applicationName = applicationName;
+  }
+
+  @CommandHandler(logStart = CommandLogLevel.INFO, logFinish = CommandLogLevel.INFO)
+  @Transactional
+  @EventEmitter(selectorName = NotificationEventConstants.SELECTOR_NAME, selectorValue = NotificationEventConstants.INITIALIZE)
+  public String initialize(final InitializeServiceCommand initializeServiceCommand) {
+    this.logger.debug("Start service migration.");
+    this.flywayFactoryBean.create(this.dataSource).migrate();
+    return this.applicationName.getVersionString();
+  }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/command/handler/SampleAggregate.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/command/handler/SampleAggregate.java
new file mode 100644
index 0000000..cf09aca
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/command/handler/SampleAggregate.java
@@ -0,0 +1,66 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.command.handler;
+
+import org.apache.fineract.cn.notification.api.v1.events.NotificationEventConstants;
+import org.apache.fineract.cn.notification.service.internal.command.SampleCommand;
+import org.apache.fineract.cn.command.annotation.Aggregate;
+import org.apache.fineract.cn.command.annotation.CommandHandler;
+import org.apache.fineract.cn.command.annotation.CommandLogLevel;
+import org.apache.fineract.cn.command.annotation.EventEmitter;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.transaction.annotation.Transactional;
+
+@SuppressWarnings("unused")
+@Aggregate
+public class SampleAggregate {
+
+  private final SampleJpaEntityRepository sampleJpaEntityRepository;
+
+  @Autowired
+  public SampleAggregate(final SampleJpaEntityRepository sampleJpaEntityRepository) {
+    super();
+    this.sampleJpaEntityRepository = sampleJpaEntityRepository;
+  }
+
+  //TODO: Think about your command handler logging, then delete this comment.
+  // The log levels provided in the command handler cause log messages to be emitted each time this
+  // command handler is called before and after the call. Before the call, the command is logged
+  // using its toString() method, and after the call, the emitted event is logged via its toString()
+  // method.
+  //
+  // If you wish to adjust the information in the log messages, do so via the toString() methods.
+  // Financial transactions, passwords, and customer address data are examples of information which
+  // should not be placed in the logs.
+  //
+  // If a command handler should not emit a log message, change logStart and logFinish to:
+  // CommandLogLevel.NONE.
+  @CommandHandler(logStart = CommandLogLevel.INFO, logFinish = CommandLogLevel.INFO)
+  @Transactional
+  @EventEmitter(selectorName = NotificationEventConstants.SELECTOR_NAME, selectorValue = NotificationEventConstants.POST_SAMPLE)
+  public String sample(final SampleCommand sampleCommand) {
+
+    final SampleJpaEntity entity = new SampleJpaEntity();
+    entity.setIdentifier(sampleCommand.sample().getIdentifier());
+    entity.setPayload(sampleCommand.sample().getPayload());
+    this.sampleJpaEntityRepository.save(entity);
+
+    return sampleCommand.sample().getIdentifier();
+  }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/mapper/SampleMapper.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/mapper/SampleMapper.java
new file mode 100644
index 0000000..973adee
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/mapper/SampleMapper.java
@@ -0,0 +1,45 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.mapper;
+
+import org.apache.fineract.cn.notification.api.v1.domain.Sample;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+public class SampleMapper {
+
+  private SampleMapper() {
+    super();
+  }
+
+  public static Sample map(final SampleJpaEntity sampleJpaEntity) {
+    final Sample sample = new Sample();
+    sample.setIdentifier(sampleJpaEntity.getIdentifier());
+    sample.setPayload(sampleJpaEntity.getPayload());
+    return sample;
+  }
+
+  public static List<Sample> map(final List<SampleJpaEntity> sampleJpaEntities) {
+    final ArrayList<Sample> samples = new ArrayList<>(sampleJpaEntities.size());
+    samples.addAll(sampleJpaEntities.stream().map(SampleMapper::map).collect(Collectors.toList()));
+    return samples;
+  }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/EmailGatewayConfiguration.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/EmailGatewayConfiguration.java
new file mode 100644
index 0000000..e0c6d89
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/EmailGatewayConfiguration.java
@@ -0,0 +1,114 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.repository;
+
+import javax.persistence.*;
+
+@SuppressWarnings("unused")
+@Entity
+@Table(name = "email_gateway_configuration")
+public class EmailGatewayConfiguration {
+
+  @Id
+  @GeneratedValue(strategy = GenerationType.IDENTITY)
+  @Column(name = "id")
+  private Long id;
+  @Column(name = "identifier")
+  private String identifier;
+  @Column(name = "host")
+  private String host;
+  @Column(name = "port")
+  private String port;
+  @Column(name = "username")
+  private String username;
+  @Column(name = "app_id")
+  private String app_id;
+  @Column(name = "smtp_auth")
+  private String smtp_auth;
+  @Column(name = "start_tls")
+  private String start_tls;
+
+  public EmailGatewayConfiguration() {
+    super();
+  }
+
+  public Long getId() {
+    return id;
+  }
+
+  public void setId(Long id) {
+    this.id = id;
+  }
+
+  public String getIdentifier() {
+    return this.identifier;
+  }
+
+  public void setIdentifier(final String identifier) {
+    this.identifier = identifier;
+  }
+
+  public String getHost() {
+    return host;
+  }
+
+  public void setHost(String host) {
+    this.host = host;
+  }
+
+  public String getPort() {
+    return port;
+  }
+
+  public void setPort(String port) {
+    this.port = port;
+  }
+
+  public String getUsername() {
+    return username;
+  }
+
+  public void setUsername(String username) {
+    this.username = username;
+  }
+
+  public String getApp_id() {
+    return app_id;
+  }
+
+  public void setApp_id(String app_id) {
+    this.app_id = app_id;
+  }
+
+  public String getSmtp_auth() {
+    return smtp_auth;
+  }
+
+  public void setSmtp_auth(String smtp_auth) {
+    this.smtp_auth = smtp_auth;
+  }
+
+  public String getStart_tls() {
+    return start_tls;
+  }
+
+  public void setStart_tls(String start_tls) {
+    this.start_tls = start_tls;
+  }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/EmailGatewayConfigurationRepository.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/EmailGatewayConfigurationRepository.java
new file mode 100644
index 0000000..b380def
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/EmailGatewayConfigurationRepository.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.repository;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.Optional;
+
+@Repository
+public interface EmailGatewayConfigurationRepository extends JpaRepository<EmailGatewayConfiguration, Long> {
+  Optional<EmailGatewayConfiguration> findByIdentifier(String identifier);
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/SMSGatewayConfiguration.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/SMSGatewayConfiguration.java
new file mode 100644
index 0000000..770db6a
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/SMSGatewayConfiguration.java
@@ -0,0 +1,94 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.repository;
+
+import javax.persistence.*;
+
+@SuppressWarnings("unused")
+@Entity
+@Table(name = "sms_gateway_configuration")
+public class SMSGatewayConfiguration {
+
+  @Id
+  @GeneratedValue(strategy = GenerationType.IDENTITY)
+  @Column(name = "id")
+  private Long id;
+  @Column(name = "identifier")
+  private String identifier;
+  @Column(name = "organisation")
+  private String organisation;
+  @Column(name = "auth_token")
+  private String auth_token;
+  @Column(name = "accountid")
+  private String accountid;
+  @Column(name = "option")
+  private String option;
+
+  public SMSGatewayConfiguration() {
+    super();
+  }
+
+  public Long getId() {
+    return id;
+  }
+
+  public void setId(Long id) {
+    this.id = id;
+  }
+
+  public String getIdentifier() {
+    return this.identifier;
+  }
+
+  public void setIdentifier(final String identifier) {
+    this.identifier = identifier;
+  }
+
+  public String getOrganisation() {
+    return organisation;
+  }
+
+  public void setOrganisation(String organisation) {
+    this.organisation = organisation;
+  }
+
+  public String getAuth_token() {
+    return auth_token;
+  }
+
+  public void setAuth_token(String auth_token) {
+    this.auth_token = auth_token;
+  }
+
+  public String getAccountid() {
+    return accountid;
+  }
+
+  public void setAccountid(String accountid) {
+    this.accountid = accountid;
+  }
+
+  public String getOption() {
+    return option;
+  }
+
+  public void setOption(String option) {
+    this.option = option;
+  }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/SMSGatewayConfigurationRepository.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/SMSGatewayConfigurationRepository.java
new file mode 100644
index 0000000..7daae78
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/repository/SMSGatewayConfigurationRepository.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.repository;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.stereotype.Repository;
+
+import java.util.Optional;
+
+@Repository
+public interface SMSGatewayConfigurationRepository extends JpaRepository<SMSGatewayConfiguration, Long> {
+  Optional<SMSGatewayConfiguration> findByIdentifier(String identifier);
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/EmailSender.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/EmailSender.java
new file mode 100644
index 0000000..e9cc516
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/EmailSender.java
@@ -0,0 +1,44 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.service;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.context.annotation.Bean;
+import org.springframework.mail.SimpleMailMessage;
+import org.springframework.mail.javamail.JavaMailSender;
+import org.springframework.stereotype.Service;
+
+
+@Service
+public class EmailSender {
+
+    @Autowired
+    @Qualifier("gmail")
+    private JavaMailSender sender;
+
+    public void sendEmail(String to, String subject, String message) {
+        SimpleMailMessage mail = new SimpleMailMessage();
+        mail.setTo(to);
+        mail.setSubject(subject);
+        mail.setText(message);
+        sender.send(mail);
+    }
+
+}
\ No newline at end of file
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/SMSSender.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/SMSSender.java
new file mode 100644
index 0000000..6bf7558
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/SMSSender.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.service;
+
+
+import com.twilio.Twilio;
+import com.twilio.rest.api.v2010.account.Message;
+import com.twilio.type.PhoneNumber;
+import org.springframework.beans.factory.annotation.Value;
+import com.twilio.rest.api.v2010.account.MessageCreator;
+import org.springframework.stereotype.Service;
+
+@Service
+public class SMSSender {
+
+    @Value(value = "${smssender.accountSID}")
+    public static String ACCOUNT_SID;
+
+    @Value("${smssender.authToken}")
+    public static String AUTH_TOKEN;
+
+    @Value("${mfi.senderNumber}")
+    public static String sender;
+
+    @Value("${fineract.customer.accountcreated}")
+    public String template;
+
+    public void sendSMS(String receiver, String template) {
+
+        Twilio.init(ACCOUNT_SID, AUTH_TOKEN);
+
+        MessageCreator messageCreator = Message.creator(ACCOUNT_SID,new PhoneNumber(receiver), new PhoneNumber(sender), template);
+        Message message = messageCreator.create();
+        System.out.println(message.getSid());
+        System.out.println(message.getStatus());
+    }
+
+    }
\ No newline at end of file
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/SampleService.java b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/SampleService.java
new file mode 100644
index 0000000..bc2d5a8
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/internal/service/SampleService.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.internal.service;
+
+import org.apache.fineract.cn.notification.api.v1.domain.Sample;
+import org.apache.fineract.cn.notification.service.internal.mapper.SampleMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Optional;
+
+@Service
+public class SampleService {
+
+  private final SampleJpaEntityRepository sampleJpaEntityRepository;
+
+  @Autowired
+  public SampleService(final SampleJpaEntityRepository sampleJpaEntityRepository) {
+    super();
+    this.sampleJpaEntityRepository = sampleJpaEntityRepository;
+  }
+
+  public List<Sample> findAllEntities() {
+    return SampleMapper.map(this.sampleJpaEntityRepository.findAll());
+  }
+
+  public Optional<Sample> findByIdentifier(final String identifier) {
+    return this.sampleJpaEntityRepository.findByIdentifier(identifier).map(SampleMapper::map);
+  }
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/AccountingEventListener.java b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/AccountingEventListener.java
new file mode 100644
index 0000000..a061b1a
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/AccountingEventListener.java
@@ -0,0 +1,130 @@
+ /*
+         * Licensed to the Apache Software Foundation (ASF) under one
+         * or more contributor license agreements.  See the NOTICE file
+         * distributed with this work for additional information
+         * regarding copyright ownership.  The ASF licenses this file
+         * to you under the Apache License, Version 2.0 (the
+         * "License"); you may not use this file except in compliance
+         * with the License.  You may obtain a copy of the License at
+         *
+         *   http://www.apache.org/licenses/LICENSE-2.0
+         *
+         * Unless required by applicable law or agreed to in writing,
+         * software distributed under the License is distributed on an
+         * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+         * KIND, either express or implied.  See the License for the
+         * specific language governing permissions and limitations
+         * under the License.
+         */
+
+        package org.apache.fineract.cn.notification.service.listener;
+
+        import org.apache.fineract.cn.lang.config.TenantHeaderFilter;
+        import org.apache.fineract.cn.accounting.service.internal.service.AccountService;
+        import org.apache.fineract.cn.notification.service.internal.service.EmailSender;
+        import org.apache.fineract.cn.notification.service.internal.service.SMSSender;
+        import org.springframework.beans.factory.annotation.Autowired;
+        import org.springframework.jms.annotation.JmsListener;
+        import org.springframework.messaging.handler.annotation.Header;
+        import org.springframework.stereotype.Component;
+        import org.apache.fineract.cn.accounting.api.v1.EventConstants;
+
+
+@SuppressWarnings("unused")
+@Component
+public class AccountingEventListener {
+
+    AccountService accountService;
+
+    @Autowired
+    SMSSender smsSender;
+
+    @Autowired
+    EmailSender emailSender;
+
+    @Autowired
+    public AccountingEventListener( final AccountService accountingManager) {
+        this.accountService = accountingManager;
+    }
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_POST_ACCOUNT,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onCreateAccount(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant, final String payload) {
+        accountService.findAccount(tenant);
+        String receiver = "";
+        String template = "";
+        smsSender.sendSMS(receiver,template);
+        emailSender.sendEmail(receiver,"Hello", "You account has been created");
+    }
+
+     /*
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_PUT_ACCOUNT,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onChangeAccount(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                final String payload) {
+        this.logger.debug("Account modified.");
+        this.eventRecorder.event(tenant, EventConstants.PUT_ACCOUNT, payload, String.class);
+    }
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_CLOSE_ACCOUNT,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onCloseAccount(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                               final String payload) {
+        this.logger.debug("Account closed.");
+        this.eventRecorder.event(tenant, EventConstants.CLOSE_ACCOUNT, payload, String.class);
+    }
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_LOCK_ACCOUNT,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onLockAccount(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                              final String payload) {
+        this.logger.debug("Account locked.");
+        this.eventRecorder.event(tenant, EventConstants.LOCK_ACCOUNT, payload, String.class);
+    }
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_UNLOCK_ACCOUNT,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onUnlockAccount(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                final String payload) {
+        this.logger.debug("Account unlocked.");
+        this.eventRecorder.event(tenant, EventConstants.UNLOCK_ACCOUNT, payload, String.class);
+    }
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_REOPEN_ACCOUNT,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onReopenAccount(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                final String payload) {
+        this.logger.debug("Account reopened.");
+        this.eventRecorder.event(tenant, EventConstants.REOPEN_ACCOUNT, payload, String.class);
+    }
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_DELETE_ACCOUNT,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onDeleteAccount(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                final String payload) {
+        this.logger.debug("Account deleted.");
+        this.eventRecorder.event(tenant, EventConstants.DELETE_ACCOUNT, payload, String.class);
+    }
+ */
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/ChequeEventListener.java b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/ChequeEventListener.java
new file mode 100644
index 0000000..2c6c2cf
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/ChequeEventListener.java
@@ -0,0 +1,84 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.fineract.cn.notification.service.listener;
+
+import org.apache.fineract.cn.cheque.AbstractChequeTest;
+import org.apache.fineract.cn.cheque.api.v1.EventConstants;
+import org.apache.fineract.cn.lang.config.TenantHeaderFilter;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.jms.annotation.JmsListener;
+import org.springframework.messaging.handler.annotation.Header;
+import org.springframework.stereotype.Component;
+
+@Component
+public class ChequeEventListener {
+
+    private final Logger logger;
+
+    public ChequeEventListener(@Qualifier(AbstractChequeTest.TEST_LOGGER) final Logger logger) {
+        super();
+        this.logger = logger;
+    }
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_ISSUE_CHEQUES,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onIssueCheques(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                               final String payload) {
+        this.logger.debug("Cheques issued.");
+    }
+/*
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_CHEQUE_TRANSACTION,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onChequeTransaction(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                    final String payload) {
+        this.logger.debug("Cheque transaction processed.");
+        this.eventRecorder.event(tenant, EventConstants.CHEQUE_TRANSACTION, payload, String.class);
+    }
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_CHEQUE_TRANSACTION_APPROVED,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onChequeApproved(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                 final String payload) {
+        this.logger.debug("Cheque transaction approved.");
+        this.eventRecorder.event(tenant, EventConstants.CHEQUE_TRANSACTION_APPROVED, payload, String.class);
+    }
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_CHEQUE_TRANSACTION_CANCELED,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onChequeCanceled(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                 final String payload) {
+        this.logger.debug("Cheque transaction canceled.");
+        this.eventRecorder.event(tenant, EventConstants.CHEQUE_TRANSACTION_CANCELED, payload, String.class);
+    }
+*/
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/CustomerEventListener.java b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/CustomerEventListener.java
new file mode 100644
index 0000000..a28d83a
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/CustomerEventListener.java
@@ -0,0 +1,201 @@
+    /*
+     * Licensed to the Apache Software Foundation (ASF) under one
+     * or more contributor license agreements.  See the NOTICE file
+     * distributed with this work for additional information
+     * regarding copyright ownership.  The ASF licenses this file
+     * to you under the Apache License, Version 2.0 (the
+     * "License"); you may not use this file except in compliance
+     * with the License.  You may obtain a copy of the License at
+     *
+     *   http://www.apache.org/licenses/LICENSE-2.0
+     *
+     * Unless required by applicable law or agreed to in writing,
+     * software distributed under the License is distributed on an
+     * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+     * KIND, either express or implied.  See the License for the
+     * specific language governing permissions and limitations
+     * under the License.
+     */
+
+package org.apache.fineract.cn.notification.service.listener;
+
+import org.apache.fineract.cn.customer.api.v1.CustomerEventConstants;
+import org.apache.fineract.cn.lang.config.TenantHeaderFilter;
+import org.apache.fineract.cn.customer.api.v1.client.CustomerManager;
+import org.apache.fineract.cn.customer.api.v1.domain.ContactDetail;
+import org.apache.fineract.cn.customer.api.v1.domain.Customer;
+import org.apache.fineract.cn.notification.api.v1.events.NotificationEventConstants;
+import org.apache.fineract.cn.notification.service.internal.service.EmailSender;
+import org.apache.fineract.cn.notification.service.internal.service.SMSSender;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jms.annotation.JmsListener;
+import org.springframework.messaging.handler.annotation.Header;
+import org.springframework.stereotype.Component;
+
+
+@Component
+public class CustomerEventListener {
+
+        private CustomerManager customerManager;
+        private SMSSender smsSender;
+        private EmailSender emailSender;
+
+        @Autowired
+        public CustomerEventListener( final CustomerManager customerManager, SMSSender smsSender,
+                                 final EmailSender emailSender ) {
+            this.customerManager = customerManager;
+            this.smsSender = smsSender;
+            this.emailSender = emailSender;
+        }
+
+        @JmsListener(
+                destination = CustomerEventConstants.DESTINATION,
+                selector = CustomerEventConstants.SELECTOR_POST_CUSTOMER
+        )
+        public void customerCreatedEvent(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                         final String payload) {
+
+            Customer customer = customerManager.findCustomer(payload);
+            if (customer.getContactDetails().size() > 0) {
+                customer.getContactDetails().forEach(contactDetail -> {
+                    if (contactDetail.getType().equals(ContactDetail.Type.PHONE)) {
+                        String receiverNumber = customer.getContactDetails().get(0).getValue();
+                        // TODO: pass receiver number for templating and localization.
+                        smsSender.sendSMS(receiverNumber, "Dear Valued Customer, Your account has been created");
+                    } else if (contactDetail.getType().equals(ContactDetail.Type.EMAIL)) {
+                        String emailAddress = customer.getContactDetails().get(0).getValue();
+                        // TODO: pass email address for templating and localization.
+                        emailSender.sendEmail(emailAddress, "Account created", "Dear Valued Customer, Your account has been created");
+                    }
+                });
+            }
+        }
+
+    @JmsListener(
+            destination = CustomerEventConstants.DESTINATION,
+            selector = CustomerEventConstants.SELECTOR_ACTIVATE_CUSTOMER
+    )
+    public void customerActivatedEvent(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                       final String payload) {
+        Customer customer = customerManager.findCustomer(payload);
+        if(customer.getCurrentState().equalsIgnoreCase("ACTIVE")){
+            customer.getContactDetails().forEach(contact-> {
+                if (contact.getType().equals(ContactDetail.Type.PHONE)) {
+                String receiverNumber = customer.getContactDetails().get(0).getValue();
+                smsSender.sendSMS(receiverNumber, "Dear Valued Customer, Your account has been Activated");
+            } else if (contact.getType().equals(ContactDetail.Type.EMAIL)) {
+                String emailAddress = customer.getContactDetails().get(0).getValue();
+                // TODO: pass email address for templating and localization.
+                emailSender.sendEmail(emailAddress, "Account created", "Dear Valued Customer, Your account has been Activated");
+            }
+            });
+        }
+    }
+
+    @JmsListener(
+            destination = CustomerEventConstants.DESTINATION,
+            selector = CustomerEventConstants.SELECTOR_LOCK_CUSTOMER
+    )
+    public void customerLockedEvent(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                    final String payload) {
+        Customer customer = customerManager.findCustomer(payload);
+        if(customer.getCurrentState().equalsIgnoreCase("LOCKED")){
+            customer.getContactDetails().forEach(contact-> {
+                if (contact.getType().equals(ContactDetail.Type.PHONE)) {
+                    String receiverNumber = customer.getContactDetails().get(0).getValue();
+                    smsSender.sendSMS(receiverNumber, "Dear Valued Customer, Your account has been Locked");
+                } else if (contact.getType().equals(ContactDetail.Type.EMAIL)) {
+                    String emailAddress = customer.getContactDetails().get(0).getValue();
+                    // TODO: pass email address for templating and localization.
+                    emailSender.sendEmail(emailAddress, "Account created", "Dear Valued Customer, Your account has been Locked");
+                }
+            });
+        }
+    }
+
+    @JmsListener(
+            destination = CustomerEventConstants.DESTINATION,
+            selector = CustomerEventConstants.SELECTOR_UNLOCK_CUSTOMER
+    )
+    public void customerUnlockedEvent(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                      final String payload) {
+        Customer customer = customerManager.findCustomer(payload);
+        if(customer.getCurrentState().equalsIgnoreCase("LOCKED")){
+            customer.getContactDetails().forEach(contact-> {
+                if (contact.getType().equals(ContactDetail.Type.PHONE)) {
+                    String receiverNumber = customer.getContactDetails().get(0).getValue();
+                    smsSender.sendSMS(receiverNumber, "Dear Valued Customer, Your account has been Unlocked");
+                } else if (contact.getType().equals(ContactDetail.Type.EMAIL)) {
+                    String emailAddress = customer.getContactDetails().get(0).getValue();
+                    // TODO: pass email address for templating and localization.
+                    emailSender.sendEmail(emailAddress, "Account created", "Dear Valued Customer, Your account has been Unlocked");
+                }
+            });
+        }
+    }
+
+    @JmsListener(
+            destination = CustomerEventConstants.DESTINATION,
+            selector = CustomerEventConstants.SELECTOR_CLOSE_CUSTOMER
+    )
+    public void customerClosedEvent(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                    final String payload) {
+        Customer customer = customerManager.findCustomer(payload);
+        if(customer.getCurrentState().equalsIgnoreCase("CLOSED")){
+            customer.getContactDetails().forEach(contact-> {
+                if (contact.getType().equals(ContactDetail.Type.PHONE)) {
+                    String receiverNumber = customer.getContactDetails().get(0).getValue();
+                    smsSender.sendSMS(receiverNumber, "Dear Valued Customer, Your account has been Closed");
+                } else if (contact.getType().equals(ContactDetail.Type.EMAIL)) {
+                    String emailAddress = customer.getContactDetails().get(0).getValue();
+                    // TODO: pass email address for templating and localization.
+                    emailSender.sendEmail(emailAddress, "Account created", "Dear Valued Customer, Your account has been Closed");
+                }
+            });
+        }
+    }
+
+    @JmsListener(
+            destination = CustomerEventConstants.DESTINATION,
+            selector = CustomerEventConstants.SELECTOR_REOPEN_CUSTOMER
+    )
+    public void customerReopenedEvent(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                      final String payload) {
+        Customer customer = customerManager.findCustomer(payload);
+        if(customer.getCurrentState().equalsIgnoreCase("LOCKED")){
+            customer.getContactDetails().forEach(contact-> {
+                if (contact.getType().equals(ContactDetail.Type.PHONE)) {
+                    String receiverNumber = customer.getContactDetails().get(0).getValue();
+                    smsSender.sendSMS(receiverNumber, "Dear Valued Customer, Your account has been reopened");
+                } else if (contact.getType().equals(ContactDetail.Type.EMAIL)) {
+                    String emailAddress = customer.getContactDetails().get(0).getValue();
+                    // TODO: pass email address for templating and localization.
+                    emailSender.sendEmail(emailAddress, "Account Reopened", "Dear Valued Customer, Your account has been reopened");
+                }
+            });
+        }
+    }
+    
+/*
+
+    @JmsListener(
+            destination = CustomerEventConstants.DESTINATION,
+            selector = CustomerEventConstants.SELECTOR_PUT_ADDRESS
+    )
+    public void addressChangedEvent(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                    final String payload) {
+        this.eventRecorder.event(tenant, CustomerEventConstants.PUT_ADDRESS, payload, String.class);
+    }
+
+    @JmsListener(
+            destination = CustomerEventConstants.DESTINATION,
+            selector = CustomerEventConstants.SELECTOR_PUT_IDENTIFICATION_CARD
+    )
+    public void identificationCardChangedEvent(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                               final String payload) {
+        this.eventRecorder.event(tenant, CustomerEventConstants.PUT_IDENTIFICATION_CARD, payload, String.class);
+    }
+
+
+*/
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/DepositEventListener.java b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/DepositEventListener.java
new file mode 100644
index 0000000..bcde220
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/DepositEventListener.java
@@ -0,0 +1,60 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.fineract.cn.deposit.listener;
+
+import org.apache.fineract.cn.deposit.api.v1.EventConstants;
+import org.apache.fineract.cn.lang.config.TenantHeaderFilter;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.jms.annotation.JmsListener;
+import org.springframework.messaging.handler.annotation.Header;
+import org.springframework.stereotype.Component;
+
+@Component
+public class DepositEventListener {
+
+
+    @Autowired
+    public DepositEventListener() {
+        super();
+    }
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_INTEREST_ACCRUED,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onAccrual(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                          final String payload) {
+    }
+/*
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_DIVIDEND_DISTRIBUTION,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onDividendDistribution(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                       final String payload) {
+        this.logger.debug("Dividend distributed for product {}.", payload);
+        this.eventRecorder.event(tenant, EventConstants.DIVIDEND_DISTRIBUTION, payload, String.class);
+    }
+*/
+}
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/IdentityEventListener.java b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/IdentityEventListener.java
new file mode 100644
index 0000000..142f138
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/IdentityEventListener.java
@@ -0,0 +1,87 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+package org.apache.fineract.cn.notification.service.listener;
+
+import org.apache.fineract.cn.identity.api.v1.events.EventConstants;
+import org.apache.fineract.cn.lang.config.TenantHeaderFilter;
+import org.apache.fineract.cn.test.listener.EventRecorder;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jms.annotation.JmsListener;
+import org.springframework.messaging.handler.annotation.Header;
+import org.springframework.stereotype.Component;
+
+@Component
+public class IdentityEventListener {
+
+    private IdentityManager identityManager;
+
+    @Autowired
+    public IdentityEventListener( final IdentityManager identityManager) {
+        this.identityManager = identityManager;
+    }
+
+
+    @JmsListener(
+            subscription = EventConstants.DESTINATION,
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_POST_USER
+    )
+    public void onCreateUser(
+            @Header(TenantHeaderFilter.TENANT_HEADER)final String tenant,
+            final String payload) throws Exception {
+        eventRecorder.event(tenant, EventConstants.OPERATION_POST_USER, payload, String.class);
+    }
+
+    @JmsListener(
+            subscription = EventConstants.DESTINATION,
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_PUT_USER_ROLEIDENTIFIER
+    )
+    public void onChangeUserRole(
+            @Header(TenantHeaderFilter.TENANT_HEADER)final String tenant,
+            final String payload) throws Exception {
+        eventRecorder.event(tenant, EventConstants.OPERATION_PUT_USER_ROLEIDENTIFIER, payload, String.class);
+    }
+
+    @JmsListener(
+            subscription = EventConstants.DESTINATION,
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_PUT_USER_PASSWORD
+    )
+    public void onChangeUserPassword(
+            @Header(TenantHeaderFilter.TENANT_HEADER)final String tenant,
+            final String payload) throws Exception {
+        eventRecorder.event(tenant, EventConstants.OPERATION_PUT_USER_PASSWORD, payload, String.class);
+    }
+
+    @JmsListener(
+            subscription = EventConstants.DESTINATION,
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_AUTHENTICATE
+    )
+    public void onAuthentication(
+            @Header(TenantHeaderFilter.TENANT_HEADER)final String tenant,
+            final String payload) throws Exception {
+        eventRecorder.event(tenant, EventConstants.OPERATION_AUTHENTICATE, payload, String.class);
+    }
+
+
+}
+*/
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/OfficeEventListener.java b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/OfficeEventListener.java
new file mode 100644
index 0000000..c77510e
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/OfficeEventListener.java
@@ -0,0 +1,120 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+/*
+package org.apache.fineract.cn.notification.service.listener;
+
+import org.apache.fineract.cn.accounting.api.v1.EventConstants;
+import org.apache.fineract.cn.lang.config.TenantHeaderFilter;
+import org.apache.fineract.cn.test.listener.EventRecorder;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jms.annotation.JmsListener;
+import org.springframework.messaging.handler.annotation.Header;
+import org.springframework.stereotype.Component;
+
+@Component
+public class OfficeEventListener {
+
+    private final EventRecorder eventRecorder;
+
+    @Autowired
+    public OfficeEventListener(final EventRecorder eventRecorder) {
+        super();
+        this.eventRecorder = eventRecorder;
+    }
+
+    @JmsListener(
+            subscription = EventConstants.DESTINATION,
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_POST_EMPLOYEE
+    )
+    public void onCreateEmployee(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                 final String eventPayload) throws Exception {
+        this.eventRecorder.event(tenant, EventConstants.OPERATION_POST_EMPLOYEE, eventPayload, String.class);
+    }
+
+    @JmsListener(
+            subscription = EventConstants.DESTINATION,
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_PUT_EMPLOYEE
+    )
+    public void onUpdateEmployee(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                 final String eventPayload) throws Exception {
+        this.eventRecorder.event(tenant, EventConstants.OPERATION_PUT_EMPLOYEE, eventPayload, String.class);
+    }
+
+    @JmsListener(
+            subscription = EventConstants.DESTINATION,
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_DELETE_EMPLOYEE
+    )
+    public void onDeleteEmployee(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                 final String eventPayload) throws Exception {
+        this.eventRecorder.event(tenant, EventConstants.OPERATION_DELETE_EMPLOYEE, eventPayload, String.class);
+    }
+
+    @JmsListener(
+            subscription = EventConstants.DESTINATION,
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_PUT_CONTACT_DETAIL
+    )
+    public void onSetContactDetail(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                   final String eventPayload) throws Exception {
+        this.eventRecorder.event(tenant, EventConstants.OPERATION_PUT_CONTACT_DETAIL, eventPayload, String.class);
+    }
+
+    @JmsListener(
+            subscription = EventConstants.DESTINATION,
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_DELETE_CONTACT_DETAIL
+    )
+    public void onDeleteContactDetail(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                      final String eventPayload) throws Exception {
+        this.eventRecorder.event(tenant, EventConstants.OPERATION_DELETE_CONTACT_DETAIL, eventPayload, String.class);
+    }
+
+    public void onCreateOffice(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                               final String payload)
+            throws Exception {
+        this.eventRecorder.event(tenant, EventConstants.OPERATION_POST_OFFICE, payload, String.class);
+    }
+
+    @JmsListener(
+            subscription = EventConstants.DESTINATION,
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_DELETE_OFFICE
+    )
+    public void onDeleteOffice(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                               final String payload)
+            throws Exception {
+        this.eventRecorder.event(tenant, EventConstants.OPERATION_DELETE_OFFICE, payload, String.class);
+    }
+
+    @JmsListener(
+            subscription = EventConstants.DESTINATION,
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_PUT_OFFICE
+    )
+    public void onUpdateOffice(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                               final String payload)
+            throws Exception {
+        this.eventRecorder.event(tenant, EventConstants.OPERATION_PUT_OFFICE, payload, String.class);
+    }
+
+}
+*/
\ No newline at end of file
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/PayrollEventListener.java b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/PayrollEventListener.java
new file mode 100644
index 0000000..ce4cc70
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/PayrollEventListener.java
@@ -0,0 +1,61 @@
+
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+    /*
+package org.apache.fineract.cn.payroll.listener;
+
+import org.apache.fineract.cn.payroll.api.v1.EventConstants;
+import org.apache.fineract.cn.payroll.service.ServiceConstants;
+import org.apache.fineract.cn.lang.config.TenantHeaderFilter;
+import org.apache.fineract.cn.test.listener.EventRecorder;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.jms.annotation.JmsListener;
+import org.springframework.messaging.handler.annotation.Header;
+import org.springframework.stereotype.Component;
+
+@Component
+public class PayrollEventListener {
+
+    private final Logger logger;
+    private final EventRecorder eventRecorder;
+
+    @Autowired
+    public PayrollEventListener(@Qualifier(ServiceConstants.LOGGER_NAME) final Logger logger,
+                                       final EventRecorder eventRecorder) {
+        super();
+        this.logger = logger;
+        this.eventRecorder = eventRecorder;
+    }
+
+
+    @JmsListener(
+            subscription = EventConstants.DESTINATION,
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_POST_DISTRIBUTION
+    )
+    public void onPostCollection(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                 final String payload) {
+        this.logger.info("Payment distribution with source account {0} processed.", payload);
+        this.eventRecorder.event(tenant, EventConstants.POST_DISTRIBUTION, payload, String.class);
+    }
+
+}
+*/
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/PortfolioEventListener.java b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/PortfolioEventListener.java
new file mode 100644
index 0000000..88109a7
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/PortfolioEventListener.java
@@ -0,0 +1,151 @@
+package org.apache.fineract.cn.notification.service.listener;/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+import org.apache.fineract.cn.individuallending.api.v1.events.IndividualLoanCommandEvent;
+import org.apache.fineract.cn.individuallending.api.v1.events.IndividualLoanEventConstants;
+import org.apache.fineract.cn.lang.config.TenantHeaderFilter;
+import org.apache.fineract.cn.reporting.api.v1.domain.Header;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.jms.annotation.JmsListener;
+import org.springframework.stereotype.Component;
+import org.apache.fineract.cn.group.api.v1.EventConstants;
+import org.apache.fineract.cn.portfolio.api.v1.client.PortfolioManager;
+
+@SuppressWarnings("unused")
+@Component
+public class PortfolioEventListener {
+
+    @Autowired
+    public PortfolioEventListener() {
+        super();
+        //PortfolioManager portfolioManager = new PortfolioManager();
+    }
+
+    @JmsListener(
+            subscription = IndividualLoanEventConstants.DESTINATION,
+            destination = IndividualLoanEventConstants.DESTINATION,
+            selector = IndividualLoanEventConstants.SELECTOR_DENY_INDIVIDUALLOAN_CASE
+    )
+    public void onDeny(//@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                       final String payload) {
+
+    }
+
+    @JmsListener(
+            subscription = IndividualLoanEventConstants.DESTINATION,
+            destination = IndividualLoanEventConstants.DESTINATION,
+            selector = IndividualLoanEventConstants.SELECTOR_APPROVE_INDIVIDUALLOAN_CASE
+    )
+    public void onApprove(//@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                          final String payload) {
+
+    }
+
+    @JmsListener(
+            subscription = IndividualLoanEventConstants.DESTINATION,
+            destination = IndividualLoanEventConstants.DESTINATION,
+            selector = IndividualLoanEventConstants.SELECTOR_ACCEPT_PAYMENT_INDIVIDUALLOAN_CASE
+    )
+    public void onAcceptPayment(//@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                final String payload) {
+    }
+
+
+    @JmsListener(
+            subscription = IndividualLoanEventConstants.DESTINATION,
+            destination = IndividualLoanEventConstants.DESTINATION,
+            selector = IndividualLoanEventConstants.SELECTOR_DISBURSE_INDIVIDUALLOAN_CASE
+    )
+    public void onDisburse(//@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                           final String payload) {
+
+    }
+
+    @JmsListener(
+            subscription = IndividualLoanEventConstants.DESTINATION,
+            destination = IndividualLoanEventConstants.DESTINATION,
+            selector = IndividualLoanEventConstants.SELECTOR_CHECK_LATE_INDIVIDUALLOAN_CASE
+    )
+    public void onCheckLate(//@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                            final String payload) {
+
+    }
+
+    @JmsListener(
+            subscription = IndividualLoanEventConstants.DESTINATION,
+            destination = IndividualLoanEventConstants.DESTINATION,
+            selector = IndividualLoanEventConstants.SELECTOR_OPEN_INDIVIDUALLOAN_CASE
+    )
+    public void onOpen(//@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                       final String payload) {
+
+    }
+
+    @JmsListener(
+            subscription = IndividualLoanEventConstants.DESTINATION,
+            destination = IndividualLoanEventConstants.DESTINATION,
+            selector = IndividualLoanEventConstants.SELECTOR_MARK_LATE_INDIVIDUALLOAN_CASE
+    )
+    public void onMarkLate(//@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                           final String payload) {
+
+    }
+
+    @JmsListener(
+            subscription = IndividualLoanEventConstants.DESTINATION,
+            destination = IndividualLoanEventConstants.DESTINATION,
+            selector = IndividualLoanEventConstants.SELECTOR_CLOSE_INDIVIDUALLOAN_CASE
+    )
+    public void onClose(//@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                        final String payload) {
+    }
+
+    /*
+
+        @JmsListener(
+                subscription = EventConstants.DESTINATION,
+                destination = EventConstants.DESTINATION,
+                selector = EventConstants.SELECTOR_POST_GROUP
+        )
+        public void onGroupCreated(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                   final String payload) {
+            this.eventRecorder.event(tenant, EventConstants.POST_GROUP, payload, String.class);
+        }
+
+        @JmsListener(
+                subscription = EventConstants.DESTINATION,
+                destination = EventConstants.DESTINATION,
+                selector = EventConstants.SELECTOR_ACTIVATE_GROUP
+        )
+        public void onGroupActivated(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                     final String payload) {
+            this.eventRecorder.event(tenant, EventConstants.ACTIVATE_GROUP, payload, String.class);
+        }
+
+        @JmsListener(
+                subscription = EventConstants.DESTINATION,
+                destination = EventConstants.DESTINATION,
+                selector = EventConstants.SELECTOR_PUT_GROUP
+        )
+        public void onGroupUpdated(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                   final String payload) {
+            this.eventRecorder.event(tenant, EventConstants.PUT_GROUP, payload, String.class);
+        }
+         */
+    }
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/listener/TellerEventListener.java b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/TellerEventListener.java
new file mode 100644
index 0000000..5b461be
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/listener/TellerEventListener.java
@@ -0,0 +1,146 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+    /*
+package org.apache.fineract.cn.teller.listener;
+
+import org.apache.fineract.cn.teller.AbstractTellerTest;
+import org.apache.fineract.cn.teller.api.v1.EventConstants;
+import org.apache.fineract.cn.lang.config.TenantHeaderFilter;
+import org.apache.fineract.cn.test.listener.EventRecorder;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.jms.annotation.JmsListener;
+import org.springframework.messaging.handler.annotation.Header;
+import org.springframework.stereotype.Component;
+
+@Component
+public class TellerEventListener {
+
+    private final Logger logger;
+    private final EventRecorder eventRecorder;
+
+    public TellerEventListener(@Qualifier(AbstractTellerTest.LOGGER_NAME) final Logger logger,
+                               final EventRecorder eventRecorder) {
+        super();
+        this.logger = logger;
+        this.eventRecorder = eventRecorder;
+    }
+
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_POST_TELLER,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onCreate(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                         final String payload) {
+        this.logger.debug("Teller {} created.", payload);
+        this.eventRecorder.event(tenant, EventConstants.POST_TELLER, payload, String.class);
+    }
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_PUT_TELLER,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onChange(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                         final String payload) {
+        this.logger.debug("Teller {} created.", payload);
+        this.eventRecorder.event(tenant, EventConstants.PUT_TELLER, payload, String.class);
+    }
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_OPEN_TELLER,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onOpen(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                       final String payload) {
+        this.logger.debug("Teller {} created.", payload);
+        this.eventRecorder.event(tenant, EventConstants.OPEN_TELLER, payload, String.class);
+    }
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_CLOSE_TELLER,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onClose(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                        final String payload) {
+        this.logger.debug("Teller {} created.", payload);
+        this.eventRecorder.event(tenant, EventConstants.CLOSE_TELLER, payload, String.class);
+    }
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_AUTHENTICATE_TELLER,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onAuthenticate(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                               final String payload) {
+        this.logger.debug("Teller {} created.", payload);
+        this.eventRecorder.event(tenant, EventConstants.AUTHENTICATE_TELLER, payload, String.class);
+    }
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_PAUSE_TELLER,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onPause(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                        final String payload) {
+        this.logger.debug("Teller {} created.", payload);
+        this.eventRecorder.event(tenant, EventConstants.PAUSE_TELLER, payload, String.class);
+    }
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_CONFIRM_TRANSACTION,
+            subscription = EventConstants.DESTINATION
+    )
+    public void confirmTransaction(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                   final String payload) {
+        this.logger.debug("Teller {} created.", payload);
+        this.eventRecorder.event(tenant, EventConstants.CONFIRM_TRANSACTION, payload, String.class);
+    }
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_DELETE_TELLER,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onDeleteTeller(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                               final String payload) {
+        this.logger.debug("Teller {} created.", payload);
+        this.eventRecorder.event(tenant, EventConstants.DELETE_TELLER, payload, String.class);
+    }
+
+    @JmsListener(
+            destination = EventConstants.DESTINATION,
+            selector = EventConstants.SELECTOR_SAVE_DENOMINATION,
+            subscription = EventConstants.DESTINATION
+    )
+    public void onSaveDenomination(@Header(TenantHeaderFilter.TENANT_HEADER) final String tenant,
+                                   final String payload) {
+        this.logger.debug("Teller {} created.", payload);
+        this.eventRecorder.event(tenant, EventConstants.SAVE_DENOMINATION, payload, String.class);
+    }
+
+}
+*/
diff --git a/service/src/main/java/org/apache/fineract/cn/notification/service/rest/NotificationRestController.java b/service/src/main/java/org/apache/fineract/cn/notification/service/rest/NotificationRestController.java
new file mode 100644
index 0000000..983b43e
--- /dev/null
+++ b/service/src/main/java/org/apache/fineract/cn/notification/service/rest/NotificationRestController.java
@@ -0,0 +1,119 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.fineract.cn.notification.service.rest;
+
+import org.apache.fineract.cn.notification.api.v1.PermittableGroupIds;
+import org.apache.fineract.cn.notification.api.v1.domain.Sample;
+import org.apache.fineract.cn.notification.service.ServiceConstants;
+import org.apache.fineract.cn.notification.service.internal.command.InitializeServiceCommand;
+import org.apache.fineract.cn.notification.service.internal.command.SampleCommand;
+import org.apache.fineract.cn.notification.service.internal.service.SampleService;
+import java.util.List;
+import javax.validation.Valid;
+import org.apache.fineract.cn.anubis.annotation.AcceptedTokenType;
+import org.apache.fineract.cn.anubis.annotation.Permittable;
+import org.apache.fineract.cn.command.gateway.CommandGateway;
+import org.apache.fineract.cn.lang.ServiceException;
+import org.slf4j.Logger;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.http.MediaType;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.ResponseBody;
+import org.springframework.web.bind.annotation.RestController;
+
+@SuppressWarnings("unused")
+@RestController
+@RequestMapping("/")
+public class NotificationRestController {
+
+  private final Logger logger;
+  private final CommandGateway commandGateway;
+  private final SampleService sampleService;
+
+  @Autowired
+  public NotificationRestController(@Qualifier(ServiceConstants.LOGGER_NAME) final Logger logger,
+                              final CommandGateway commandGateway,
+                              final SampleService sampleService) {
+    super();
+    this.logger = logger;
+    this.commandGateway = commandGateway;
+    this.sampleService = sampleService;
+  }
+
+  @Permittable(value = AcceptedTokenType.SYSTEM)
+  @RequestMapping(
+      value = "/initialize",
+      method = RequestMethod.POST,
+      consumes = MediaType.ALL_VALUE,
+      produces = MediaType.APPLICATION_JSON_VALUE
+  )
+  public
+  @ResponseBody
+  ResponseEntity<Void> initialize() throws InterruptedException {
+      this.commandGateway.process(new InitializeServiceCommand());
+      return ResponseEntity.accepted().build();
+  }
+
+  @Permittable(value = AcceptedTokenType.TENANT, groupId = PermittableGroupIds.SAMPLE_MANAGEMENT)
+  @RequestMapping(
+          value = "/sample",
+          method = RequestMethod.GET,
+          consumes = MediaType.ALL_VALUE,
+          produces = MediaType.APPLICATION_JSON_VALUE
+  )
+  public
+  @ResponseBody
+  List<Sample> findAllEntities() {
+    return this.sampleService.findAllEntities();
+  }
+
+  @Permittable(value = AcceptedTokenType.TENANT, groupId = PermittableGroupIds.SAMPLE_MANAGEMENT)
+  @RequestMapping(
+          value = "/sample/{identifier}",
+          method = RequestMethod.GET,
+          consumes = MediaType.ALL_VALUE,
+          produces = MediaType.APPLICATION_JSON_VALUE
+  )
+  public
+  @ResponseBody
+  ResponseEntity<Sample> getEntity(@PathVariable("identifier") final String identifier) {
+    return this.sampleService.findByIdentifier(identifier)
+            .map(ResponseEntity::ok)
+            .orElseThrow(() -> ServiceException.notFound("Instance with identifier " + identifier + " doesn't exist."));
+  }
+
+  @Permittable(value = AcceptedTokenType.TENANT, groupId = PermittableGroupIds.SAMPLE_MANAGEMENT)
+  @RequestMapping(
+      value = "/sample",
+      method = RequestMethod.POST,
+      consumes = MediaType.APPLICATION_JSON_VALUE,
+      produces = MediaType.APPLICATION_JSON_VALUE
+  )
+  public
+  @ResponseBody
+  ResponseEntity<Void> createEntity(@RequestBody @Valid final Sample instance) throws InterruptedException {
+    this.commandGateway.process(new SampleCommand(instance));
+    return ResponseEntity.accepted().build();
+  }
+}
diff --git a/service/src/main/resources/application.yml b/service/src/main/resources/application.yml
new file mode 100644
index 0000000..37acaaf
--- /dev/null
+++ b/service/src/main/resources/application.yml
@@ -0,0 +1,78 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+spring:
+  cloud:
+    discovery:
+      enabled: false
+    config:
+      enabled: false
+
+eureka:
+  client:
+    serviceUrl:
+      defaultZone: http://localhost:8761/eureka/
+
+server:
+  port: 8081
+  contextPath: /notification/v1/*
+
+cassandra:
+  clusterName: staging_cluster
+  contactPoints: 127.0.0.1:9042,127.0.0.2:9042,127.0.0.3:9042
+  keyspace: seshat
+  cl:
+    read: LOCAL_QUORUM
+    write: LOCAL_QUORUM
+    delete: LOCAL_QUORUM
+
+mariadb:
+  driverClass: org.mariadb.jdbc.Driver
+  database: seshat
+  host: localhost
+  port: 3306
+  user: root
+  password: mysql
+
+bonecp:
+  idleMaxAgeInMinutes: 240
+  idleConnectionTestPeriodInMinutes: 60
+  maxConnectionsPerPartition: 10
+  minConnectionsPerPartition: 1
+  partitionCount: 2
+  acquireIncrement: 5
+  statementsCacheSize: 100
+
+async:
+  corePoolSize: 32
+  maxPoolSize: 16384
+  queueCapacity: 0
+  threadName: async-processor-
+
+flyway:
+  enabled: false
+
+fineract:
+  customer:
+    accountcreated:
+      message: Dear Valued Customer, Your account has been created.
+    accountclosed:
+      message: Dear Valued Customer, Your account has been successfully closed.
+
+
diff --git a/service/src/main/resources/bootstrap.yml b/service/src/main/resources/bootstrap.yml
new file mode 100644
index 0000000..76c2441
--- /dev/null
+++ b/service/src/main/resources/bootstrap.yml
@@ -0,0 +1,22 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+spring:
+    application:
+        name: notification-v1
diff --git a/service/src/main/resources/db/migrations/mariadb/V1__initial_setup.sql b/service/src/main/resources/db/migrations/mariadb/V1__initial_setup.sql
new file mode 100644
index 0000000..b68edad
--- /dev/null
+++ b/service/src/main/resources/db/migrations/mariadb/V1__initial_setup.sql
@@ -0,0 +1,32 @@
+--
+-- Licensed to the Apache Software Foundation (ASF) under one
+-- or more contributor license agreements.  See the NOTICE file
+-- distributed with this work for additional information
+-- regarding copyright ownership.  The ASF licenses this file
+-- to you under the Apache License, Version 2.0 (the
+-- "License"); you may not use this file except in compliance
+-- with the License.  You may obtain a copy of the License at
+--
+--   http://www.apache.org/licenses/LICENSE-2.0
+--
+-- Unless required by applicable law or agreed to in writing,
+-- software distributed under the License is distributed on an
+-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+-- KIND, either express or implied.  See the License for the
+-- specific language governing permissions and limitations
+-- under the License.
+--
+
+CREATE TABLE notification (
+  id BIGINT NOT NULL AUTO_INCREMENT,
+  identifier VARCHAR(8) NOT NULL,
+  payload VARCHAR(512) NULL,
+  CONSTRAINT notification_pk PRIMARY KEY (id)
+);
+
+CREATE TABLE template_sample (
+  id BIGINT NOT NULL AUTO_INCREMENT,
+  identifier VARCHAR(8) NOT NULL,
+  payload VARCHAR(512) NULL,
+  CONSTRAINT template_sample_pk PRIMARY KEY (id)
+);
diff --git a/settings.gradle b/settings.gradle
new file mode 100644
index 0000000..868411f
--- /dev/null
+++ b/settings.gradle
@@ -0,0 +1,23 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+rootProject.name = 'notification'
+
+includeBuild 'api'
+includeBuild 'service'
+includeBuild 'component-test'
+
diff --git a/shared.gradle b/shared.gradle
new file mode 100644
index 0000000..a01bb15
--- /dev/null
+++ b/shared.gradle
@@ -0,0 +1,111 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+group 'org.apache.fineract.cn.notification'
+version '0.1.0.BUILD-SNAPSHOT'
+
+ext.versions = [
+        fineractcnidentity      : '0.1.0-BUILD-SNAPSHOT',
+        fineractcnprovisioner   : '0.1.0-BUILD-SNAPSHOT',
+        fineractcnrhythm        : '0.1.0-BUILD-SNAPSHOT',
+        fineractcnoffice        : '0.1.0-BUILD-SNAPSHOT',
+        fineractcncustomer      : '0.1.0-BUILD-SNAPSHOT',
+        fineractcnaccounting    : '0.1.0-BUILD-SNAPSHOT',
+        fineractcnportfolio     : '0.1.0-BUILD-SNAPSHOT',
+        fineractcndeposit       : '0.1.0-BUILD-SNAPSHOT',
+        fineractcnteller        : '0.1.0-BUILD-SNAPSHOT',
+        kuelapcheques           : '0.1.0-BUILD-SNAPSHOT',
+        fineractcnpayroll       : '0.1.0-BUILD-SNAPSHOT',
+        fineractcngroup         : '0.1.0-BUILD-SNAPSHOT',
+        frameworkapi            : '0.1.0-BUILD-SNAPSHOT',
+        frameworklang           : '0.1.0-BUILD-SNAPSHOT',
+        frameworkasync          : '0.1.0-BUILD-SNAPSHOT',
+        frameworkcassandra      : '0.1.0-BUILD-SNAPSHOT',
+        frameworkmariadb        : '0.1.0-BUILD-SNAPSHOT',
+        frameworkcommand        : '0.1.0-BUILD-SNAPSHOT',
+        frameworktest           : '0.1.0-BUILD-SNAPSHOT',
+        frameworkanubis         : '0.1.0-BUILD-SNAPSHOT',
+        validator : '5.3.0.Final'
+]
+
+apply plugin: 'java'
+apply plugin: 'idea'
+apply plugin: 'maven-publish'
+apply plugin: 'io.spring.dependency-management'
+
+tasks.withType(JavaCompile) {
+    sourceCompatibility = JavaVersion.VERSION_1_8
+    targetCompatibility = JavaVersion.VERSION_1_8
+}
+
+repositories {
+    jcenter()
+    mavenLocal()
+}
+
+dependencyManagement {
+    imports {
+        mavenBom 'io.spring.platform:platform-bom:Athens-RELEASE'
+        mavenBom 'org.springframework.cloud:spring-cloud-dependencies:Camden.SR1'
+    }
+}
+
+// override certain dependency provided by Spring platform using newer releases
+ext['cassandra.version'] = '3.6'
+ext['cassandra-driver.version'] = '3.1.2'
+ext['activemq.version'] = '5.13.2'
+ext['spring-data-releasetrain.version'] = 'Gosling-SR2A'
+
+dependencies {
+    compile(
+            [group: 'com.google.code.findbugs', name: 'jsr305']
+    )
+
+    testCompile(
+            [group: 'org.springframework.boot', name: 'spring-boot-starter-test']
+    )
+}
+
+jar {
+    from sourceSets.main.allSource
+    duplicatesStrategy = DuplicatesStrategy.EXCLUDE
+}
+
+license {
+    header rootProject.file('../HEADER')
+    strictCheck true
+    mapping {
+        java = 'SLASHSTAR_STYLE'
+        xml = 'XML_STYLE'
+        yml = 'SCRIPT_STYLE'
+        yaml = 'SCRIPT_STYLE'
+    }
+}
+
+rat {
+    // List of exclude directives, defaults to ['**/.gradle/**']
+    excludes = [
+            "**/.idea/**",
+            "**/.gradle/**",
+            "**/gradle/**",
+            "**/build/**",
+            "gradlew",
+            "gradlew.bat",
+            "README.md"
+    ]
+}
+
diff --git a/system-analysis.mdj b/system-analysis.mdj
new file mode 100644
index 0000000..4c7f1af
--- /dev/null
+++ b/system-analysis.mdj
@@ -0,0 +1,4104 @@
+{
+	"_type": "Project",
+	"_id": "AAAAAAFF+h6SjaM2Hec=",
+	"name": "Untitled",
+	"ownedElements": [
+		{
+			"_type": "UMLModel",
+			"_id": "AAAAAAFF+qBWK6M3Z8Y=",
+			"_parent": {
+				"$ref": "AAAAAAFF+h6SjaM2Hec="
+			},
+			"name": "Model",
+			"ownedElements": [
+				{
+					"_type": "UMLClassDiagram",
+					"_id": "AAAAAAFF+qBtyKM79qY=",
+					"_parent": {
+						"$ref": "AAAAAAFF+qBWK6M3Z8Y="
+					},
+					"name": "Main",
+					"visible": true,
+					"defaultDiagram": true
+				},
+				{
+					"_type": "UMLActivity",
+					"_id": "AAAAAAFjqASLHqqfH1M=",
+					"_parent": {
+						"$ref": "AAAAAAFF+qBWK6M3Z8Y="
+					},
+					"name": "Activity1",
+					"ownedElements": [
+						{
+							"_type": "UMLActivityDiagram",
+							"_id": "AAAAAAFjqASLIKqg3FE=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"name": "Notification Activity",
+							"visible": true,
+							"defaultDiagram": false,
+							"ownedViews": [
+								{
+									"_type": "UMLControlNodeView",
+									"_id": "AAAAAAFjqASvhqqmFR0=",
+									"_parent": {
+										"$ref": "AAAAAAFjqASLIKqg3FE="
+									},
+									"model": {
+										"$ref": "AAAAAAFjqASvhaqkmH0="
+									},
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": true,
+									"containerExtending": false,
+									"left": 178,
+									"top": 32,
+									"width": 20,
+									"height": 20,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLActionView",
+									"_id": "AAAAAAFjqATelaqrA88=",
+									"_parent": {
+										"$ref": "AAAAAAFjqASLIKqg3FE="
+									},
+									"model": {
+										"$ref": "AAAAAAFjqATelKqpPIs="
+									},
+									"subViews": [
+										{
+											"_type": "UMLNameCompartmentView",
+											"_id": "AAAAAAFjqATelqqsQwY=",
+											"_parent": {
+												"$ref": "AAAAAAFjqATelaqrA88="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqATelKqpPIs="
+											},
+											"subViews": [
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqATelqqtdxw=",
+													"_parent": {
+														"$ref": "AAAAAAFjqATelqqsQwY="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 32,
+													"top": 0,
+													"width": 0,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqATel6qupnU=",
+													"_parent": {
+														"$ref": "AAAAAAFjqATelqqsQwY="
+													},
+													"visible": true,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;1",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 144,
+													"top": 95,
+													"width": 87,
+													"height": 26,
+													"autoResize": false,
+													"underline": false,
+													"text": "JMSListener injects event",
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": true
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqATemKqvl8w=",
+													"_parent": {
+														"$ref": "AAAAAAFjqATelqqsQwY="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 32,
+													"top": 0,
+													"width": 86,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"text": "(from Activity1)",
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqATemKqwuws=",
+													"_parent": {
+														"$ref": "AAAAAAFjqATelqqsQwY="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 32,
+													"top": 0,
+													"width": 0,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"horizontalAlignment": 1,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												}
+											],
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 139,
+											"top": 88,
+											"width": 97,
+											"height": 38,
+											"autoResize": false,
+											"stereotypeLabel": {
+												"$ref": "AAAAAAFjqATelqqtdxw="
+											},
+											"nameLabel": {
+												"$ref": "AAAAAAFjqATel6qupnU="
+											},
+											"namespaceLabel": {
+												"$ref": "AAAAAAFjqATemKqvl8w="
+											},
+											"propertyLabel": {
+												"$ref": "AAAAAAFjqATemKqwuws="
+											}
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": true,
+									"containerExtending": false,
+									"left": 139,
+									"top": 88,
+									"width": 97,
+									"height": 54,
+									"autoResize": false,
+									"stereotypeDisplay": "label",
+									"showVisibility": true,
+									"showNamespace": false,
+									"showProperty": true,
+									"showType": true,
+									"nameCompartment": {
+										"$ref": "AAAAAAFjqATelqqsQwY="
+									},
+									"wordWrap": true
+								},
+								{
+									"_type": "UMLActionView",
+									"_id": "AAAAAAFjqAWrCqrNuOs=",
+									"_parent": {
+										"$ref": "AAAAAAFjqASLIKqg3FE="
+									},
+									"model": {
+										"$ref": "AAAAAAFjqAWrCarLlr0="
+									},
+									"subViews": [
+										{
+											"_type": "UMLNameCompartmentView",
+											"_id": "AAAAAAFjqAWrCqrOxcc=",
+											"_parent": {
+												"$ref": "AAAAAAFjqAWrCqrNuOs="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqAWrCarLlr0="
+											},
+											"subViews": [
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqAWrC6rPvtY=",
+													"_parent": {
+														"$ref": "AAAAAAFjqAWrCqrOxcc="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": -366,
+													"top": 304,
+													"width": 0,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqAWrC6rQZmc=",
+													"_parent": {
+														"$ref": "AAAAAAFjqAWrCqrOxcc="
+													},
+													"visible": true,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;1",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 45,
+													"top": 351,
+													"width": 95,
+													"height": 52,
+													"autoResize": false,
+													"underline": false,
+													"text": "retrieve receipt SMS and email contact",
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": true
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqAWrC6rRHbU=",
+													"_parent": {
+														"$ref": "AAAAAAFjqAWrCqrOxcc="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": -366,
+													"top": 304,
+													"width": 86,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"text": "(from Activity1)",
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqAWrC6rS8Ik=",
+													"_parent": {
+														"$ref": "AAAAAAFjqAWrCqrOxcc="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": -366,
+													"top": 304,
+													"width": 0,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"horizontalAlignment": 1,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												}
+											],
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 40,
+											"top": 344,
+											"width": 105,
+											"height": 64,
+											"autoResize": false,
+											"stereotypeLabel": {
+												"$ref": "AAAAAAFjqAWrC6rPvtY="
+											},
+											"nameLabel": {
+												"$ref": "AAAAAAFjqAWrC6rQZmc="
+											},
+											"namespaceLabel": {
+												"$ref": "AAAAAAFjqAWrC6rRHbU="
+											},
+											"propertyLabel": {
+												"$ref": "AAAAAAFjqAWrC6rS8Ik="
+											}
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": true,
+									"containerExtending": false,
+									"left": 40,
+									"top": 344,
+									"width": 105,
+									"height": 80,
+									"autoResize": false,
+									"stereotypeDisplay": "label",
+									"showVisibility": true,
+									"showNamespace": false,
+									"showProperty": true,
+									"showType": true,
+									"nameCompartment": {
+										"$ref": "AAAAAAFjqAWrCqrOxcc="
+									},
+									"wordWrap": true
+								},
+								{
+									"_type": "UMLActionView",
+									"_id": "AAAAAAFjqAYmKaro5lo=",
+									"_parent": {
+										"$ref": "AAAAAAFjqASLIKqg3FE="
+									},
+									"model": {
+										"$ref": "AAAAAAFjqAYmKKrmL6s="
+									},
+									"subViews": [
+										{
+											"_type": "UMLNameCompartmentView",
+											"_id": "AAAAAAFjqAYmKarpUFk=",
+											"_parent": {
+												"$ref": "AAAAAAFjqAYmKaro5lo="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqAYmKKrmL6s="
+											},
+											"subViews": [
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqAYmKqrq62s=",
+													"_parent": {
+														"$ref": "AAAAAAFjqAYmKarpUFk="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 322,
+													"top": 224,
+													"width": 0,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqAYmKqrr75M=",
+													"_parent": {
+														"$ref": "AAAAAAFjqAYmKarpUFk="
+													},
+													"visible": true,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;1",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 213,
+													"top": 351,
+													"width": 111,
+													"height": 39,
+													"autoResize": false,
+													"underline": false,
+													"text": "Prepare Message with template created",
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": true
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqAYmK6rsSQ0=",
+													"_parent": {
+														"$ref": "AAAAAAFjqAYmKarpUFk="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 322,
+													"top": 224,
+													"width": 86,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"text": "(from Activity1)",
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqAYmK6rtvPo=",
+													"_parent": {
+														"$ref": "AAAAAAFjqAYmKarpUFk="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 322,
+													"top": 224,
+													"width": 0,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"horizontalAlignment": 1,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												}
+											],
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 208,
+											"top": 344,
+											"width": 121,
+											"height": 51,
+											"autoResize": false,
+											"stereotypeLabel": {
+												"$ref": "AAAAAAFjqAYmKqrq62s="
+											},
+											"nameLabel": {
+												"$ref": "AAAAAAFjqAYmKqrr75M="
+											},
+											"namespaceLabel": {
+												"$ref": "AAAAAAFjqAYmK6rsSQ0="
+											},
+											"propertyLabel": {
+												"$ref": "AAAAAAFjqAYmK6rtvPo="
+											}
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": true,
+									"containerExtending": false,
+									"left": 208,
+									"top": 344,
+									"width": 121,
+									"height": 67,
+									"autoResize": false,
+									"stereotypeDisplay": "label",
+									"showVisibility": true,
+									"showNamespace": false,
+									"showProperty": true,
+									"showType": true,
+									"nameCompartment": {
+										"$ref": "AAAAAAFjqAYmKarpUFk="
+									},
+									"wordWrap": true
+								},
+								{
+									"_type": "UMLActionView",
+									"_id": "AAAAAAFjqAZdgqsCYJQ=",
+									"_parent": {
+										"$ref": "AAAAAAFjqASLIKqg3FE="
+									},
+									"model": {
+										"$ref": "AAAAAAFjqAZdgasAyFA="
+									},
+									"subViews": [
+										{
+											"_type": "UMLNameCompartmentView",
+											"_id": "AAAAAAFjqAZdgqsDDao=",
+											"_parent": {
+												"$ref": "AAAAAAFjqAZdgqsCYJQ="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqAZdgasAyFA="
+											},
+											"subViews": [
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqAZdgqsEhl4=",
+													"_parent": {
+														"$ref": "AAAAAAFjqAZdgqsDDao="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": -240,
+													"top": 528,
+													"width": 0,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqAZdgqsF8Ko=",
+													"_parent": {
+														"$ref": "AAAAAAFjqAZdgqsDDao="
+													},
+													"visible": true,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;1",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 136,
+													"top": 591,
+													"width": 103,
+													"height": 39,
+													"autoResize": false,
+													"underline": false,
+													"text": "Senders Objects transmit the data",
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": true
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqAZdgqsGu+E=",
+													"_parent": {
+														"$ref": "AAAAAAFjqAZdgqsDDao="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": -240,
+													"top": 528,
+													"width": 86,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"text": "(from Activity1)",
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqAZdgqsH70w=",
+													"_parent": {
+														"$ref": "AAAAAAFjqAZdgqsDDao="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": -240,
+													"top": 528,
+													"width": 0,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"horizontalAlignment": 1,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												}
+											],
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 131,
+											"top": 584,
+											"width": 113,
+											"height": 51,
+											"autoResize": false,
+											"stereotypeLabel": {
+												"$ref": "AAAAAAFjqAZdgqsEhl4="
+											},
+											"nameLabel": {
+												"$ref": "AAAAAAFjqAZdgqsF8Ko="
+											},
+											"namespaceLabel": {
+												"$ref": "AAAAAAFjqAZdgqsGu+E="
+											},
+											"propertyLabel": {
+												"$ref": "AAAAAAFjqAZdgqsH70w="
+											}
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": true,
+									"containerExtending": false,
+									"left": 131,
+									"top": 584,
+									"width": 113,
+									"height": 67,
+									"autoResize": false,
+									"stereotypeDisplay": "label",
+									"showVisibility": true,
+									"showNamespace": false,
+									"showProperty": true,
+									"showType": true,
+									"nameCompartment": {
+										"$ref": "AAAAAAFjqAZdgqsDDao="
+									},
+									"wordWrap": true
+								},
+								{
+									"_type": "UMLControlNodeView",
+									"_id": "AAAAAAFjqAbQ96sfooI=",
+									"_parent": {
+										"$ref": "AAAAAAFjqASLIKqg3FE="
+									},
+									"model": {
+										"$ref": "AAAAAAFjqAbQ7asd+Ww="
+									},
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": true,
+									"containerExtending": false,
+									"left": 175,
+									"top": 680,
+									"width": 26,
+									"height": 26,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLActionView",
+									"_id": "AAAAAAFjqA2/Cata4OI=",
+									"_parent": {
+										"$ref": "AAAAAAFjqASLIKqg3FE="
+									},
+									"model": {
+										"$ref": "AAAAAAFjqA2/A6tYai0="
+									},
+									"subViews": [
+										{
+											"_type": "UMLNameCompartmentView",
+											"_id": "AAAAAAFjqA2/C6tbg3o=",
+											"_parent": {
+												"$ref": "AAAAAAFjqA2/Cata4OI="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqA2/A6tYai0="
+											},
+											"subViews": [
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqA2/C6tcNpM=",
+													"_parent": {
+														"$ref": "AAAAAAFjqA2/C6tbg3o="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 178,
+													"top": 336,
+													"width": 0,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqA2/DKtd5Og=",
+													"_parent": {
+														"$ref": "AAAAAAFjqA2/C6tbg3o="
+													},
+													"visible": true,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;1",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 229,
+													"top": 463,
+													"width": 79,
+													"height": 26,
+													"autoResize": false,
+													"underline": false,
+													"text": "Locatize Template",
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": true
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqA2/DateYyA=",
+													"_parent": {
+														"$ref": "AAAAAAFjqA2/C6tbg3o="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 178,
+													"top": 336,
+													"width": 86,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"text": "(from Activity1)",
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqA2/Datf4DQ=",
+													"_parent": {
+														"$ref": "AAAAAAFjqA2/C6tbg3o="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Arial;13;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 178,
+													"top": 336,
+													"width": 0,
+													"height": 13,
+													"autoResize": false,
+													"underline": false,
+													"horizontalAlignment": 1,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												}
+											],
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Arial;13;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 224,
+											"top": 456,
+											"width": 89,
+											"height": 38,
+											"autoResize": false,
+											"stereotypeLabel": {
+												"$ref": "AAAAAAFjqA2/C6tcNpM="
+											},
+											"nameLabel": {
+												"$ref": "AAAAAAFjqA2/DKtd5Og="
+											},
+											"namespaceLabel": {
+												"$ref": "AAAAAAFjqA2/DateYyA="
+											},
+											"propertyLabel": {
+												"$ref": "AAAAAAFjqA2/Datf4DQ="
+											}
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Arial;13;0",
+									"showShadow": true,
+									"containerChangeable": true,
+									"containerExtending": false,
+									"left": 224,
+									"top": 456,
+									"width": 89,
+									"height": 54,
+									"autoResize": false,
+									"stereotypeDisplay": "label",
+									"showVisibility": true,
+									"showNamespace": false,
+									"showProperty": true,
+									"showType": true,
+									"nameCompartment": {
+										"$ref": "AAAAAAFjqA2/C6tbg3o="
+									},
+									"wordWrap": true
+								},
+								{
+									"_type": "UMLControlNodeView",
+									"_id": "AAAAAAFjqBIJL6ubZ3I=",
+									"_parent": {
+										"$ref": "AAAAAAFjqASLIKqg3FE="
+									},
+									"model": {
+										"$ref": "AAAAAAFjqBIJLquZsRo="
+									},
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": true,
+									"containerExtending": false,
+									"left": 131,
+									"top": 288,
+									"width": 113,
+									"height": 6,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLControlFlowView",
+									"_id": "AAAAAAFjqBIoa6ugHqY=",
+									"_parent": {
+										"$ref": "AAAAAAFjqASLIKqg3FE="
+									},
+									"model": {
+										"$ref": "AAAAAAFjqBIoaquel/4="
+									},
+									"subViews": [
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqBIoa6uhY6U=",
+											"_parent": {
+												"$ref": "AAAAAAFjqBIoa6ugHqY="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqBIoaquel/4="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 201,
+											"top": 151,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 15,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqBIoa6ugHqY="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqBIoa6uivk8=",
+											"_parent": {
+												"$ref": "AAAAAAFjqBIoa6ugHqY="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqBIoaquel/4="
+											},
+											"visible": null,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 216,
+											"top": 151,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 30,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqBIoa6ugHqY="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqBIobKujWVc=",
+											"_parent": {
+												"$ref": "AAAAAAFjqBIoa6ugHqY="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqBIoaquel/4="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 172,
+											"top": 152,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": -1.5707963267948966,
+											"distance": 15,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqBIoa6ugHqY="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"head": {
+										"$ref": "AAAAAAFjqCEih6yTO40="
+									},
+									"tail": {
+										"$ref": "AAAAAAFjqATelaqrA88="
+									},
+									"lineStyle": 1,
+									"points": "187:142;187:175",
+									"stereotypeDisplay": "label",
+									"showVisibility": true,
+									"showProperty": true,
+									"nameLabel": {
+										"$ref": "AAAAAAFjqBIoa6uhY6U="
+									},
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFjqBIoa6uivk8="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFjqBIobKujWVc="
+									}
+								},
+								{
+									"_type": "UMLControlFlowView",
+									"_id": "AAAAAAFjqBKjHquxAW0=",
+									"_parent": {
+										"$ref": "AAAAAAFjqASLIKqg3FE="
+									},
+									"model": {
+										"$ref": "AAAAAAFjqBKjHquv5CM="
+									},
+									"subViews": [
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqBKjHquyqKs=",
+											"_parent": {
+												"$ref": "AAAAAAFjqBKjHquxAW0="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqBKjHquv5CM="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 201,
+											"top": 62,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 15,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqBKjHquxAW0="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqBKjHquzayI=",
+											"_parent": {
+												"$ref": "AAAAAAFjqBKjHquxAW0="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqBKjHquv5CM="
+											},
+											"visible": null,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 216,
+											"top": 62,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 30,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqBKjHquxAW0="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqBKjHqu0+xU=",
+											"_parent": {
+												"$ref": "AAAAAAFjqBKjHquxAW0="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqBKjHquv5CM="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 172,
+											"top": 63,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": -1.5707963267948966,
+											"distance": 15,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqBKjHquxAW0="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"head": {
+										"$ref": "AAAAAAFjqATelaqrA88="
+									},
+									"tail": {
+										"$ref": "AAAAAAFjqASvhqqmFR0="
+									},
+									"lineStyle": 1,
+									"points": "187:52;187:87",
+									"stereotypeDisplay": "label",
+									"showVisibility": true,
+									"showProperty": true,
+									"nameLabel": {
+										"$ref": "AAAAAAFjqBKjHquyqKs="
+									},
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFjqBKjHquzayI="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFjqBKjHqu0+xU="
+									}
+								},
+								{
+									"_type": "UMLControlFlowView",
+									"_id": "AAAAAAFjqBLYAqvEqog=",
+									"_parent": {
+										"$ref": "AAAAAAFjqASLIKqg3FE="
+									},
+									"model": {
+										"$ref": "AAAAAAFjqBLYAqvCSQk="
+									},
+									"subViews": [
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqBLYAqvFiZM=",
+											"_parent": {
+												"$ref": "AAAAAAFjqBLYAqvEqog="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqBLYAqvCSQk="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 282,
+											"top": 426,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 15,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqBLYAqvEqog="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqBLYAqvGPAg=",
+											"_parent": {
+												"$ref": "AAAAAAFjqBLYAqvEqog="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqBLYAqvCSQk="
+											},
+											"visible": null,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 297,
+											"top": 426,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 30,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqBLYAqvEqog="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqBLYAqvHWRk=",
+											"_parent": {
+												"$ref": "AAAAAAFjqBLYAqvEqog="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqBLYAqvCSQk="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 253,
+											"top": 427,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": -1.5707963267948966,
+											"distance": 15,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqBLYAqvEqog="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"head": {
+										"$ref": "AAAAAAFjqA2/Cata4OI="
+									},
+									"tail": {
+										"$ref": "AAAAAAFjqAYmKaro5lo="
+									},
+									"lineStyle": 1,
+									"points": "268:411;268:455",
+									"stereotypeDisplay": "label",
+									"showVisibility": true,
+									"showProperty": true,
+									"nameLabel": {
+										"$ref": "AAAAAAFjqBLYAqvFiZM="
+									},
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFjqBLYAqvGPAg="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFjqBLYAqvHWRk="
+									}
+								},
+								{
+									"_type": "UMLControlFlowView",
+									"_id": "AAAAAAFjqBLqN6vVVDc=",
+									"_parent": {
+										"$ref": "AAAAAAFjqASLIKqg3FE="
+									},
+									"model": {
+										"$ref": "AAAAAAFjqBLqNqvTow0="
+									},
+									"subViews": [
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqBLqOKvWpw0=",
+											"_parent": {
+												"$ref": "AAAAAAFjqBLqN6vVVDc="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqBLqNqvTow0="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 201,
+											"top": 658,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 15,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqBLqN6vVVDc="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqBLqOKvX76Y=",
+											"_parent": {
+												"$ref": "AAAAAAFjqBLqN6vVVDc="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqBLqNqvTow0="
+											},
+											"visible": null,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 216,
+											"top": 658,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 30,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqBLqN6vVVDc="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqBLqOavYEPE=",
+											"_parent": {
+												"$ref": "AAAAAAFjqBLqN6vVVDc="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqBLqNqvTow0="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 172,
+											"top": 659,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": -1.5707963267948966,
+											"distance": 15,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqBLqN6vVVDc="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"head": {
+										"$ref": "AAAAAAFjqAbQ96sfooI="
+									},
+									"tail": {
+										"$ref": "AAAAAAFjqAZdgqsCYJQ="
+									},
+									"lineStyle": 1,
+									"points": "187:651;187:679",
+									"stereotypeDisplay": "label",
+									"showVisibility": true,
+									"showProperty": true,
+									"nameLabel": {
+										"$ref": "AAAAAAFjqBLqOKvWpw0="
+									},
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFjqBLqOKvX76Y="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFjqBLqOavYEPE="
+									}
+								},
+								{
+									"_type": "UMLControlFlowView",
+									"_id": "AAAAAAFjqB0vKqwHDoM=",
+									"_parent": {
+										"$ref": "AAAAAAFjqASLIKqg3FE="
+									},
+									"model": {
+										"$ref": "AAAAAAFjqB0vKawF6iM="
+									},
+									"subViews": [
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqB0vKqwIlNc=",
+											"_parent": {
+												"$ref": "AAAAAAFjqB0vKqwHDoM="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqB0vKawF6iM="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 168,
+											"top": 322,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 15,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqB0vKqwHDoM="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqB0vK6wJ+8E=",
+											"_parent": {
+												"$ref": "AAAAAAFjqB0vKqwHDoM="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqB0vKawF6iM="
+											},
+											"visible": null,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 179,
+											"top": 333,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 30,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqB0vKqwHDoM="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqB0vK6wKDT8=",
+											"_parent": {
+												"$ref": "AAAAAAFjqB0vKqwHDoM="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqB0vKawF6iM="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 147,
+											"top": 301,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": -1.5707963267948966,
+											"distance": 15,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqB0vKqwHDoM="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"head": {
+										"$ref": "AAAAAAFjqAWrCqrNuOs="
+									},
+									"tail": {
+										"$ref": "AAAAAAFjqBIJL6ubZ3I="
+									},
+									"lineStyle": 1,
+									"points": "183:294;133:343",
+									"stereotypeDisplay": "label",
+									"showVisibility": true,
+									"showProperty": true,
+									"nameLabel": {
+										"$ref": "AAAAAAFjqB0vKqwIlNc="
+									},
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFjqB0vK6wJ+8E="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFjqB0vK6wKDT8="
+									}
+								},
+								{
+									"_type": "UMLControlFlowView",
+									"_id": "AAAAAAFjqB14tKwY2QY=",
+									"_parent": {
+										"$ref": "AAAAAAFjqASLIKqg3FE="
+									},
+									"model": {
+										"$ref": "AAAAAAFjqB14s6wWTtM="
+									},
+									"subViews": [
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqB14tKwZWVs=",
+											"_parent": {
+												"$ref": "AAAAAAFjqB14tKwY2QY="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqB14s6wWTtM="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 224,
+											"top": 301,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 15,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqB14tKwY2QY="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqB14tKwaFP8=",
+											"_parent": {
+												"$ref": "AAAAAAFjqB14tKwY2QY="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqB14s6wWTtM="
+											},
+											"visible": null,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 235,
+											"top": 291,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 30,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqB14tKwY2QY="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqB14tKwbJe8=",
+											"_parent": {
+												"$ref": "AAAAAAFjqB14tKwY2QY="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqB14s6wWTtM="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 201,
+											"top": 322,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": -1.5707963267948966,
+											"distance": 15,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqB14tKwY2QY="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"head": {
+										"$ref": "AAAAAAFjqAYmKaro5lo="
+									},
+									"tail": {
+										"$ref": "AAAAAAFjqBIJL6ubZ3I="
+									},
+									"lineStyle": 1,
+									"points": "191:294;236:343",
+									"stereotypeDisplay": "label",
+									"showVisibility": true,
+									"showProperty": true,
+									"nameLabel": {
+										"$ref": "AAAAAAFjqB14tKwZWVs="
+									},
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFjqB14tKwaFP8="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFjqB14tKwbJe8="
+									}
+								},
+								{
+									"_type": "UMLControlNodeView",
+									"_id": "AAAAAAFjqB9/Taw5bl4=",
+									"_parent": {
+										"$ref": "AAAAAAFjqASLIKqg3FE="
+									},
+									"model": {
+										"$ref": "AAAAAAFjqB9/S6w3TKM="
+									},
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": true,
+									"containerExtending": false,
+									"left": 136,
+									"top": 544,
+									"width": 104,
+									"height": 6,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLControlFlowView",
+									"_id": "AAAAAAFjqB+W4qw+0nc=",
+									"_parent": {
+										"$ref": "AAAAAAFjqASLIKqg3FE="
+									},
+									"model": {
+										"$ref": "AAAAAAFjqB+W4qw8vc8="
+									},
+									"subViews": [
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqB+W46w/H0c=",
+											"_parent": {
+												"$ref": "AAAAAAFjqB+W4qw+0nc="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqB+W4qw8vc8="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 201,
+											"top": 559,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 15,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqB+W4qw+0nc="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqB+W46xAJPs=",
+											"_parent": {
+												"$ref": "AAAAAAFjqB+W4qw+0nc="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqB+W4qw8vc8="
+											},
+											"visible": null,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 216,
+											"top": 559,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 30,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqB+W4qw+0nc="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqB+W46xBhSQ=",
+											"_parent": {
+												"$ref": "AAAAAAFjqB+W4qw+0nc="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqB+W4qw8vc8="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 172,
+											"top": 560,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": -1.5707963267948966,
+											"distance": 15,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqB+W4qw+0nc="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"head": {
+										"$ref": "AAAAAAFjqAZdgqsCYJQ="
+									},
+									"tail": {
+										"$ref": "AAAAAAFjqB9/Taw5bl4="
+									},
+									"lineStyle": 1,
+									"points": "187:550;187:583",
+									"stereotypeDisplay": "label",
+									"showVisibility": true,
+									"showProperty": true,
+									"nameLabel": {
+										"$ref": "AAAAAAFjqB+W46w/H0c="
+									},
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFjqB+W46xAJPs="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFjqB+W46xBhSQ="
+									}
+								},
+								{
+									"_type": "UMLControlFlowView",
+									"_id": "AAAAAAFjqB+mdKxPr44=",
+									"_parent": {
+										"$ref": "AAAAAAFjqASLIKqg3FE="
+									},
+									"model": {
+										"$ref": "AAAAAAFjqB+mc6xNTWc="
+									},
+									"subViews": [
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqB+mdKxQpVA=",
+											"_parent": {
+												"$ref": "AAAAAAFjqB+mdKxPr44="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqB+mc6xNTWc="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 221,
+											"top": 531,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 15,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqB+mdKxPr44="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqB+mdKxRB1o=",
+											"_parent": {
+												"$ref": "AAAAAAFjqB+mdKxPr44="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqB+mc6xNTWc="
+											},
+											"visible": null,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 230,
+											"top": 543,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 30,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqB+mdKxPr44="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqB+mdKxSTJo=",
+											"_parent": {
+												"$ref": "AAAAAAFjqB+mdKxPr44="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqB+mc6xNTWc="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 202,
+											"top": 508,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": -1.5707963267948966,
+											"distance": 15,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqB+mdKxPr44="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"head": {
+										"$ref": "AAAAAAFjqB9/Taw5bl4="
+									},
+									"tail": {
+										"$ref": "AAAAAAFjqA2/Cata4OI="
+									},
+									"lineStyle": 1,
+									"points": "233:510;191:543",
+									"stereotypeDisplay": "label",
+									"showVisibility": true,
+									"showProperty": true,
+									"nameLabel": {
+										"$ref": "AAAAAAFjqB+mdKxQpVA="
+									},
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFjqB+mdKxRB1o="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFjqB+mdKxSTJo="
+									}
+								},
+								{
+									"_type": "UMLControlFlowView",
+									"_id": "AAAAAAFjqCBd1Kx5mCs=",
+									"_parent": {
+										"$ref": "AAAAAAFjqASLIKqg3FE="
+									},
+									"model": {
+										"$ref": "AAAAAAFjqCBd06x3DWs="
+									},
+									"subViews": [
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqCBd1Kx6qnM=",
+											"_parent": {
+												"$ref": "AAAAAAFjqCBd1Kx5mCs="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqCBd06x3DWs="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 162,
+											"top": 469,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 15,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqCBd1Kx5mCs="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqCBd1ax7Ky4=",
+											"_parent": {
+												"$ref": "AAAAAAFjqCBd1Kx5mCs="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqCBd06x3DWs="
+											},
+											"visible": null,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 175,
+											"top": 461,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 30,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqCBd1Kx5mCs="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqCBd1ax8vzU=",
+											"_parent": {
+												"$ref": "AAAAAAFjqCBd1Kx5mCs="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqCBd06x3DWs="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 137,
+											"top": 484,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": -1.5707963267948966,
+											"distance": 15,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqCBd1Kx5mCs="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"head": {
+										"$ref": "AAAAAAFjqB9/Taw5bl4="
+									},
+									"tail": {
+										"$ref": "AAAAAAFjqAWrCqrNuOs="
+									},
+									"lineStyle": 1,
+									"points": "116:424;185:543",
+									"stereotypeDisplay": "label",
+									"showVisibility": true,
+									"showProperty": true,
+									"nameLabel": {
+										"$ref": "AAAAAAFjqCBd1Kx6qnM="
+									},
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFjqCBd1ax7Ky4="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFjqCBd1ax8vzU="
+									}
+								},
+								{
+									"_type": "UMLActionView",
+									"_id": "AAAAAAFjqCEih6yTO40=",
+									"_parent": {
+										"$ref": "AAAAAAFjqASLIKqg3FE="
+									},
+									"model": {
+										"$ref": "AAAAAAFjqCEig6yRtTs="
+									},
+									"subViews": [
+										{
+											"_type": "UMLNameCompartmentView",
+											"_id": "AAAAAAFjqCEiiayUplA=",
+											"_parent": {
+												"$ref": "AAAAAAFjqCEih6yTO40="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqCEig6yRtTs="
+											},
+											"subViews": [
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqCEiiqyV3PI=",
+													"_parent": {
+														"$ref": "AAAAAAFjqCEiiayUplA="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Helvetica;12;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": -144,
+													"top": -128,
+													"width": 0,
+													"height": 12,
+													"autoResize": false,
+													"underline": false,
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqCEii6yWXBY=",
+													"_parent": {
+														"$ref": "AAAAAAFjqCEiiayUplA="
+													},
+													"visible": true,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Helvetica;12;1",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 132,
+													"top": 183,
+													"width": 111,
+													"height": 36,
+													"autoResize": false,
+													"underline": false,
+													"text": "Check if Event has been enabled by MFI",
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": true
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqCEii6yXfwg=",
+													"_parent": {
+														"$ref": "AAAAAAFjqCEiiayUplA="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Helvetica;12;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": -144,
+													"top": -128,
+													"width": 80,
+													"height": 12,
+													"autoResize": false,
+													"underline": false,
+													"text": "(from Activity1)",
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqCEii6yYpPQ=",
+													"_parent": {
+														"$ref": "AAAAAAFjqCEiiayUplA="
+													},
+													"visible": false,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Helvetica;12;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": -144,
+													"top": -128,
+													"width": 0,
+													"height": 12,
+													"autoResize": false,
+													"underline": false,
+													"horizontalAlignment": 1,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												}
+											],
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 127,
+											"top": 176,
+											"width": 121,
+											"height": 48,
+											"autoResize": false,
+											"stereotypeLabel": {
+												"$ref": "AAAAAAFjqCEiiqyV3PI="
+											},
+											"nameLabel": {
+												"$ref": "AAAAAAFjqCEii6yWXBY="
+											},
+											"namespaceLabel": {
+												"$ref": "AAAAAAFjqCEii6yXfwg="
+											},
+											"propertyLabel": {
+												"$ref": "AAAAAAFjqCEii6yYpPQ="
+											}
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": true,
+									"containerExtending": false,
+									"left": 127,
+									"top": 176,
+									"width": 121,
+									"height": 64,
+									"autoResize": false,
+									"stereotypeDisplay": "label",
+									"showVisibility": true,
+									"showNamespace": false,
+									"showProperty": true,
+									"showType": true,
+									"nameCompartment": {
+										"$ref": "AAAAAAFjqCEiiayUplA="
+									},
+									"wordWrap": true
+								},
+								{
+									"_type": "UMLControlFlowView",
+									"_id": "AAAAAAFjqCJ5HqyxiME=",
+									"_parent": {
+										"$ref": "AAAAAAFjqASLIKqg3FE="
+									},
+									"model": {
+										"$ref": "AAAAAAFjqCJ5HayvTsA="
+									},
+									"subViews": [
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqCJ5H6yynz8=",
+											"_parent": {
+												"$ref": "AAAAAAFjqCJ5HqyxiME="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqCJ5HayvTsA="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 201,
+											"top": 256,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 15,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqCJ5HqyxiME="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqCJ5IKyzLqE=",
+											"_parent": {
+												"$ref": "AAAAAAFjqCJ5HqyxiME="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqCJ5HayvTsA="
+											},
+											"visible": null,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 216,
+											"top": 256,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": 1.5707963267948966,
+											"distance": 30,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqCJ5HqyxiME="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "EdgeLabelView",
+											"_id": "AAAAAAFjqCJ5IKy0y/c=",
+											"_parent": {
+												"$ref": "AAAAAAFjqCJ5HqyxiME="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqCJ5HayvTsA="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 172,
+											"top": 257,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"alpha": -1.5707963267948966,
+											"distance": 15,
+											"hostEdge": {
+												"$ref": "AAAAAAFjqCJ5HqyxiME="
+											},
+											"edgePosition": 1,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"head": {
+										"$ref": "AAAAAAFjqBIJL6ubZ3I="
+									},
+									"tail": {
+										"$ref": "AAAAAAFjqCEih6yTO40="
+									},
+									"lineStyle": 1,
+									"points": "187:240;187:287",
+									"stereotypeDisplay": "label",
+									"showVisibility": true,
+									"showProperty": true,
+									"nameLabel": {
+										"$ref": "AAAAAAFjqCJ5H6yynz8="
+									},
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFjqCJ5IKyzLqE="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFjqCJ5IKy0y/c="
+									}
+								}
+							]
+						}
+					],
+					"visibility": "public",
+					"isReentrant": true,
+					"isReadOnly": false,
+					"isSingleExecution": false,
+					"nodes": [
+						{
+							"_type": "UMLInitialNode",
+							"_id": "AAAAAAFjqASvhaqkmH0=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"name": "InitialNode1",
+							"visibility": "public"
+						},
+						{
+							"_type": "UMLAction",
+							"_id": "AAAAAAFjqATelKqpPIs=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"name": "JMSListener injects event",
+							"visibility": "public",
+							"kind": "opaque",
+							"isLocallyReentrant": false,
+							"isSynchronous": true
+						},
+						{
+							"_type": "UMLAction",
+							"_id": "AAAAAAFjqAWrCarLlr0=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"name": "retrieve receipt SMS and email contact",
+							"visibility": "public",
+							"kind": "opaque",
+							"isLocallyReentrant": false,
+							"isSynchronous": true
+						},
+						{
+							"_type": "UMLAction",
+							"_id": "AAAAAAFjqAYmKKrmL6s=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"name": "Prepare Message with template created",
+							"visibility": "public",
+							"kind": "opaque",
+							"isLocallyReentrant": false,
+							"isSynchronous": true
+						},
+						{
+							"_type": "UMLAction",
+							"_id": "AAAAAAFjqAZdgasAyFA=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"name": "Senders Objects transmit the data",
+							"visibility": "public",
+							"kind": "opaque",
+							"isLocallyReentrant": false,
+							"isSynchronous": true
+						},
+						{
+							"_type": "UMLActivityFinalNode",
+							"_id": "AAAAAAFjqAbQ7asd+Ww=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"name": "ActivityFinalNode1",
+							"visibility": "public"
+						},
+						{
+							"_type": "UMLAction",
+							"_id": "AAAAAAFjqA2/A6tYai0=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"name": "Locatize Template",
+							"visibility": "public",
+							"kind": "opaque",
+							"isLocallyReentrant": false,
+							"isSynchronous": true
+						},
+						{
+							"_type": "UMLForkNode",
+							"_id": "AAAAAAFjqBHP9auQV5g=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"name": "ForkNode1",
+							"visibility": "public"
+						},
+						{
+							"_type": "UMLForkNode",
+							"_id": "AAAAAAFjqBIJLquZsRo=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"name": "ForkNode2",
+							"visibility": "public"
+						},
+						{
+							"_type": "UMLJoinNode",
+							"_id": "AAAAAAFjqB9/S6w3TKM=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"name": "JoinNode1",
+							"visibility": "public"
+						},
+						{
+							"_type": "UMLAction",
+							"_id": "AAAAAAFjqCEig6yRtTs=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"name": "Check if Event has been enabled by MFI",
+							"visibility": "public",
+							"kind": "opaque",
+							"isLocallyReentrant": false,
+							"isSynchronous": true
+						}
+					],
+					"edges": [
+						{
+							"_type": "UMLControlFlow",
+							"_id": "AAAAAAFjqBEKGKt1+H8=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"source": {
+								"$ref": "AAAAAAFjqATelKqpPIs="
+							},
+							"target": {
+								"$ref": "AAAAAAFjqAWrCarLlr0="
+							},
+							"visibility": "public"
+						},
+						{
+							"_type": "UMLControlFlow",
+							"_id": "AAAAAAFjqBIoaquel/4=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"source": {
+								"$ref": "AAAAAAFjqATelKqpPIs="
+							},
+							"target": {
+								"$ref": "AAAAAAFjqCEig6yRtTs="
+							},
+							"visibility": "public"
+						},
+						{
+							"_type": "UMLControlFlow",
+							"_id": "AAAAAAFjqBKjHquv5CM=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"source": {
+								"$ref": "AAAAAAFjqASvhaqkmH0="
+							},
+							"target": {
+								"$ref": "AAAAAAFjqATelKqpPIs="
+							},
+							"visibility": "public"
+						},
+						{
+							"_type": "UMLControlFlow",
+							"_id": "AAAAAAFjqBLYAqvCSQk=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"source": {
+								"$ref": "AAAAAAFjqAYmKKrmL6s="
+							},
+							"target": {
+								"$ref": "AAAAAAFjqA2/A6tYai0="
+							},
+							"visibility": "public"
+						},
+						{
+							"_type": "UMLControlFlow",
+							"_id": "AAAAAAFjqBLqNqvTow0=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"source": {
+								"$ref": "AAAAAAFjqAZdgasAyFA="
+							},
+							"target": {
+								"$ref": "AAAAAAFjqAbQ7asd+Ww="
+							},
+							"visibility": "public"
+						},
+						{
+							"_type": "UMLControlFlow",
+							"_id": "AAAAAAFjqByuGavpb+Q=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"source": {
+								"$ref": "AAAAAAFjqATelKqpPIs="
+							},
+							"target": {
+								"$ref": "AAAAAAFjqAWrCarLlr0="
+							},
+							"visibility": "public"
+						},
+						{
+							"_type": "UMLControlFlow",
+							"_id": "AAAAAAFjqB0vKawF6iM=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"source": {
+								"$ref": "AAAAAAFjqBIJLquZsRo="
+							},
+							"target": {
+								"$ref": "AAAAAAFjqAWrCarLlr0="
+							},
+							"visibility": "public"
+						},
+						{
+							"_type": "UMLControlFlow",
+							"_id": "AAAAAAFjqB14s6wWTtM=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"source": {
+								"$ref": "AAAAAAFjqBIJLquZsRo="
+							},
+							"target": {
+								"$ref": "AAAAAAFjqAYmKKrmL6s="
+							},
+							"visibility": "public"
+						},
+						{
+							"_type": "UMLControlFlow",
+							"_id": "AAAAAAFjqB+W4qw8vc8=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"source": {
+								"$ref": "AAAAAAFjqB9/S6w3TKM="
+							},
+							"target": {
+								"$ref": "AAAAAAFjqAZdgasAyFA="
+							},
+							"visibility": "public"
+						},
+						{
+							"_type": "UMLControlFlow",
+							"_id": "AAAAAAFjqB+mc6xNTWc=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"source": {
+								"$ref": "AAAAAAFjqA2/A6tYai0="
+							},
+							"target": {
+								"$ref": "AAAAAAFjqB9/S6w3TKM="
+							},
+							"visibility": "public"
+						},
+						{
+							"_type": "UMLControlFlow",
+							"_id": "AAAAAAFjqCBd06x3DWs=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"source": {
+								"$ref": "AAAAAAFjqAWrCarLlr0="
+							},
+							"target": {
+								"$ref": "AAAAAAFjqB9/S6w3TKM="
+							},
+							"visibility": "public"
+						},
+						{
+							"_type": "UMLControlFlow",
+							"_id": "AAAAAAFjqCJ5HayvTsA=",
+							"_parent": {
+								"$ref": "AAAAAAFjqASLHqqfH1M="
+							},
+							"source": {
+								"$ref": "AAAAAAFjqCEig6yRtTs="
+							},
+							"target": {
+								"$ref": "AAAAAAFjqBIJLquZsRo="
+							},
+							"visibility": "public"
+						}
+					]
+				},
+				{
+					"_type": "UMLCollaboration",
+					"_id": "AAAAAAFjqCY2j5u3ys8=",
+					"_parent": {
+						"$ref": "AAAAAAFF+qBWK6M3Z8Y="
+					},
+					"name": "Collaboration1",
+					"ownedElements": [
+						{
+							"_type": "UMLInteraction",
+							"_id": "AAAAAAFjqCY2kpu4n0I=",
+							"_parent": {
+								"$ref": "AAAAAAFjqCY2j5u3ys8="
+							},
+							"name": "Interaction1",
+							"ownedElements": [
+								{
+									"_type": "UMLSequenceDiagram",
+									"_id": "AAAAAAFjqCY2kpu5KQk=",
+									"_parent": {
+										"$ref": "AAAAAAFjqCY2kpu4n0I="
+									},
+									"name": "SequenceDiagram1",
+									"visible": true,
+									"defaultDiagram": false,
+									"ownedViews": [
+										{
+											"_type": "UMLFrameView",
+											"_id": "AAAAAAFjqCY2k5u6GlA=",
+											"_parent": {
+												"$ref": "AAAAAAFjqCY2kpu5KQk="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqCY2kpu5KQk="
+											},
+											"subViews": [
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqCY2lJu7Oe8=",
+													"_parent": {
+														"$ref": "AAAAAAFjqCY2k5u6GlA="
+													},
+													"visible": true,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Helvetica;12;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 73,
+													"top": 10,
+													"width": 111,
+													"height": 12,
+													"autoResize": false,
+													"underline": false,
+													"text": "SequenceDiagram1",
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												},
+												{
+													"_type": "LabelView",
+													"_id": "AAAAAAFjqCY2lZu8kXQ=",
+													"_parent": {
+														"$ref": "AAAAAAFjqCY2k5u6GlA="
+													},
+													"visible": true,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Helvetica;12;1",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 10,
+													"top": 10,
+													"width": 58,
+													"height": 12,
+													"autoResize": false,
+													"underline": false,
+													"text": "interaction",
+													"horizontalAlignment": 2,
+													"verticalAlignment": 5,
+													"wordWrap": false
+												}
+											],
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 5,
+											"top": 5,
+											"width": 695,
+											"height": 595,
+											"autoResize": false,
+											"nameLabel": {
+												"$ref": "AAAAAAFjqCY2lJu7Oe8="
+											},
+											"frameTypeLabel": {
+												"$ref": "AAAAAAFjqCY2lZu8kXQ="
+											}
+										},
+										{
+											"_type": "UMLSeqLifelineView",
+											"_id": "AAAAAAFjqCbCSJvIsEM=",
+											"_parent": {
+												"$ref": "AAAAAAFjqCY2kpu5KQk="
+											},
+											"model": {
+												"$ref": "AAAAAAFjqCbCSJvHDpo="
+											},
+											"subViews": [
+												{
+													"_type": "UMLNameCompartmentView",
+													"_id": "AAAAAAFjqCbCSZvJ4ng=",
+													"_parent": {
+														"$ref": "AAAAAAFjqCbCSJvIsEM="
+													},
+													"model": {
+														"$ref": "AAAAAAFjqCbCSJvHDpo="
+													},
+													"subViews": [
+														{
+															"_type": "LabelView",
+															"_id": "AAAAAAFjqCbCSpvKaxs=",
+															"_parent": {
+																"$ref": "AAAAAAFjqCbCSZvJ4ng="
+															},
+															"visible": false,
+															"enabled": true,
+															"lineColor": "#000000",
+															"fillColor": "#ffffff",
+															"fontColor": "#000000",
+															"font": "Helvetica;12;0",
+															"showShadow": true,
+															"containerChangeable": false,
+															"containerExtending": false,
+															"left": 0,
+															"top": 0,
+															"width": 0,
+															"height": 12,
+															"autoResize": false,
+															"underline": false,
+															"horizontalAlignment": 2,
+															"verticalAlignment": 5,
+															"wordWrap": false
+														},
+														{
+															"_type": "LabelView",
+															"_id": "AAAAAAFjqCbCSpvLXu8=",
+															"_parent": {
+																"$ref": "AAAAAAFjqCbCSZvJ4ng="
+															},
+															"visible": true,
+															"enabled": true,
+															"lineColor": "#000000",
+															"fillColor": "#ffffff",
+															"fontColor": "#000000",
+															"font": "Helvetica;12;1",
+															"showShadow": true,
+															"containerChangeable": false,
+															"containerExtending": false,
+															"left": 37,
+															"top": 47,
+															"width": 90,
+															"height": 12,
+															"autoResize": false,
+															"underline": false,
+															"text": "EventListener",
+															"horizontalAlignment": 2,
+															"verticalAlignment": 5,
+															"wordWrap": false
+														},
+														{
+															"_type": "LabelView",
+															"_id": "AAAAAAFjqCbCSpvMWyQ=",
+															"_parent": {
+																"$ref": "AAAAAAFjqCbCSZvJ4ng="
+															},
+															"visible": false,
+															"enabled": true,
+															"lineColor": "#000000",
+															"fillColor": "#ffffff",
+															"fontColor": "#000000",
+															"font": "Helvetica;12;0",
+															"showShadow": true,
+															"containerChangeable": false,
+															"containerExtending": false,
+															"left": 0,
+															"top": 0,
+															"width": 99,
+															"height": 12,
+															"autoResize": false,
+															"underline": false,
+															"text": "(from Interaction1)",
+															"horizontalAlignment": 2,
+															"verticalAlignment": 5,
+															"wordWrap": false
+														},
+														{
+															"_type": "LabelView",
+															"_id": "AAAAAAFjqCbCS5vNZUs=",
+															"_parent": {
+																"$ref": "AAAAAAFjqCbCSZvJ4ng="
+															},
+															"visible": false,
+															"enabled": true,
+															"lineColor": "#000000",
+															"fillColor": "#ffffff",
+															"fontColor": "#000000",
+															"font": "Helvetica;12;0",
+															"showShadow": true,
+															"containerChangeable": false,
+															"containerExtending": false,
+															"left": 0,
+															"top": 0,
+															"width": 0,
+															"height": 12,
+															"autoResize": false,
+															"underline": false,
+															"horizontalAlignment": 1,
+															"verticalAlignment": 5,
+															"wordWrap": false
+														}
+													],
+													"visible": true,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Helvetica;12;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 32,
+													"top": 40,
+													"width": 100,
+													"height": 40,
+													"autoResize": false,
+													"stereotypeLabel": {
+														"$ref": "AAAAAAFjqCbCSpvKaxs="
+													},
+													"nameLabel": {
+														"$ref": "AAAAAAFjqCbCSpvLXu8="
+													},
+													"namespaceLabel": {
+														"$ref": "AAAAAAFjqCbCSpvMWyQ="
+													},
+													"propertyLabel": {
+														"$ref": "AAAAAAFjqCbCS5vNZUs="
+													}
+												},
+												{
+													"_type": "UMLLinePartView",
+													"_id": "AAAAAAFjqCbCS5vOH9k=",
+													"_parent": {
+														"$ref": "AAAAAAFjqCbCSJvIsEM="
+													},
+													"model": {
+														"$ref": "AAAAAAFjqCbCSJvHDpo="
+													},
+													"visible": true,
+													"enabled": true,
+													"lineColor": "#000000",
+													"fillColor": "#ffffff",
+													"fontColor": "#000000",
+													"font": "Helvetica;12;0",
+													"showShadow": true,
+													"containerChangeable": false,
+													"containerExtending": false,
+													"left": 82,
+													"top": 80,
+													"width": 1,
+													"height": 160,
+													"autoResize": false
+												}
+											],
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 32,
+											"top": 40,
+											"width": 100,
+											"height": 200,
+											"autoResize": false,
+											"stereotypeDisplay": "label",
+											"showVisibility": true,
+											"showNamespace": false,
+											"showProperty": true,
+											"showType": true,
+											"nameCompartment": {
+												"$ref": "AAAAAAFjqCbCSZvJ4ng="
+											},
+											"wordWrap": false,
+											"linePart": {
+												"$ref": "AAAAAAFjqCbCS5vOH9k="
+											}
+										}
+									],
+									"showSequenceNumber": true,
+									"showSignature": true,
+									"showActivation": true
+								}
+							],
+							"visibility": "public",
+							"isReentrant": true,
+							"participants": [
+								{
+									"_type": "UMLLifeline",
+									"_id": "AAAAAAFjqCbCSJvHDpo=",
+									"_parent": {
+										"$ref": "AAAAAAFjqCY2kpu4n0I="
+									},
+									"name": "EventListener",
+									"visibility": "public",
+									"represent": {
+										"$ref": "AAAAAAFjqCbCR5vGwmU="
+									},
+									"isMultiInstance": false
+								}
+							]
+						}
+					],
+					"visibility": "public",
+					"attributes": [
+						{
+							"_type": "UMLAttribute",
+							"_id": "AAAAAAFjqCbCR5vGwmU=",
+							"_parent": {
+								"$ref": "AAAAAAFjqCY2j5u3ys8="
+							},
+							"name": "Role1",
+							"visibility": "public",
+							"isStatic": false,
+							"isLeaf": false,
+							"type": "",
+							"isReadOnly": false,
+							"isOrdered": false,
+							"isUnique": false,
+							"isDerived": false,
+							"aggregation": "none",
+							"isID": false
+						}
+					],
+					"isAbstract": false,
+					"isFinalSpecialization": false,
+					"isLeaf": false
+				},
+				{
+					"_type": "UMLUseCaseDiagram",
+					"_id": "AAAAAAFjuvxSC6RUg4A=",
+					"_parent": {
+						"$ref": "AAAAAAFF+qBWK6M3Z8Y="
+					},
+					"name": "CustomerUseCase",
+					"visible": true,
+					"defaultDiagram": false,
+					"ownedViews": [
+						{
+							"_type": "UMLUseCaseSubjectView",
+							"_id": "AAAAAAFjuv4gOKRa+jQ=",
+							"_parent": {
+								"$ref": "AAAAAAFjuvxSC6RUg4A="
+							},
+							"model": {
+								"$ref": "AAAAAAFjuv4gOKRYAw8="
+							},
+							"subViews": [
+								{
+									"_type": "UMLNameCompartmentView",
+									"_id": "AAAAAAFjuv4gOaRbEkE=",
+									"_parent": {
+										"$ref": "AAAAAAFjuv4gOKRa+jQ="
+									},
+									"model": {
+										"$ref": "AAAAAAFjuv4gOKRYAw8="
+									},
+									"subViews": [
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFjuv4gOaRczFQ=",
+											"_parent": {
+												"$ref": "AAAAAAFjuv4gOaRbEkE="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 0,
+											"top": 0,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFjuv4gOaRdgAQ=",
+											"_parent": {
+												"$ref": "AAAAAAFjuv4gOaRbEkE="
+											},
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;1",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 213,
+											"top": 39,
+											"width": 478,
+											"height": 12,
+											"autoResize": false,
+											"underline": false,
+											"text": "Notification Microservice",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFjuv4gOaReStM=",
+											"_parent": {
+												"$ref": "AAAAAAFjuv4gOaRbEkE="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 0,
+											"top": 0,
+											"width": 69,
+											"height": 12,
+											"autoResize": false,
+											"underline": false,
+											"text": "(from Model)",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFjuv4gOaRf7IE=",
+											"_parent": {
+												"$ref": "AAAAAAFjuv4gOaRbEkE="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 0,
+											"top": 0,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"underline": false,
+											"horizontalAlignment": 1,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 208,
+									"top": 32,
+									"width": 488,
+									"height": 24,
+									"autoResize": false,
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFjuv4gOaRczFQ="
+									},
+									"nameLabel": {
+										"$ref": "AAAAAAFjuv4gOaRdgAQ="
+									},
+									"namespaceLabel": {
+										"$ref": "AAAAAAFjuv4gOaReStM="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFjuv4gOaRf7IE="
+									}
+								}
+							],
+							"visible": true,
+							"enabled": true,
+							"lineColor": "#000000",
+							"fillColor": "#ffffff",
+							"fontColor": "#000000",
+							"font": "Helvetica;12;0",
+							"showShadow": true,
+							"containerChangeable": false,
+							"containerExtending": false,
+							"left": 208,
+							"top": 32,
+							"width": 488,
+							"height": 608,
+							"autoResize": false,
+							"stereotypeDisplay": "label",
+							"showVisibility": true,
+							"showNamespace": false,
+							"showProperty": true,
+							"showType": true,
+							"nameCompartment": {
+								"$ref": "AAAAAAFjuv4gOaRbEkE="
+							},
+							"wordWrap": false
+						},
+						{
+							"_type": "UMLActorView",
+							"_id": "AAAAAAFjuv6kb6R0A6g=",
+							"_parent": {
+								"$ref": "AAAAAAFjuvxSC6RUg4A="
+							},
+							"model": {
+								"$ref": "AAAAAAFjuv6kbaRyZy0="
+							},
+							"subViews": [
+								{
+									"_type": "UMLNameCompartmentView",
+									"_id": "AAAAAAFjuv6kcKR1JNo=",
+									"_parent": {
+										"$ref": "AAAAAAFjuv6kb6R0A6g="
+									},
+									"model": {
+										"$ref": "AAAAAAFjuv6kbaRyZy0="
+									},
+									"subViews": [
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFjuv6kcKR2baE=",
+											"_parent": {
+												"$ref": "AAAAAAFjuv6kcKR1JNo="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": -112,
+											"top": 352,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFjuv6kcaR3JSY=",
+											"_parent": {
+												"$ref": "AAAAAAFjuv6kcKR1JNo="
+											},
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;1",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 61,
+											"top": 341,
+											"width": 134,
+											"height": 12,
+											"autoResize": false,
+											"underline": false,
+											"text": "customer microservice",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFjuv6kcaR4LTc=",
+											"_parent": {
+												"$ref": "AAAAAAFjuv6kcKR1JNo="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": -112,
+											"top": 352,
+											"width": 69,
+											"height": 12,
+											"autoResize": false,
+											"underline": false,
+											"text": "(from Model)",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFjuv6kcaR5qOc=",
+											"_parent": {
+												"$ref": "AAAAAAFjuv6kcKR1JNo="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": -112,
+											"top": 352,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"underline": false,
+											"horizontalAlignment": 1,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 56,
+									"top": 334,
+									"width": 144,
+									"height": 24,
+									"autoResize": false,
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFjuv6kcKR2baE="
+									},
+									"nameLabel": {
+										"$ref": "AAAAAAFjuv6kcaR3JSY="
+									},
+									"namespaceLabel": {
+										"$ref": "AAAAAAFjuv6kcaR4LTc="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFjuv6kcaR5qOc="
+									}
+								},
+								{
+									"_type": "UMLAttributeCompartmentView",
+									"_id": "AAAAAAFjuv6kcqR6rvs=",
+									"_parent": {
+										"$ref": "AAAAAAFjuv6kb6R0A6g="
+									},
+									"model": {
+										"$ref": "AAAAAAFjuv6kbaRyZy0="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": -56,
+									"top": 176,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLOperationCompartmentView",
+									"_id": "AAAAAAFjuv6kcqR7HEk=",
+									"_parent": {
+										"$ref": "AAAAAAFjuv6kb6R0A6g="
+									},
+									"model": {
+										"$ref": "AAAAAAFjuv6kbaRyZy0="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": -56,
+									"top": 176,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLReceptionCompartmentView",
+									"_id": "AAAAAAFjuv6kc6R8FZ0=",
+									"_parent": {
+										"$ref": "AAAAAAFjuv6kb6R0A6g="
+									},
+									"model": {
+										"$ref": "AAAAAAFjuv6kbaRyZy0="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": -56,
+									"top": 176,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLTemplateParameterCompartmentView",
+									"_id": "AAAAAAFjuv6kdKR9/xc=",
+									"_parent": {
+										"$ref": "AAAAAAFjuv6kb6R0A6g="
+									},
+									"model": {
+										"$ref": "AAAAAAFjuv6kbaRyZy0="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": -56,
+									"top": 176,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								}
+							],
+							"visible": true,
+							"enabled": true,
+							"lineColor": "#000000",
+							"fillColor": "#ffffff",
+							"fontColor": "#000000",
+							"font": "Helvetica;12;0",
+							"showShadow": true,
+							"containerChangeable": true,
+							"containerExtending": false,
+							"left": 56,
+							"top": 280,
+							"width": 144,
+							"height": 79,
+							"autoResize": false,
+							"stereotypeDisplay": "label",
+							"showVisibility": true,
+							"showNamespace": false,
+							"showProperty": true,
+							"showType": true,
+							"nameCompartment": {
+								"$ref": "AAAAAAFjuv6kcKR1JNo="
+							},
+							"wordWrap": false,
+							"suppressAttributes": true,
+							"suppressOperations": true,
+							"suppressReceptions": true,
+							"showMultiplicity": true,
+							"showOperationSignature": true,
+							"attributeCompartment": {
+								"$ref": "AAAAAAFjuv6kcqR6rvs="
+							},
+							"operationCompartment": {
+								"$ref": "AAAAAAFjuv6kcqR7HEk="
+							},
+							"receptionCompartment": {
+								"$ref": "AAAAAAFjuv6kc6R8FZ0="
+							},
+							"templateParameterCompartment": {
+								"$ref": "AAAAAAFjuv6kdKR9/xc="
+							}
+						},
+						{
+							"_type": "UMLUseCaseView",
+							"_id": "AAAAAAFjuv/XzaSib0Y=",
+							"_parent": {
+								"$ref": "AAAAAAFjuvxSC6RUg4A="
+							},
+							"model": {
+								"$ref": "AAAAAAFjuv/XzKSgDcQ="
+							},
+							"subViews": [
+								{
+									"_type": "UMLNameCompartmentView",
+									"_id": "AAAAAAFjuv/XzqSjIc4=",
+									"_parent": {
+										"$ref": "AAAAAAFjuv/XzaSib0Y="
+									},
+									"model": {
+										"$ref": "AAAAAAFjuv/XzKSgDcQ="
+									},
+									"subViews": [
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFjuv/Xz6SkS8o=",
+											"_parent": {
+												"$ref": "AAAAAAFjuv/XzqSjIc4="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": -80,
+											"top": -96,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"underline": false,
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFjuv/X0KSlY0g=",
+											"_parent": {
+												"$ref": "AAAAAAFjuv/XzqSjIc4="
+											},
+											"visible": true,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;1",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": 330.5,
+											"top": 104,
+											"width": 92,
+											"height": 36,
+											"autoResize": false,
+											"underline": false,
+											"text": "Account Created Notification",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": true
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFjuv/X0KSmuPo=",
+											"_parent": {
+												"$ref": "AAAAAAFjuv/XzqSjIc4="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": -80,
+											"top": -96,
+											"width": 69,
+											"height": 12,
+											"autoResize": false,
+											"underline": false,
+											"text": "(from Model)",
+											"horizontalAlignment": 2,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										},
+										{
+											"_type": "LabelView",
+											"_id": "AAAAAAFjuv/X0KSnIG4=",
+											"_parent": {
+												"$ref": "AAAAAAFjuv/XzqSjIc4="
+											},
+											"visible": false,
+											"enabled": true,
+											"lineColor": "#000000",
+											"fillColor": "#ffffff",
+											"fontColor": "#000000",
+											"font": "Helvetica;12;0",
+											"showShadow": true,
+											"containerChangeable": false,
+											"containerExtending": false,
+											"left": -80,
+											"top": -96,
+											"width": 0,
+											"height": 12,
+											"autoResize": false,
+											"underline": false,
+											"horizontalAlignment": 1,
+											"verticalAlignment": 5,
+											"wordWrap": false
+										}
+									],
+									"visible": true,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": 325.5,
+									"top": 97,
+									"width": 102,
+									"height": 48,
+									"autoResize": false,
+									"stereotypeLabel": {
+										"$ref": "AAAAAAFjuv/Xz6SkS8o="
+									},
+									"nameLabel": {
+										"$ref": "AAAAAAFjuv/X0KSlY0g="
+									},
+									"namespaceLabel": {
+										"$ref": "AAAAAAFjuv/X0KSmuPo="
+									},
+									"propertyLabel": {
+										"$ref": "AAAAAAFjuv/X0KSnIG4="
+									}
+								},
+								{
+									"_type": "UMLAttributeCompartmentView",
+									"_id": "AAAAAAFjuv/X0aSocII=",
+									"_parent": {
+										"$ref": "AAAAAAFjuv/XzaSib0Y="
+									},
+									"model": {
+										"$ref": "AAAAAAFjuv/XzKSgDcQ="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": -40,
+									"top": -48,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLOperationCompartmentView",
+									"_id": "AAAAAAFjuv/X0qSpfns=",
+									"_parent": {
+										"$ref": "AAAAAAFjuv/XzaSib0Y="
+									},
+									"model": {
+										"$ref": "AAAAAAFjuv/XzKSgDcQ="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": -40,
+									"top": -48,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLReceptionCompartmentView",
+									"_id": "AAAAAAFjuv/X0qSqNoc=",
+									"_parent": {
+										"$ref": "AAAAAAFjuv/XzaSib0Y="
+									},
+									"model": {
+										"$ref": "AAAAAAFjuv/XzKSgDcQ="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": -40,
+									"top": -48,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLTemplateParameterCompartmentView",
+									"_id": "AAAAAAFjuv/X06Sr5DM=",
+									"_parent": {
+										"$ref": "AAAAAAFjuv/XzaSib0Y="
+									},
+									"model": {
+										"$ref": "AAAAAAFjuv/XzKSgDcQ="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": -40,
+									"top": -48,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								},
+								{
+									"_type": "UMLExtensionPointCompartmentView",
+									"_id": "AAAAAAFjuv/X1KSsXMU=",
+									"_parent": {
+										"$ref": "AAAAAAFjuv/XzaSib0Y="
+									},
+									"model": {
+										"$ref": "AAAAAAFjuv/XzKSgDcQ="
+									},
+									"visible": false,
+									"enabled": true,
+									"lineColor": "#000000",
+									"fillColor": "#ffffff",
+									"fontColor": "#000000",
+									"font": "Helvetica;12;0",
+									"showShadow": true,
+									"containerChangeable": false,
+									"containerExtending": false,
+									"left": -40,
+									"top": -48,
+									"width": 10,
+									"height": 10,
+									"autoResize": false
+								}
+							],
+							"visible": true,
+							"enabled": true,
+							"lineColor": "#000000",
+							"fillColor": "#ffffff",
+							"fontColor": "#000000",
+							"font": "Helvetica;12;0",
+							"showShadow": true,
+							"containerChangeable": true,
+							"containerExtending": false,
+							"left": 304,
+							"top": 88,
+							"width": 145,
+							"height": 67,
+							"autoResize": false,
+							"stereotypeDisplay": "label",
+							"showVisibility": true,
+							"showNamespace": false,
+							"showProperty": true,
+							"showType": true,
+							"nameCompartment": {
+								"$ref": "AAAAAAFjuv/XzqSjIc4="
+							},
+							"wordWrap": true,
+							"suppressAttributes": true,
+							"suppressOperations": true,
+							"suppressReceptions": true,
+							"showMultiplicity": true,
+							"showOperationSignature": true,
+							"attributeCompartment": {
+								"$ref": "AAAAAAFjuv/X0aSocII="
+							},
+							"operationCompartment": {
+								"$ref": "AAAAAAFjuv/X0qSpfns="
+							},
+							"receptionCompartment": {
+								"$ref": "AAAAAAFjuv/X0qSqNoc="
+							},
+							"templateParameterCompartment": {
+								"$ref": "AAAAAAFjuv/X06Sr5DM="
+							},
+							"extensionPointCompartment": {
+								"$ref": "AAAAAAFjuv/X1KSsXMU="
+							}
+						}
+					]
+				},
+				{
+					"_type": "UMLUseCaseSubject",
+					"_id": "AAAAAAFjuv4gOKRYAw8=",
+					"_parent": {
+						"$ref": "AAAAAAFF+qBWK6M3Z8Y="
+					},
+					"name": "Notification Microservice",
+					"visibility": "public"
+				},
+				{
+					"_type": "UMLActor",
+					"_id": "AAAAAAFjuv6kbaRyZy0=",
+					"_parent": {
+						"$ref": "AAAAAAFF+qBWK6M3Z8Y="
+					},
+					"name": "customer microservice",
+					"visibility": "public",
+					"isAbstract": false,
+					"isFinalSpecialization": false,
+					"isLeaf": false
+				},
+				{
+					"_type": "UMLUseCase",
+					"_id": "AAAAAAFjuv/XzKSgDcQ=",
+					"_parent": {
+						"$ref": "AAAAAAFF+qBWK6M3Z8Y="
+					},
+					"name": "Account Created Notification",
+					"visibility": "public",
+					"isAbstract": false,
+					"isFinalSpecialization": false,
+					"isLeaf": false
+				}
+			],
+			"visibility": "public"
+		}
+	]
+}
\ No newline at end of file