You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@fineract.apache.org by GitBox <gi...@apache.org> on 2018/11/16 11:56:14 UTC

[GitHub] ShruthiRajaram closed pull request #409: GSOC'17:swagger and swagger UI integration on fineract-provider

ShruthiRajaram closed pull request #409: GSOC'17:swagger and swagger UI integration on fineract-provider
URL: https://github.com/apache/fineract/pull/409
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/fineract-provider/build.gradle b/fineract-provider/build.gradle
index 5a2b8b31c..2ddf09c36 100644
--- a/fineract-provider/build.gradle
+++ b/fineract-provider/build.gradle
@@ -109,7 +109,9 @@ rat {
 	'**/*.iml',
 	//Notice files
 	'**/NOTICE_RELEASE',
-	'**/NOTICE_SOURCE',	
+	'**/NOTICE_SOURCE',
+    // Swagger License
+    '**/fineract-provider/src/main/resources/swagger-ui/*.*',
     // gradle
     '**/.gradle/**',
     '**/gradlew',
diff --git a/fineract-provider/dependencies.gradle b/fineract-provider/dependencies.gradle
index 27a256c4b..3ceb54df6 100644
--- a/fineract-provider/dependencies.gradle
+++ b/fineract-provider/dependencies.gradle
@@ -91,10 +91,12 @@ dependencies {
                 [group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.3.5'],
                 // Once we've switched to Java 8 this dep can be removed.
                 //[group: 'com.google.code.findbugs', name: 'jsr305', version: '3.0.0']
+
+                [group: 'io.swagger', name: 'swagger-jersey-jaxrs', version: '1.5.15'],
                 [group: 'org.springframework', name:'spring-jms'],
                 [group: 'org.apache.activemq', name: 'activemq-broker']
+    )
 
-     )
      testCompile 'junit:junit:4.11',
                  'junit:junit-dep:4.11',
                  'org.mockito:mockito-core:1.9.5',
diff --git a/fineract-provider/dev-dependencies.gradle b/fineract-provider/dev-dependencies.gradle
index 710314d0d..325a1a20a 100644
--- a/fineract-provider/dev-dependencies.gradle
+++ b/fineract-provider/dev-dependencies.gradle
@@ -90,9 +90,12 @@ dependencies {
                 [group: 'org.apache.httpcomponents', name: 'httpclient', version: '4.3.5'],
                 // Once we've switched to Java 8 this dep can be removed.
                 //[group: 'com.google.code.findbugs', name: 'jsr305', version: '3.0.0']
+
+                [group: 'io.swagger', name: 'swagger-jersey-jaxrs', version: '1.5.15'],
                 [group: 'org.springframework', name:'spring-jms'],
                 [group: 'org.apache.activemq', name: 'activemq-broker']
-     )
+    )
+
      testCompile 'junit:junit:4.11',
                  'junit:junit-dep:4.11',
                  'org.mockito:mockito-core:1.9.5',
diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/accrual/api/AccrualAccountingApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/accounting/accrual/api/AccrualAccountingApiResource.java
index 489ebc48f..63d3693a2 100755
--- a/fineract-provider/src/main/java/org/apache/fineract/accounting/accrual/api/AccrualAccountingApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/accounting/accrual/api/AccrualAccountingApiResource.java
@@ -24,6 +24,8 @@
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 
+import io.swagger.annotations.*;
+// import org.apache.fineract.accounting.accrual.swagger.runaccuralPost;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
 import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
@@ -36,6 +38,7 @@
 @Path("/runaccruals")
 @Component
 @Scope("singleton")
+@Api(value = "Periodic Accrual Accounting", description = "Periodic Accrual is to accrue the loan income till the specific date or till batch job scheduled time.\n\n ")
 public class AccrualAccountingApiResource {
 
     private final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService;
@@ -52,7 +55,10 @@ public AccrualAccountingApiResource(final DefaultToApiJsonSerializer<String> api
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String executePeriodicAccrualAccounting(final String jsonRequestBody) {
+    @ApiOperation(value = "Executes Periodic Accrual Accounting", httpMethod = "POST", notes = "Mandatory Fields\n" + "\n" + "tillDate\n")
+    @ApiImplicitParams({@ApiImplicitParam(paramType = "body", required = true, type = "body", dataTypeClass = AccrualAccountingApiResourceSwagger.PostRunaccrualsRequest.class, value = "Request Body\n" + "\n" + "Field Descriptions: \n" + "tillDate: \n" + "which specifies periodic accruals should happen till the given Date" )})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK")})
+    public String executePeriodicAccrualAccounting( @ApiParam(hidden = true) final String jsonRequestBody) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().excuteAccrualAccounting().withJson(jsonRequestBody).build();
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/accrual/api/AccrualAccountingApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/accounting/accrual/api/AccrualAccountingApiResourceSwagger.java
new file mode 100644
index 000000000..aee84ee4e
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/accounting/accrual/api/AccrualAccountingApiResourceSwagger.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.accounting.accrual.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * Created by sanyam on 24/7/17.
+ */
+final class AccrualAccountingApiResourceSwagger {
+    private AccrualAccountingApiResourceSwagger() {
+        // don't allow to instantiate; use only for live API documentation
+    }
+
+    @ApiModel(value = "runaccrualsRequest")
+    public static final class PostRunaccrualsRequest {
+        private PostRunaccrualsRequest() {
+            // don't allow to instantiate; use only for live API documentation
+        }
+
+        @ApiModelProperty(example = "en")
+        public String locale;
+        @ApiModelProperty(example = "dd MMMM yyyy")
+        public String dateFormat;
+        @ApiModelProperty(example = "04 June 2014", notes = "which specifies periodic accruals should happen till the given Date", required = true)
+        public String tillDate;
+    }
+
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/closure/api/GLClosuresApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/accounting/closure/api/GLClosuresApiResource.java
index 7fbf17f38..e57144fb9 100755
--- a/fineract-provider/src/main/java/org/apache/fineract/accounting/closure/api/GLClosuresApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/accounting/closure/api/GLClosuresApiResource.java
@@ -36,6 +36,7 @@
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.UriInfo;
 
+import io.swagger.annotations.*;
 import org.apache.fineract.accounting.closure.data.GLClosureData;
 import org.apache.fineract.accounting.closure.service.GLClosureReadPlatformService;
 import org.apache.fineract.commands.domain.CommandWrapper;
@@ -54,6 +55,7 @@
 @Path("/glclosures")
 @Component
 @Scope("singleton")
+@Api(value = "Accounting Closure", description = "An accounting closure indicates that no more journal entries may be logged (or reversed) in the system, either manually or via the portfolio with an entry date prior to the defined closure date\n" + "\n" + "Field Descriptions\n" + "closingDate\n" + "The date for which the accounting closure is defined\n" + "officeId\n" + "The identifer of the branch for which accounting has been closed\n" + "comments\n" + "Description associated with an Accounting closure")
 public class GLClosuresApiResource {
 
     private static final Set<String> RESPONSE_DATA_PARAMETERS = new HashSet<>(Arrays.asList("id", "officeId", "officeName",
@@ -85,7 +87,9 @@ public GLClosuresApiResource(final PlatformSecurityContext context, final GLClos
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveAllClosures(@Context final UriInfo uriInfo, @QueryParam("officeId") final Long officeId) {
+    @ApiOperation(value = "List Accounting closures", notes = "Example Requests:\n" + "\n" + "glclosures")
+    @ApiResponses({@ApiResponse(code = 200, response = GLClosuresApiResourceSwagger.GetGlClosureResponse.class, message = "", responseContainer = "list")})
+    public String retrieveAllClosures(@Context final UriInfo uriInfo, @QueryParam("officeId") @ApiParam(value = "officeId") final Long officeId) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermission);
         final List<GLClosureData> glClosureDatas = this.glClosureReadPlatformService.retrieveAllGLClosures(officeId);
@@ -98,7 +102,9 @@ public String retrieveAllClosures(@Context final UriInfo uriInfo, @QueryParam("o
     @Path("{glClosureId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retreiveClosure(@PathParam("glClosureId") final Long glClosureId, @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Retrieve an Accounting Closure", notes = "Example Requests:\n" + "\n" + "glclosures/1\n" + "\n" + "\n" + "/glclosures/1?fields=officeName,closingDate")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = GLClosuresApiResourceSwagger.GetGlClosureResponse.class)})
+    public String retreiveClosure(@PathParam("glClosureId") @ApiParam(value = "glClosureId") final Long glClosureId, @Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermission);
 
@@ -112,10 +118,14 @@ public String retreiveClosure(@PathParam("glClosureId") final Long glClosureId,
         return this.apiJsonSerializerService.serialize(settings, glClosureData, RESPONSE_DATA_PARAMETERS);
     }
 
+    // NOTE: proposal slight changes @Aleks
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String createGLClosure(final String jsonRequestBody) {
+    @ApiOperation(value = "Create an Accounting Closure", notes = "Mandatory Fields\n" + "officeId,closingDate")
+    @ApiImplicitParams({@ApiImplicitParam(paramType = "body", required = true, type = "body", dataTypeClass = GLClosuresApiResourceSwagger.PostGlClosuresRequest.class, value = "Request Body")})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = GLClosuresApiResourceSwagger.PostGlClosuresResponse.class)})
+    public String createGLClosure(@ApiParam(hidden = true) final String jsonRequestBody) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().createGLClosure().withJson(jsonRequestBody).build();
 
@@ -128,7 +138,10 @@ public String createGLClosure(final String jsonRequestBody) {
     @Path("{glClosureId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String updateGLClosure(@PathParam("glClosureId") final Long glClosureId, final String jsonRequestBody) {
+    @ApiOperation(value = "Update an Accounting closure", notes = "Once an accounting closure is created, only the comments associated with it may be edited")
+    @ApiImplicitParams({@ApiImplicitParam(paramType = "body", value = "Request body", dataType = "body", dataTypeClass = GLClosuresApiResourceSwagger.PutGlClosuresRequest.class, required = true)})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = GLClosuresApiResourceSwagger.PutGlClosuresResponse.class)})
+    public String updateGLClosure(@PathParam("glClosureId") @ApiParam(value = "glClosureId") final Long glClosureId, @ApiParam(hidden = true) final String jsonRequestBody) {
         final CommandWrapper commandRequest = new CommandWrapperBuilder().updateGLClosure(glClosureId).withJson(jsonRequestBody).build();
 
         final CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
@@ -140,7 +153,9 @@ public String updateGLClosure(@PathParam("glClosureId") final Long glClosureId,
     @Path("{glClosureId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String deleteGLClosure(@PathParam("glClosureId") final Long glClosureId) {
+    @ApiOperation(value = "Delete an accounting closure", notes = "Note: Only the latest accounting closure associated with a branch may be deleted.")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = GLClosuresApiResourceSwagger.DeleteGlClosuresResponse.class)})
+    public String deleteGLClosure(@PathParam("glClosureId") @ApiParam(value = "glclosureId") final Long glClosureId) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().deleteGLClosure(glClosureId).build();
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/closure/api/GLClosuresApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/accounting/closure/api/GLClosuresApiResourceSwagger.java
new file mode 100755
index 000000000..704eb76bd
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/accounting/closure/api/GLClosuresApiResourceSwagger.java
@@ -0,0 +1,133 @@
+/**
+ * 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.accounting.closure.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.joda.time.LocalDate;
+
+import java.lang.reflect.Array;
+import java.util.ArrayList;
+
+final class GLClosuresApiResourceSwagger {
+    private GLClosuresApiResourceSwagger() {
+        // don't allow to instantiate; use only for live API documentation
+    }
+
+    /**
+     * TODO: describe where this belongs: {@link GLClosuresApiResource }
+     * {@Link GLClosuresApiResource}
+     */
+    // Check !!
+
+    @ApiModel(value = "GetGLClosureResponse")
+    public static final class GetGlClosureResponse {
+        private GetGlClosureResponse() {
+            // dont allow to initiatiate
+        }
+
+        @ApiModelProperty(example = "7")
+        public Long id;
+        @ApiModelProperty(example = "1")
+        public Long officeId;
+        @ApiModelProperty(example = "Head Office")
+        public String officeName;
+        @ApiModelProperty(example = "2013,1,2")
+        public LocalDate closingDate;
+        @ApiModelProperty(example = "false")
+        public boolean deleted;
+        @ApiModelProperty(example = "2013,1,3")
+        public LocalDate createdDate;
+        @ApiModelProperty(example = "2013,1,3")
+        public LocalDate lastUpdatedDate;
+        @ApiModelProperty(example = "1")
+        public Long createdByUserId;
+        @ApiModelProperty(example = "mifos")
+        public String createdByUsername;
+        @ApiModelProperty(example = "1")
+        public Long lastUpdatedByUserId;
+        @ApiModelProperty(example = "mifos")
+        public String lastUpdatedByUsername;
+        @ApiModelProperty(example = "closed")
+        public String comments;
+
+    }
+
+    @ApiModel(value = "PostGLCLosuresRequest")
+    public static final class PostGlClosuresRequest {
+        private PostGlClosuresRequest() {
+            // don't allow to instantiate; use only for live API documentation
+        }
+        @ApiModelProperty(example = "1")
+        public Long officeId;
+        @ApiModelProperty(example = "06 December 2012")
+        public LocalDate closingDate;
+        @ApiModelProperty(example = "The accountants are heading for a carribean vacation")
+        public String comments;
+        @ApiModelProperty(example = "en")
+        public String locale;
+        @ApiModelProperty(example = "dd MMMM yyyy")
+        public String dateFormat;
+    }
+
+    @ApiModel(value = "PostGlClosuresResponse")
+    public static final class PostGlClosuresResponse {
+        private PostGlClosuresResponse() {
+            // don't allow to instantiate; use only for live API documentation
+        }
+        @ApiModelProperty(example = "1")
+        public Long officeId;
+        @ApiModelProperty(example = "9")
+        public Long resourceId;
+    }
+
+    @ApiModel(value = "PutGlClosuresRequest")
+    public static final class PutGlClosuresRequest {
+        private PutGlClosuresRequest() {
+            // don't allow to instantiate; use only for live API documentation
+        }
+        @ApiModelProperty(example = "All transactions verified by Johnny Cash")
+        public String comments;
+    }
+
+    @ApiModel(value = "PutGlClosuresResponse")
+    public static final class PutGlClosuresResponse{
+        private PutGlClosuresResponse() {
+            // don't allow to instantiate; use only for live API documentation
+        }
+        @ApiModelProperty(example = "1")
+        public Long officeId;
+        @ApiModelProperty(example = "9")
+        public Long resourceId;
+        @ApiModelProperty(example = "All transactions verified by Johnny Cash")
+        public String comments;
+    }
+
+    @ApiModel(value = "DeleteGlClosuresResponse")
+    public static final class DeleteGlClosuresResponse{
+        private DeleteGlClosuresResponse(){
+
+        }
+
+        @ApiModelProperty(example = "1")
+        public Long officeId;
+        @ApiModelProperty(example = "9")
+        public Long resourceId;
+    }
+}
\ No newline at end of file
diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/financialactivityaccount/api/FinancialActivityAccountsApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/accounting/financialactivityaccount/api/FinancialActivityAccountsApiResource.java
index 19a94fad3..08d8557cc 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/accounting/financialactivityaccount/api/FinancialActivityAccountsApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/accounting/financialactivityaccount/api/FinancialActivityAccountsApiResource.java
@@ -32,7 +32,9 @@
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.UriInfo;
 
+import io.swagger.annotations.*;
 import org.apache.fineract.accounting.financialactivityaccount.data.FinancialActivityAccountData;
+import org.apache.fineract.accounting.financialactivityaccount.data.FinancialActivityData;
 import org.apache.fineract.accounting.financialactivityaccount.service.FinancialActivityAccountReadPlatformService;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
@@ -49,6 +51,7 @@
 @Path("/financialactivityaccounts")
 @Component
 @Scope("singleton")
+@Api(value = "Mapping Financial Activities to Accounts", description = "Organization Level Financial Activities like Asset and Liability Transfer can be mapped to GL Account. Integrated accounting takes these accounts into consideration when an Account transfer is made between a savings to loan/savings account and vice-versa\n" + "\n" +"\nField Descriptions\n" +"financialActivityId\n" +"The identifier of the Financial Activity\n" +"glAccountId\n" +"The identifier of a GL Account ( Ledger Account) which shall be used as the default account for the selected Financial Activity")
 public class FinancialActivityAccountsApiResource {
 
     private final FinancialActivityAccountReadPlatformService financialActivityAccountReadPlatformService;
@@ -89,6 +92,8 @@ public String retrieveTemplate(@Context final UriInfo uriInfo) {
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
+    @ApiOperation(value = "List Financial Activities to Accounts Mappings", notes = "Example Requests:\n" + "\n" + "financialactivityaccounts")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = FinancialActivityAccountsApiResourceSwagger.GetFinancialActivityAccountsResponse.class, responseContainer = "list" )})
     public String retrieveAll(@Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(FinancialActivityAccountsConstants.resourceNameForPermission);
@@ -103,7 +108,9 @@ public String retrieveAll(@Context final UriInfo uriInfo) {
     @Path("{mappingId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retreive(@PathParam("mappingId") final Long mappingId, @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Retrieve a Financial Activity to Account Mapping\n", notes = "Example Requests:\n" + "\n" + "financialactivityaccounts/1")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = FinancialActivityAccountsApiResourceSwagger.GetFinancialActivityAccountsResponse.class)})
+    public String retreive(@PathParam("mappingId") @ApiParam(value = "mappingId") final Long mappingId, @Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(FinancialActivityAccountsConstants.resourceNameForPermission);
 
@@ -121,7 +128,10 @@ public String retreive(@PathParam("mappingId") final Long mappingId, @Context fi
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String createGLAccount(final String jsonRequestBody) {
+    @ApiOperation(value = "Create a new Financial Activity to Accounts Mapping", notes = "Mandatory Fields\n" + "financialActivityId, glAccountId")
+    @ApiImplicitParams({@ApiImplicitParam(value = "Request body", paramType = "body", dataType = "body", dataTypeClass = FinancialActivityAccountsApiResourceSwagger.PostFinancialActivityAccountsRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = FinancialActivityAccountsApiResourceSwagger.PostFinancialActivityAccountsResponse.class)})
+    public String createGLAccount(@ApiParam(hidden = true) final String jsonRequestBody) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().createOfficeToGLAccountMapping().withJson(jsonRequestBody)
                 .build();
@@ -135,7 +145,10 @@ public String createGLAccount(final String jsonRequestBody) {
     @Path("{mappingId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String updateGLAccount(@PathParam("mappingId") final Long mappingId, final String jsonRequestBody) {
+    @ApiOperation(value = "Update a Financial Activity to Account Mapping", notes = "the API updates the Ledger account linked to a Financial Activity \n")
+    @ApiImplicitParams({@ApiImplicitParam(value = "Request body", dataType = "body", paramType = "body", dataTypeClass = FinancialActivityAccountsApiResourceSwagger.PostFinancialActivityAccountsRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = FinancialActivityAccountsApiResourceSwagger.PutFinancialActivityAccountsResponse.class)})
+    public String updateGLAccount(@PathParam("mappingId") @ApiParam(value = "mappingId") final Long mappingId, @ApiParam(hidden = true) final String jsonRequestBody) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().updateOfficeToGLAccountMapping(mappingId)
                 .withJson(jsonRequestBody).build();
@@ -149,7 +162,9 @@ public String updateGLAccount(@PathParam("mappingId") final Long mappingId, fina
     @Path("{mappingId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String deleteGLAccount(@PathParam("mappingId") final Long mappingId) {
+    @ApiOperation(value = "Delete a Financial Activity to Account Mapping")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = FinancialActivityAccountsApiResourceSwagger.DeleteFinancialActivityAccountsResponse.class)})
+    public String deleteGLAccount(@PathParam("mappingId") @ApiParam(value = "mappingId") final Long mappingId) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().deleteOfficeToGLAccountMapping(mappingId).build();
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/financialactivityaccount/api/FinancialActivityAccountsApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/accounting/financialactivityaccount/api/FinancialActivityAccountsApiResourceSwagger.java
new file mode 100644
index 000000000..21033c9e9
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/accounting/financialactivityaccount/api/FinancialActivityAccountsApiResourceSwagger.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.accounting.financialactivityaccount.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.fineract.accounting.financialactivityaccount.data.FinancialActivityData;
+import org.apache.fineract.accounting.glaccount.data.GLAccountData;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by sanyam on 24/7/17.
+ */
+final class FinancialActivityAccountsApiResourceSwagger {
+    private FinancialActivityAccountsApiResourceSwagger() {
+    }
+
+    @ApiModel(value = "GetFinancialActivityAccountsResponse")
+    public static final class GetFinancialActivityAccountsResponse{
+        private GetFinancialActivityAccountsResponse() {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long id;
+        public FinancialActivityData financialActivityData;
+        public GLAccountData glAccountData;
+
+    }
+
+    @ApiModel(value = "PostFinancialActivityAccountsRequest")
+    public static final class PostFinancialActivityAccountsRequest{
+        private PostFinancialActivityAccountsRequest() {
+
+        }
+        @ApiModelProperty(example = "200")
+        public Long financialActivityId;
+        @ApiModelProperty(example = "2")
+        public Long glAccountId;
+    }
+
+    @ApiModel(value = "PostFinancialActivityAccountsResponse")
+    public static final class PostFinancialActivityAccountsResponse{
+        private PostFinancialActivityAccountsResponse() {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long resourceId;
+    }
+
+    @ApiModel(value = "PutFinancialActivityAccountsRequest")
+    public static final class PutFinancialActivityAccountsRequest{
+        private PutFinancialActivityAccountsRequest() {
+
+        }
+        @ApiModelProperty(example = "200")
+        public Long financialActivityId;
+        @ApiModelProperty(example = "3")
+        public Long glAccountId;
+    }
+
+    @ApiModel(value = "PutFinancialActivityAccountsResponse")
+    public static final class PutFinancialActivityAccountsResponse{
+        private PutFinancialActivityAccountsResponse() {
+
+        }
+        public final class PutFinancialActivityAccountscommentsSwagger{
+            private PutFinancialActivityAccountscommentsSwagger(){}
+            @ApiModelProperty(example = "1")
+            public Long glAccountId;
+        }
+        @ApiModelProperty(example = "1")
+        public Long resourceId;
+        public PutFinancialActivityAccountscommentsSwagger comments;
+    }
+
+    @ApiModel(value = "DeleteFinancialActivityAccountsResponse")
+    public static final class DeleteFinancialActivityAccountsResponse{
+        private DeleteFinancialActivityAccountsResponse() {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long resourceId;
+    }
+
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/glaccount/api/GLAccountsApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/accounting/glaccount/api/GLAccountsApiResource.java
index 5e3be9dcd..f911b7c32 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/accounting/glaccount/api/GLAccountsApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/accounting/glaccount/api/GLAccountsApiResource.java
@@ -39,6 +39,8 @@
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
 
+import io.swagger.annotations.*;
+import io.swagger.models.parameters.HeaderParameter;
 import com.sun.jersey.core.header.FormDataContentDisposition;
 import com.sun.jersey.multipart.FormDataParam;
 import org.apache.fineract.accounting.common.AccountingConstants;
@@ -68,6 +70,7 @@
 @Path("/glaccounts")
 @Component
 @Scope("singleton")
+@Api(value = "General Ledger Account", description = "Ledger accounts represent an Individual account within an Organizations Chart Of Accounts(COA) and are assigned a name and unique number by which they can be identified. \n" + "All transactions relating to a company's assets, liabilities, owners' equity, revenue and expenses are recorded against these accounts")
 public class GLAccountsApiResource {
 
     private static final Set<String> RESPONSE_DATA_PARAMETERS = new HashSet<>(Arrays.asList("id", "name", "parentId", "glCode",
@@ -113,7 +116,9 @@ public GLAccountsApiResource(final PlatformSecurityContext context, final GLAcco
     @Path("template")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveNewAccountDetails(@Context final UriInfo uriInfo, @QueryParam("type") final Integer type) {
+    @ApiOperation(value = "Retrieve GL Accounts Template", notes = "This is a convenience resource. It can be useful when building maintenance user interface screens for client applications. The template data returned consists of any or all of:\n" + "\n" + "Field Defaults\n" + "Allowed Value Lists\n" + "Example Request:\n" + "\n" + "glaccounts/template\n" + "glaccounts/template?type=1\n" + "\n" + "type is optional and integer value from 1 to 5.\n" + "\n" + "1.Assets \n" + "2.Liabilities \n" + "3.Equity \n" + "4.Income \n" + "5.Expenses")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = GLAccountsApiResourceSwagger.GetGLAccountsTemplateResponse.class)})
+    public String retrieveNewAccountDetails(@Context final UriInfo uriInfo, @QueryParam("type") @ApiParam(value = "type") final Integer type) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermission);
 
@@ -127,10 +132,12 @@ public String retrieveNewAccountDetails(@Context final UriInfo uriInfo, @QueryPa
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveAllAccounts(@Context final UriInfo uriInfo, @QueryParam("type") final Integer type,
-            @QueryParam("searchParam") final String searchParam, @QueryParam("usage") final Integer usage,
-            @QueryParam("manualEntriesAllowed") final Boolean manualEntriesAllowed, @QueryParam("disabled") final Boolean disabled,
-            @QueryParam("fetchRunningBalance") final boolean runningBalance) {
+    @ApiOperation(value = "List General Ledger Accounts", notes = "ARGUMENTS\n" + "type Integer optional manualEntriesAllowed boolean optional usage Integer optional disabled boolean optional parentId Long optional tagId Long optional\n" + "Example Requests:\n" + "\n" + "glaccounts\n" + "\n" + "\n" + "glaccounts?type=1&manualEntriesAllowed=true&usage=1&disabled=false\n" + "\n" + "glaccounts?fetchRunningBalance=true")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = GLAccountsApiResourceSwagger.GetGLAccountsResponse.class, responseContainer = "list")})
+    public String retrieveAllAccounts(@Context final UriInfo uriInfo, @QueryParam("type") @ApiParam(value = "type") final Integer type,
+            @QueryParam("searchParam") @ApiParam(value = "searchParam") final String searchParam, @QueryParam("usage") @ApiParam(value = "usage") final Integer usage,
+            @QueryParam("manualEntriesAllowed") @ApiParam(value = "manualEntriesAllowed") final Boolean manualEntriesAllowed, @QueryParam("disabled") @ApiParam(value = "disabled") final Boolean disabled,
+            @QueryParam("fetchRunningBalance") @ApiParam(value = "fetchRunningBalance") final boolean runningBalance) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermission);
         JournalEntryAssociationParametersData associationParametersData = new JournalEntryAssociationParametersData(false, runningBalance);
@@ -145,8 +152,10 @@ public String retrieveAllAccounts(@Context final UriInfo uriInfo, @QueryParam("t
     @Path("{glAccountId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retreiveAccount(@PathParam("glAccountId") final Long glAccountId, @Context final UriInfo uriInfo,
-            @QueryParam("fetchRunningBalance") final boolean runningBalance) {
+    @ApiOperation(value = "Retrieve a General Ledger Account", notes = "Example Requests:\n" + "\n" + "glaccounts/1\n" + "\n" + "\n" + "glaccounts/1?template=true\n" + "\n" + "\n" + "glaccounts/1?fields=name,glCode\n" + "\n" + "\n" + "glaccounts/1?fetchRunningBalance=true")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = GLAccountsApiResourceSwagger.GetGLAccountsResponse.class)})
+    public String retreiveAccount(@PathParam("glAccountId") @ApiParam(value = "glAccountId") final Long glAccountId, @Context final UriInfo uriInfo,
+            @QueryParam("fetchRunningBalance") @ApiParam(value = "fetchRunningBalance") final boolean runningBalance) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermission);
 
@@ -163,7 +172,10 @@ public String retreiveAccount(@PathParam("glAccountId") final Long glAccountId,
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String createGLAccount(final String jsonRequestBody) {
+    @ApiOperation(value = "Create a General Ledger Account", notes = "Note: You may optionally create Hierarchical Chart of Accounts by using the \"parentId\" property of an Account\n" + "Mandatory Fields: \n" + "name, glCode, type, usage and manualEntriesAllowed")
+    @ApiImplicitParams({@ApiImplicitParam(paramType = "body", value = "body", dataType = "body", dataTypeClass = GLAccountsApiResourceSwagger.PostGLAccountsRequest.class )})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = GLAccountsApiResourceSwagger.PostGLAccountsResponse.class)})
+    public String createGLAccount(@ApiParam(hidden = true) final String jsonRequestBody) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().createGLAccount().withJson(jsonRequestBody).build();
 
@@ -176,7 +188,10 @@ public String createGLAccount(final String jsonRequestBody) {
     @Path("{glAccountId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String updateGLAccount(@PathParam("glAccountId") final Long glAccountId, final String jsonRequestBody) {
+    @ApiOperation(value = "Update an Accounting closure", notes = "Once an accounting closure is created, only the comments associated with it may be edited\n" + "\n")
+    @ApiImplicitParams({@ApiImplicitParam(paramType = "body", value = "body", dataType = "body", dataTypeClass = GLAccountsApiResourceSwagger.PutGLAccountsRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = GLAccountsApiResourceSwagger.PutGLAccountsResponse.class)})
+    public String updateGLAccount(@PathParam("glAccountId") @ApiParam(value = "glAccountId") final Long glAccountId, @ApiParam(hidden = true) final String jsonRequestBody) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().updateGLAccount(glAccountId).withJson(jsonRequestBody).build();
 
@@ -189,7 +204,9 @@ public String updateGLAccount(@PathParam("glAccountId") final Long glAccountId,
     @Path("{glAccountId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String deleteGLAccount(@PathParam("glAccountId") final Long glAccountId) {
+    @ApiOperation(value = "Delete an accounting closure", notes = "Note: Only the latest accounting closure associated with a branch may be deleted.")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = GLAccountsApiResourceSwagger.DeleteGLAccountsRequest.class)})
+    public String deleteGLAccount(@PathParam("glAccountId") @ApiParam(value = "glAccountId") final Long glAccountId) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().deleteGLAccount(glAccountId).build();
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/glaccount/api/GLAccountsApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/accounting/glaccount/api/GLAccountsApiResourceSwagger.java
new file mode 100644
index 000000000..e546d6e64
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/accounting/glaccount/api/GLAccountsApiResourceSwagger.java
@@ -0,0 +1,190 @@
+/**
+ * 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.accounting.glaccount.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.fineract.accounting.glaccount.data.GLAccountData;
+import org.apache.fineract.infrastructure.codes.data.CodeValueData;
+import org.apache.fineract.infrastructure.core.data.EnumOptionData;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Created by sanyam on 24/7/17.
+ */
+final class GLAccountsApiResourceSwagger {
+    private GLAccountsApiResourceSwagger() {
+
+    }
+
+    @ApiModel(value = "GetGLAccountsResponse")
+    public static final class GetGLAccountsResponse{
+        private GetGLAccountsResponse(){
+
+        }
+
+        @ApiModelProperty(example = "16")
+        public Long id;
+
+        @ApiModelProperty(example = "Cash")
+        public String name;
+
+        @ApiModelProperty(example = "1")
+        public Long parentId;
+
+        @ApiModelProperty(example = "100001")
+        public String glCode;
+
+        @ApiModelProperty(example = "false")
+        public Boolean disabled;
+
+        @ApiModelProperty(example = "true")
+        public Boolean manualEntriesAllowed;
+
+        public EnumOptionData type;
+        public EnumOptionData usage;
+
+        @ApiModelProperty(example = "Desc")
+        public String description;
+
+        @ApiModelProperty(example = "....Cash")
+        public String nameDecorated;
+
+        public CodeValueData tagId;
+
+        @ApiModelProperty(example = "118437")
+        public Long organizationRunningBalance;
+    }
+
+    @ApiModel(value = "GetGLAccountsTemplateResponse")
+    public static final class GetGLAccountsTemplateResponse{
+        private GetGLAccountsTemplateResponse(){
+
+        }
+
+        @ApiModelProperty(example = "false")
+        public Boolean disabled;
+
+        @ApiModelProperty(example = "true")
+        public Boolean manualEntriesAllowed;
+
+        public EnumOptionData type;
+        public EnumOptionData usage;
+        public List<EnumOptionData> accountTypeOptions;
+        public List<EnumOptionData> usageOptions;
+        public List<GLAccountData> assetHeaderAccountOptions;
+        public List<GLAccountData> liabilityHeaderAccountOptions;
+        public List<GLAccountData> equityHeaderAccountOptions;
+        public List<GLAccountData> expenseHeaderAccountOptions;
+        public Collection<CodeValueData> allowedAssetsTagOptions;
+        public Collection<CodeValueData> allowedLiabilitiesTagOptions;
+        public Collection<CodeValueData> allowedEquityTagOptions;
+        public Collection<CodeValueData> allowedIncomeTagOptions;
+        public Collection<CodeValueData> allowedExpensesTagOptions;
+
+    }
+
+    @ApiModel(value = "PostGLAccountsRequest")
+    public static final class PostGLAccountsRequest{
+        private PostGLAccountsRequest(){
+
+        }
+
+        @ApiModelProperty(example = "Cash at Bangalore")
+        public String name;
+
+        @ApiModelProperty(example = "100001")
+        public String glCode;
+
+        @ApiModelProperty(example = "true")
+        public Boolean manualEntriesAllowed;
+
+        @ApiModelProperty(example = "1")
+        public String type;
+
+        @ApiModelProperty(example = "10")
+        public String tagId;
+
+        @ApiModelProperty(example = "1")
+        public Long parentId;
+
+        @ApiModelProperty(example = "1")
+        public EnumOptionData usage;
+
+        @ApiModelProperty(example = "Desc")
+        public String description;
+
+    }
+
+    @ApiModel(value = "PostGLAccountsResponse")
+    public static final class PostGLAccountsResponse{
+        private PostGLAccountsResponse() {
+
+        }
+
+        @ApiModelProperty(example = "22")
+        public int resourceId;
+    }
+
+    @ApiModel(value = "PutGLAccountsRequest")
+    public static final class PutGLAccountsRequest{
+        private PutGLAccountsRequest() {
+
+        }
+
+        @ApiModelProperty(example = "Cash at Bangalore")
+        public String name;
+    }
+
+    @ApiModel(value = "PutGLAccountsResponse")
+    public static final class PutGLAccountsResponse{
+        private PutGLAccountsResponse() {
+
+        }
+        @ApiModel
+        public static final class PutGLAccountsResponsechangesSwagger{
+            private PutGLAccountsResponsechangesSwagger(){}
+            @ApiModelProperty(example = "Cash at Bangalore")
+            public String name;
+        }
+        @ApiModelProperty(example = "1")
+        public int resourceId;
+        public PutGLAccountsResponsechangesSwagger changes;
+    }
+
+    @ApiModel(value = "DeleteGLAccountsRequest")
+    public static final class DeleteGLAccountsRequest{
+        private DeleteGLAccountsRequest() {
+
+        }
+
+        private static final class DeleteGLAccountsRequestchangesSwagger{
+            private DeleteGLAccountsRequestchangesSwagger(){}
+
+        }
+
+        @ApiModelProperty(example = "1")
+        public int resourceId;
+
+        private DeleteGLAccountsRequestchangesSwagger changes;
+    }
+
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/api/JournalEntriesApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/api/JournalEntriesApiResource.java
index afc64055a..be2180004 100755
--- a/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/api/JournalEntriesApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/api/JournalEntriesApiResource.java
@@ -36,9 +36,12 @@
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
 
+import io.swagger.annotations.*;
 import com.sun.jersey.core.header.FormDataContentDisposition;
 import com.sun.jersey.multipart.FormDataParam;
 import org.apache.commons.lang.StringUtils;
+import org.apache.fineract.accounting.journalentry.command.JournalEntryCommand;
+import org.apache.fineract.accounting.journalentry.command.SingleDebitOrCreditEntryCommand;
 import org.apache.fineract.accounting.journalentry.data.JournalEntryAssociationParametersData;
 import org.apache.fineract.accounting.journalentry.data.JournalEntryData;
 import org.apache.fineract.accounting.journalentry.data.OfficeOpeningBalancesData;
@@ -65,6 +68,7 @@
 @Path("/journalentries")
 @Component
 @Scope("singleton")
+@Api(value = "Journal Entries", description = "A journal entry refers to the logging of transactions against general ledger accounts. A journal entry may consist of several line items, each of which is either a \"debit\" or a \"credit\". The total amount of the debits must equal the total amount of the credits or the journal entry is said to be \"unbalanced\" \n" + "\n" + "A journal entry directly changes the account balances on the general ledger")
 public class JournalEntriesApiResource {
 
     private static final Set<String> RESPONSE_DATA_PARAMETERS = new HashSet<>(Arrays.asList("id", "officeId", "officeName",
@@ -102,15 +106,17 @@ public JournalEntriesApiResource(final PlatformSecurityContext context,
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveAll(@Context final UriInfo uriInfo, @QueryParam("officeId") final Long officeId,
-            @QueryParam("glAccountId") final Long glAccountId, @QueryParam("manualEntriesOnly") final Boolean onlyManualEntries,
-            @QueryParam("fromDate") final DateParam fromDateParam, @QueryParam("toDate") final DateParam toDateParam,
-            @QueryParam("transactionId") final String transactionId, @QueryParam("entityType") final Integer entityType,
-            @QueryParam("offset") final Integer offset, @QueryParam("limit") final Integer limit,
-            @QueryParam("orderBy") final String orderBy, @QueryParam("sortOrder") final String sortOrder,
-            @QueryParam("locale") final String locale, @QueryParam("dateFormat") final String dateFormat,
-            @QueryParam("loanId") final Long loanId, @QueryParam("savingsId") final Long savingsId,
-            @QueryParam("runningBalance") final boolean runningBalance, @QueryParam("transactionDetails") final boolean transactionDetails) {
+    @ApiOperation(value = "List Journal Entries", notes = "The list capability of journal entries can support pagination and sorting.\n\n" + "Example Requests:\n" + "\n" + "journalentries\n" + "\n" + "journalentries?transactionId=PB37X8Y21EQUY4S\n" + "\n" + "journalentries?officeId=1&manualEntriesOnly=true&fromDate=1 July 2013&toDate=15 July 2013&dateFormat=dd MMMM yyyy&locale=en\n" + "\n" + "journalentries?fields=officeName,glAccountName,transactionDate\n" + "\n" + "journalentries?offset=10&limit=50\n" + "\n" + "journalentries?orderBy=transactionId&sortOrder=DESC\n" + "\n" + "journalentries?runningBalance=true\n" + "\n" + "journalentries?transactionDetails=true\n" + "\n" + "journalentries?loanId=12\n" + "\n" + "journalentries?savingsId=24")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = JournalEntryData.class, responseContainer = "list")})
+    public String retrieveAll(@Context final UriInfo uriInfo, @QueryParam("officeId") @ApiParam(value = "officeId") final Long officeId,
+            @QueryParam("glAccountId") @ApiParam(value = "glAccountId") final Long glAccountId, @QueryParam("manualEntriesOnly") @ApiParam(value = "manualEntriesOnly") final Boolean onlyManualEntries,
+            @QueryParam("fromDate") @ApiParam(value = "fromDate") final DateParam fromDateParam, @QueryParam("toDate") @ApiParam(value = "toDate") final DateParam toDateParam,
+            @QueryParam("transactionId") @ApiParam(value = "transactionId") final String transactionId, @QueryParam("entityType") @ApiParam(value = "entityType") final Integer entityType,
+            @QueryParam("offset") @ApiParam(value = "offset") final Integer offset, @QueryParam("limit") @ApiParam(value = "limit") final Integer limit,
+            @QueryParam("orderBy") @ApiParam(value = "orderBy") final String orderBy, @QueryParam("sortOrder") @ApiParam(value = "sortOrder") final String sortOrder,
+            @QueryParam("locale") @ApiParam(value = "locale") final String locale, @QueryParam("dateFormat") @ApiParam(value = "dateFormat") final String dateFormat,
+            @QueryParam("loanId") @ApiParam(value = "loanId") final Long loanId, @QueryParam("savingsId") @ApiParam(value = "savingsId") final Long savingsId,
+            @QueryParam("runningBalance") @ApiParam(value = "runningBalance") final boolean runningBalance, @QueryParam("transactionDetails") @ApiParam(value = "transactionDetails") final boolean transactionDetails) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermission);
 
@@ -138,8 +144,10 @@ public String retrieveAll(@Context final UriInfo uriInfo, @QueryParam("officeId"
     @Path("{journalEntryId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retreiveJournalEntryById(@PathParam("journalEntryId") final Long journalEntryId, @Context final UriInfo uriInfo,
-            @QueryParam("runningBalance") final boolean runningBalance, @QueryParam("transactionDetails") final boolean transactionDetails) {
+    @ApiOperation(value = "Retrieve a single Entry", notes = "Example Requests:\n" + "\n" + "journalentries/1\n" + "\n" + "\n" + "\n" + "journalentries/1?fields=officeName,glAccountId,entryType,amount\n" + "\n" + "journalentries/1?runningBalance=true\n" + "\n" + "journalentries/1?transactionDetails=true")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = JournalEntryData.class)})
+    public String retreiveJournalEntryById(@PathParam("journalEntryId") @ApiParam(value = "journalEntryId") final Long journalEntryId, @Context final UriInfo uriInfo,
+            @QueryParam("runningBalance") @ApiParam(value = "runningBalance") final boolean runningBalance, @QueryParam("transactionDetails") @ApiParam(value = "transactionDetails") final boolean transactionDetails) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermission);
         JournalEntryAssociationParametersData associationParametersData = new JournalEntryAssociationParametersData(transactionDetails,
@@ -154,7 +162,10 @@ public String retreiveJournalEntryById(@PathParam("journalEntryId") final Long j
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String createGLJournalEntry(final String jsonRequestBody, @QueryParam("command") final String commandParam) {
+    @ApiOperation(value = "Create \"Balanced\" Journal Entries", notes = "Note: A Balanced (simple) Journal entry would have atleast one \"Debit\" and one \"Credit\" entry whose amounts are equal \n" + "Compound Journal entries may have \"n\" debits and \"m\" credits where both \"m\" and \"n\" are greater than 0 and the net sum or all debits and credits are equal \n\n" + "\n" + "Mandatory Fields\n" + "officeId, transactionDate\n\n" + "\ncredits- glAccountId, amount, comments\n\n " + "\ndebits-  glAccountId, amount, comments\n\n " + "\n" + "Optional Fields\n" + "paymentTypeId, accountNumber, checkNumber, routingCode, receiptNumber, bankNumber")
+    @ApiImplicitParams({@ApiImplicitParam(paramType = "body", value = "body", dataType = "body", dataTypeClass = JournalEntryCommand.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = JournalEntriesApiResourceSwagger.PostJournalEntriesResponse.class)})
+    public String createGLJournalEntry(@ApiParam(hidden = true) final String jsonRequestBody, @QueryParam("command") @ApiParam(value = "command") final String commandParam) {
 
         CommandProcessingResult result = null;
         if (is(commandParam, "updateRunningBalance")) {
@@ -176,8 +187,11 @@ public String createGLJournalEntry(final String jsonRequestBody, @QueryParam("co
     @Path("{transactionId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String createReversalJournalEntry(final String jsonRequestBody, @PathParam("transactionId") final String transactionId,
-            @QueryParam("command") final String commandParam) {
+    @ApiOperation(value = "Update Running balances for Journal Entries", notes = "This API calculates the running balances for office. If office ID not provided this API calculates running balances for all offices. \n" + "Mandatory Fields\n" + "officeId")
+    @ApiImplicitParams({@ApiImplicitParam(paramType = "body", value = "body", dataType = "body", dataTypeClass = JournalEntriesApiResourceSwagger.PostJournalEntriesTransactionIdRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = JournalEntriesApiResourceSwagger.PostJournalEntriesTransactionIdResponse.class)})
+    public String createReversalJournalEntry(@ApiParam(hidden = true) final String jsonRequestBody, @PathParam("transactionId") @ApiParam(value = "transactionId") final String transactionId,
+            @QueryParam("command") @ApiParam(value = "command") final String commandParam) {
         CommandProcessingResult result = null;
         if (is(commandParam, "reverse")) {
             final CommandWrapper commandRequest = new CommandWrapperBuilder().reverseJournalEntry(transactionId).withJson(jsonRequestBody)
@@ -201,14 +215,14 @@ public String retrieveJournalEntries(@QueryParam("offset") final Integer offset,
         SearchParameters params = SearchParameters.forPagination(offset, limit) ;
                 Page<JournalEntryData> entries = this.journalEntryReadPlatformService.retrieveAll(params, null, null, null, null, transactionId, PortfolioProductType.PROVISIONING.getValue(), null) ;
         final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
-        return this.apiJsonSerializerService.serialize(settings, entries, RESPONSE_DATA_PARAMETERS);    
+        return this.apiJsonSerializerService.serialize(settings, entries, RESPONSE_DATA_PARAMETERS);
     }
-    
+
     
     @GET
+    @Path("openingbalance")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    @Path("openingbalance")
     public String retrieveOpeningBalance(@Context final UriInfo uriInfo, @QueryParam("officeId") final Long officeId,
             @QueryParam("currencyCode") final String currencyCode) {
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/api/JournalEntriesApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/api/JournalEntriesApiResourceSwagger.java
new file mode 100644
index 000000000..981615e96
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/accounting/journalentry/api/JournalEntriesApiResourceSwagger.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.accounting.journalentry.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.joda.time.LocalDate;
+
+/**
+ * Created by sanyam on 25/7/17.
+ */
+final class JournalEntriesApiResourceSwagger {
+    private JournalEntriesApiResourceSwagger(){}
+
+    @ApiModel(value = "PostJournalEntriesResponse")
+    public static final class PostJournalEntriesResponse {
+
+        private PostJournalEntriesResponse(){
+
+        }
+        @ApiModelProperty(value = "1")
+        public Long officeId;
+        @ApiModelProperty(value = "RS9MCISID4WK1ZM")
+        public String transactionId;
+
+    }
+
+    @ApiModel(value = "PostJournalEntriesTransactionIdRequest")
+    public static final class PostJournalEntriesTransactionIdRequest {
+        private PostJournalEntriesTransactionIdRequest() {
+
+        }
+        @ApiModelProperty(value = "1")
+        public Long officeId;
+    }
+
+    @ApiModel(value = "PostJournalEntriesTransactionIdResponse")
+    public static final class PostJournalEntriesTransactionIdResponse {
+        private PostJournalEntriesTransactionIdResponse() {
+
+        }
+        @ApiModelProperty(value = "1")
+        public Long officeId;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/provisioning/api/ProvisioningEntriesApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/accounting/provisioning/api/ProvisioningEntriesApiResource.java
index d5369c206..655094458 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/accounting/provisioning/api/ProvisioningEntriesApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/accounting/provisioning/api/ProvisioningEntriesApiResource.java
@@ -29,6 +29,7 @@
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.UriInfo;
 
+import io.swagger.annotations.*;
 import org.apache.fineract.accounting.provisioning.constant.ProvisioningEntriesApiConstants;
 import org.apache.fineract.accounting.provisioning.data.LoanProductProvisioningEntryData;
 import org.apache.fineract.accounting.provisioning.data.ProvisioningEntryData;
@@ -55,6 +56,7 @@
 @Path("/provisioningentries")
 @Component
 @Scope("singleton")
+@Api(value = "Provisioning Entries", description = "This defines the Provisioning Entries for all active loan products\n" + "\n" + "Field Descriptions\n" + "date\n" + "Date on which day provisioning entries should be created\n" + "createjournalentries\n" + "Boolean variable whether to add journal entries for generated provisioning entries\n")
 public class ProvisioningEntriesApiResource {
 
     private final PlatformSecurityContext platformSecurityContext;
@@ -84,7 +86,10 @@ public ProvisioningEntriesApiResource(final PlatformSecurityContext platformSecu
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String createProvisioningEntries(final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Create new Provisioning Entries", notes = "Creates a new Provisioning Entries\n" + "\n" + "Mandatory Fields\n" + "date\n" + "dateFormat\n" + "locale\n" + "Optional Fields\n" + "createjournalentries")
+    @ApiImplicitParams({@ApiImplicitParam(paramType = "body", value = "body", dataType = "body", dataTypeClass = ProvisioningEntriesApiResourceSwagger.PostProvisioningEntriesRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = ProvisioningEntriesApiResourceSwagger.PostProvisioningEntriesResponse.class)})
+    public String createProvisioningEntries(@ApiParam(hidden = true) final String apiRequestBodyAsJson) {
         CommandWrapper commandWrapper = null;
         this.platformSecurityContext.authenticatedUser();
         commandWrapper = new CommandWrapperBuilder().createProvisioningEntries().withJson(apiRequestBodyAsJson).build();
@@ -96,8 +101,11 @@ public String createProvisioningEntries(final String apiRequestBodyAsJson) {
     @Path("{entryId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String modifyProvisioningEntry(@PathParam("entryId") final Long entryId, @QueryParam("command") final String commandParam,
-            final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Recreates Provisioning Entry", notes = "Recreates Provisioning Entry | createjournalentry.")
+    @ApiImplicitParams({@ApiImplicitParam(paramType = "body", value = "body", dataType = "body", dataTypeClass = ProvisioningEntriesApiResourceSwagger.PutProvisioningEntriesRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = ProvisioningEntriesApiResourceSwagger.PutProvisioningEntriesResponse.class)})
+    public String modifyProvisioningEntry(@PathParam("entryId") @ApiParam(value = "entryId") final Long entryId, @QueryParam("command") @ApiParam(value = "command=createjournalentry\ncommand=recreateprovisioningentry") final String commandParam,
+           @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
         CommandWrapper commandWrapper = null;
         this.platformSecurityContext.authenticatedUser();
         if ("createjournalentry".equals(commandParam)) {
@@ -118,7 +126,9 @@ public String modifyProvisioningEntry(@PathParam("entryId") final Long entryId,
     @Path("{entryId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveProvisioningEntry(@PathParam("entryId") final Long entryId, @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Retrieves a Provisioning Entry", notes = "Returns the details of a generated Provisioning Entry.")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = ProvisioningEntryData.class)})
+    public String retrieveProvisioningEntry(@PathParam("entryId") @ApiParam(value = "entryId") final Long entryId, @Context final UriInfo uriInfo) {
         platformSecurityContext.authenticatedUser();
         ProvisioningEntryData data = this.provisioningEntriesReadPlatformService.retrieveProvisioningEntryData(entryId);
         final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
@@ -129,6 +139,7 @@ public String retrieveProvisioningEntry(@PathParam("entryId") final Long entryId
     @Path("entries")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = LoanProductProvisioningEntryData.class)})
     public String retrieveProviioningEntries(@QueryParam("entryId") final Long entryId, @QueryParam("offset") final Integer offset,
             @QueryParam("limit") final Integer limit, @QueryParam("officeId") final Long officeId,
             @QueryParam("productId") final Long productId, @QueryParam("categoryId") final Long categoryId, @Context final UriInfo uriInfo) {
@@ -142,7 +153,9 @@ public String retrieveProviioningEntries(@QueryParam("entryId") final Long entry
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveAllProvisioningEntries(@QueryParam("offset") final Integer offset, @QueryParam("limit") final Integer limit,
+    @ApiOperation(value = "List all Provisioning Entries")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = ProvisioningEntryData.class, responseContainer = "list")})
+    public String retrieveAllProvisioningEntries(@QueryParam("offset") @ApiParam(value = "offset") final Integer offset, @QueryParam("limit") @ApiParam(value = "limit") final Integer limit,
             @Context final UriInfo uriInfo) {
         platformSecurityContext.authenticatedUser();
         Page<ProvisioningEntryData> data = this.provisioningEntriesReadPlatformService.retrieveAllProvisioningEntries(offset, limit);
diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/provisioning/api/ProvisioningEntriesApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/accounting/provisioning/api/ProvisioningEntriesApiResourceSwagger.java
new file mode 100644
index 000000000..8b77bfbd8
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/accounting/provisioning/api/ProvisioningEntriesApiResourceSwagger.java
@@ -0,0 +1,80 @@
+/**
+ * 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.accounting.provisioning.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * Created by sanyam on 25/7/17.
+ */
+final class ProvisioningEntriesApiResourceSwagger {
+    private ProvisioningEntriesApiResourceSwagger() {
+        // only for Swagger Documentation
+    }
+
+    @ApiModel(value = "PostProvisioningEntriesRequest")
+    public static final class PostProvisioningEntriesRequest {
+        private PostProvisioningEntriesRequest() {
+
+        }
+        @ApiModelProperty(example = "16 October 2015")
+        public String date;
+
+        @ApiModelProperty(example = "en")
+        public String locale;
+
+        @ApiModelProperty(example = "dd MMMM yyyy")
+        public String dateFormat;
+
+        @ApiModelProperty(example = "true")
+        public String createjournalentries;
+
+        public String provisioningentry;
+
+        public String entries;
+    }
+
+    @ApiModel(value = "PostProvisioningEntriesResponse")
+    public static final class PostProvisioningEntriesResponse{
+        private PostProvisioningEntriesResponse() {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long resourceId;
+    }
+
+    @ApiModel(value = "PutProvisioningEntriesRequest")
+    public static final class PutProvisioningEntriesRequest{
+        private PutProvisioningEntriesRequest() {
+
+        }
+        @ApiModelProperty(example = "recreateprovisioningentry")
+        public String command;
+    }
+
+    @ApiModel(value = "PutProvisioningEntriesResponse")
+    public static final class PutProvisioningEntriesResponse{
+        private PutProvisioningEntriesResponse() {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long resourceId;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/rule/api/AccountingRuleApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/accounting/rule/api/AccountingRuleApiResource.java
index 7955f1478..626df9c22 100755
--- a/fineract-provider/src/main/java/org/apache/fineract/accounting/rule/api/AccountingRuleApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/accounting/rule/api/AccountingRuleApiResource.java
@@ -39,6 +39,7 @@
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.UriInfo;
 
+import io.swagger.annotations.*;
 import org.apache.fineract.accounting.common.AccountingConstants;
 import org.apache.fineract.accounting.glaccount.data.GLAccountData;
 import org.apache.fineract.accounting.glaccount.service.GLAccountReadPlatformService;
@@ -66,6 +67,7 @@
 @Path("/accountingrules")
 @Component
 @Scope("singleton")
+@Api(value = "Accounting Rules", description = "It is typical scenario in MFI's that non accountants pass journal entries on a regular basis. For Ex: A branch office might deposit their entire cash at hand to their Bank account at the end of a working day. The branch office users might not understand enough of accounting to figure out which account needs to get credited and which account needs to be debited to represent this transaction.\n" + "\n" + "Enter accounting rules, an abstraction on top of manual Journal entires for enabling simpler data entry. An accounting rule can define any of the following abstractions\n" + "\n" + "A Simple journal entry where both the credit and debit account have been preselected\n" + "A Simple journal entry where either credit or debit accounts have been limited to a pre-selected list of accounts (Ex: Debit account should be one of \"Bank of America\" of \"JP Morgan\" and credit account should be \"Cash\")\n" + "A Compound journal entry where multiple debits and / or multiple credits may be made amongst a set of preselected list of accounts (Ex: Credit account should be either \"Bank Of America\" or \"Cash\" and debit account can be \"Employee Salary\" and/or \"Miscellenous Expenses\")\n" + "An accounting rule can also be optionally associated with a branch, so that only a particular Branch's users have access to the rule")
 public class AccountingRuleApiResource {
 
     private static final Set<String> RESPONSE_DATA_PARAMETERS = new HashSet<>(Arrays.asList("id", "officeId", "officeName",
@@ -105,6 +107,8 @@ public AccountingRuleApiResource(final PlatformSecurityContext context,
     @Path("template")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
+    @ApiOperation(value = "Retrieve Accounting Rule Details Template", notes = "This is a convenience resource. It can be useful when building maintenance user interface screens for client applications. The template data returned consists of any or all of:\n" + "\n" + "Field Defaults\n" + "Allowed Value Lists\n" + "Example Request:\n" + "\n" + "accountingrules/template")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = AccountingRuleApiResourceSwagger.GetAccountRulesTemplateResponse.class)})
     public String retrieveTemplate(@Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermission);
@@ -119,6 +123,8 @@ public String retrieveTemplate(@Context final UriInfo uriInfo) {
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
+    @ApiOperation(value = "Retrieve Accounting Rules", notes = "Returns the list of defined accounting rules.\n" + "\n" + "Example Requests:\n" + "\n" + "accountingrules")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = AccountingRuleApiResourceSwagger.GetAccountRulesResponse.class, responseContainer = "list")})
     public String retrieveAllAccountingRules(@Context final UriInfo uriInfo) {
 
         final AppUser currentUser = this.context.authenticatedUser();
@@ -147,7 +153,9 @@ public String retrieveAllAccountingRules(@Context final UriInfo uriInfo) {
     @Path("{accountingRuleId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retreiveAccountingRule(@PathParam("accountingRuleId") final Long accountingRuleId, @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Retrieve a Accounting rule", notes = "Returns the details of a defined Accounting rule.\n" + "\n" + "Example Requests:\n" + "\n" + "accountingrules/1")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = AccountingRuleData.class)})
+    public String retreiveAccountingRule(@PathParam("accountingRuleId") @ApiParam(value = "accountingRuleId") final Long accountingRuleId, @Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermission);
         final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
@@ -163,7 +171,10 @@ public String retreiveAccountingRule(@PathParam("accountingRuleId") final Long a
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String createAccountingRule(final String jsonRequestBody) {
+    @ApiOperation(value = "Create/Define a Accounting rule", notes = "Define a new Accounting rule.\n" + "\n" + "Mandatory Fields\n" + "name, officeId,\n" + "accountToDebit OR debitTags,\n" + "accountToCredit OR creditTags.\n" + "\n" + "Optional Fields\n" + "description")
+    @ApiImplicitParams({@ApiImplicitParam(paramType = "body", value = "body", dataType = "body", dataTypeClass = AccountingRuleApiResourceSwagger.PostAccountingRulesRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = AccountingRuleApiResourceSwagger.PostAccountingRulesResponse.class)})
+    public String createAccountingRule(@ApiParam(hidden = true) final String jsonRequestBody) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().createAccountingRule().withJson(jsonRequestBody).build();
 
@@ -176,7 +187,10 @@ public String createAccountingRule(final String jsonRequestBody) {
     @Path("{accountingRuleId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String updateAccountingRule(@PathParam("accountingRuleId") final Long accountingRuleId, final String jsonRequestBody) {
+    @ApiOperation(value = "Update a Accounting Rule", notes = "Updates the details of a Accounting rule.")
+    @ApiImplicitParams({@ApiImplicitParam(paramType = "body", value = "body", dataType = "body", dataTypeClass = AccountingRuleApiResourceSwagger.PutAccountingRulesRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = AccountingRuleApiResourceSwagger.PutAccountingRulesResponse.class)})
+    public String updateAccountingRule(@PathParam("accountingRuleId") @ApiParam(value = "accountingRuleId") final Long accountingRuleId,@ApiParam(hidden = true) final String jsonRequestBody) {
         final CommandWrapper commandRequest = new CommandWrapperBuilder().updateAccountingRule(accountingRuleId).withJson(jsonRequestBody)
                 .build();
 
@@ -189,7 +203,9 @@ public String updateAccountingRule(@PathParam("accountingRuleId") final Long acc
     @Path("{accountingRuleId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String deleteAccountingRule(@PathParam("accountingRuleId") final Long accountingRuleId) {
+    @ApiOperation(value = "Delete a Accounting Rule", notes = "Deletes a Accounting rule.")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = AccountingRuleApiResourceSwagger.DeleteAccountingRulesResponse.class)})
+    public String deleteAccountingRule(@PathParam("accountingRuleId") @ApiParam(value = "accountingRuleId") final Long accountingRuleId) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().deleteAccountingRule(accountingRuleId).build();
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/accounting/rule/api/AccountingRuleApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/accounting/rule/api/AccountingRuleApiResourceSwagger.java
new file mode 100644
index 000000000..5f62be23a
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/accounting/rule/api/AccountingRuleApiResourceSwagger.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.accounting.rule.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.fineract.accounting.glaccount.data.GLAccountData;
+import org.apache.fineract.accounting.rule.data.AccountingTagRuleData;
+import org.apache.fineract.organisation.office.data.OfficeData;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * Created by sanyam on 26/7/17.
+ */
+final class AccountingRuleApiResourceSwagger {
+    private AccountingRuleApiResourceSwagger() {
+        // For Swagger Documentation
+    }
+
+    @ApiModel(value = "GetAccountRulesResponse")
+    public static final class GetAccountRulesResponse {
+        private GetAccountRulesResponse() {
+
+        }
+
+        public Long id;
+        public Long officeId;
+        public String officeName;
+        public String name;
+        public String description;
+        public boolean systemDefined;
+        public boolean allowMultipleDebitEntries;
+        public boolean allowMultipleCreditEntries;
+        public List<AccountingTagRuleData> creditTags;
+        public List<AccountingTagRuleData> debitTags;
+    }
+
+    @ApiModel(value = "GetAccountRulesTemplateResponse")
+    public static final class GetAccountRulesTemplateResponse {
+        private GetAccountRulesTemplateResponse() {
+
+        }
+
+        @ApiModelProperty(example = "false")
+        public boolean systemDefined;
+        public List<OfficeData> allowedOffices = new ArrayList<OfficeData>();
+        public List<GLAccountData> allowedAccounts = new ArrayList<GLAccountData>();
+    }
+
+    @ApiModel(value = "PostAccountingRulesRequest")
+    public static final class PostAccountingRulesRequest {
+        private PostAccountingRulesRequest() {
+
+        }
+
+        @ApiModelProperty(example = "test")
+        public String name;
+        @ApiModelProperty(example = "1")
+        public Long officeId;
+        @ApiModelProperty(example = "21")
+        public Long accountToDebit;
+        @ApiModelProperty(example = "9")
+        public Long accountToCredit;
+        @ApiModelProperty(example = "Employee salary")
+        public String description;
+    }
+
+    @ApiModel(value = "PostAccountingRulesResponse")
+    public static final class PostAccountingRulesResponse {
+        private PostAccountingRulesResponse() {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long officeId;
+        @ApiModelProperty(example = "1")
+        public Long resourceId;
+    }
+
+    @ApiModel(value = "PutAccountingRulesRequest")
+    public static final class PutAccountingRulesRequest {
+        private PutAccountingRulesRequest() {
+
+        }
+        @ApiModelProperty(example = "Employee Salary posting rule")
+        public String name;
+    }
+
+    @ApiModel(value = "PutAccountingRulesResponse")
+    public static final class PutAccountingRulesResponse {
+        private PutAccountingRulesResponse () {
+
+        }
+
+        public class PutAccountingRulesResponsechangesSwagger {
+            public PutAccountingRulesResponsechangesSwagger(){}
+            @ApiModelProperty(example = "Employee Salary posting rule")
+            public String name;
+        }
+        @ApiModelProperty(example = "1")
+        public Long resourceId;
+        public PutAccountingRulesResponsechangesSwagger changes;
+    }
+
+    @ApiModel(value = "DeleteAccountingRulesResponse")
+    public static final class DeleteAccountingRulesResponse {
+        private DeleteAccountingRulesResponse() {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long resourceId;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/batch/api/BatchApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/batch/api/BatchApiResource.java
index ca30f71bd..de881e77a 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/batch/api/BatchApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/batch/api/BatchApiResource.java
@@ -31,6 +31,7 @@
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.UriInfo;
 
+import io.swagger.annotations.*;
 import org.apache.fineract.batch.domain.BatchRequest;
 import org.apache.fineract.batch.domain.BatchResponse;
 import org.apache.fineract.batch.serialization.BatchRequestJsonHelper;
@@ -59,6 +60,7 @@
 @Path("/batches")
 @Component
 @Scope("singleton")
+@Api(value = "Batch API", description = "The Apache Fineract Batch API enables a consumer to access significant amounts of data in a single call or to make changes to several objects at once. Batching allows a consumer to pass instructions for several operations in a single HTTP request. A consumer can also specify dependencies between related operations. Once all operations have been completed, a consolidated response will be passed back and the HTTP connection will be closed.\n" + "\n" + "The Batch API takes in an array of logical HTTP requests represented as JSON arrays - each request has a requestId (the id of a request used to specify the sequence and as a dependency between requests), a method (corresponding to HTTP method GET/PUT/POST/DELETE etc.), a relativeUrl (the portion of the URL after https://example.org/api/v2/), optional headers array (corresponding to HTTP headers), optional reference parameter if a request is dependent on another request and an optional body (for POST and PUT requests). The Batch API returns an array of logical HTTP responses represented as JSON arrays - each response has a requestId, a status code, an optional headers array and an optional body (which is a JSON encoded string).\n" + "\n" + "Batch API uses Json Path to handle dependent parameters. For example, if request '2' is referencing request '1' and in the \"body\" or in \"relativeUrl\" of request '2', there is a dependent parameter (which will look like \"$.parameter_name\"), then Batch API will internally substitute this dependent parameter from the response body of request '1'.\n" + "\n" + "Batch API is able to handle deeply nested dependent requests as well nested parameters. As shown in the example, requests are dependent on each other as, 1<--2<--6, i.e a nested dependency, where request '6' is not directly dependent on request '1' but still it is one of the nested child of request '1'. In the same way Batch API could handle a deeply nested dependent value, such as {..[..{..,$.parameter_name,..}..]}.")
 public class BatchApiResource {
 
     private final PlatformSecurityContext context;
@@ -97,8 +99,11 @@ public BatchApiResource(final PlatformSecurityContext context, final ToApiJsonSe
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String handleBatchRequests(@DefaultValue("false") @QueryParam("enclosingTransaction") final boolean enclosingTransaction,
-            final String jsonRequestString, @Context UriInfo uriInfo) {
+    @ApiOperation(value = "Batch requests in a single transaction", httpMethod = "POST", notes = "The Apache Fineract Batch API is also capable of executing all the requests in a single transaction, by setting a Query Parameter, \"enclosingTransaction=true\". So, if one or more of the requests in a batch returns an erroneous response all of the Data base transactions made by other successful requests will be rolled back.\n" + "\n" + "If there has been a rollback in a transaction then a single response will be provided, with a '400' status code and a body consisting of the error details of the first failed request.")
+    @ApiImplicitParams({@ApiImplicitParam(paramType = "body", dataType = "BatchRequest", required = true, type = "body", dataTypeClass = BatchApiResourceSwagger.PostBatchesRequest.class, value = "request body")})
+    @ApiResponses({@ApiResponse(code = 200, message = "Success", response = BatchResponse.class)})
+    public String handleBatchRequests(@DefaultValue("false") @QueryParam("enclosingTransaction") @ApiParam(value = "enclosingTransaction", defaultValue = "false") final boolean enclosingTransaction,
+           @ApiParam(hidden = true) final String jsonRequestString, @Context UriInfo uriInfo) {
 
         // Handles user authentication
         this.context.authenticatedUser();
diff --git a/fineract-provider/src/main/java/org/apache/fineract/batch/api/BatchApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/batch/api/BatchApiResourceSwagger.java
new file mode 100644
index 000000000..0aa351464
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/batch/api/BatchApiResourceSwagger.java
@@ -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.
+ */
+package org.apache.fineract.batch.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.fineract.batch.domain.Header;
+
+import java.util.Set;
+
+/**
+ * Created by sanyam on 26/7/17.
+ */
+final class BatchApiResourceSwagger {
+    private BatchApiResourceSwagger() {
+
+    }
+
+    @ApiModel(value = "PostBatchesRequest")
+    public static final class PostBatchesRequest{
+        private PostBatchesRequest() {
+
+        }
+
+        public static final class PostBodyRequestSwagger{
+            private PostBodyRequestSwagger() {
+
+            }
+
+            @ApiModelProperty(example = "1")
+            public Long officeId;
+            @ApiModelProperty(example = "\"Petra\"")
+            public String firstname;
+            @ApiModelProperty(example = "\"Yton\"")
+            public String lastname;
+            @ApiModelProperty(example = "\"ex_externalId1\"")
+            public String externalId;
+            @ApiModelProperty(example = "\"dd MMMM yyyy\"")
+            public String dateFormat;
+            @ApiModelProperty(example = "\"en\"")
+            public String locale;
+            @ApiModelProperty(example = "true")
+            public boolean active;
+            @ApiModelProperty(example = "\"04 March 2009\"")
+            public String activationDate;
+            @ApiModelProperty(example = "\"04 March 2009\"")
+            public String submittedOnDate;
+
+        }
+
+        @ApiModelProperty(example = "1")
+        public Long requestId;
+        @ApiModelProperty(example = "clients")
+        public String relativeUrl;
+        @ApiModelProperty(example = "POST")
+        public String method;
+        public Set<Header> headers;
+        @ApiModelProperty(example = "1")
+        public Long reference;
+        public PostBodyRequestSwagger body;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/commands/api/AuditsApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/commands/api/AuditsApiResource.java
index f1b278ad4..4db43e7c9 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/commands/api/AuditsApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/commands/api/AuditsApiResource.java
@@ -33,6 +33,7 @@
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.UriInfo;
 
+import io.swagger.annotations.*;
 import org.apache.commons.lang.StringUtils;
 import org.apache.fineract.commands.data.AuditData;
 import org.apache.fineract.commands.data.AuditSearchData;
@@ -51,6 +52,7 @@
 @Path("/audits")
 @Component
 @Scope("singleton")
+@Api(value = "Audits",description = "Every non-read Mifos API request is audited. A fully processed request can not be changed or deleted. See maker checker api for situations where an audit is not fully processed.\n" + "\n" + "Permissions: To search and look at audit entries a user needs to be attached to a role that has one of the ALL_FUNCTIONS, ALL_FUNCTIONS_READ or READ_AUDIT permissions.\n" + "\n" + "Data Scope: A user can only see audits that are within their data scope. However, 'head office' users can see all audits including those that aren't office/branch related e.g. Loan Product changes.")
 public class AuditsApiResource {
 
     private final Set<String> RESPONSE_DATA_PARAMETERS = new HashSet<>(Arrays.asList("id", "actionName", "entityName", "resourceId",
@@ -79,17 +81,19 @@ public AuditsApiResource(final PlatformSecurityContext context, final AuditReadP
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveAuditEntries(@Context final UriInfo uriInfo, @QueryParam("actionName") final String actionName,
-            @QueryParam("entityName") final String entityName, @QueryParam("resourceId") final Long resourceId,
-            @QueryParam("makerId") final Long makerId, @QueryParam("makerDateTimeFrom") final String makerDateTimeFrom,
-            @QueryParam("makerDateTimeTo") final String makerDateTimeTo, @QueryParam("checkerId") final Long checkerId,
-            @QueryParam("checkerDateTimeFrom") final String checkerDateTimeFrom,
-            @QueryParam("checkerDateTimeTo") final String checkerDateTimeTo,
-            @QueryParam("processingResult") final Integer processingResult, @QueryParam("officeId") final Integer officeId,
-            @QueryParam("groupId") final Integer groupId, @QueryParam("clientId") final Integer clientId,
-            @QueryParam("loanid") final Integer loanId, @QueryParam("savingsAccountId") final Integer savingsAccountId,
-            @QueryParam("paged") final Boolean paged, @QueryParam("offset") final Integer offset, @QueryParam("limit") final Integer limit,
-            @QueryParam("orderBy") final String orderBy, @QueryParam("sortOrder") final String sortOrder) {
+    @ApiOperation(value = "List Audits", notes = "Get a 200 list of audits that match the criteria supplied and sorted by audit id in descending order, and are within the requestors' data scope. Also it supports pagination and sorting\n" + "\n" + "Example Requests:\n" + "\n" + "audits\n" + "\n" + "audits?fields=madeOnDate,maker,processingResult\n" + "\n" + "audits?makerDateTimeFrom=2013-03-25 08:00:00&makerDateTimeTo=2013-04-04 18:00:00\n" + "\n" + "audits?officeId=1\n" + "\n" + "audits?officeId=1&includeJson=true")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = MakercheckersApiResourceSwagger.GetMakerCheckerResponse.class, responseContainer = "list")})
+    public String retrieveAuditEntries(@Context final UriInfo uriInfo, @QueryParam("actionName") @ApiParam(value = "actionName") final String actionName,
+            @QueryParam("entityName") @ApiParam(value = "entityName") final String entityName, @QueryParam("resourceId") @ApiParam(value = "resourceId") final Long resourceId,
+            @QueryParam("makerId") @ApiParam(value = "makerId") final Long makerId, @QueryParam("makerDateTimeFrom") @ApiParam(value = "makerDateTimeFrom") final String makerDateTimeFrom,
+            @QueryParam("makerDateTimeTo") @ApiParam(value = "makerDateTimeTo") final String makerDateTimeTo, @QueryParam("checkerId") @ApiParam(value = "checkerId") final Long checkerId,
+            @QueryParam("checkerDateTimeFrom") @ApiParam(value = "checkerDateTimeFrom") final String checkerDateTimeFrom,
+            @QueryParam("checkerDateTimeTo") @ApiParam(value = "checkerDateTimeTo") final String checkerDateTimeTo,
+            @QueryParam("processingResult") @ApiParam(value = "processingResult") final Integer processingResult, @QueryParam("officeId") @ApiParam(value = "officeId") final Integer officeId,
+            @QueryParam("groupId") @ApiParam(value = "groupId") final Integer groupId, @QueryParam("clientId") @ApiParam(value = "clientId") final Integer clientId,
+            @QueryParam("loanid") @ApiParam(value = "loanid") final Integer loanId, @QueryParam("savingsAccountId") @ApiParam(value = "savingsAccountId") final Integer savingsAccountId,
+            @QueryParam("paged") @ApiParam(value = "paged") final Boolean paged, @QueryParam("offset") @ApiParam(value = "offset") final Integer offset, @QueryParam("limit") @ApiParam(value = "limit") final Integer limit,
+            @QueryParam("orderBy") @ApiParam(value = "orderBy") final String orderBy, @QueryParam("sortOrder") @ApiParam(value = "sortOrder") final String sortOrder) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
         final PaginationParameters parameters = PaginationParameters.instance(paged, offset, limit, orderBy, sortOrder);
@@ -114,7 +118,9 @@ public String retrieveAuditEntries(@Context final UriInfo uriInfo, @QueryParam("
     @Path("{auditId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveAuditEntry(@PathParam("auditId") final Long auditId, @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Retrieve an Audit Entry", notes = "Example Requests:\n" + "\n" + "audits/20\n" + "audits/20?fields=madeOnDate,maker,processingResult")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = MakercheckersApiResourceSwagger.GetMakerCheckerResponse.class)})
+    public String retrieveAuditEntry(@PathParam("auditId") @ApiParam(value = "auditId") final Long auditId, @Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
 
@@ -128,6 +134,8 @@ public String retrieveAuditEntry(@PathParam("auditId") final Long auditId, @Cont
     @Path("/searchtemplate")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
+    @ApiOperation(value = "Audit Search Template", notes = "This is a convenience resource. It can be useful when building an Audit Search UI. \"appUsers\" are data scoped to the office/branch the requestor is associated with.\n" + "\n" + "Example Requests:\n" + "\n" + "audits/searchtemplate\n" + "audits/searchtemplate?fields=actionNames")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = MakercheckersApiResourceSwagger.GetMakerCheckersSearchTemplateResponse.class)})
     public String retrieveAuditSearchTemplate(@Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
diff --git a/fineract-provider/src/main/java/org/apache/fineract/commands/api/MakercheckersApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/commands/api/MakercheckersApiResource.java
index 327fee155..6916266c9 100755
--- a/fineract-provider/src/main/java/org/apache/fineract/commands/api/MakercheckersApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/commands/api/MakercheckersApiResource.java
@@ -35,6 +35,7 @@
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.UriInfo;
 
+import io.swagger.annotations.*;
 import org.apache.commons.lang.StringUtils;
 import org.apache.fineract.commands.data.AuditData;
 import org.apache.fineract.commands.data.AuditSearchData;
@@ -53,6 +54,7 @@
 @Path("/makercheckers")
 @Component
 @Scope("singleton")
+@Api(value = "Maker Checker (or 4-eye) functionality")
 public class MakercheckersApiResource {
 
     private final Set<String> RESPONSE_DATA_PARAMETERS = new HashSet<>(Arrays.asList("id", "actionName", "entityName", "resourceId",
@@ -80,12 +82,14 @@ public MakercheckersApiResource(final AuditReadPlatformService readPlatformServi
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveCommands(@Context final UriInfo uriInfo, @QueryParam("actionName") final String actionName,
-            @QueryParam("entityName") final String entityName, @QueryParam("resourceId") final Long resourceId,
-            @QueryParam("makerId") final Long makerId, @QueryParam("makerDateTimeFrom") final String makerDateTimeFrom,
-            @QueryParam("makerDateTimeTo") final String makerDateTimeTo, @QueryParam("officeId") final Integer officeId,
-            @QueryParam("groupId") final Integer groupId, @QueryParam("clientId") final Integer clientId,
-            @QueryParam("loanid") final Integer loanId, @QueryParam("savingsAccountId") final Integer savingsAccountId) {
+    @ApiOperation(value = "List Maker Checker Entries", notes = "Get a list of entries that can be checked by the requestor that match the criteria supplied.\n" + "\n" + "Example Requests:\n" + "\n" + "makercheckers\n" + "\n" + "makercheckers?fields=madeOnDate,maker,processingResult\n" + "\n" + "makercheckers?makerDateTimeFrom=2013-03-25 08:00:00&makerDateTimeTo=2013-04-04 18:00:00\n" + "\n" + "makercheckers?officeId=1\n" + "\n" + "makercheckers?officeId=1&includeJson=true")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = MakercheckersApiResourceSwagger.GetMakerCheckerResponse.class, responseContainer = "list")})
+    public String retrieveCommands(@Context final UriInfo uriInfo, @QueryParam("actionName") @ApiParam(value = "actionName") final String actionName,
+            @QueryParam("entityName") @ApiParam(value = "entityName") final String entityName, @QueryParam("resourceId") @ApiParam(value = "resourceId") final Long resourceId,
+            @QueryParam("makerId") @ApiParam(value = "makerId") final Long makerId, @QueryParam("makerDateTimeFrom") @ApiParam(value = "makerDateTimeFrom") final String makerDateTimeFrom,
+            @QueryParam("makerDateTimeTo") @ApiParam(value = "makerDateTimeTo") final String makerDateTimeTo, @QueryParam("officeId") @ApiParam(value = "officeId") final Integer officeId,
+            @QueryParam("groupId") @ApiParam(value = "groupId") final Integer groupId, @QueryParam("clientId") @ApiParam(value = "clientId") final Integer clientId,
+            @QueryParam("loanid") @ApiParam(value = "loanid") final Integer loanId, @QueryParam("savingsAccountId") @ApiParam(value = "savingsAccountId") final Integer savingsAccountId) {
 
         final String extraCriteria = getExtraCriteria(actionName, entityName, resourceId, makerId, makerDateTimeFrom, makerDateTimeTo,
                 officeId, groupId, clientId, loanId, savingsAccountId);
@@ -102,6 +106,8 @@ public String retrieveCommands(@Context final UriInfo uriInfo, @QueryParam("acti
     @Path("/searchtemplate")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
+    @ApiOperation(value = "Maker Checker Search Template", notes = "This is a convenience resource. It can be useful when building a Checker Inbox UI. \"appUsers\" are data scoped to the office/branch the requestor is associated with. \"actionNames\" and \"entityNames\" returned are those that the requestor has Checker approval permissions for.\n" + "\n" + "Example Requests:\n" + "\n" + "makercheckers/searchtemplate\n" + "makercheckers/searchtemplate?fields=entityNames")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = MakercheckersApiResourceSwagger.GetMakerCheckersSearchTemplateResponse.class)})
     public String retrieveAuditSearchTemplate(@Context final UriInfo uriInfo) {
 
         final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
@@ -118,7 +124,9 @@ public String retrieveAuditSearchTemplate(@Context final UriInfo uriInfo) {
     @Path("{auditId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String approveMakerCheckerEntry(@PathParam("auditId") final Long auditId, @QueryParam("command") final String commandParam) {
+    @ApiOperation(value = "Approve Maker Checker Entry | Reject Maker Checker Entry")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = MakercheckersApiResourceSwagger.PostMakerCheckersResponse.class)})
+    public String approveMakerCheckerEntry(@PathParam("auditId") @ApiParam(value = "auditId") final Long auditId, @QueryParam("command") @ApiParam(value = "command") final String commandParam) {
 
         CommandProcessingResult result = null;
         if (is(commandParam, "approve")) {
@@ -140,7 +148,9 @@ private boolean is(final String commandParam, final String commandValue) {
     @Path("{auditId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String deleteMakerCheckerEntry(@PathParam("auditId") final Long auditId) {
+    @ApiOperation(value = "Delete Maker Checker Entry")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = MakercheckersApiResourceSwagger.PostMakerCheckersResponse.class)})
+    public String deleteMakerCheckerEntry(@PathParam("auditId") @ApiParam(value = "auditId") final Long auditId) {
 
         final Long id = this.writePlatformService.deleteEntry(auditId);
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/commands/api/MakercheckersApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/commands/api/MakercheckersApiResourceSwagger.java
new file mode 100644
index 000000000..8b41b6890
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/commands/api/MakercheckersApiResourceSwagger.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.commands.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.fineract.commands.data.ProcessingResultLookup;
+import org.apache.fineract.useradministration.data.AppUserData;
+import org.joda.time.DateTime;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Created by sanyam on 27/7/17.
+ */
+final class MakercheckersApiResourceSwagger {
+    private MakercheckersApiResourceSwagger() {
+        // only to initialize swagger documentation
+    }
+
+    @ApiModel(value = "GetMakerCheckerResponse")
+    public static final class GetMakerCheckerResponse{
+        private GetMakerCheckerResponse() {
+
+        }
+        public Long id;
+        public String actionName;
+        public String entityName;
+        public Long resourceId;
+        public Long subresourceId;
+        public String maker;
+        public DateTime madeOnDate;
+        public String checker;
+        public DateTime checkedOnDate;
+        public String processingResult;
+        public String commandAsJson;
+        public String officeName;
+        public String groupLevelName;
+        public String groupName;
+        public String clientName;
+        public String loanAccountNo;
+        public String savingsAccountNo;
+        public Long clientId;
+        public Long loanId;
+        public String url;
+
+
+    }
+
+    @ApiModel(value = "GetMakerCheckersSearchTemplateResponse")
+    public static final class GetMakerCheckersSearchTemplateResponse{
+        private GetMakerCheckersSearchTemplateResponse() {
+
+        }
+        public Collection<AppUserData> appUsers;
+        public List<String> actionNames;
+        public List<String> entityNames;
+        public Collection<ProcessingResultLookup> processingResults;
+    }
+
+    @ApiModel(value = "PostMakerCheckersResponse")
+    public static final class PostMakerCheckersResponse{
+        private PostMakerCheckersResponse() {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long auditId;
+
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/api/AccountNumberFormatsApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/api/AccountNumberFormatsApiResource.java
index 5d9601fda..df17186e7 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/api/AccountNumberFormatsApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/api/AccountNumberFormatsApiResource.java
@@ -35,6 +35,7 @@
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.UriInfo;
 
+import io.swagger.annotations.*;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
 import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
@@ -54,6 +55,7 @@
 @Path(AccountNumberFormatConstants.resourceRelativeURL)
 @Component
 @Scope("singleton")
+@Api(value = "Account number format", description = "Account number preferences are used to describe custom formats for account numbers associated with Customer, Loan and Savings accounts." )
 public class AccountNumberFormatsApiResource {
 
     private final PlatformSecurityContext context;
@@ -83,6 +85,8 @@ public AccountNumberFormatsApiResource(final PlatformSecurityContext context,
     @Path("template")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
+    @ApiOperation(value = "Retrieve Account number format Template", notes = "This is a convenience resource. It can be useful when building maintenance user interface screens for client applications. The template data returned consists of any or all of:\n" + "\n" + "Field Defaults\n" + "Allowed Value Lists\n" + "\n" + "Example Request:\n" + "\n" + "accountnumberformats/template")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = AccountNumberFormatsApiResourceSwagger.GetAccountNumberFormatsResponseTemplate.class)})
     public String retrieveTemplate(@Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(AccountNumberFormatConstants.ENTITY_NAME);
@@ -98,6 +102,8 @@ public String retrieveTemplate(@Context final UriInfo uriInfo) {
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
+    @ApiOperation(value = "List Account number formats", notes = "Example Requests:\n" + "\n" + "accountnumberformats\n" + "\n" + "\n" + "accountnumberformats?fields=accountType,prefixType", responseContainer = "List")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = AccountNumberFormatsApiResourceSwagger.GetAccountNumberFormatsIdResponse.class, responseContainer = "List")})
     public String retrieveAll(@Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(AccountNumberFormatConstants.ENTITY_NAME);
@@ -114,7 +120,9 @@ public String retrieveAll(@Context final UriInfo uriInfo) {
     @Path("{accountNumberFormatId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveOne(@Context final UriInfo uriInfo, @PathParam("accountNumberFormatId") final Long accountNumberFormatId) {
+    @ApiOperation(value = "Retrieve an Account number format", notes = "Example Requests:\n" + "\n" + "accountnumberformats/1\n" + "\n" + "\n" + "accountnumberformats/1?template=true\n" + "\n" + "\n" + "accountnumberformats/1?fields=accountType,prefixType")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = AccountNumberFormatsApiResourceSwagger.GetAccountNumberFormatsIdResponse.class)})
+    public String retrieveOne(@Context final UriInfo uriInfo, @PathParam("accountNumberFormatId") @ApiParam(value = "accountNumberFormatId") final Long accountNumberFormatId) {
 
         this.context.authenticatedUser().validateHasReadPermission(AccountNumberFormatConstants.ENTITY_NAME);
 
@@ -135,7 +143,10 @@ public String retrieveOne(@Context final UriInfo uriInfo, @PathParam("accountNum
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String create(final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Create an Account number format", notes = "Note: You may associate a single Account number format for a given account type\n" + "Mandatory Fields for Account number formats\n" + "accountType")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", paramType = "body", dataType = "body", format = "body", dataTypeClass = AccountNumberFormatsApiResourceSwagger.PostAccountNumberFormatsRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = AccountNumberFormatsApiResourceSwagger.PostAccountNumberFormatsResponse.class)})
+    public String create(@ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder() //
                 .createAccountNumberFormat() //
@@ -151,7 +162,10 @@ public String create(final String apiRequestBodyAsJson) {
     @Path("{accountNumberFormatId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String update(@PathParam("accountNumberFormatId") final Long accountNumberFormatId, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Update an Account number format")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true,paramType = "body", dataType = "body", format = "body", dataTypeClass = AccountNumberFormatsApiResourceSwagger.PutAccountNumberFormatsRequest.class )})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = AccountNumberFormatsApiResourceSwagger.PutAccountNumberFormatsResponse.class)})
+    public String update(@PathParam("accountNumberFormatId") @ApiParam(value = "accountNumberFormatId") final Long accountNumberFormatId, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder() //
                 .updateAccountNumberFormat(accountNumberFormatId) //
@@ -167,7 +181,9 @@ public String update(@PathParam("accountNumberFormatId") final Long accountNumbe
     @Path("{accountNumberFormatId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String delete(@PathParam("accountNumberFormatId") final Long accountNumberFormatId) {
+    @ApiOperation(value = "Delete an Account number format", notes = "Note: Account numbers created while this format was active would remain unchanged.")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = AccountNumberFormatsApiResourceSwagger.DeleteAccountNumberFormatsResponse.class)})
+    public String delete(@PathParam("accountNumberFormatId") @ApiParam(value = "accountNumberFormatId") final Long accountNumberFormatId) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder() //
                 .deleteAccountNumberFormat(accountNumberFormatId) //
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/api/AccountNumberFormatsApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/api/AccountNumberFormatsApiResourceSwagger.java
new file mode 100644
index 000000000..4dac2f58c
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/accountnumberformat/api/AccountNumberFormatsApiResourceSwagger.java
@@ -0,0 +1,129 @@
+/**
+ * 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.infrastructure.accountnumberformat.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.fineract.infrastructure.core.data.EnumOptionData;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * Created by sanyam on 28/7/17.
+ */
+final class AccountNumberFormatsApiResourceSwagger {
+    private AccountNumberFormatsApiResourceSwagger() {
+        // this class is only for Swagger implementation for Live Documentation
+    }
+
+    @ApiModel(value = "GetAccountNumberFormatsResponse")
+    public static final class GetAccountNumberFormatsResponse {
+        private GetAccountNumberFormatsResponse() {
+
+        }
+//        public List<GetAccountNumberFormatsIdResponse> _;
+
+    }
+
+    @ApiModel(value = "GetAccountNumberFormatsIdResponse")
+    public static final class GetAccountNumberFormatsIdResponse {
+        private GetAccountNumberFormatsIdResponse() {
+
+        }
+        @ApiModelProperty(example = "2")
+        public Long id;
+        public EnumOptionData accountType;
+
+        public EnumOptionData prefixType;
+
+    }
+
+    @ApiModel(value = "GetAccountNumberFormatsResponseTemplate")
+    public static final class GetAccountNumberFormatsResponseTemplate {
+        private GetAccountNumberFormatsResponseTemplate() {
+
+        }
+        public List<EnumOptionData> accountTypeOptions;
+        public Map<String, List<EnumOptionData>> prefixTypeOptions;
+
+    }
+
+    @ApiModel(value = "PostAccountNumberFormatsRequest")
+    public static final class PostAccountNumberFormatsRequest {
+        private PostAccountNumberFormatsRequest() {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long accountType;
+        @ApiModelProperty(example = "101")
+        public Long prefixType;
+
+    }
+
+    @ApiModel(value = "PostAccountNumberFormatsResponse")
+    public static final class PostAccountNumberFormatsResponse {
+        private PostAccountNumberFormatsResponse() {
+
+        }
+        @ApiModelProperty(example = "4")
+        public Long resourceId;
+
+    }
+
+    @ApiModel(value = "PutAccountNumberFormatsRequest")
+    public static final class PutAccountNumberFormatsRequest {
+        private PutAccountNumberFormatsRequest() {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long prefixType;
+
+    }
+
+    @ApiModel(value = "PutAccountNumberFormatsResponse")
+    public static final class PutAccountNumberFormatsResponse {
+        private PutAccountNumberFormatsResponse() {
+
+        }
+        public static final class PutAccountNumberFormatschangesSwagger {
+            private PutAccountNumberFormatschangesSwagger() {
+
+            }
+            @ApiModelProperty(example = "OFFICE_NAME")
+            public Long prefixType;
+        }
+
+        @ApiModelProperty(example = "2")
+        public Long resourceId;
+        public PutAccountNumberFormatschangesSwagger changes;
+
+    }
+
+    @ApiModel(value = "DeleteAccountNumberFormatsResponse")
+    public static final class DeleteAccountNumberFormatsResponse {
+        private DeleteAccountNumberFormatsResponse() {
+
+        }
+        @ApiModelProperty(example = "2")
+        public Long resourceId;
+
+    }
+
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/cache/api/CacheApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/cache/api/CacheApiResource.java
index fd3d1d3bf..982b50df4 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/cache/api/CacheApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/cache/api/CacheApiResource.java
@@ -32,6 +32,7 @@
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.UriInfo;
 
+import io.swagger.annotations.*;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
 import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
@@ -52,6 +53,7 @@
 @Produces({ MediaType.APPLICATION_JSON })
 @Component
 @Scope("singleton")
+@Api(value = "Cache", description = "The following settings are possible for cache:\n" + "\n" + "No Caching: caching turned off\n" + "Single node: caching on for single instance deployments of platorm (works for multiple tenants but only one tomcat)\n" + "By default caching is set to No Caching. Switching between caches results in the cache been clear e.g. from Single node to No cache and back again would clear down the single node cache.")
 public class CacheApiResource {
 
     private final Set<String> RESPONSE_DATA_PARAMETERS = new HashSet<>(Arrays.asList("id"));
@@ -76,6 +78,8 @@ public CacheApiResource(final PlatformSecurityContext context,
     }
 
     @GET
+    @ApiOperation(value = "Retrieve Cache Types", notes = "Returns the list of caches.\n" + "\n" + "Example Requests:\n" + "\n" + "caches")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = CacheApiResourceSwagger.GetCachesResponse.class, responseContainer = "list")})
     public String retrieveAll(@Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
@@ -87,7 +91,10 @@ public String retrieveAll(@Context final UriInfo uriInfo) {
     }
 
     @PUT
-    public String switchCache(final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Switch Cache", notes = "Switches the cache to chosen one.")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = CacheApiResourceSwagger.PutCachesRequest.class )})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = CacheApiResourceSwagger.PutCachesResponse.class)})
+    public String switchCache(@ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().updateCache().withJson(apiRequestBodyAsJson).build();
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/cache/api/CacheApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/cache/api/CacheApiResourceSwagger.java
new file mode 100644
index 000000000..6cd4b860b
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/cache/api/CacheApiResourceSwagger.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.infrastructure.cache.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.fineract.infrastructure.core.data.EnumOptionData;
+
+/**
+ * Created by sanyam on 28/7/17.
+ */
+final class CacheApiResourceSwagger {
+    private CacheApiResourceSwagger() {
+
+    }
+
+    @ApiModel(value = "GetCachesResponse")
+    public static final class GetCachesResponse {
+        private GetCachesResponse() {
+
+        }
+        public EnumOptionData cacheType;
+        public boolean enabled;
+    }
+
+    @ApiModel(value = "PutCachesRequest")
+    public static final class PutCachesRequest {
+        private PutCachesRequest() {
+
+        }
+        @ApiModelProperty(example = "2")
+        public Long cacheType;
+
+    }
+
+    @ApiModel(value = "PutCachesResponse")
+    public static final class PutCachesResponse {
+        private PutCachesResponse() {
+
+        }
+        public static final class PutCachechangesSwagger{
+            private PutCachechangesSwagger() {
+
+            }
+            @ApiModelProperty(example = "2")
+            public Long cacheType;
+
+        }
+        public PutCachechangesSwagger cacheType;
+
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/api/SmsCampaignApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/api/SmsCampaignApiResource.java
index 8de1bbf53..829323b6f 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/api/SmsCampaignApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/campaigns/sms/api/SmsCampaignApiResource.java
@@ -33,6 +33,7 @@
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.UriInfo;
 
+import io.swagger.annotations.*;
 import org.apache.commons.lang.StringUtils;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
@@ -61,6 +62,7 @@
 @Path("/smscampaigns")
 @Component
 @Scope("singleton")
+@Api(value = "SMS Campaigns")
 public class SmsCampaignApiResource {
 
     private final PlatformSecurityContext platformSecurityContext;
@@ -96,6 +98,8 @@ public SmsCampaignApiResource(final PlatformSecurityContext platformSecurityCont
 
     @GET
     @Path("template")
+    @ApiOperation(value = "Retrieve a SMS Campaign", notes = "Example Requests:\n" + "\n" + "smscampaigns/1\n" + "\n" + "\n" + "smscampaigns/1?template=true\n" + "\n" + "\n" + "smscampaigns/template")
+    @ApiResponse(code = 200, message = "", response = SmsCampaignData.class)
     public String template(@Context final UriInfo uriInfo) {
         this.platformSecurityContext.authenticatedUser().validateHasReadPermission(SmsCampaignConstants.RESOURCE_NAME);
         final SmsCampaignData smsCampaignData = this.smsCampaignReadPlatformService.retrieveTemplate(CampaignType.SMS.name());
@@ -106,7 +110,10 @@ public String template(@Context final UriInfo uriInfo) {
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String createCampaign(final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Create a SMS Campaign", notes = "Mandatory Fields\n" + "campaignName, campaignType, triggerType, providerId, runReportId, message\n" + "\n" + "Mandatory Fields for Cash based on selected report id\n" + "paramValue in json format")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass =CommandWrapper.class)})
+    @ApiResponse(code = 200, message = "", response = CommandProcessingResult.class)
+    public String createCampaign(@ApiParam(hidden = true) final String apiRequestBodyAsJson) {
         this.platformSecurityContext.authenticatedUser();
         final CommandWrapper commandRequest = new CommandWrapperBuilder().createSmsCampaign().withJson(apiRequestBodyAsJson).build();
         final CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
@@ -116,6 +123,8 @@ public String createCampaign(final String apiRequestBodyAsJson) {
     @GET
     @Path("{resourceId}")
     @Produces({ MediaType.APPLICATION_JSON })
+    @ApiOperation(value = "Retrieve a SMS Campaign", notes = "Example Requests:\n" + "\n" + "smscampaigns/1\n")
+    @ApiResponse(code = 200, message = "", response = SmsCampaignData.class)
     public String retrieveCampaign(@PathParam("resourceId") final Long resourceId, @Context final UriInfo uriInfo) {
         this.platformSecurityContext.authenticatedUser().validateHasReadPermission(SmsCampaignConstants.RESOURCE_NAME);
         SmsCampaignData smsCampaignData = this.smsCampaignReadPlatformService.retrieveOne(resourceId);
@@ -126,6 +135,8 @@ public String retrieveCampaign(@PathParam("resourceId") final Long resourceId, @
 
     @GET
     @Produces({ MediaType.APPLICATION_JSON })
+    @ApiOperation(value = "List SMS Campaigns", notes = "Example Requests:\n" + "\n" + "smscampaigns")
+    @ApiResponse(code = 200, message = "", response = SmsCampaignData.class)
     public String retrieveAllEmails(@QueryParam("sqlSearch") final String sqlSearch,
             @QueryParam("offset") final Integer offset, @QueryParam("limit") final Integer limit,
             @QueryParam("orderBy") final String orderBy, @QueryParam("sortOrder") final String sortOrder, @Context final UriInfo uriInfo) {
@@ -140,7 +151,10 @@ public String retrieveAllEmails(@QueryParam("sqlSearch") final String sqlSearch,
     @Path("{campaignId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String updateCampaign(@PathParam("campaignId") final Long campaignId, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Update a Campaign")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = CommandWrapper.class)})
+    @ApiResponse(code = 200, message = "", response = CommandProcessingResult.class)
+    public String updateCampaign(@PathParam("campaignId") final Long campaignId, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
         final CommandWrapper commandRequest = new CommandWrapperBuilder().updateSmsCampaign(campaignId).withJson(apiRequestBodyAsJson)
                 .build();
         final CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
@@ -151,8 +165,10 @@ public String updateCampaign(@PathParam("campaignId") final Long campaignId, fin
     @Path("{campaignId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
+    @ApiOperation(value = "SMS Campaign", notes = "Activates | Deactivates | Reactivates")
+    @ApiResponse(code = 200, message = "", response = CommandProcessingResult.class)
     public String handleCommands(@PathParam("campaignId") final Long campaignId, @QueryParam("command") final String commandParam,
-            final String apiRequestBodyAsJson) {
+            @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
         final CommandWrapperBuilder builder = new CommandWrapperBuilder().withJson(apiRequestBodyAsJson);
         CommandProcessingResult result = null;
         CommandWrapper commandRequest = null;
@@ -187,6 +203,8 @@ public String preview(final String apiRequestBodyAsJson, @Context final UriInfo
 
     @DELETE
     @Path("{campaignId}")
+    @ApiOperation(value = "Delete a SMS Campaign", notes = "Note: Only closed SMS Campaigns can be deleted")
+    @ApiResponse(code = 200, message = "", response = CommandProcessingResult.class)
     public String delete(@PathParam("campaignId") final Long campaignId) {
         final CommandWrapper commandRequest = new CommandWrapperBuilder().deleteSmsCampaign(campaignId).build();
         final CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/api/CodeValuesApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/api/CodeValuesApiResource.java
index 4c9faa315..060e1dfe4 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/api/CodeValuesApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/api/CodeValuesApiResource.java
@@ -35,6 +35,7 @@
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.UriInfo;
 
+import io.swagger.annotations.*;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
 import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
@@ -54,6 +55,7 @@
 @Path("/codes/{codeId}/codevalues")
 @Component
 @Scope("singleton")
+@Api(value = "Code Values", description = "Code and code values: Codes represent a specific category of data, their code values are a specific instance of that category.\n" + "\n" + "Codes are mostly system defined which means the code itself comes out of the box and cannot be modified however its code values can be. e.g. 'Customer Identifier', it defaults to a code value of 'Passport' but could be 'Drivers License, National Id' etc")
 public class CodeValuesApiResource {
 
     /**
@@ -86,7 +88,9 @@ public CodeValuesApiResource(final PlatformSecurityContext context, final CodeVa
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveAllCodeValues(@Context final UriInfo uriInfo, @PathParam("codeId") final Long codeId) {
+    @ApiOperation(value = "List Code Values", notes = "Returns the list of Code Values for a given Code\n" + "\n" + "Example Requests:\n" + "\n" + "codes/1/codevalues")
+    @ApiResponses({@ApiResponse(code = 200, message = "A List of Given response", response = CodeValuesApiResourceSwagger.GetCodeValuesDataResponse.class, responseContainer = "list")})
+    public String retrieveAllCodeValues(@Context final UriInfo uriInfo, @PathParam("codeId") @ApiParam(value = "codeId") final Long codeId) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
 
@@ -100,7 +104,9 @@ public String retrieveAllCodeValues(@Context final UriInfo uriInfo, @PathParam("
     @Path("{codeValueId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveCodeValue(@Context final UriInfo uriInfo, @PathParam("codeValueId") final Long codeValueId) {
+    @ApiOperation(value = "Retrieve a Code Value", notes = "Returns the details of a Code Value\n" + "\n" + "Example Requests:\n" + "\n" + "codes/1/codevalues/1")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = CodeValuesApiResourceSwagger.GetCodeValuesDataResponse.class)})
+    public String retrieveCodeValue(@Context final UriInfo uriInfo, @PathParam("codeValueId") @ApiParam(value = "codeValueId") final Long codeValueId) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
 
@@ -113,7 +119,10 @@ public String retrieveCodeValue(@Context final UriInfo uriInfo, @PathParam("code
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String createCodeValue(@PathParam("codeId") final Long codeId, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Create a Code Value", notes = "")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = CodeValuesApiResourceSwagger.PostCodeValuesDataRequest.class )})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = CodeValuesApiResourceSwagger.PostCodeValueDataResponse.class)})
+    public String createCodeValue(@PathParam("codeId") @ApiParam(value = "codeId") final Long codeId, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().createCodeValue(codeId).withJson(apiRequestBodyAsJson).build();
 
@@ -127,8 +136,11 @@ public String createCodeValue(@PathParam("codeId") final Long codeId, final Stri
     @Path("{codeValueId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String updateCodeValue(@PathParam("codeId") final Long codeId, @PathParam("codeValueId") final Long codeValueId,
-            final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Update a Code Value", notes = "Updates the details of a code value.")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = CodeValuesApiResourceSwagger.PutCodeValuesDataRequest.class )})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = CodeValuesApiResourceSwagger.PutCodeValueDataResponse.class)})
+    public String updateCodeValue(@PathParam("codeId") @ApiParam(value = "codeId") final Long codeId, @PathParam("codeValueId") @ApiParam(value = "codeValueId") final Long codeValueId,
+            @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().updateCodeValue(codeId, codeValueId)
                 .withJson(apiRequestBodyAsJson).build();
@@ -142,7 +154,9 @@ public String updateCodeValue(@PathParam("codeId") final Long codeId, @PathParam
     @Path("{codeValueId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String deleteCodeValue(@PathParam("codeId") final Long codeId, @PathParam("codeValueId") final Long codeValueId) {
+    @ApiOperation(value = "Delete a Code Value", notes = "Deletes a code value")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = CodeValuesApiResourceSwagger.DeleteCodeValueDataResponse.class)})
+    public String deleteCodeValue(@PathParam("codeId") @ApiParam(value = "codeId") final Long codeId, @PathParam("codeValueId") @ApiParam(value = "codeValueId") final Long codeValueId) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().deleteCodeValue(codeId, codeValueId).build();
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/api/CodeValuesApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/api/CodeValuesApiResourceSwagger.java
new file mode 100644
index 000000000..636577492
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/api/CodeValuesApiResourceSwagger.java
@@ -0,0 +1,109 @@
+/**
+ * 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.infrastructure.codes.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * Created by sanyam on 30/7/17.
+ */
+final class CodeValuesApiResourceSwagger {
+    private CodeValuesApiResourceSwagger() {
+
+    }
+
+    @ApiModel(value = "GetCodeValuesDataResponse")
+    public static final class GetCodeValuesDataResponse {
+        private GetCodeValuesDataResponse() {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long id;
+        @ApiModelProperty(example = "Passport")
+        public String name;
+        @ApiModelProperty(example = "Passport information")
+        public String description;
+        @ApiModelProperty(example = "0")
+        public Integer position;
+    }
+
+    @ApiModel(value = "PostCodeValuesDataRequest")
+    public static final class PostCodeValuesDataRequest {
+        private PostCodeValuesDataRequest() {
+
+        }
+        @ApiModelProperty(example = "Passport")
+        public String name;
+        @ApiModelProperty(example = "Passport information")
+        public String description;
+        @ApiModelProperty(example = "0")
+        public Integer position;
+    }
+
+    @ApiModel(value = "PostCodeValueDataResponse")
+    public static final class PostCodeValueDataResponse {
+        private PostCodeValueDataResponse() {
+
+        }
+        @ApiModelProperty(example = "4")
+        public Long resourceId;
+    }
+
+    @ApiModel(value = "PutCodeValuesDataRequest")
+    public static final class PutCodeValuesDataRequest {
+        private PutCodeValuesDataRequest() {
+
+        }
+        @ApiModelProperty(example = "Passport")
+        public String name;
+        @ApiModelProperty(example = "Passport information")
+        public String description;
+        @ApiModelProperty(example = "0")
+        public Integer position;
+    }
+
+    @ApiModel(value = "PutCodeValueDataResponse")
+    public static final class PutCodeValueDataResponse {
+        private PutCodeValueDataResponse() {
+
+        }
+        private final class PutCodeValuechangesSwagger{
+            private PutCodeValuechangesSwagger() {}
+            @ApiModelProperty(example = "Passport")
+            public String name;
+            @ApiModelProperty(example = "Passport information")
+            public String description;
+            @ApiModelProperty(example = "0")
+            public Integer position;
+        }
+        @ApiModelProperty(example = "4")
+        public Long resourceId;
+        public PutCodeValuechangesSwagger changes;
+    }
+
+    @ApiModel(value = "DeleteCodeValueDataResponse")
+    public static final class DeleteCodeValueDataResponse {
+        private DeleteCodeValueDataResponse() {
+
+        }
+        @ApiModelProperty(example = "4")
+        public Long resourceId;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/api/CodesApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/api/CodesApiResource.java
index 332657494..b53c22ede 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/api/CodesApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/api/CodesApiResource.java
@@ -35,6 +35,7 @@
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.UriInfo;
 
+import io.swagger.annotations.*;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
 import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
@@ -52,6 +53,7 @@
 @Path("/codes")
 @Component
 @Scope("singleton")
+@Api(value = "Codes", description = "Code and code values: Codes represent a specific category of data, their code values are a specific instance of that category.\n" + "\n" + "Codes are mostly system defined which means the code itself comes out of the box and cannot be modified however its code values can be. e.g. 'Customer Identifier', it defaults to a code value of 'Passport' but could be 'Drivers License, National Id' etc")
 public class CodesApiResource {
 
     /**
@@ -80,6 +82,8 @@ public CodesApiResource(final PlatformSecurityContext context, final CodeReadPla
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
+    @ApiOperation(value = "Retrieve Codes", notes = "Returns the list of codes.\n" + "\n" + "Example Requests:\n" + "\n" + "codes")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = CodesApiResourceSwagger.GetCodesResponse.class, responseContainer = "list")})
     public String retrieveCodes(@Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
@@ -93,7 +97,10 @@ public String retrieveCodes(@Context final UriInfo uriInfo) {
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String createCode(final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Create a Code", notes = "Creates a code. Codes created through api are always 'user defined' and so system defined is marked as false.")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = CodesApiResourceSwagger.PostCodesRequest.class )})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = CodesApiResourceSwagger.PostCodesResponse.class)})
+    public String createCode(@ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().createCode().withJson(apiRequestBodyAsJson).build();
 
@@ -106,7 +113,9 @@ public String createCode(final String apiRequestBodyAsJson) {
     @Path("{codeId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveCode(@PathParam("codeId") final Long codeId, @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Retrieve a Code", notes = "Returns the details of a Code.\n" + "\n" + "Example Requests:\n" + "\n" + "codes/1")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = CodesApiResourceSwagger.GetCodesResponse.class)})
+    public String retrieveCode(@PathParam("codeId") @ApiParam(value = "codeId") final Long codeId, @Context final UriInfo uriInfo) {
 
         final CodeData code = this.readPlatformService.retrieveCode(codeId);
 
@@ -118,7 +127,10 @@ public String retrieveCode(@PathParam("codeId") final Long codeId, @Context fina
     @Path("{codeId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String updateCode(@PathParam("codeId") final Long codeId, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Update a Code", notes = "Updates the details of a code if it is not system defined.")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = CodesApiResourceSwagger.PutCodesRequest.class )})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = CodesApiResourceSwagger.PutCodesResponse.class)})
+    public String updateCode(@PathParam("codeId") @ApiParam(value = "codeId") final Long codeId, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().updateCode(codeId).withJson(apiRequestBodyAsJson).build();
 
@@ -131,7 +143,9 @@ public String updateCode(@PathParam("codeId") final Long codeId, final String ap
     @Path("{codeId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String deleteCode(@PathParam("codeId") final Long codeId) {
+    @ApiOperation(value = "Delete a Code", notes = "Deletes a code if it is not system defined.")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = CodesApiResourceSwagger.DeleteCodesResponse.class)})
+    public String deleteCode(@PathParam("codeId") @ApiParam(value = "codeId") final Long codeId) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().deleteCode(codeId).build();
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/api/CodesApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/api/CodesApiResourceSwagger.java
new file mode 100644
index 000000000..69ce81676
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/codes/api/CodesApiResourceSwagger.java
@@ -0,0 +1,95 @@
+/**
+ * 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.infrastructure.codes.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * Created by sanyam on 29/7/17.
+ */
+final class CodesApiResourceSwagger {
+    private CodesApiResourceSwagger() {
+        // this class is only for Swagger Live Documentation
+    }
+
+    @ApiModel(value = "GetCodesResponse")
+    public static final class GetCodesResponse {
+        private GetCodesResponse() {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long id;
+        @ApiModelProperty(example = "Education")
+        public String name;
+        @ApiModelProperty(example = "true")
+        public boolean systemDefined;
+    }
+
+    @ApiModel(value = "PostCodesRequest")
+    public static final class PostCodesRequest {
+        private PostCodesRequest() {
+
+        }
+        @ApiModelProperty(example = "MyNewCode")
+        public String name;
+    }
+
+    @ApiModel(value = "PostCodesResponse")
+    public static final class PostCodesResponse {
+        private PostCodesResponse() {
+
+        }
+        @ApiModelProperty(example = "4")
+        public Long resourceId;
+    }
+
+    @ApiModel(value = "PutCodesRequest")
+    public static final class PutCodesRequest {
+        private PutCodesRequest() {
+
+        }
+        @ApiModelProperty(example = "MyNewCode(changed)")
+        public String name;
+    }
+
+    @ApiModel(value = "PutCodesResponse")
+    public static final class PutCodesResponse {
+        private PutCodesResponse() {
+
+        }
+        private final class PutCodesApichangesSwagger{
+            private PutCodesApichangesSwagger() {}
+            @ApiModelProperty(example = "MyNewCode(changed)")
+            public String name;
+        }
+        @ApiModelProperty(example = "4")
+        public Long resourceId;
+        public PutCodesApichangesSwagger changes;
+    }
+
+    @ApiModel(value = "DeleteCodesResponse")
+    public static final class DeleteCodesResponse {
+        private DeleteCodesResponse() {
+
+        }
+        @ApiModelProperty(example = "4")
+        public Long resourceId;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/configuration/api/ExternalServicesConfigurationApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/configuration/api/ExternalServicesConfigurationApiResource.java
index 18405d1e9..32449d477 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/configuration/api/ExternalServicesConfigurationApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/configuration/api/ExternalServicesConfigurationApiResource.java
@@ -30,6 +30,7 @@
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.UriInfo;
 
+import io.swagger.annotations.*;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
 import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
@@ -47,6 +48,7 @@
 @Path("/externalservice")
 @Component
 @Scope("singleton")
+@Api(value = "External Services", description = "External Services Configuration related to set of supported configurations for third party services like Amazon S3 and SMTP:\n" + "\n" + "S3 (Amazon S3):\n" + "s3_access_key -\n" + "s3_bucket_name -\n" + "s3_secret_key -\n" + "\n" + "\n" + "SMTP (Email Service):\n" + "username -\n" + "password -\n" + "host -\n" + "port -\n" + "useTLS -")
 public class ExternalServicesConfigurationApiResource {
 
     private final PlatformSecurityContext context;
@@ -75,7 +77,9 @@ public ExternalServicesConfigurationApiResource(final PlatformSecurityContext co
     @Path("{servicename}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveOne(@PathParam("servicename") final String serviceName, @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Retrieve External Services Configuration", notes = "Returns a external Service configurations based on the Service Name.\n" + "\n" + "Service Names supported are S3 and SMTP.\n" + "\n" + "Example Requests:\n" + "\n" + "externalservice/SMTP")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = ExternalServicesPropertiesData.class)})
+    public String retrieveOne(@PathParam("servicename") @ApiParam(value = "servicename") final String serviceName, @Context final UriInfo uriInfo) {
         this.context.authenticatedUser().validateHasReadPermission(ExternalServiceConfigurationApiConstant.EXTERNAL_SERVICE_RESOURCE_NAME);
         final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
         final Collection<ExternalServicesPropertiesData> externalServiceNVPs = this.externalServicePropertiesReadPlatformService
@@ -88,7 +92,11 @@ public String retrieveOne(@PathParam("servicename") final String serviceName, @C
     @Path("{servicename}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String updateExternalServiceProperties(@PathParam("servicename") final String serviceName, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Update External Service", notes = "Updates the external Service Configuration for a Service Name.\n" + "\n" + "Example: \n" + "\n" + "externalservice/S3")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = ExternalServicesConfigurationApiResourceSwagger.PutExternalServiceRequest.class )})
+    @ApiResponses({@ApiResponse(code = 200, message = "")})
+    public String updateExternalServiceProperties(@PathParam("servicename") @ApiParam(value = "servicename") final String serviceName,
+                                                  @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
         // ExternalServicesData external =
         // this.externalServiceReadPlatformService.getExternalServiceDetailsByServiceName(serviceName);
         final CommandWrapper commandRequest = new CommandWrapperBuilder().updateExternalServiceProperties(serviceName)
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/configuration/api/ExternalServicesConfigurationApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/configuration/api/ExternalServicesConfigurationApiResourceSwagger.java
new file mode 100644
index 000000000..8db296ed5
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/configuration/api/ExternalServicesConfigurationApiResourceSwagger.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.infrastructure.configuration.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * Created by sanyam on 30/7/17.
+ */
+final class ExternalServicesConfigurationApiResourceSwagger {
+    private ExternalServicesConfigurationApiResourceSwagger() {
+
+    }
+
+    @ApiModel(value = "PutExternalServiceRequest")
+    public static final class PutExternalServiceRequest{
+        private PutExternalServiceRequest() {
+
+        }
+        @ApiModelProperty(example = "test@mifos.org")
+        public String username;
+        @ApiModelProperty(example = "XXXX")
+        public String password;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/configuration/api/GlobalConfigurationApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/configuration/api/GlobalConfigurationApiResource.java
index 57ab554bc..fd9bb91c9 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/configuration/api/GlobalConfigurationApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/configuration/api/GlobalConfigurationApiResource.java
@@ -27,6 +27,7 @@
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.UriInfo;
 
+import io.swagger.annotations.*;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
 import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
@@ -45,6 +46,7 @@
 @Path("/configurations")
 @Component
 @Scope("singleton")
+@Api(value = "Global Configuration", description = "Global configuration related to set of supported enable/disable configurations:\n" + "\n" + "maker-checker - defaults to false - if true turns on maker-checker functionality\n" + "reschedule-future-repayments - defaults to false - if true reschedules repayemnts which falls on a non-working day to configured repayment rescheduling rule\n" + "allow-transactions-on-non_workingday - defaults to false - if true allows transactions on non-working days\n" + "reschedule-repayments-on-holidays - defaults to false - if true reschedules repayemnts which falls on a non-working day to defined reschedule date\n" + "allow-transactions-on-holiday - defaults to false - if true allows transactions on holidays\n" + "savings-interest-posting-current-period-end - Set it at the database level before any savings interest is posted. When set as false(default), interest will be posted on the first date of next period. If set as true, interest will be posted on last date of current period. There is no difference in the interest amount posted.\n" + "financial-year-beginning-month - Set it at the database level before any savings interest is posted. Allowed values 1 - 12 (January - December). Interest posting periods are evaluated based on this configuration.\n" + "meetings-mandatory-for-jlg-loans - if set to true, enforces all JLG loans to follow a meeting schedule belonging to either the parent group or Center.")
 public class GlobalConfigurationApiResource {
 
     private final Set<String> RESPONSE_DATA_PARAMETERS = new HashSet<>(Arrays.asList("globalConfiguration"));
@@ -76,7 +78,9 @@ public GlobalConfigurationApiResource(final PlatformSecurityContext context,
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveConfiguration(@Context final UriInfo uriInfo,@DefaultValue("false") @QueryParam("survey") final boolean survey) {
+    @ApiOperation(value = "Retrieve Global Configuration | Retrieve Global Configuration for surveys", notes = "Returns the list global enable/disable configurations.\n" + "\n" + "Example Requests:\n" + "\n" + "configurations\n\n" + "\n" + "Returns the list global enable/disable survey configurations.\n" + "\n" + "Example Requests:\n" + "\n" + "configurations/survey")
+    @ApiResponses({@ApiResponse(code = 200, message = "List of example \n response \nsurveys response   \ngiven below", response = GlobalConfigurationApiResourceSwagger.GetGlobalConfigurationsResponse.class, responseContainer = "list")})
+    public String retrieveConfiguration(@Context final UriInfo uriInfo,@DefaultValue("false") @QueryParam("survey") @ApiParam(value = "survey") final boolean survey) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
 
@@ -90,7 +94,9 @@ public String retrieveConfiguration(@Context final UriInfo uriInfo,@DefaultValue
     @Path("{configId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveOne(@PathParam("configId") final Long configId, @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Retrieve Global Configuration", notes = "Returns a global enable/disable configurations.\n" + "\n" + "Example Requests:\n" + "\n" + "configurations/1")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = GlobalConfigurationApiResourceSwagger.GetGlobalConfigurationsResponse.class)})
+    public String retrieveOne(@PathParam("configId") @ApiParam(value = "configId") final Long configId, @Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
 
@@ -105,7 +111,10 @@ public String retrieveOne(@PathParam("configId") final Long configId, @Context f
     @Path("{configId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String updateConfiguration(@PathParam("configId") final Long configId, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Update Global Configuration", notes = "Updates an enable/disable global configuration item.")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = GlobalConfigurationApiResourceSwagger.PutGlobalConfigurationsRequest.class )})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = GlobalConfigurationApiResourceSwagger.PutGlobalConfigurationsResponse.class)})
+    public String updateConfiguration(@PathParam("configId") @ApiParam(value = "configId") final Long configId, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder() //
                 .updateGlobalConfiguration(configId) //
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/configuration/api/GlobalConfigurationApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/configuration/api/GlobalConfigurationApiResourceSwagger.java
new file mode 100644
index 000000000..f5f030f0b
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/configuration/api/GlobalConfigurationApiResourceSwagger.java
@@ -0,0 +1,63 @@
+/**
+ * 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.infrastructure.configuration.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.fineract.infrastructure.configuration.data.GlobalConfigurationPropertyData;
+
+import java.util.List;
+
+/**
+ * Created by sanyam on 30/7/17.
+ */
+final class GlobalConfigurationApiResourceSwagger {
+    private GlobalConfigurationApiResourceSwagger() {
+
+    }
+
+    @ApiModel(value = "GetGlobalConfigurationsResponse")
+    public static final class GetGlobalConfigurationsResponse {
+        private GetGlobalConfigurationsResponse(){}
+        public List<GlobalConfigurationPropertyData> globalConfiguration;
+    }
+
+    @ApiModel(value = "PutGlobalConfigurationsRequest")
+    public static final class PutGlobalConfigurationsRequest {
+        private PutGlobalConfigurationsRequest(){}
+        @ApiModelProperty(example = "true")
+        public boolean enabled;
+        @ApiModelProperty(example = "2")
+        public Long value;
+    }
+
+    @ApiModel(value = "PutGlobalConfigurationsResponse")
+    public static final class PutGlobalConfigurationsResponse {
+        private PutGlobalConfigurationsResponse(){}
+        final class PutGlobalConfigurationsResponsechangesSwagger{
+            private PutGlobalConfigurationsResponsechangesSwagger() {}
+            @ApiModelProperty(example = "true")
+            public boolean enabled;
+        }
+        @ApiModelProperty(example = "4")
+        public Long resourceId;
+        public PutGlobalConfigurationsResponsechangesSwagger changes;
+    }
+
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/api/CreditBureauConfigurationAPI.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/api/CreditBureauConfigurationAPI.java
index 91425d258..4b3a8fb7d 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/api/CreditBureauConfigurationAPI.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/creditbureau/api/CreditBureauConfigurationAPI.java
@@ -35,6 +35,7 @@
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.UriInfo;
 
+import io.swagger.annotations.Api;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
 import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
@@ -58,6 +59,7 @@
 @Path("/CreditBureauConfiguration")
 @Component
 @Scope("singleton")
+@Api(value = "CreditBureau Configuration")
 public class CreditBureauConfigurationAPI {
 	private final Set<String> RESPONSE_DATA_PARAMETERS = new HashSet<>(
 			Arrays.asList("creditBureauId", "alias", "country", "creditBureauProductId", "startDate", "endDate", "isActive"));
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/DatatablesApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/DatatablesApiResource.java
index 1ab734b98..33bfe1787 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/DatatablesApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/DatatablesApiResource.java
@@ -33,6 +33,7 @@
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.UriInfo;
 
+import io.swagger.annotations.*;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
 import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
@@ -55,6 +56,7 @@
 @Path("/datatables")
 @Component
 @Scope("singleton")
+@Api(value = "Data Tables", description = "The datatables API allows you to plug-in your own tables (MySql) that have a relationship to a Apache Fineract core table. For example, you might want to add some extra client fields and record information about each of the clients' family members. Via the API you can create, read, update and delete entries for each 'plugged-in' table. The API checks for permission and for 'data scoping' (only data within the users' office hierarchy can be managed by the user).\n" + "\n" + "The Apache Fineract Reference App uses a JQuery plug-in called stretchydatatables (which in turn uses this datatables resource) to provide a pretty flexible CRUD (Create, Read, Update, Delete) User Interface.")
 public class DatatablesApiResource {
 
     private final PlatformSecurityContext context;
@@ -79,7 +81,10 @@ public DatatablesApiResource(final PlatformSecurityContext context, final Generi
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String getDatatables(@QueryParam("apptable") final String apptable, @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "List Data Tables", notes = "Lists registered data tables and the Apache Fineract Core application table they are registered to.\n" + "\n" + "ARGUMENTS\n" + "\n" + "apptable  - optional" + "\n"+ "The Apache Fineract core application table.\n" + "\n" + "Example Requests:\n" + "\n" + "datatables?apptable=m_client\n" + "\n" + "\n" + "datatables",
+    responseContainer = "List", response = DatatablesApiResourceSwagger.GetDataTablesResponse.class)
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = DatatablesApiResourceSwagger.GetDataTablesResponse.class, responseContainer = "list")})
+    public String getDatatables(@QueryParam("apptable") @ApiParam(value = "apptable") final String apptable, @Context final UriInfo uriInfo) {
 
         final List<DatatableData> result = this.readWriteNonCoreDataService.retrieveDatatableNames(apptable);
 
@@ -90,7 +95,13 @@ public String getDatatables(@QueryParam("apptable") final String apptable, @Cont
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String createDatatable(final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Create Data Table", notes = "Create a new data table and registers it with the Apache Fineract Core application table.\n" + "\n" + "Field Descriptions\n" + "\n" + "Mandatory - datatableName : \n"+ "\nThe name of the Data Table.\n" + "\n" + "Mandatory - apptableName\n" + "\n" + "Application table name. Must be one of the following:\n" + "\n" + "m_client\n" + "\n" + "m_group" +"\n" + "\n" + "m_loan" + "\n" + "\n" + "m_office" + "\n" + "\n" + "m_saving_account" + "\n" + "\n" + "m_product_loan" + "\n" + "\n" + "m_savings_product" + "\n" + "\n" + "Mandatory - columns  " + "\n" + "An array of columns in the new Data Table." + "\n" + "\n" + "Optional - multiRow" + "\n" +
+            "\n" + "Allows to create multiple entries in the Data Table. Optional, defaults to false. If this property is not provided Data Table will allow only one entry." + "\n" + "\n" + "Field Descriptions - columns" + "\n" + "\n" + "Mandatory - name" + "\n" + "\n" + "Name of the created column. Can contain only alphanumeric characters, underscores and spaces, but cannot start with a number. Cannot start or end with an underscore or space." + "\n" + "\n" + "Mandatory - type" + "\n" + "\n" + "Column type. Must be one of the following:" + "\n" + "\n" + "Boolean" + "\n" + "\n" + "Date" + "\n" + "\n" + "DateTime" + "\n" + "\n" + "Decimal" + "\n" + "\n" + "Dropdown" + "\n" +
+            "\n" + "\n" + "Number" + "\n" + "\n" + "String" + "\n" + "\n" + "Text" + "\n" + "\n" + "Mandatory [type = Dropdown] - code" + "\n" + "\n" + "Used in Code Value fields. Column name becomes: code_cd_name. Mandatory if using type Dropdown, otherwise an error is returned." + "\n" + "\n" + "Optional - mandatory" + "\n" + "\n" +
+            "Determines whether this column must have a value in every entry. Optional, defaults to false." + "\n" + "\n" + "Mandatory [type = String] - length" + "\n" + "\n" + "Length of the text field. Mandatory if type String is used, otherwise an error is returned.")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = DatatablesApiResourceSwagger.PostDataTablesRequest.class )})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = DatatablesApiResourceSwagger.PostDataTablesResponse.class)})
+    public String createDatatable(@ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().createDBDatatable(apiRequestBodyAsJson).build();
 
@@ -102,7 +113,10 @@ public String createDatatable(final String apiRequestBodyAsJson) {
     @Path("{datatableName}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String updateDatatable(@PathParam("datatableName") final String datatableName, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Update Data Table", notes = "Modifies fields of a data table. If the apptableName parameter is passed, data table is deregistered and registered with the new application table.")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = DatatablesApiResourceSwagger.PutDataTablesRequest.class )})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = DatatablesApiResourceSwagger.PutDataTablesResponse.class)})
+    public String updateDatatable(@PathParam("datatableName") @ApiParam(value = "datatableName") final String datatableName, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().updateDBDatatable(datatableName, apiRequestBodyAsJson).build();
 
@@ -114,7 +128,9 @@ public String updateDatatable(@PathParam("datatableName") final String datatable
     @Path("{datatableName}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String deleteDatatable(@PathParam("datatableName") final String datatableName, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Delete Data Table", notes = "Deletes a data table and deregisters it from the Apache Fineract Core application table.")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = DatatablesApiResourceSwagger.DeleteDataTablesResponse.class)})
+    public String deleteDatatable(@PathParam("datatableName") @ApiParam(value = "datatableName") final String datatableName, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().deleteDBDatatable(datatableName, apiRequestBodyAsJson).build();
 
@@ -126,8 +142,11 @@ public String deleteDatatable(@PathParam("datatableName") final String datatable
     @Path("register/{datatable}/{apptable}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String registerDatatable(@PathParam("datatable") final String datatable, @PathParam("apptable") final String apptable,
-            final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Register Data Table", notes = "Registers a data table with the Apache Fineract Core application table. This allows the data table to be maintained through the API. In case the datatable is a PPI (survey table), a parameter category should be pass along with the request. The API currently support one category (200)")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", paramType = "body", dataType = "body", format = "body", dataTypeClass = DatatablesApiResourceSwagger.PostDataTablesRegisterDatatableAppTable.class )})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = DatatablesApiResourceSwagger.PutDataTablesResponse.class)})
+    public String registerDatatable(@PathParam("datatable") @ApiParam(value = "datatable") final String datatable, @PathParam("apptable") @ApiParam(value = "apptable") final String apptable,
+            @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().registerDBDatatable(datatable, apptable)
                 .withJson(apiRequestBodyAsJson).build();
@@ -141,7 +160,9 @@ public String registerDatatable(@PathParam("datatable") final String datatable,
     @Path("deregister/{datatable}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String deregisterDatatable(@PathParam("datatable") final String datatable) {
+    @ApiOperation(value = "Deregister Data Table", notes = "Deregisters a data table. It will no longer be available through the API.")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = DatatablesApiResourceSwagger.PutDataTablesResponse.class)})
+    public String deregisterDatatable(@PathParam("datatable") @ApiParam(value = "datatable") final String datatable) {
 
         this.readWriteNonCoreDataService.deregisterDatatable(datatable);
 
@@ -154,7 +175,9 @@ public String deregisterDatatable(@PathParam("datatable") final String datatable
     @Path("{datatable}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String getDatatable(@PathParam("datatable") final String datatable, @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Retrieve Data Table Details", notes = "Lists a registered data table details and the Apache Fineract Core application table they are registered to.")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = DatatablesApiResourceSwagger.GetDataTablesResponse.class)})
+    public String getDatatable(@PathParam("datatable") @ApiParam(value = "datatable") final String datatable, @Context final UriInfo uriInfo) {
 
         final DatatableData result = this.readWriteNonCoreDataService.retrieveDatatable(datatable);
 
@@ -166,8 +189,10 @@ public String getDatatable(@PathParam("datatable") final String datatable, @Cont
     @Path("{datatable}/{apptableId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String getDatatable(@PathParam("datatable") final String datatable, @PathParam("apptableId") final Long apptableId,
-            @QueryParam("order") final String order, @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Retrieve Entry(s) from Data Table", notes = "Gets the entry (if it exists) for data tables that are one to one with the application table. \n" + "Gets the entries (if they exist) for data tables that are one to many with the application table.\n" + "\n" + "Note: The 'fields' parameter is not available for datatables.\n" + "\n" + "ARGUMENTS\n" + "orderoptional Specifies the order in which data is returned.genericResultSetoptional, defaults to false If 'true' an optimised JSON format is returned suitable for tabular display of data. This format is used by the default data tables UI functionality.\n" + "Example Requests:\n" + "\n" + "datatables/extra_client_details/1\n" + "\n" + "\n" + "datatables/extra_family_details/1?order=`Date of Birth` desc\n" + "\n" + "\n" + "datatables/extra_client_details/1?genericResultSet=true")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = DatatablesApiResourceSwagger.GetDataTablesAppTableIdResponse.class)})
+    public String getDatatable(@PathParam("datatable") @ApiParam(value = "datatable") final String datatable, @PathParam("apptableId") @ApiParam(value = "apptableId") final Long apptableId,
+            @QueryParam("order") @ApiParam(value = "order") final String order, @Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasDatatableReadPermission(datatable);
 
@@ -216,8 +241,11 @@ public String getDatatableManyEntry(@PathParam("datatable") final String datatab
     @Path("{datatable}/{apptableId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String createDatatableEntry(@PathParam("datatable") final String datatable, @PathParam("apptableId") final Long apptableId,
-            final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Create Entry in Data Table", notes = "Adds a row to the data table.\n" + "\n" + "Note that the default datatable UI functionality converts any field name containing spaces to underscores when using the API. This means the field name \"Business Description\" is considered the same as \"Business_Description\". So you shouldn't have both \"versions\" in any data table.")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = DatatablesApiResourceSwagger.PostDataTablesAppTableIdRequest.class )})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = DatatablesApiResourceSwagger.PostDataTablesAppTableIdResponse.class)})
+    public String createDatatableEntry(@PathParam("datatable") @ApiParam(value = "datatable") final String datatable, @PathParam("apptableId") @ApiParam(value = "apptableId") final Long apptableId,
+                                       @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder() //
                 .createDatatable(datatable, apptableId, null) //
@@ -233,8 +261,11 @@ public String createDatatableEntry(@PathParam("datatable") final String datatabl
     @Path("{datatable}/{apptableId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String updateDatatableEntryOnetoOne(@PathParam("datatable") final String datatable,
-            @PathParam("apptableId") final Long apptableId, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Update Entry in Data Table (One to One)", notes = "Updates the row (if it exists) of the data table.")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = DatatablesApiResourceSwagger.PutDataTablesAppTableIdRequest.class )})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = DatatablesApiResourceSwagger.PutDataTablesAppTableIdResponse.class)})
+    public String updateDatatableEntryOnetoOne(@PathParam("datatable") @ApiParam(value = "datatable") final String datatable,
+            @PathParam("apptableId") @ApiParam(value = "apptableId") final Long apptableId, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder() //
                 .updateDatatable(datatable, apptableId, null) //
@@ -250,9 +281,12 @@ public String updateDatatableEntryOnetoOne(@PathParam("datatable") final String
     @Path("{datatable}/{apptableId}/{datatableId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String updateDatatableEntryOneToMany(@PathParam("datatable") final String datatable,
-            @PathParam("apptableId") final Long apptableId, @PathParam("datatableId") final Long datatableId,
-            final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Update Entry in Data Table (One to Many)", notes = "Updates the row (if it exists) of the data table.")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = DatatablesApiResourceSwagger.PutDataTablesAppTableIdDatatableIdRequest.class )})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = DatatablesApiResourceSwagger.PutDataTablesAppTableIdDatatableIdResponse.class)})
+    public String updateDatatableEntryOneToMany(@PathParam("datatable") @ApiParam(value = "datatable") final String datatable,
+            @PathParam("apptableId") @ApiParam(value = "apptableId") final Long apptableId, @PathParam("datatableId") @ApiParam(value = "datatableId") final Long datatableId,
+            @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder() //
                 .updateDatatable(datatable, apptableId, datatableId) //
@@ -268,7 +302,9 @@ public String updateDatatableEntryOneToMany(@PathParam("datatable") final String
     @Path("{datatable}/{apptableId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String deleteDatatableEntries(@PathParam("datatable") final String datatable, @PathParam("apptableId") final Long apptableId) {
+    @ApiOperation(value = "Delete Entry(s) in Data Table", notes = "Deletes the entry (if it exists) for data tables that are one-to-one with the application table. \n" + "Deletes the entries (if they exist) for data tables that are one-to-many with the application table.")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = DatatablesApiResourceSwagger.DeleteDataTablesDatatableAppTableIdResponse.class)})
+    public String deleteDatatableEntries(@PathParam("datatable") @ApiParam(value = "datatable") final String datatable, @PathParam("apptableId") @ApiParam(value = "apptableId") final Long apptableId) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder() //
                 .deleteDatatable(datatable, apptableId, null) //
@@ -283,8 +319,10 @@ public String deleteDatatableEntries(@PathParam("datatable") final String datata
     @Path("{datatable}/{apptableId}/{datatableId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String deleteDatatableEntries(@PathParam("datatable") final String datatable, @PathParam("apptableId") final Long apptableId,
-            @PathParam("datatableId") final Long datatableId) {
+    @ApiOperation(value = "Delete Entry in Datatable (One to Many)", notes = "Deletes the entry (if it exists) for data tables that are one to many with the application table.\n" + "\n")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = DatatablesApiResourceSwagger.DeleteDataTablesDatatableAppTableIdDatatableIdResponse.class)})
+    public String deleteDatatableEntries(@PathParam("datatable") @ApiParam(value = "datatable", type = "body", example = "{}") final String datatable, @PathParam("apptableId") @ApiParam(value = "apptableId") final Long apptableId,
+            @PathParam("datatableId") @ApiParam(value = "datatableId") final Long datatableId) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder() //
                 .deleteDatatable(datatable, apptableId, datatableId) //
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/DatatablesApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/DatatablesApiResourceSwagger.java
new file mode 100644
index 000000000..abf45277d
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/DatatablesApiResourceSwagger.java
@@ -0,0 +1,253 @@
+/**
+ * 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.infrastructure.dataqueries.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.fineract.infrastructure.dataqueries.data.GenericResultsetData;
+import org.apache.fineract.infrastructure.dataqueries.data.ResultsetColumnHeaderData;
+import org.apache.fineract.infrastructure.dataqueries.data.ResultsetRowData;
+
+import java.util.List;
+
+/**
+ * Created by sanyam on 31/7/17.
+ */
+final class DatatablesApiResourceSwagger {
+    private DatatablesApiResourceSwagger() {
+
+    }
+
+    @ApiModel(value = "GetDataTablesResponse")
+    public static final class GetDataTablesResponse {
+        private GetDataTablesResponse() {
+
+        }
+        @ApiModelProperty(example = "m_client")
+        public String appTableName;
+        @ApiModelProperty(example = "extra_client_details")
+        public String datatableName;
+        public List<ResultsetColumnHeaderData> column;
+    }
+
+    @ApiModel(value = "PostDataTablesRequest")
+    public static final class PostDataTablesRequest{
+        private PostDataTablesRequest() {
+
+        }
+        @ApiModelProperty(example = "m_client")
+        public String applicationTableName;
+        @ApiModelProperty(example = "extra_client_details")
+        public String registeredTableName;
+        @ApiModelProperty(example = "true")
+        public boolean multiRow;
+        public List<ResultsetColumnHeaderData> columnHeaderData;
+    }
+
+    @ApiModel(value = "PostDataTablesResponse")
+    public static final class PostDataTablesResponse{
+        private PostDataTablesResponse() {
+
+        }
+        @ApiModelProperty(example = "extra_client_details")
+        public String resourceIdentifier;
+    }
+
+    @ApiModel(value = "PutDataTablesRequest")
+    public static final class PutDataTablesRequest{
+        private PutDataTablesRequest() {
+
+        }
+        final class PutDataTablesRequestDropColumns {
+            private PutDataTablesRequestDropColumns() {}
+            @ApiModelProperty(example = "Gender_cd_Question")
+            public String name;
+        }
+        final class PutDataTablesRequestAddColumns {
+            private PutDataTablesRequestAddColumns() {
+            }
+            @ApiModelProperty(example = "Question")
+            public String name;
+            @ApiModelProperty(example = "Dropdown")
+            public String type;
+            @ApiModelProperty(example = "Gender")
+            public String code;
+            @ApiModelProperty(example = "true")
+            public boolean mandatory;
+        }
+        final class PutDataTablesRequestChangeColumns {
+            private PutDataTablesRequestChangeColumns() {
+            }
+            @ApiModelProperty(example = "Question")
+            public String name;
+            @ApiModelProperty(example = "Question 2")
+            public String newName;
+            @ApiModelProperty(example = "Gender")
+            public String code;
+            @ApiModelProperty(example = "Gender2")
+            public String newCode;
+            @ApiModelProperty(example = "true")
+            public boolean mandatory;
+        }
+        @ApiModelProperty(example = "m_client")
+        public String appTableName;
+        public List<PutDataTablesRequestDropColumns> dropColumns;
+        public List<PutDataTablesRequestAddColumns> addColumns;
+        public List<PutDataTablesRequestChangeColumns> ChangeColumns;
+    }
+
+    @ApiModel(value = "PutDataTablesResponse")
+    public static final class PutDataTablesResponse{
+        private PutDataTablesResponse() {
+
+        }
+        @ApiModelProperty(example = "extra_client_details")
+        public String resourceIdentifier;
+    }
+
+    @ApiModel(value = "DeleteDataTablesResponse")
+    public static final class DeleteDataTablesResponse{
+        private DeleteDataTablesResponse() {
+
+        }
+        @ApiModelProperty(example = "extra_client_details")
+        public String resourceIdentifier;
+    }
+
+    @ApiModel(value = "PostDataTablesRegisterDatatableAppTable")
+    public static final class PostDataTablesRegisterDatatableAppTable {
+        private PostDataTablesRegisterDatatableAppTable () {}
+    }
+
+    @ApiModel(value = "PostDataTablesAppTableIdRequest")
+    public static final class PostDataTablesAppTableIdRequest{
+        private PostDataTablesAppTableIdRequest() {
+
+        }
+        @ApiModelProperty(example = "Livestock sales")
+        public String BusinessDescription;
+        @ApiModelProperty(example = "First comment made")
+        public String Comment;
+        @ApiModelProperty(example = "Primary")
+        public String Education_cv;
+        @ApiModelProperty(example = "6")
+        public Long Gender_cd;
+        @ApiModelProperty(example = "8.5")
+        public Double HighestRatePaid;
+        @ApiModelProperty(example = "01 October 2012")
+        public String NextVisit;
+        @ApiModelProperty(example = "5")
+        public Long YearsinBusiness;
+        @ApiModelProperty(example = "dd MMMM yyyy")
+        public String dateFormat;
+        @ApiModelProperty(example = "en")
+        public String locale;
+    }
+
+    @ApiModel(value = "PostDataTablesAppTableIdResponse ")
+    public static final class PostDataTablesAppTableIdResponse {
+        private PostDataTablesAppTableIdResponse () {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long resourceId;
+    }
+
+    @ApiModel(value = "GetDataTablesAppTableIdResponse")
+    public static final class GetDataTablesAppTableIdResponse {
+        private GetDataTablesAppTableIdResponse() {
+
+        }
+        public List<ResultsetColumnHeaderData> columnHeaders;
+        public List<ResultsetRowData> data;
+    }
+
+    @ApiModel(value = "PutDataTablesAppTableIdRequest")
+    public static final class PutDataTablesAppTableIdRequest{
+        private PutDataTablesAppTableIdRequest() {
+
+        }
+        @ApiModelProperty(example = "Livestock sales updated")
+        public String BusinessDescription;
+    }
+
+    @ApiModel(value = "PutDataTablesAppTableIdResponse")
+    public static final class PutDataTablesAppTableIdResponse {
+        private PutDataTablesAppTableIdResponse() {
+
+        }
+        final class PutDataTablesAppTableIdResponseChanges{
+            private PutDataTablesAppTableIdResponseChanges () {}
+            @ApiModelProperty(example = "Livestock sales updated")
+            public String BusinessDescription;
+        }
+        @ApiModelProperty(example = "1")
+        public Long resourceId;
+        public PutDataTablesAppTableIdResponseChanges changes;
+    }
+
+    @ApiModel(value = "PutDataTablesAppTableIdDatatableIdRequest")
+    public static final class PutDataTablesAppTableIdDatatableIdRequest{
+        private PutDataTablesAppTableIdDatatableIdRequest() {
+
+        }
+        @ApiModelProperty(example = "01 June 1982")
+        public String DateOfBirth;
+        @ApiModelProperty(example = "5")
+        public Long Education_cdHighest;
+        @ApiModelProperty(example = "June")
+        public String Name;
+        @ApiModelProperty(example = "More notes")
+        public String OtherNotes;
+        @ApiModelProperty(example = "20")
+        public Long PointsScore;
+        @ApiModelProperty(example = "dd MMMM yyyy")
+        public String dateFormat;
+        @ApiModelProperty(example = "en")
+        public String locale;
+    }
+
+    @ApiModel(value = "PutDataTablesAppTableIdDatatableIdResponse ")
+    public static final class PutDataTablesAppTableIdDatatableIdResponse {
+        private PutDataTablesAppTableIdDatatableIdResponse () {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long resourceId;
+    }
+
+    @ApiModel(value = "DeleteDataTablesDatatableAppTableIdResponse ")
+    public static final class DeleteDataTablesDatatableAppTableIdResponse {
+        private DeleteDataTablesDatatableAppTableIdResponse () {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long resourceId;
+    }
+
+    @ApiModel(value = "DeleteDataTablesDatatableAppTableIdDatatableIdResponse ")
+    public static final class DeleteDataTablesDatatableAppTableIdDatatableIdResponse {
+        private DeleteDataTablesDatatableAppTableIdDatatableIdResponse () {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long resourceId;
+    }
+
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/EntityDatatableChecksApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/EntityDatatableChecksApiResource.java
index 880687495..0ae09b0f5 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/EntityDatatableChecksApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/EntityDatatableChecksApiResource.java
@@ -30,6 +30,7 @@
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.UriInfo;
 
+import io.swagger.annotations.*;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
 import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
@@ -52,6 +53,7 @@
 @Path("/entityDatatableChecks")
 @Component
 @Scope("singleton")
+@Api(value = "Entity-Datatable Checks", description = "This defines Entity-Datatable Check.")
 public class EntityDatatableChecksApiResource {
 
     private final PlatformSecurityContext context;
@@ -76,9 +78,11 @@ public EntityDatatableChecksApiResource(final PlatformSecurityContext context, f
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveAll(@Context final UriInfo uriInfo, @QueryParam("status") final Long status,
-            @QueryParam("entity") final String entity, @QueryParam("productId") final Long productId,
-            @QueryParam("offset") final Integer offset, @QueryParam("limit") final Integer limit) {
+    @ApiOperation(value = "List Entity-Datatable Checks", notes = "The list capability of Entity-Datatable Checks can support pagination.\n" + "\n" + "OPTIONAL ARGUMENTS\n" + "offset Integer optional, defaults to 0 Indicates the result from which pagination startslimit Integer optional, defaults to 200 Restricts the size of results returned. To override the default and return all entries you must explicitly pass a non-positive integer value for limit e.g. limit=0, or limit=-1\n" + "Example Request:\n" + "\n" + "entityDatatableChecks?offset=0&limit=15")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = EntityDatatableChecksApiResourceSwagger.GetEntityDatatableChecksResponse.class, responseContainer = "list")})
+    public String retrieveAll(@Context final UriInfo uriInfo, @QueryParam("status") @ApiParam(value = "status") final Long status,
+            @QueryParam("entity") @ApiParam(value = "entity") final String entity, @QueryParam("productId") @ApiParam(value = "productId") final Long productId,
+            @QueryParam("offset") @ApiParam(value = "offset") final Integer offset, @QueryParam("limit") @ApiParam(value = "limit") final Integer limit) {
         final SearchParameters searchParameters = SearchParameters.forPagination(offset, limit);
         final Page<EntityDataTableChecksData> result = this.readEntityDatatableChecksService.retrieveAll(searchParameters, status, entity,
                 productId);
@@ -91,6 +95,8 @@ public String retrieveAll(@Context final UriInfo uriInfo, @QueryParam("status")
     @Path("template")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
+    @ApiOperation(value = "Retrieve Entity-Datatable Checks Template", notes = "This is a convenience resource useful for building maintenance user interface screens for Entity-Datatable Checks applications. The template data returned consists of:\n" + "\n" + "Allowed Value Lists\n" + "Example Request:\n" + "\n" + "entityDatatableChecks/template")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = EntityDatatableChecksApiResourceSwagger.GetEntityDatatableChecksTemplateResponse.class)})
     public String getTemplate(@Context final UriInfo uriInfo) {
 
         final EntityDataTableChecksTemplateData result = this.readEntityDatatableChecksService.retrieveTemplate();
@@ -102,7 +108,10 @@ public String getTemplate(@Context final UriInfo uriInfo) {
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String createEntityDatatableCheck(final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Create Entity-Datatable Checks", notes = "Mandatory Fields : \n" + "entity, status, datatableName\n" + "\n" + "Non-Mandatory Fields : \n" + "productId")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = EntityDatatableChecksApiResourceSwagger.PostEntityDatatableChecksTemplateRequest.class )})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = EntityDatatableChecksApiResourceSwagger.PostEntityDatatableChecksTemplateResponse.class)})
+    public String createEntityDatatableCheck(@ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().createEntityDatatableChecks(apiRequestBodyAsJson).build();
         final CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
@@ -113,7 +122,9 @@ public String createEntityDatatableCheck(final String apiRequestBodyAsJson) {
     @Path("{entityDatatableCheckId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String deleteDatatable(@PathParam("entityDatatableCheckId") final long entityDatatableCheckId, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Delete Entity-Datatable Checks", notes = "Deletes an existing Entity-Datatable Check")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = EntityDatatableChecksApiResourceSwagger.DeleteEntityDatatableChecksTemplateResponse.class)})
+    public String deleteDatatable(@PathParam("entityDatatableCheckId") @ApiParam(value = "entityDatatableCheckId") final long entityDatatableCheckId, final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().deleteEntityDatatableChecks(entityDatatableCheckId,
                 apiRequestBodyAsJson).build();
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/EntityDatatableChecksApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/EntityDatatableChecksApiResourceSwagger.java
new file mode 100644
index 000000000..86e1de1b9
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/EntityDatatableChecksApiResourceSwagger.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.infrastructure.dataqueries.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.fineract.infrastructure.core.data.EnumOptionData;
+import org.apache.fineract.infrastructure.dataqueries.data.DatatableCheckStatusData;
+import org.apache.fineract.infrastructure.dataqueries.data.DatatableChecksData;
+import org.apache.fineract.portfolio.loanproduct.data.LoanProductData;
+import org.apache.fineract.portfolio.savings.data.SavingsProductData;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Created by sanyam on 31/7/17.
+ */
+final class EntityDatatableChecksApiResourceSwagger {
+    private EntityDatatableChecksApiResourceSwagger() {
+
+    }
+
+    @ApiModel(value = "GetEntityDatatableChecksResponse")
+    public static final class GetEntityDatatableChecksResponse {
+        private GetEntityDatatableChecksResponse(){}
+
+        public long id;
+        public String entity;
+        public EnumOptionData status;
+        public String datatableName;
+        public boolean systemDefined;
+        public Long order;
+        public Long productId;
+        public String productName;
+    }
+
+    @ApiModel(value = "GetEntityDatatableChecksTemplateResponse")
+    public static final class GetEntityDatatableChecksTemplateResponse {
+        private GetEntityDatatableChecksTemplateResponse(){}
+
+        public List<String> entities;
+        public List<DatatableCheckStatusData> statusClient;
+        public List<DatatableCheckStatusData> statusGroup;
+        public List<DatatableCheckStatusData> statusSavings;
+        public List<DatatableCheckStatusData> statusLoans;
+        public List<DatatableChecksData> datatables;
+        public Collection<LoanProductData> loanProductDatas;
+        public Collection<SavingsProductData> savingsProductDatas;
+    }
+
+    @ApiModel(value = "PostEntityDatatableChecksTemplateRequest")
+    public static final class PostEntityDatatableChecksTemplateRequest{
+        private PostEntityDatatableChecksTemplateRequest() {
+
+        }
+        @ApiModelProperty(example = "m_loan")
+        public String entity;
+        @ApiModelProperty(example = "100")
+        public Long status;
+        @ApiModelProperty(example = "Additional Details")
+        public String datatableName;
+        @ApiModelProperty(example = "1")
+        public Long productId;
+    }
+
+    @ApiModel(value = "PostEntityDatatableChecksTemplateResponse")
+    public static final class PostEntityDatatableChecksTemplateResponse{
+        private PostEntityDatatableChecksTemplateResponse() {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long resourceId;
+    }
+
+    @ApiModel(value = "DeleteEntityDatatableChecksTemplateResponse")
+    public static final class DeleteEntityDatatableChecksTemplateResponse{
+        private DeleteEntityDatatableChecksTemplateResponse() {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long resourceId;
+    }
+}
+
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/ReportsApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/ReportsApiResource.java
index f77be4e85..88df3a3c0 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/ReportsApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/ReportsApiResource.java
@@ -35,6 +35,7 @@
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.UriInfo;
 
+import io.swagger.annotations.*;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
 import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
@@ -52,6 +53,7 @@
 @Path("/reports")
 @Component
 @Scope("singleton")
+@Api(value = "Reports", description = "Non-core reports can be added, updated and deleted.")
 public class ReportsApiResource {
 
     private final Set<String> RESPONSE_DATA_PARAMETERS = new HashSet<>(Arrays.asList("id", "reportName", "reportType", "reportSubType",
@@ -79,6 +81,8 @@ public ReportsApiResource(final PlatformSecurityContext context, final ReadRepor
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
+    @ApiOperation(value = "List Reports", notes = "Lists all reports and their parameters.\n" + "\n" + "Example Request:\n" + "\n" + "reports", responseContainer = "List", response = ReportsApiResourceSwagger.GetReportsResponse.class)
+    @ApiResponses({@ApiResponse(code = 200, message = "")})
     public String retrieveReportList(@Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
@@ -93,7 +97,9 @@ public String retrieveReportList(@Context final UriInfo uriInfo) {
     @Path("{id}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveReport(@PathParam("id") final Long id, @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Retrieve a Report\n", notes = "Example Requests:\n" + "\n" + "reports/1\n" + "\n" + "\n" + "reports/1?template=true")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = ReportsApiResourceSwagger.GetReportsResponse.class)})
+    public String retrieveReport(@PathParam("id") @ApiParam(value = "id") final Long id, @Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
 
@@ -111,6 +117,8 @@ public String retrieveReport(@PathParam("id") final Long id, @Context final UriI
     @Path("template")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
+    @ApiOperation(value = "Retrieve Report Template", notes = "This is a convenience resource. It can be useful when building maintenance user interface screens for client applications. The template data returned consists of any or all of:\n" + "\n" + "Field Defaults\n" + "Allowed Value Lists\n" + "\n" + "Example Request : \n" + "\n" + "reports/template")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = ReportsApiResourceSwagger.GetReportsTemplateResponse.class)})
     public String retrieveOfficeTemplate(@Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
@@ -125,7 +133,10 @@ public String retrieveOfficeTemplate(@Context final UriInfo uriInfo) {
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String createReport(final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Create a Report", notes = "")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = ReportsApiResourceSwagger.PostRepostRequest.class )})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = ReportsApiResourceSwagger.PostReportsResponse.class)})
+    public String createReport(@ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().createReport().withJson(apiRequestBodyAsJson).build();
 
@@ -138,7 +149,10 @@ public String createReport(final String apiRequestBodyAsJson) {
     @Path("{id}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String updateReport(@PathParam("id") final Long id, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Update a Report", notes = "Only the useReport value can be updated for core reports.")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = ReportsApiResourceSwagger.PutReportRequest.class )})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = ReportsApiResourceSwagger.PutReportResponse.class)})
+    public String updateReport(@PathParam("id") @ApiParam(value = "id") final Long id, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().updateReport(id).withJson(apiRequestBodyAsJson).build();
 
@@ -151,7 +165,9 @@ public String updateReport(@PathParam("id") final Long id, final String apiReque
     @Path("{id}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String deleteReport(@PathParam("id") final Long id) {
+    @ApiOperation(value = "Delete a Report", notes = "Only non-core reports can be deleted.")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = ReportsApiResourceSwagger.DeleteReportsResponse.class)})
+    public String deleteReport(@PathParam("id") @ApiParam(value = "id") final Long id) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().deleteReport(id).build();
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/ReportsApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/ReportsApiResourceSwagger.java
new file mode 100644
index 000000000..8358a3e5e
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/ReportsApiResourceSwagger.java
@@ -0,0 +1,139 @@
+/**
+ * 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.infrastructure.dataqueries.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.fineract.infrastructure.dataqueries.data.ReportParameterData;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * Created by sanyam on 4/8/17.
+ */
+final class ReportsApiResourceSwagger {
+    private ReportsApiResourceSwagger() {
+
+    }
+
+    @ApiModel(value = "GetReportsResponse")
+    public static final class GetReportsResponse {
+        private GetReportsResponse() {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long id;
+        @ApiModelProperty(example = "Client Listing")
+        public String reportName;
+        @ApiModelProperty(example = "Table")
+        public String reportType;
+        public String reportSubType;
+        @ApiModelProperty(example = "Client")
+        public String reportCategory;
+        @ApiModelProperty(example = "Individual Client Report Lists the small number of defined fields on the client table.  Would expect to copy this report and add any one to one additional data for specific tenant needs. Can be run for any size MFI but you expect it only to be run within a branch for larger ones.  Depending on how many columns are displayed, there is probably is a limit of about 20/50k clients returned for html display (export to excel doesnt have that client browser/memory impact).")
+        public String description;
+        @ApiModelProperty(example = "")
+        public String reportSql;
+        @ApiModelProperty(example = "true")
+        public Boolean coreReport;
+        @ApiModelProperty(example = "true")
+        public Boolean useReport;
+        public Collection<ReportParameterData> reportParameters;
+
+    }
+
+    @ApiModel(value = "GetReportsTemplateResponse")
+    public static final class GetReportsTemplateResponse {
+        private GetReportsTemplateResponse(){
+
+        }
+
+        public List<String> allowedReportTypes;
+        public List<String> allowedReportSubTypes;
+        public Collection<ReportParameterData> allowedParameters;
+    }
+
+    @ApiModel(value = "PostRepostRequest")
+    public static final class PostRepostRequest {
+        private PostRepostRequest() {
+
+        }
+        @ApiModelProperty(example = "Completely New Report")
+        public String reportName;
+        @ApiModelProperty(example = "Table")
+        public String reportType;
+        @ApiModelProperty(example = "")
+        public String reportSubType;
+        @ApiModelProperty(example = "Loan")
+        public String reportCategory;
+        @ApiModelProperty(example = "Just An Example")
+        public String description;
+        @ApiModelProperty(example = "select 'very good sql' as AComment")
+        public String reportSql;
+        public Collection<ReportParameterData> reportParameters;
+    }
+
+    @ApiModel(value = "PostReportsResponse")
+    public static final class PostReportsResponse {
+        private PostReportsResponse(){
+
+        }
+        @ApiModelProperty(example = "132")
+        public long resourceId;
+    }
+
+    @ApiModel(value = "PutReportRequest")
+    public static final class PutReportRequest {
+        private PutReportRequest() {
+
+        }
+        @ApiModelProperty(example = "Completely New Report")
+        public String reportName;
+        public Collection<ReportParameterData> reportParameters;
+
+    }
+
+    @ApiModel(value = "PutReportResponse")
+    public static final class PutReportResponse {
+        private PutReportResponse() {
+
+        }
+        final class PutReportResponseChanges{
+            private PutReportResponseChanges() {
+
+            }
+            @ApiModelProperty(example = "Changed New Report")
+            public String reportName;
+            public Collection<ReportParameterData> reportParameters;
+        }
+        @ApiModelProperty(example = "132")
+        public long resourceId;
+        public PutReportResponseChanges changes;
+    }
+
+    @ApiModel(value = "DeleteReportsResponse")
+    public static final class DeleteReportsResponse {
+        private DeleteReportsResponse(){
+
+        }
+        @ApiModelProperty(example = "132")
+        public long resourceId;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/RunreportsApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/RunreportsApiResource.java
index b664d414f..ff83770e9 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/RunreportsApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/RunreportsApiResource.java
@@ -36,6 +36,7 @@
 import javax.ws.rs.core.StreamingOutput;
 import javax.ws.rs.core.UriInfo;
 
+import io.swagger.annotations.*;
 import org.apache.fineract.infrastructure.core.api.ApiParameterHelper;
 import org.apache.fineract.infrastructure.core.serialization.ToApiJsonSerializer;
 import org.apache.fineract.infrastructure.dataqueries.data.GenericResultsetData;
@@ -54,6 +55,7 @@
 @Path("/runreports")
 @Component
 @Scope("singleton")
+@Api(value = "Run Reports", description = "")
 public class RunreportsApiResource {
 
     private final PlatformSecurityContext context;
@@ -77,7 +79,10 @@ public RunreportsApiResource(final PlatformSecurityContext context, final ReadRe
     @Path("{reportName}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON, "text/csv", "application/vnd.ms-excel", "application/pdf", "text/html" })
-    public Response runReport(@PathParam("reportName") final String reportName, @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Running a Report", notes = "This resource allows you to run and receive output from pre-defined Apache Fineract reports.\n" + "\n" + "Reports can also be used to provide data for searching and workflow functionality.\n" + "\n" + "The default output is a JSON formatted \"Generic Resultset\". The Generic Resultset contains Column Heading as well as Data information. However, you can export to CSV format by simply adding \"&exportCSV=true\" to the end of your URL.\n" + "\n" + "If Pentaho reports have been pre-defined, they can also be run through this resource. Pentaho reports can return HTML, PDF or CSV formats.\n" + "\n" + "The Apache Fineract reference application uses a JQuery plugin called stretchy reporting which, itself, uses this reports resource to provide a pretty flexible reporting User Interface (UI).\n\n" + "\n" +
+            "\n" + "Example Requests:\n" + "\n" + "runreports/Client%20Listing?R_officeId=1\n" + "\n" + "\n" + "runreports/Client%20Listing?R_officeId=1&exportCSV=true\n" + "\n" + "\n" + "runreports/OfficeIdSelectOne?R_officeId=1&parameterType=true\n" + "\n" + "\n" + "runreports/OfficeIdSelectOne?R_officeId=1&parameterType=true&exportCSV=true\n" + "\n" + "\n" + "runreports/Expected%20Payments%20By%20Date%20-%20Formatted?R_endDate=2013-04-30&R_loanOfficerId=-1&R_officeId=1&R_startDate=2013-04-16&output-type=HTML&R_officeId=1\n" + "\n" + "\n" + "runreports/Expected%20Payments%20By%20Date%20-%20Formatted?R_endDate=2013-04-30&R_loanOfficerId=-1&R_officeId=1&R_startDate=2013-04-16&output-type=XLS&R_officeId=1\n" + "\n" + "\n" + "runreports/Expected%20Payments%20By%20Date%20-%20Formatted?R_endDate=2013-04-30&R_loanOfficerId=-1&R_officeId=1&R_startDate=2013-04-16&output-type=CSV&R_officeId=1\n" + "\n" + "\n" + "runreports/Expected%20Payments%20By%20Date%20-%20Formatted?R_endDate=2013-04-30&R_loanOfficerId=-1&R_officeId=1&R_startDate=2013-04-16&output-type=PDF&R_officeId=1")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = RunreportsApiResourceSwagger.GetReportNameResponse.class)})
+    public Response runReport(@PathParam("reportName") @ApiParam(value = "reportName") final String reportName, @Context final UriInfo uriInfo) {
 
         final MultivaluedMap<String, String> queryParams = uriInfo.getQueryParameters();
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/RunreportsApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/RunreportsApiResourceSwagger.java
new file mode 100644
index 000000000..1303fd160
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/dataqueries/api/RunreportsApiResourceSwagger.java
@@ -0,0 +1,40 @@
+/**
+ * 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.infrastructure.dataqueries.api;
+
+import io.swagger.annotations.ApiModel;
+import org.apache.fineract.infrastructure.dataqueries.data.ResultsetColumnHeaderData;
+import org.apache.fineract.infrastructure.dataqueries.data.ResultsetRowData;
+
+/**
+ * Created by sanyam on 5/8/17.
+ */
+final class RunreportsApiResourceSwagger {
+    private RunreportsApiResourceSwagger() {
+
+    }
+    @ApiModel(value = "GetReportNameResponse")
+    public static final class GetReportNameResponse {
+        private GetReportNameResponse() {
+
+        }
+        public ResultsetColumnHeaderData columnHeaders;
+        public ResultsetRowData row;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/api/DocumentManagementApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/api/DocumentManagementApiResource.java
index 83537f817..b937cd8c1 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/api/DocumentManagementApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/api/DocumentManagementApiResource.java
@@ -39,6 +39,7 @@
 import javax.ws.rs.core.Response.ResponseBuilder;
 import javax.ws.rs.core.UriInfo;
 
+import io.swagger.annotations.*;
 import org.apache.fineract.infrastructure.core.api.ApiRequestParameterHelper;
 import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
 import org.apache.fineract.infrastructure.core.serialization.ApiRequestJsonSerializationSettings;
@@ -60,6 +61,7 @@
 @Path("{entityType}/{entityId}/documents")
 @Component
 @Scope("singleton")
+@Api(value = "Documents", description = "Multiple Documents (a combination of a name, description and a file) may be attached to different Entities like Clients, Groups, Staff, Loans, Savings and Client Identifiers in the system\n" + "\n" + "Note: The currently allowed Entities are\n" + "\n" + "Clients: URL Pattern as clients\n" + "Staff: URL Pattern as staff\n" + "Loans: URL Pattern as loans\n" + "Savings: URL Pattern as savings\n" + "Client Identifiers: URL Pattern as client_identifiers\n" + "Groups: URL Pattern as groups")
 public class DocumentManagementApiResource {
 
     private final Set<String> RESPONSE_DATA_PARAMETERS = new HashSet<>(Arrays.asList("id", "parentEntityType", "parentEntityId",
@@ -87,8 +89,10 @@ public DocumentManagementApiResource(final PlatformSecurityContext context,
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retreiveAllDocuments(@Context final UriInfo uriInfo, @PathParam("entityType") final String entityType,
-            @PathParam("entityId") final Long entityId) {
+    @ApiOperation(value = "List documents", notes = "Example Requests:\n" + "\n" + "clients/1/documents\n" + "\n" + "client_identifiers/1/documents\n" + "\n" + "loans/1/documents?fields=name,description")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = DocumentManagementApiResourceSwagger.GetEntityTypeEntityIdDocumentsResponse.class, responseContainer = "list")})
+    public String retreiveAllDocuments(@Context final UriInfo uriInfo, @PathParam("entityType") @ApiParam(value = "entityType") final String entityType,
+            @PathParam("entityId") @ApiParam(value = "entityId") final Long entityId) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.SystemEntityType);
 
@@ -101,10 +105,12 @@ public String retreiveAllDocuments(@Context final UriInfo uriInfo, @PathParam("e
     @POST
     @Consumes({ MediaType.MULTIPART_FORM_DATA })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String createDocument(@PathParam("entityType") final String entityType, @PathParam("entityId") final Long entityId,
-            @HeaderParam("Content-Length") final Long fileSize, @FormDataParam("file") final InputStream inputStream,
-            @FormDataParam("file") final FormDataContentDisposition fileDetails, @FormDataParam("file") final FormDataBodyPart bodyPart,
-            @FormDataParam("name") final String name, @FormDataParam("description") final String description) {
+    @ApiOperation(value = "Create a Document", notes = "Note: A document is created using a Multi-part form upload \n" + "\n" + "Body Parts\n" + "\n" + "name : \n" + "Name or summary of the document\n" + "\n" + "description : \n" + "Description of the document\n" + "\n" + "file : \n" + "The file to be uploaded\n" + "\n" + "Mandatory Fields : \n" + "file and description")
+    @ApiResponses({@ApiResponse(code = 200, message = "Not Shown (multi-part form data)", response = DocumentManagementApiResourceSwagger.PostEntityTypeEntityIdDocumentsResponse.class)})
+    public String createDocument(@PathParam("entityType") @ApiParam(value = "entityType") final String entityType, @PathParam("entityId") @ApiParam(value = "entityId") final Long entityId,
+            @HeaderParam("Content-Length") @ApiParam(value = "Content-Length") final Long fileSize, @FormDataParam("file") @ApiParam(value = "file") final InputStream inputStream,
+            @FormDataParam("file") final @ApiParam(value = "file") FormDataContentDisposition fileDetails, @FormDataParam("file") @ApiParam(value = "file") final FormDataBodyPart bodyPart,
+            @FormDataParam("name") @ApiParam(value = "name") final String name, @FormDataParam("description") @ApiParam(value = "description") final String description) {
 
         /**
          * TODO: also need to have a backup and stop reading from stream after
@@ -127,11 +133,13 @@ public String createDocument(@PathParam("entityType") final String entityType, @
     @Path("{documentId}")
     @Consumes({ MediaType.MULTIPART_FORM_DATA })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String updateDocument(@PathParam("entityType") final String entityType, @PathParam("entityId") final Long entityId,
-            @PathParam("documentId") final Long documentId, @HeaderParam("Content-Length") final Long fileSize,
-            @FormDataParam("file") final InputStream inputStream, @FormDataParam("file") final FormDataContentDisposition fileDetails,
-            @FormDataParam("file") final FormDataBodyPart bodyPart, @FormDataParam("name") final String name,
-            @FormDataParam("description") final String description) {
+    @ApiOperation(value = "Update a Document", notes = "Note: A document is updated using a Multi-part form upload \n" + "Body Parts\n" + "name\n" + "Name or summary of the document\n" + "description\n" + "Description of the document\n" + "file\n" + "The file to be uploaded")
+    @ApiResponses({@ApiResponse(code = 200, message = "Not Shown (multi-part form data)", response = DocumentManagementApiResourceSwagger.PutEntityTypeEntityIdDocumentsResponse.class)})
+    public String updateDocument(@PathParam("entityType") @ApiParam(value = "entityType") final String entityType, @PathParam("entityId") @ApiParam(value = "entityId") final Long entityId,
+            @PathParam("documentId") @ApiParam(value = "documentId") final Long documentId, @HeaderParam("Content-Length") @ApiParam(value = "Content-Length") final Long fileSize,
+            @FormDataParam("file") @ApiParam(value = "file") final InputStream inputStream, @FormDataParam("file") @ApiParam(value = "file") final FormDataContentDisposition fileDetails,
+            @FormDataParam("file") @ApiParam(value = "file") final FormDataBodyPart bodyPart, @FormDataParam("name") @ApiParam(value = "name") final String name,
+            @FormDataParam("description") @ApiParam(value = "description") final String description) {
 
         final Set<String> modifiedParams = new HashSet<>();
         modifiedParams.add("name");
@@ -166,8 +174,10 @@ public String updateDocument(@PathParam("entityType") final String entityType, @
     @Path("{documentId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String getDocument(@PathParam("entityType") final String entityType, @PathParam("entityId") final Long entityId,
-            @PathParam("documentId") final Long documentId, @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Retrieve a Document", notes = "Example Requests:\n" + "\n" + "clients/1/documents/1\n" + "\n" + "\n" + "loans/1/documents/1\n" + "\n" + "\n" + "client_identifiers/1/documents/1?fields=name,description")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = DocumentManagementApiResourceSwagger.GetEntityTypeEntityIdDocumentsResponse.class)})
+    public String getDocument(@PathParam("entityType") @ApiParam(value = "entityType") final String entityType, @PathParam("entityId") @ApiParam(value = "entityId") final Long entityId,
+            @PathParam("documentId") @ApiParam(value = "documentId") final Long documentId, @Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.SystemEntityType);
 
@@ -181,8 +191,10 @@ public String getDocument(@PathParam("entityType") final String entityType, @Pat
     @Path("{documentId}/attachment")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_OCTET_STREAM })
-    public Response downloadFile(@PathParam("entityType") final String entityType, @PathParam("entityId") final Long entityId,
-            @PathParam("documentId") final Long documentId) {
+    @ApiOperation(value = "Retrieve Binary File associated with Document", notes = "Request used to download the file associated with the document\n" + "\n" + "Example Requests:\n" + "\n" + "clients/1/documents/1/attachment\n" + "\n" + "\n" + "loans/1/documents/1/attachment")
+    @ApiResponses({@ApiResponse(code = 200, message = "Not Shown: The corresponding Binary file")})
+    public Response downloadFile(@PathParam("entityType") @ApiParam(value = "entityType") final String entityType, @PathParam("entityId") @ApiParam(value = "entityId") final Long entityId,
+            @PathParam("documentId") @ApiParam(value = "documentId") final Long documentId) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.SystemEntityType);
 
@@ -198,8 +210,10 @@ public Response downloadFile(@PathParam("entityType") final String entityType, @
     @Path("{documentId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String deleteDocument(@PathParam("entityType") final String entityType, @PathParam("entityId") final Long entityId,
-            @PathParam("documentId") final Long documentId) {
+    @ApiOperation(value = "Remove a Document", notes = "")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = DocumentManagementApiResourceSwagger.DeleteEntityTypeEntityIdDocumentsResponse.class)})
+    public String deleteDocument(@PathParam("entityType") @ApiParam(value = "entityType") final String entityType, @PathParam("entityId") @ApiParam(value = "entityId") final Long entityId,
+            @PathParam("documentId") @ApiParam(value = "documentId") final Long documentId) {
 
         final DocumentCommand documentCommand = new DocumentCommand(null, documentId, entityType, entityId, null, null, null, null, null,
                 null);
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/api/DocumentManagementApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/api/DocumentManagementApiResourceSwagger.java
new file mode 100644
index 000000000..39fe48215
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/api/DocumentManagementApiResourceSwagger.java
@@ -0,0 +1,110 @@
+/**
+ * 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.infrastructure.documentmanagement.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * Created by sanyam on 7/8/17.
+ */
+
+final class DocumentManagementApiResourceSwagger {
+    private DocumentManagementApiResourceSwagger() {
+
+    }
+
+    @ApiModel(value = "GetEntityTypeEntityIdDocumentsResponse")
+    public static final class GetEntityTypeEntityIdDocumentsResponse {
+        private GetEntityTypeEntityIdDocumentsResponse() {
+
+        }
+
+        @ApiModelProperty(example = "1")
+        public Long id;
+        @ApiModelProperty(example = "clients")
+        public String parentEntityType;
+        @ApiModelProperty(example = "1")
+        public Long parentEntityId;
+        @ApiModelProperty(example = "Client Details Form")
+        public String name;
+        @ApiModelProperty(example = "CGAP.pdf")
+        public String fileName;
+        @ApiModelProperty(example = "5246719")
+        public Long size;
+        @ApiModelProperty(example = "application/pdf")
+        public String type;
+        @ApiModelProperty(example = "A signed form signed by new member")
+        public String description;
+        @ApiModelProperty(example = "")
+        public String location;
+        @ApiModelProperty(example = "")
+        public Integer storageType;
+    }
+
+    @ApiModel(value = "PostEntityTypeEntityIdDocumentsResponse")
+    public static final class PostEntityTypeEntityIdDocumentsResponse {
+        private PostEntityTypeEntityIdDocumentsResponse() {
+
+        }
+        @ApiModelProperty(example = "3")
+        public Long resourceId;
+        @ApiModelProperty(example = "3")
+        public String resourceIdentifier;
+    }
+
+    @ApiModel(value = "PutEntityTypeEntityIdDocumentsResponse")
+    public static final class PutEntityTypeEntityIdDocumentsResponse {
+        private PutEntityTypeEntityIdDocumentsResponse() {
+
+        }
+
+        public final class PutEntityTypeEntityIdDocumentsResponseChangesSwagger{
+            private PutEntityTypeEntityIdDocumentsResponseChangesSwagger() {
+
+            }
+
+        }
+        @ApiModelProperty(example = "3")
+        public Long resourceId;
+        public PutEntityTypeEntityIdDocumentsResponseChangesSwagger changes;
+        @ApiModelProperty(example = "3")
+        public String resourceIdentifier;
+    }
+
+    @ApiModel(value = "DeleteEntityTypeEntityIdDocumentsResponse")
+    public static final class DeleteEntityTypeEntityIdDocumentsResponse {
+        private DeleteEntityTypeEntityIdDocumentsResponse() {
+
+        }
+
+        public final class PutEntityTypeEntityIdDocumentsResponseChangesSwagger{
+            private PutEntityTypeEntityIdDocumentsResponseChangesSwagger() {
+
+            }
+
+        }
+        @ApiModelProperty(example = "3")
+        public Long resourceId;
+        public PutEntityTypeEntityIdDocumentsResponseChangesSwagger changes;
+        @ApiModelProperty(example = "3")
+        public String resourceIdentifier;
+    }
+
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/api/ImagesApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/api/ImagesApiResource.java
index 6a653d4eb..39afce5db 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/api/ImagesApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/api/ImagesApiResource.java
@@ -34,6 +34,7 @@
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.ResponseBuilder;
 
+import io.swagger.annotations.Api;
 import org.apache.commons.lang.StringUtils;
 import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
 import org.apache.fineract.infrastructure.core.domain.Base64EncodedImage;
@@ -58,6 +59,7 @@
 @Path("{entity}/{entityId}/images")
 @Component
 @Scope("singleton")
+@Api(value = "DomainName//api//v1//{entity}//{entityId}//images", description = "")
 public class ImagesApiResource {
 
     private final PlatformSecurityContext context;
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/api/ImagesApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/api/ImagesApiResourceSwagger.java
new file mode 100644
index 000000000..7455260d1
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/documentmanagement/api/ImagesApiResourceSwagger.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.infrastructure.documentmanagement.api;
+
+/**
+ * Created by sanyam on 10/8/17.
+ */
+
+final class ImagesApiResourceSwagger {
+    private ImagesApiResourceSwagger() {
+
+    }
+
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/entityaccess/api/FineractEntityApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/entityaccess/api/FineractEntityApiResource.java
index 173c8271a..59ef12a39 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/entityaccess/api/FineractEntityApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/entityaccess/api/FineractEntityApiResource.java
@@ -32,6 +32,7 @@
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.UriInfo;
 
+import io.swagger.annotations.Api;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
 import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
@@ -52,6 +53,7 @@
 @Produces({ MediaType.APPLICATION_JSON })
 @Component
 @Scope("singleton")
+@Api(value = "DomainName/api/v1/entitytoentitymapping", description = "") // https://github.com/swagger-api/swagger-ui/issues/1655
 public class FineractEntityApiResource {
 
     private final PlatformSecurityContext context;
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/api/HookApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/api/HookApiResource.java
index 5aff5da99..21a6753ec 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/api/HookApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/api/HookApiResource.java
@@ -35,6 +35,7 @@
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.UriInfo;
 
+import io.swagger.annotations.*;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
 import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
@@ -54,6 +55,7 @@
 @Produces({ MediaType.APPLICATION_JSON })
 @Component
 @Scope("singleton")
+@Api(value = "Hooks", description = "Hooks are a mechanism to trigger custom code on the occurence of events.")
 public class HookApiResource {
 
 	private final PlatformSecurityContext context;
@@ -77,6 +79,8 @@ public HookApiResource(
 	}
 
 	@GET
+	@ApiOperation(value = "Retrieve Hooks", notes = "Returns the list of hooks.\n" + "\n" + "Example Requests:\n" + "\n" + "hooks", responseContainer = "List", response = HookApiResourceSwagger.GetHookResponse.class)
+	@ApiResponses({@ApiResponse(code = 200, message = "", response = HookApiResourceSwagger.GetHookResponse.class, responseContainer = "list")})
 	public String retrieveHooks(@Context final UriInfo uriInfo) {
 
 		this.context.authenticatedUser().validateHasReadPermission(
@@ -93,7 +97,9 @@ public String retrieveHooks(@Context final UriInfo uriInfo) {
 
 	@GET
 	@Path("{hookId}")
-	public String retrieveHook(@PathParam("hookId") final Long hookId,
+	@ApiOperation(value = "Retrieve a Hook", notes = "Returns the details of a Hook.\n" + "\n" + "Example Requests:\n" + "\n" + "hooks/1")
+	@ApiResponses({@ApiResponse(code = 200, message = "", response = HookApiResourceSwagger.GetHookResponse.class)})
+	public String retrieveHook(@PathParam("hookId") @ApiParam(value = "hookId") final Long hookId,
 			@Context final UriInfo uriInfo) {
 
 		this.context.authenticatedUser().validateHasReadPermission(
@@ -116,6 +122,8 @@ public String retrieveHook(@PathParam("hookId") final Long hookId,
 
 	@GET
 	@Path("template")
+	@ApiOperation(value = "Retrieve Hooks Template", notes = "This is a convenience resource. It can be useful when building maintenance user interface screens for client applications. The template data returned consists of any or all of:\n" + "\n" + "Field Defaults\n" + "Allowed Value Lists\n" + "Example Request:\n" + "\n" + "hooks/template")
+	@ApiResponses({@ApiResponse(code = 200, message = "", response = HookApiResourceSwagger.GetHookTemplateResponse.class)})
 	public String template(@Context final UriInfo uriInfo) {
 
 		this.context.authenticatedUser().validateHasReadPermission(
@@ -131,7 +139,10 @@ public String template(@Context final UriInfo uriInfo) {
 	}
 
 	@POST
-	public String createHook(final String apiRequestBodyAsJson) {
+	@ApiOperation(value = "Create a Hook", notes = "The following parameters can be passed for the creation of a hook :-\n" + "\n" + "name - string - Required. The name of the template that is being called. (See /hooks/template for the list of valid hook names.)\n" + "\n" + "isActive - boolean - Determines whether the hook is actually triggered.\n" + "\n" + "events - array - Determines what events the hook is triggered for.\n" + "\n" + "config - hash - Required. Key/value pairs to provide settings for this hook. These settings vary between the templates.\n" + "\n" + "templateId - Optional. The UGD template ID associated with the same entity (client or loan).")
+	@ApiImplicitParams({@ApiImplicitParam(paramType = "body", dataType = "body", required = true, type = "body", dataTypeClass = HookApiResourceSwagger.PostHookRequest.class)})
+	@ApiResponses({@ApiResponse(code = 200, message = "", response = HookApiResourceSwagger.PostHookResponse.class)})
+	public String createHook(@ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
 		final CommandWrapper commandRequest = new CommandWrapperBuilder()
 				.createHook().withJson(apiRequestBodyAsJson).build();
@@ -144,8 +155,11 @@ public String createHook(final String apiRequestBodyAsJson) {
 
 	@PUT
 	@Path("{hookId}")
-	public String updateHook(@PathParam("hookId") final Long hookId,
-			final String apiRequestBodyAsJson) {
+	@ApiOperation(value = "Update a Hook", notes = "Updates the details of a hook.")
+	@ApiImplicitParams({@ApiImplicitParam(paramType = "body", dataType = "body", required = true, type = "body", dataTypeClass = HookApiResourceSwagger.PutHookRequest.class)})
+	@ApiResponses({@ApiResponse(code = 200, message = "", response = HookApiResourceSwagger.PutHookResponse.class)})
+	public String updateHook(@PathParam("hookId") @ApiParam(value = "hookId") final Long hookId,
+			@ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
 		final CommandWrapper commandRequest = new CommandWrapperBuilder()
 				.updateHook(hookId).withJson(apiRequestBodyAsJson).build();
@@ -158,7 +172,9 @@ public String updateHook(@PathParam("hookId") final Long hookId,
 
 	@DELETE
 	@Path("{hookId}")
-	public String deleteHook(@PathParam("hookId") final Long hookId) {
+	@ApiOperation(value = "Delete a Hook", notes = "Deletes a hook.")
+	@ApiResponses({@ApiResponse(code = 200, message = "", response = HookApiResourceSwagger.DeleteHookResponse.class)})
+	public String deleteHook(@PathParam("hookId") @ApiParam(value = "hookId") final Long hookId) {
 
 		final CommandWrapper commandRequest = new CommandWrapperBuilder()
 				.deleteHook(hookId).build();
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/api/HookApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/api/HookApiResourceSwagger.java
new file mode 100644
index 000000000..d1e379cce
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/hooks/api/HookApiResourceSwagger.java
@@ -0,0 +1,147 @@
+/**
+ * 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.infrastructure.hooks.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.fineract.infrastructure.hooks.data.Event;
+import org.apache.fineract.infrastructure.hooks.data.Field;
+import org.apache.fineract.infrastructure.hooks.data.Grouping;
+import org.apache.fineract.infrastructure.hooks.data.HookTemplateData;
+import org.joda.time.LocalDate;
+
+import java.util.List;
+
+/**
+ * Created by sanyam on 11/8/17.
+ */
+
+final class HookApiResourceSwagger {
+    private HookApiResourceSwagger() {
+
+    }
+
+    @ApiModel(value = "PostHookRequest")
+    public static final class PostHookRequest {
+        private PostHookRequest () {
+
+        }
+
+        @ApiModelProperty(example = "Web")
+        public String name;
+        @ApiModelProperty(example = "true")
+        public Boolean isActive;
+        @ApiModelProperty(example = "Kremlin")
+        public String displayName;
+        @ApiModelProperty(example = "1")
+        public Long templateId;
+        public List<Event> events;
+        public List<Field> config;
+    }
+
+    @ApiModel(value = "PostHookResponse")
+    public static final class PostHookResponse {
+        private PostHookResponse() {
+
+        }
+        @ApiModelProperty(example = "4")
+        public Long resourceId;
+    }
+
+    @ApiModel(value = "GetHookResponse")
+    public static final class GetHookResponse {
+        private GetHookResponse() {
+
+        }
+
+        @ApiModelProperty(example = "1")
+        public Long id;
+        @ApiModelProperty(example = "Web")
+        public String name;
+        @ApiModelProperty(example = "Kremlin")
+        public String displayName;
+        @ApiModelProperty(example = "true")
+        public Boolean isActive;
+        @ApiModelProperty(example = "[2014, 9, 16]")
+        public LocalDate createdAt;
+        @ApiModelProperty(example = "[2014, 9, 16]")
+        public LocalDate updatedAt;
+        @ApiModelProperty(example = "1")
+        public Long templateId;
+        @ApiModelProperty(example = "My UGD")
+        public String templateName;
+        public List<Event> events;
+        public List<Field> config;
+    }
+
+    @ApiModel(value = "GetHookTemplateResponse")
+    public static final class GetHookTemplateResponse {
+        private GetHookTemplateResponse() {
+
+        }
+
+        public List<HookTemplateData> templates;
+        public List<Grouping> groupings;
+    }
+
+    @ApiModel(value = "DeleteHookResponse")
+    public static final class DeleteHookResponse {
+        private DeleteHookResponse() {
+
+        }
+        @ApiModelProperty(example = "4")
+        public Long resourceId;
+    }
+
+    @ApiModel(value = "PutHookRequest")
+    public static final class PutHookRequest {
+        private PutHookRequest () {
+
+        }
+
+        @ApiModelProperty(example = "Web")
+        public String name;
+        @ApiModelProperty(example = "true")
+        public Boolean isActive;
+        @ApiModelProperty(example = "Kremlin")
+        public String displayName;
+        @ApiModelProperty(example = "1")
+        public Long templateId;
+        public List<Event> events;
+        public List<Field> config;
+    }
+
+    @ApiModel(value = "PutHookResponse")
+    public static final class PutHookResponse {
+        private PutHookResponse () {
+
+        }
+        final class PutHookResponseChangesSwagger {
+            private PutHookResponseChangesSwagger() {}
+                @ApiModelProperty(example = "Kremlin")
+                public String displayName;
+                @ApiModelProperty(example = "1")
+                public List<Event> events;
+                public List<Field> config;
+        }
+        @ApiModelProperty(example = "4")
+        public Long resourceId;
+        public PutHookResponseChangesSwagger changes;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/api/SchedulerApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/api/SchedulerApiResource.java
index fe743074d..6962f2762 100755
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/api/SchedulerApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/api/SchedulerApiResource.java
@@ -29,6 +29,7 @@
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
 
+import io.swagger.annotations.*;
 import org.apache.commons.lang.StringUtils;
 import org.apache.fineract.infrastructure.core.api.ApiRequestParameterHelper;
 import org.apache.fineract.infrastructure.core.exception.UnrecognizedQueryParamException;
@@ -43,6 +44,7 @@
 
 @Path("/scheduler")
 @Component
+@Api(value = "Scheduler", description = "")
 public class SchedulerApiResource {
 
     private final PlatformSecurityContext context;
@@ -62,6 +64,8 @@ public SchedulerApiResource(final PlatformSecurityContext context, final JobRegi
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
+    @ApiOperation(value = "Retrieve Scheduler Status", notes = "Returns the scheduler status.\n" + "\n" + "Example Requests:\n" + "\n" + "scheduler")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = SchedulerApiResourceSwagger.GetSchedulerResponse.class)})
     public String retrieveStatus(@Context final UriInfo uriInfo) {
         this.context.authenticatedUser().validateHasReadPermission(SchedulerJobApiConstants.SCHEDULER_RESOURCE_NAME);
         final boolean isSchedulerRunning = this.jobRegisterService.isSchedulerRunning();
@@ -74,7 +78,9 @@ public String retrieveStatus(@Context final UriInfo uriInfo) {
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public Response changeSchedulerStatus(@QueryParam(SchedulerJobApiConstants.COMMAND) final String commandParam) {
+    @ApiOperation(value = "Activate Scheduler Jobs | Suspend Scheduler Jobs", notes = "Activates the scheduler job service. | Suspends the scheduler job service.")
+    @ApiResponses({@ApiResponse(code = 200, message = "POST :  scheduler?command=start\n\n"+"\n"+"POST : scheduler?command=stop")})
+    public Response changeSchedulerStatus(@QueryParam(SchedulerJobApiConstants.COMMAND) @ApiParam(value = "command") final String commandParam) {
         // check the logged in user have permissions to update scheduler status
         final boolean hasNotPermission = this.context.authenticatedUser().hasNotPermissionForAnyOf("ALL_FUNCTIONS", "UPDATE_SCHEDULER");
         if (hasNotPermission) {
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/api/SchedulerApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/api/SchedulerApiResourceSwagger.java
new file mode 100644
index 000000000..e2f1b913d
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/api/SchedulerApiResourceSwagger.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.infrastructure.jobs.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * Created by sanyam on 12/8/17.
+ */
+final class SchedulerApiResourceSwagger {
+    private SchedulerApiResourceSwagger(){
+
+    }
+
+    @ApiModel(value = "GetSchedulerResponse")
+    public static final class GetSchedulerResponse {
+        private GetSchedulerResponse() {
+
+        }
+        @ApiModelProperty(example = "true")
+        public boolean active;
+    }
+
+
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/api/SchedulerJobApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/api/SchedulerJobApiResource.java
index 61faf10f1..46e41e99b 100755
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/api/SchedulerJobApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/api/SchedulerJobApiResource.java
@@ -33,6 +33,7 @@
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
 
+import io.swagger.annotations.*;
 import org.apache.commons.lang.StringUtils;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
@@ -57,6 +58,7 @@
 @Consumes({ MediaType.APPLICATION_JSON })
 @Produces({ MediaType.APPLICATION_JSON })
 @Component
+@Api(value = "MIFOSX-BATCH JOBS", description = "Batch jobs (also known as cron jobs on Unix-based systems) are a series of back-end jobs executed on a computer at a particular time defined in job's cron expression.\n" + "\n" + "At any point, you can view the list of batch jobs scheduled to run along with other details specific to each job. Manually you can execute the jobs at any point of time.\n" + "\n" + "The scheduler status can be either \"Active\" or \"Standby\". If the scheduler status is Active, it indicates that all batch jobs are running/ will run as per the specified schedule.If the scheduler status is Standby, it will ensure all scheduled batch runs are suspended.")
 public class SchedulerJobApiResource {
 
     private final SchedulerJobRunnerReadService schedulerJobRunnerReadService;
@@ -84,6 +86,8 @@ public SchedulerJobApiResource(final SchedulerJobRunnerReadService schedulerJobR
     }
 
     @GET
+    @ApiOperation(value = "Retrieve Scheduler Jobs", notes = "Returns the list of jobs.\n" + "\n" + "Example Requests:\n" + "\n" + "jobs")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = SchedulerJobApiResourceSwagger.GetJobsResponse.class, responseContainer = "list")})
     public String retrieveAll(@Context final UriInfo uriInfo) {
         this.context.authenticatedUser().validateHasReadPermission(SchedulerJobApiConstants.SCHEDULER_RESOURCE_NAME);
         final List<JobDetailData> jobDetailDatas = this.schedulerJobRunnerReadService.findAllJobDeatils();
@@ -93,7 +97,9 @@ public String retrieveAll(@Context final UriInfo uriInfo) {
 
     @GET
     @Path("{" + SchedulerJobApiConstants.JOB_ID + "}")
-    public String retrieveOne(@PathParam(SchedulerJobApiConstants.JOB_ID) final Long jobId, @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Retrieve a Job", notes = "Returns the details of a Job.\n" + "\n" + "Example Requests:\n" + "\n" + "jobs/5")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = SchedulerJobApiResourceSwagger.GetJobsResponse.class)})
+    public String retrieveOne(@PathParam(SchedulerJobApiConstants.JOB_ID) @ApiParam(value = "jobId") final Long jobId, @Context final UriInfo uriInfo) {
         this.context.authenticatedUser().validateHasReadPermission(SchedulerJobApiConstants.SCHEDULER_RESOURCE_NAME);
         final JobDetailData jobDetailData = this.schedulerJobRunnerReadService.retrieveOne(jobId);
         final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
@@ -102,9 +108,11 @@ public String retrieveOne(@PathParam(SchedulerJobApiConstants.JOB_ID) final Long
 
     @GET
     @Path("{" + SchedulerJobApiConstants.JOB_ID + "}/" + SchedulerJobApiConstants.JOB_RUN_HISTORY)
-    public String retrieveHistory(@Context final UriInfo uriInfo, @PathParam(SchedulerJobApiConstants.JOB_ID) final Long jobId,
-            @QueryParam("offset") final Integer offset, @QueryParam("limit") final Integer limit,
-            @QueryParam("orderBy") final String orderBy, @QueryParam("sortOrder") final String sortOrder) {
+    @ApiOperation(value = "Retrieve Job Run History", notes = "Example Requests:\n" + "\n" + "jobs/5/runhistory?offset=0&limit=200")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = SchedulerJobApiResourceSwagger.GetJobsJobIDJobRunHistoryResponse.class)})
+    public String retrieveHistory(@Context final UriInfo uriInfo, @PathParam(SchedulerJobApiConstants.JOB_ID) @ApiParam(value = "jobId") final Long jobId,
+            @QueryParam("offset") @ApiParam(value = "offset") final Integer offset, @QueryParam("limit") @ApiParam(value = "limit") final Integer limit,
+            @QueryParam("orderBy") @ApiParam(value = "orderBy") final String orderBy, @QueryParam("sortOrder") @ApiParam(value = "sortOrder") final String sortOrder) {
         this.context.authenticatedUser().validateHasReadPermission(SchedulerJobApiConstants.SCHEDULER_RESOURCE_NAME);
         final SearchParameters searchParameters = SearchParameters.forPagination(offset, limit, orderBy, sortOrder);
         final Page<JobDetailHistoryData> jobhistoryDetailData = this.schedulerJobRunnerReadService.retrieveJobHistory(jobId,
@@ -116,8 +124,10 @@ public String retrieveHistory(@Context final UriInfo uriInfo, @PathParam(Schedul
 
     @POST
     @Path("{" + SchedulerJobApiConstants.JOB_ID + "}")
-    public Response executeJob(@PathParam(SchedulerJobApiConstants.JOB_ID) final Long jobId,
-            @QueryParam(SchedulerJobApiConstants.COMMAND) final String commandParam) {
+    @ApiOperation(value = "Run a Job", notes = "Manually Execute Specific Job.")
+    @ApiResponses({@ApiResponse(code = 200, message = "POST: jobs/1?command=executeJob")})
+    public Response executeJob(@PathParam(SchedulerJobApiConstants.JOB_ID) @ApiParam(value = "jobId") final Long jobId,
+            @QueryParam(SchedulerJobApiConstants.COMMAND) @ApiParam(value = "command") final String commandParam) {
         // check the logged in user have permissions to execute scheduler jobs
         final boolean hasNotPermission = this.context.authenticatedUser().hasNotPermissionForAnyOf("ALL_FUNCTIONS", "EXECUTEJOB_SCHEDULER");
         if (hasNotPermission) {
@@ -136,7 +146,10 @@ public Response executeJob(@PathParam(SchedulerJobApiConstants.JOB_ID) final Lon
 
     @PUT
     @Path("{" + SchedulerJobApiConstants.JOB_ID + "}")
-    public String updateJobDetail(@PathParam(SchedulerJobApiConstants.JOB_ID) final Long jobId, final String jsonRequestBody) {
+    @ApiOperation(value = "Update a Job", notes = "Updates the details of a job.")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = SchedulerJobApiResourceSwagger.PutJobsJobIDRequest.class )})
+    @ApiResponses({@ApiResponse(code = 200, message = "")})
+    public String updateJobDetail(@PathParam(SchedulerJobApiConstants.JOB_ID) @ApiParam(value = "jobId") final Long jobId, @ApiParam(hidden = true) final String jsonRequestBody) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder() //
                 .updateJobDetail(jobId) //
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/api/SchedulerJobApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/api/SchedulerJobApiResourceSwagger.java
new file mode 100644
index 000000000..d77439f10
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/jobs/api/SchedulerJobApiResourceSwagger.java
@@ -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.
+ */
+package org.apache.fineract.infrastructure.jobs.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.fineract.infrastructure.jobs.data.JobDetailHistoryData;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Created by sanyam on 12/8/17.
+ */
+final class SchedulerJobApiResourceSwagger {
+    private SchedulerJobApiResourceSwagger() {
+
+    }
+
+    @ApiModel(value = "GetJobsResponse")
+    public static final class GetJobsResponse {
+        private GetJobsResponse() {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long jobId;
+        @ApiModelProperty(example = "Update loan Summary")
+        public String displayName;
+        @ApiModelProperty(example = "")
+        public Date nextRunTime;
+        @ApiModelProperty(example = "")
+        public String initializingError;
+        @ApiModelProperty(example = "0 0 22 1/1 * ? *")
+        public String cronExpression;
+        @ApiModelProperty(example = "false")
+        public boolean active;
+        @ApiModelProperty(example = "false")
+        public boolean currentlyRunning;
+        public JobDetailHistoryData lastRunHistory;
+    }
+
+    @ApiModel(value = "PutJobsJobsIDRequest")
+    public static final class PutJobsJobIDRequest {
+        private PutJobsJobIDRequest() {
+
+        }
+        @ApiModelProperty(example = "Update loan Summary")
+        public String displayName;
+        @ApiModelProperty(example = "0 0 22 1/1 * ? *")
+        public String cronExpression;
+        @ApiModelProperty(example = "false")
+        public boolean active;
+
+    }
+
+    @ApiModel(value = "GetJobsJobIDJobRunHistoryResponse")
+    public static final class GetJobsJobIDJobRunHistoryResponse {
+        private GetJobsJobIDJobRunHistoryResponse() {
+
+        }
+
+        final class JobDetailHistoryDataSwagger {
+            private JobDetailHistoryDataSwagger(){}
+            @ApiModelProperty(example = "1")
+            public Long version;
+            @ApiModelProperty(example = "Jul 16, 2013 12:00:00 PM")
+            public Date jobRunStartTime;
+            @ApiModelProperty(example = "Jul 16, 2013 12:00:00 PM")
+            public Date jobRunEndTime;
+            @ApiModelProperty(example = "success")
+            public String status;
+            @ApiModelProperty(example = "cron")
+            public String triggerType;
+        }
+        @ApiModelProperty(example = "8")
+        public int totalFilteredRecords;
+        public List<JobDetailHistoryDataSwagger> pageItems;
+
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/reportmailingjob/api/ReportMailingJobApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/reportmailingjob/api/ReportMailingJobApiResource.java
index da6da6d8f..f121626e7 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/reportmailingjob/api/ReportMailingJobApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/reportmailingjob/api/ReportMailingJobApiResource.java
@@ -31,6 +31,7 @@
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.UriInfo;
 
+import io.swagger.annotations.*;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
 import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
@@ -51,6 +52,7 @@
 @Path("/" + ReportMailingJobConstants.REPORT_MAILING_JOB_RESOURCE_NAME)
 @Component
 @Scope("singleton")
+@Api(value = "Report Mailing Jobs", description = "This resource allows you to create a scheduled job that runs a report and sents it by email to specified email addresses.\n" + "\n" + "The scheduled job can be configured to run once or on a regular basis (once a day, twice a week, etc).")
 public class ReportMailingJobApiResource {
 
     private final PlatformSecurityContext platformSecurityContext;
@@ -75,7 +77,10 @@ public ReportMailingJobApiResource(final PlatformSecurityContext platformSecurit
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String createReportMailingJob(final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Create a Report Mailing Job", notes = "Mandatory Fields: " + "name, startDateTime, stretchyReportId, emailRecipients, emailSubject, emailMessage, emailAttachmentFileFormatId, recurrence, isActive\n" + "\n" + "Optional Fields: " + "description, stretchyReportParamMap")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = ReportMailingJobApiResourceSwagger.PostReportMailingJobsRequest.class )})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = ReportMailingJobApiResourceSwagger.PostReportMailingJobsResponse.class)})
+    public String createReportMailingJob(@ApiParam(hidden = true) final String apiRequestBodyAsJson) {
         final CommandWrapper commandWrapper = new CommandWrapperBuilder().
                 createReportMailingJob(ReportMailingJobConstants.REPORT_MAILING_JOB_ENTITY_NAME).
                 withJson(apiRequestBodyAsJson).build();
@@ -89,7 +94,10 @@ public String createReportMailingJob(final String apiRequestBodyAsJson) {
     @Path("{entityId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String updateReportMailingJob(@PathParam("entityId") final Long entityId, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Update a Report Mailing Job\n", notes = "")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = ReportMailingJobApiResourceSwagger.PutReportMailingJobsRequest.class )})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = ReportMailingJobApiResourceSwagger.PutReportMailingJobsResponse.class)})
+    public String updateReportMailingJob(@PathParam("entityId") @ApiParam(value = "entityId") final Long entityId, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
         final CommandWrapper commandWrapper = new CommandWrapperBuilder().
                 updateReportMailingJob(ReportMailingJobConstants.REPORT_MAILING_JOB_ENTITY_NAME, entityId).
                 withJson(apiRequestBodyAsJson).build();
@@ -103,7 +111,10 @@ public String updateReportMailingJob(@PathParam("entityId") final Long entityId,
     @Path("{entityId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String deleteReportMailingJob(@PathParam("entityId") final Long entityId, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Delete a Report Mailing Job", notes = "")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = ReportMailingJobApiResourceSwagger.DeleteReportMailingJobsRequest.class )})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = ReportMailingJobApiResourceSwagger.DeleteReportMailingJobsResponse.class)})
+    public String deleteReportMailingJob(@PathParam("entityId") @ApiParam(value = "entityId") final Long entityId, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
         final CommandWrapper commandWrapper = new CommandWrapperBuilder().
                 deleteReportMailingJob(ReportMailingJobConstants.REPORT_MAILING_JOB_ENTITY_NAME, entityId).
                 withJson(apiRequestBodyAsJson).build();
@@ -117,7 +128,9 @@ public String deleteReportMailingJob(@PathParam("entityId") final Long entityId,
     @Path("{entityId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveReportMailingJob(@PathParam("entityId") final Long entityId, @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Retrieve a Report Mailing Job", notes = "Example Requests:\n" + "\n" + "reportmailingjobs/1\n" + "\n" + "\n" + "reportmailingjobs/1?template=true")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = ReportMailingJobApiResourceSwagger.GetReportMailingJobsResponse.class)})
+    public String retrieveReportMailingJob(@PathParam("entityId") @ApiParam(value = "entityId") final Long entityId, @Context final UriInfo uriInfo) {
         this.platformSecurityContext.authenticatedUser().validateHasReadPermission(ReportMailingJobConstants.REPORT_MAILING_JOB_ENTITY_NAME);
         
         final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
@@ -135,6 +148,8 @@ public String retrieveReportMailingJob(@PathParam("entityId") final Long entityI
     @Path("template")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
+    @ApiOperation(value = "Retrieve Report Mailing Job Details Template", notes = "This is a convenience resource. It can be useful when building maintenance user interface screens for report mailing job applications. The template data returned consists of any or all of:\n" + "\n" + "Field Defaults\n" + "Allowed Value Lists\n" + "Example Request:\n" + "\n" + "reportmailingjobs/template")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = ReportMailingJobApiResourceSwagger.GetReportMailingJobsTemplate.class)})
     public String retrieveReportMailingJobTemplate(@Context final UriInfo uriInfo) {
         this.platformSecurityContext.authenticatedUser().validateHasReadPermission(ReportMailingJobConstants.REPORT_MAILING_JOB_ENTITY_NAME);
         
@@ -147,10 +162,12 @@ public String retrieveReportMailingJobTemplate(@Context final UriInfo uriInfo) {
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
+    @ApiOperation(value = "List Report Mailing Jobs", notes = "Example Requests:\n" + "\n" + "reportmailingjobs")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = ReportMailingJobApiResourceSwagger.GetReportMailingJobsResponse.class, responseContainer = "list")})
     public String retrieveAllReportMailingJobs(@Context final UriInfo uriInfo, 
-            @QueryParam("offset") final Integer offset,
-            @QueryParam("limit") final Integer limit, @QueryParam("orderBy") final String orderBy,
-            @QueryParam("sortOrder") final String sortOrder) {
+            @QueryParam("offset") @ApiParam(value = "offset") final Integer offset,
+            @QueryParam("limit") @ApiParam(value = "limit") final Integer limit, @QueryParam("orderBy") @ApiParam(value = "orderBy") final String orderBy,
+            @QueryParam("sortOrder") @ApiParam(value = "sortOrder") final String sortOrder) {
         this.platformSecurityContext.authenticatedUser().validateHasReadPermission(ReportMailingJobConstants.REPORT_MAILING_JOB_ENTITY_NAME);
         
         final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/reportmailingjob/api/ReportMailingJobApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/reportmailingjob/api/ReportMailingJobApiResourceSwagger.java
new file mode 100644
index 000000000..41b5a36ea
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/reportmailingjob/api/ReportMailingJobApiResourceSwagger.java
@@ -0,0 +1,172 @@
+/**
+ * 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.infrastructure.reportmailingjob.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.fineract.infrastructure.core.data.EnumOptionData;
+import org.apache.fineract.infrastructure.dataqueries.data.ReportData;
+import org.apache.fineract.infrastructure.reportmailingjob.data.ReportMailingJobTimelineData;
+import org.joda.time.DateTime;
+
+import java.util.List;
+
+/**
+ * Created by sanyam on 13/8/17.
+ */
+final class ReportMailingJobApiResourceSwagger {
+    private ReportMailingJobApiResourceSwagger(){
+
+    }
+
+    @ApiModel(value = "GetReportMailingJobsTemplate")
+    public static final class GetReportMailingJobsTemplate {
+        private GetReportMailingJobsTemplate(){
+
+        }
+        @ApiModelProperty(example = "true")
+        public boolean isActive;
+        public List<EnumOptionData> emailAttachmentFileFormatOptions;
+        public List<EnumOptionData> stretchyReportParamDateOptions;
+    }
+
+    @ApiModel(value = "GetReportMailingJobsResponse")
+    public static final class GetReportMailingJobsResponse {
+        private GetReportMailingJobsResponse(){
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long id;
+        @ApiModelProperty(example = "Client Numbers Report")
+        public String name;
+        @ApiModelProperty(example = "Client Numbers Report")
+        public String description;
+        @ApiModelProperty(example = "1469627093000")
+        public DateTime startDateTime;
+        @ApiModelProperty(example = "")
+        public String recurrence;
+        public ReportMailingJobTimelineData timeline;
+        @ApiModelProperty(example = "info@musonisystem.com")
+        public String emailRecipients;
+        @ApiModelProperty(example = "Client Numbers Report")
+        public String emailSubject;
+        @ApiModelProperty(example = "Client Numbers Report")
+        public String emailMessage;
+        @ApiModelProperty(example = "")
+        public EnumOptionData emailAttachmentFileFormat;
+        @ApiModelProperty(example = "")
+        public ReportData stretchyReport;
+        @ApiModelProperty(example = "{\"startDate\":\"2016-07-01\",\"endDate\":\"2016-08-02\",\"selectOffice\":\"1\",\"environementUrl\":\"environementUrl\"}")
+        public String stretchyReportParamMap;
+        @ApiModelProperty(example = "1469627093000")
+        public DateTime nextRunDateTime;
+        @ApiModelProperty(example = "0")
+        public Integer numberOfRuns;
+        @ApiModelProperty(example = "true")
+        public boolean isActive;
+        @ApiModelProperty(example = "1")
+        public Long runAsUserId;
+    }
+
+    @ApiModel(value = "PostReportMailingJobsRequest")
+    public static final class PostReportMailingJobsRequest {
+        private PostReportMailingJobsRequest(){
+
+        }
+        @ApiModelProperty(example = "en_GB")
+        public String locale;
+        @ApiModelProperty(example = "dd-MM-yyyy HH:mm:ss")
+        public String dateFormat;
+        @ApiModelProperty(example = "Client Numbers Report")
+        public String name;
+        @ApiModelProperty(example = "Client Numbers Report")
+        public String description;
+        @ApiModelProperty(example = "1469627093000")
+        public DateTime startDateTime;
+        @ApiModelProperty(example = "120")
+        public Long stretchyReportId;
+        @ApiModelProperty(example = "info@musonisystem.com")
+        public String emailRecipients;
+        @ApiModelProperty(example = "Client Numbers Report")
+        public String emailSubject;
+        @ApiModelProperty(example = "Client Numbers Report")
+        public String emailMessage;
+        @ApiModelProperty(example = "FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,WE,FR")
+        public String recurrence;
+        @ApiModelProperty(example = "true")
+        public boolean isActive;
+        @ApiModelProperty(example = "{\"startDate\":\"2016-07-01\",\"endDate\":\"2016-08-02\",\"selectOffice\":\"1\",\"environementUrl\":\"environementUrl\"}")
+        public String stretchyReportParamMap;
+
+    }
+
+    @ApiModel(value = "PostReportMailingJobsResponse")
+    public static final class PostReportMailingJobsResponse {
+        private PostReportMailingJobsResponse(){
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long resourceId;
+    }
+
+    @ApiModel(value = "PutReportMailingJobsRequest")
+    public static final class PutReportMailingJobsRequest {
+        private PutReportMailingJobsRequest(){
+
+        }
+        @ApiModelProperty(example = "en_GB")
+        public String locale;
+        @ApiModelProperty(example = "dd-MM-yyyy HH:mm:ss")
+        public String dateFormat;
+        @ApiModelProperty(example = "10-08-2016 23:30:00")
+        public DateTime startDateTime;
+    }
+
+    @ApiModel(value = "PutReportMailingJobsResponse")
+    public static final class PutReportMailingJobsResponse {
+        private PutReportMailingJobsResponse(){
+
+        }
+        final class PutReportMailingJobsResponseChanges{
+            private PutReportMailingJobsResponseChanges(){}
+            @ApiModelProperty(example = "10-08-2016 23:30:00")
+            public DateTime startDateTime;
+        }
+        @ApiModelProperty(example = "1")
+        public Long resourceId;
+        public PutReportMailingJobsResponseChanges changes;
+    }
+
+    @ApiModel(value = "DeleteReportMailingJobsRequest ")
+    public static final class DeleteReportMailingJobsRequest {
+        private DeleteReportMailingJobsRequest(){
+
+        }
+    }
+
+    @ApiModel(value = "DeleteReportMailingJobsResponse")
+    public static final class DeleteReportMailingJobsResponse {
+        private DeleteReportMailingJobsResponse(){
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long resourceId;
+    }
+
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/reportmailingjob/api/ReportMailingJobRunHistoryApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/reportmailingjob/api/ReportMailingJobRunHistoryApiResource.java
index a7802eee9..30ebc73c7 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/reportmailingjob/api/ReportMailingJobRunHistoryApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/reportmailingjob/api/ReportMailingJobRunHistoryApiResource.java
@@ -27,6 +27,7 @@
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.UriInfo;
 
+import io.swagger.annotations.*;
 import org.apache.fineract.infrastructure.core.api.ApiRequestParameterHelper;
 import org.apache.fineract.infrastructure.core.serialization.ApiRequestJsonSerializationSettings;
 import org.apache.fineract.infrastructure.core.serialization.DefaultToApiJsonSerializer;
@@ -43,6 +44,7 @@
 @Path("/" + ReportMailingJobConstants.REPORT_MAILING_JOB_RUN_HISTORY_RESOURCE_NAME)
 @Component
 @Scope("singleton")
+@Api(value = "List Report Mailing Job History", description = "")
 public class ReportMailingJobRunHistoryApiResource {
     
     private final PlatformSecurityContext platformSecurityContext;
@@ -64,10 +66,14 @@ public ReportMailingJobRunHistoryApiResource(final PlatformSecurityContext platf
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveAllByReportMailingJobId(@Context final UriInfo uriInfo, 
-            @QueryParam("reportMailingJobId") final Long reportMailingJobId, @QueryParam("offset") final Integer offset,
-            @QueryParam("limit") final Integer limit, @QueryParam("orderBy") final String orderBy,
-            @QueryParam("sortOrder") final String sortOrder) {
+    @ApiOperation(value = "List Report Mailing Job History", notes = "The list capability of report mailing job history can support pagination and sorting.\n" + "\n" + "Example Requests:\n" + "\n" + "reportmailingjobrunhistory/1")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = ReportMailingJobRunHistoryData.class)})
+    public String retrieveAllByReportMailingJobId(@Context final UriInfo uriInfo,
+                                                  @QueryParam("reportMailingJobId") @ApiParam(value = "reportMailingJobId") final Long reportMailingJobId,
+                                                  @QueryParam("offset") @ApiParam(value = "offset") final Integer offset,
+                                                  @QueryParam("limit") @ApiParam(value = "limit") final Integer limit,
+                                                  @QueryParam("orderBy") @ApiParam(value = "orderBy") final String orderBy,
+                                                  @QueryParam("sortOrder") @ApiParam(value = "sortOrder") final String sortOrder) {
         this.platformSecurityContext.authenticatedUser().validateHasReadPermission(ReportMailingJobConstants.REPORT_MAILING_JOB_ENTITY_NAME);
         final SearchParameters searchParameters = SearchParameters.fromReportMailingJobRunHistory(offset, limit, orderBy, sortOrder);
         
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/reportmailingjob/api/ReportMailingJobRunHistoryApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/reportmailingjob/api/ReportMailingJobRunHistoryApiResourceSwagger.java
new file mode 100644
index 000000000..e19538582
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/reportmailingjob/api/ReportMailingJobRunHistoryApiResourceSwagger.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.infrastructure.reportmailingjob.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import io.swagger.annotations.ApiParam;
+import org.joda.time.DateTime;
+
+/**
+ * Created by sanyam on 13/8/17.
+ */
+final class ReportMailingJobRunHistoryApiResourceSwagger {
+    private ReportMailingJobRunHistoryApiResourceSwagger(){
+
+    }
+
+    @ApiModel(value = "GetReportMailingJobRunHistoryResponse")
+    public static final class GetReportMailingJobRunHistoryResponse {
+        private GetReportMailingJobRunHistoryResponse(){
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long id;
+        @ApiModelProperty(example = "1")
+        public Long reportMailingJobId;
+        @ApiModelProperty(example = "1469627093050")
+        public DateTime startDateTime;
+        @ApiModelProperty(example = "1469627093050")
+        public DateTime endDateTime;
+        @ApiModelProperty(example = "success")
+        public String status;
+        @ApiModelProperty(example = "")
+        public String errorMessage;
+        @ApiModelProperty(example = "")
+        public String errorLog;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/api/AuthenticationApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/api/AuthenticationApiResource.java
index e5c20ed6e..c99a4fd47 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/api/AuthenticationApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/api/AuthenticationApiResource.java
@@ -28,6 +28,7 @@
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.MediaType;
 
+import io.swagger.annotations.*;
 import org.apache.fineract.infrastructure.core.data.EnumOptionData;
 import org.apache.fineract.infrastructure.core.serialization.ToApiJsonSerializer;
 import org.apache.fineract.infrastructure.security.constants.TwoFactorConstants;
@@ -53,6 +54,7 @@
 @Component
 @Profile("basicauth")
 @Scope("singleton")
+@Api(value = "Authentication HTTP Basic", description = "An API capability that allows client applications to verify authentication details using HTTP Basic Authentication.")
 public class AuthenticationApiResource {
 
     private final DaoAuthenticationProvider customAuthenticationProvider;
@@ -73,7 +75,9 @@ public AuthenticationApiResource(
 
     @POST
     @Produces({ MediaType.APPLICATION_JSON })
-    public String authenticate(@QueryParam("username") final String username, @QueryParam("password") final String password) {
+    @ApiOperation(value = "Verify authentication", notes = "Authenticates the credentials provided and returns the set roles and permissions allowed.")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = AuthenticationApiResourceSwagger.PostAuthenticationResponse.class), @ApiResponse(code = 400, message = "Unauthenticated. Please login")})
+    public String authenticate(@QueryParam("username") @ApiParam(value = "username") final String username, @QueryParam("password") @ApiParam(value = "password") final String password) {
 
         final Authentication authentication = new UsernamePasswordAuthenticationToken(username, password);
         final Authentication authenticationCheck = this.customAuthenticationProvider.authenticate(authentication);
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/api/AuthenticationApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/api/AuthenticationApiResourceSwagger.java
new file mode 100644
index 000000000..42e3d8fdb
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/api/AuthenticationApiResourceSwagger.java
@@ -0,0 +1,62 @@
+/**
+ * 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.infrastructure.security.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.fineract.infrastructure.core.data.EnumOptionData;
+import org.apache.fineract.useradministration.data.RoleData;
+
+import java.util.Collection;
+
+/**
+ * Created by sanyam on 13/8/17.
+ */
+final class AuthenticationApiResourceSwagger {
+    private AuthenticationApiResourceSwagger(){
+
+    }
+
+    @ApiModel(value = "PostAuthenticationResponse")
+    public static final class PostAuthenticationResponse {
+        private PostAuthenticationResponse() {
+
+        }
+        @ApiModelProperty(example = "mifos")
+        public String username;
+        @ApiModelProperty(example = "1")
+        public Long userId;
+        @ApiModelProperty(example = "bWlmb3M6cGFzc3dvcmQ=")
+        public String base64EncodedAuthenticationKey;
+        @ApiModelProperty(example = "true")
+        public boolean authenticated;
+        @ApiModelProperty(example = "1")
+        public Long officeId;
+        @ApiModelProperty(example = "Head Office")
+        public String officeName;
+        @ApiModelProperty(example = "1")
+        public Long staffId;
+        @ApiModelProperty(example = "Director, Program")
+        public String staffDisplayName;
+        public EnumOptionData organisationalRole;
+        public Collection<RoleData> roles;
+        @ApiModelProperty(example = "ALL_FUNCTIONS")
+        public Collection<String> permissions;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/api/UserDetailsApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/api/UserDetailsApiResource.java
index d05f589e2..91aaea0b3 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/api/UserDetailsApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/api/UserDetailsApiResource.java
@@ -28,6 +28,7 @@
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.MediaType;
 
+import io.swagger.annotations.*;
 import org.apache.fineract.infrastructure.core.data.EnumOptionData;
 import org.apache.fineract.infrastructure.core.serialization.ToApiJsonSerializer;
 import org.apache.fineract.infrastructure.security.constants.TwoFactorConstants;
@@ -53,6 +54,7 @@
 @Component
 @Profile("oauth")
 @Scope("singleton")
+@Api(value = "Fetch authenticated user details", description = "")
 public class UserDetailsApiResource {
 
     private final ResourceServerTokenServices tokenServices;
@@ -73,7 +75,9 @@ public UserDetailsApiResource(@Qualifier("tokenServices") final ResourceServerTo
 
     @GET
     @Produces({ MediaType.APPLICATION_JSON })
-    public String fetchAuthenticatedUserData(@QueryParam("access_token") final String accessToken) {
+    @ApiOperation(value = "Fetch authenticated user details\n", notes = "checks the Authentication and returns the set roles and permissions allowed.")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = UserDetailsApiResourceSwagger.GetUserDetailsResponse.class)})
+    public String fetchAuthenticatedUserData(@QueryParam("access_token") @ApiParam(value = "access_token") final String accessToken) {
 
         final Authentication authentication = this.tokenServices.loadAuthentication(accessToken);
         if (authentication.isAuthenticated()) {
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/api/UserDetailsApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/api/UserDetailsApiResourceSwagger.java
new file mode 100644
index 000000000..38c10f757
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/security/api/UserDetailsApiResourceSwagger.java
@@ -0,0 +1,62 @@
+/**
+ * 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.infrastructure.security.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.fineract.infrastructure.core.data.EnumOptionData;
+import org.apache.fineract.useradministration.data.RoleData;
+
+import java.util.Collection;
+
+/**
+ * Created by sanyam on 13/8/17.
+ */
+final class UserDetailsApiResourceSwagger {
+    private UserDetailsApiResourceSwagger() {
+
+    }
+
+    @ApiModel(value = "GetUserDetailsResponse")
+    public static final class GetUserDetailsResponse {
+        private GetUserDetailsResponse(){
+
+        }
+        @ApiModelProperty(example = "mifos")
+        public String username;
+        @ApiModelProperty(example = "1")
+        public Long userId;
+        @ApiModelProperty(example = "bWlmb3M6cGFzc3dvcmQ=")
+        public String accessToken;
+        @ApiModelProperty(example = "true")
+        public boolean authenticated;
+        @ApiModelProperty(example = "1")
+        public Long officeId;
+        @ApiModelProperty(example = "Head Office")
+        public String officeName;
+        @ApiModelProperty(example = "1")
+        public Long staffId;
+        @ApiModelProperty(example = "mifosStaffDisplayName")
+        public String staffDisplayName;
+        public EnumOptionData organisationalRole;
+        public Collection<RoleData> roles;
+        @ApiModelProperty(example = "ALL_FUNCTIONS")
+        public Collection<String> permissions;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/api/SmsApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/api/SmsApiResource.java
index 9f73ea8ee..7b9c00e3f 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/api/SmsApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/sms/api/SmsApiResource.java
@@ -34,6 +34,7 @@
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.UriInfo;
 
+import io.swagger.annotations.Api;
 import org.apache.fineract.accounting.journalentry.api.DateParam;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
@@ -56,6 +57,7 @@
 @Produces({ MediaType.APPLICATION_JSON })
 @Component
 @Scope("singleton")
+@Api(value = "SMS", description = "")
 public class SmsApiResource {
 
     private final String resourceNameForPermissions = "SMS";
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/survey/api/LikelihoodApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/survey/api/LikelihoodApiResource.java
index 4256fe566..d030ae03a 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/survey/api/LikelihoodApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/survey/api/LikelihoodApiResource.java
@@ -28,6 +28,7 @@
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 
+import io.swagger.annotations.Api;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
 import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
@@ -46,6 +47,7 @@
 @Path("/likelihood")
 @Component
 @Scope("singleton")
+@Api(value = "Likelihood")
 public class LikelihoodApiResource {
 
     private final DefaultToApiJsonSerializer<LikelihoodData> toApiJsonSerializer;
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/survey/api/PovertyLineApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/survey/api/PovertyLineApiResource.java
index ce3cfdc06..4e0b450e2 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/survey/api/PovertyLineApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/survey/api/PovertyLineApiResource.java
@@ -25,6 +25,7 @@
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 
+import io.swagger.annotations.Api;
 import org.apache.fineract.infrastructure.core.serialization.DefaultToApiJsonSerializer;
 import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
 import org.apache.fineract.infrastructure.survey.data.LikeliHoodPovertyLineData;
@@ -37,6 +38,7 @@
 @Path("/povertyLine")
 @Component
 @Scope("singleton")
+@Api(value = "Poverty Line")
 public class PovertyLineApiResource {
 
     private final DefaultToApiJsonSerializer<PpiPovertyLineData> toApiJsonSerializer;
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/survey/api/SurveyApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/survey/api/SurveyApiResource.java
index ec0e46e9f..a230ff439 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/survey/api/SurveyApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/survey/api/SurveyApiResource.java
@@ -30,6 +30,7 @@
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.MediaType;
 
+import io.swagger.annotations.*;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
 import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
@@ -52,6 +53,7 @@
 @Path("/survey")
 @Component
 @Scope("singleton")
+@Api(value = "Survey", description = "")
 public class SurveyApiResource {
 
     private final DefaultToApiJsonSerializer<SurveyData> toApiJsonSerializer;
@@ -78,6 +80,8 @@ public SurveyApiResource(final DefaultToApiJsonSerializer<SurveyData> toApiJsonS
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
+    @ApiOperation(value = "Retrieve surveys", notes = "Retrieve surveys. This allows to retrieve the list of survey tables registered .")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = SurveyApiResourceSwagger.GetSurveyResponse.class, responseContainer = "List")})
     public String retrieveSurveys() {
 
         this.context.authenticatedUser().validateHasReadPermission(SurveyApiConstants.SURVEY_RESOURCE_NAME);
@@ -90,7 +94,9 @@ public String retrieveSurveys() {
     @Path("{surveyName}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveSurvey(@PathParam("surveyName") final String surveyName) {
+    @ApiOperation(value = "Retrieve survey", notes = "Lists a registered survey table details and the Apache Fineract Core application table they are registered to.")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = SurveyApiResourceSwagger.GetSurveyResponse.class)})
+    public String retrieveSurvey(@PathParam("surveyName") @ApiParam(value = "surveyName") final String surveyName) {
 
         this.context.authenticatedUser().validateHasReadPermission(SurveyApiConstants.SURVEY_RESOURCE_NAME);
 
@@ -104,7 +110,10 @@ public String retrieveSurvey(@PathParam("surveyName") final String surveyName) {
     @Path("{surveyName}/{apptableId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String createDatatableEntry(@PathParam("surveyName") final String datatable, @PathParam("apptableId") final Long apptableId,
+    @ApiOperation(value = "Create an entry in the survey table", notes = "Insert and entry in a survey table (full fill the survey)." + "\n" + "\n" + "Refer Link for sample Body:  [ https://demo.openmf.org/api-docs/apiLive.htm#survey_create ] ")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = SurveyApiResourceSwagger.PostSurveySurveyNameApptableIdRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = SurveyApiResourceSwagger.PostSurveySurveyNameApptableIdResponse.class)})
+    public String createDatatableEntry(@PathParam("surveyName") @ApiParam(value = "surveyName") final String datatable, @PathParam("apptableId") @ApiParam(value = "apptableId") final Long apptableId,
             final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder() //
diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/survey/api/SurveyApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/survey/api/SurveyApiResourceSwagger.java
new file mode 100644
index 000000000..322a5a85f
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/survey/api/SurveyApiResourceSwagger.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.infrastructure.survey.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.fineract.infrastructure.dataqueries.data.DatatableData;
+import org.apache.fineract.infrastructure.dataqueries.data.ResultsetColumnHeaderData;
+import org.joda.time.DateTime;
+
+import java.util.List;
+
+/**
+ * Created by sanyam on 13/8/17.
+ */
+final class SurveyApiResourceSwagger {
+    private SurveyApiResourceSwagger(){
+
+    }
+
+    @ApiModel(value = "GetSurveyResponse")
+    public static final class GetSurveyResponse {
+        private GetSurveyResponse(){
+
+        }
+        final class GetSurveyResponseDatatableData {
+            private GetSurveyResponseDatatableData() {
+
+            }
+            @ApiModelProperty(example = "m_client")
+            public String applicationTableName;
+            @ApiModelProperty(example = "ppi_kenya_2005")
+            public String registeredTableName;
+            public List<ResultsetColumnHeaderData> columnHeaderData;
+        }
+        public GetSurveyResponseDatatableData datatableData;
+        @ApiModelProperty(example = "false")
+        public boolean enabled;
+    }
+
+    @ApiModel(value = "PostSurveySurveyNameApptableIdRequest")
+    public static final class PostSurveySurveyNameApptableIdRequest {
+        private PostSurveySurveyNameApptableIdRequest() {
+
+        }
+        @ApiModelProperty(example = "167")
+        public Long ppi_household_members_cd_q1_householdmembers;
+        @ApiModelProperty(example = "174")
+        public Long ppi_highestschool_cd_q2_highestschool;
+        @ApiModelProperty(example = "180")
+        public Long ppi_businessoccupation_cd_q3_businessoccupation;
+        @ApiModelProperty(example = "184")
+        public Long ppi_habitablerooms_cd_q4_habitablerooms;
+        @ApiModelProperty(example = "188")
+        public Long ppi_floortype_cd_q5_floortype;
+        @ApiModelProperty(example = "190")
+        public Long ppi_lightingsource_cd_q6_lightingsource;
+        @ApiModelProperty(example = "193")
+        public Long ppi_irons_cd_q7_irons;
+        @ApiModelProperty(example = "195")
+        public Long ppi_mosquitonets_cd_q8_mosquitonets;
+        @ApiModelProperty(example = "198")
+        public Long ppi_towels_cd_q9_towels;
+        @ApiModelProperty(example = "201")
+        public Long ppi_fryingpans_cd_q10_fryingpans;
+        @ApiModelProperty(example = "2014-12-02 20:30:00")
+        public DateTime Date;
+        @ApiModelProperty(example = "Y-m-d H:i:s")
+        public DateTime dateFormat;
+        @ApiModelProperty(example = "en_GB")
+        public String locale;
+    }
+
+
+    @ApiModel(value = "PostSurveySurveyNameApptableIdResponse")
+    public static final class PostSurveySurveyNameApptableIdResponse {
+        private PostSurveySurveyNameApptableIdResponse() {
+
+        }
+        @ApiModelProperty(example = "2")
+        public Long officeId;
+        @ApiModelProperty(example = "87")
+        public Long clientId;
+        @ApiModelProperty(example = "87")
+        public Long resourceId;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/mix/api/MixReportApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/mix/api/MixReportApiResource.java
index 7abd936bd..09f6520ba 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/mix/api/MixReportApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/mix/api/MixReportApiResource.java
@@ -26,6 +26,7 @@
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.MediaType;
 
+import io.swagger.annotations.Api;
 import org.apache.fineract.mix.data.XBRLData;
 import org.apache.fineract.mix.service.XBRLBuilder;
 import org.apache.fineract.mix.service.XBRLResultService;
@@ -36,6 +37,7 @@
 @Path("/mixreport")
 @Component
 @Scope("singleton")
+@Api(value = "Mix Report", description = "")
 public class MixReportApiResource {
 
     private final XBRLResultService xbrlResultService;
diff --git a/fineract-provider/src/main/java/org/apache/fineract/mix/api/MixTaxonomyApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/mix/api/MixTaxonomyApiResource.java
index 38dde6abe..9210f7155 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/mix/api/MixTaxonomyApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/mix/api/MixTaxonomyApiResource.java
@@ -31,6 +31,7 @@
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.UriInfo;
 
+import io.swagger.annotations.Api;
 import org.apache.fineract.infrastructure.core.api.ApiRequestParameterHelper;
 import org.apache.fineract.infrastructure.core.serialization.ApiRequestJsonSerializationSettings;
 import org.apache.fineract.infrastructure.core.serialization.ToApiJsonSerializer;
@@ -44,6 +45,7 @@
 @Path("/mixtaxonomy")
 @Component
 @Scope("singleton")
+@Api(value = "Mix Taxonomy", description = "")
 public class MixTaxonomyApiResource {
 
     private final Set<String> RESPONSE_DATA_PARAMETERS = new HashSet<>(Arrays.asList("taxonomyId", "name", "namespace", "dimension",
diff --git a/fineract-provider/src/main/java/org/apache/fineract/mix/api/MixTaxonomyMappingApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/mix/api/MixTaxonomyMappingApiResource.java
index 7d50c51f0..2b55eda01 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/mix/api/MixTaxonomyMappingApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/mix/api/MixTaxonomyMappingApiResource.java
@@ -31,6 +31,7 @@
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.UriInfo;
 
+import io.swagger.annotations.Api;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
 import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
@@ -48,6 +49,7 @@
 @Path("/mixmapping")
 @Component
 @Scope("singleton")
+@Api(value = "Mix Mapping")
 public class MixTaxonomyMappingApiResource {
 
     private final Set<String> RESPONSE_DATA_PARAMETERS = new HashSet<>(Arrays.asList("identifier", "config"));
diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/holiday/api/HolidaysApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/holiday/api/HolidaysApiResource.java
index e8b22d3b7..1fc32ac9e 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/organisation/holiday/api/HolidaysApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/holiday/api/HolidaysApiResource.java
@@ -37,6 +37,7 @@
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.UriInfo;
 
+import io.swagger.annotations.*;
 import org.apache.commons.lang.StringUtils;
 import org.apache.fineract.accounting.journalentry.api.DateParam;
 import org.apache.fineract.commands.domain.CommandWrapper;
@@ -57,6 +58,7 @@
 @Path("/holidays")
 @Component
 @Scope("singleton")
+@Api(value = "Holidays", description = "Some MFI's span large regions where different branch offices might observe different holidays. They need the ability to define holidays for specific branch offices and be able to set the repayment rule to follow during those holidays.\n" + "\n" + "The reschedule of repayments to repaymentsRescheduledTo date during defined holidays is turned on/off by enabling/disabling reschedule-repayments-on-holidays in Global configurations.\n" + "\n" + "Allow Repayment transactions on a defined holidays is turned on/off by enabling/disabling allow-transactions-on-holiday in Global configurations.")
 public class HolidaysApiResource {
 
     private final DefaultToApiJsonSerializer<HolidayData> toApiJsonSerializer;
@@ -80,7 +82,10 @@ public HolidaysApiResource(final DefaultToApiJsonSerializer<HolidayData> toApiJs
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String createNewHoliday(final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Create a Holiday", notes = "Mandatory Fields: " + "name, description, fromDate, toDate, repaymentsRescheduledTo, offices")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = HolidaysApiResourceSwagger.PostHolidaysRequest.class )})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = HolidaysApiResourceSwagger.PostHolidaysResponse.class)})
+    public String createNewHoliday(@ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().createHoliday().withJson(apiRequestBodyAsJson).build();
 
@@ -93,8 +98,11 @@ public String createNewHoliday(final String apiRequestBodyAsJson) {
     @Path("{holidayId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String handleCommands(@PathParam("holidayId") final Long holidayId, @QueryParam("command") final String commandParam,
-            final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Activate a Holiday", notes = "Always Holidays are created in pending state. This API allows to activate a holiday.\n" + "\n" + "Only the active holidays are considered for rescheduling the loan repayment.")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = HolidaysApiResourceSwagger.PostHolidaysHolidayIdRequest.class )})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = HolidaysApiResourceSwagger.PostHolidaysHolidayIdResponse.class)})
+    public String handleCommands(@PathParam("holidayId") @ApiParam(value = "holidayId") final Long holidayId, @QueryParam("command") @ApiParam(value = "command") final String commandParam,
+            @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         String jsonApiRequest = apiRequestBodyAsJson;
         if (StringUtils.isBlank(jsonApiRequest)) {
@@ -118,7 +126,9 @@ public String handleCommands(@PathParam("holidayId") final Long holidayId, @Quer
     @Path("{holidayId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveOne(@PathParam("holidayId") final Long holidayId, @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Retrieve a Holiday", notes = "Example Requests:\n" + "\n" + "holidays/1")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = HolidaysApiResourceSwagger.GetHolidaysResponse.class)})
+    public String retrieveOne(@PathParam("holidayId") @ApiParam(value = "holidayId") final Long holidayId, @Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(HOLIDAY_RESOURCE_NAME);
 
@@ -133,7 +143,10 @@ public String retrieveOne(@PathParam("holidayId") final Long holidayId, @Context
     @Path("{holidayId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String update(@PathParam("holidayId") final Long holidayId, final String jsonRequestBody) {
+    @ApiOperation(value = "Update a Holiday", notes = "If a holiday is in pending state (created and not activated) then all fields are allowed to modify. Once holidays become active only name and descriptions are allowed to modify.")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = HolidaysApiResourceSwagger.PutHolidaysHolidayIdRequest.class )})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = HolidaysApiResourceSwagger.PutHolidaysHolidayIdResponse.class)})
+    public String update(@PathParam("holidayId") @ApiParam(value = "holidayId") final Long holidayId, @ApiParam(hidden = true) final String jsonRequestBody) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().updateHoliday(holidayId).withJson(jsonRequestBody).build();
 
@@ -146,7 +159,9 @@ public String update(@PathParam("holidayId") final Long holidayId, final String
     @Path("{holidayId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String delete(@PathParam("holidayId") final Long holidayId) {
+    @ApiOperation(value = "Delete a Holiday", notes = "This API allows to delete a holiday. This is a soft delete the deleted holiday status is marked as deleted.")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = HolidaysApiResourceSwagger.DeleteHolidaysHolidayIdResponse.class)})
+    public String delete(@PathParam("holidayId") @ApiParam(value = "holidayId") final Long holidayId) {
         final CommandWrapper commandRequest = new CommandWrapperBuilder().deleteHoliday(holidayId).build();
         final CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
         return this.toApiJsonSerializer.serialize(result);
@@ -159,9 +174,11 @@ private boolean is(final String commandParam, final String commandValue) {
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveAllHolidays(@Context final UriInfo uriInfo, @QueryParam("officeId") final Long officeId,
-            @QueryParam("fromDate") final DateParam fromDateParam, @QueryParam("toDate") final DateParam toDateParam,
-            @QueryParam("locale") final String locale, @QueryParam("dateFormat") final String dateFormat) {
+    @ApiOperation(value = "List Holidays", notes = "Example Requests:\n" + "\n" + "holidays?officeId=1")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = HolidaysApiResourceSwagger.GetHolidaysResponse.class, responseContainer = "List")})
+    public String retrieveAllHolidays(@Context final UriInfo uriInfo, @QueryParam("officeId") @ApiParam(value = "officeId") final Long officeId,
+            @QueryParam("fromDate") @ApiParam(value = "fromDate") final DateParam fromDateParam, @QueryParam("toDate") @ApiParam(value = "toDate") final DateParam toDateParam,
+            @QueryParam("locale") @ApiParam(value = "locale") final String locale, @QueryParam("dateFormat") @ApiParam(value = "dateFormat") final String dateFormat) {
 
         this.context.authenticatedUser().validateHasReadPermission(HOLIDAY_RESOURCE_NAME);
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/holiday/api/HolidaysApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/holiday/api/HolidaysApiResourceSwagger.java
new file mode 100644
index 000000000..7aa3335dd
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/holiday/api/HolidaysApiResourceSwagger.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.organisation.holiday.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.fineract.infrastructure.core.data.EnumOptionData;
+import org.joda.time.LocalDate;
+
+import java.util.List;
+
+/**
+ * Created by sanyam on 14/8/17.
+ */
+final class HolidaysApiResourceSwagger {
+    private HolidaysApiResourceSwagger() {
+
+    }
+
+    @ApiModel(value = "GetHolidaysResponse")
+    public static final class GetHolidaysResponse {
+        private GetHolidaysResponse() {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long id;
+        @ApiModelProperty(example = "Good Friday")
+        public String name;
+        @ApiModelProperty(example = "[2013, 10, 26]")
+        public LocalDate fromDate;
+        @ApiModelProperty(example = "[2013, 10, 26]")
+        public LocalDate toDate;
+        @ApiModelProperty(example = "[2013, 10, 27]")
+        public LocalDate repaymentsRescheduledTo;
+        @ApiModelProperty(example = "1")
+        public Long officeId;
+        public EnumOptionData status;
+    }
+
+    @ApiModel(value = "PostHolidaysRequest")
+    public static final class PostHolidaysRequest {
+        private PostHolidaysRequest(){
+
+        }
+        final class PostHolidaysRequestOffices {
+            private PostHolidaysRequestOffices(){
+
+            }
+            @ApiModelProperty(example = "1")
+            public Long officeId;
+        }
+        @ApiModelProperty(example = "Good Friday")
+        public String name;
+        @ApiModelProperty(example = "Good Friday")
+        public String description;
+        @ApiModelProperty(example = "dd MMMM yyyy")
+        public String dateFormat;
+        @ApiModelProperty(example = "en")
+        public String locale;
+        @ApiModelProperty(example = "25 October 2013")
+        public LocalDate fromDate;
+        @ApiModelProperty(example = "25 October 2013")
+        public LocalDate toDate;
+        @ApiModelProperty(example = "26 October 2013")
+        public LocalDate repaymentsRescheduledTo;
+        public List<PostHolidaysRequestOffices> offices;
+    }
+
+    @ApiModel(value = "PostHolidaysResponse")
+    public static final class PostHolidaysResponse {
+        private PostHolidaysResponse() {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long resourceId;
+    }
+
+    @ApiModel(value = "PostHolidaysHolidayIdRequest")
+    public static final class PostHolidaysHolidayIdRequest {
+        private PostHolidaysHolidayIdRequest() {
+
+        }
+    }
+
+    @ApiModel(value = "PostHolidaysHolidayIdResponse")
+    public static final class PostHolidaysHolidayIdResponse {
+        private PostHolidaysHolidayIdResponse() {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long resourceId;
+    }
+
+    @ApiModel(value = "PutHolidaysHolidayIdRequest")
+    public static final class PutHolidaysHolidayIdRequest {
+        private PutHolidaysHolidayIdRequest() {
+
+        }
+        @ApiModelProperty(example = "Independence day")
+        public String name;
+        @ApiModelProperty(example = "Holiday for Independence day celebration")
+        public String description;
+    }
+
+    @ApiModel(value = "PutHolidaysHolidayIdResponse")
+    public static final class PutHolidaysHolidayIdResponse {
+        private PutHolidaysHolidayIdResponse() {
+
+        }
+        final class PutHolidaysHolidayIdResponseChanges{
+            private PutHolidaysHolidayIdResponseChanges(){}
+            @ApiModelProperty(example = "Independence day")
+            public String name;
+            @ApiModelProperty(example = "Holiday for Independence day celebration")
+            public String description;
+        }
+        @ApiModelProperty(example = "1")
+        public Long resourceId;
+        public PutHolidaysHolidayIdResponseChanges changes;
+    }
+
+    @ApiModel(value = "DeleteHolidaysHolidayIdResponse")
+    public static final class DeleteHolidaysHolidayIdResponse {
+        private DeleteHolidaysHolidayIdResponse() {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long resourceId;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/monetary/api/CurrenciesApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/monetary/api/CurrenciesApiResource.java
index e55cd6dce..31152e1f8 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/organisation/monetary/api/CurrenciesApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/monetary/api/CurrenciesApiResource.java
@@ -31,6 +31,7 @@
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.UriInfo;
 
+import io.swagger.annotations.*;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
 import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
@@ -48,6 +49,7 @@
 @Path("/currencies")
 @Component
 @Scope("singleton")
+@Api(value = "Currency", description = "Application related configuration around viewing/updating the currencies permitted for use within the MFI.")
 public class CurrenciesApiResource {
 
     private final Set<String> RESPONSE_DATA_PARAMETERS = new HashSet<>(Arrays.asList("selectedCurrencyOptions", "currencyOptions"));
@@ -75,6 +77,8 @@ public CurrenciesApiResource(final PlatformSecurityContext context, final Organi
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
+    @ApiOperation(value = "Retrieve Currency Configuration", notes = "Returns the list of currencies permitted for use AND the list of currencies not selected (but available for selection).\n" + "\n" + "Example Requests:\n" + "\n" + "currencies\n" + "\n" + "\n" + "currencies?fields=selectedCurrencyOptions")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = CurrenciesApiResourceSwagger.GetCurrenciesResponse.class)})
     public String retrieveCurrencies(@Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
@@ -88,7 +92,10 @@ public String retrieveCurrencies(@Context final UriInfo uriInfo) {
     @PUT
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String updateCurrencies(final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Update Currency Configuration", notes = "Updates the list of currencies permitted for use.")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = CurrenciesApiResourceSwagger.PutCurrenciesRequest.class )})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = CurrenciesApiResourceSwagger.PutCurrenciesResponse.class)})
+    public String updateCurrencies(@ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder() //
                 .updateCurrencies() //
diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/monetary/api/CurrenciesApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/monetary/api/CurrenciesApiResourceSwagger.java
new file mode 100644
index 000000000..9f56bd7c2
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/monetary/api/CurrenciesApiResourceSwagger.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.organisation.monetary.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.fineract.organisation.monetary.data.CurrencyData;
+
+import java.util.Collection;
+
+/**
+ * Created by sanyam on 14/8/17.
+ */
+final class CurrenciesApiResourceSwagger {
+    private CurrenciesApiResourceSwagger() {
+
+    }
+
+    @ApiModel(value = "GetCurrenciesResponse")
+    public static final class GetCurrenciesResponse {
+        private GetCurrenciesResponse(){
+
+        }
+        public Collection<CurrencyData> selectedCurrencyOptions;
+        public Collection<CurrencyData> currencyOptions;
+    }
+
+    @ApiModel(value = "PutCurrenciesRequest")
+    public static final class PutCurrenciesRequest {
+        private PutCurrenciesRequest() {
+
+        }
+        @ApiModelProperty(example = "[\"KES\",\n" +
+                "        \"BND\",\n" +
+                "        \"LBP\",\n" +
+                "        \"GHC\",\n" +
+                "        \"USD\",\n" +
+                "        \"XOF\",\n" +
+                "        \"AED\",\n" +
+                "        \"AMD\"]")
+        public String currencies;
+
+    }
+
+    @ApiModel(value = "PutCurrenciesResponse")
+    public static final class PutCurrenciesResponse {
+        private PutCurrenciesResponse() {
+
+        }
+        @ApiModelProperty(example = "[\"KES\",\n" +
+                "        \"BND\",\n" +
+                "        \"LBP\",\n" +
+                "        \"GHC\",\n" +
+                "        \"USD\",\n" +
+                "        \"XOF\",\n" +
+                "        \"AED\",\n" +
+                "        \"AMD\"]")
+        public String currencies;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/office/api/OfficeTransactionsApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/office/api/OfficeTransactionsApiResource.java
index 564edfc93..f4aba724b 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/organisation/office/api/OfficeTransactionsApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/office/api/OfficeTransactionsApiResource.java
@@ -34,6 +34,7 @@
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.UriInfo;
 
+import io.swagger.annotations.Api;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
 import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
@@ -51,6 +52,7 @@
 @Path("/officetransactions")
 @Component
 @Scope("singleton")
+@Api(value = "officetransactions", description = "")
 public class OfficeTransactionsApiResource {
 
     private static final Set<String> RESPONSE_DATA_PARAMETERS = new HashSet<>(Arrays.asList("id", "transactionDate", "fromOfficeId",
diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/office/api/OfficesApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/office/api/OfficesApiResource.java
index f2c52da22..983889b2a 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/organisation/office/api/OfficesApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/office/api/OfficesApiResource.java
@@ -38,6 +38,7 @@
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
 
+import io.swagger.annotations.*;
 import com.sun.jersey.core.header.FormDataContentDisposition;
 import com.sun.jersey.multipart.FormDataParam;
 import org.apache.fineract.commands.domain.CommandWrapper;
@@ -61,6 +62,7 @@
 @Path("/offices")
 @Component
 @Scope("singleton")
+@Api(value = "Offices", description = "Offices are used to model an MFIs structure. A hierarchical representation of offices is supported. There will always be at least one office (which represents the MFI or an MFIs head office). All subsequent offices added must have a parent office.")
 public class OfficesApiResource {
 
     /**
@@ -99,9 +101,11 @@ public OfficesApiResource(final PlatformSecurityContext context, final OfficeRea
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
+    @ApiOperation(value = "List Offices", notes = "Example Requests:\n" + "\n" + "offices\n" + "\n" + "\n" + "offices?fields=id,name,openingDate")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = OfficesApiResourceSwagger.GetOfficesResponse.class, responseContainer = "List")})
     public String retrieveOffices(@Context final UriInfo uriInfo,
-            @DefaultValue("false") @QueryParam("includeAllOffices") final boolean onlyManualEntries,
-            @QueryParam("orderBy") final String orderBy, @QueryParam("sortOrder") final String sortOrder) {
+            @DefaultValue("false") @QueryParam("includeAllOffices") @ApiParam(value = "includeAllOffices") final boolean onlyManualEntries,
+            @QueryParam("orderBy") @ApiParam(value = "orderBy") final String orderBy, @QueryParam("sortOrder") @ApiParam(value = "sortOrder") final String sortOrder) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
 
@@ -117,6 +121,8 @@ public String retrieveOffices(@Context final UriInfo uriInfo,
     @Path("template")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
+    @ApiOperation(value = "Retrieve Office Details Template", notes = "This is a convenience resource. It can be useful when building maintenance user interface screens for client applications. The template data returned consists of any or all of:\n" + "\n" + "Field Defaults\n" + "Allowed Value Lists\n" + "Example Request:\n" + "\n" + "offices/template")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = OfficesApiResourceSwagger.GetOfficesTemplateResponse.class)})
     public String retrieveOfficeTemplate(@Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
@@ -133,7 +139,10 @@ public String retrieveOfficeTemplate(@Context final UriInfo uriInfo) {
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String createOffice(final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Create an Office", notes = "Mandatory Fields\n" + "name, openingDate, parentId")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = OfficesApiResourceSwagger.PostOfficesRequest.class )})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = OfficesApiResourceSwagger.PostOfficesResponse.class)})
+    public String createOffice(@ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder() //
                 .createOffice() //
@@ -149,7 +158,9 @@ public String createOffice(final String apiRequestBodyAsJson) {
     @Path("{officeId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retreiveOffice(@PathParam("officeId") final Long officeId, @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Retrieve an Office", notes = "Example Requests:\n" + "\n" + "offices/1\n" + "\n" + "\n" + "offices/1?template=true\n" + "\n" + "\n" + "offices/1?fields=id,name,parentName")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = OfficesApiResourceSwagger.GetOfficesResponse.class)})
+    public String retreiveOffice(@PathParam("officeId") @ApiParam(value = "officeId") final Long officeId, @Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
 
@@ -168,7 +179,10 @@ public String retreiveOffice(@PathParam("officeId") final Long officeId, @Contex
     @Path("{officeId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String updateOffice(@PathParam("officeId") final Long officeId, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Update Office", notes = "")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = OfficesApiResourceSwagger.PutOfficesOfficeIdRequest.class )})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = OfficesApiResourceSwagger.PutOfficesOfficeIdResponse.class)})
+    public String updateOffice(@PathParam("officeId") @ApiParam(value = "officeId") final Long officeId, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder() //
                 .updateOffice(officeId) //
diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/office/api/OfficesApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/office/api/OfficesApiResourceSwagger.java
new file mode 100644
index 000000000..2c5689ea7
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/office/api/OfficesApiResourceSwagger.java
@@ -0,0 +1,128 @@
+/**
+ * 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.organisation.office.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.fineract.organisation.office.data.OfficeData;
+import org.joda.time.LocalDate;
+
+import java.util.Collection;
+
+/**
+ * Created by sanyam on 14/8/17.
+ */
+final class OfficesApiResourceSwagger {
+    private OfficesApiResourceSwagger() {
+
+    }
+
+    @ApiModel(value = "GetOfficesResponse")
+    public static final class GetOfficesResponse {
+        private GetOfficesResponse() {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long id;
+        @ApiModelProperty(example = "Head Office")
+        public String name;
+        @ApiModelProperty(example = "Head Office")
+        public String nameDecorated;
+        @ApiModelProperty(example = "1")
+        public String externalId;
+        @ApiModelProperty(example = "[2009, 1, 1]")
+        public LocalDate openingDate;
+        @ApiModelProperty(example = ".")
+        public String hierarchy;
+//        @ApiModelProperty(example = "")
+//        public Long parentId;
+//        @ApiModelProperty(example = "")
+//        public String parentName;
+    }
+
+    @ApiModel(value = "GetOfficesTemplateResponse")
+    public static final class GetOfficesTemplateResponse {
+        private GetOfficesTemplateResponse() {
+
+        }
+        @ApiModelProperty(example = "[2009, 1, 1]")
+        public LocalDate openingDate;
+        public Collection<GetOfficesResponse> allowedParents;
+    }
+
+    @ApiModel(value = "PostOfficesRequest")
+    public static final class PostOfficesRequest {
+        private PostOfficesRequest() {
+
+        }
+        @ApiModelProperty(example = "Good Friday")
+        public String name;
+        @ApiModelProperty(example = "dd MMMM yyyy")
+        public String dateFormat;
+        @ApiModelProperty(example = "en")
+        public String locale;
+        @ApiModelProperty(example = "01 July 2007")
+        public LocalDate openingDate;
+        @ApiModelProperty(example = "2")
+        public Long parentId;
+        @ApiModelProperty(example = "SYS54-88")
+        public String externalId;
+
+    }
+
+    @ApiModel(value = "PostOfficesResponse")
+    public static final class PostOfficesResponse {
+        private PostOfficesResponse() {
+
+        }
+        @ApiModelProperty(example = "3")
+        public Long officeId;
+        @ApiModelProperty(example = "3")
+        public Long resourceId;
+    }
+
+    @ApiModel(value = "PutOfficesOfficeIdRequest")
+    public static final class PutOfficesOfficeIdRequest {
+        private PutOfficesOfficeIdRequest() {
+
+        }
+        @ApiModelProperty(example = "Name is updated")
+        public String name;
+    }
+
+    @ApiModel(value = "PutOfficesOfficeIdResponse")
+    public static final class PutOfficesOfficeIdResponse {
+        private PutOfficesOfficeIdResponse() {
+
+        }
+        final class PutOfficesOfficeIdResponseChanges {
+            private PutOfficesOfficeIdResponseChanges(){
+
+            }
+            @ApiModelProperty(example = "Name is updated")
+            public String name;
+        }
+        @ApiModelProperty(example = "3")
+        public Long officeId;
+        @ApiModelProperty(example = "3")
+        public Long resourceId;
+        public PutOfficesOfficeIdResponseChanges changes;
+    }
+
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/api/ProvisioningCategoryApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/api/ProvisioningCategoryApiResource.java
index 6a0fdeae4..ceec605a6 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/api/ProvisioningCategoryApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/api/ProvisioningCategoryApiResource.java
@@ -32,6 +32,7 @@
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.UriInfo;
 
+import io.swagger.annotations.Api;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
 import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
@@ -49,6 +50,7 @@
 @Path("/provisioningcategory")
 @Component
 @Scope("singleton")
+@Api(value = "Provisioning Category", description = "")
 public class ProvisioningCategoryApiResource {
 
     private final PlatformSecurityContext platformSecurityContext;
diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/api/ProvisioningCriteriaApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/api/ProvisioningCriteriaApiResource.java
index 46efdb023..f5c5aae5b 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/api/ProvisioningCriteriaApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/api/ProvisioningCriteriaApiResource.java
@@ -35,6 +35,7 @@
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.UriInfo;
 
+import io.swagger.annotations.*;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
 import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
@@ -53,6 +54,7 @@
 @Path("/provisioningcriteria")
 @Component
 @Scope("singleton")
+@Api(value = "Provisioning Criteria", description = "This defines the Provisioning Criteria")
 public class ProvisioningCriteriaApiResource {
 
     private final PlatformSecurityContext platformSecurityContext;
@@ -101,7 +103,9 @@ public String retrieveTemplate(@Context final UriInfo uriInfo) {
     @Path("{criteriaId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveProvisioningCriteria(@PathParam("criteriaId") final Long criteriaId, @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Retrieves a Provisioning Criteria", notes = "Retrieves a Provisioning Criteria")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = ProvisioningCriteriaApiResourceSwagger.GetProvisioningCriteriaCriteriaIdResponse.class)})
+    public String retrieveProvisioningCriteria(@PathParam("criteriaId") @ApiParam(value = "criteriaId") final Long criteriaId, @Context final UriInfo uriInfo) {
         platformSecurityContext.authenticatedUser() ;
         ProvisioningCriteriaData criteria = this.provisioningCriteriaReadPlatformService.retrieveProvisioningCriteria(criteriaId) ;
         final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
@@ -114,6 +118,8 @@ public String retrieveProvisioningCriteria(@PathParam("criteriaId") final Long c
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
+    @ApiOperation(value = "Retrieves all created Provisioning Criterias", notes = "Retrieves all created Provisioning Criterias")
+    @ApiResponses({@ApiResponse(code = 200, message = "", responseContainer = "List",response = ProvisioningCriteriaApiResourceSwagger.GetProvisioningCriteriaResponse.class)})
     public String retrieveAllProvisioningCriterias(@Context final UriInfo uriInfo) {
         platformSecurityContext.authenticatedUser() ;
         Collection<ProvisioningCriteriaData> data = this.provisioningCriteriaReadPlatformService.retrieveAllProvisioningCriterias() ;
@@ -124,7 +130,10 @@ public String retrieveAllProvisioningCriterias(@Context final UriInfo uriInfo) {
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String createProvisioningCriteria(final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Create a new Provisioning Criteria", notes = "Creates a new Provisioning Criteria\n" + "\n" + "Mandatory Fields: \n" + "criteriaName\n" + "provisioningcriteria\n" + "\n" + "Optional Fields: \n" + "loanProducts")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = ProvisioningCriteriaApiResourceSwagger.PostProvisioningCriteriaRequest.class )})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = ProvisioningCriteriaApiResourceSwagger.PostProvisioningCriteriaResponse.class)})
+    public String createProvisioningCriteria(@ApiParam(hidden = true) final String apiRequestBodyAsJson) {
         CommandWrapper commandWrapper = null;
         this.platformSecurityContext.authenticatedUser();
         commandWrapper = new CommandWrapperBuilder().createProvisioningCriteria().withJson(apiRequestBodyAsJson).build();
@@ -136,7 +145,10 @@ public String createProvisioningCriteria(final String apiRequestBodyAsJson) {
     @Path("{criteriaId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String updateProvisioningCriteria(@PathParam("criteriaId") final Long criteriaId, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Updates a new Provisioning Criteria", notes = "Updates a new Provisioning Criteria\n" + "\n" + "Optional Fields\n" + "criteriaName, loanProducts, provisioningcriteria")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = ProvisioningCriteriaApiResourceSwagger.PutProvisioningCriteriaRequest.class )})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = ProvisioningCriteriaApiResourceSwagger.PutProvisioningCriteriaResponse.class)})
+    public String updateProvisioningCriteria(@PathParam("criteriaId") @ApiParam(value = "criteriaId") final Long criteriaId, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
         this.platformSecurityContext.authenticatedUser();
         final CommandWrapper commandRequest = new CommandWrapperBuilder().updateProvisioningCriteria(criteriaId)
                 .withJson(apiRequestBodyAsJson).build();
@@ -148,7 +160,9 @@ public String updateProvisioningCriteria(@PathParam("criteriaId") final Long cri
     @Path("{criteriaId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String deleteProvisioningCriteria(@PathParam("criteriaId") final Long criteriaId) {
+    @ApiOperation(value = "Deletes Provisioning Criteria", notes = "Deletes Provisioning Criteria")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = ProvisioningCriteriaApiResourceSwagger.DeleteProvisioningCriteriaResponse.class)})
+    public String deleteProvisioningCriteria(@PathParam("criteriaId") @ApiParam(value = "criteriaId") final Long criteriaId) {
         this.platformSecurityContext.authenticatedUser();
         final CommandWrapper commandRequest = new CommandWrapperBuilder().deleteProvisioningCriteria(criteriaId).build();
         final CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/api/ProvisioningCriteriaApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/api/ProvisioningCriteriaApiResourceSwagger.java
new file mode 100644
index 000000000..a8f7bab13
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/provisioning/api/ProvisioningCriteriaApiResourceSwagger.java
@@ -0,0 +1,118 @@
+/**
+ * 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.organisation.provisioning.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.fineract.organisation.provisioning.data.ProvisioningCriteriaDefinitionData;
+import org.apache.fineract.portfolio.loanproduct.data.LoanProductData;
+
+import java.util.Collection;
+
+/**
+ * Created by sanyam on 18/8/17.
+ */
+final class ProvisioningCriteriaApiResourceSwagger {
+    private ProvisioningCriteriaApiResourceSwagger() {
+
+    }
+
+    @ApiModel(value = "PostProvisioningCriteriaRequest")
+    public static final class PostProvisioningCriteriaRequest {
+        private PostProvisioningCriteriaRequest() {
+
+        }
+        @ApiModelProperty(example = "High Risk Products Criteria")
+        public String criteriaName;
+        public Collection<LoanProductData> loanProducts;
+        public Collection<ProvisioningCriteriaDefinitionData> provisioningcriteria;
+    }
+
+    @ApiModel(value = "PostProvisioningCriteriaResponse")
+    public static final class PostProvisioningCriteriaResponse {
+        private PostProvisioningCriteriaResponse() {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long resourceId;
+    }
+
+    @ApiModel(value = "GetProvisioningCriteriaResponse")
+    public static final class GetProvisioningCriteriaResponse {
+        private GetProvisioningCriteriaResponse() {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long criteriaId;
+        @ApiModelProperty(example = "High Risk Products Criteria")
+        public String criteriaName;
+        @ApiModelProperty(example = "mifos")
+        public String createdBy;
+    }
+
+    @ApiModel(value = "GetProvisioningCriteriaCriteriaIdResponse")
+    public static final class GetProvisioningCriteriaCriteriaIdResponse {
+        private GetProvisioningCriteriaCriteriaIdResponse() {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long criteriaId;
+        @ApiModelProperty(example = "High Risk Products Criteria")
+        public String criteriaName;
+        @ApiModelProperty(example = "mifos")
+        public String createdBy;
+        public Collection<LoanProductData> loanProducts;
+        public Collection<ProvisioningCriteriaDefinitionData> provisioningcriteria;
+    }
+
+    @ApiModel(value = "PutProvisioningCriteriaRequest")
+    public static final class PutProvisioningCriteriaRequest {
+        private PutProvisioningCriteriaRequest() {
+
+        }
+        @ApiModelProperty(example = "High Risk Products Criteria")
+        public String criteriaName;
+        public Collection<LoanProductData> loanProducts;
+        public Collection<ProvisioningCriteriaDefinitionData> provisioningcriteria;
+    }
+
+    @ApiModel(value = "PutProvisioningCriteriaResponse")
+    public static final class PutProvisioningCriteriaResponse {
+        private PutProvisioningCriteriaResponse() {
+
+        }
+        final class PutProvisioningCriteriaResponseChanges{
+            private PutProvisioningCriteriaResponseChanges(){}
+            @ApiModelProperty(example = "High Risk Products Criteria")
+            public String criteriaName;
+        }
+        @ApiModelProperty(example = "1")
+        public Long resourceId;
+        public PutProvisioningCriteriaResponseChanges changes;
+    }
+
+    @ApiModel(value = "DeleteProvisioningCriteriaResponse")
+    public static final class DeleteProvisioningCriteriaResponse {
+        private DeleteProvisioningCriteriaResponse() {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long resourceId;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/api/StaffApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/api/StaffApiResource.java
index d9ec51161..fb0e4e20e 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/api/StaffApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/api/StaffApiResource.java
@@ -38,6 +38,7 @@
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.UriInfo;
 
+import io.swagger.annotations.*;
 import com.sun.jersey.core.header.FormDataContentDisposition;
 import com.sun.jersey.multipart.FormDataParam;
 import org.apache.fineract.commands.domain.CommandWrapper;
@@ -62,6 +63,7 @@
 @Path("/staff")
 @Component
 @Scope("singleton")
+@Api(value = "Staff", description = "Allows you to model staff members. At present the key role of significance is whether this staff member is a loan officer or not.")
 public class StaffApiResource {
 
     /**
@@ -103,11 +105,13 @@ public StaffApiResource(final PlatformSecurityContext context, final StaffReadPl
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveStaff(@Context final UriInfo uriInfo, @QueryParam("sqlSearch") final String sqlSearch,
-            @QueryParam("officeId") final Long officeId,
-            @DefaultValue("false") @QueryParam("staffInOfficeHierarchy") final boolean staffInOfficeHierarchy,
-            @DefaultValue("false") @QueryParam("loanOfficersOnly") final boolean loanOfficersOnly,
-            @DefaultValue("active") @QueryParam("status") final String status) {
+    @ApiOperation(value = "Retrieve Staff", notes = "Returns the list of staff members.\n" + "\n" + "Example Requests:\n" + "\n" + "staff\n\n\n\n" + "\n" + "Retrieve a Staff by status\n" + "\n" + "Returns the details of a Staff based on status.\n" + "\n" + "By default it Returns all the ACTIVE Staff.\n" + "\n" + "If status=INACTIVE, then it returns all INACTIVE Staff.\n" + "\n" + "and for status=ALL, it Returns both ACTIVE and INACTIVE Staff.\n" + "\n" + "Example Requests:\n" + "\n" + "staff?status=active")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = StaffApiResourceSwagger.GetStaffResponse.class, responseContainer = "List"), @ApiResponse(code = 200, message = "GET https://DomainName/api/v1/staff?status={ACTIVE|INACTIVE|ALL}", response = StaffApiResourceSwagger.GetStaffResponse.class)})
+    public String retrieveStaff(@Context final UriInfo uriInfo, @QueryParam("sqlSearch") @ApiParam(value = "sqlSearch") final String sqlSearch,
+            @QueryParam("officeId") @ApiParam(value = "officeId") final Long officeId,
+            @DefaultValue("false") @QueryParam("staffInOfficeHierarchy") @ApiParam(value = "staffInOfficeHierarchy") final boolean staffInOfficeHierarchy,
+            @DefaultValue("false") @QueryParam("loanOfficersOnly") @ApiParam(value = "loanOfficersOnly") final boolean loanOfficersOnly,
+            @DefaultValue("active") @QueryParam("status") @ApiParam(value = "status") final String status) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
 
@@ -125,7 +129,10 @@ public String retrieveStaff(@Context final UriInfo uriInfo, @QueryParam("sqlSear
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String createStaff(final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Create a staff member", notes = "Creates a staff member.\n" + "\n" + "Mandatory Fields: \n" + "officeId, firstname, lastname\n" + "\n" + "Optional Fields: \n" + "isLoanOfficer, isActive")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = StaffApiResourceSwagger.PostStaffRequest.class )})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = StaffApiResourceSwagger.PostStaffResponse.class)})
+    public String createStaff(@ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().createStaff().withJson(apiRequestBodyAsJson).build();
 
@@ -138,7 +145,9 @@ public String createStaff(final String apiRequestBodyAsJson) {
     @Path("{staffId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retreiveStaff(@PathParam("staffId") final Long staffId, @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Retrieve a Staff Member", notes = "Returns the details of a Staff Member.\n" + "\n" + "Example Requests:\n" + "\n" + "staff/1")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = StaffApiResourceSwagger.GetStaffResponse.class)})
+    public String retreiveStaff(@PathParam("staffId") @ApiParam(value = "staffId") final Long staffId, @Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
 
@@ -156,7 +165,10 @@ public String retreiveStaff(@PathParam("staffId") final Long staffId, @Context f
     @Path("{staffId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String updateStaff(@PathParam("staffId") final Long staffId, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Update a Staff Member", notes = "Updates the details of a staff member.")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = StaffApiResourceSwagger.PutStaffRequest.class )})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = StaffApiResourceSwagger.PutStaffResponse.class)})
+    public String updateStaff(@PathParam("staffId") @ApiParam(value = "staffId") final Long staffId, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().updateStaff(staffId).withJson(apiRequestBodyAsJson).build();
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/api/StaffApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/api/StaffApiResourceSwagger.java
new file mode 100644
index 000000000..9c81819a5
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/staff/api/StaffApiResourceSwagger.java
@@ -0,0 +1,131 @@
+/**
+ * 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.organisation.staff.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.joda.time.LocalDate;
+
+/**
+ * Created by sanyam on 19/8/17.
+ */
+
+final class StaffApiResourceSwagger {
+    private StaffApiResourceSwagger() {
+
+    }
+
+    @ApiModel(value = "PostStaffRequest")
+    public static final class PostStaffRequest {
+        private PostStaffRequest() {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long id;
+        @ApiModelProperty(example = "John")
+        public String firstname;
+        @ApiModelProperty(example = "Doe")
+        public String lastname;
+        @ApiModelProperty(example = "true")
+        public Boolean isLoanOfficer;
+        @ApiModelProperty(example = "17H")
+        public String externalId;
+        @ApiModelProperty(example = "+353851239876")
+        public String mobileNo;
+        @ApiModelProperty(example = "true")
+        public Boolean isActive;
+        @ApiModelProperty(example = "01 January 2009")
+        public LocalDate joiningDate;
+        @ApiModelProperty(example = "en")
+        public String locale;
+        @ApiModelProperty(example = "dd MMMM yyyy")
+        public String dateFormat;
+
+    }
+
+    @ApiModel(value = "PostStaffResponse")
+    public static final class PostStaffResponse {
+        private PostStaffResponse() {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long officeId;
+        @ApiModelProperty(example = "1")
+        public Long resourceId;
+    }
+
+    @ApiModel(value = "GetStaffResponse")
+    public static final class GetStaffResponse {
+        private GetStaffResponse() {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long id;
+        @ApiModelProperty(example = "John")
+        public String firstname;
+        @ApiModelProperty(example = "Doe")
+        public String lastname;
+        @ApiModelProperty(example = "Doe, John")
+        public String displayName;
+        @ApiModelProperty(example = "1")
+        public Long officeId;
+        @ApiModelProperty(example = "Head Office")
+        public String officeName;
+        @ApiModelProperty(example = "true")
+        public Boolean isLoanOfficer;
+        @ApiModelProperty(example = "17H")
+        public String externalId;
+        @ApiModelProperty(example = "+353851239876")
+        public Boolean isActive;
+        @ApiModelProperty(example = "[2009,8,1]")
+        public LocalDate joiningDate;
+
+    }
+
+    @ApiModel(value = "PutStaffRequest")
+    public static final class PutStaffRequest {
+        private PutStaffRequest() {
+
+        }
+        @ApiModelProperty(example = "false")
+        public Boolean isLoanOfficer;
+        @ApiModelProperty(example = "17Hbb")
+        public String externalId;
+
+    }
+
+    @ApiModel(value = "PutStaffResponse")
+    public static final class PutStaffResponse {
+        private PutStaffResponse() {
+
+        }
+        final class PutStaffResponseChanges {
+            private PutStaffResponseChanges(){}
+            @ApiModelProperty(example = "false")
+            public Boolean isLoanOfficer;
+            @ApiModelProperty(example = "17Hbb")
+            public String externalId;
+        }
+        @ApiModelProperty(example = "1")
+        public Long officeId;
+        @ApiModelProperty(example = "1")
+        public Long resourceId;
+
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/api/CashierApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/api/CashierApiResource.java
index 788adfcd0..08437227c 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/api/CashierApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/api/CashierApiResource.java
@@ -28,6 +28,10 @@
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.MediaType;
 
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.ApiResponse;
+import io.swagger.annotations.ApiResponses;
 import org.apache.fineract.infrastructure.core.serialization.DefaultToApiJsonSerializer;
 import org.apache.fineract.organisation.teller.data.CashierData;
 import org.apache.fineract.organisation.teller.service.TellerManagementReadPlatformService;
@@ -40,6 +44,7 @@
 @Path("cashiers")
 @Component
 @Scope("singleton")
+@Api(value = "cashiers", description = "")
 public class CashierApiResource {
 
     private final DefaultToApiJsonSerializer<CashierData> jsonSerializer;
diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/api/TellerApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/api/TellerApiResource.java
index a69dc1ff9..2298700a2 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/api/TellerApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/api/TellerApiResource.java
@@ -32,6 +32,7 @@
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.MediaType;
 
+import io.swagger.annotations.*;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
 import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
@@ -57,6 +58,7 @@
 @Path("tellers")
 @Component
 @Scope("singleton")
+@Api(value = "Teller Cash Management", description = "Teller cash management which will allow an organization to manage their cash transactions at branches or head office more effectively.")
 public class TellerApiResource {
 
     private final PlatformSecurityContext securityContext;
@@ -78,17 +80,21 @@ public TellerApiResource(PlatformSecurityContext securityContext, DefaultToApiJs
     @GET
     @Consumes({ MediaType.TEXT_HTML, MediaType.APPLICATION_JSON })
     @Produces(MediaType.APPLICATION_JSON)
-    public String getTellerData(@QueryParam("officeId") final Long officeId) {
+    @ApiOperation(value = "List all tellers", notes = "Retrieves list tellers")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = TellerApiResourceSwagger.GetTellersResponse.class, responseContainer = "List")})
+    public String getTellerData(@QueryParam("officeId") @ApiParam(value = "officeId") final Long officeId) {
         final Collection<TellerData> foundTellers = this.readPlatformService.getTellers(officeId);
 
         return this.jsonSerializer.serialize(foundTellers);
     }
 
-    @Path("{tellerId}")
     @GET
+    @Path("{tellerId}")
     @Consumes({ MediaType.TEXT_HTML, MediaType.APPLICATION_JSON })
     @Produces(MediaType.APPLICATION_JSON)
-    public String findTeller(@PathParam("tellerId") final Long tellerId) {
+    @ApiOperation(value = "Retrieve tellers", notes = "")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = TellerApiResourceSwagger.GetTellersResponse.class)})
+    public String findTeller(@PathParam("tellerId") @ApiParam(value = "tellerId") final Long tellerId) {
         final TellerData teller = this.readPlatformService.findTeller(tellerId);
 
         return this.jsonSerializer.serialize(teller);
@@ -97,7 +103,10 @@ public String findTeller(@PathParam("tellerId") final Long tellerId) {
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces(MediaType.APPLICATION_JSON)
-    public String createTeller(final String tellerData) {
+    @ApiOperation(value = "Create teller", notes = "Mandatory Fields\n" + "Teller name, OfficeId, Description, Start Date, Status\n" + "Optional Fields\n" + "End Date")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = TellerApiResourceSwagger.PostTellersRequest.class )})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = TellerApiResourceSwagger.PostTellersResponse.class)})
+    public String createTeller(@ApiParam(hidden = true) final String tellerData) {
         final CommandWrapper request = new CommandWrapperBuilder().createTeller().withJson(tellerData).build();
 
         final CommandProcessingResult result = this.commandWritePlatformService.logCommandSource(request);
@@ -105,11 +114,14 @@ public String createTeller(final String tellerData) {
         return this.jsonSerializer.serialize(result);
     }
 
-    @Path("{tellerId}")
     @PUT
+    @Path("{tellerId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces(MediaType.APPLICATION_JSON)
-    public String updateTeller(@PathParam("tellerId") final Long tellerId, final String tellerData) {
+    @ApiOperation(value = "Update teller", notes = "")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = TellerApiResourceSwagger.PutTellersRequest.class )})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = TellerApiResourceSwagger.PutTellersResponse.class)})
+    public String updateTeller(@PathParam("tellerId") @ApiParam(value = "tellerId") final Long tellerId, @ApiParam(hidden = true) final String tellerData) {
         final CommandWrapper request = new CommandWrapperBuilder().updateTeller(tellerId).withJson(tellerData).build();
 
         final CommandProcessingResult result = this.commandWritePlatformService.logCommandSource(request);
@@ -117,11 +129,11 @@ public String updateTeller(@PathParam("tellerId") final Long tellerId, final Str
         return this.jsonSerializer.serialize(result);
     }
 
-    @Path("{tellerId}")
     @DELETE
+    @Path("{tellerId}")
     @Consumes({ MediaType.TEXT_HTML, MediaType.APPLICATION_JSON })
     @Produces(MediaType.APPLICATION_JSON)
-    public String deleteTeller(@PathParam("tellerId") final Long tellerId) {
+    public String deleteTeller(@PathParam("tellerId") @ApiParam(value = "tellerId") final Long tellerId) {
         final CommandWrapper request = new CommandWrapperBuilder().deleteTeller(tellerId).build();
 
         final CommandProcessingResult result = this.commandWritePlatformService.logCommandSource(request);
@@ -133,8 +145,10 @@ public String deleteTeller(@PathParam("tellerId") final Long tellerId) {
     @Path("{tellerId}/cashiers")
     @Consumes({ MediaType.TEXT_HTML, MediaType.APPLICATION_JSON })
     @Produces(MediaType.APPLICATION_JSON)
-    public String getCashierData(@PathParam("tellerId") final Long tellerId, @QueryParam("fromdate") final String fromDateStr,
-            @QueryParam("todate") final String toDateStr) {
+    @ApiOperation(value = "List Cashiers", notes = "")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = TellerApiResourceSwagger.GetTellersTellerIdCashiersResponse.class)})
+    public String getCashierData(@PathParam("tellerId") @ApiParam(value = "tellerId") final Long tellerId, @QueryParam("fromdate") @ApiParam(value = "fromdate") final String fromDateStr,
+            @QueryParam("todate") @ApiParam(value = "todate") final String toDateStr) {
         final DateTimeFormatter dateFormatter = ISODateTimeFormat.basicDate();
 
         final Date fromDate = (fromDateStr != null ? dateFormatter.parseDateTime(fromDateStr).toDate() : new Date());
@@ -157,7 +171,9 @@ public String getCashierData(@PathParam("tellerId") final Long tellerId, @QueryP
     @Path("{tellerId}/cashiers/{cashierId}")
     @Consumes({ MediaType.TEXT_HTML, MediaType.APPLICATION_JSON })
     @Produces(MediaType.APPLICATION_JSON)
-    public String findCashierData(@PathParam("tellerId") final Long tellerId, @PathParam("cashierId") final Long cashierId) {
+    @ApiOperation(value = "Retrieve a cashier", notes = "")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = TellerApiResourceSwagger.GetTellersTellerIdCashiersCashierIdResponse.class)})
+    public String findCashierData(@PathParam("tellerId") @ApiParam(value = "tellerId") final Long tellerId, @PathParam("cashierId") @ApiParam(value = "cashierId") final Long cashierId) {
         final CashierData cashier = this.readPlatformService.findCashier(cashierId);
 
         return this.jsonSerializer.serialize(cashier);
@@ -167,7 +183,9 @@ public String findCashierData(@PathParam("tellerId") final Long tellerId, @PathP
     @Path("{tellerId}/cashiers/template")
     @Consumes({ MediaType.TEXT_HTML, MediaType.APPLICATION_JSON })
     @Produces(MediaType.APPLICATION_JSON)
-    public String getCashierTemplate(@PathParam("tellerId") final Long tellerId) {
+    @ApiOperation(value = "Find Cashiers", notes = "")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = TellerApiResourceSwagger.GetTellersTellerIdCashiersTemplateResponse.class)})
+    public String getCashierTemplate(@PathParam("tellerId") @ApiParam(value = "tellerId") final Long tellerId) {
 
         final TellerData teller = this.readPlatformService.findTeller(tellerId);
         Long officeId = teller.getOfficeId();
@@ -181,7 +199,10 @@ public String getCashierTemplate(@PathParam("tellerId") final Long tellerId) {
     @Path("{tellerId}/cashiers")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces(MediaType.APPLICATION_JSON)
-    public String createCashier(@PathParam("tellerId") final Long tellerId, final String cashierData) {
+    @ApiOperation(value = "Create Cashiers", notes = "Mandatory Fields: \n" + "Cashier/staff, Fromm Date, To Date, Full Day or From time and To time\n" + "\n\n\n" + "Optional Fields: \n" + "Description/Notes")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = TellerApiResourceSwagger.PostTellersTellerIdCashiersRequest.class )})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = TellerApiResourceSwagger.PostTellersTellerIdCashiersResponse.class)})
+    public String createCashier(@PathParam("tellerId") @ApiParam(value = "tellerId") final Long tellerId, @ApiParam(hidden = true) final String cashierData) {
         final CommandWrapper request = new CommandWrapperBuilder().allocateTeller(tellerId).withJson(cashierData).build();
 
         final CommandProcessingResult result = this.commandWritePlatformService.logCommandSource(request);
@@ -193,8 +214,11 @@ public String createCashier(@PathParam("tellerId") final Long tellerId, final St
     @Path("{tellerId}/cashiers/{cashierId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces(MediaType.APPLICATION_JSON)
-    public String updateCashier(@PathParam("tellerId") final Long tellerId, @PathParam("cashierId") final Long cashierId,
-            final String cashierDate) {
+    @ApiOperation(value = "Update Cashier", notes = "")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = TellerApiResourceSwagger.PutTellersTellerIdCashiersCashierIdRequest.class )})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = TellerApiResourceSwagger.PutTellersTellerIdCashiersCashierIdResponse.class)})
+    public String updateCashier(@PathParam("tellerId") @ApiParam(value = "tellerId") final Long tellerId, @PathParam("cashierId") @ApiParam(value = "cashierId") final Long cashierId,
+            @ApiParam(hidden = true) final String cashierDate) {
         final CommandWrapper request = new CommandWrapperBuilder().updateAllocationTeller(tellerId, cashierId).withJson(cashierDate)
                 .build();
 
@@ -207,7 +231,9 @@ public String updateCashier(@PathParam("tellerId") final Long tellerId, @PathPar
     @Path("{tellerId}/cashiers/{cashierId}")
     @Consumes({ MediaType.TEXT_HTML, MediaType.APPLICATION_JSON })
     @Produces(MediaType.APPLICATION_JSON)
-    public String deleteCashier(@PathParam("tellerId") final Long tellerId, @PathParam("cashierId") final Long cashierId) {
+    @ApiOperation(value = "Delete Cashier", notes = "")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = TellerApiResourceSwagger.DeleteTellersTellerIdCashiersCashierIdResponse.class)})
+    public String deleteCashier(@PathParam("tellerId") @ApiParam(value = "tellerId") final Long tellerId, @PathParam("cashierId") @ApiParam(value = "cashierId") final Long cashierId) {
         final CommandWrapper request = new CommandWrapperBuilder().deleteAllocationTeller(tellerId, cashierId).build();
 
         final CommandProcessingResult result = this.commandWritePlatformService.logCommandSource(request);
@@ -219,8 +245,11 @@ public String deleteCashier(@PathParam("tellerId") final Long tellerId, @PathPar
     @Path("{tellerId}/cashiers/{cashierId}/allocate")
     @Consumes({ MediaType.TEXT_HTML, MediaType.APPLICATION_JSON })
     @Produces(MediaType.APPLICATION_JSON)
-    public String allocateCashToCashier(@PathParam("tellerId") final Long tellerId, @PathParam("cashierId") final Long cashierId,
-            final String cashierTxnData) {
+    @ApiOperation(value = "Allocate Cash To Cashier", notes = "Mandatory Fields: \n" + "Date, Amount, Currency, Notes/Comments")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = TellerApiResourceSwagger.PostTellersTellerIdCashiersCashierIdAllocateRequest.class )})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = TellerApiResourceSwagger.PostTellersTellerIdCashiersCashierIdAllocateResponse.class)})
+    public String allocateCashToCashier(@PathParam("tellerId") @ApiParam(value = "tellerId") final Long tellerId, @PathParam("cashierId") @ApiParam(value = "cashierId") final Long cashierId,
+            @ApiParam(hidden = true) final String cashierTxnData) {
         final CommandWrapper request = new CommandWrapperBuilder().allocateCashToCashier(tellerId, cashierId).withJson(cashierTxnData)
                 .build();
 
@@ -234,8 +263,11 @@ public String allocateCashToCashier(@PathParam("tellerId") final Long tellerId,
     @Path("{tellerId}/cashiers/{cashierId}/settle")
     @Consumes({ MediaType.TEXT_HTML, MediaType.APPLICATION_JSON })
     @Produces(MediaType.APPLICATION_JSON)
-    public String settleCashFromCashier(@PathParam("tellerId") final Long tellerId, @PathParam("cashierId") final Long cashierId,
-            final String cashierTxnData) {
+    @ApiOperation(value = "Settle Cash From Cashier", notes = "Mandatory Fields\n" + "Date, Amount, Currency, Notes/Comments")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = TellerApiResourceSwagger.PostTellersTellerIdCashiersCashierIdSettleRequest.class )})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = TellerApiResourceSwagger.PostTellersTellerIdCashiersCashierIdSettleResponse.class)})
+    public String settleCashFromCashier(@PathParam("tellerId") @ApiParam(value = "tellerId") final Long tellerId, @PathParam("cashierId") @ApiParam(value = "cashierId") final Long cashierId,
+            @ApiParam(hidden = true) final String cashierTxnData) {
         final CommandWrapper request = new CommandWrapperBuilder().settleCashFromCashier(tellerId, cashierId).withJson(cashierTxnData)
                 .build();
 
@@ -249,9 +281,11 @@ public String settleCashFromCashier(@PathParam("tellerId") final Long tellerId,
     @Path("{tellerId}/cashiers/{cashierId}/transactions")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces(MediaType.APPLICATION_JSON)
-    public String getTransactionsForCashier(@PathParam("tellerId") final Long tellerId, @PathParam("cashierId") final Long cashierId,
-            @QueryParam("currencyCode") final String currencyCode, @QueryParam("offset") final Integer offset, @QueryParam("limit") final Integer limit,
-            @QueryParam("orderBy") final String orderBy, @QueryParam("sortOrder") final String sortOrder) {
+    @ApiOperation(value = "Retrieve Cashier Transaction", notes = "")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = TellerApiResourceSwagger.GetTellersTellerIdCashiersCashiersIdTransactionsResponse.class, responseContainer = "List")})
+    public String getTransactionsForCashier(@PathParam("tellerId") @ApiParam(value = "tellerId") final Long tellerId, @PathParam("cashierId") @ApiParam(value = "cashierId") final Long cashierId,
+            @QueryParam("currencyCode") @ApiParam(value = "currencyCode") final String currencyCode, @QueryParam("offset") @ApiParam(value = "offset") final Integer offset, @QueryParam("limit") @ApiParam(value = "limit") final Integer limit,
+            @QueryParam("orderBy") @ApiParam(value = "orderBy") final String orderBy, @QueryParam("sortOrder") @ApiParam(value = "sortOrder") final String sortOrder) {
         final TellerData teller = this.readPlatformService.findTeller(tellerId);
         final CashierData cashier = this.readPlatformService.findCashier(cashierId);
 
@@ -268,10 +302,12 @@ public String getTransactionsForCashier(@PathParam("tellerId") final Long teller
     @Path("{tellerId}/cashiers/{cashierId}/summaryandtransactions")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces(MediaType.APPLICATION_JSON)
-    public String getTransactionsWtihSummaryForCashier(@PathParam("tellerId") final Long tellerId,
-            @PathParam("cashierId") final Long cashierId, @QueryParam("currencyCode") final String currencyCode,
-            @QueryParam("offset") final Integer offset, @QueryParam("limit") final Integer limit,
-            @QueryParam("orderBy") final String orderBy, @QueryParam("sortOrder") final String sortOrder) {
+    @ApiOperation(value = "Transactions Wtih Summary For Cashier", notes = "")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = TellerApiResourceSwagger.GetTellersTellerIdCashiersCashiersIdSummaryAndTransactionsResponse.class)})
+    public String getTransactionsWtihSummaryForCashier(@PathParam("tellerId") @ApiParam(value = "tellerId") final Long tellerId,
+            @PathParam("cashierId") @ApiParam(value = "cashierId") final Long cashierId, @QueryParam("currencyCode") @ApiParam(value = "currencyCode") final String currencyCode,
+            @QueryParam("offset") @ApiParam(value = "offset") final Integer offset, @QueryParam("limit") @ApiParam(value = "limit") final Integer limit,
+            @QueryParam("orderBy") @ApiParam(value = "orderBy") final String orderBy, @QueryParam("sortOrder") @ApiParam(value = "sortOrder") final String sortOrder) {
         final TellerData teller = this.readPlatformService.findTeller(tellerId);
         final CashierData cashier = this.readPlatformService.findCashier(cashierId);
 
@@ -290,7 +326,9 @@ public String getTransactionsWtihSummaryForCashier(@PathParam("tellerId") final
     @Path("{tellerId}/cashiers/{cashierId}/transactions/template")
     @Consumes({ MediaType.TEXT_HTML, MediaType.APPLICATION_JSON })
     @Produces(MediaType.APPLICATION_JSON)
-    public String getCashierTxnTemplate(@PathParam("tellerId") final Long tellerId, @PathParam("cashierId") final Long cashierId) {
+    @ApiOperation(value = "Retrieve Cashier Transaction Template", notes = "")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = TellerApiResourceSwagger.GetTellersTellerIdCashiersCashiersIdTransactionsTemplateResponse.class)})
+    public String getCashierTxnTemplate(@PathParam("tellerId") @ApiParam(value = "tellerId") final Long tellerId, @PathParam("cashierId") @ApiParam(value = "cashierId") final Long cashierId) {
 
         final CashierTransactionData cashierTxnTemplate = this.readPlatformService.retrieveCashierTxnTemplate(cashierId);
 
@@ -301,7 +339,7 @@ public String getCashierTxnTemplate(@PathParam("tellerId") final Long tellerId,
     @Path("{tellerId}/transactions")
     @Consumes({ MediaType.TEXT_HTML, MediaType.APPLICATION_JSON })
     @Produces(MediaType.APPLICATION_JSON)
-    public String getTransactionData(@PathParam("tellerId") final Long tellerId, @QueryParam("dateRange") final String dateRange) {
+    public String getTransactionData(@PathParam("tellerId") @ApiParam(value = "tellerId") final Long tellerId, @QueryParam("dateRange") @ApiParam(value = "dateRange") final String dateRange) {
         final DateRange dateRangeHolder = DateRange.fromString(dateRange);
 
         final Collection<TellerTransactionData> transactions = this.readPlatformService.fetchTellerTransactionsByTellerId(tellerId,
@@ -314,7 +352,7 @@ public String getTransactionData(@PathParam("tellerId") final Long tellerId, @Qu
     @Path("{tellerId}/transactions/{transactionId}")
     @Consumes({ MediaType.TEXT_HTML, MediaType.APPLICATION_JSON })
     @Produces(MediaType.APPLICATION_JSON)
-    public String findTransactionData(@PathParam("tellerId") final Long tellerid, @PathParam("transactionId") final Long transactionId) {
+    public String findTransactionData(@PathParam("tellerId") @ApiParam(value = "tellerId") final Long tellerid, @PathParam("transactionId") @ApiParam(value = "transactionId") final Long transactionId) {
         final TellerTransactionData transaction = this.readPlatformService.findTellerTransaction(transactionId);
 
         return this.jsonSerializer.serialize(transaction);
@@ -324,8 +362,8 @@ public String findTransactionData(@PathParam("tellerId") final Long tellerid, @P
     @Path("{tellerId}/journals")
     @Consumes({ MediaType.TEXT_HTML, MediaType.APPLICATION_JSON })
     @Produces(MediaType.APPLICATION_JSON)
-    public String getJournalData(@PathParam("tellerId") final Long tellerId, @QueryParam("cashierId") final Long cashierDate,
-            @QueryParam("dateRange") final String dateRange) {
+    public String getJournalData(@PathParam("tellerId") @ApiParam(value = "tellerId") final Long tellerId, @QueryParam("cashierId") @ApiParam(value = "cashierId") final Long cashierDate,
+            @QueryParam("dateRange") @ApiParam(value = "dateRange") final String dateRange) {
         final DateRange dateRangeHolder = DateRange.fromString(dateRange);
 
         final Collection<TellerJournalData> journals = this.readPlatformService.fetchTellerJournals(tellerId, cashierDate,
diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/api/TellerApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/api/TellerApiResourceSwagger.java
new file mode 100644
index 000000000..1f6498d55
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/api/TellerApiResourceSwagger.java
@@ -0,0 +1,446 @@
+/**
+ * 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.organisation.teller.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.fineract.infrastructure.core.service.Page;
+import org.apache.fineract.organisation.monetary.data.CurrencyData;
+import org.apache.fineract.organisation.staff.data.StaffData;
+import org.apache.fineract.organisation.teller.data.CashierData;
+import org.apache.fineract.organisation.teller.data.CashierTransactionData;
+import org.apache.fineract.organisation.teller.domain.CashierTxnType;
+import org.apache.fineract.organisation.teller.domain.TellerStatus;
+import org.joda.time.LocalDate;
+
+import java.math.BigDecimal;
+import java.util.Collection;
+import java.util.Date;
+
+/**
+ * Created by sanyam on 20/8/17.
+ */
+final class TellerApiResourceSwagger {
+    private TellerApiResourceSwagger(){
+
+    }
+
+    @ApiModel(value = "GetTellersResponse")
+    public static final class GetTellersResponse {
+        private GetTellersResponse() {
+
+        }
+        @ApiModelProperty(example = "3")
+        public Long id;
+        @ApiModelProperty(example = "1")
+        public Long officeId;
+        @ApiModelProperty(example = "0")
+        public Long debitAccountId;
+        @ApiModelProperty(example = "0")
+        public Long creditAccountId;
+        @ApiModelProperty(example = "Teller3")
+        public String name;
+        @ApiModelProperty(example = "[2015,2,1]")
+        public LocalDate startDate;
+        @ApiModelProperty(example = "ACTIVE")
+        public TellerStatus status;
+        @ApiModelProperty(example = "Head Office")
+        public String officeName;
+    }
+
+    @ApiModel(value = "PostTellersRequest")
+    public static final class PostTellersRequest {
+        private PostTellersRequest() {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long officeId;
+        @ApiModelProperty(example = "Teller3")
+        public String name;
+        @ApiModelProperty(example = "cash handling")
+        public String description;
+        @ApiModelProperty(example = "ACTIVE")
+        public TellerStatus status;
+        @ApiModelProperty(example = "en")
+        public String locale;
+        @ApiModelProperty(example = "dd-MM-yyyy")
+        public String dateFormat;
+        @ApiModelProperty(example = "01 February 2015")
+        public LocalDate startDate;
+
+    }
+
+    @ApiModel(value = "PostTellersResponse")
+    public static final class PostTellersResponse {
+        private PostTellersResponse() {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long officeId;
+        @ApiModelProperty(example = "5")
+        public Long resourceId;
+    }
+
+    @ApiModel(value = "PutTellersRequest")
+    public static final class PutTellersRequest {
+        private PutTellersRequest() {
+
+        }
+        @ApiModelProperty(example = "Teller3")
+        public String name;
+        @ApiModelProperty(example = "1")
+        public Long officeId;
+        @ApiModelProperty(example = "teller cash handling")
+        public String description;
+        @ApiModelProperty(example = "ACTIVE")
+        public TellerStatus status;
+        @ApiModelProperty(example = "28 February 2015")
+        public LocalDate endDate;
+        @ApiModelProperty(example = "01 February 2015")
+        public LocalDate startDate;
+        @ApiModelProperty(example = "en")
+        public String locale;
+        @ApiModelProperty(example = "dd-MM-yyyy")
+        public String dateFormat;
+
+    }
+
+    @ApiModel(value = "PutTellersResponse")
+    public static final class PutTellersResponse {
+        private PutTellersResponse() {
+
+        }
+        final class PutTellersResponseChanges {
+            private PutTellersResponseChanges() {}
+            @ApiModelProperty(example = "teller cash handling")
+            public String description;
+            @ApiModelProperty(example = "28 February 2015")
+            public LocalDate endDate;
+            @ApiModelProperty(example = "01 February 2015")
+            public LocalDate startDate;
+            @ApiModelProperty(example = "en")
+            public String locale;
+            @ApiModelProperty(example = "dd-MM-yyyy")
+            public String dateFormat;
+        }
+        @ApiModelProperty(example = "1")
+        public Long officeId;
+        @ApiModelProperty(example = "5")
+        public Long resourceId;
+        public PutTellersResponseChanges changes;
+
+    }
+
+    @ApiModel(value = "GetTellersTellerIdCashiersResponse")
+    public static final class GetTellersTellerIdCashiersResponse {
+        private GetTellersTellerIdCashiersResponse() {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long tellerId;
+        @ApiModelProperty(example = "Teller1")
+        public String tellerName;
+        @ApiModelProperty(example = "1")
+        public Long officeId;
+        @ApiModelProperty(example = "Head Office")
+        public String officeName;
+        public Collection<CashierData> cashiers;
+
+    }
+
+    @ApiModel(value = "PostTellersTellerIdCashiersRequest")
+    public static final class PostTellersTellerIdCashiersRequest {
+        private PostTellersTellerIdCashiersRequest() {
+
+        }
+        @ApiModelProperty(example = "28 February 2015")
+        public LocalDate endDate;
+        @ApiModelProperty(example = "teller cash handling")
+        public String description;
+        @ApiModelProperty(example = "true")
+        public Boolean isFullDay;
+        @ApiModelProperty(example = "3")
+        public Long staffId;
+        @ApiModelProperty(example = "en")
+        public String locale;
+        @ApiModelProperty(example = "dd-MM-yyyy")
+        public String dateFormat;
+        @ApiModelProperty(example = "01 February 2015")
+        public LocalDate startDate;
+
+    }
+
+    @ApiModel(value = "PostTellersTellerIdCashiersResponse")
+    public static final class PostTellersTellerIdCashiersResponse {
+        private PostTellersTellerIdCashiersResponse() {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long resourceId;
+        @ApiModelProperty(example = "2")
+        public Long subResourceId;
+
+    }
+
+    @ApiModel(value = "GetTellersTellerIdCashiersCashierIdResponse")
+    public static final class GetTellersTellerIdCashiersCashierIdResponse {
+        private GetTellersTellerIdCashiersCashierIdResponse() {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long id;
+        @ApiModelProperty(example = "1")
+        public Long tellerId;
+        @ApiModelProperty(example = "1")
+        public Long staffId;
+        @ApiModelProperty(example = "")
+        public String description;
+        @ApiModelProperty(example = "Feb 20, 2015 12:00:00 AM")
+        public LocalDate startDate;
+        @ApiModelProperty(example = "Feb 27, 2015 12:00:00 AM")
+        public LocalDate endDate;
+        @ApiModelProperty(example = "true")
+        public Boolean isFullDay;
+        @ApiModelProperty(example = "")
+        public String startTime;
+        @ApiModelProperty(example = "")
+        public String endTime;
+        @ApiModelProperty(example = "Teller1")
+        public String tellerName;
+        @ApiModelProperty(example = "Staff1, Test")
+        public String staffName;
+
+    }
+
+    @ApiModel(value = "PutTellersTellerIdCashiersCashierIdRequest")
+    public static final class PutTellersTellerIdCashiersCashierIdRequest {
+        private PutTellersTellerIdCashiersCashierIdRequest() {
+
+        }
+        @ApiModelProperty(example = "25 February 2015")
+        public LocalDate endDate;
+        @ApiModelProperty(example = "Cashier updated.")
+        public String description;
+        @ApiModelProperty(example = "true")
+        public Boolean isFullDay;
+        @ApiModelProperty(example = "1")
+        public Long staffId;
+        @ApiModelProperty(example = "en")
+        public String locale;
+        @ApiModelProperty(example = "dd-MM-yyyy")
+        public String dateFormat;
+        @ApiModelProperty(example = "01 February 2015")
+        public LocalDate startDate;
+
+    }
+
+    @ApiModel(value = "PutTellersTellerIdCashiersCashierIdResponse")
+    public static final class PutTellersTellerIdCashiersCashierIdResponse {
+        private PutTellersTellerIdCashiersCashierIdResponse() {
+
+        }
+        final class PutTellersTellerIdCashiersCashierIdResponseChanges {
+            private PutTellersTellerIdCashiersCashierIdResponseChanges() {}
+            @ApiModelProperty(example = "25 February 2015")
+            public LocalDate endDate;
+            @ApiModelProperty(example = "Cashier updated.")
+            public String description;
+            @ApiModelProperty(example = "en")
+            public String locale;
+            @ApiModelProperty(example = "dd-MM-yyyy")
+            public String dateFormat;
+        }
+        @ApiModelProperty(example = "1")
+        public Long resourceId;
+        @ApiModelProperty(example = "2")
+        public Long subResourceId;
+        public PutTellersTellerIdCashiersCashierIdResponseChanges changes;
+    }
+
+    @ApiModel(value = "DeleteTellersTellerIdCashiersCashierIdResponse")
+    public static final class DeleteTellersTellerIdCashiersCashierIdResponse {
+        private DeleteTellersTellerIdCashiersCashierIdResponse() {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long resourceId;
+    }
+
+    @ApiModel(value = "GetTellersTellerIdCashiersTemplateResponse")
+    public static final class GetTellersTellerIdCashiersTemplateResponse {
+        private GetTellersTellerIdCashiersTemplateResponse() {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long tellerId;
+        @ApiModelProperty(example = "Teller1")
+        public String tellerName;
+        @ApiModelProperty(example = "1")
+        public Long officeId;
+        @ApiModelProperty(example = "Head Office")
+        public String officeName;
+        public Collection<StaffData> staffOptions;
+    }
+
+    @ApiModel(value = "GetTellersTellerIdCashiersCashiersIdTransactionsResponse")
+    public static final class GetTellersTellerIdCashiersCashiersIdTransactionsResponse {
+        private GetTellersTellerIdCashiersCashiersIdTransactionsResponse() {
+
+        }
+        @ApiModelProperty(example = "8")
+        public Long id;
+        @ApiModelProperty(example = "15")
+        public Long cashierId;
+        public CashierTxnType txnType;
+        @ApiModelProperty(example = "1000")
+        public BigDecimal txnAmount;
+        @ApiModelProperty(example = "Feb 25, 2015 12:00:00 AM")
+        public Date txnDate;
+        @ApiModelProperty(example = "2")
+        public Long entityId;
+        @ApiModelProperty(example = "loans")
+        public String entityType;
+        @ApiModelProperty(example = "Disbursement, Loan:2-000000002,Client:1-Test 1")
+        public String txnNote;
+        @ApiModelProperty(example = "Feb 25, 2015 12:00:00 AM")
+        public Date createdDate;
+        @ApiModelProperty(example = "1")
+        public Long officeId;
+        @ApiModelProperty(example = "Head Office")
+        public String officeName;
+        @ApiModelProperty(example = "0")
+        public Long tellerId;
+        @ApiModelProperty(example = "B, Ramesh")
+        public String cashierName;
+    }
+
+    @ApiModel(value = "PostTellersTellerIdCashiersCashierIdAllocateRequest")
+    public static final class PostTellersTellerIdCashiersCashierIdAllocateRequest {
+        private PostTellersTellerIdCashiersCashierIdAllocateRequest() {
+
+        }
+        @ApiModelProperty(example = "USD")
+        public String currencyCode;
+        @ApiModelProperty(example = "5000")
+        public BigDecimal txnAmount;
+        @ApiModelProperty(example = "allocating cash")
+        public String txnNote;
+        @ApiModelProperty(example = "en")
+        public String locale;
+        @ApiModelProperty(example = "dd-MM-yyyy")
+        public String dateFormat;
+        @ApiModelProperty(example = "01 February 2015")
+        public Date txnDate;
+    }
+
+    @ApiModel(value = "PostTellersTellerIdCashiersCashierIdAllocateResponse")
+    public static final class PostTellersTellerIdCashiersCashierIdAllocateResponse {
+        private PostTellersTellerIdCashiersCashierIdAllocateResponse() {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long resourceId;
+        @ApiModelProperty(example = "4")
+        public Long subResourceId;
+    }
+
+    @ApiModel(value = "PostTellersTellerIdCashiersCashierIdSettleRequest")
+    public static final class PostTellersTellerIdCashiersCashierIdSettleRequest {
+        private PostTellersTellerIdCashiersCashierIdSettleRequest() {
+
+        }
+        @ApiModelProperty(example = "USD")
+        public String currencyCode;
+        @ApiModelProperty(example = "2000")
+        public BigDecimal txnAmount;
+        @ApiModelProperty(example = "cash settlement")
+        public String txnNote;
+        @ApiModelProperty(example = "en")
+        public String locale;
+        @ApiModelProperty(example = "dd-MM-yyyy")
+        public String dateFormat;
+        @ApiModelProperty(example = "20 February 2015")
+        public Date txnDate;
+
+    }
+
+    @ApiModel(value = "PostTellersTellerIdCashiersCashierIdSettleResponse")
+    public static final class PostTellersTellerIdCashiersCashierIdSettleResponse {
+        private PostTellersTellerIdCashiersCashierIdSettleResponse() {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long resourceId;
+        @ApiModelProperty(example = "5")
+        public Long subResourceId;
+    }
+
+    @ApiModel(value = "GetTellersTellerIdCashiersCashiersIdSummaryAndTransactionsResponse")
+    public static final class GetTellersTellerIdCashiersCashiersIdSummaryAndTransactionsResponse {
+        private GetTellersTellerIdCashiersCashiersIdSummaryAndTransactionsResponse() {
+
+        }
+        @ApiModelProperty(example = "7000.000000")
+        public BigDecimal sumCashAllocation;
+        @ApiModelProperty(example = "0")
+        public BigDecimal sumInwardCash;
+        @ApiModelProperty(example = "0")
+        public BigDecimal sumOutwardCash;
+        @ApiModelProperty(example = "50.000000")
+        public BigDecimal sumCashSettlement;
+        @ApiModelProperty(example = "6950.000000")
+        public BigDecimal netCash;
+        @ApiModelProperty(example = "Head Office")
+        public String officeName;
+        @ApiModelProperty(example = "1")
+        public long tellerId;
+        @ApiModelProperty(example = "Teller1")
+        public String tellerName;
+        @ApiModelProperty(example = "1")
+        public long cashierId;
+        @ApiModelProperty(example = "Staff1, Test")
+        public String cashierName;
+        public Page<CashierTransactionData> cashierTransactions;
+
+    }
+
+    @ApiModel(value = "GetTellersTellerIdCashiersCashiersIdTransactionsTemplateResponse")
+    public static final class GetTellersTellerIdCashiersCashiersIdTransactionsTemplateResponse {
+        private GetTellersTellerIdCashiersCashiersIdTransactionsTemplateResponse() {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long cashierId;
+        @ApiModelProperty(example = "Head Office")
+        public String officeName;
+        @ApiModelProperty(example = "0")
+        public Long tellerId;
+        @ApiModelProperty(example = "Teller1")
+        public String tellerName;
+        @ApiModelProperty(example = "Staff1, Test")
+        public String cashierName;
+        public CashierData cashierData;
+        @ApiModelProperty(example = "Feb 20, 2015 12:00:00 AM")
+        public LocalDate startDate;
+        @ApiModelProperty(example = "Feb 27, 2015 12:00:00 AM")
+        public LocalDate endDate;
+        public Collection<CurrencyData> currencyOptions;
+    }
+
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/api/TellerJournalApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/api/TellerJournalApiResource.java
index 744fbf1d9..e9c5ecd7c 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/api/TellerJournalApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/teller/api/TellerJournalApiResource.java
@@ -27,6 +27,7 @@
 import javax.ws.rs.QueryParam;
 import javax.ws.rs.core.MediaType;
 
+import io.swagger.annotations.Api;
 import org.apache.fineract.infrastructure.core.serialization.DefaultToApiJsonSerializer;
 import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
 import org.apache.fineract.organisation.teller.data.TellerData;
@@ -40,6 +41,7 @@
 @Path("cashiersjournal")
 @Component
 @Scope("singleton")
+@Api(value = "cashiersjournal", description = "")
 public class TellerJournalApiResource {
 
     private final PlatformSecurityContext securityContext;
diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/workingdays/api/WorkingDaysApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/workingdays/api/WorkingDaysApiResource.java
index 65c8dccbf..1d4aa1673 100755
--- a/fineract-provider/src/main/java/org/apache/fineract/organisation/workingdays/api/WorkingDaysApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/workingdays/api/WorkingDaysApiResource.java
@@ -27,6 +27,7 @@
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.UriInfo;
 
+import io.swagger.annotations.*;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
 import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
@@ -44,6 +45,7 @@
 @Path("/workingdays")
 @Component
 @Scope("singleton")
+@Api(value = "Working days", description = "The days of the week that are workdays.\n" + "\n" + "Rescheduling of repayments when it falls on a non-working is turned on /off by enable/disable reschedule-future-repayments parameter in Global configurations.\n" + "\n" + "Allow transactions on non-working days is configurable by enabling/disbaling the allow-transactions-on-non_workingday parameter in Global configurations.")
 public class WorkingDaysApiResource {
 
     private final DefaultToApiJsonSerializer<WorkingDaysData> toApiJsonSerializer;
@@ -67,6 +69,8 @@ public WorkingDaysApiResource(DefaultToApiJsonSerializer<WorkingDaysData> toApiJ
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
+    @ApiOperation(value = "List Working days", notes = "Example Requests:\n" + "\n" + "workingdays")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = WorkingDaysApiResourceSwagger.GetWorkingDaysResponse.class, responseContainer = "list")})
     public String retrieveAll(@Context final UriInfo uriInfo) {
         this.context.authenticatedUser().validateHasReadPermission(WorkingDaysApiConstants.WORKING_DAYS_RESOURCE_NAME);
         final WorkingDaysData workingDaysData = this.workingDaysReadPlatformService.retrieve();
@@ -78,7 +82,10 @@ public String retrieveAll(@Context final UriInfo uriInfo) {
     @PUT
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String update(final String jsonRequestBody) {
+    @ApiOperation(value = "Update a Working Day", notes = "Mandatory Fields\n" + "recurrence,repaymentRescheduleType,extendTermForDailyRepayments,locale")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = WorkingDaysApiResourceSwagger.PutWorkingDaysRequest.class )})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = WorkingDaysApiResourceSwagger.PutWorkingDaysResponse.class)})
+    public String update(@ApiParam(hidden = true) final String jsonRequestBody) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().updateWorkingDays().withJson(jsonRequestBody).build();
 
@@ -91,6 +98,8 @@ public String update(final String jsonRequestBody) {
     @Path("/template")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
+    @ApiOperation(value = "Working Days Template", notes = "This is a convenience resource. It can be useful when building maintenance user interface screens for working days.\n" + "\n" + "Example Request:\n" + "\n" + "workingdays/template")
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = WorkingDaysApiResourceSwagger.GetWorkingDaysTemplateResponse.class )})
     public String template(@Context final UriInfo uriInfo) {
         this.context.authenticatedUser().validateHasReadPermission(WorkingDaysApiConstants.WORKING_DAYS_RESOURCE_NAME);
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/organisation/workingdays/api/WorkingDaysApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/organisation/workingdays/api/WorkingDaysApiResourceSwagger.java
new file mode 100644
index 000000000..035f98105
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/organisation/workingdays/api/WorkingDaysApiResourceSwagger.java
@@ -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.
+ */
+package org.apache.fineract.organisation.workingdays.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.apache.fineract.infrastructure.core.data.EnumOptionData;
+
+import java.util.Collection;
+
+/**
+ * Created by sanyam on 19/8/17.
+ */
+
+final class WorkingDaysApiResourceSwagger {
+    private WorkingDaysApiResourceSwagger() {
+
+    }
+
+    @ApiModel(value = "GetWorkingDaysResponse")
+    public static final class GetWorkingDaysResponse {
+        private GetWorkingDaysResponse() {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long id;
+        @ApiModelProperty(example = "FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR")
+        public String recurrence;
+        public EnumOptionData repaymentRescheduleType;
+        @ApiModelProperty(example = "true")
+        public Boolean extendTermForDailyRepayments;
+    }
+
+    @ApiModel(value = "GetWorkingDaysTemplateResponse")
+    public static final class GetWorkingDaysTemplateResponse {
+        private GetWorkingDaysTemplateResponse() {
+
+        }
+        public Collection<EnumOptionData> repaymentRescheduleOptions;
+    }
+
+    @ApiModel(value = "PutWorkingDaysRequest")
+    public static final class PutWorkingDaysRequest {
+        private PutWorkingDaysRequest() {
+
+        }
+        @ApiModelProperty(example = "FREQ=WEEKLY;INTERVAL=1;BYDAY=MO,TU,WE,TH,FR")
+        public String recurrence;
+        @ApiModelProperty(example = "en")
+        public String locale;
+        @ApiModelProperty(example = "4")
+        public EnumOptionData repaymentRescheduleType;
+        @ApiModelProperty(example = "true")
+        public Boolean extendTermForDailyRepayments;
+    }
+
+    @ApiModel(value = "PutWorkingDaysResponse")
+    public static final class PutWorkingDaysResponse {
+        private PutWorkingDaysResponse() {
+
+        }
+        @ApiModelProperty(example = "1")
+        public Long resourceId;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/api/AccountTransfersApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/api/AccountTransfersApiResource.java
index 84fa436bc..12556664b 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/api/AccountTransfersApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/api/AccountTransfersApiResource.java
@@ -18,17 +18,7 @@
  */
 package org.apache.fineract.portfolio.account.api;
 
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.UriInfo;
-
+import io.swagger.annotations.*;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
 import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
@@ -45,9 +35,15 @@
 import org.springframework.context.annotation.Scope;
 import org.springframework.stereotype.Component;
 
+import javax.ws.rs.*;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.UriInfo;
+
 @Path("/accounttransfers")
 @Component
 @Scope("singleton")
+@Api(value = "Account Transfers", description = "Ability to be able to transfer monetary funds from one account to another.\n\n" + "\n\n" + "Note: At present only savings account to savings account transfers are supported.")
 public class AccountTransfersApiResource {
 
     private final PlatformSecurityContext context;
@@ -73,11 +69,13 @@ public AccountTransfersApiResource(final PlatformSecurityContext context,
     @Path("template")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String template(@QueryParam("fromOfficeId") final Long fromOfficeId, @QueryParam("fromClientId") final Long fromClientId,
-            @QueryParam("fromAccountId") final Long fromAccountId, @QueryParam("fromAccountType") final Integer fromAccountType,
-            @QueryParam("toOfficeId") final Long toOfficeId, @QueryParam("toClientId") final Long toClientId,
-            @QueryParam("toAccountId") final Long toAccountId, @QueryParam("toAccountType") final Integer toAccountType,
-            @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Retrieve Account Transfer Template", httpMethod = "GET", notes = "This is a convenience resource. It can be useful when building maintenance user interface screens for client applications. The template data returned consists of any or all of:\n\n" + "\n\n" + "Field Defaults\n\n" + "Allowed Value Lists\n\n" + "Example Requests:\n\n" + "\n\n" + "accounttransfers/template?fromAccountType=2&fromOfficeId=1\n\n" + "\n\n" + "accounttransfers/template?fromAccountType=2&fromOfficeId=1&fromClientId=1\n\n" + "\n\n" + "accounttransfers/template?fromClientId=1&fromAccountType=2&fromAccountId=1")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response =  AccountTransfersApiResourceSwagger.GetAccountTransfersTemplateResponse.class)})
+    public String template(@QueryParam("fromOfficeId") @ApiParam(value = "fromOfficeId") final Long fromOfficeId, @QueryParam("fromClientId") @ApiParam(value = "fromClientId") final Long fromClientId,
+                           @QueryParam("fromAccountId") @ApiParam(value = "fromAccountId") final Long fromAccountId, @QueryParam("fromAccountType") @ApiParam(value = "fromAccountType") final Integer fromAccountType,
+                           @QueryParam("toOfficeId") @ApiParam(value = "toOfficeId") final Long toOfficeId, @QueryParam("toClientId") @ApiParam(value = "toClientId") final Long toClientId,
+                           @QueryParam("toAccountId") @ApiParam(value = "toAccountId") final Long toAccountId, @QueryParam("toAccountType") @ApiParam(value = "toAccountType") final Integer toAccountType,
+                           @Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(AccountTransfersApiConstants.ACCOUNT_TRANSFER_RESOURCE_NAME);
 
@@ -91,7 +89,10 @@ public String template(@QueryParam("fromOfficeId") final Long fromOfficeId, @Que
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String create(final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Create new Transfer", httpMethod = "POST", notes = "Ability to create new transfer of monetary funds from one account to another.")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = AccountTransfersApiResourceSwagger.PostAccountTransfersRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = AccountTransfersApiResourceSwagger.PostAccountTransfersResponse.class)})
+    public String create(@ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().createAccountTransfer().withJson(apiRequestBodyAsJson).build();
 
@@ -103,10 +104,12 @@ public String create(final String apiRequestBodyAsJson) {
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveAll(@Context final UriInfo uriInfo, @QueryParam("sqlSearch") final String sqlSearch,
-            @QueryParam("externalId") final String externalId, @QueryParam("offset") final Integer offset,
-            @QueryParam("limit") final Integer limit, @QueryParam("orderBy") final String orderBy,
-            @QueryParam("sortOrder") final String sortOrder,@QueryParam("accountDetailId") final Long accountDetailId) {
+    @ApiOperation(value = "List account transfers", httpMethod = "GET", notes = "Lists account's transfers\n\n" + "Example Requests:\n\n" + "\n\n" + "accounttransfers")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = AccountTransfersApiResourceSwagger.GetAccountTransfersResponse.class)})
+    public String retrieveAll(@Context final UriInfo uriInfo, @QueryParam("sqlSearch") @ApiParam(value = "sqlSearch") final String sqlSearch,
+            @QueryParam("externalId") @ApiParam(value = "externalId") final String externalId, @QueryParam("offset") @ApiParam(value = "offset") final Integer offset,
+            @QueryParam("limit") @ApiParam(example = "limit") final Integer limit, @QueryParam("orderBy") @ApiParam(value = "orderBy") final String orderBy,
+            @QueryParam("sortOrder") @ApiParam(value = "sortOrder") final String sortOrder,@QueryParam("accountDetailId") @ApiParam(value = "accountDetailId") final Long accountDetailId) {
 
         this.context.authenticatedUser().validateHasReadPermission(AccountTransfersApiConstants.ACCOUNT_TRANSFER_RESOURCE_NAME);
 
@@ -123,7 +126,9 @@ public String retrieveAll(@Context final UriInfo uriInfo, @QueryParam("sqlSearch
     @Path("{transferId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveOne(@PathParam("transferId") final Long transferId, @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Retrieve account transfer", httpMethod = "GET", notes = "Retrieves account transfer\n\n" + "Example Requests :\n\n" + "\n\n" + "accounttransfers/1")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = AccountTransfersApiResourceSwagger.GetAccountTransfersResponse.GetAccountTransfersPageItems.class)})
+    public String retrieveOne(@PathParam("transferId") @ApiParam(value = "transferId") final Long transferId, @Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(AccountTransfersApiConstants.ACCOUNT_TRANSFER_RESOURCE_NAME);
 
@@ -137,10 +142,12 @@ public String retrieveOne(@PathParam("transferId") final Long transferId, @Conte
     @Path("templateRefundByTransfer")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String templateRefundByTransfer(@QueryParam("fromOfficeId") final Long fromOfficeId, @QueryParam("fromClientId") final Long fromClientId,
-            @QueryParam("fromAccountId") final Long fromAccountId, @QueryParam("fromAccountType") final Integer fromAccountType,
-            @QueryParam("toOfficeId") final Long toOfficeId, @QueryParam("toClientId") final Long toClientId,
-            @QueryParam("toAccountId") final Long toAccountId, @QueryParam("toAccountType") final Integer toAccountType,
+    @ApiOperation(value = "Retrieve Refund of an Active Loan by Transfer Template", httpMethod = "GET", notes = "Retrieves Refund of an Active Loan by Transfer Template" + "Example Requests :\n\n" + "\n\n" + "accounttransfers/templateRefundByTransfer?fromAccountId=2&fromAccountType=1& toAccountId=1&toAccountType=2&toClientId=1&toOfficeId=1")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = AccountTransfersApiResourceSwagger.GetAccountTransfersTemplateRefundByTransferResponse.class)})
+    public String templateRefundByTransfer(@QueryParam("fromOfficeId") @ApiParam(value = "fromOfficeId") final Long fromOfficeId, @QueryParam("fromClientId") @ApiParam(value = "fromClientId") final Long fromClientId,
+            @QueryParam("fromAccountId") @ApiParam(value = "fromAccountId") final Long fromAccountId, @QueryParam("fromAccountType") @ApiParam(value = "fromAccountType") final Integer fromAccountType,
+            @QueryParam("toOfficeId") @ApiParam(value = "toOfficeId") final Long toOfficeId, @QueryParam("toClientId") @ApiParam(value = "toClientId") final Long toClientId,
+            @QueryParam("toAccountId") @ApiParam(value = "toAccountId") final Long toAccountId, @QueryParam("toAccountType") @ApiParam(value = "toAccountType") final Integer toAccountType,
             @Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(AccountTransfersApiConstants.ACCOUNT_TRANSFER_RESOURCE_NAME);
@@ -156,7 +163,10 @@ public String templateRefundByTransfer(@QueryParam("fromOfficeId") final Long fr
     @Path("refundByTransfer")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String templateRefundByTransferPost(final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Refund of an Active Loan by Transfer", httpMethod = "POST", notes = "Ability to refund an active loan by transferring to a savings account.")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = AccountTransfersApiResourceSwagger.PostAccountTransfersRefundByTransferRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = AccountTransfersApiResourceSwagger.PostAccountTransfersRefundByTransferResponse.class)})
+    public String templateRefundByTransferPost(@ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().refundByTransfer().withJson(apiRequestBodyAsJson).build();
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/api/AccountTransfersApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/api/AccountTransfersApiResourceSwagger.java
new file mode 100644
index 000000000..a417c30ba
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/api/AccountTransfersApiResourceSwagger.java
@@ -0,0 +1,572 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.portfolio.account.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.time.LocalDate;
+import java.util.Set;
+
+/**
+ * Created by Chirag Gupta on 12/16/17.
+ */
+final class AccountTransfersApiResourceSwagger {
+    private AccountTransfersApiResourceSwagger() {
+    }
+
+    @ApiModel(value = "GetAccountTransfersTemplateResponse")
+    public final static class GetAccountTransfersTemplateResponse {
+        private GetAccountTransfersTemplateResponse() {
+        }
+
+        final class GetAccountTransfersFromOffice {
+            private GetAccountTransfersFromOffice() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "HO")
+            public String name;
+            @ApiModelProperty(example = "HO")
+            public String nameDecorated;
+            @ApiModelProperty(example = "1")
+            public Integer externalId;
+            @ApiModelProperty(example = "[2009, 1, 1]")
+            public LocalDate openingDate;
+            @ApiModelProperty(example = ".")
+            public String hierarchy;
+        }
+
+        final class GetAccountTransfersFromAccountType {
+            private GetAccountTransfersFromAccountType() {
+            }
+
+            @ApiModelProperty(example = "2")
+            public Integer id;
+            @ApiModelProperty(example = "accountType.savings")
+            public String code;
+            @ApiModelProperty(example = "Savings Account")
+            public String value;
+        }
+
+        final class GetAccountTransfersFromOfficeOptions {
+            private GetAccountTransfersFromOfficeOptions() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "HO")
+            public String name;
+            @ApiModelProperty(example = "HO")
+            public String nameDecorated;
+        }
+
+        final class GetAccountTransfersFromClientOptions {
+            private GetAccountTransfersFromClientOptions() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "Small shop")
+            public String displayName;
+            @ApiModelProperty(example = "1")
+            public Integer officeId;
+            @ApiModelProperty(example = "HO")
+            public String officeName;
+        }
+
+        final class GetAccountTransfersFromAccountTypeOptions {
+            private GetAccountTransfersFromAccountTypeOptions() {
+            }
+
+            @ApiModelProperty(example = "2")
+            public Integer id;
+            @ApiModelProperty(example = "accountType.savings")
+            public String code;
+            @ApiModelProperty(example = "Savings Account")
+            public String value;
+        }
+
+        final class GetAccountTransfersToOfficeOptions {
+            private GetAccountTransfersToOfficeOptions() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "HO")
+            public String name;
+            @ApiModelProperty(example = "HO")
+            public String nameDecorated;
+        }
+
+        final class GetAccountTransfersToAccountTypeOptions {
+            private GetAccountTransfersToAccountTypeOptions() {
+            }
+
+            @ApiModelProperty(example = "2")
+            public Integer id;
+            @ApiModelProperty(example = "accountType.savings")
+            public String code;
+            @ApiModelProperty(example = "Savings Account")
+            public String value;
+        }
+
+        @ApiModelProperty(example = "0")
+        public Long transferAmount;
+        @ApiModelProperty(example = "[2013, 8, 15]")
+        public LocalDate transferDate;
+        public GetAccountTransfersFromOffice fromOffice;
+        public GetAccountTransfersFromAccountType fromAccountType;
+        public Set<GetAccountTransfersFromOfficeOptions> fromOfficeOptions;
+        public Set<GetAccountTransfersFromClientOptions> fromClientOptions;
+        public Set<GetAccountTransfersFromAccountTypeOptions> fromAccountTypeOptions;
+        public Set<GetAccountTransfersToOfficeOptions> toOfficeOptions;
+        public Set<GetAccountTransfersToAccountTypeOptions> toAccountTypeOptions;
+    }
+
+    @ApiModel(value = "PostAccountTransfersRequest")
+    public final static class PostAccountTransfersRequest {
+        private PostAccountTransfersRequest() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer fromOfficeId;
+        @ApiModelProperty(example = "1")
+        public Integer fromClientId;
+        @ApiModelProperty(example = "2")
+        public Integer fromAccountType;
+        @ApiModelProperty(example = "1")
+        public Integer fromAccountId;
+        @ApiModelProperty(example = "1")
+        public Integer toOfficeId;
+        @ApiModelProperty(example = "1")
+        public Integer toClientId;
+        @ApiModelProperty(example = "2")
+        public Integer toAccountType;
+        @ApiModelProperty(example = "2")
+        public Integer toAccountId;
+        @ApiModelProperty(example = "dd MMMM yyyy")
+        public String dateFormat;
+        @ApiModelProperty(example = "en")
+        public String locale;
+        @ApiModelProperty(example = "01 August 2011")
+        public String transferDate;
+        @ApiModelProperty(example = "112.45")
+        public Float transferAmount;
+        @ApiModelProperty(example = "A description of the transfer")
+        public String transferDescription;
+    }
+
+    @ApiModel(value = "PostAccountTransfersResponse")
+    public final static class PostAccountTransfersResponse {
+        private PostAccountTransfersResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer savingsId;
+        @ApiModelProperty(example = "1")
+        public Integer resourceId;
+    }
+
+    @ApiModel(value = "GetAccountTransfersResponse")
+    public final static class GetAccountTransfersResponse {
+        private GetAccountTransfersResponse() {
+        }
+
+        final class GetAccountTransfersPageItems {
+            private GetAccountTransfersPageItems() {
+            }
+
+            final class GetAccountTransfersPageItemsCurrency {
+                private GetAccountTransfersPageItemsCurrency() {
+                }
+
+                @ApiModelProperty(example = "USD")
+                public String code;
+                @ApiModelProperty(example = "US Dollar")
+                public String name;
+                @ApiModelProperty(example = "2")
+                public Integer decimalPlaces;
+                @ApiModelProperty(example = "$")
+                public String displaySymbol;
+                @ApiModelProperty(example = "currency.USD")
+                public String nameCode;
+                @ApiModelProperty(example = "US Dollar ($)")
+                public String displayLabel;
+            }
+
+            final class GetAccountTransfersPageItemsFromOffice {
+                private GetAccountTransfersPageItemsFromOffice() {
+                }
+
+                @ApiModelProperty(example = "1")
+                public Integer id;
+                @ApiModelProperty(example = "HO")
+                public String name;
+            }
+
+            final class GetAccountTransfersPageItemsFromAccount {
+                private GetAccountTransfersPageItemsFromAccount() {
+                }
+
+                @ApiModelProperty(example = "1")
+                public Integer id;
+                @ApiModelProperty(example = "000000001")
+                public Long accountNo;
+            }
+
+            final class GetAccountTransfersPageItemsToAccountType {
+                private GetAccountTransfersPageItemsToAccountType() {
+                }
+
+                @ApiModelProperty(example = "1")
+                public Integer id;
+                @ApiModelProperty(example = "accountType.loan")
+                public String code;
+                @ApiModelProperty(example = "Loan Account")
+                public String value;
+            }
+
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "false")
+            public Boolean reversed;
+            public GetAccountTransfersPageItemsCurrency currency;
+            @ApiModelProperty(example = "200")
+            public Float transferAmount;
+            @ApiModelProperty(example = "[2013, 4, 1]")
+            public LocalDate transferDate;
+            @ApiModelProperty(example = "pay off loan from savings.")
+            public String transferDescription;
+            public GetAccountTransfersPageItemsFromOffice fromOffice;
+            public GetAccountTransfersTemplateResponse.GetAccountTransfersFromClientOptions fromClient;
+            public GetAccountTransfersTemplateResponse.GetAccountTransfersFromAccountType fromAccountType;
+            public GetAccountTransfersPageItemsFromAccount fromAccount;
+            public GetAccountTransfersPageItemsFromOffice toOffice;
+            public GetAccountTransfersTemplateResponse.GetAccountTransfersFromClientOptions toClient;
+            public GetAccountTransfersPageItemsToAccountType toAccountType;
+            public GetAccountTransfersPageItemsFromAccount toAccount;
+        }
+
+        @ApiModelProperty(example = "4")
+        public Integer totalFilteredRecords;
+        public Set<GetAccountTransfersPageItems> pageItems;
+    }
+
+    @ApiModel(value = "GetAccountTransfersTemplateRefundByTransferResponse")
+    public static final class GetAccountTransfersTemplateRefundByTransferResponse {
+        private GetAccountTransfersTemplateRefundByTransferResponse() {
+        }
+
+        final class GetAccountTransfersTemplateRefundByTransferCurrency {
+            private GetAccountTransfersTemplateRefundByTransferCurrency() {
+            }
+
+            @ApiModelProperty(example = "USD")
+            public String code;
+            @ApiModelProperty(example = "US Dollar")
+            public String name;
+            @ApiModelProperty(example = "0")
+            public Integer decimalPlaces;
+            @ApiModelProperty(example = "0")
+            public Integer inMultiplesOf;
+            @ApiModelProperty(example = "$")
+            public String displaySymbol;
+            @ApiModelProperty(example = "currency.USD")
+            public String nameCode;
+            @ApiModelProperty(example = "US Dollar ($)")
+            public String displayLabel;
+        }
+
+        final class GetAccountTransfersTemplateRefundByTransferFromOffice {
+            private GetAccountTransfersTemplateRefundByTransferFromOffice() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "Head Office")
+            public String name;
+            @ApiModelProperty(example = "Head Office")
+            public String nameDecorated;
+            @ApiModelProperty(example = "1")
+            public Integer externalId;
+            @ApiModelProperty(example = "[2009, 1, 1]")
+            public LocalDate openingDate;
+            @ApiModelProperty(example = ".")
+            public String hierarchy;
+        }
+
+        final class GetAccountTransfersTemplateRefundByTransferFromClient {
+            private GetAccountTransfersTemplateRefundByTransferFromClient() {
+            }
+
+            final class GetAccountTransfersStatus {
+                private GetAccountTransfersStatus() {
+                }
+
+                @ApiModelProperty(example = "300")
+                public Integer id;
+                @ApiModelProperty(example = "clientStatusType.active")
+                public String code;
+                @ApiModelProperty(example = "Active")
+                public String value;
+            }
+
+            final class GetAccountTransfersGender {
+                private GetAccountTransfersGender() {
+                }
+            }
+
+            final class GetAccountTransfersClientType {
+                private GetAccountTransfersClientType() {
+                }
+            }
+
+            final class GetAccountTransfersClientClassification {
+                private GetAccountTransfersClientClassification() {
+                }
+            }
+
+            final class GetAccountTransfersTimeline {
+                private GetAccountTransfersTimeline() {
+                }
+
+                @ApiModelProperty(example = "[2012, 2, 1]")
+                public LocalDate submittedOnDate;
+                @ApiModelProperty(example = "mifos")
+                public String submittedByUsername;
+                @ApiModelProperty(example = "App")
+                public String submittedByFirstname;
+                @ApiModelProperty(example = "Administrator")
+                public String submittedByLastname;
+                @ApiModelProperty(example = "[2012, 2, 1]")
+                public LocalDate activatedOnDate;
+                @ApiModelProperty(example = "mifos")
+                public String activatedByUsername;
+                @ApiModelProperty(example = "App")
+                public String activatedByFirstname;
+                @ApiModelProperty(example = "Administrator")
+                public String activatedByLastname;
+            }
+
+            final class GetAccountTransfersGroups {
+                private GetAccountTransfersGroups() {
+                }
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "000000001")
+            public Long accountNo;
+            public GetAccountTransfersStatus status;
+            @ApiModelProperty(example = "true")
+            public Boolean active;
+            @ApiModelProperty(example = "[2012, 2, 1]")
+            public LocalDate activationDate;
+            @ApiModelProperty(example = "Daniel")
+            public String firstname;
+            @ApiModelProperty(example = "Owusu")
+            public String lastname;
+            @ApiModelProperty(example = "Daniel Owusu")
+            public String displayName;
+            public GetAccountTransfersGender gender;
+            public GetAccountTransfersClientType clientType;
+            public GetAccountTransfersClientClassification clientClassification;
+            @ApiModelProperty(example = "1")
+            public Integer officeId;
+            @ApiModelProperty(example = "Head Office")
+            public String officeName;
+            public GetAccountTransfersTimeline timeline;
+            public GetAccountTransfersGroups groups;
+        }
+
+        final class GetAccountTransfersTemplateRefundByTransferFromAccount {
+            private GetAccountTransfersTemplateRefundByTransferFromAccount() {
+            }
+
+            @ApiModelProperty(example = "2")
+            public Integer id;
+            @ApiModelProperty(example = "000000002")
+            public Long accountNo;
+            @ApiModelProperty(example = "1")
+            public Integer clientId;
+            @ApiModelProperty(example = "Daniel Owusu")
+            public String clientName;
+            @ApiModelProperty(example = "1")
+            public Integer productId;
+            @ApiModelProperty(example = "CTRL")
+            public String productName;
+            @ApiModelProperty(example = "0")
+            public Integer fieldOfficerId;
+            public GetAccountTransfersTemplateRefundByTransferCurrency currency;
+            @ApiModelProperty(example = "130")
+            public Float amtForTransfer;
+        }
+
+        final class GetAccountTransfersTemplateRefundByTransferToClient {
+            private GetAccountTransfersTemplateRefundByTransferToClient() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "Daniel Owusu")
+            public String displayName;
+            @ApiModelProperty(example = "1")
+            public Integer officeId;
+            @ApiModelProperty(example = "Head Office")
+            public String officeName;
+        }
+
+        final class GetAccountTransfersTemplateRefundByTransferToAccount {
+            private GetAccountTransfersTemplateRefundByTransferToAccount() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "000000001")
+            public Long accountNo;
+            @ApiModelProperty(example = "1")
+            public Integer clientId;
+            @ApiModelProperty(example = "Daniel Owusu")
+            public String clientName;
+            @ApiModelProperty(example = "1")
+            public Integer productId;
+            @ApiModelProperty(example = "TEST")
+            public String productName;
+            @ApiModelProperty(example = "0")
+            public Integer fieldOfficerId;
+            public GetAccountTransfersTemplateRefundByTransferCurrency currency;
+        }
+
+        final class GetAccountTransfersTemplateRefundByTransferFromOfficeOptions {
+            private GetAccountTransfersTemplateRefundByTransferFromOfficeOptions() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "Head Office")
+            public String name;
+            @ApiModelProperty(example = "Head Office")
+            public String nameDecorated;
+        }
+
+        final class GetAccountTransfersTemplateRefundByTransferFromClientOptions {
+            private GetAccountTransfersTemplateRefundByTransferFromClientOptions() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "Daniel Owusu")
+            public String displayName;
+            @ApiModelProperty(example = "1")
+            public Integer officeId;
+            @ApiModelProperty(example = "Head Office")
+            public String officeName;
+        }
+
+        final class GetAccountTransfersTemplateRefundByTransferFromAccountOptions {
+            private GetAccountTransfersTemplateRefundByTransferFromAccountOptions() {
+            }
+
+            @ApiModelProperty(example = "2")
+            public Integer id;
+            @ApiModelProperty(example = "000000002")
+            public Long accountNo;
+            @ApiModelProperty(example = "1")
+            public Integer clientId;
+            @ApiModelProperty(example = "Daniel Owusu")
+            public String clientName;
+            @ApiModelProperty(example = "1")
+            public Integer productId;
+            @ApiModelProperty(example = "CTRL")
+            public String productName;
+            @ApiModelProperty(example = "0")
+            public Integer fieldOfficerId;
+            public GetAccountTransfersTemplateRefundByTransferCurrency currency;
+        }
+
+        public GetAccountTransfersTemplateRefundByTransferCurrency currency;
+        @ApiModelProperty(example = "130")
+        public Float transferAmount;
+        @ApiModelProperty(example = "[2014, 11, 1]")
+        public LocalDate transferDate;
+        public GetAccountTransfersTemplateRefundByTransferFromOffice fromOffice;
+        public GetAccountTransfersTemplateRefundByTransferFromClient fromClient;
+        public GetAccountTransfersResponse.GetAccountTransfersPageItems.GetAccountTransfersPageItemsToAccountType fromAccountType;
+        public GetAccountTransfersTemplateRefundByTransferFromAccount fromAccount;
+        public GetAccountTransfersTemplateRefundByTransferFromOffice toOffice;
+        public GetAccountTransfersTemplateRefundByTransferToClient toClient;
+        public GetAccountTransfersTemplateResponse.GetAccountTransfersFromAccountType toAccountType;
+        public GetAccountTransfersTemplateRefundByTransferToAccount toAccount;
+        public Set<GetAccountTransfersTemplateRefundByTransferFromOfficeOptions> fromOfficeOptions;
+        public Set<GetAccountTransfersTemplateRefundByTransferFromClientOptions> fromClientOptions;
+        public Set<GetAccountTransfersTemplateResponse.GetAccountTransfersFromAccountType> fromAccountTypeOptions;
+        public Set<GetAccountTransfersTemplateRefundByTransferFromAccountOptions> fromAccountOptions;
+        public Set<GetAccountTransfersTemplateRefundByTransferFromOfficeOptions> toOfficeOptions;
+        public Set<GetAccountTransfersTemplateRefundByTransferFromClientOptions> toClientOptions;
+        public Set<GetAccountTransfersTemplateResponse.GetAccountTransfersFromAccountType> toAccountTypeOptions;
+        public Set<GetAccountTransfersTemplateRefundByTransferToAccount> toAccountOptions;
+    }
+
+    @ApiModel(value = "PostAccountTransfersRefundByTransferRequest")
+    public static final class PostAccountTransfersRefundByTransferRequest {
+        private PostAccountTransfersRefundByTransferRequest() {
+        }
+
+        @ApiModelProperty(example = "2")
+        public Integer fromAccountId;
+        @ApiModelProperty(example = "1")
+        public Integer fromAccountType;
+        @ApiModelProperty(example = "1")
+        public Integer toOfficeId;
+        @ApiModelProperty(example = "1")
+        public Integer toClientId;
+        @ApiModelProperty(example = "2")
+        public Integer toAccountType;
+        @ApiModelProperty(example = "1")
+        public Integer toAccountId;
+        @ApiModelProperty(example = "130")
+        public Float transferAmount;
+        @ApiModelProperty(example = "31 October 2014")
+        public String transferDate;
+        @ApiModelProperty(example = "Transfer refund to my savings account")
+        public String transferDescription;
+        @ApiModelProperty(example = "en")
+        public String locale;
+        @ApiModelProperty(example = "dd MMMM yyyy")
+        public String dateFormat;
+        @ApiModelProperty(example = "1")
+        public Integer fromClientId;
+        @ApiModelProperty(example = "1")
+        public Integer fromOfficeId;
+    }
+
+    @ApiModel(value = "PostAccountTransfersRefundByTransferResponse")
+    public final static class PostAccountTransfersRefundByTransferResponse {
+        private PostAccountTransfersRefundByTransferResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer savingsId;
+        @ApiModelProperty(example = "1")
+        public Integer resourceId;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/api/StandingInstructionApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/api/StandingInstructionApiResource.java
index 2d780e054..f2efc19ab 100755
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/api/StandingInstructionApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/api/StandingInstructionApiResource.java
@@ -6,9 +6,7 @@
  * 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
@@ -18,22 +16,7 @@
  */
 package org.apache.fineract.portfolio.account.api;
 
-import java.util.Arrays;
-import java.util.Date;
-import java.util.Set;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.UriInfo;
-
+import io.swagger.annotations.*;
 import org.apache.commons.lang.StringUtils;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
@@ -56,9 +39,18 @@
 import org.springframework.context.annotation.Scope;
 import org.springframework.stereotype.Component;
 
+import javax.ws.rs.*;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.UriInfo;
+import java.util.Arrays;
+import java.util.Date;
+import java.util.Set;
+
 @Path("/standinginstructions")
 @Component
 @Scope("singleton")
+@Api(value = "Standing Instructions", description = "Standing instructions (or standing orders) refer to instructions a bank account holder (\"the payer\") gives to his or her bank to pay a set amount at regular intervals to another's (\"the payee's\") account.\n" + "\n" + "Note: At present only savings account to savings account and savings account to Loan account transfers are permitted.")
 public class StandingInstructionApiResource {
 
     private final PlatformSecurityContext context;
@@ -70,11 +62,11 @@
 
     @Autowired
     public StandingInstructionApiResource(final PlatformSecurityContext context,
-            final DefaultToApiJsonSerializer<StandingInstructionData> toApiJsonSerializer,
-            final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService,
-            final ApiRequestParameterHelper apiRequestParameterHelper,
-            final StandingInstructionReadPlatformService standingInstructionReadPlatformService,
-            final AccountTransfersReadPlatformService accountTransfersReadPlatformService) {
+                        final DefaultToApiJsonSerializer<StandingInstructionData> toApiJsonSerializer,
+                        final PortfolioCommandSourceWritePlatformService commandsSourceWritePlatformService,
+                        final ApiRequestParameterHelper apiRequestParameterHelper,
+                        final StandingInstructionReadPlatformService standingInstructionReadPlatformService,
+                        final AccountTransfersReadPlatformService accountTransfersReadPlatformService) {
         this.context = context;
         this.toApiJsonSerializer = toApiJsonSerializer;
         this.commandsSourceWritePlatformService = commandsSourceWritePlatformService;
@@ -85,13 +77,15 @@ public StandingInstructionApiResource(final PlatformSecurityContext context,
 
     @GET
     @Path("template")
-    @Consumes({ MediaType.APPLICATION_JSON })
-    @Produces({ MediaType.APPLICATION_JSON })
-    public String template(@QueryParam("fromOfficeId") final Long fromOfficeId, @QueryParam("fromClientId") final Long fromClientId,
-            @QueryParam("fromAccountId") final Long fromAccountId, @QueryParam("fromAccountType") final Integer fromAccountType,
-            @QueryParam("toOfficeId") final Long toOfficeId, @QueryParam("toClientId") final Long toClientId,
-            @QueryParam("toAccountId") final Long toAccountId, @QueryParam("toAccountType") final Integer toAccountType,
-            @QueryParam("transferType") final Integer transferType, @Context final UriInfo uriInfo) {
+    @Consumes({MediaType.APPLICATION_JSON})
+    @Produces({MediaType.APPLICATION_JSON})
+    @ApiOperation(value = "Retrieve Standing Instruction Template", httpMethod = "GET", notes = "This is a convenience resource. " + "It can be useful when building maintenance user interface screens for client applications. " + "The template data returned consists of any or all of:\n" + "\n" + "Field Defaults\n" + "Allowed Value Lists\n" + "Example Requests:\n" + "\n" + "standinginstructions/template?fromAccountType=2&fromOfficeId=1\n" + "\n" + "standinginstructions/template?fromAccountType=2&fromOfficeId=1&fromClientId=1&transferType=1\n" + "\n" + "standinginstructions/template?fromClientId=1&fromAccountType=2&fromAccountId=1&transferType=1")
+    @ApiResponses(@ApiResponse(code = 200, message = "OK", response = StandingInstructionApiResourceSwagger.GetStandingInstructionsTemplateResponse.class))
+    public String template(@QueryParam("fromOfficeId") @ApiParam(value = "fromOfficeId") final Long fromOfficeId, @QueryParam("fromClientId") @ApiParam(value = "fromClientId") final Long fromClientId,
+                           @QueryParam("fromAccountId") @ApiParam(value = "fromAccountId") final Long fromAccountId, @QueryParam("fromAccountType") @ApiParam(value = "fromAccountType") final Integer fromAccountType,
+                           @QueryParam("toOfficeId") @ApiParam(value = "toOfficeId") final Long toOfficeId, @QueryParam("toClientId") @ApiParam(value = "toClientId") final Long toClientId,
+                           @QueryParam("toAccountId") @ApiParam(value = "toAccountId") final Long toAccountId, @QueryParam("toAccountType") @ApiParam(value = "toAccountType") final Integer toAccountType,
+                           @QueryParam("transferType") @ApiParam(value = "transferType") final Integer transferType, @Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(StandingInstructionApiConstants.STANDING_INSTRUCTION_RESOURCE_NAME);
 
@@ -104,9 +98,12 @@ public String template(@QueryParam("fromOfficeId") final Long fromOfficeId, @Que
     }
 
     @POST
-    @Consumes({ MediaType.APPLICATION_JSON })
-    @Produces({ MediaType.APPLICATION_JSON })
-    public String create(final String apiRequestBodyAsJson) {
+    @Consumes({MediaType.APPLICATION_JSON})
+    @Produces({MediaType.APPLICATION_JSON})
+    @ApiOperation(value = "Create new Standing Instruction", httpMethod = "POST", notes = "Ability to create new instruction for transfer of monetary funds from one account to another")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = StandingInstructionApiResourceSwagger.PostStandingInstructionsRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = StandingInstructionApiResourceSwagger.PostStandingInstructionsResponse.class)})
+    public String create(@ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().createStandingInstruction().withJson(apiRequestBodyAsJson)
                 .build();
@@ -118,10 +115,13 @@ public String create(final String apiRequestBodyAsJson) {
 
     @PUT
     @Path("{standingInstructionId}")
-    @Consumes({ MediaType.APPLICATION_JSON })
-    @Produces({ MediaType.APPLICATION_JSON })
-    public String update(@PathParam("standingInstructionId") final Long standingInstructionId, final String apiRequestBodyAsJson,
-            @QueryParam("command") final String commandParam) {
+    @Consumes({MediaType.APPLICATION_JSON})
+    @Produces({MediaType.APPLICATION_JSON})
+    @ApiOperation(value = "Update Standing Instruction | Delete Standing Instruction", httpMethod = "PUT", notes = "Ability to modify existing instruction for transfer of monetary funds from one account to another.\n" + "\n" + "PUT https://DomainName/api/v1/standinginstructions/1?command=update\n" + "\n\n" + "Ability to modify existing instruction for transfer of monetary funds from one account to another.\n" + "\n" + "PUT https://DomainName/api/v1/standinginstructions/1?command=delete")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = false, paramType = "body", dataType = "body", format = "body", dataTypeClass = StandingInstructionApiResourceSwagger.PutStandingInstructionsStandingInstructionIdRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = StandingInstructionApiResourceSwagger.PutStandingInstructionsStandingInstructionIdResponse.class)})
+    public String update(@PathParam("standingInstructionId") @ApiParam(value = "standingInstructionId") final Long standingInstructionId, @ApiParam(hidden = true) final String apiRequestBodyAsJson,
+                         @QueryParam("command") @ApiParam(value = "command") final String commandParam) {
 
         CommandWrapper commandRequest = null;
         if (is(commandParam, "update")) {
@@ -132,7 +132,9 @@ public String update(@PathParam("standingInstructionId") final Long standingInst
                     .build();
         }
 
-        if (commandRequest == null) { throw new UnrecognizedQueryParamException("command", commandParam); }
+        if (commandRequest == null) {
+            throw new UnrecognizedQueryParamException("command", commandParam);
+        }
         final CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
 
         return this.toApiJsonSerializer.serialize(result);
@@ -144,14 +146,16 @@ private boolean is(final String commandParam, final String commandValue) {
     }
 
     @GET
-    @Consumes({ MediaType.APPLICATION_JSON })
-    @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveAll(@Context final UriInfo uriInfo, @QueryParam("sqlSearch") final String sqlSearch,
-            @QueryParam("externalId") final String externalId, @QueryParam("offset") final Integer offset,
-            @QueryParam("limit") final Integer limit, @QueryParam("orderBy") final String orderBy,
-            @QueryParam("sortOrder") final String sortOrder, @QueryParam("transferType") final Integer transferType,
-            @QueryParam("clientName") final String clientName, @QueryParam("clientId") final Long clientId,
-            @QueryParam("fromAccountId") final Long fromAccount, @QueryParam("fromAccountType") final Integer fromAccountType) {
+    @Consumes({MediaType.APPLICATION_JSON})
+    @Produces({MediaType.APPLICATION_JSON})
+    @ApiOperation(value = "List Standing Instructions", httpMethod = "GET", notes = "Example Requests:\n" + "\n" + "standinginstructions")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = StandingInstructionApiResourceSwagger.GetStandingInstructionsResponse.class)})
+    public String retrieveAll(@Context final UriInfo uriInfo, @QueryParam("sqlSearch") @ApiParam(value = "sqlSearch") final String sqlSearch,
+                              @QueryParam("externalId") @ApiParam(value = "externalId") final String externalId, @QueryParam("offset") @ApiParam(value = "offset") final Integer offset,
+                              @QueryParam("limit") @ApiParam(value = "limit") final Integer limit, @QueryParam("orderBy") @ApiParam(value = "orderBy") final String orderBy,
+                              @QueryParam("sortOrder") @ApiParam(value = "sortOrder") final String sortOrder, @QueryParam("transferType") @ApiParam(value = "transferType") final Integer transferType,
+                              @QueryParam("clientName") @ApiParam(value = "clientName") final String clientName, @QueryParam("clientId") @ApiParam(value = "clientId") final Long clientId,
+                              @QueryParam("fromAccountId") @ApiParam(value = "fromAccountId") final Long fromAccount, @QueryParam("fromAccountType") @ApiParam(value = "fromAccountType") final Integer fromAccountType) {
 
         this.context.authenticatedUser().validateHasReadPermission(StandingInstructionApiConstants.STANDING_INSTRUCTION_RESOURCE_NAME);
 
@@ -171,12 +175,14 @@ public String retrieveAll(@Context final UriInfo uriInfo, @QueryParam("sqlSearch
 
     @GET
     @Path("{standingInstructionId}")
-    @Consumes({ MediaType.APPLICATION_JSON })
-    @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveOne(@PathParam("standingInstructionId") final Long standingInstructionId, @Context final UriInfo uriInfo,
-            @QueryParam("sqlSearch") final String sqlSearch, @QueryParam("externalId") final String externalId,
-            @QueryParam("offset") final Integer offset, @QueryParam("limit") final Integer limit,
-            @QueryParam("orderBy") final String orderBy, @QueryParam("sortOrder") final String sortOrder) {
+    @Consumes({MediaType.APPLICATION_JSON})
+    @Produces({MediaType.APPLICATION_JSON})
+    @ApiOperation(value = "Retrieve Standing Instruction", httpMethod = "GET", notes = "Example Requests :\n" + "\n" + "standinginstructions/1")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = StandingInstructionApiResourceSwagger.GetStandingInstructionsStandingInstructionIdResponse.class)})
+    public String retrieveOne(@PathParam("standingInstructionId") @ApiParam(value = "standingInstructionId") final Long standingInstructionId, @Context final UriInfo uriInfo,
+                              @QueryParam("sqlSearch") @ApiParam(value = "sqlSearch") final String sqlSearch, @QueryParam("externalId") @ApiParam(value = "externalId") final String externalId,
+                              @QueryParam("offset") @ApiParam(value = "offset") final Integer offset, @QueryParam("limit") @ApiParam(value = "limit") final Integer limit,
+                              @QueryParam("orderBy") @ApiParam(value = "orderBy") final String orderBy, @QueryParam("sortOrder") @ApiParam(value = "sortOrder") final String sortOrder) {
 
         this.context.authenticatedUser().validateHasReadPermission(StandingInstructionApiConstants.STANDING_INSTRUCTION_RESOURCE_NAME);
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/api/StandingInstructionApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/api/StandingInstructionApiResourceSwagger.java
new file mode 100644
index 000000000..2022f19c2
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/api/StandingInstructionApiResourceSwagger.java
@@ -0,0 +1,549 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.portfolio.account.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.time.LocalDate;
+import java.util.Set;
+
+/**
+ * Created by Chirag Gupta on 11/29/17.
+ */
+final class StandingInstructionApiResourceSwagger {
+
+    private StandingInstructionApiResourceSwagger() {
+        // this class is only for Swagger Live Documentation
+    }
+
+    @ApiModel(value = "GetStandingInstructionsTemplateResponse")
+    public static final class GetStandingInstructionsTemplateResponse {
+        private GetStandingInstructionsTemplateResponse() {
+        }
+
+        final class GetFromOfficeResponseStandingInstructionSwagger {
+            private GetFromOfficeResponseStandingInstructionSwagger() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Long id;
+            @ApiModelProperty(example = "Head Office")
+            public String name;
+            @ApiModelProperty(example = "Head Office")
+            public String decoratedName;
+            @ApiModelProperty(example = "1")
+            public Integer externalId;
+            @ApiModelProperty(example = "[2009, 1, 1]")
+            public LocalDate openingDate;
+            @ApiModelProperty(example = ".")
+            public String hierarchy;
+        }
+
+        final class GetFromAccountTypeResponseStandingInstructionSwagger {
+            private GetFromAccountTypeResponseStandingInstructionSwagger() {
+            }
+
+            @ApiModelProperty(example = "2")
+            public Long id;
+            @ApiModelProperty(example = "accountType.savings")
+            public String code;
+            @ApiModelProperty(example = "Savings Account")
+            public String value;
+        }
+
+        final class GetFromOfficeOptionsResponseStandingInstructionSwagger {
+            private GetFromOfficeOptionsResponseStandingInstructionSwagger() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Long id;
+            @ApiModelProperty(example = "Head Office")
+            public String name;
+            @ApiModelProperty(example = "Head Office")
+            public String nameDecorated;
+        }
+
+        final class GetFromClientOptionsResponseStandingInstructionSwagger {
+            private GetFromClientOptionsResponseStandingInstructionSwagger() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Long id;
+            @ApiModelProperty(example = "Client_FirstName_2VRAG Client_LastName_9QCY")
+            public String displayName;
+            @ApiModelProperty(example = "1")
+            public Long officeId;
+            @ApiModelProperty(example = "Head Office")
+            public String officeName;
+        }
+
+        final class GetFromAccountTypeOptionsResponseStandingInstructionSwagger {
+            private GetFromAccountTypeOptionsResponseStandingInstructionSwagger() {
+            }
+
+            @ApiModelProperty(example = "2")
+            public Long id;
+            @ApiModelProperty(example = "accountType.savings")
+            public String code;
+            @ApiModelProperty(example = "Savings Account")
+            public String value;
+        }
+
+        final class GetToOfficeOptionsResponseStandingInstructionSwagger {
+            private GetToOfficeOptionsResponseStandingInstructionSwagger() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "Head Office")
+            public String name;
+            @ApiModelProperty(example = "Head Office")
+            public String nameDecorated;
+        }
+
+        final class GetToAccountTypeOptionsResponseStandingInstructionSwagger {
+            private GetToAccountTypeOptionsResponseStandingInstructionSwagger() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "accountType.loan")
+            public String code;
+            @ApiModelProperty(example = "Loan Account")
+            public String value;
+        }
+
+        final class GetTransferTypeOptionsResponseStandingInstructionSwagger {
+            private GetTransferTypeOptionsResponseStandingInstructionSwagger() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "accountTransferType.account.transfer")
+            public String code;
+            @ApiModelProperty(example = "Account Transfer")
+            public String value;
+        }
+
+        final class GetStatusOptionsResponseStandingInstructionSwagger {
+            private GetStatusOptionsResponseStandingInstructionSwagger() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "standingInstructionStatus.active")
+            public String code;
+            @ApiModelProperty(example = "Active")
+            public String value;
+        }
+
+        final class GetInstructionTypeOptionsResponseStandingInstructionSwagger {
+            private GetInstructionTypeOptionsResponseStandingInstructionSwagger() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "standingInstructionType.fixed")
+            public String code;
+            @ApiModelProperty(example = "Fixed")
+            public String value;
+        }
+
+        final class GetPriorityOptionsResponseStandingInstructionSwagger {
+            private GetPriorityOptionsResponseStandingInstructionSwagger() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "standingInstructionPriority.urgent")
+            public String code;
+            @ApiModelProperty(example = "Urgent Priority")
+            public String value;
+        }
+
+        final class GetRecurrenceTypeOptionsResponseStandingInstructionSwagger {
+            private GetRecurrenceTypeOptionsResponseStandingInstructionSwagger() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "accountTransferRecurrenceType.periodic")
+            public String code;
+            @ApiModelProperty(example = "Periodic Recurrence")
+            public String value;
+        }
+
+        final class GetRecurrenceFrequencyOptionsResponseStandingInstructionSwagger {
+            private GetRecurrenceFrequencyOptionsResponseStandingInstructionSwagger() {
+            }
+
+            @ApiModelProperty(example = "0")
+            public Integer id;
+            @ApiModelProperty(example = "frequencyperiodFrequencyType.days")
+            public String code;
+            @ApiModelProperty(example = "Days")
+            public String value;
+        }
+
+        public GetFromOfficeResponseStandingInstructionSwagger fromOffice;
+        public GetFromAccountTypeResponseStandingInstructionSwagger fromAccountType;
+        public Set<GetFromOfficeOptionsResponseStandingInstructionSwagger> fromOfficeOptions;
+        public Set<GetFromClientOptionsResponseStandingInstructionSwagger> fromClientOptions;
+        public Set<GetFromAccountTypeOptionsResponseStandingInstructionSwagger> fromAccountTypeOptions;
+        public Set<GetToOfficeOptionsResponseStandingInstructionSwagger> toOfficeOptions;
+        public Set<GetToAccountTypeOptionsResponseStandingInstructionSwagger> toAccountTypeOptions;
+        public Set<GetTransferTypeOptionsResponseStandingInstructionSwagger> transferTypeOptions;
+        public Set<GetStatusOptionsResponseStandingInstructionSwagger> statusOptions;
+        public Set<GetInstructionTypeOptionsResponseStandingInstructionSwagger> instructionTypeOptions;
+        public Set<GetPriorityOptionsResponseStandingInstructionSwagger> priorityOptions;
+        public Set<GetRecurrenceTypeOptionsResponseStandingInstructionSwagger> recurrenceTypeOptions;
+        public Set<GetRecurrenceFrequencyOptionsResponseStandingInstructionSwagger> recurrenceFrequencyOptions;
+    }
+
+    @ApiModel(value = "PostStandingInstructionsResponse")
+    public static final class PostStandingInstructionsResponse {
+        private PostStandingInstructionsResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Long clientId;
+        @ApiModelProperty(example = "65")
+        public Integer resourceId;
+    }
+
+    @ApiModel(value = "GetStandingInstructionsResponse")
+    public static final class GetStandingInstructionsResponse {
+        private GetStandingInstructionsResponse() {
+        }
+
+        final class GetPageItemsStandingInstructionSwagger {
+            final class GetFromOfficeStandingInstructionSwagger {
+                private GetFromOfficeStandingInstructionSwagger() {
+                }
+
+                @ApiModelProperty(example = "1")
+                public Long id;
+                @ApiModelProperty(example = "Head Office")
+                public String name;
+            }
+
+            final class GetFromClientStandingInstructionSwagger {
+                private GetFromClientStandingInstructionSwagger() {
+                }
+
+                @ApiModelProperty(example = "1")
+                public Long id;
+                @ApiModelProperty(example = "Test test")
+                public String displayName;
+                @ApiModelProperty(example = "1")
+                public Long officeId;
+                @ApiModelProperty(example = "Head Office")
+                public String officeName;
+            }
+
+            final class GetFromAccountTypeStandingInstructionSwagger {
+                private GetFromAccountTypeStandingInstructionSwagger() {
+                }
+
+                @ApiModelProperty(example = "2")
+                public Integer id;
+                @ApiModelProperty(example = "accountType.savings")
+                public String code;
+                @ApiModelProperty(example = "Savings Account")
+                public String value;
+            }
+
+            final class GetFromAccountStandingInstructionSwagger {
+                private GetFromAccountStandingInstructionSwagger() {
+                }
+
+                @ApiModelProperty(example = "14")
+                public Long id;
+                @ApiModelProperty(example = "000000014")
+                public Long accountNo;
+                @ApiModelProperty(example = "1")
+                public Long productId;
+                @ApiModelProperty(example = "savings old")
+                public String productName;
+            }
+
+            final class GetToOfficeStandingInstructionSwagger {
+                private GetToOfficeStandingInstructionSwagger() {
+                }
+
+                @ApiModelProperty(example = "1")
+                public Long id;
+                @ApiModelProperty(example = "Head Office")
+                public String name;
+            }
+
+            final class GetToClientStandingInstructionSwagger {
+                private GetToClientStandingInstructionSwagger() {
+                }
+
+                @ApiModelProperty(example = "1")
+                public Long id;
+                @ApiModelProperty(example = "Test test")
+                public String displayName;
+                @ApiModelProperty(example = "1")
+                public Long officeId;
+                @ApiModelProperty(example = "Head Office")
+                public String officeName;
+            }
+
+            final class GetToAccountTypeStandingInstructionSwagger {
+                private GetToAccountTypeStandingInstructionSwagger() {
+                }
+
+                @ApiModelProperty(example = "2")
+                public Integer id;
+                @ApiModelProperty(example = "accountType.savings")
+                public String code;
+                @ApiModelProperty(example = "Savings Account")
+                public String value;
+            }
+
+            final class GetToAccountStandingInstructionSwagger {
+                private GetToAccountStandingInstructionSwagger() {
+                }
+
+                @ApiModelProperty(example = "3")
+                public Long id;
+                @ApiModelProperty(example = "000000003")
+                public Long accountNo;
+                @ApiModelProperty(example = "4")
+                public Long productId;
+                @ApiModelProperty(example = "account overdraft")
+                public String productName;
+            }
+
+            final class GetTransferTypeStandingInstructionSwagger {
+                private GetTransferTypeStandingInstructionSwagger() {
+                }
+
+                @ApiModelProperty(example = "1")
+                public Integer id;
+                @ApiModelProperty(example = "accountTransferType.account.transfer")
+                public String code;
+                @ApiModelProperty(example = "Account Transfer")
+                public String value;
+            }
+
+            final class GetPriorityStandingInstructionSwagger {
+                private GetPriorityStandingInstructionSwagger() {
+                }
+
+                @ApiModelProperty(example = "3")
+                public Integer id;
+                @ApiModelProperty(example = "standingInstructionPriority.medium")
+                public String code;
+                @ApiModelProperty(example = "Medium Priority")
+                public String value;
+            }
+
+            final class GetInstructionTypeStandingInstructionSwagger {
+                private GetInstructionTypeStandingInstructionSwagger() {
+                }
+
+                @ApiModelProperty(example = "1")
+                public Integer id;
+                @ApiModelProperty(example = "standingInstructionType.fixed")
+                public String code;
+                @ApiModelProperty(example = "Fixed")
+                public String value;
+            }
+
+            final class GetStatusStandingInstructionSwagger {
+                private GetStatusStandingInstructionSwagger() {
+                }
+
+                @ApiModelProperty(example = "1")
+                public Integer id;
+                @ApiModelProperty(example = "standingInstructionStatus.deleted")
+                public String code;
+                @ApiModelProperty(example = "Deleted")
+                public String value;
+            }
+
+            final class GetRecurrenceTypeStandingInstructionSwagger {
+                private GetRecurrenceTypeStandingInstructionSwagger() {
+                }
+
+                @ApiModelProperty(example = "1")
+                public Integer id;
+                @ApiModelProperty(example = "accountTransferRecurrenceType.periodic")
+                public String code;
+                @ApiModelProperty(example = "Periodic Recurrence")
+                public String value;
+            }
+
+            final class GetRecurrenceFrequencyStandingInstructionSwagger {
+                private GetRecurrenceFrequencyStandingInstructionSwagger() {
+                }
+
+                @ApiModelProperty(example = "2")
+                public Integer id;
+                @ApiModelProperty(example = "frequencyperiodFrequencyType.months")
+                public String code;
+                @ApiModelProperty(example = "Months")
+                public String value;
+            }
+
+            @ApiModelProperty(example = "1")
+            public Long id;
+            @ApiModelProperty(example = "6")
+            public Long accountDetailId;
+            @ApiModelProperty(example = "test standing")
+            public String name;
+            public GetFromOfficeStandingInstructionSwagger fromOffice;
+            public GetFromClientStandingInstructionSwagger fromClient;
+            public GetFromAccountTypeStandingInstructionSwagger fromAccountType;
+            public GetFromAccountStandingInstructionSwagger fromAccount;
+            public GetToOfficeStandingInstructionSwagger toOffice;
+            public GetToClientStandingInstructionSwagger toClient;
+            public GetToAccountTypeStandingInstructionSwagger toAccountType;
+            public GetToAccountStandingInstructionSwagger toAccount;
+            public GetTransferTypeStandingInstructionSwagger transferType;
+            public GetPriorityStandingInstructionSwagger priority;
+            public GetInstructionTypeStandingInstructionSwagger instructionType;
+            public GetStatusStandingInstructionSwagger status;
+            @ApiModelProperty(example = "150.000000")
+            public float amount;
+            @ApiModelProperty(example = "[2014, 4, 3]")
+            public LocalDate validFrom;
+            public GetRecurrenceTypeStandingInstructionSwagger recurrenceType;
+            public GetRecurrenceFrequencyStandingInstructionSwagger recurrenceFrequency;
+            @ApiModelProperty(example = "1")
+            public Integer recurrenceInterval;
+            @ApiModelProperty(example = "[4, 3]")
+            public LocalDate recurrenceOnMonthDay;
+        }
+
+        @ApiModelProperty(example = "2")
+        public Integer totalFilteredRecords;
+        public Set<GetPageItemsStandingInstructionSwagger> pageItems;
+    }
+
+    @ApiModel(value = "PostStandingInstructionsRequest")
+    public static final class PostStandingInstructionsRequest {
+        private PostStandingInstructionsRequest() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Long fromOfficeId;
+        @ApiModelProperty(example = "1")
+        public Long fromClientId;
+        @ApiModelProperty(example = "2")
+        public Integer fromAccountType;
+        @ApiModelProperty(example = "standing instruction")
+        public String name;
+        @ApiModelProperty(example = "1")
+        public Integer transferType;
+        @ApiModelProperty(example = "2")
+        public Integer priority;
+        @ApiModelProperty(example = "1")
+        public Integer status;
+        @ApiModelProperty(example = "1")
+        public Long fromAccountId;
+        @ApiModelProperty(example = "1")
+        public Long toOfficeId;
+        @ApiModelProperty(example = "1")
+        public Long toClientId;
+        @ApiModelProperty(example = "2")
+        public Integer toAccountType;
+        @ApiModelProperty(example = "3")
+        public Long toAccountId;
+        @ApiModelProperty(example = "1")
+        public Integer instructionType;
+        @ApiModelProperty(example = "221")
+        public Integer amount;
+        @ApiModelProperty(example = "08 April 2014")
+        public String validFrom;
+        @ApiModelProperty(example = "1")
+        public Integer recurrenceType;
+        @ApiModelProperty(example = "1")
+        public Integer recurrenceInterval;
+        @ApiModelProperty(example = "2")
+        public Integer recurrenceFrequency;
+        @ApiModelProperty(value = "en")
+        public String locale;
+        @ApiModelProperty(example = "dd MMMM yyyy")
+        public String dateFormat;
+        @ApiModelProperty(example = "02 April")
+        public String recurrenceOnMonthDay;
+        @ApiModelProperty(example = "dd MMMM")
+        public String monthDayFormat;
+    }
+
+    @ApiModel(value = "GetStandingInstructionsStandingInstructionIdResponse")
+    public static final class GetStandingInstructionsStandingInstructionIdResponse {
+        private GetStandingInstructionsStandingInstructionIdResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Long id;
+        @ApiModelProperty(example = "6")
+        public Long accountDetailId;
+        @ApiModelProperty(example = "test standing")
+        public String name;
+        public GetStandingInstructionsResponse.GetPageItemsStandingInstructionSwagger.GetFromOfficeStandingInstructionSwagger fromOffice;
+        public GetStandingInstructionsResponse.GetPageItemsStandingInstructionSwagger.GetFromClientStandingInstructionSwagger fromClient;
+        public GetStandingInstructionsResponse.GetPageItemsStandingInstructionSwagger.GetFromAccountTypeStandingInstructionSwagger fromAccountType;
+        public GetStandingInstructionsResponse.GetPageItemsStandingInstructionSwagger.GetFromAccountStandingInstructionSwagger fromAccount;
+        public GetStandingInstructionsResponse.GetPageItemsStandingInstructionSwagger.GetToOfficeStandingInstructionSwagger toOffice;
+        public GetStandingInstructionsResponse.GetPageItemsStandingInstructionSwagger.GetToClientStandingInstructionSwagger toClient;
+        public GetStandingInstructionsResponse.GetPageItemsStandingInstructionSwagger.GetToAccountTypeStandingInstructionSwagger toAccountType;
+        public GetStandingInstructionsResponse.GetPageItemsStandingInstructionSwagger.GetToAccountStandingInstructionSwagger toAccount;
+        public GetStandingInstructionsResponse.GetPageItemsStandingInstructionSwagger.GetTransferTypeStandingInstructionSwagger transferType;
+        public GetStandingInstructionsResponse.GetPageItemsStandingInstructionSwagger.GetPriorityStandingInstructionSwagger priority;
+        public GetStandingInstructionsResponse.GetPageItemsStandingInstructionSwagger.GetInstructionTypeStandingInstructionSwagger instructionType;
+        public GetStandingInstructionsResponse.GetPageItemsStandingInstructionSwagger.GetStatusStandingInstructionSwagger status;
+        @ApiModelProperty(example = "150.000000")
+        public float amount;
+        @ApiModelProperty(example = "[2014, 4, 3]")
+        public LocalDate validFrom;
+        public GetStandingInstructionsResponse.GetPageItemsStandingInstructionSwagger.GetRecurrenceTypeStandingInstructionSwagger recurrenceType;
+        public GetStandingInstructionsResponse.GetPageItemsStandingInstructionSwagger.GetRecurrenceFrequencyStandingInstructionSwagger recurrenceFrequency;
+        @ApiModelProperty(example = "1")
+        public Integer recurrenceInterval;
+        @ApiModelProperty(example = "[4, 3]")
+        public LocalDate recurrenceOnMonthDay;
+    }
+
+    @ApiModel(value = "PutStandingInstructionsStandingInstructionIdResponse")
+    public static final class PutStandingInstructionsStandingInstructionIdResponse {
+        private PutStandingInstructionsStandingInstructionIdResponse() {
+        }
+        final class PutUpdateStandingInstructionChanges{
+            @ApiModelProperty(example = "2")
+            public Integer recurrenceInterval;
+        }
+        @ApiModelProperty(example = "20")
+        public Integer resourceId;
+        public PutUpdateStandingInstructionChanges changes;
+    }
+
+    @ApiModel(value = "PutStandingInstructionsStandingInstructionIdRequest")
+    public static final class PutStandingInstructionsStandingInstructionIdRequest{
+        private PutStandingInstructionsStandingInstructionIdRequest(){}
+        @ApiModelProperty(example = "2")
+        public Integer recurrenceInterval;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/api/StandingInstructionHistoryApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/api/StandingInstructionHistoryApiResource.java
index 616cf050f..a5e9867f0 100755
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/api/StandingInstructionHistoryApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/api/StandingInstructionHistoryApiResource.java
@@ -18,17 +18,7 @@
  */
 package org.apache.fineract.portfolio.account.api;
 
-import java.util.Date;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.UriInfo;
-
+import io.swagger.annotations.*;
 import org.apache.fineract.accounting.journalentry.api.DateParam;
 import org.apache.fineract.infrastructure.core.api.ApiRequestParameterHelper;
 import org.apache.fineract.infrastructure.core.serialization.ApiRequestJsonSerializationSettings;
@@ -43,9 +33,16 @@
 import org.springframework.context.annotation.Scope;
 import org.springframework.stereotype.Component;
 
+import javax.ws.rs.*;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.UriInfo;
+import java.util.Date;
+
 @Path("/standinginstructionrunhistory")
 @Component
 @Scope("singleton")
+@Api(value = "Standing Instructions History", description = "The list capability of history can support pagination and sorting.")
 public class StandingInstructionHistoryApiResource {
 
     private final PlatformSecurityContext context;
@@ -67,14 +64,16 @@ public StandingInstructionHistoryApiResource(final PlatformSecurityContext conte
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveAll(@Context final UriInfo uriInfo, @QueryParam("sqlSearch") final String sqlSearch,
-            @QueryParam("externalId") final String externalId, @QueryParam("offset") final Integer offset,
-            @QueryParam("limit") final Integer limit, @QueryParam("orderBy") final String orderBy,
-            @QueryParam("sortOrder") final String sortOrder, @QueryParam("transferType") final Integer transferType,
-            @QueryParam("clientName") final String clientName, @QueryParam("clientId") final Long clientId,
-            @QueryParam("fromAccountId") final Long fromAccount, @QueryParam("fromAccountType") final Integer fromAccountType,
-            @QueryParam("locale") final String locale, @QueryParam("dateFormat") final String dateFormat,
-            @QueryParam("fromDate") final DateParam fromDateParam, @QueryParam("toDate") final DateParam toDateParam) {
+    @ApiOperation(value = "Standing Instructions Logged History", httpMethod = "GET", notes = "The list capability of history can support pagination and sorting \n\n" +"Example Requests :\n" + "\n" + "standinginstructionrunhistory\n" + "\n" + "standinginstructionrunhistory?orderBy=name&sortOrder=DESC\n" + "\n" + "standinginstructionrunhistory?offset=10&limit=50")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = StandingInstructionHistoryApiResourceSwagger.GetStandingInstructionRunHistoryResponse.class)})
+    public String retrieveAll(@Context final UriInfo uriInfo, @QueryParam("sqlSearch") @ApiParam(value = "sqlSearch") final String sqlSearch,
+            @QueryParam("externalId") @ApiParam(value = "externalId") final String externalId, @QueryParam("offset") @ApiParam(value = "offset") final Integer offset,
+            @QueryParam("limit") @ApiParam(value = "limit") final Integer limit, @QueryParam("orderBy") @ApiParam(value = "orderBy") final String orderBy,
+            @QueryParam("sortOrder") @ApiParam(value = "sortOrder") final String sortOrder, @QueryParam("transferType") @ApiParam(value = "transferType") final Integer transferType,
+            @QueryParam("clientName") @ApiParam(value = "clientName") final String clientName, @QueryParam("clientId") @ApiParam(value = "clientId") final Long clientId,
+            @QueryParam("fromAccountId") @ApiParam(value = "fromAccountId") final Long fromAccount, @QueryParam("fromAccountType") @ApiParam(value = "fromAccountType") final Integer fromAccountType,
+            @QueryParam("locale") @ApiParam(value = "locale") final String locale, @QueryParam("dateFormat") @ApiParam(value = "dateFormat") final String dateFormat,
+            @QueryParam("fromDate") @ApiParam(value = "fromDate") final DateParam fromDateParam, @QueryParam("toDate") @ApiParam(value = "toDate") final DateParam toDateParam) {
 
         this.context.authenticatedUser().validateHasReadPermission(StandingInstructionApiConstants.STANDING_INSTRUCTION_RESOURCE_NAME);
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/api/StandingInstructionHistoryApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/api/StandingInstructionHistoryApiResourceSwagger.java
new file mode 100644
index 000000000..521b2f901
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/account/api/StandingInstructionHistoryApiResourceSwagger.java
@@ -0,0 +1,123 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.portfolio.account.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.time.LocalDate;
+import java.util.Set;
+
+/**
+ * Created by Chirag Gupta on 12/01/17.
+ */
+final class StandingInstructionHistoryApiResourceSwagger {
+    private StandingInstructionHistoryApiResourceSwagger() {
+    }
+
+    @ApiModel(value = "GetStandingInstructionRunHistoryResponse")
+    public final static class GetStandingInstructionRunHistoryResponse {
+        private GetStandingInstructionRunHistoryResponse() {
+        }
+
+        final class GetStandingInstructionHistoryPageItemsResponse {
+
+            final class GetStandingInstructionHistoryPageItemsFromClient {
+                private GetStandingInstructionHistoryPageItemsFromClient() {
+                }
+
+                @ApiModelProperty(example = "1")
+                public Long id;
+                @ApiModelProperty(example = "Test client")
+                public String displayName;
+                @ApiModelProperty(example = "1")
+                public Long officeId;
+                @ApiModelProperty(example = "Head Office")
+                public String officeName;
+            }
+
+            final class GetStandingInstructionHistoryFromAccount {
+                private GetStandingInstructionHistoryFromAccount() {
+                }
+
+                @ApiModelProperty(example = "2")
+                public Long id;
+                @ApiModelProperty(example = "000000002")
+                public Long accountNo;
+                @ApiModelProperty(example = "1")
+                public Long productId;
+                @ApiModelProperty(example = "General Savings")
+                public String productName;
+            }
+
+            final class GetStandingInstructionHistoryToAccount {
+                private GetStandingInstructionHistoryToAccount() {
+                }
+
+                @ApiModelProperty(example = "1")
+                public Long id;
+                @ApiModelProperty(example = "000000001")
+                public Long accountNo;
+                @ApiModelProperty(example = "1")
+                public Long productId;
+                @ApiModelProperty(example = "General Savings")
+                public String productName;
+            }
+
+            final class GetStandingInstructionHistoryToClient {
+                private GetStandingInstructionHistoryToClient() {
+                }
+
+                @ApiModelProperty(example = "1")
+                public Long id;
+                @ApiModelProperty(example = "Test client")
+                public String displayName;
+                @ApiModelProperty(example = "1")
+                public Long officeId;
+                @ApiModelProperty(example = "Head Office")
+                public String officeName;
+            }
+
+            @ApiModelProperty(example = "1")
+            public Long standingInstructionId;
+            @ApiModelProperty(example = "ACC Transfer")
+            public String name;
+            public StandingInstructionApiResourceSwagger.GetStandingInstructionsResponse.GetPageItemsStandingInstructionSwagger.GetFromOfficeStandingInstructionSwagger fromOffice;
+            public GetStandingInstructionHistoryPageItemsFromClient fromClient;
+            public StandingInstructionApiResourceSwagger.GetStandingInstructionsResponse.GetPageItemsStandingInstructionSwagger.GetFromAccountTypeStandingInstructionSwagger fromAccountType;
+            public GetStandingInstructionHistoryFromAccount fromAccount;
+            public StandingInstructionApiResourceSwagger.GetStandingInstructionsResponse.GetPageItemsStandingInstructionSwagger.GetToAccountTypeStandingInstructionSwagger toAccountType;
+            public GetStandingInstructionHistoryToAccount toAccount;
+            public StandingInstructionApiResourceSwagger.GetStandingInstructionsResponse.GetPageItemsStandingInstructionSwagger.GetToOfficeStandingInstructionSwagger toOffice;
+            public GetStandingInstructionHistoryToClient toClient;
+            @ApiModelProperty(example = "10")
+            public Float amount;
+            @ApiModelProperty(example = "success")
+            public String status;
+            @ApiModelProperty(example = "[2014, 6, 30]")
+            public LocalDate executionTime;
+            @ApiModelProperty(example = " ")
+            public String errorLog;
+        }
+
+        @ApiModelProperty(example = "2")
+        public Integer totalFilteredRecords;
+        public Set<GetStandingInstructionHistoryPageItemsResponse> pageItems;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/accounts/api/AccountsApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/accounts/api/AccountsApiResource.java
index 9e72b0b22..36b467eb6 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/accounts/api/AccountsApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/accounts/api/AccountsApiResource.java
@@ -18,6 +18,7 @@
  */
 package org.apache.fineract.portfolio.accounts.api;
 
+import io.swagger.annotations.*;
 import javax.ws.rs.Consumes;
 import javax.ws.rs.GET;
 import javax.ws.rs.POST;
@@ -62,6 +63,7 @@
 @Path("/accounts/{type}")
 @Component
 @Scope("singleton")
+@Api(value = "Share Account", description = "Share accounts are instances of a praticular share product created for an individual. An application process around the creation of accounts is also supported.")
 public class AccountsApiResource {
 
     private final ApplicationContext applicationContext ;
@@ -93,9 +95,11 @@ public AccountsApiResource(final ApplicationContext applicationContext,
     @Path("template")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String template(@PathParam("type") final String accountType, @QueryParam("clientId") final Long clientId, 
-    		@QueryParam("productId") final Long productId,
-            @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Retrieve Share Account Template", httpMethod = "GET", notes = "This is a convenience resource. It can be useful when building maintenance user interface screens for client applications. The template data returned consists of any or all of:\n" + "\n" + "Field Defaults\n" + "Allowed Value Lists\n\n" + "Example Requests:\n" + "\n" + "accounts/share/template?clientId=1\n" + "\n" + "\n" + "accounts/share/template?clientId=1&productId=1")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = AccountsApiResourceSwagger.GetAccountsTypeTemplateResponse.class)})
+    public String template(@PathParam("type") @ApiParam(value = "type") final String accountType, @QueryParam("clientId") @ApiParam(value = "clientId") final Long clientId,
+                           @QueryParam("productId") @ApiParam(value = "productId") final Long productId,
+                           @Context final UriInfo uriInfo) {
         try {
             this.platformSecurityContext.authenticatedUser() ;
             String serviceName = accountType+AccountsApiConstants.READPLATFORM_NAME ;
@@ -112,7 +116,9 @@ public String template(@PathParam("type") final String accountType, @QueryParam(
     @Path("{accountId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveAccount(@PathParam("accountId") final Long accountId, @PathParam("type") final String accountType,
+    @ApiOperation(value = "Retrieve a share application/account", httpMethod = "GET", notes = "Retrieves a share application/account\n\n" + "Example Requests :\n" + "\n" + "shareaccount/1")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = AccountsApiResourceSwagger.GetAccountsTypeAccountIdResponse.class)})
+    public String retrieveAccount(@PathParam("accountId") @ApiParam(value = "accountId") final Long accountId, @PathParam("type") @ApiParam(value = "type") final String accountType,
             @Context final UriInfo uriInfo) {
         try {
             String serviceName = accountType+AccountsApiConstants.READPLATFORM_NAME ;
@@ -128,7 +134,9 @@ public String retrieveAccount(@PathParam("accountId") final Long accountId, @Pat
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveAllAccounts(@PathParam("type") final String accountType, @QueryParam("offset") final Integer offset, @QueryParam("limit") final Integer limit, @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "List share applications/accounts", httpMethod = "GET", notes = "Lists share applications/accounts\n\n" + "Example Requests:\n" + "\n" + "shareaccount")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = AccountsApiResourceSwagger.GetAccountsTypeResponse.class)})
+    public String retrieveAllAccounts(@PathParam("type") @ApiParam(value = "type") final String accountType, @QueryParam("offset") @ApiParam(value = "offset") final Integer offset, @QueryParam("limit") @ApiParam(value = "limit") final Integer limit, @Context final UriInfo uriInfo) {
         try {
             String serviceName = accountType+AccountsApiConstants.READPLATFORM_NAME ;
             AccountReadPlatformService service = (AccountReadPlatformService) this.applicationContext.getBean(serviceName) ;
@@ -143,7 +151,10 @@ public String retrieveAllAccounts(@PathParam("type") final String accountType, @
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String createAccount(@PathParam("type") final String accountType, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Submit new share application", httpMethod = "POST", notes = "Submits new share application\n\n" + "Mandatory Fields: clientId, productId, submittedDate, savingsAccountId, requestedShares, applicationDate\n\n" + "Optional Fields: accountNo, externalId\n\n" + "Inherited from Product (if not provided): minimumActivePeriod, minimumActivePeriodFrequencyType, lockinPeriodFrequency, lockinPeriodFrequencyType")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = AccountsApiResourceSwagger.PostAccountsTypeRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = AccountsApiResourceSwagger.PostAccountsTypeResponse.class)})
+    public String createAccount(@PathParam("type") @ApiParam(value = "type") final String accountType, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
         CommandWrapper commandWrapper = null;
         this.platformSecurityContext.authenticatedUser();
         commandWrapper = new CommandWrapperBuilder().createAccount(accountType).withJson(apiRequestBodyAsJson).build();
@@ -155,8 +166,11 @@ public String createAccount(@PathParam("type") final String accountType, final S
     @Path("{accountId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String handleCommands(@PathParam("type") final String accountType, @PathParam("accountId") final Long accountId, @QueryParam("command") final String commandParam,
-            final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Approve share application | Undo approval share application | Reject share application | Activate a share account | Close a share account | Apply additional shares on a share account | Approve additional shares request on a share account | Reject additional shares request on a share account | Redeem shares on a share account", httpMethod = "POST", notes = "Approve share application:\n\n" + "Approves share application so long as its in 'Submitted and pending approval' state.\n\n" + "Undo approval share application:\n\n" + "Will move 'approved' share application back to 'Submitted and pending approval' state.\n\n" + "Reject share application:\n\n" + "Rejects share application so long as its in 'Submitted and pending approval' state.\n\n" + "Activate a share account:\n\n" + "Results in an approved share application being converted into an 'active' share account.\n\n" + "Close a share account:\n\n" + "Results in an Activated share application being converted into an 'closed' share account.\n" + "\n" + "closedDate is closure date of share account\n\n" + "Mandatory Fields: dateFormat,locale,closedDate\n\n" + "Apply additional shares on a share account:\n\n" + "requestedDate is requsted date of share purchase\n" + "\n" + "requestedShares is number of shares to be purchase\n\n" + "Mandatory Fields: dateFormat,locale,requestedDate, requestedShares\n\n" + "Approve additional shares request on a share account\n\n" + "requestedShares is Share purchase transaction ids\n\n" + "Mandatory Fields: requestedShares\n\n" + "Reject additional shares request on a share account:\n\n" + "requestedShares is Share purchase transaction ids\n\n" + "Mandatory Fields: requestedShares\n\n" + "Redeem shares on a share account:\n\n" + "Results redeem some/all shares from share account.\n" + "\n" + "requestedDate is requsted date of shares redeem\n" + "\n" + "requestedShares is number of shares to be redeemed\n\n" + "Mandatory Fields: dateFormat,locale,requestedDate,requestedShares\n\n" + "Showing request/response for 'Reject additional shares request on a share account'\n\n" + "For more info visit this link - https://demo.openmf.org/api-docs/apiLive.htm#shareaccounts")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = AccountsApiResourceSwagger.PostAccountsTypeAccountIdRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = AccountsApiResourceSwagger.PostAccountsTypeAccountIdResponse.class)})
+    public String handleCommands(@PathParam("type") @ApiParam(value = "type") final String accountType, @PathParam("accountId") @ApiParam(value = "accountId") final Long accountId, @QueryParam("command") @ApiParam(value = "command") final String commandParam,
+            @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
         CommandWrapper commandWrapper = null;
         this.platformSecurityContext.authenticatedUser();
         commandWrapper = new CommandWrapperBuilder().createAccountCommand(accountType, accountId, commandParam).withJson(apiRequestBodyAsJson).build();
@@ -168,7 +182,10 @@ public String handleCommands(@PathParam("type") final String accountType, @PathP
     @Path("{accountId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String updateAccount(@PathParam("type") final String accountType, @PathParam("accountId") final Long accountId, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Modify a share application", httpMethod = "PUT", notes = "Share application can only be modified when in 'Submitted and pending approval' state. Once the application is approved, the details cannot be changed using this method. Specific api endpoints will be created to allow change of interest detail such as rate, compounding period, posting period etc")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = AccountsApiResourceSwagger.PutAccountsTypeAccountIdRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = AccountsApiResourceSwagger.PutAccountsTypeAccountIdResponse.class)})
+    public String updateAccount(@PathParam("type") @ApiParam(value = "type") final String accountType, @PathParam("accountId") @ApiParam(value = "accountId") final Long accountId, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
         this.platformSecurityContext.authenticatedUser();
         final CommandWrapper commandRequest = new CommandWrapperBuilder().updateAccount(accountType, accountId)
                 .withJson(apiRequestBodyAsJson).build();
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/accounts/api/AccountsApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/accounts/api/AccountsApiResourceSwagger.java
new file mode 100644
index 000000000..bafb26106
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/accounts/api/AccountsApiResourceSwagger.java
@@ -0,0 +1,529 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.portfolio.accounts.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.time.LocalDate;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Created by Chirag Gupta on 12/20/17.
+ */
+final class AccountsApiResourceSwagger {
+    private AccountsApiResourceSwagger() {
+    }
+
+    @ApiModel(value = "GetAccountsTypeTemplateResponse")
+    public final static class GetAccountsTypeTemplateResponse {
+        private GetAccountsTypeTemplateResponse() {
+        }
+
+        final class GetAccountsTypeProductOptions {
+            private GetAccountsTypeProductOptions() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "Share Product")
+            public String name;
+            @ApiModelProperty(example = "SP")
+            public String shortName;
+            @ApiModelProperty(example = "100")
+            public Long totalShares;
+        }
+
+        @ApiModelProperty(example = "7")
+        public Integer clientId;
+        @ApiModelProperty(example = "Client Name")
+        public String clientName;
+        public Set<GetAccountsTypeProductOptions> productOptions;
+    }
+
+    @ApiModel(value = "GetAccountsTypeAccountIdResponse")
+    public final static class GetAccountsTypeAccountIdResponse {
+        private GetAccountsTypeAccountIdResponse() {
+        }
+
+        final class GetAccountsStatus {
+            private GetAccountsStatus() {
+            }
+
+            @ApiModelProperty(example = "300")
+            public Integer id;
+            @ApiModelProperty(example = "shareAccountStatusType.active")
+            public String code;
+            @ApiModelProperty(example = "Active")
+            public String value;
+            @ApiModelProperty(example = "false")
+            public Boolean submittedAndPendingApproval;
+            @ApiModelProperty(example = "false")
+            public Boolean approved;
+            @ApiModelProperty(example = "false")
+            public Boolean rejected;
+            @ApiModelProperty(example = "true")
+            public Boolean active;
+            @ApiModelProperty(example = "false")
+            public Boolean closed;
+        }
+
+        final class GetAccountsTimeline {
+            private GetAccountsTimeline() {
+            }
+
+            @ApiModelProperty(example = "[2016, 4, 1]")
+            public LocalDate submittedOnDate;
+            @ApiModelProperty(example = "mifos")
+            public String submittedByUsername;
+            @ApiModelProperty(example = "App")
+            public String submittedByFirstname;
+            @ApiModelProperty(example = "Administrator")
+            public String submittedByLastname;
+            @ApiModelProperty(example = "[2016, 4, 1]")
+            public LocalDate approvedDate;
+            @ApiModelProperty(example = "mifos")
+            public String approvedByUsername;
+            @ApiModelProperty(example = "App")
+            public String approvedByFirstname;
+            @ApiModelProperty(example = "Administrator")
+            public String approvedByLastname;
+            @ApiModelProperty(example = "[2016, 4, 1]")
+            public LocalDate activatedDate;
+        }
+
+        final class GetAccountsCurrency {
+            private GetAccountsCurrency() {
+            }
+
+            @ApiModelProperty(example = "USD")
+            public String code;
+            @ApiModelProperty(example = "US Dollar")
+            public String name;
+            @ApiModelProperty(example = "2")
+            public Integer decimalPlaces;
+            @ApiModelProperty(example = "100")
+            public Integer inMultiplesOf;
+            @ApiModelProperty(example = "$")
+            public String displaySymbol;
+            @ApiModelProperty(example = "currency.USD")
+            public String nameCode;
+            @ApiModelProperty(example = "US Dollar ($)")
+            public String displayLabel;
+        }
+
+        final class GetAccountsSummary {
+            private GetAccountsSummary() {
+            }
+
+            @ApiModelProperty(example = "2")
+            public Integer id;
+            @ApiModelProperty(example = "000000002")
+            public Long accountNo;
+            @ApiModelProperty(example = "1")
+            public Integer totalApprovedShares;
+            @ApiModelProperty(example = "0")
+            public Integer totalPendingForApprovalShares;
+            @ApiModelProperty(example = "1")
+            public Integer productId;
+            @ApiModelProperty(example = "Conflux Share Product")
+            public String productName;
+            public GetAccountsStatus status;
+            public GetAccountsTimeline timeline;
+            public GetAccountsCurrency currency;
+        }
+
+        final class GetAccountsPurchasedShares {
+            private GetAccountsPurchasedShares() {
+            }
+
+            final class GetAccountsPurchasedSharesStatus {
+                private GetAccountsPurchasedSharesStatus() {
+                }
+
+                @ApiModelProperty(example = "300")
+                public Integer id;
+                @ApiModelProperty(example = "purchasedSharesStatusType.approved")
+                public String code;
+                @ApiModelProperty(example = "Approved")
+                public String value;
+            }
+
+            final class GetAccountsPurchasedSharesType {
+                private GetAccountsPurchasedSharesType() {
+                }
+
+                @ApiModelProperty(example = "500")
+                public Integer id;
+                @ApiModelProperty(example = "purchasedSharesType.purchased")
+                public String code;
+                @ApiModelProperty(example = "Purchase")
+                public String value;
+            }
+
+            @ApiModelProperty(example = "6")
+            public Integer id;
+            @ApiModelProperty(example = "2")
+            public Integer accountId;
+            @ApiModelProperty(example = "[2016, 4, 1]")
+            public LocalDate purchasedDate;
+            @ApiModelProperty(example = "10")
+            public Integer numberOfShares;
+            @ApiModelProperty(example = "0.5")
+            public Double purchasedPrice;
+            public GetAccountsPurchasedSharesStatus status;
+            public GetAccountsPurchasedSharesType type;
+            @ApiModelProperty(example = "5.05")
+            public Double amount;
+            @ApiModelProperty(example = "0.05")
+            public Double chargeAmount;
+            @ApiModelProperty(example = "5.05")
+            public Double amountPaid;
+        }
+
+        final class GetAccountsLockPeriodTypeEnum {
+            private GetAccountsLockPeriodTypeEnum() {
+            }
+
+            @ApiModelProperty(example = "0")
+            public Integer id;
+            @ApiModelProperty(example = "savings.lockin.sharePeriodFrequencyType.days")
+            public String code;
+            @ApiModelProperty(example = "Days")
+            public String value;
+        }
+
+        final class GetAccountsCharges {
+            private GetAccountsCharges() {
+            }
+
+            final class GetAccountsChargeTimeType {
+                private GetAccountsChargeTimeType() {
+                }
+
+                @ApiModelProperty(example = "13")
+                public Integer id;
+                @ApiModelProperty(example = "chargeTimeType.activation")
+                public String code;
+                @ApiModelProperty(example = "Share Account Activate")
+                public String value;
+            }
+
+            final class GetAccountsChargeCalculationType {
+                private GetAccountsChargeCalculationType() {
+                }
+
+                @ApiModelProperty(example = "1")
+                public Integer id;
+                @ApiModelProperty(example = "chargeCalculationType.flat")
+                public String code;
+                @ApiModelProperty(example = "Flat")
+                public String value;
+            }
+
+            final class GetAccountsChargesCurrency {
+                private GetAccountsChargesCurrency() {
+                }
+
+                @ApiModelProperty(example = "USD")
+                public String code;
+                @ApiModelProperty(example = "US Dollar")
+                public String name;
+                @ApiModelProperty(example = "2")
+                public Integer decimalPlaces;
+                @ApiModelProperty(example = "$")
+                public String displaySymbol;
+                @ApiModelProperty(example = "currency.USD")
+                public String nameCode;
+                @ApiModelProperty(example = "US Dollar ($)")
+                public String displayLabel;
+            }
+
+            @ApiModelProperty(example = "9")
+            public Integer id;
+            @ApiModelProperty(example = "20")
+            public Integer chargeId;
+            @ApiModelProperty(example = "2")
+            public Integer accountId;
+            @ApiModelProperty(example = "Share Account Activation Flat")
+            public String name;
+            public GetAccountsChargeTimeType chargeTimeType;
+            public GetAccountsChargeCalculationType chargeCalculationType;
+            @ApiModelProperty(example = "0")
+            public Double percentage;
+            @ApiModelProperty(example = "0")
+            public Double amountPercentageAppliedTo;
+            public GetAccountsChargesCurrency currency;
+            @ApiModelProperty(example = "1")
+            public Float amount;
+            @ApiModelProperty(example = "1")
+            public Float amountPaid;
+            @ApiModelProperty(example = "0")
+            public Float amountWaived;
+            @ApiModelProperty(example = "0")
+            public Float amountWrittenOff;
+            @ApiModelProperty(example = "0")
+            public Float amountOutstanding;
+            @ApiModelProperty(example = "1")
+            public Float amountOrPercentage;
+            @ApiModelProperty(example = "true")
+            public Boolean isActive;
+        }
+
+
+        @ApiModelProperty(example = "2")
+        public Integer id;
+        @ApiModelProperty(example = "000000002")
+        public Long accountNo;
+        @ApiModelProperty(example = "000000013")
+        public Long savingsAccountNumber;
+        @ApiModelProperty(example = "7")
+        public Integer clientId;
+        @ApiModelProperty(example = "Client_FirstName_2KX8C Client_LastName_NWNG")
+        public String clientName;
+        @ApiModelProperty(example = "1")
+        public Integer productId;
+        @ApiModelProperty(example = "Share Product")
+        public String productName;
+        public GetAccountsStatus status;
+        public GetAccountsTimeline timeline;
+        public GetAccountsCurrency currency;
+        public GetAccountsSummary summary;
+        public Set<GetAccountsPurchasedShares> purchasedShares;
+        @ApiModelProperty(example = "13")
+        public Integer savingsAccountId;
+        @ApiModelProperty(example = "5")
+        public Integer currentMarketPrice;
+        @ApiModelProperty(example = "1")
+        public Integer lockinPeriod;
+        public GetAccountsLockPeriodTypeEnum lockPeriodTypeEnum;
+        @ApiModelProperty(example = "1")
+        public Integer minimumActivePeriod;
+        public GetAccountsLockPeriodTypeEnum minimumActivePeriodTypeEnum;
+        @ApiModelProperty(example = "true")
+        public Boolean allowDividendCalculationForInactiveClients;
+        public Set<GetAccountsCharges> charges;
+        @ApiModelProperty(example = "")
+        public List<String> dividends;
+    }
+
+    @ApiModel(value = "GetAccountsTypeResponse")
+    public final static class GetAccountsTypeResponse {
+        private GetAccountsTypeResponse() {
+        }
+
+        final class GetAccountsPageItems {
+            private GetAccountsPageItems() {
+            }
+
+            final class GetAccountsTypeStatus {
+                private GetAccountsTypeStatus() {
+                }
+
+                @ApiModelProperty(example = "100")
+                public Integer id;
+                @ApiModelProperty(example = "shareAccountStatusType.submitted.and.pending.approval")
+                public String code;
+                @ApiModelProperty(example = "Submitted and pending approval")
+                public String value;
+                @ApiModelProperty(example = "true")
+                public Boolean submittedAndPendingApproval;
+                @ApiModelProperty(example = "false")
+                public Boolean approved;
+                @ApiModelProperty(example = "false")
+                public Boolean rejected;
+                @ApiModelProperty(example = "false")
+                public Boolean active;
+                @ApiModelProperty(example = "false")
+                public Boolean closed;
+            }
+
+            final class GetAccountsTypeTimeline {
+                private GetAccountsTypeTimeline() {
+                }
+
+                @ApiModelProperty(example = "[2013, 3, 1]")
+                public LocalDate submittedOnDate;
+            }
+
+            final class GetAccountsTypePurchasedShares {
+                private GetAccountsTypePurchasedShares() {
+                }
+
+                @ApiModelProperty(example = "1")
+                public Integer id;
+                @ApiModelProperty(example = "01 May 2013")
+                public String purchasedDate;
+                @ApiModelProperty(example = "10")
+                public Integer numberOfShares;
+                @ApiModelProperty(example = "5")
+                public Integer purchasedPrice;
+            }
+
+            final class GetAccountsTypeSummary {
+                private GetAccountsTypeSummary() {
+                }
+
+                public GetAccountsTypeAccountIdResponse.GetAccountsCharges.GetAccountsChargesCurrency currency;
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "000000001")
+            public Long accountNo;
+            @ApiModelProperty(example = "1")
+            public Integer clientId;
+            @ApiModelProperty(example = "Client Name")
+            public String clientName;
+            @ApiModelProperty(example = "1")
+            public Integer productId;
+            @ApiModelProperty(example = "Share Product Name")
+            public String productName;
+            public GetAccountsTypeStatus status;
+            public GetAccountsTypeTimeline timeline;
+            public GetAccountsTypeAccountIdResponse.GetAccountsCharges.GetAccountsChargesCurrency currency;
+            public Set<GetAccountsTypePurchasedShares> purchasedShares;
+            public GetAccountsTypeSummary summary;
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer totalFilteredRecords;
+        public Set<GetAccountsPageItems> pageItems;
+    }
+
+    @ApiModel(value = "PostAccountsTypeRequest")
+    public final static class PostAccountsTypeRequest {
+        private PostAccountsTypeRequest() {
+        }
+
+        final class PostAccountsCharges {
+            private PostAccountsCharges() {
+            }
+
+            @ApiModelProperty(example = "20")
+            public Integer chargeId;
+            @ApiModelProperty(example = "1")
+            public Integer amount;
+        }
+
+        @ApiModelProperty(example = "7")
+        public Integer clientId;
+        @ApiModelProperty(example = "1")
+        public Integer productId;
+        @ApiModelProperty(example = "100")
+        public Integer requestedShares;
+        @ApiModelProperty(example = "1")
+        public Integer externalId;
+        @ApiModelProperty(example = "01 May 2016")
+        public String submittedDate;
+        @ApiModelProperty(example = "1")
+        public Integer minimumActivePeriod;
+        @ApiModelProperty(example = "0")
+        public Integer minimumActivePeriodFrequencyType;
+        @ApiModelProperty(example = "1")
+        public Integer lockinPeriodFrequency;
+        @ApiModelProperty(example = "0")
+        public Integer lockinPeriodFrequencyType;
+        @ApiModelProperty(example = "01 May 2016")
+        public String applicationDate;
+        @ApiModelProperty(example = "true")
+        public Boolean allowDividendCalculationForInactiveClients;
+        @ApiModelProperty(example = "en")
+        public String locale;
+        @ApiModelProperty(example = "dd MMMM yyyy")
+        public String dateFormat;
+        public Set<PostAccountsCharges> charges;
+        @ApiModelProperty(example = "13")
+        public Integer savingsAccountId;
+    }
+
+    @ApiModel(value = "PostAccountsTypeResponse")
+    public final static class PostAccountsTypeResponse {
+        private PostAccountsTypeResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer resourceId;
+    }
+
+    @ApiModel(value = "PostAccountsTypeAccountIdRequest")
+    public final static class PostAccountsTypeAccountIdRequest {
+        private PostAccountsTypeAccountIdRequest() {
+        }
+
+        final class PostAccountsRequestedShares {
+            private PostAccountsRequestedShares() {
+            }
+
+            @ApiModelProperty(example = "35")
+            public Integer id;
+        }
+
+        public Set<PostAccountsRequestedShares> requestedShares;
+    }
+
+    @ApiModel(value = "PostAccountsTypeAccountIdResponse")
+    public final static class PostAccountsTypeAccountIdResponse {
+        private PostAccountsTypeAccountIdResponse() {
+        }
+
+        @ApiModelProperty(example = "5")
+        public Integer resourceId;
+    }
+
+    @ApiModel(value = "PutAccountsTypeAccountIdRequest")
+    public final static class PutAccountsTypeAccountIdRequest {
+        private PutAccountsTypeAccountIdRequest() {
+        }
+
+        @ApiModelProperty(example = "en")
+        public String locale;
+        @ApiModelProperty(example = "dd MMMM yyyy")
+        public String dateFormat;
+        @ApiModelProperty(example = "01 April 2016")
+        public String applicationDate;
+        @ApiModelProperty(example = "20")
+        public Integer requestedShares;
+    }
+
+    @ApiModel(value = "PutAccountsTypeAccountIdResponse")
+    public final static class PutAccountsTypeAccountIdResponse {
+        private PutAccountsTypeAccountIdResponse() {
+        }
+
+        final class PutAccountsChanges {
+            private PutAccountsChanges() {
+            }
+
+            @ApiModelProperty(example = "dd MMMM yyyy")
+            public String dateFormat;
+            @ApiModelProperty(example = "01 April 2016")
+            public String applicationDate;
+            @ApiModelProperty(example = "20")
+            public Integer requestedShares;
+            @ApiModelProperty(example = "en")
+            public String locale;
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer resourceId;
+        public PutAccountsChanges changes;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/api/EntityFieldConfigurationApiResources.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/api/EntityFieldConfigurationApiResources.java
index 838e419fe..830557340 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/api/EntityFieldConfigurationApiResources.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/api/EntityFieldConfigurationApiResources.java
@@ -18,40 +18,32 @@
  */
 package org.apache.fineract.portfolio.address.api;
 
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.UriInfo;
-
-import org.apache.fineract.commands.domain.CommandWrapper;
-import org.apache.fineract.commands.service.CommandWrapperBuilder;
+import io.swagger.annotations.*;
 import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
 import org.apache.fineract.infrastructure.core.api.ApiRequestParameterHelper;
-import org.apache.fineract.infrastructure.core.data.CommandProcessingResult;
 import org.apache.fineract.infrastructure.core.serialization.ApiRequestJsonSerializationSettings;
 import org.apache.fineract.infrastructure.core.serialization.DefaultToApiJsonSerializer;
 import org.apache.fineract.infrastructure.security.service.PlatformSecurityContext;
 import org.apache.fineract.portfolio.address.data.AddressData;
 import org.apache.fineract.portfolio.address.data.FieldConfigurationData;
-import org.apache.fineract.portfolio.address.service.AddressReadPlatformServiceImpl;
 import org.apache.fineract.portfolio.address.service.FieldConfigurationReadPlatformService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.context.annotation.Scope;
 import org.springframework.stereotype.Component;
 
+import javax.ws.rs.*;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.UriInfo;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
 @Path("/fieldconfiguration/{entity}")
 @Component
 @Scope("singleton")
+@Api(value = "Entity Field Configuration", description = "Entity Field configuration API is a generic and extensible \n" + "wherein various entities and subentities can be related.\n" + "Also it gives the user an ability to enable/disable fields,\n" + "add regular expression for validation")
 public class EntityFieldConfigurationApiResources {
 
 	private final Set<String> RESPONSE_DATA_PARAMETERS = new HashSet<>(Arrays.asList("clientAddressId", "client_id",
@@ -83,7 +75,9 @@ public EntityFieldConfigurationApiResources(final PlatformSecurityContext contex
 	@GET
 	@Consumes({ MediaType.APPLICATION_JSON })
 	@Produces({ MediaType.APPLICATION_JSON })
-	public String getAddresses(@PathParam("entity") final String entityname, @Context final UriInfo uriInfo) {
+       @ApiOperation(httpMethod = "GET", value = "Retrieves the Entity Field Configuration", notes = "It retrieves all the Entity Field Configuration")
+       @ApiResponses({@ApiResponse(code = 200, message = "OK", response = EntityFieldConfigurationApiResourcesSwagger.GetFieldConfigurationEntityResponse.class, responseContainer = "List")})
+	public String getAddresses(@PathParam("entity") @ApiParam(value = "entity") final String entityname, @Context final UriInfo uriInfo) {
 		this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
 
 		final Collection<FieldConfigurationData> fldconfig = this.readPlatformServicefld
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/api/EntityFieldConfigurationApiResourcesSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/api/EntityFieldConfigurationApiResourcesSwagger.java
new file mode 100644
index 000000000..9fb071469
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/address/api/EntityFieldConfigurationApiResourcesSwagger.java
@@ -0,0 +1,52 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.portfolio.address.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * Created by Chirag Gupta on 12/01/17. 
+ */
+final class EntityFieldConfigurationApiResourcesSwagger {
+    private EntityFieldConfigurationApiResourcesSwagger() {
+    }
+
+    @ApiModel(value = "GetFieldConfigurationEntityResponse")
+    public static final class GetFieldConfigurationEntityResponse {
+        private GetFieldConfigurationEntityResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer fieldConfigurationId;
+        @ApiModelProperty(example = "ADDRESS")
+        public String entity;
+        @ApiModelProperty(example = "CLIENT")
+        public String subentity;
+        @ApiModelProperty(example = "addressType")
+        public String field;
+        @ApiModelProperty(example = "true")
+        public String is_enabled;
+        @ApiModelProperty(example = "false")
+        public String is_mandatory;
+        @ApiModelProperty(example = " ")
+        public String validation_regex;
+    }
+}
+
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/api/ChargesApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/api/ChargesApiResource.java
index eef68b3aa..3b115ad4f 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/api/ChargesApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/api/ChargesApiResource.java
@@ -18,23 +18,7 @@
  */
 package org.apache.fineract.portfolio.charge.api;
 
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.UriInfo;
-
+import io.swagger.annotations.*;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
 import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
@@ -49,9 +33,19 @@
 import org.springframework.context.annotation.Scope;
 import org.springframework.stereotype.Component;
 
+import javax.ws.rs.*;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.UriInfo;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
 @Path("/charges")
 @Component
 @Scope("singleton")
+@Api(value = "Charges", description = "Its typical for MFIs to add extra costs for their financial products. These are typically Fees or Penalties.\n" + "\n" + "A Charge on fineract platform is what we use to model both Fees and Penalties.\n" + "\n" + "At present we support defining charges for use with Client accounts and both loan and saving products.")
 public class ChargesApiResource {
 
     private final Set<String> CHARGES_DATA_PARAMETERS = new HashSet<>(Arrays.asList("id", "name", "amount", "currency", "penalty", "active",
@@ -82,6 +76,8 @@ public ChargesApiResource(final PlatformSecurityContext context, final ChargeRea
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
+    @ApiOperation(value = "Retrieve Charges", httpMethod = "GET", notes = "Returns the list of defined charges.\n" + "\n" + "Example Requests:\n" + "\n" + "charges")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = ChargesApiResourceSwagger.GetChargesResponse.class, responseContainer = "List")})
     public String retrieveAllCharges(@Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
@@ -96,7 +92,9 @@ public String retrieveAllCharges(@Context final UriInfo uriInfo) {
     @Path("{chargeId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveCharge(@PathParam("chargeId") final Long chargeId, @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Retrieve a Charge", httpMethod = "GET", notes = "Returns the details of a defined Charge.\n" + "\n" + "Example Requests:\n" + "\n" + "charges/1")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = ChargesApiResourceSwagger.GetChargesResponse.class)})
+    public String retrieveCharge(@PathParam("chargeId") @ApiParam(value = "chargeId") final Long chargeId, @Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
 
@@ -115,6 +113,8 @@ public String retrieveCharge(@PathParam("chargeId") final Long chargeId, @Contex
     @Path("template")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
+    @ApiOperation(value = "Retrieve Charge Template", httpMethod = "GET", notes = "This is a convenience resource. It can be useful when building maintenance user interface screens for client applications. The template data returned consists of any or all of:\n" + "\n" + "Field Defaults\n" + "Allowed Value Lists\n" + "Example Request:\n" + "\n" + "charges/template\n")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = ChargesApiResourceSwagger.GetChargesTemplateResponse.class)})
     public String retrieveNewChargeDetails(@Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
@@ -128,7 +128,10 @@ public String retrieveNewChargeDetails(@Context final UriInfo uriInfo) {
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String createCharge(final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Create/Define a Charge", httpMethod = "POST", notes = "Define a new charge that can later be associated with loans and savings through their respective product definitions or directly on each account instance.")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = ChargesApiResourceSwagger.PostChargesRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = ChargesApiResourceSwagger.PostChargesResponse.class)})
+    public String createCharge(@ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().createCharge().withJson(apiRequestBodyAsJson).build();
 
@@ -141,7 +144,10 @@ public String createCharge(final String apiRequestBodyAsJson) {
     @Path("{chargeId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String updateCharge(@PathParam("chargeId") final Long chargeId, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Update a Charge", httpMethod = "PUT", notes = "Updates the details of a Charge.")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = ChargesApiResourceSwagger.PutChargesChargeIdRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = ChargesApiResourceSwagger.PutChargesChargeIdResponse.class)})
+    public String updateCharge(@PathParam("chargeId") @ApiParam(value = "chargeId") final Long chargeId, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().updateCharge(chargeId).withJson(apiRequestBodyAsJson).build();
 
@@ -154,7 +160,9 @@ public String updateCharge(@PathParam("chargeId") final Long chargeId, final Str
     @Path("{chargeId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String deleteCharge(@PathParam("chargeId") final Long chargeId) {
+    @ApiOperation(value = "Delete a Charge", httpMethod = "DELETE", notes = "Deletes a Charge.")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = ChargesApiResourceSwagger.DeleteChargesChargeIdResponse.class)})
+    public String deleteCharge(@PathParam("chargeId") @ApiParam(value = "chargeId") final Long chargeId) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().deleteCharge(chargeId).build();
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/api/ChargesApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/api/ChargesApiResourceSwagger.java
new file mode 100644
index 000000000..39abd4fa2
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/charge/api/ChargesApiResourceSwagger.java
@@ -0,0 +1,230 @@
+/**
+ * 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.portfolio.charge.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Set;
+
+/**
+ * Created by Chirag Gupta on 12/01/17.
+ */
+final class ChargesApiResourceSwagger {
+
+    @ApiModel(value = "GetChargesResponse")
+    public static final class GetChargesResponse {
+        private GetChargesResponse() {
+        }
+
+        final class GetChargesCurrencyResponse {
+            @ApiModelProperty(example = "USD")
+            public String code;
+            @ApiModelProperty(example = "US Dollar")
+            public String name;
+            @ApiModelProperty(example = "2")
+            public Integer decimalPlaces;
+            @ApiModelProperty(example = "$")
+            public String displaySymbol;
+            @ApiModelProperty(example = "currency.USD")
+            public String nameCode;
+            @ApiModelProperty(example = "US Dollar ($)")
+            public String displayLabel;
+        }
+
+        final class GetChargesTimeTypeResponse {
+            private GetChargesTimeTypeResponse() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "chargeTimeType.disbursement")
+            public String code;
+            @ApiModelProperty(example = "Disbursement")
+            public String value;
+        }
+
+        final class GetChargesAppliesToResponse {
+            private GetChargesAppliesToResponse() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "chargeAppliesTo.loan")
+            public String code;
+            @ApiModelProperty(example = "Loan")
+            public String value;
+        }
+
+        final class GetChargesCalculationTypeResponse {
+            private GetChargesCalculationTypeResponse() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "chargeCalculationType.flat")
+            public String code;
+            @ApiModelProperty(example = "Flat")
+            public String value;
+        }
+
+        final class GetChargesPaymentModeResponse {
+            private GetChargesPaymentModeResponse() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "chargepaymentmode.accounttransfer")
+            public String code;
+            @ApiModelProperty(example = "Account Transfer")
+            public String value;
+        }
+
+        @ApiModelProperty(example = "1")
+        public Long id;
+        @ApiModelProperty(example = "Loan Service fee")
+        public String name;
+        @ApiModelProperty(example = "true")
+        public String active;
+        @ApiModelProperty(example = "false")
+        public String penalty;
+        public GetChargesCurrencyResponse currency;
+        @ApiModelProperty(example = "230.56")
+        public Float amount;
+        public GetChargesTimeTypeResponse chargeTimeType;
+        public GetChargesAppliesToResponse chargeAppliesTo;
+        public GetChargesCalculationTypeResponse chargeCalculationType;
+        public GetChargesPaymentModeResponse chargePaymentMode;
+    }
+
+    @ApiModel(value = "PostChargesRequest")
+    public static final class PostChargesRequest {
+        private PostChargesRequest() {
+        }
+
+        @ApiModelProperty(example = "Loan Service fee")
+        public String name;
+        @ApiModelProperty(example = "1")
+        public Integer chargeAppliesTo;
+        @ApiModelProperty(example = "USD")
+        public String currencyCode;
+        @ApiModelProperty(example = "en")
+        public String locale;
+        @ApiModelProperty(example = "230.56")
+        public Float amount;
+        @ApiModelProperty(example = "1")
+        public Integer chargeTimeType;
+        @ApiModelProperty(example = "1")
+        public Integer chargeCalculationType;
+        @ApiModelProperty(example = "1")
+        public Integer chargePaymentMode;
+        @ApiModelProperty(example = "true")
+        public String active;
+    }
+
+    @ApiModel(value = "PostChargesResponse")
+    public static final class PostChargesResponse {
+        private PostChargesResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer resourceId;
+    }
+
+    @ApiModel(value = "PutChargesChargeIdRequest")
+    public static final class PutChargesChargeIdRequest {
+        private PutChargesChargeIdRequest() {
+        }
+
+        @ApiModelProperty(example = "Loan service fee(changed)")
+        public String name;
+    }
+
+    @ApiModel(value = "PutChargesChargeIdResponse")
+    public static final class PutChargesChargeIdResponse {
+        private PutChargesChargeIdResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer resourceId;
+        public PutChargesChargeIdRequest changes;
+    }
+
+    @ApiModel(value = "DeleteChargesChargeIdResponse")
+    public static final class DeleteChargesChargeIdResponse {
+        private DeleteChargesChargeIdResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer resourceId;
+    }
+
+    @ApiModel(value = "GetChargesTemplateResponse")
+    public static final class GetChargesTemplateResponse {
+        private GetChargesTemplateResponse() {
+        }
+
+        final class GetChargesTemplateLoanChargeCalculationTypeOptions {
+            private GetChargesTemplateLoanChargeCalculationTypeOptions() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "chargeCalculationType.flat")
+            public String code;
+            @ApiModelProperty(example = "Flat")
+            public String value;
+        }
+
+        final class GetChargesTemplateLoanChargeTimeTypeOptions {
+            private GetChargesTemplateLoanChargeTimeTypeOptions() {
+            }
+
+            @ApiModelProperty(example = "2")
+            public Integer id;
+            @ApiModelProperty(example = "chargeTimeType.specifiedDueDate")
+            public String code;
+            @ApiModelProperty(example = "Specified due date")
+            public String value;
+        }
+        final class GetChargesTemplateFeeFrequencyOptions{
+            private GetChargesTemplateFeeFrequencyOptions(){}
+            @ApiModelProperty(example = "0")
+            public Integer id;
+            @ApiModelProperty(example = "loanTermFrequency.periodFrequencyType.days")
+            public String code;
+            @ApiModelProperty(example = "Days")
+            public String value;
+        }
+        @ApiModelProperty(example = "false")
+        public String active;
+        @ApiModelProperty(example = "false")
+        public String penalty;
+        public Set<GetChargesResponse.GetChargesCurrencyResponse> currencyOptions;
+        public Set<GetChargesResponse.GetChargesCalculationTypeResponse> chargeCalculationTypeOptions;
+        public Set<GetChargesResponse.GetChargesAppliesToResponse> chargeAppliesToOptions;
+        public Set<GetChargesResponse.GetChargesTimeTypeResponse> chargeTimeTypeOptions;
+        public Set<GetChargesResponse.GetChargesPaymentModeResponse> chargePaymentModeOptions;
+        public Set<GetChargesTemplateLoanChargeCalculationTypeOptions> loanChargeCalculationTypeOptions;
+        public Set<GetChargesTemplateLoanChargeTimeTypeOptions> loanChargeTimeTypeOptions;
+        public Set<GetChargesTemplateLoanChargeCalculationTypeOptions> savingsChargeCalculationTypeOptions;
+        public Set<GetChargesTemplateLoanChargeTimeTypeOptions> savingsChargeTimeTypeOptions;
+        public Set<GetChargesTemplateFeeFrequencyOptions> feeFrequencyOptions;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientAddressApiResources.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientAddressApiResources.java
index 67c72b4a0..b0f675363 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientAddressApiResources.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientAddressApiResources.java
@@ -18,23 +18,7 @@
  */
 package org.apache.fineract.portfolio.client.api;
 
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.UriInfo;
-
+import io.swagger.annotations.*;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
 import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
@@ -49,9 +33,19 @@
 import org.springframework.context.annotation.Scope;
 import org.springframework.stereotype.Component;
 
+import javax.ws.rs.*;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.UriInfo;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
 @Path("/client")
 @Component
 @Scope("singleton")
+@Api(value = "Clients Address", description = "Address module is an optional module and can be configured into the system by using GlobalConfiguration setting: enable-address. In order to activate Address module, we need to enable the configuration, enable-address by setting its value to true.")
 public class ClientAddressApiResources {
 	private final Set<String> RESPONSE_DATA_PARAMETERS = new HashSet<>(Arrays.asList("addressId", "street",
 			"addressLine1", "addressLine2", "addressLine3", "townVillage", "city", "countyDistrict", "stateProvinceId",
@@ -93,12 +87,32 @@ public String getAddressesTemplate(@Context final UriInfo uriInfo) {
 
 	}
 
+	@POST
+	@Path("/{clientid}/addresses")
+	@Consumes({ MediaType.APPLICATION_JSON })
+	@Produces({ MediaType.APPLICATION_JSON })
+	@ApiOperation(value = "Create an address for a Client", notes = "Mandatory Fields : \n" + "type and clientId")
+	@ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = ClientAddressApiResourcesSwagger.PostClientClientIdAddressesRequest.class)})
+	@ApiResponses({ @ApiResponse(code = 200, message = "OK", response = ClientAddressApiResourcesSwagger.PostClientClientIdAddressesResponse.class)})
+	public String AddClientAddress(@QueryParam("type") @ApiParam(value = "type") final long addressTypeId,
+			@PathParam("clientid") @ApiParam(value = "clientId") final long clientid, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
+
+		final CommandWrapper commandRequest = new CommandWrapperBuilder().addClientAddress(clientid, addressTypeId)
+				.withJson(apiRequestBodyAsJson).build();
+
+		final CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
+
+		return this.toApiJsonSerializer.serialize(result);
+	}
+
 	@GET
 	@Path("/{clientid}/addresses")
 	@Consumes({ MediaType.APPLICATION_JSON })
 	@Produces({ MediaType.APPLICATION_JSON })
-	public String getAddresses(@QueryParam("status") final String status, @QueryParam("type") final long addressTypeId,
-			@PathParam("clientid") final long clientid, @Context final UriInfo uriInfo) {
+	@ApiOperation(value = "List all addresses for a Client", notes = "Example Requests:\n" + "\n" +"client/1/addresses\n" + "\n" +	"\n" +"clients/1/addresses?status=false,true&&type=1,2,3" )
+	@ApiResponses({@ApiResponse(code = 200, message = "OK", responseContainer = "List", response = ClientAddressApiResourcesSwagger.GetClientClientIdAddressesResponse.class)})
+	public String getAddresses(@QueryParam("status") @ApiParam(value = "status") final String status, @QueryParam("type") @ApiParam(value = "type") final long addressTypeId,
+							   @PathParam("clientid") @ApiParam(value = "clientId") final long clientid, @Context final UriInfo uriInfo) {
 		Collection<AddressData> address;
 
 		this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
@@ -119,26 +133,14 @@ public String getAddresses(@QueryParam("status") final String status, @QueryPara
 
 	}
 
-	@POST
-	@Path("/{clientid}/addresses")
-	@Consumes({ MediaType.APPLICATION_JSON })
-	@Produces({ MediaType.APPLICATION_JSON })
-	public String AddClientAddress(@QueryParam("type") final long addressTypeId,
-			@PathParam("clientid") final long clientid, final String apiRequestBodyAsJson) {
-
-		final CommandWrapper commandRequest = new CommandWrapperBuilder().addClientAddress(clientid, addressTypeId)
-				.withJson(apiRequestBodyAsJson).build();
-
-		final CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
-
-		return this.toApiJsonSerializer.serialize(result);
-	}
-
 	@PUT
 	@Path("/{clientid}/addresses")
 	@Consumes({ MediaType.APPLICATION_JSON })
 	@Produces({ MediaType.APPLICATION_JSON })
-	public String UpdateClientAddress(@PathParam("clientid") final long clientid, final String apiRequestBodyAsJson) {
+	@ApiOperation(value = "Update an address for a Client", notes = "All the address fields can be updated by using update client address API\n" + "\n" + "Mandatory Fields\n" + "type and addressId")
+	@ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = ClientAddressApiResourcesSwagger.PutClientClientIdAddressesRequest.class)})
+	@ApiResponses(value = { @ApiResponse(code = 200, message = "OK", response = ClientAddressApiResourcesSwagger.PutClientClientIdAddressesResponse.class)})
+	public String UpdateClientAddress(@PathParam("clientid") @ApiParam(value = "clientId") final long clientid, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
 		final CommandWrapper commandRequest = new CommandWrapperBuilder().updateClientAddress(clientid)
 				.withJson(apiRequestBodyAsJson).build();
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientAddressApiResourcesSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientAddressApiResourcesSwagger.java
new file mode 100644
index 000000000..8db0c8250
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientAddressApiResourcesSwagger.java
@@ -0,0 +1,127 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.portfolio.client.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * Created by Chirag Gupta on 01/12/18.
+ */
+final class ClientAddressApiResourcesSwagger {
+    private ClientAddressApiResourcesSwagger() {
+    }
+
+    @ApiModel(value = "PostClientClientIdAddressesRequest")
+    public final static class PostClientClientIdAddressesRequest {
+        private PostClientClientIdAddressesRequest() {
+        }
+
+        @ApiModelProperty(example = "Ipca")
+        public String street;
+        @ApiModelProperty(example = "Kandivali")
+        public String addressLine1;
+        @ApiModelProperty(example = "plot47")
+        public String addressLine2;
+        @ApiModelProperty(example = "charkop")
+        public String addressLine3;
+        @ApiModelProperty(example = "Mumbai")
+        public String city;
+        @ApiModelProperty(example = "800")
+        public Integer stateProvinceId;
+        @ApiModelProperty(example = "802")
+        public Integer countryId;
+        @ApiModelProperty(example = "400064")
+        public Long postalCode;
+    }
+
+    @ApiModel(value = "PostClientClientIdAddressesResponse")
+    public final static class PostClientClientIdAddressesResponse {
+        private PostClientClientIdAddressesResponse() {
+        }
+
+        @ApiModelProperty(example = "15")
+        public Integer resourceId;
+    }
+
+    @ApiModel(value = "GetClientClientIdAddressesResponse")
+    public final static class GetClientClientIdAddressesResponse {
+        private GetClientClientIdAddressesResponse() {
+        }
+
+        @ApiModelProperty(example = "111755")
+        public Long client_id;
+        @ApiModelProperty(example = "PERMANENT ADDRESS")
+        public String addressType;
+        @ApiModelProperty(example = "14")
+        public Integer addressId;
+        @ApiModelProperty(example = "804")
+        public Integer addressTypeId;
+        @ApiModelProperty(example = "false")
+        public Boolean isActive;
+        @ApiModelProperty(example = "anki's home")
+        public String street;
+        @ApiModelProperty(example = "test123")
+        public String addressLine1;
+        @ApiModelProperty(example = "iuyt")
+        public String addressLine2;
+        @ApiModelProperty(example = " ")
+        public String addressLine3;
+        @ApiModelProperty(example = " ")
+        public String townVillage;
+        @ApiModelProperty(example = "mumbai")
+        public String city;
+        @ApiModelProperty(example = " ")
+        public String countyDistrict;
+        @ApiModelProperty(example = "801")
+        public Integer stateProvinceId;
+        @ApiModelProperty(example = "UNITED STATES")
+        public String countryName;
+        @ApiModelProperty(example = "GUJRAT")
+        public String stateName;
+        @ApiModelProperty(example = "807")
+        public Integer countryId;
+        @ApiModelProperty(example = "400095")
+        public Long postalCode;
+        @ApiModelProperty(example = " ")
+        public String createdBy;
+        @ApiModelProperty(example = " ")
+        public String updatedBy;
+    }
+
+    @ApiModel(value = "PutClientClientIdAddressesRequest")
+    public final static class PutClientClientIdAddressesRequest {
+        private PutClientClientIdAddressesRequest() {
+        }
+
+        @ApiModelProperty(example = "67")
+        public Integer addressId;
+        @ApiModelProperty(example = "goldensource")
+        public String street;
+    }
+
+    @ApiModel(value = "PutClientClientIdAddressesResponse")
+    public final static class PutClientClientIdAddressesResponse {
+        private PutClientClientIdAddressesResponse() {
+        }
+
+        @ApiModelProperty(example = "67")
+        public Integer resourceId;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientChargesApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientChargesApiResource.java
index 4719c4286..4ccf4f2cd 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientChargesApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientChargesApiResource.java
@@ -18,23 +18,7 @@
  */
 package org.apache.fineract.portfolio.client.api;
 
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Set;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.DefaultValue;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.UriInfo;
-
+import io.swagger.annotations.*;
 import org.apache.commons.lang.StringUtils;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
@@ -58,8 +42,17 @@
 import org.springframework.stereotype.Component;
 import org.springframework.util.CollectionUtils;
 
+import javax.ws.rs.*;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.UriInfo;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Set;
+
 @Path("/clients/{clientId}/charges")
 @Component
+@Api(value = "Client Charges", description = "It is typical for MFI's to directly associate charges with an implicit Client account. These can be either fees or penalties\n" + "\n" + "Client Charges are client specific instances of Charges. Refer Charges for documentation of the various properties of a charge, Only additional properties ( specific to the context of a Charge being associated with a Client account) are described here")
 public class ClientChargesApiResource {
 
     private final PlatformSecurityContext context;
@@ -89,10 +82,12 @@ public ClientChargesApiResource(final PlatformSecurityContext context, final Cha
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveAllClientCharges(@PathParam("clientId") final Long clientId,
-            @DefaultValue(ClientApiConstants.CLIENT_CHARGE_QUERY_PARAM_STATUS_VALUE_ALL) @QueryParam(ClientApiConstants.CLIENT_CHARGE_QUERY_PARAM_STATUS) final String chargeStatus,
-            @QueryParam("pendingPayment") final Boolean pendingPayment, @Context final UriInfo uriInfo,
-            @QueryParam("limit") final Integer limit, @QueryParam("offset") final Integer offset) {
+    @ApiOperation(value = "List Client Charges", notes = "The list capability of client charges supports pagination." + "Example Requests:\n" + "clients/1/charges\n" + "\nclients/1/charges?offset=0&limit=5" )
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = ClientChargesApiResourceSwagger.GetClientsClientIdChargesResponse.class) })
+    public String retrieveAllClientCharges(@PathParam("clientId") @ApiParam(value = "clientId") final Long clientId,
+            @DefaultValue(ClientApiConstants.CLIENT_CHARGE_QUERY_PARAM_STATUS_VALUE_ALL) @QueryParam(ClientApiConstants.CLIENT_CHARGE_QUERY_PARAM_STATUS) @ApiParam(value = "chargeStatus") final String chargeStatus,
+            @QueryParam("pendingPayment") @ApiParam(value = "pendingPayment") final Boolean pendingPayment, @Context final UriInfo uriInfo,
+            @QueryParam("limit") @ApiParam(value = "limit") final Integer limit, @QueryParam("offset") @ApiParam(value = "offset") final Integer offset) {
         this.context.authenticatedUser().validateHasReadPermission(ClientApiConstants.CLIENT_CHARGES_RESOURCE_NAME);
         final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
         if (!(is(chargeStatus, ClientApiConstants.CLIENT_CHARGE_QUERY_PARAM_STATUS_VALUE_ALL)
@@ -134,7 +129,9 @@ public String retrieveTemplate(@Context final UriInfo uriInfo) {
     @Path("{chargeId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveClientCharge(@PathParam("clientId") final Long clientId, @PathParam("chargeId") final Long chargeId,
+    @ApiOperation(value = "Retrieve a Client Charge", notes = "Example Requests:\n" + "clients/1/charges/1\n" + "\n" + "\n" + "clients/1/charges/1?fields=name,id" )
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = ClientChargesApiResourceSwagger.GetClientsClientIdChargesResponse.GetClientsChargesPageItems.class) })
+    public String retrieveClientCharge(@PathParam("clientId") @ApiParam(value = "clientId") final Long clientId, @PathParam("chargeId") @ApiParam(value = "chargeId") final Long chargeId,
             @Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(ClientApiConstants.CLIENT_CHARGES_RESOURCE_NAME);
@@ -161,7 +158,10 @@ public String retrieveClientCharge(@PathParam("clientId") final Long clientId, @
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String applyClientCharge(@PathParam("clientId") final Long clientId, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Add Client Charge", notes = " This API associates a Client charge with an implicit Client account\n" + "Mandatory Fields : \n" + "chargeId and dueDate  \n" + "Optional Fields : \n" + "amount" )
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = ClientChargesApiResourceSwagger.PostClientsClientIdChargesRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "", response = ClientChargesApiResourceSwagger.PostClientsClientIdChargesResponse.class) })
+    public String applyClientCharge(@PathParam("clientId") @ApiParam(value = "clientId") final Long clientId, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().createClientCharge(clientId).withJson(apiRequestBodyAsJson)
                 .build();
@@ -175,8 +175,11 @@ public String applyClientCharge(@PathParam("clientId") final Long clientId, fina
     @Path("{chargeId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String payOrWaiveClientCharge(@PathParam("clientId") final Long clientId, @PathParam("chargeId") final Long chargeId,
-            @QueryParam("command") final String commandParam, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Pay a Client Charge | Waive a Client Charge", notes = "Pay a Client Charge:\n\n" + "Mandatory Fields:" + "transactionDate and amount " + "" + "\"Pay either a part of or the entire due amount for a charge.(command=paycharge)\n" + "\n" + "Waive a Client Charge:\n" + "\n" + "\n" + "This API provides the facility of waiving off the remaining amount on a client charge (command=waive)\n\n" + "Showing request/response for 'Pay a Client Charge'" )
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = ClientChargesApiResourceSwagger.PostClientsClientIdChargesChargeIdRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = ClientChargesApiResourceSwagger.PostClientsClientIdChargesChargeIdResponse.class)})
+    public String payOrWaiveClientCharge(@PathParam("clientId") @ApiParam(value = "clientId") final Long clientId, @PathParam("chargeId") @ApiParam(value = "chargeId") final Long chargeId,
+            @QueryParam("command") @ApiParam(value = "command") final String commandParam, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         String json = "";
         if (is(commandParam, ClientApiConstants.CLIENT_CHARGE_COMMAND_WAIVE_CHARGE)) {
@@ -211,7 +214,9 @@ public String payOrWaiveClientCharge(@PathParam("clientId") final Long clientId,
     @Path("{chargeId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String deleteClientCharge(@PathParam("clientId") final Long clientId, @PathParam("chargeId") final Long chargeId) {
+    @ApiOperation(value = "Delete a Client Charge", notes = "Deletes a Client Charge on which no transactions have taken place (either payments or waivers). ")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = ClientChargesApiResourceSwagger.DeleteClientsClientIdChargesChargeIdResponse.class)})
+    public String deleteClientCharge(@PathParam("clientId") @ApiParam(value = "clientId") final Long clientId, @PathParam("chargeId") @ApiParam(value = "chargeId") final Long chargeId) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().deleteClientCharge(clientId, chargeId).build();
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientChargesApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientChargesApiResourceSwagger.java
new file mode 100644
index 000000000..7239dac31
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientChargesApiResourceSwagger.java
@@ -0,0 +1,196 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.portfolio.client.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.Set;
+
+/**
+ * Created by Chirag Gupta on 01/12/18.
+ */
+final class ClientChargesApiResourceSwagger {
+    private ClientChargesApiResourceSwagger() {
+    }
+
+    @ApiModel(value = "GetClientsClientIdChargesResponse")
+    public final static class GetClientsClientIdChargesResponse {
+        private GetClientsClientIdChargesResponse() {
+        }
+
+        final class GetClientsChargesPageItems {
+            private GetClientsChargesPageItems() {
+            }
+
+            final class GetClientChargeTimeType {
+                private GetClientChargeTimeType() {
+                }
+
+                @ApiModelProperty(example = "2")
+                public Integer id;
+                @ApiModelProperty(example = "chargeTimeType.specifiedDueDate")
+                public String code;
+                @ApiModelProperty(example = "Specified due date")
+                public String value;
+            }
+
+            final class GetClientChargeCalculationType {
+                private GetClientChargeCalculationType() {
+                }
+
+                @ApiModelProperty(example = "1")
+                public Integer id;
+                @ApiModelProperty(example = "chargeCalculationType.flat")
+                public String code;
+                @ApiModelProperty(example = "Flat")
+                public String value;
+            }
+
+            final class GetClientChargeCurrency {
+                private GetClientChargeCurrency() {
+                }
+
+                @ApiModelProperty(example = "USD")
+                public String code;
+                @ApiModelProperty(example = "US Dollar")
+                public String name;
+                @ApiModelProperty(example = "2")
+                public Integer decimalPlaces;
+                @ApiModelProperty(example = "$")
+                public String displaySymbol;
+                @ApiModelProperty(example = "currency.USD")
+                public String nameCode;
+                @ApiModelProperty(example = "US Dollar ($)")
+                public String displayLabel;
+            }
+
+            @ApiModelProperty(example = "3")
+            public Integer id;
+            @ApiModelProperty(example = "1")
+            public Integer clientId;
+            @ApiModelProperty(example = "5")
+            public Integer chargeId;
+            @ApiModelProperty(example = "Client Fee 1")
+            public String name;
+            public GetClientChargeTimeType chargeTimeType;
+            @ApiModelProperty(example = "[2015, 8, 17]")
+            public LocalDate dueDate;
+            public GetClientChargeCalculationType chargeCalculationType;
+            public GetClientChargeCurrency currency;
+            @ApiModelProperty(example = "100.000000")
+            public BigDecimal amount;
+            @ApiModelProperty(example = "0")
+            public BigDecimal amountPaid;
+            @ApiModelProperty(example = "100.000000")
+            public BigDecimal amountWaived;
+            @ApiModelProperty(example = "0")
+            public BigDecimal amountWrittenOff;
+            @ApiModelProperty(example = "0.000000")
+            public BigDecimal amountOutstanding;
+            @ApiModelProperty(example = "true")
+            public Boolean penalty;
+            @ApiModelProperty(example = "true")
+            public Boolean isActive;
+            @ApiModelProperty(example = "false")
+            public Boolean isPaid;
+            @ApiModelProperty(example = "true")
+            public Boolean isWaived;
+        }
+
+        @ApiModelProperty(example = "4")
+        public Integer totalFilteredRecords;
+        public Set<GetClientsChargesPageItems> pageItems;
+    }
+
+    @ApiModel(value = "PostClientsClientIdChargesRequest")
+    public final static class PostClientsClientIdChargesRequest {
+        private PostClientsClientIdChargesRequest() {
+        }
+
+        @ApiModelProperty(example = "100")
+        public Integer amount;
+        @ApiModelProperty(example = "226")
+        public Integer chargeId;
+        @ApiModelProperty(example = "dd MMMM yyyy")
+        public String dateFormat;
+        @ApiModelProperty(example = "01 September 2015")
+        public String dueDate;
+        @ApiModelProperty(example = "en")
+        public String locale;
+    }
+
+    @ApiModel(value = "PostClientsClientIdChargesResponse")
+    public final static class PostClientsClientIdChargesResponse {
+        private PostClientsClientIdChargesResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer officeId;
+        @ApiModelProperty(example = "189")
+        public Integer chargeId;
+        @ApiModelProperty(example = "164")
+        public Integer resourceId;
+    }
+
+    @ApiModel(value = "PostClientsClientIdChargesChargeIdRequest")
+    public final static class PostClientsClientIdChargesChargeIdRequest {
+        private PostClientsClientIdChargesChargeIdRequest() {
+        }
+
+        @ApiModelProperty(example = "200")
+        public Integer amount;
+        @ApiModelProperty(example = "en")
+        public String locale;
+        @ApiModelProperty(example = "dd MMMM yyyy")
+        public String dateFormat;
+        @ApiModelProperty(example = "01 September 2015")
+        public String transactionDate;
+    }
+
+    @ApiModel(value = "PostClientsClientIdChargesChargeIdResponse")
+    public final static class PostClientsClientIdChargesChargeIdResponse {
+        private PostClientsClientIdChargesChargeIdResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer officeId;
+        @ApiModelProperty(example = "189")
+        public Integer clientId;
+        @ApiModelProperty(example = "157")
+        public Integer resourceId;
+        @ApiModelProperty(example = "221")
+        public Integer transactionId;
+    }
+
+    @ApiModel(value = "DeleteClientsClientIdChargesChargeIdResponse")
+    public final static class DeleteClientsClientIdChargesChargeIdResponse {
+        private DeleteClientsClientIdChargesChargeIdResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer officeId;
+        @ApiModelProperty(example = "189")
+        public Integer clientId;
+        @ApiModelProperty(example = "164")
+        public Integer resourceId;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientIdentifiersApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientIdentifiersApiResource.java
index eaa885027..cb28f5789 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientIdentifiersApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientIdentifiersApiResource.java
@@ -18,23 +18,7 @@
  */
 package org.apache.fineract.portfolio.client.api;
 
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.UriInfo;
-
+import io.swagger.annotations.*;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
 import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
@@ -54,9 +38,19 @@
 import org.springframework.context.annotation.Scope;
 import org.springframework.stereotype.Component;
 
+import javax.ws.rs.*;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.UriInfo;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
 @Path("/clients/{clientId}/identifiers")
 @Component
 @Scope("singleton")
+@Api(value = "Client Identifier", description = "Client Identifiers refer to documents that are used to uniquely identify a customer\n" + "Ex: Drivers License, Passport, Ration card etc ")
 public class ClientIdentifiersApiResource {
 
     private static final Set<String> CLIENT_IDENTIFIER_DATA_PARAMETERS = new HashSet<>(Arrays.asList("id", "clientId",
@@ -91,7 +85,9 @@ public ClientIdentifiersApiResource(final PlatformSecurityContext context, final
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveAllClientIdentifiers(@Context final UriInfo uriInfo, @PathParam("clientId") final Long clientId) {
+    @ApiOperation(value = "List all Identifiers for a Client", notes = "Example Requests:\n" + "clients/1/identifiers\n" + "\n" + "\n" + "clients/1/identifiers?fields=documentKey,documentType,description")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", responseContainer = "List", response = ClientIdentifiersApiResourceSwagger.GetClientsClientIdIdentifiersResponse.class)})
+    public String retrieveAllClientIdentifiers(@Context final UriInfo uriInfo, @PathParam("clientId") @ApiParam(value = "clientId") final Long clientId) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
 
@@ -106,6 +102,8 @@ public String retrieveAllClientIdentifiers(@Context final UriInfo uriInfo, @Path
     @Path("template")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
+    @ApiOperation(value = "Retrieve Client Identifier Details Template", notes = "This is a convenience resource useful for building maintenance user interface screens for client applications. The template data returned consists of any or all of:\n" + "\n" + " Field Defaults\n" + " Allowed Value Lists\n" + "\n\nExample Request:\n" + "clients/1/identifiers/template" )
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = ClientIdentifiersApiResourceSwagger.GetClientsClientIdIdentifiersTemplateResponse.class)})
     public String newClientIdentifierDetails(@Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
@@ -120,7 +118,10 @@ public String newClientIdentifierDetails(@Context final UriInfo uriInfo) {
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String createClientIdentifier(@PathParam("clientId") final Long clientId, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Create an Identifier for a Client", notes = "Mandatory Fields\n" + "documentKey, documentTypeId " )
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = ClientIdentifiersApiResourceSwagger.PostClientsClientIdIdentifiersRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = ClientIdentifiersApiResourceSwagger.PostClientsClientIdIdentifiersResponse.class)})
+    public String createClientIdentifier(@PathParam("clientId") @ApiParam(value = "clientId") final Long clientId, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         try {
             final CommandWrapper commandRequest = new CommandWrapperBuilder().createClientIdentifier(clientId)
@@ -146,8 +147,10 @@ public String createClientIdentifier(@PathParam("clientId") final Long clientId,
     @Path("{identifierId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveClientIdentifiers(@PathParam("clientId") final Long clientId,
-            @PathParam("identifierId") final Long clientIdentifierId, @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Retrieve a Client Identifier", notes = "Example Requests:\n" + "clients/1/identifier/2\n" + "\n" + "\n" + "clients/1/identifier/2?template=true\n" + "\n" + "clients/1/identifiers/2?fields=documentKey,documentType,description" )
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = ClientIdentifiersApiResourceSwagger.GetClientsClientIdIdentifiersResponse.class)})
+    public String retrieveClientIdentifiers(@PathParam("clientId") @ApiParam(value = "clientId") final Long clientId,
+            @PathParam("identifierId") @ApiParam(value = "identifierId") final Long clientIdentifierId, @Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
 
@@ -167,8 +170,11 @@ public String retrieveClientIdentifiers(@PathParam("clientId") final Long client
     @Path("{identifierId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String updateClientIdentifer(@PathParam("clientId") final Long clientId,
-            @PathParam("identifierId") final Long clientIdentifierId, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Update a Client Identifier", notes = "Updates a Client Identifier")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = ClientIdentifiersApiResourceSwagger.PutClientsClientIdIdentifiersIdentifierIdRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = ClientIdentifiersApiResourceSwagger.PutClientsClientIdIdentifiersIdentifierIdResponse.class)})
+    public String updateClientIdentifer(@PathParam("clientId") @ApiParam(value = "clientId") final Long clientId,
+            @PathParam("identifierId") @ApiParam(value = "identifierId") final Long clientIdentifierId, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         try {
             final CommandWrapper commandRequest = new CommandWrapperBuilder().updateClientIdentifier(clientId, clientIdentifierId)
@@ -193,8 +199,10 @@ public String updateClientIdentifer(@PathParam("clientId") final Long clientId,
     @Path("{identifierId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String deleteClientIdentifier(@PathParam("clientId") final Long clientId,
-            @PathParam("identifierId") final Long clientIdentifierId) {
+    @ApiOperation(value = "Delete a Client Identifier", notes = "Deletes a Client Identifier")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = ClientIdentifiersApiResourceSwagger.DeleteClientsClientIdIdentifiersIdentifierIdResponse.class)})
+    public String deleteClientIdentifier(@PathParam("clientId") @ApiParam(value = "clientId") final Long clientId,
+            @PathParam("identifierId") @ApiParam(value = "identifierId") final Long clientIdentifierId) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().deleteClientIdentifier(clientId, clientIdentifierId).build();
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientIdentifiersApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientIdentifiersApiResourceSwagger.java
new file mode 100644
index 000000000..c55970917
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientIdentifiersApiResourceSwagger.java
@@ -0,0 +1,144 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.portfolio.client.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Set;
+
+/**
+ * Created by Chirag Gupta on 01/13/18.
+ */
+final class ClientIdentifiersApiResourceSwagger {
+    private ClientIdentifiersApiResourceSwagger() {
+    }
+
+    @ApiModel(value = "GetClientsClientIdIdentifiersResponse")
+    public final static class GetClientsClientIdIdentifiersResponse {
+        private GetClientsClientIdIdentifiersResponse() {
+        }
+
+        final class GetClientsDocumentType {
+            private GetClientsDocumentType() {
+            }
+
+            @ApiModelProperty(example = "3")
+            public Integer id;
+            @ApiModelProperty(example = "Drivers License")
+            public String name;
+        }
+
+        @ApiModelProperty(example = "2")
+        public Integer id;
+        @ApiModelProperty(example = "1")
+        public Integer clientId;
+        public GetClientsDocumentType documentType;
+        @ApiModelProperty(example = "12345")
+        public String documentKey;
+        @ApiModelProperty(example = "Issued in the year 2--7")
+        public String description;
+    }
+
+    @ApiModel(value = "GetClientsClientIdIdentifiersTemplateResponse")
+    public final static class GetClientsClientIdIdentifiersTemplateResponse {
+        private GetClientsClientIdIdentifiersTemplateResponse() {
+        }
+
+        final class GetClientsAllowedDocumentTypes {
+            private GetClientsAllowedDocumentTypes() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "Passport")
+            public String name;
+            @ApiModelProperty(example = "0")
+            public Integer position;
+        }
+
+        public Set<GetClientsAllowedDocumentTypes> allowedDocumentTypes;
+    }
+
+    @ApiModel(value = "PostClientsClientIdIdentifiersRequest")
+    public final static class PostClientsClientIdIdentifiersRequest {
+        private PostClientsClientIdIdentifiersRequest() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer documentTypeId;
+        @ApiModelProperty(example = "KA-54677")
+        public String documentKey;
+        @ApiModelProperty(example = "Document has been verified")
+        public String description;
+    }
+
+    @ApiModel(value = "PutClientsClientIdIdentifiersIdentifierIdRequest")
+    public final static class PutClientsClientIdIdentifiersIdentifierIdRequest {
+        private PutClientsClientIdIdentifiersIdentifierIdRequest() {
+        }
+
+        @ApiModelProperty(example = "4")
+        public Integer documentTypeId;
+        @ApiModelProperty(example = "KA-94667")
+        public String documentKey;
+        @ApiModelProperty(example = "Document has been updated")
+        public String description;
+    }
+
+    @ApiModel(value = "PutClientsClientIdIdentifiersIdentifierIdResponse")
+    public final static class PutClientsClientIdIdentifiersIdentifierIdResponse {
+        private PutClientsClientIdIdentifiersIdentifierIdResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer officeId;
+        @ApiModelProperty(example = "1")
+        public Integer clientId;
+        @ApiModelProperty(example = "3")
+        public Integer resourceId;
+        public PutClientsClientIdIdentifiersIdentifierIdRequest changes;
+    }
+
+    @ApiModel(value = "PostClientsClientIdIdentifiersResponse")
+    public final static class PostClientsClientIdIdentifiersResponse {
+        private PostClientsClientIdIdentifiersResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer officeId;
+        @ApiModelProperty(example = "1")
+        public Integer clientId;
+        @ApiModelProperty(example = "3")
+        public Integer resourceId;
+    }
+
+    @ApiModel(value = "DeleteClientsClientIdIdentifiersIdentifierIdResponse")
+    public final static class DeleteClientsClientIdIdentifiersIdentifierIdResponse {
+        private DeleteClientsClientIdIdentifiersIdentifierIdResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer officeId;
+        @ApiModelProperty(example = "1")
+        public Integer clientId;
+        @ApiModelProperty(example = "3")
+        public Integer resourceId;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientTransactionsApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientTransactionsApiResource.java
index a485957fd..196cb5afa 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientTransactionsApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientTransactionsApiResource.java
@@ -18,17 +18,7 @@
  */
 package org.apache.fineract.portfolio.client.api;
 
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.UriInfo;
-
+import io.swagger.annotations.*;
 import org.apache.commons.lang.StringUtils;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
@@ -46,8 +36,14 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import javax.ws.rs.*;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.UriInfo;
+
 @Path("/clients/{clientId}/transactions")
 @Component
+@Api(value = "Client Transaction", description = "Client Transactions refer to transactions made directly againt a Client's internal account. Currently, these transactions are only created as a result of charge payments/waivers. You are allowed to undo a transaction, however you cannot explicitly create one. ")
 public class ClientTransactionsApiResource {
 
     private final PlatformSecurityContext context;
@@ -72,8 +68,10 @@ public ClientTransactionsApiResource(final PlatformSecurityContext context,
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveAllClientTransactions(@PathParam("clientId") final Long clientId, @Context final UriInfo uriInfo,
-            @QueryParam("offset") final Integer offset, @QueryParam("limit") final Integer limit) {
+    @ApiOperation(value = "List Client Transactions", notes = "The list capability of client transaction can support pagination." + "\n\n" + "Example Requests:\n\n" + "clients/189/transactions\n\n" + "clients/189/transactions?offset=10&limit=50" )
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = ClientTransactionsApiResourceSwagger.GetClientsClientIdTransactionsResponse.class)})
+    public String retrieveAllClientTransactions(@PathParam("clientId") @ApiParam(value = "clientId") final Long clientId, @Context final UriInfo uriInfo,
+            @QueryParam("offset") @ApiParam(value = "offset") final Integer offset, @QueryParam("limit") @ApiParam(value = "limit") final Integer limit) {
         this.context.authenticatedUser().validateHasReadPermission(ClientApiConstants.CLIENT_CHARGES_RESOURCE_NAME);
 
         SearchParameters searchParameters = SearchParameters.forPagination(offset, limit);
@@ -89,8 +87,10 @@ public String retrieveAllClientTransactions(@PathParam("clientId") final Long cl
     @Path("{transactionId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveClientTransaction(@PathParam("clientId") final Long clientId,
-            @PathParam("transactionId") final Long transactionId, @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Retrieve a Client Transaction", notes = "Example Requests:\n" + "clients/1/transactions/1\n" + "\n" + "\n" + "clients/1/transactions/1?fields=id,officeName" )
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = ClientTransactionsApiResourceSwagger.GetClientsClientIdTransactionsTransactionIdResponse.class)})
+    public String retrieveClientTransaction(@PathParam("clientId") @ApiParam(value = "clientId") final Long clientId,
+            @PathParam("transactionId") @ApiParam(value = "transactionId") final Long transactionId, @Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(ClientApiConstants.CLIENT_CHARGES_RESOURCE_NAME);
 
@@ -106,8 +106,10 @@ public String retrieveClientTransaction(@PathParam("clientId") final Long client
     @Path("{transactionId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String undoClientTransaction(@PathParam("clientId") final Long clientId, @PathParam("transactionId") final Long transactionId,
-            @QueryParam("command") final String commandParam, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Undo a Client Transaction", notes = "Undoes a Client Transaction")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = ClientTransactionsApiResourceSwagger.PostClientsClientIdTransactionsTransactionIdResponse.class)})
+    public String undoClientTransaction(@PathParam("clientId") @ApiParam(value = "clientId") final Long clientId, @PathParam("transactionId") @ApiParam(value = "transactionId") final Long transactionId,
+            @QueryParam("command") @ApiParam(value = "command") final String commandParam, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         String json = "";
         if (is(commandParam, ClientApiConstants.CLIENT_TRANSACTION_COMMAND_UNDO)) {
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientTransactionsApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientTransactionsApiResourceSwagger.java
new file mode 100644
index 000000000..c8ef2ff48
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientTransactionsApiResourceSwagger.java
@@ -0,0 +1,133 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.portfolio.client.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.math.BigDecimal;
+import java.time.LocalDate;
+import java.util.Set;
+
+/**
+ * Created by Chirag Gupta on 01/13/18.
+ */
+final class ClientTransactionsApiResourceSwagger {
+    private ClientTransactionsApiResourceSwagger() {
+    }
+
+    @ApiModel(value = "GetClientsClientIdTransactionsResponse")
+    public final static class GetClientsClientIdTransactionsResponse {
+        private GetClientsClientIdTransactionsResponse() {
+        }
+
+        final class GetClientsPageItems {
+            private GetClientsPageItems() {
+            }
+
+            final class GetClientsClientIdTransactionsType {
+                private GetClientsClientIdTransactionsType() {
+                }
+
+                @ApiModelProperty(example = "1")
+                public Integer id;
+                @ApiModelProperty(example = "clientTransactionType.payCharge")
+                public String code;
+                @ApiModelProperty(example = "PAY_CHARGE")
+                public String value;
+            }
+
+            final class GetClientTransactionsCurrency {
+                private GetClientTransactionsCurrency() {
+                }
+
+                @ApiModelProperty(example = "USD")
+                public String code;
+                @ApiModelProperty(example = "US Dollar")
+                public String name;
+                @ApiModelProperty(example = "2")
+                public Integer decimalPlaces;
+                @ApiModelProperty(example = "$")
+                public String displaySymbol;
+                @ApiModelProperty(example = "currency.USD")
+                public String nameCode;
+                @ApiModelProperty(example = "US Dollar ($)")
+                public String displayLabel;
+            }
+
+            @ApiModelProperty(example = "226")
+            public Integer id;
+            @ApiModelProperty(example = "1")
+            public Integer officeId;
+            @ApiModelProperty(example = "Head Office")
+            public String officeName;
+            public GetClientsClientIdTransactionsType type;
+            @ApiModelProperty(example = "[2015, 9, 2]")
+            public LocalDate date;
+            public GetClientTransactionsCurrency currency;
+            @ApiModelProperty(example = "22")
+            public Double amount;
+            @ApiModelProperty(example = "[2015, 9, 2]")
+            public LocalDate submittedOnDate;
+            @ApiModelProperty(example = "false")
+            public Boolean reversed;
+        }
+
+        @ApiModelProperty(example = "20")
+        public Integer totalFilteredRecords;
+        public Set<GetClientsPageItems> pageItems;
+    }
+
+    @ApiModel(value = "GetClientsClientIdTransactionsTransactionIdResponse")
+    public final static class GetClientsClientIdTransactionsTransactionIdResponse {
+        private GetClientsClientIdTransactionsTransactionIdResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer id;
+        @ApiModelProperty(example = "1")
+        public Integer officeId;
+        @ApiModelProperty(example = "Head Office")
+        public String officeName;
+        public GetClientsClientIdTransactionsResponse.GetClientsPageItems.GetClientsClientIdTransactionsType type;
+        @ApiModelProperty(example = "[2015, 8, 17]")
+        public LocalDate date;
+        public GetClientsClientIdTransactionsResponse.GetClientsPageItems.GetClientTransactionsCurrency currency;
+        @ApiModelProperty(example = "60.000000")
+        public BigDecimal amount;
+        @ApiModelProperty(example = "[2015, 8, 17]")
+        public LocalDate submittedOnDate;
+        @ApiModelProperty(example = "true")
+        public Boolean reversed;
+    }
+
+
+    @ApiModel(value = "PostClientsClientIdTransactionsTransactionIdResponse")
+    public final static class PostClientsClientIdTransactionsTransactionIdResponse {
+        private PostClientsClientIdTransactionsTransactionIdResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer officeId;
+        @ApiModelProperty(example = "189")
+        public Integer clientId;
+        @ApiModelProperty(example = "222")
+        public Integer resourceId;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientsApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientsApiResource.java
index fc8904907..3be716fed 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientsApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientsApiResource.java
@@ -18,6 +18,7 @@
  */
 package org.apache.fineract.portfolio.client.api;
 
+import io.swagger.annotations.*;
 import java.io.InputStream;
 import java.util.Arrays;
 import java.util.Collection;
@@ -72,6 +73,7 @@
 @Path("/clients")
 @Component
 @Scope("singleton")
+@Api(value = "Client", description = "Clients are people and businesses that have applied (or may apply) to an MFI for loans.\n" + "\n" + "Clients can be created in Pending or straight into Active state.")
 public class ClientsApiResource {
 
     private final PlatformSecurityContext context;
@@ -113,9 +115,10 @@ public ClientsApiResource(final PlatformSecurityContext context, final ClientRea
     @Path("template")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveTemplate(@Context final UriInfo uriInfo, @QueryParam("officeId") final Long officeId,
-            @QueryParam("commandParam") final String commandParam,
-            @DefaultValue("false") @QueryParam("staffInSelectedOfficeOnly") final boolean staffInSelectedOfficeOnly) {
+    @ApiOperation(value = "Retrieve Client Details Template", notes = "This is a convenience resource. It can be useful when building maintenance user interface screens for client applications. The template data returned consists of any or all of:\n" + "\n" + "Field Defaults\n" + "Allowed Value Lists\n\n" + "Example Request:\n" + "\n" + "clients/template")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = ClientsApiResourceSwagger.GetClientsTemplateResponse.class)})
+    public String retrieveTemplate(@Context final UriInfo uriInfo, @ApiParam(value = "officeId") @QueryParam("officeId") final Long officeId, @QueryParam("commandParam") @ApiParam(value = "commandParam") final String commandParam,
+            @DefaultValue("false")  @QueryParam("staffInSelectedOfficeOnly") @ApiParam(value = "staffInSelectedOfficeOnly")final boolean staffInSelectedOfficeOnly) {
 
         this.context.authenticatedUser().validateHasReadPermission(ClientApiConstants.CLIENT_RESOURCE_NAME);
 
@@ -140,13 +143,15 @@ public String retrieveTemplate(@Context final UriInfo uriInfo, @QueryParam("offi
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveAll(@Context final UriInfo uriInfo, @QueryParam("sqlSearch") final String sqlSearch,
-            @QueryParam("officeId") final Long officeId, @QueryParam("externalId") final String externalId,
-            @QueryParam("displayName") final String displayName, @QueryParam("firstName") final String firstname,
-            @QueryParam("lastName") final String lastname, @QueryParam("underHierarchy") final String hierarchy,
-            @QueryParam("offset") final Integer offset, @QueryParam("limit") final Integer limit,
-            @QueryParam("orderBy") final String orderBy, @QueryParam("sortOrder") final String sortOrder,
-            @QueryParam("orphansOnly") final Boolean orphansOnly) {
+    @ApiOperation(value = "List Clients", notes = "The list capability of clients can support pagination and sorting.\n\n" + "Example Requests:\n" + "\n" + "clients\n" + "\n" + "clients?fields=displayName,officeName,timeline\n" + "\n" + "clients?offset=10&limit=50\n" + "\n" + "clients?orderBy=displayName&sortOrder=DESC" )
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = ClientsApiResourceSwagger.GetClientsResponse.class)})
+    public String retrieveAll(@Context final UriInfo uriInfo, @QueryParam("sqlSearch") @ApiParam(value = "sqlSearch") final String sqlSearch,
+            @QueryParam("officeId") @ApiParam(value = "officeId") final Long officeId, @QueryParam("externalId") @ApiParam(value = "externalId") final String externalId,
+            @QueryParam("displayName") @ApiParam(value = "displayName") final String displayName, @QueryParam("firstName") @ApiParam(value = "firstName") final String firstname,
+            @QueryParam("lastName") @ApiParam(value = "lastName") final String lastname, @QueryParam("underHierarchy") @ApiParam(value = "underHierarchy") final String hierarchy,
+            @QueryParam("offset") @ApiParam(value = "offset") final Integer offset, @QueryParam("limit") @ApiParam(value = "limit") final Integer limit,
+            @QueryParam("orderBy") @ApiParam(value = "orderBy") final String orderBy, @QueryParam("sortOrder") @ApiParam(value = "sortOrder") final String sortOrder,
+            @QueryParam("orphansOnly") @ApiParam(value = "orphansOnly") final Boolean orphansOnly) {
 
         return this.retrieveAll(uriInfo, sqlSearch, officeId, externalId, displayName, firstname, 
         		lastname, hierarchy, offset, limit, orderBy, sortOrder, orphansOnly, false);
@@ -175,8 +180,10 @@ public String retrieveAll(final UriInfo uriInfo, final String sqlSearch,
     @Path("{clientId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveOne(@PathParam("clientId") final Long clientId, @Context final UriInfo uriInfo,
-            @DefaultValue("false") @QueryParam("staffInSelectedOfficeOnly") final boolean staffInSelectedOfficeOnly) {
+    @ApiOperation(value = "Retrieve a Client", notes = "Example Requests:\n" + "\n" + "clients/1\n" +"\n" + "\n" + "clients/1?template=true\n" + "\n" + "\n" + "clients/1?fields=id,displayName,officeName" )
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = ClientsApiResourceSwagger.GetClientsClientIdResponse.class)})
+    public String retrieveOne(@PathParam("clientId") @ApiParam(value = "clientId") final Long clientId, @Context final UriInfo uriInfo,
+            @DefaultValue("false") @QueryParam("staffInSelectedOfficeOnly") @ApiParam(value = "staffInSelectedOfficeOnly") final boolean staffInSelectedOfficeOnly) {
 
         this.context.authenticatedUser().validateHasReadPermission(ClientApiConstants.CLIENT_RESOURCE_NAME);
 
@@ -199,7 +206,11 @@ public String retrieveOne(@PathParam("clientId") final Long clientId, @Context f
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String create(final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Create a Client", httpMethod = "POST", notes = "Note:\n\n" + "1. You can enter either:firstname/middlename/lastname - for a person (middlename is optional) OR fullname - for a business or organisation (or person known by one name).\n" + "\n" + "2.If address is enable(enable-address=true), then additional field called address has to be passed.\n\n" + "Mandatory Fields: firstname and lastname OR fullname, officeId, active=true and activationDate OR active=false, if(address enabled) address\n\n" + "Optional Fields: groupId, externalId, accountNo, staffId, mobileNo, savingsProductId, genderId, clientTypeId, clientClassificationId")
+    @ApiImplicitParams({@ApiImplicitParam(paramType = "body", dataType = "ClientData", required = true, type = "body", dataTypeClass = ClientsApiResourceSwagger.PostClientsRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = ClientsApiResourceSwagger.PostClientsResponse.class) })
+    public String create(@ApiParam(hidden = true) final String apiRequestBodyAsJson) {
+
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder() //
                 .createClient() //
@@ -215,7 +226,10 @@ public String create(final String apiRequestBodyAsJson) {
     @Path("{clientId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String update(@PathParam("clientId") final Long clientId, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Update a Client", notes = "Note: You can update any of the basic attributes of a client (but not its associations) using this API.\n" + "\n" + "Changing the relationship between a client and its office is not supported through this API. An API specific to handling transfers of clients between offices is available for the same.\n" + "\n" + "The relationship between a client and a group must be removed through the Groups API." )
+    @ApiImplicitParams({@ApiImplicitParam( paramType = "body", dataType = "ClientData", required = true, type = "body", dataTypeClass = ClientsApiResourceSwagger.PutClientsClientIdRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = ClientsApiResourceSwagger.PutClientsClientIdResponse.class) })
+    public String update(@ApiParam(value = "clientId") @PathParam("clientId") final Long clientId, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder() //
                 .updateClient(clientId) //
@@ -231,7 +245,10 @@ public String update(@PathParam("clientId") final Long clientId, final String ap
     @Path("{clientId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String delete(@PathParam("clientId") final Long clientId) {
+    @ApiOperation(value = "Delete a Client", notes = "If a client is in Pending state, you are allowed to Delete it. The delete is a 'hard delete' and cannot be recovered from. Once clients become active or have loans or savings associated with them, you cannot delete the client but you may Close the client if they have left the program.")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = ClientsApiResourceSwagger.DeleteClientsClientIdRequest.class)})
+    @ApiResponses(value = {@ApiResponse(code = 200, message = "OK", response = ClientsApiResourceSwagger.DeleteClientsClientIdResponse.class) })
+    public String delete(@PathParam("clientId") @ApiParam(value = "clientId") final Long clientId) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder() //
                 .deleteClient(clientId) //
@@ -246,8 +263,11 @@ public String delete(@PathParam("clientId") final Long clientId) {
     @Path("{clientId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String activate(@PathParam("clientId") final Long clientId, @QueryParam("command") final String commandParam,
-            final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Activate a Client | Close a Client | Reject a Client | Withdraw a Client | Reactivate a Client | UndoReject a Client | UndoWithdraw a Client | Assign a Staff | Unassign a Staff | Update Default Savings Account | Propose a Client Transfer | Withdraw a Client Transfer | Reject a Client Transfer | Accept a Client Transfer | Propose and Accept a Client Transfer", notes = "Activate a Client:\n\n" + "Clients can be created in a Pending state. This API exists to enable client activation (for when a client becomes an approved member of the financial Institution).\n" + "\n" + "If the client happens to be already active this API will result in an error.\n\n" + "Close a Client:\n\n" + "Clients can be closed if they do not have any non-closed loans/savingsAccount. This API exists to close a client .\n" + "\n" + "If the client have any active loans/savingsAccount this API will result in an error.\n\n" + "Reject a Client:\n\n" + "Clients can be rejected when client is in pending for activation status.\n" + "\n" + "If the client is any other status, this API throws an error.\n\n" + "Mandatory Fields: rejectionDate, rejectionReasonId\n\n" + "Withdraw a Client:\n\n" + "Client applications can be withdrawn when client is in a pending for activation status.\n" + "\n" + "If the client is any other status, this API throws an error.\n\n" + "Mandatory Fields: withdrawalDate, withdrawalReasonId\n\n" + "Reactivate a Client: Clients can be reactivated after they have been closed.\n" + "\n" + "Trying to reactivate a client in any other state throws an error.\n\n" + "Mandatory Fields: reactivationDate\n\n" + "UndoReject a Client:\n\n" + "Clients can be reactivated after they have been rejected.\n" + "\n" + "Trying to reactivate a client in any other state throws an error.\n\n" + "Mandatory Fields: reopenedDate" + "UndoWithdraw a Client:\n\n" + "Clients can be reactivated after they have been withdrawn.\n" + "\n" + "Trying to reactivate a client in any other state throws an error.\n\n" + "Mandatory Fields: reopenedDate\n\n" + "Assign a Staff:\n\n" + "Allows you to assign a Staff for existed Client.\n" + "\n" + "The selected Staff should belong to the same office (or an officer higher up in the hierarchy) as the Client he manages.\n\n" + "Unassign a Staff:\n\n" + "Allows you to unassign the Staff assigned to a Client.\n\n" + "Update Default Savings Account:\n\n" + "Allows you to modify or assign a default savings account for an existing Client.\n" + "\n" + "The selected savings account should be one among the existing savings account for a particular customer.\n\n" + "Propose a Client Transfer:\n\n" + "Allows you to propose the transfer of a Client to a different Office.\n\n" + "Withdraw a Client Transfer:\n\n" + "Allows you to withdraw the proposed transfer of a Client to a different Office.\n" + "\n" + "Withdrawal can happen only if the destination Branch (to which the transfer was proposed) has not already accepted the transfer proposal\n\n" + "Reject a Client Transfer:\n\n" + "Allows the Destination Branch to reject the proposed Client Transfer.\n\n" + "Accept a Client Transfer:\n\n" + "Allows the Destination Branch to accept the proposed Client Transfer.\n" + "\n" + "The destination branch may also choose to link this client to a group (in which case, any existing active JLG loan of the client is rescheduled to match the meeting frequency of the group) and loan Officer at the time of accepting the transfer\n\n" + "Propose and Accept a Client Transfer:\n\n" + "Abstraction over the Propose and Accept Client Transfer API's which enable a user with Data Scope over both the Target and Destination Branches to directly transfer a Client to the destination Office.\n\n" + "Showing request/response for 'Reject a Client Transfer'")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = ClientsApiResourceSwagger.PostClientsClientIdRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK",response = ClientsApiResourceSwagger.PostClientsClientIdResponse.class)})
+    public String activate(@PathParam("clientId") @ApiParam(value = "clientId") final Long clientId, @QueryParam("command") @ApiParam(value = "command") final String commandParam,
+            @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapperBuilder builder = new CommandWrapperBuilder().withJson(apiRequestBodyAsJson);
 
@@ -317,7 +337,12 @@ private boolean is(final String commandParam, final String commandValue) {
     @Path("{clientId}/accounts")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveAssociatedAccounts(@PathParam("clientId") final Long clientId, @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Retrieve client accounts overview", notes = "An example of how a loan portfolio summary can be provided. This is requested in a specific use case of the community application.\n" + "It is quite reasonable to add resources like this to simplify User Interface development.\n" + "\n" + "Example Requests:\n " + "\n" + "clients/1/accounts\n"+ "\n" + "clients/1/accounts?fields=loanAccounts,savingsAccounts" )
+    @ApiResponses({
+            @ApiResponse(code = 200, message = "OK", response = ClientsApiResourceSwagger.GetClientsClientIdAccountsResponse.class),
+            @ApiResponse(code = 400, message = "Bad Request")
+    })
+    public String retrieveAssociatedAccounts(@PathParam("clientId") @ApiParam(value = "clientId") final Long clientId, @Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(ClientApiConstants.CLIENT_RESOURCE_NAME);
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientsApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientsApiResourceSwagger.java
new file mode 100644
index 000000000..8ced9a833
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/api/ClientsApiResourceSwagger.java
@@ -0,0 +1,464 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.portfolio.client.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.time.LocalDate;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Created by Chirag Gupta on 01/13/18.
+ */
+final class ClientsApiResourceSwagger {
+    private ClientsApiResourceSwagger() {
+    }
+
+    @ApiModel(value = "GetClientsTemplateResponse")
+    public final static class GetClientsTemplateResponse {
+        private GetClientsTemplateResponse() {
+        }
+
+        final class GetClientsOfficeOptions {
+            private GetClientsOfficeOptions() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "Head Office")
+            public String name;
+            @ApiModelProperty(example = "Head Office")
+            public String nameDecorated;
+        }
+
+        final class GetClientsStaffOptions {
+            private GetClientsStaffOptions() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "xyz")
+            public String firstname;
+            @ApiModelProperty(example = "sjs")
+            public String lastname;
+            @ApiModelProperty(example = "sjs, xyz")
+            public String displayName;
+            @ApiModelProperty(example = "1")
+            public Integer officeId;
+            @ApiModelProperty(example = "Head Office")
+            public String officeName;
+            @ApiModelProperty(example = "true")
+            public Boolean isLoanOfficer;
+            @ApiModelProperty(example = "true")
+            public Boolean isActive;
+        }
+
+        final class GetClientsSavingProductOptions {
+            private GetClientsSavingProductOptions() {
+            }
+
+            @ApiModelProperty(example = "4")
+            public Integer id;
+            @ApiModelProperty(example = "account overdraft")
+            public String name;
+            @ApiModelProperty(example = "false")
+            public Boolean withdrawalFeeForTransfers;
+            @ApiModelProperty(example = "false")
+            public Boolean allowOverdraft;
+        }
+
+        final class GetClientsDataTables {
+            private GetClientsDataTables() {
+            }
+
+            final class GetClientsColumnHeaderData {
+                private GetClientsColumnHeaderData() {
+                }
+
+                @ApiModelProperty(example = "client_id")
+                public String columnName;
+                @ApiModelProperty(example = "bigint")
+                public String columnType;
+                @ApiModelProperty(example = "0")
+                public Integer columnLength;
+                @ApiModelProperty(example = "INTEGER")
+                public String columnDisplayType;
+                @ApiModelProperty(example = "false")
+                public Boolean isColumnNullable;
+                @ApiModelProperty(example = "true")
+                public Boolean isColumnPrimaryKey;
+                @ApiModelProperty(example = "[]")
+                public List<String> columnValues;
+            }
+
+            @ApiModelProperty(example = "m_client")
+            public String applicationTableName;
+            @ApiModelProperty(example = "Address Details")
+            public String registeredTableName;
+            public Set<GetClientsColumnHeaderData> columnHeaderData;
+        }
+
+        @ApiModelProperty(example = "[2014, 3, 4]")
+        public LocalDate activationDate;
+        @ApiModelProperty(example = "1")
+        public Integer officeId;
+        public Set<GetClientsOfficeOptions> officeOptions;
+        public Set<GetClientsStaffOptions> staffOptions;
+        public Set<GetClientsSavingProductOptions> savingProductOptions;
+        public Set<GetClientsDataTables> datatables;
+    }
+
+    @ApiModel(value = "GetClientsResponse")
+    public final static class GetClientsResponse {
+        private GetClientsResponse() {
+        }
+
+        final class GetClientsPageItemsResponse {
+            private GetClientsPageItemsResponse() {
+            }
+
+            final class GetClientStatus {
+                private GetClientStatus() {
+                }
+
+                @ApiModelProperty(example = "100")
+                public Integer id;
+                @ApiModelProperty(example = "clientStatusType.pending")
+                public String code;
+                @ApiModelProperty(example = "Pending")
+                public String value;
+            }
+
+            @ApiModelProperty(example = "2")
+            public Integer id;
+            @ApiModelProperty(example = "000000002")
+            public String accountNo;
+            public GetClientStatus status;
+            @ApiModelProperty(example = "false")
+            public Boolean active;
+            @ApiModelProperty(example = "Home Farm Produce")
+            public String fullname;
+            @ApiModelProperty(example = "Home Farm Produce")
+            public String displayName;
+            @ApiModelProperty(example = "1")
+            public Integer officeId;
+            @ApiModelProperty(example = "Head Office")
+            public String officeName;
+        }
+
+        @ApiModelProperty(example = "2")
+        public Integer totalFilteredRecords;
+        public Set<GetClientsPageItemsResponse> pageItems;
+    }
+
+    @ApiModel(value = "GetClientsClientIdResponse")
+    public final static class GetClientsClientIdResponse {
+        private GetClientsClientIdResponse() {
+        }
+
+        final class GetClientsClientIdStatus {
+            private GetClientsClientIdStatus() {
+            }
+
+            @ApiModelProperty(example = "300")
+            public Integer id;
+            @ApiModelProperty(example = "clientStatusType.active")
+            public String code;
+            @ApiModelProperty(example = "Active")
+            public String value;
+        }
+
+        final class GetClientsTimeline {
+            private GetClientsTimeline() {
+            }
+
+            @ApiModelProperty(example = "[2013, 1, 1]")
+            public LocalDate submittedOnDate;
+            @ApiModelProperty(example = "mifos")
+            public String submittedByUsername;
+            @ApiModelProperty(example = "App")
+            public String submittedByFirstname;
+            @ApiModelProperty(example = "Administrator")
+            public String submittedByLastname;
+            @ApiModelProperty(example = "[2013, 1, 1]")
+            public LocalDate activatedOnDate;
+            @ApiModelProperty(example = "mifos")
+            public String activatedByUsername;
+            @ApiModelProperty(example = "App")
+            public String activatedByFirstname;
+            @ApiModelProperty(example = "Administrator")
+            public String activatedByLastname;
+
+        }
+
+        @ApiModelProperty(example = "27")
+        public Integer id;
+        @ApiModelProperty(example = "000000027")
+        public Long accountNo;
+        public GetClientsClientIdStatus status;
+        @ApiModelProperty(example = "true")
+        public Boolean active;
+        @ApiModelProperty(example = "[2013, 1, 1]")
+        public LocalDate activationDate;
+        @ApiModelProperty(example = "savings")
+        public String firstname;
+        @ApiModelProperty(example = "test")
+        public String lastname;
+        @ApiModelProperty(example = "savings test")
+        public String displayName;
+        @ApiModelProperty(example = "1")
+        public Integer officeId;
+        @ApiModelProperty(example = "Head Office")
+        public String officeName;
+        public GetClientsTimeline timeline;
+        @ApiModelProperty(example = "4")
+        public Integer savingsProductId;
+        @ApiModelProperty(example = "account overdraft")
+        public String savingsProductName;
+        @ApiModelProperty(example = "[]")
+        public List<String> groups;
+    }
+
+    @ApiModel(value = "PostClientsRequest")
+    public final static class PostClientsRequest {
+        private PostClientsRequest() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer officeId;
+        @ApiModelProperty(example = "Client of group")
+        public String fullname;
+        @ApiModelProperty(example = "1")
+        public Integer groupId;
+        @ApiModelProperty(example = "dd MMMM yyyy")
+        public String dateFormat;
+        @ApiModelProperty(example = "en")
+        public String locale;
+        @ApiModelProperty(example = "true")
+        public Boolean active;
+        @ApiModelProperty(example = "04 March 2009")
+        public String activationDate;
+    }
+
+    @ApiModel(value = "PostClientsResponse")
+    public final static class PostClientsResponse {
+        private PostClientsResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer officeId;
+        @ApiModelProperty(example = "1")
+        public Integer groupId;
+        @ApiModelProperty(example = "2")
+        public Integer clientId;
+        @ApiModelProperty(example = "2")
+        public Integer resourceId;
+    }
+
+    @ApiModel(value = "PutClientsClientIdRequest")
+    public final static class PutClientsClientIdRequest {
+        private PutClientsClientIdRequest() {
+        }
+
+        @ApiModelProperty(example = "786444UUUYYH7")
+        public String externalId;
+    }
+
+    @ApiModel(value = "PutClientsClientIdResponse")
+    public final static class PutClientsClientIdResponse {
+        private PutClientsClientIdResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer officeId;
+        @ApiModelProperty(example = "1")
+        public Integer clientId;
+        @ApiModelProperty(example = "1")
+        public Integer resourceId;
+        public PutClientsClientIdRequest changes;
+    }
+
+    @ApiModel(value = "DeleteClientsClientIdRequest")
+    public final static class DeleteClientsClientIdRequest {
+        private DeleteClientsClientIdRequest() {
+        }
+    }
+
+    @ApiModel(value = "DeleteClientsClientIdResponse")
+    public final static class DeleteClientsClientIdResponse {
+        private DeleteClientsClientIdResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer officeId;
+        @ApiModelProperty(example = "3")
+        public Integer clientId;
+        @ApiModelProperty(example = "3")
+        public Integer resourceId;
+    }
+
+    @ApiModel(value = "PostClientsClientIdRequest")
+    public final static class PostClientsClientIdRequest {
+        private PostClientsClientIdRequest() {
+        }
+
+        @ApiModelProperty(example = "We cannot accept transfers of clients having loans with less than 1 repayment left")
+        public String note;
+    }
+
+    @ApiModel(value = "PostClientsClientIdResponse")
+    public final static class PostClientsClientIdResponse {
+        private PostClientsClientIdResponse() {
+        }
+
+        @ApiModelProperty(example = "2")
+        public Integer clientId;
+        @ApiModelProperty(example = "2")
+        public Integer resourceId;
+    }
+
+    @ApiModel(value = "GetClientsClientIdAccountsResponse")
+    public final static class GetClientsClientIdAccountsResponse {
+        private GetClientsClientIdAccountsResponse() {
+        }
+
+        final class GetClientsLoanAccounts {
+            private GetClientsLoanAccounts() {
+            }
+
+            final class GetClientsLoanAccountsStatus {
+                private GetClientsLoanAccountsStatus() {
+                }
+
+                @ApiModelProperty(example = "300")
+                public Integer id;
+                @ApiModelProperty(example = "loanStatusType.active")
+                public String code;
+                @ApiModelProperty(example = "Active")
+                public String value;
+                @ApiModelProperty(example = "false")
+                public Boolean pendingApproval;
+                @ApiModelProperty(example = "false")
+                public Boolean waitingForDisbursal;
+                @ApiModelProperty(example = "true")
+                public Boolean active;
+                @ApiModelProperty(example = "false")
+                public Boolean closedObligationsMet;
+                @ApiModelProperty(example = "false")
+                public Boolean closedWrittenOff;
+                @ApiModelProperty(example = "false")
+                public Boolean closedRescheduled;
+                @ApiModelProperty(example = "false")
+                public Boolean closed;
+                @ApiModelProperty(example = "false")
+                public Boolean overpaid;
+            }
+
+            final class GetClientsLoanAccountsType {
+                private GetClientsLoanAccountsType() {
+                }
+
+                @ApiModelProperty(example = "1")
+                public Integer id;
+                @ApiModelProperty(example = "loanType.individual")
+                public String code;
+                @ApiModelProperty(example = "Individual")
+                public String value;
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "000000001")
+            public Long accountNo;
+            @ApiModelProperty(example = "456")
+            public Integer externalId;
+            @ApiModelProperty(example = "1")
+            public Integer productId;
+            @ApiModelProperty(example = "TestOne")
+            public String productName;
+            public GetClientsLoanAccountsStatus status;
+            public GetClientsLoanAccountsType loanType;
+            @ApiModelProperty(example = "1")
+            public Integer loanCycle;
+        }
+
+        final class GetClientsSavingsAccounts {
+            private GetClientsSavingsAccounts() {
+            }
+
+            final class GetClientsSavingsAccountsCurrency {
+                private GetClientsSavingsAccountsCurrency() {
+                }
+
+                @ApiModelProperty(example = "USD")
+                public String code;
+                @ApiModelProperty(example = "US Dollar")
+                public String name;
+                @ApiModelProperty(example = "2")
+                public Integer decimalPlaces;
+                @ApiModelProperty(example = "$")
+                public String displaySymbol;
+                @ApiModelProperty(example = "currency.USD")
+                public String nameCode;
+                @ApiModelProperty(example = "US Dollar ($)")
+                public String displayLabel;
+            }
+
+            final class GetClientsSavingsAccountsStatus {
+                private GetClientsSavingsAccountsStatus() {
+                }
+
+                @ApiModelProperty(example = "100")
+                public Integer id;
+                @ApiModelProperty(example = "savingsAccountStatusType.submitted.and.pending.approval")
+                public String code;
+                @ApiModelProperty(example = "Submitted and pending approval")
+                public String value;
+                @ApiModelProperty(example = "true")
+                public Boolean submittedAndPendingApproval;
+                @ApiModelProperty(example = "false")
+                public Boolean approved;
+                @ApiModelProperty(example = "false")
+                public Boolean rejected;
+                @ApiModelProperty(example = "false")
+                public Boolean withdrawnByApplicant;
+                @ApiModelProperty(example = "false")
+                public Boolean active;
+                @ApiModelProperty(example = "false")
+                public Boolean closed;
+            }
+
+            @ApiModelProperty(example = "7")
+            public Integer id;
+            @ApiModelProperty(example = "000000007")
+            public Long accountNo;
+            @ApiModelProperty(example = "2")
+            public Integer productId;
+            @ApiModelProperty(example = "Other product")
+            public String productName;
+            public GetClientsSavingsAccountsStatus status;
+            public GetClientsSavingsAccountsCurrency currency;
+        }
+
+        public Set<GetClientsLoanAccounts> loanAccounts;
+        public Set<GetClientsSavingsAccounts> savingsAccounts;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientData.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientData.java
index c25730569..14ab255bf 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientData.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/client/data/ClientData.java
@@ -63,7 +63,7 @@
     private final CodeValueData gender;
     private final CodeValueData clientType;
     private final CodeValueData clientClassification;
-	private final Boolean isStaff;
+    private final Boolean isStaff;
 
     private final Long officeId;
     private final String officeName;
@@ -93,12 +93,12 @@
     private final Collection<SavingsAccountData> savingAccountOptions;
     private final Collection<CodeValueData> genderOptions;
     private final Collection<CodeValueData> clientTypeOptions;
-    private final Collection<CodeValueData> clientClassificationOptions;    
+    private final Collection<CodeValueData> clientClassificationOptions;
     private final Collection<CodeValueData> clientNonPersonConstitutionOptions;
     private final Collection<CodeValueData> clientNonPersonMainBusinessLineOptions;
     private final List<EnumOptionData> clientLegalFormOptions;
     private final ClientFamilyMembersData familyMemberOptions;
-    
+
     private final ClientNonPersonData clientNonPersonDetails;
     
     private final Collection<AddressData> address;
@@ -135,7 +135,7 @@ public static ClientData importClientPersonInstance(Long legalFormId,Integer row
         return new ClientData(legalFormId,rowIndex, null, firstName,lastName,middleName,submittedOn,activationDate,active,externalId,
                 officeId,staffId,mobileNo,dob,clientTypeId,genderId,clientClassificationId,isStaff,address, null, locale,dateFormat);
     }
-    
+
     public static ClientData emptyInstance(Long clientId) {
     		return lookup(clientId, null, null, null);
     }
@@ -261,7 +261,7 @@ public static ClientData template(final Long officeId, final LocalDate joinedDat
                 middlename, lastname, fullname, displayName, externalId, mobileNo, emailAddress, dateOfBirth, gender, joinedDate, imageId, staffId,
                 staffName, officeOptions, groups, staffOptions, narrations, genderOptions, timeline, savingProductOptions,
                 savingsProductId, savingsProductName, savingsAccountId, savingAccountOptions, clientType, clientClassification,
-                clientTypeOptions, clientClassificationOptions, clientNonPersonConstitutionOptions, clientNonPersonMainBusinessLineOptions, 
+                clientTypeOptions, clientClassificationOptions, clientNonPersonConstitutionOptions, clientNonPersonMainBusinessLineOptions,
                 clientNonPersonDetails, clientLegalFormOptions,familyMemberOptions, legalForm,address, isAddressEnabled, datatables, isStaff);
 
     }
@@ -275,7 +275,7 @@ public static ClientData templateOnTop(final ClientData clientData, final Client
                 clientData.staffName, templateData.officeOptions, clientData.groups, templateData.staffOptions, templateData.narrations,
                 templateData.genderOptions, clientData.timeline, templateData.savingProductOptions, clientData.savingsProductId,
                 clientData.savingsProductName, clientData.savingsAccountId, clientData.savingAccountOptions, clientData.clientType,
-                clientData.clientClassification, templateData.clientTypeOptions, templateData.clientClassificationOptions, 
+                clientData.clientClassification, templateData.clientTypeOptions, templateData.clientClassificationOptions,
                 templateData.clientNonPersonConstitutionOptions, templateData.clientNonPersonMainBusinessLineOptions, clientData.clientNonPersonDetails,
                 templateData.clientLegalFormOptions,templateData.familyMemberOptions, clientData.legalForm, clientData.address,clientData.isAddressEnabled, null, clientData.isStaff);
 
@@ -305,7 +305,7 @@ public static ClientData setParentGroups(final ClientData clientData, final Coll
                 clientData.staffName, clientData.officeOptions, parentGroups, clientData.staffOptions, null, null, clientData.timeline,
                 clientData.savingProductOptions, clientData.savingsProductId, clientData.savingsProductName, clientData.savingsAccountId,
                 clientData.savingAccountOptions, clientData.clientType, clientData.clientClassification, clientData.clientTypeOptions,
-                clientData.clientClassificationOptions, clientData.clientNonPersonConstitutionOptions, clientData.clientNonPersonMainBusinessLineOptions, 
+                clientData.clientClassificationOptions, clientData.clientNonPersonConstitutionOptions, clientData.clientNonPersonMainBusinessLineOptions,
                 clientData.clientNonPersonDetails, clientData.clientLegalFormOptions,clientData.familyMemberOptions, clientData.legalForm,clientData.address,
 				clientData.isAddressEnabled, null, clientData.isStaff);
 
@@ -353,7 +353,7 @@ public static ClientData clientIdentifier(final Long id, final String accountNo,
                 middlename, lastname, fullname, displayName, externalId, mobileNo, emailAddress, dateOfBirth, gender, activationDate, imageId, staffId,
                 staffName, allowedOffices, groups, staffOptions, closureReasons, genderOptions, timeline, savingProductOptions,
                 savingsProductId, savingsProductName, savingsAccountId, savingAccountOptions, clientType, clientClassification,
-                clientTypeOptions, clientClassificationOptions, clientNonPersonConstitutionOptions, clientNonPersonMainBusinessLineOptions, 
+                clientTypeOptions, clientClassificationOptions, clientNonPersonConstitutionOptions, clientNonPersonMainBusinessLineOptions,
                 clientNonPerson, clientLegalFormOptions,familyMemberOptions, legalForm,null,null, null, isStaff);
     }
 
@@ -402,11 +402,11 @@ public static ClientData lookup(final Long id, final String displayName, final L
                 middlename, lastname, fullname, displayName, externalId, mobileNo, emailAddress, dateOfBirth, gender, activationDate, imageId, staffId,
                 staffName, allowedOffices, groups, staffOptions, closureReasons, genderOptions, timeline, savingProductOptions,
                 savingsProductId, savingsProductName, savingsAccountId, savingAccountOptions, clientType, clientClassification,
-                clientTypeOptions, clientClassificationOptions, clientNonPersonConstitutionOptions, clientNonPersonMainBusinessLineOptions, 
+                clientTypeOptions, clientClassificationOptions, clientNonPersonConstitutionOptions, clientNonPersonMainBusinessLineOptions,
                 clientNonPerson, clientLegalFormOptions,familyMemberOptions, legalForm,null,null, null, isStaff);
 
     }
-    
+
     public static ClientData instance(final Long id, final String displayName){
     	 final Long officeId = null;
     	 final String officeName = null;
@@ -503,7 +503,7 @@ private ClientData(final String accountNo, final EnumOptionData status, final Co
         this.genderOptions = genderOptions;
         this.clientClassificationOptions = clientClassificationOptions;
         this.clientTypeOptions = clientTypeOptions;
-        
+
         this.clientNonPersonConstitutionOptions = clientNonPersonConstitutionOptions;
         this.clientNonPersonMainBusinessLineOptions = clientNonPersonMainBusinessLineOptions;
         this.clientLegalFormOptions = clientLegalFormOptions;
@@ -518,7 +518,7 @@ private ClientData(final String accountNo, final EnumOptionData status, final Co
         this.legalForm = legalForm;
 		this.isStaff = isStaff;
         this.clientNonPersonDetails = clientNonPerson;
-        
+
       	this.address = address;
 		this.isAddressEnabled = isAddressEnabled;
         this.datatables = datatables;
@@ -532,7 +532,7 @@ public Long id() {
     public String displayName() {
         return this.displayName;
     }
-    
+
     public String accountNo() {
     	return this.accountNo;
     }
@@ -605,7 +605,7 @@ public String getLastname() {
     public LocalDate getActivationDate() {
         return this.activationDate;
     }
-    
+
     public Boolean getIsAddressEnabled() {
 		return this.isAddressEnabled;
 	}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateral/api/CollateralsApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateral/api/CollateralsApiResource.java
index 569a2ceaa..9266dc191 100755
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateral/api/CollateralsApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateral/api/CollateralsApiResource.java
@@ -18,24 +18,7 @@
  */
 package org.apache.fineract.portfolio.collateral.api;
 
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.UriInfo;
-
+import io.swagger.annotations.*;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
 import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
@@ -52,9 +35,16 @@
 import org.springframework.context.annotation.Scope;
 import org.springframework.stereotype.Component;
 
+import javax.ws.rs.*;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.UriInfo;
+import java.util.*;
+
 @Path("/loans/{loanId}/collaterals")
 @Component
 @Scope("singleton")
+@Api(value = "Loan Collateral", description = "In lending agreements, collateral is a borrower's pledge of specific property to a lender, to secure repayment of a loan. The collateral serves as protection for a lender against a borrower's default - that is, any borrower failing to pay the principal and interest under the terms of a loan obligation. If a borrower does default on a loan (due to insolvency or other event), that borrower forfeits (gives up) the property pledged as collateral - and the lender then becomes the owner of the collateral")
 public class CollateralsApiResource {
 
     private static final Set<String> RESPONSE_DATA_PARAMETERS = new HashSet<>(Arrays.asList("id", "type", "value", "description",
@@ -87,6 +77,8 @@ public CollateralsApiResource(final PlatformSecurityContext context, final Colla
     @Path("template")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
+    @ApiOperation(value = "Retrieve Collateral Details Template", httpMethod = "GET", notes = "This is a convenience resource. It can be useful when building maintenance user interface screens for client applications. The template data returned consists of any or all of:\n" + "\n" + "Field Defaults\n" + "Allowed Value Lists\n" + "Example Request:\n" + "\n" + "loans/1/collaterals/template")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = CollateralsApiResourceSwagger.GetLoansLoanIdCollateralsTemplateResponse.class)})
     public String newCollateralTemplate(@Context final UriInfo uriInfo) {
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermission);
 
@@ -102,7 +94,9 @@ public String newCollateralTemplate(@Context final UriInfo uriInfo) {
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveCollateralDetails(@Context final UriInfo uriInfo, @PathParam("loanId") final Long loanId) {
+    @ApiOperation(value = "List Loan Collaterals", httpMethod = "GET", notes = "Example Requests:\n" + "\n" + "loans/1/collaterals\n" + "\n" + "\n" + "loans/1/collaterals?fields=value,description")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = CollateralsApiResourceSwagger.GetLoansLoanIdCollateralsResponse.class, responseContainer = "List")})
+    public String retrieveCollateralDetails(@Context final UriInfo uriInfo, @PathParam("loanId") @ApiParam(value = "loanId") final Long loanId) {
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermission);
 
         final List<CollateralData> CollateralDatas = this.collateralReadPlatformService.retrieveCollateralsForValidLoan(loanId);
@@ -116,8 +110,10 @@ public String retrieveCollateralDetails(@Context final UriInfo uriInfo, @PathPar
     @Path("{collateralId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveCollateralDetails(@Context final UriInfo uriInfo, @PathParam("loanId") final Long loanId,
-            @PathParam("collateralId") final Long CollateralId) {
+    @ApiOperation(value = "Retrieve a Collateral", httpMethod = "GET", notes = "Example Requests:\n" + "\n" + "/loans/1/collaterals/1\n" + "\n" + "\n" + "/loans/1/collaterals/1?fields=value,description")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = CollateralsApiResourceSwagger.GetLoansLoanIdCollateralsResponse.class)})
+    public String retrieveCollateralDetails(@Context final UriInfo uriInfo, @PathParam("loanId") @ApiParam(value = "loanId")final Long loanId,
+            @PathParam("collateralId") @ApiParam(value = "collateralId") final Long CollateralId) {
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermission);
 
         CollateralData CollateralData = this.collateralReadPlatformService.retrieveCollateral(loanId, CollateralId);
@@ -135,7 +131,10 @@ public String retrieveCollateralDetails(@Context final UriInfo uriInfo, @PathPar
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String createCollateral(@PathParam("loanId") final Long loanId, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Create a Collateral", httpMethod = "POST", notes = "Note: Currently, Collaterals may be added only before a Loan is approved")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = CollateralsApiResourceSwagger.PostLoansLoanIdCollateralsRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = CollateralsApiResourceSwagger.PostLoansLoanIdCollateralsResponse.class)})
+    public String createCollateral(@PathParam("loanId") @ApiParam(value = "loanId") final Long loanId, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().createCollateral(loanId).withJson(apiRequestBodyAsJson).build();
 
@@ -148,8 +147,11 @@ public String createCollateral(@PathParam("loanId") final Long loanId, final Str
     @Path("{collateralId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String updateCollateral(@PathParam("loanId") final Long loanId, @PathParam("collateralId") final Long collateralId,
-            final String jsonRequestBody) {
+    @ApiOperation(value = "Update a Collateral", httpMethod = "PUT")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = CollateralsApiResourceSwagger.PutLoansLoandIdCollateralsCollateralIdRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = CollateralsApiResourceSwagger.PutLoansLoanIdCollateralsCollateralIdResponse.class)})
+    public String updateCollateral(@PathParam("loanId") @ApiParam(value = "loanId") final Long loanId, @PathParam("collateralId") @ApiParam(value = "collateralId") final Long collateralId,
+            @ApiParam(hidden = true) final String jsonRequestBody) {
         final CommandWrapper commandRequest = new CommandWrapperBuilder().updateCollateral(loanId, collateralId).withJson(jsonRequestBody)
                 .build();
 
@@ -162,7 +164,9 @@ public String updateCollateral(@PathParam("loanId") final Long loanId, @PathPara
     @Path("{collateralId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String deleteCollateral(@PathParam("loanId") final Long loanId, @PathParam("collateralId") final Long collateralId) {
+    @ApiOperation(value = "Remove a Collateral", httpMethod = "DELETE", notes = "Note: A collateral can only be removed from Loans that are not yet approved.")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = CollateralsApiResourceSwagger.DeleteLoansLoanIdCollateralsCollateralIdResponse.class)})
+    public String deleteCollateral(@PathParam("loanId") @ApiParam(value = "loanId") final Long loanId, @PathParam("collateralId") @ApiParam(value = "collateralId")final Long collateralId) {
         final CommandWrapper commandRequest = new CommandWrapperBuilder().deleteCollateral(loanId, collateralId).build();
 
         final CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateral/api/CollateralsApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateral/api/CollateralsApiResourceSwagger.java
new file mode 100644
index 000000000..0eb00f88e
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collateral/api/CollateralsApiResourceSwagger.java
@@ -0,0 +1,147 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.portfolio.collateral.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Set;
+
+/**
+ * Created by Chirag Gupta on 12/01/17.
+ */
+final class CollateralsApiResourceSwagger {
+    private CollateralsApiResourceSwagger() {
+    }
+
+    @ApiModel(value = "GetLoansLoanIdCollateralsResponse")
+    public static final class GetLoansLoanIdCollateralsResponse {
+        private GetLoansLoanIdCollateralsResponse() {
+        }
+
+        final class GetCollateralTypeResponse {
+            private GetCollateralTypeResponse() {
+            }
+
+            @ApiModelProperty(example = "8")
+            public Integer id;
+            @ApiModelProperty(example = "Gold")
+            public String name;
+        }
+
+        final class GetCollateralCurrencyResponse {
+            private GetCollateralCurrencyResponse() {
+            }
+
+            @ApiModelProperty(example = "USD")
+            public String code;
+            @ApiModelProperty(example = "US Dollar")
+            public String name;
+            @ApiModelProperty(example = "2")
+            public Integer decimalPlaces;
+            @ApiModelProperty(example = "$")
+            public String displaySymbol;
+            @ApiModelProperty(example = "currency.USD")
+            public String nameCode;
+            @ApiModelProperty(example = "US Dollar ($)")
+            public String displayLabel;
+        }
+
+        @ApiModelProperty(example = "12")
+        public Integer id;
+        public GetCollateralTypeResponse type;
+        @ApiModelProperty(example = "50000")
+        public Long value;
+        @ApiModelProperty(example = "24 Carat Gold chain weighing 12 grams")
+        public String description;
+        public GetCollateralCurrencyResponse currency;
+    }
+
+    @ApiModel(value = "PostLoansLoanIdCollateralsRequest")
+    public static final class PostLoansLoanIdCollateralsRequest {
+        private PostLoansLoanIdCollateralsRequest() {
+        }
+
+        @ApiModelProperty(example = "9")
+        public Integer collateralTypeId;
+    }
+
+    @ApiModel(value = "PostLoansLoanIdCollateralsResponse")
+    public static final class PostLoansLoanIdCollateralsResponse {
+        private PostLoansLoanIdCollateralsResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer loanId;
+        @ApiModelProperty(example = "12")
+        public Integer resourceId;
+    }
+
+    @ApiModel(value = "PutLoansLoandIdCollateralsCollateralIdRequest")
+    public static final class PutLoansLoandIdCollateralsCollateralIdRequest {
+        private PutLoansLoandIdCollateralsCollateralIdRequest() {
+        }
+
+        @ApiModelProperty(example = "22 Carat Gold chain weighing 12 grams")
+        public String description;
+    }
+
+    @ApiModel(value = "PutLoansLoanIdCollateralsCollateralIdResponse")
+    public static final class PutLoansLoanIdCollateralsCollateralIdResponse {
+        private PutLoansLoanIdCollateralsCollateralIdResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer loanId;
+        @ApiModelProperty(example = "12")
+        public Integer resourceId;
+        public PutLoansLoandIdCollateralsCollateralIdRequest changes;
+    }
+
+    @ApiModel(value = "GetLoansLoanIdCollateralsTemplateResponse")
+    public static final class GetLoansLoanIdCollateralsTemplateResponse {
+        private GetLoansLoanIdCollateralsTemplateResponse() {
+        }
+
+        final class GetCollateralsTemplateAllowedTypes {
+            private GetCollateralsTemplateAllowedTypes() {
+            }
+
+            @ApiModelProperty(example = "9")
+            public Integer id;
+            @ApiModelProperty(example = "Silver")
+            public String name;
+            @ApiModelProperty(example = "0")
+            public Integer position;
+        }
+
+        public Set<GetCollateralsTemplateAllowedTypes> allowedCollateralTypes;
+    }
+
+    @ApiModel(value = "DeleteLoansLoanIdCollateralsCollateralIdResponse")
+    public static final class DeleteLoansLoanIdCollateralsCollateralIdResponse {
+        private DeleteLoansLoanIdCollateralsCollateralIdResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer loanId;
+        @ApiModelProperty(example = "12")
+        public Integer resourceId;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collectionsheet/api/CollectionSheetApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collectionsheet/api/CollectionSheetApiResourceSwagger.java
new file mode 100644
index 000000000..a04cce6ba
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collectionsheet/api/CollectionSheetApiResourceSwagger.java
@@ -0,0 +1,90 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.portfolio.collectionsheet.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.List;
+
+/**
+ * Created by Chirag Gupta on 12/17/17.
+ */
+final class CollectionSheetApiResourceSwagger {
+    private CollectionSheetApiResourceSwagger() {
+    }
+
+    @ApiModel(value = "PostCollectionSheetRequest")
+    public final static class PostCollectionSheetRequest {
+        private PostCollectionSheetRequest() {
+        }
+
+        final class PostCollectionSheetBulkRepaymentTransactions {
+            private PostCollectionSheetBulkRepaymentTransactions() {
+            }
+
+            @ApiModelProperty(example = "10")
+            public Integer loanId;
+            @ApiModelProperty(example = "1221.36")
+            public Double transactionAmount;
+            @ApiModelProperty(example = "19")
+            public Integer paymentTypeId;
+            @ApiModelProperty(example = "1245356")
+            public Long receiptNumber;
+        }
+
+        @ApiModelProperty(example = "dd MMMM yyyy")
+        public String dateFormat;
+        @ApiModelProperty(example = "en")
+        public String locale;
+        @ApiModelProperty(example = "04 May 2014")
+        public String transactionDate;
+        @ApiModelProperty(example = "04 May 2014")
+        public String actualDisbursementDate;
+        public List<Integer> bulkDisbursementTransactions;
+        public PostCollectionSheetBulkRepaymentTransactions bulkRepaymentTransactions;
+        public List<Integer> bulkSavingsDueTransactions;
+    }
+
+    @ApiModel(value = "PostCollectionSheetResponse")
+    public final static class PostCollectionSheetResponse {
+        private PostCollectionSheetResponse() {
+        }
+
+        final class PostCollectionSheetChanges {
+            private PostCollectionSheetChanges() {
+            }
+
+            @ApiModelProperty(example = "en")
+            public String locale;
+            @ApiModelProperty(example = "dd MMMM yyyy")
+            public String dateFormat;
+            @ApiModelProperty(example = "[15]")
+            public List<Integer> loanTransactions;
+            @ApiModelProperty(example = "[]")
+            public List<Integer> SavingsTransactions;
+        }
+
+        @ApiModelProperty(example = "10")
+        public Integer groupId;
+        @ApiModelProperty(example = "10")
+        public Integer resourceId;
+        public PostCollectionSheetChanges changes;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collectionsheet/api/CollectionSheetApiResourse.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collectionsheet/api/CollectionSheetApiResourse.java
index 3de8b57da..16f3a7d41 100755
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/collectionsheet/api/CollectionSheetApiResourse.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/collectionsheet/api/CollectionSheetApiResourse.java
@@ -18,15 +18,8 @@
  */
 package org.apache.fineract.portfolio.collectionsheet.api;
 
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.UriInfo;
-
+import com.google.gson.JsonElement;
+import io.swagger.annotations.*;
 import org.apache.commons.lang.StringUtils;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
@@ -45,11 +38,15 @@
 import org.springframework.context.annotation.Scope;
 import org.springframework.stereotype.Component;
 
-import com.google.gson.JsonElement;
+import javax.ws.rs.*;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.UriInfo;
 
 @Path("/collectionsheet")
 @Component
 @Scope("singleton")
+@Api(value = "Collection Sheet", description = "")
 public class CollectionSheetApiResourse {
 
     private final CollectionSheetReadPlatformService collectionSheetReadPlatformService;
@@ -75,8 +72,11 @@ public CollectionSheetApiResourse(final CollectionSheetReadPlatformService colle
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String generateCollectionSheet(@QueryParam("command") final String commandParam, final String apiRequestBodyAsJson,
-            @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Generate Individual Collection Sheet | Save Collection Sheet", httpMethod = "POST", notes = "Generate Individual Collection Sheet:\n\n" + "This Api retrieves repayment details of all individual loans under a office as on a specified meeting date.\n\n" + "Save Collection Sheet:\n\n" + "This Api allows the loan officer to perform bulk repayments of individual loans and deposit of mandatory savings on a given meeting date.")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = CollectionSheetApiResourceSwagger.PostCollectionSheetRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = CollectionSheetApiResourceSwagger.PostCollectionSheetResponse.class)})
+    public String generateCollectionSheet(@QueryParam("command") @ApiParam(value = "command") final String commandParam, @ApiParam(hidden = true) final String apiRequestBodyAsJson,
+                                          @Context final UriInfo uriInfo) {
         final CommandWrapperBuilder builder = new CommandWrapperBuilder().withJson(apiRequestBodyAsJson);
         CommandProcessingResult result = null;
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/floatingrates/api/FloatingRatesApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/floatingrates/api/FloatingRatesApiResource.java
index d94c1161e..c9bdae783 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/floatingrates/api/FloatingRatesApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/floatingrates/api/FloatingRatesApiResource.java
@@ -18,22 +18,7 @@
  */
 package org.apache.fineract.portfolio.floatingrates.api;
 
-import java.util.Arrays;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.UriInfo;
-
+import io.swagger.annotations.*;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
 import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
@@ -48,9 +33,19 @@
 import org.springframework.context.annotation.Scope;
 import org.springframework.stereotype.Component;
 
+import javax.ws.rs.*;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.UriInfo;
+import java.util.Arrays;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
 @Path("/floatingrates")
 @Component
 @Scope("singleton")
+@Api(value = "Floating Rates", description = "It lets you create, list, retrieve and upload the floating rates")
 public class FloatingRatesApiResource {
 
 	private static final String RESOURCE_NAME = "FLOATINGRATE";
@@ -84,7 +79,10 @@ public FloatingRatesApiResource(
 	@POST
 	@Consumes({ MediaType.APPLICATION_JSON })
 	@Produces({ MediaType.APPLICATION_JSON })
-	public String createFloatingRate(final String apiRequestBodyAsJson) {
+	@ApiOperation(value = "Create a new Floating Rate", httpMethod = "POST", notes = "Creates a new Floating Rate\n" + "Mandatory Fields: name\n" + "Optional Fields: isBaseLendingRate, isActive, ratePeriods")
+	@ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = FloatingRatesApiResourceSwagger.PostFloatingRatesRequest.class)})
+	@ApiResponses({@ApiResponse(code = 200, message = "OK", response = FloatingRatesApiResourceSwagger.PostFloatingRatesResponse.class)})
+	public String createFloatingRate(@ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
 		final CommandWrapper commandRequest = new CommandWrapperBuilder()
 				.createFloatingRate().withJson(apiRequestBodyAsJson).build();
@@ -96,6 +94,8 @@ public String createFloatingRate(final String apiRequestBodyAsJson) {
 	@GET
 	@Consumes({ MediaType.APPLICATION_JSON })
 	@Produces({ MediaType.APPLICATION_JSON })
+	@ApiOperation(value = "List Floating Rates", httpMethod = "GET", notes = "Lists Floating Rates")
+	@ApiResponses({@ApiResponse(code = 200, message = "OK", response = FloatingRatesApiResourceSwagger.GetFloatingRatesResponse.class, responseContainer = "List")})
 	public String retrieveAll(@Context final UriInfo uriInfo) {
 		this.context.authenticatedUser().validateHasReadPermission(
 				RESOURCE_NAME);
@@ -111,8 +111,10 @@ public String retrieveAll(@Context final UriInfo uriInfo) {
 	@Path("{floatingRateId}")
 	@Consumes({ MediaType.APPLICATION_JSON })
 	@Produces({ MediaType.APPLICATION_JSON })
+	@ApiOperation(value = "Retrieve Floating Rate", httpMethod = "GET", notes = "Retrieves Floating Rate")
+	@ApiResponses({@ApiResponse(code = 200, message = "OK", response = FloatingRatesApiResourceSwagger.GetFloatingRatesFloatingRateIdResponse.class)})
 	public String retrieveOne(
-			@PathParam("floatingRateId") final Long floatingRateId,
+			@PathParam("floatingRateId") @ApiParam(value = "floatingRateId") final Long floatingRateId,
 			@Context final UriInfo uriInfo) {
 		this.context.authenticatedUser().validateHasReadPermission(
 				RESOURCE_NAME);
@@ -128,9 +130,12 @@ public String retrieveOne(
 	@Path("{floatingRateId}")
 	@Consumes({ MediaType.APPLICATION_JSON })
 	@Produces({ MediaType.APPLICATION_JSON })
+	@ApiOperation(value = "Update Floating Rate", httpMethod = "PUT", notes = "Updates new Floating Rate. Rate Periods in the past cannot be modified. All the future rateperiods would be replaced with the new ratePeriods data sent.")
+	@ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = FloatingRatesApiResourceSwagger.PutFloatingRatesFloatingRateIdRequest.class)})
+	@ApiResponses({@ApiResponse(code = 200, message = "OK", response = FloatingRatesApiResourceSwagger.PutFloatingRatesFloatingRateIdResponse.class)})
 	public String updateFloatingRate(
-			@PathParam("floatingRateId") final Long floatingRateId,
-			final String apiRequestBodyAsJson) {
+			@PathParam("floatingRateId") @ApiParam(value = "floatingRateId") final Long floatingRateId,
+			@ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 		final CommandWrapper commandRequest = new CommandWrapperBuilder()
 				.updateFloatingRate(floatingRateId)
 				.withJson(apiRequestBodyAsJson).build();
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/floatingrates/api/FloatingRatesApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/floatingrates/api/FloatingRatesApiResourceSwagger.java
new file mode 100644
index 000000000..258a91312
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/floatingrates/api/FloatingRatesApiResourceSwagger.java
@@ -0,0 +1,171 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.portfolio.floatingrates.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Set;
+
+/**
+ * Created by Chirag Gupta on 12/17/17.
+ */
+final class FloatingRatesApiResourceSwagger {
+    private FloatingRatesApiResourceSwagger() {
+    }
+
+    @ApiModel(value = "PostFloatingRatesRequest")
+    public final static class PostFloatingRatesRequest {
+        private PostFloatingRatesRequest() {
+        }
+
+        final class PostFloatingRatesRatePeriods {
+            private PostFloatingRatesRatePeriods() {
+            }
+
+            @ApiModelProperty(example = "19 November 2015")
+            public String fromDate;
+            @ApiModelProperty(example = "10")
+            public Double interestRate;
+            @ApiModelProperty(example = "en")
+            public String locale;
+            @ApiModelProperty(example = "dd MMMM yyyy")
+            public String dateFormat;
+        }
+
+        @ApiModelProperty(example = "Floating Rate 1")
+        public String name;
+        @ApiModelProperty(example = "true")
+        public Boolean isBaseLendingRate;
+        @ApiModelProperty(example = "true")
+        public Boolean isActive;
+        public Set<PostFloatingRatesRatePeriods> ratePeriods;
+    }
+
+    @ApiModel(value = "PostFloatingRatesResponse")
+    public final static class PostFloatingRatesResponse {
+        private PostFloatingRatesResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer resourceId;
+    }
+
+    @ApiModel(value = "GetFloatingRatesResponse")
+    public final static class GetFloatingRatesResponse {
+        private GetFloatingRatesResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer id;
+        @ApiModelProperty(example = "Floating Rate 1")
+        public String name;
+        @ApiModelProperty(example = "true")
+        public Boolean isBaseLendingRate;
+        @ApiModelProperty(example = "true")
+        public Boolean isActive;
+        @ApiModelProperty(example = "mifos")
+        public String createdBy;
+        @ApiModelProperty(example = "Nov 18, 2015")
+        public String createdOn;
+        @ApiModelProperty(example = "mifos")
+        public String modifiedBy;
+        @ApiModelProperty(example = "Nov 18, 2015")
+        public String modifiedOn;
+    }
+
+    @ApiModel(value = "GetFloatingRatesFloatingRateIdResponse")
+    public final static class GetFloatingRatesFloatingRateIdResponse {
+        private GetFloatingRatesFloatingRateIdResponse() {
+        }
+
+        final class GetFloatingRatesRatePeriods {
+            private GetFloatingRatesRatePeriods() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "Dec 15, 2015")
+            public String fromDate;
+            @ApiModelProperty(example = "11")
+            public Double interestRate;
+            @ApiModelProperty(example = "false")
+            public Boolean isDifferentialToBaseLendingRate;
+            @ApiModelProperty(example = "true")
+            public Boolean isActive;
+            @ApiModelProperty(example = "mifos")
+            public String createdBy;
+            @ApiModelProperty(example = "Nov 18, 2015")
+            public String createdOn;
+            @ApiModelProperty(example = "mifos")
+            public String modifiedBy;
+            @ApiModelProperty(example = "Nov 18, 2015")
+            public String modifiedOn;
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer id;
+        @ApiModelProperty(example = "Floating Rate 1")
+        public String name;
+        @ApiModelProperty(example = "true")
+        public Boolean isBaseLendingRate;
+        @ApiModelProperty(example = "true")
+        public Boolean isActive;
+        @ApiModelProperty(example = "mifos")
+        public String createdBy;
+        @ApiModelProperty(example = "Nov 18, 2015")
+        public String createdOn;
+        @ApiModelProperty(example = "mifos")
+        public String modifiedBy;
+        @ApiModelProperty(example = "Nov 18, 2015")
+        public String modifiedOn;
+        public Set<GetFloatingRatesRatePeriods> ratePeriods;
+    }
+
+    @ApiModel(value = "PutFloatingRatesFloatingRateIdRequest")
+    public final static class PutFloatingRatesFloatingRateIdRequest {
+        private PutFloatingRatesFloatingRateIdRequest() {
+        }
+
+        @ApiModelProperty(example = "Floating Rate 1")
+        public String name;
+        @ApiModelProperty(example = "true")
+        public Boolean isBaseLendingRate;
+        @ApiModelProperty(example = "true")
+        public Boolean isActive;
+        public Set<PostFloatingRatesRequest.PostFloatingRatesRatePeriods> ratePeriods;
+    }
+
+    @ApiModel(value = "PutFloatingRatesFloatingRateIdResponse")
+    public final static class PutFloatingRatesFloatingRateIdResponse {
+        private PutFloatingRatesFloatingRateIdResponse() {
+        }
+
+        final class PutFloatingRatesChanges {
+            private PutFloatingRatesChanges() {
+            }
+
+            public Set<PostFloatingRatesRequest.PostFloatingRatesRatePeriods> ratePeriods;
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer resourceId;
+        public PutFloatingRatesChanges changes;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/fund/api/FundsApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/fund/api/FundsApiResource.java
index f2967f8c6..4e0ae4cb9 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/fund/api/FundsApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/fund/api/FundsApiResource.java
@@ -18,22 +18,7 @@
  */
 package org.apache.fineract.portfolio.fund.api;
 
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.UriInfo;
-
+import io.swagger.annotations.*;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
 import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
@@ -49,9 +34,19 @@
 import org.springframework.context.annotation.Scope;
 import org.springframework.stereotype.Component;
 
+import javax.ws.rs.*;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.UriInfo;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
 @Path("/funds")
 @Component
 @Scope("singleton")
+@Api(value = "Funds", description = "")
 public class FundsApiResource {
 
     /**
@@ -81,6 +76,8 @@ public FundsApiResource(final PlatformSecurityContext context, final FundReadPla
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
+    @ApiOperation(value = "Retrieve Funds", httpMethod = "GET", notes = "Returns the list of funds.\n" + "\n" + "Example Requests:\n" + "\n" + "funds")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = FundsApiResourceSwagger.GetFundsResponse.class, responseContainer = "List")})
     public String retrieveFunds(@Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
@@ -94,7 +91,10 @@ public String retrieveFunds(@Context final UriInfo uriInfo) {
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String createFund(final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Create a Fund", httpMethod = "POST", notes = "Creates a Fund")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = FundsApiResourceSwagger.PostFundsRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = FundsApiResourceSwagger.PostFundsResponse.class)})
+    public String createFund(@ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().createFund().withJson(apiRequestBodyAsJson).build();
 
@@ -107,7 +107,9 @@ public String createFund(final String apiRequestBodyAsJson) {
     @Path("{fundId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retreiveFund(@PathParam("fundId") final Long fundId, @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Retrieve a Fund", httpMethod = "GET", notes = "Returns the details of a Fund.\n" + "\n" + "Example Requests:\n" + "\n" + "funds/1")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = FundsApiResourceSwagger.GetFundsResponse.class)})
+    public String retreiveFund(@PathParam("fundId") @ApiParam(value = "fundId") final Long fundId, @Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
 
@@ -121,7 +123,10 @@ public String retreiveFund(@PathParam("fundId") final Long fundId, @Context fina
     @Path("{fundId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String updateFund(@PathParam("fundId") final Long fundId, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Update a Fund", httpMethod = "PUT", notes = "Updates the details of a fund.")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = FundsApiResourceSwagger.PutFundsFundIdRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = FundsApiResourceSwagger.PutFundsFundIdResponse.class)})
+    public String updateFund(@PathParam("fundId") @ApiParam(value = "fundId") final Long fundId, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().updateFund(fundId).withJson(apiRequestBodyAsJson).build();
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/fund/api/FundsApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/fund/api/FundsApiResourceSwagger.java
new file mode 100644
index 000000000..f15a6863c
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/fund/api/FundsApiResourceSwagger.java
@@ -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.
+ */
+package org.apache.fineract.portfolio.fund.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * Created by Chirag Gupta on 12/08/17.
+ */
+final class FundsApiResourceSwagger {
+    private FundsApiResourceSwagger() {
+    }
+
+    @ApiModel(value = "GetFundsResponse")
+    public static final class GetFundsResponse {
+        private GetFundsResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer id;
+        @ApiModelProperty(example = "EU Agri Fund")
+        public String name;
+    }
+
+    @ApiModel(value = "PostFundsRequest")
+    public static final class PostFundsRequest {
+        private PostFundsRequest() {
+        }
+
+        @ApiModelProperty(example = "EU Agri Fund")
+        public String name;
+    }
+
+    @ApiModel(value = "PostFundsResponse")
+    public static final class PostFundsResponse {
+        private PostFundsResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer resourceId;
+    }
+
+    @ApiModel(value = "PutFundsFundIdRequest")
+    public static final class PutFundsFundIdRequest {
+        private PutFundsFundIdRequest() {
+        }
+
+        @ApiModelProperty(example = "EU Agri Fund (2010-2020)")
+        public String name;
+    }
+
+    @ApiModel(value = "PutFundsFundIdResponse")
+    public static final class PutFundsFundIdResponse {
+        private PutFundsFundIdResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer resourceId;
+        public PutFundsFundIdRequest changes;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/api/CentersApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/api/CentersApiResource.java
index c590fcdd4..b133d5ceb 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/api/CentersApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/api/CentersApiResource.java
@@ -18,6 +18,8 @@
  */
 package org.apache.fineract.portfolio.group.api;
 
+import com.google.gson.JsonElement;
+import io.swagger.annotations.*;
 import java.io.InputStream;
 import java.util.*;
 
@@ -80,11 +82,11 @@
 import org.springframework.context.annotation.Scope;
 import org.springframework.stereotype.Component;
 
-import com.google.gson.JsonElement;
 
 @Path("/centers")
 @Component
 @Scope("singleton")
+@Api(value = "Centers", description = "Centers along with Groups are used to provided a distinctive banking distribution channel used in microfinance. Its common in areas such as Southern Asia to use Centers and Group as administrative units in grameen style lending. Typically groups will contain one to five people and centers themselves will be made of anywhere between 2-10 groups.")
 public class CentersApiResource {
 
     private final PlatformSecurityContext context;
@@ -136,9 +138,11 @@ public CentersApiResource(final PlatformSecurityContext context, final CenterRea
     @Path("template")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveTemplate(@Context final UriInfo uriInfo, @QueryParam("command") final String commandParam,
-            @QueryParam("officeId") final Long officeId,
-            @DefaultValue("false") @QueryParam("staffInSelectedOfficeOnly") final boolean staffInSelectedOfficeOnly) {
+    @ApiOperation(value = "Retrieve a Center Template", httpMethod = "GET", notes = "Retrieves a Center Template\n\n" + "Example Requests:\n\n" + "\n\n" + "centers/template\n\n" + "\n\n" + "centers/template?officeId=2")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = CentersApiResourceSwagger.GetCentersTemplateResponse.class)})
+    public String retrieveTemplate(@Context final UriInfo uriInfo, @QueryParam("command") @ApiParam(value = "command") final String commandParam,
+            @QueryParam("officeId") @ApiParam(value = "officeId") final Long officeId,
+            @DefaultValue("false") @QueryParam("staffInSelectedOfficeOnly") @ApiParam(value = "staffInSelectedOfficeOnly") final boolean staffInSelectedOfficeOnly) {
 
         this.context.authenticatedUser().validateHasReadPermission(GroupingTypesApiConstants.CENTER_RESOURCE_NAME);
 
@@ -161,14 +165,16 @@ public String retrieveTemplate(@Context final UriInfo uriInfo, @QueryParam("comm
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveAll(@Context final UriInfo uriInfo, @QueryParam("sqlSearch") final String sqlSearch,
-            @QueryParam("officeId") final Long officeId, @QueryParam("staffId") final Long staffId,
-            @QueryParam("externalId") final String externalId, @QueryParam("name") final String name,
-            @QueryParam("underHierarchy") final String hierarchy, @QueryParam("paged") final Boolean paged,
-            @QueryParam("offset") final Integer offset, @QueryParam("limit") final Integer limit,
-            @QueryParam("orderBy") final String orderBy, @QueryParam("sortOrder") final String sortOrder,
-            @QueryParam("meetingDate") final DateParam meetingDateParam, @QueryParam("dateFormat") final String dateFormat,
-            @QueryParam("locale") final String locale) {
+    @ApiOperation(value = "List Centers", httpMethod = "GET", notes = "The default implementation supports pagination and sorting with the default pagination size set to 200 records. The parameter limit with value -1 will return all entries.\n\n" + "Example Requests:\n\n" + "\n\n" + "centers\n\n" + "\n\n" + "centers?fields=name,officeName,joinedDate\n\n" + "\n\n" + "centers?offset=10&limit=50\n\n" + "\n\n" + "centers?orderBy=name&sortOrder=DESC")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = CentersApiResourceSwagger.GetCentersResponse.class)})
+    public String retrieveAll(@Context final UriInfo uriInfo, @QueryParam("sqlSearch") @ApiParam(value = "sqlSearch") final String sqlSearch,
+            @QueryParam("officeId") @ApiParam(value = "officeId") final Long officeId, @QueryParam("staffId") @ApiParam(value = "staffId") final Long staffId,
+            @QueryParam("externalId") @ApiParam(value = "externalId") final String externalId, @QueryParam("name") @ApiParam(value = "name") final String name,
+            @QueryParam("underHierarchy") @ApiParam(value = "underHierarchy") final String hierarchy, @QueryParam("paged") @ApiParam(value = "paged") final Boolean paged,
+            @QueryParam("offset") @ApiParam(value = "offset") final Integer offset, @QueryParam("limit") @ApiParam(value = "limit") final Integer limit,
+            @QueryParam("orderBy") @ApiParam(value = "orderBy") final String orderBy, @QueryParam("sortOrder") @ApiParam(value = "sortOrder") final String sortOrder,
+            @QueryParam("meetingDate") @ApiParam(value = "meetingDate") final DateParam meetingDateParam, @QueryParam("dateFormat") @ApiParam(value = "dateFormat") final String dateFormat,
+            @QueryParam("locale") @ApiParam(value = "locale") final String locale) {
 
         this.context.authenticatedUser().validateHasReadPermission(GroupingTypesApiConstants.CENTER_RESOURCE_NAME);
         final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
@@ -196,8 +202,10 @@ public String retrieveAll(@Context final UriInfo uriInfo, @QueryParam("sqlSearch
     @Path("{centerId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveOne(@Context final UriInfo uriInfo, @PathParam("centerId") final Long centerId,
-            @DefaultValue("false") @QueryParam("staffInSelectedOfficeOnly") final boolean staffInSelectedOfficeOnly) {
+    @ApiOperation(value = "Retrieve a Center", httpMethod = "GET", notes = "Retrieves a Center\n\n" + "Example Requests:\n\n" + "\n\n" + "centers/1\n\n" + "\n\n" + "centers/1?associations=groupMembers")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = CentersApiResourceSwagger.GetCentersCenterIdResponse.class)})
+    public String retrieveOne(@Context final UriInfo uriInfo, @PathParam("centerId") @ApiParam(value = "centerId") final Long centerId,
+            @DefaultValue("false") @QueryParam("staffInSelectedOfficeOnly") @ApiParam(value = "staffInSelectedOfficeOnly") final boolean staffInSelectedOfficeOnly) {
 
         this.context.authenticatedUser().validateHasReadPermission(GroupingTypesApiConstants.CENTER_RESOURCE_NAME);
         final Set<String> associationParameters = ApiParameterHelper.extractAssociationsForResponseIfProvided(uriInfo.getQueryParameters());
@@ -245,7 +253,10 @@ public String retrieveOne(@Context final UriInfo uriInfo, @PathParam("centerId")
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String create(final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Create a Center", httpMethod = "POST", notes = "Creates a Center\n\n" + "Mandatory Fields: name, officeId, active, activationDate (if active=true)\n\n" + "Optional Fields: externalId, staffId, groupMembers")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = CentersApiResourceSwagger.PostCentersRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = CentersApiResourceSwagger.PostCentersResponse.class)})
+    public String create(@ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder() //
                 .createCenter() //
@@ -260,7 +271,10 @@ public String create(final String apiRequestBodyAsJson) {
     @Path("{centerId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String update(@PathParam("centerId") final Long centerId, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Update a Center", httpMethod = "PUT", notes = "Updates a Center")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = CentersApiResourceSwagger.PutCentersCenterIdRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = CentersApiResourceSwagger.PutCentersCenterIdResponse.class)})
+    public String update(@PathParam("centerId") @ApiParam(value = "centerId") final Long centerId, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder() //
                 .updateCenter(centerId) //
@@ -274,7 +288,9 @@ public String update(@PathParam("centerId") final Long centerId, final String ap
     @Path("{centerId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String delete(@PathParam("centerId") final Long centerId) {
+    @ApiOperation(value = "Delete a Center", httpMethod = "DELETE", notes = "A Center can be deleted if it is in pending state and has no association - groups, loans or savings")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = CentersApiResourceSwagger.DeleteCentersCenterIdResponse.class)})
+    public String delete(@PathParam("centerId") @ApiParam(value = "centerId") final Long centerId) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder() //
                 .deleteCenter(centerId) //
@@ -287,8 +303,11 @@ public String delete(@PathParam("centerId") final Long centerId) {
     @Path("{centerId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String activate(@PathParam("centerId") final Long centerId, @QueryParam("command") final String commandParam,
-            final String apiRequestBodyAsJson, @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Activate a Center | Generate Collection Sheet | Save Collection Sheet | Close a Center | Associate Groups | Disassociate Groups", httpMethod = "POST", notes = "Activate a Center:\n\n" + "Centers can be created in a Pending state. This API exists to enable center activation. If the center happens to be already active, this API will result in an error.\n\n" + "Close a Center:\n\n" + "Centers can be closed if they don't have any non-closed groups or saving accounts. If the Center has any active groups or savings accounts, this API will result in an error.\n\n" + "Associate Groups:\n\n" + "This API allows associating existing groups to a center. The groups are listed from the office to which the center is associated. If group(s) is already associated with a center, this API will result in an error.\n\n" + "Disassociate Groups:\n\n" + "This API allows to disassociate groups from a center.\n\n" + "Generate Collection Sheet:\n\n" + "This Api retrieves repayment details of all jlg loans under a center as on a specified meeting date.\n\n" + "Save Collection Sheet:\n\n" + "This Api allows the loan officer to perform bulk repayments of JLG loans for a center on a given meeting date.\n\n" + "Showing Request/Response for Close a Center")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = CentersApiResourceSwagger.PostCentersCenterIdRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = CentersApiResourceSwagger.PostCentersCenterIdResponse.class)})
+    public String activate(@PathParam("centerId") @ApiParam(value = "centerId") final Long centerId, @QueryParam("command") @ApiParam(value = "command") final String commandParam,
+           @ApiParam(hidden = true) final String apiRequestBodyAsJson, @Context final UriInfo uriInfo) {
 
         final CommandWrapperBuilder builder = new CommandWrapperBuilder().withJson(apiRequestBodyAsJson);
 
@@ -335,7 +354,9 @@ private boolean is(final String commandParam, final String commandValue) {
     @Path("{centerId}/accounts")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveGroupAccount(@PathParam("centerId") final Long centerId, @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Retrieve Center accounts overview", httpMethod = "GET", notes = "An example of how a savings summary for a Center can be provided. This is requested in a specific use case of the reference application.\n\n" + "It is quite reasonable to add resources like this to simplify User Interface development.\n\n" + "\n\n" + "Example Requests:\n\n" + "\n\n" + "centers/9/accounts")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = CentersApiResourceSwagger.GetCentersCenterIdAccountsResponse.class)})
+    public String retrieveGroupAccount(@PathParam("centerId") @ApiParam(value = "centerId") final Long centerId, @Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(GroupingTypesApiConstants.CENTER_RESOURCE_NAME);
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/api/CentersApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/api/CentersApiResourceSwagger.java
new file mode 100644
index 000000000..7a510c626
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/api/CentersApiResourceSwagger.java
@@ -0,0 +1,343 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.portfolio.group.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.time.LocalDate;
+import java.util.Set;
+
+/**
+ * Created by Chirag Gupta on 12/18/17.
+ */
+final class CentersApiResourceSwagger {
+    private CentersApiResourceSwagger() {
+    }
+
+    @ApiModel(value = "GetCentersTemplateResponse")
+    public final static class GetCentersTemplateResponse {
+        private GetCentersTemplateResponse() {
+        }
+
+        final class GetCentersOfficeOptions {
+            private GetCentersOfficeOptions() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "Head Office")
+            public String name;
+            @ApiModelProperty(example = "Head Office")
+            public String nameDecorated;
+        }
+
+        final class GetCentersStaffOptions {
+            private GetCentersStaffOptions() {
+            }
+
+            @ApiModelProperty(example = "2")
+            public Integer id;
+            @ApiModelProperty(example = "D, Mary")
+            public String displayName;
+        }
+
+
+        @ApiModelProperty(example = "false")
+        public Boolean active;
+        @ApiModelProperty(example = "[2013, 4, 18]")
+        public LocalDate activationDate;
+        @ApiModelProperty(example = "2")
+        public Integer officeId;
+        public Set<GetCentersOfficeOptions> officeOptions;
+        public Set<GetCentersStaffOptions> staffOptions;
+    }
+
+    @ApiModel(value = "GetCentersResponse")
+    public final static class GetCentersResponse {
+        private GetCentersResponse() {
+        }
+
+        final class GetCentersPageItems {
+            private GetCentersPageItems() {
+            }
+
+            final class GetCentersStatus {
+                private GetCentersStatus() {
+                }
+
+                @ApiModelProperty(example = "100")
+                public Integer id;
+                @ApiModelProperty(example = "groupingStatusType.pending")
+                public String code;
+                @ApiModelProperty(example = "Pending")
+                public String value;
+            }
+
+            @ApiModelProperty(example = "2")
+            public Integer id;
+            public GetCentersStatus status;
+            @ApiModelProperty(example = "false")
+            public Boolean active;
+            @ApiModelProperty(example = "Center 1")
+            public String name;
+            @ApiModelProperty(example = "1")
+            public Integer officeId;
+            @ApiModelProperty(example = "Head Office")
+            public String officeName;
+            @ApiModelProperty(example = ".2.")
+            public String hierarchy;
+        }
+
+        @ApiModelProperty(example = "2")
+        public Integer totalFilteredRecords;
+        public Set<GetCentersPageItems> pageItems;
+    }
+
+    @ApiModel(value = "GetCentersCenterIdResponse")
+    public final static class GetCentersCenterIdResponse {
+        private GetCentersCenterIdResponse() {
+        }
+
+        @ApiModelProperty(example = "8")
+        public Integer id;
+        public GetCentersResponse.GetCentersPageItems.GetCentersStatus status;
+        @ApiModelProperty(example = "false")
+        public Boolean active;
+        @ApiModelProperty(example = "First Center (No groups)")
+        public String name;
+        @ApiModelProperty(example = "1")
+        public Integer officeId;
+        @ApiModelProperty(example = "Head Office")
+        public String officeName;
+        @ApiModelProperty(example = ".8.")
+        public String hierarchy;
+    }
+
+    @ApiModel(value = "PostCentersRequest")
+    public final static class PostCentersRequest {
+        private PostCentersRequest() {
+        }
+
+        @ApiModelProperty(example = "First Center (No groups)")
+        public String name;
+        @ApiModelProperty(example = "1")
+        public Integer officeId;
+        @ApiModelProperty(example = "false")
+        public Boolean active;
+    }
+
+    @ApiModel(value = "PostCentersResponse")
+    public final static class PostCentersResponse {
+        private PostCentersResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer officeId;
+        @ApiModelProperty(example = "8")
+        public Integer groupId;
+        @ApiModelProperty(example = "8")
+        public Integer resourceId;
+    }
+
+    @ApiModel(value = "PutCentersCenterIdRequest")
+    public final static class PutCentersCenterIdRequest {
+        private PutCentersCenterIdRequest() {
+        }
+
+        @ApiModelProperty(example = "First Center (No groups)")
+        public String name;
+    }
+
+    @ApiModel(value = "PutCentersCenterIdResponse")
+    public final static class PutCentersCenterIdResponse {
+        private PutCentersCenterIdResponse() {
+        }
+
+        final class PutCentersChanges {
+            private PutCentersChanges() {
+            }
+
+            @ApiModelProperty(example = "First Center (No groups) - modified")
+            public String name;
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer officeId;
+        @ApiModelProperty(example = "8")
+        public Integer groupId;
+        @ApiModelProperty(example = "8")
+        public Integer resourceId;
+        public PutCentersChanges changes;
+    }
+
+    @ApiModel(value = "DeleteCentersCenterIdResponse")
+    public final static class DeleteCentersCenterIdResponse {
+        private DeleteCentersCenterIdResponse() {
+        }
+
+        final class DeleteCentersChanges {
+            private DeleteCentersChanges() {
+            }
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer resourceId;
+        public DeleteCentersChanges changes;
+    }
+
+    @ApiModel(value = "PostCentersCenterIdRequest")
+    public final static class PostCentersCenterIdRequest {
+        private PostCentersCenterIdRequest() {
+        }
+
+        @ApiModelProperty(example = "32")
+        public Integer closureReasonId;
+        @ApiModelProperty(example = "05 May 2014")
+        public String closureDate;
+        @ApiModelProperty(example = "en")
+        public String locale;
+        @ApiModelProperty(example = "dd MMMM yyyy")
+        public String dateFormat;
+    }
+
+    @ApiModel(value = "PostCentersCenterIdResponse")
+    public final static class PostCentersCenterIdResponse {
+        private PostCentersCenterIdResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer resourceId;
+    }
+
+    @ApiModel(value = "GetCentersCenterIdAccountsResponse")
+    public final static class GetCentersCenterIdAccountsResponse {
+        private GetCentersCenterIdAccountsResponse() {
+        }
+
+        final class GetCentersSavingsAccounts {
+            private GetCentersSavingsAccounts() {
+            }
+
+            final class GetCentersCenterIdStatus {
+                private GetCentersCenterIdStatus() {
+                }
+
+                @ApiModelProperty(example = "100")
+                public Integer id;
+                @ApiModelProperty(example = "savingsAccountStatusType.submitted.and.pending.approval")
+                public String code;
+                @ApiModelProperty(example = "Submitted and pending approval")
+                public String value;
+                @ApiModelProperty(example = "true")
+                public Boolean submittedAndPendingApproval;
+                @ApiModelProperty(example = "false")
+                public Boolean approved;
+                @ApiModelProperty(example = "false")
+                public Boolean rejected;
+                @ApiModelProperty(example = "false")
+                public Boolean withdrawnByApplicant;
+                @ApiModelProperty(example = "false")
+                public Boolean active;
+                @ApiModelProperty(example = "false")
+                public Boolean closed;
+                @ApiModelProperty(example = "false")
+                public Boolean prematureClosed;
+                @ApiModelProperty(example = "false")
+                public Boolean transferInProgress;
+                @ApiModelProperty(example = "false")
+                public Boolean transferOnHold;
+            }
+
+            final class GetCentersCenterIdCurrency {
+                private GetCentersCenterIdCurrency() {
+                }
+
+                @ApiModelProperty(example = "USD")
+                public String code;
+                @ApiModelProperty(example = "US Dollar")
+                public String name;
+                @ApiModelProperty(example = "2")
+                public Integer decimalPlaces;
+                @ApiModelProperty(example = "0")
+                public Integer inMultiplesOf;
+                @ApiModelProperty(example = "$")
+                public String displaySymbol;
+                @ApiModelProperty(example = "currency.USD")
+                public String nameCode;
+                @ApiModelProperty(example = "US Dollar ($)")
+                public String displayLabel;
+            }
+
+            final class GetCentersAccountType {
+                private GetCentersAccountType() {
+                }
+
+                @ApiModelProperty(example = "2")
+                public Integer id;
+                @ApiModelProperty(example = "accountType.group")
+                public String code;
+                @ApiModelProperty(example = "Group")
+                public String value;
+            }
+
+            final class GetCentersTimeline {
+                private GetCentersTimeline() {
+                }
+
+                @ApiModelProperty(example = "[2014, 5, 1]")
+                public LocalDate submittedOnDate;
+                @ApiModelProperty(example = "mifos")
+                public String submittedByUsername;
+                @ApiModelProperty(example = "App")
+                public String submittedByFirstname;
+                @ApiModelProperty(example = "Administrator")
+                public String submittedByLastname;
+            }
+
+            final class GetCentersDepositType {
+                private GetCentersDepositType() {
+                }
+
+                @ApiModelProperty(example = "100")
+                public Integer id;
+                @ApiModelProperty(example = "depositAccountType.savingsDeposit")
+                public String code;
+                @ApiModelProperty(example = "Savings")
+                public String value;
+            }
+
+            @ApiModelProperty(example = "16")
+            public Integer id;
+            @ApiModelProperty(example = "000000016")
+            public Long accountNo;
+            @ApiModelProperty(example = "1")
+            public Integer productId;
+            @ApiModelProperty(example = "Voluntary savings")
+            public String productName;
+            public GetCentersCenterIdStatus status;
+            public GetCentersCenterIdCurrency currency;
+            public GetCentersAccountType accountType;
+            public GetCentersTimeline timeline;
+            public GetCentersDepositType depositType;
+        }
+
+        public Set<GetCentersSavingsAccounts> savingsAccounts;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/api/GroupsApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/api/GroupsApiResource.java
index 10d369d67..9a8f32bb0 100755
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/api/GroupsApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/api/GroupsApiResource.java
@@ -18,6 +18,8 @@
  */
 package org.apache.fineract.portfolio.group.api;
 
+import com.google.gson.JsonElement;
+import io.swagger.annotations.*;
 import java.io.InputStream;
 import java.util.Arrays;
 import java.util.Collection;
@@ -88,11 +90,11 @@
 import org.springframework.stereotype.Component;
 import org.springframework.util.CollectionUtils;
 
-import com.google.gson.JsonElement;
 
 @Path("/groups")
 @Component
 @Scope("singleton")
+@Api(value = "Groups", description = "Groups are used to provide a distinctive banking distribution channel used in microfinances throughout the world. The Group is an administrative unit. It can contain as few as 5 people or as many as 40 depending on how its used.\n\n" + "\n\n" + "Different styles of group lending - Joint-Liability Group, Grameen Model (Center-Group), Self-Help Groups, Village/Communal Banks)")
 public class GroupsApiResource {
 
     private final PlatformSecurityContext context;
@@ -155,10 +157,12 @@ public GroupsApiResource(final PlatformSecurityContext context, final GroupReadP
     @Path("template")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveTemplate(@Context final UriInfo uriInfo, @QueryParam("officeId") final Long officeId,
-            @QueryParam("center") final boolean isCenterGroup, @QueryParam("centerId") final Long centerId,
-            @QueryParam("command") final String commandParam,
-            @DefaultValue("false") @QueryParam("staffInSelectedOfficeOnly") final boolean staffInSelectedOfficeOnly) {
+    @ApiOperation(value = "Retrieve Group Template", httpMethod = "GET", notes = "This is a convenience resource. It can be useful when building maintenance user interface screens for client applications. The template data returned consists of any or all of:\n\n" + "\n\n" + "Field Defaults\n\n" + "Allowed Value Lists\n\n" + "Example Requests:\n\n" + "\n\n" + "groups/template\n\n" + "\n\n" + "groups/template?officeId=2\n\n" + "\n\n" + "groups/template?centerId=1\n\n" + "\n\n" + "groups/template?centerId=1&staffInSelectedOfficeOnly=true")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = GroupsApiResourceSwagger.GetGroupsTemplateResponse.class)})
+    public String retrieveTemplate(@Context final UriInfo uriInfo, @QueryParam("officeId") @ApiParam(value = "officeId") final Long officeId,
+            @QueryParam("center") @ApiParam(value = "center") final boolean isCenterGroup, @QueryParam("centerId") @ApiParam(value = "centerId") final Long centerId,
+            @QueryParam("command") @ApiParam(value = "command") final String commandParam,
+            @DefaultValue("false") @QueryParam("staffInSelectedOfficeOnly") @ApiParam(value = "staffInSelectedOfficeOnly") final boolean staffInSelectedOfficeOnly) {
 
         this.context.authenticatedUser().validateHasReadPermission(GroupingTypesApiConstants.GROUP_RESOURCE_NAME);
 
@@ -191,13 +195,15 @@ public String retrieveTemplate(@Context final UriInfo uriInfo, @QueryParam("offi
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveAll(@Context final UriInfo uriInfo, @QueryParam("sqlSearch") final String sqlSearch,
-            @QueryParam("officeId") final Long officeId, @QueryParam("staffId") final Long staffId,
-            @QueryParam("externalId") final String externalId, @QueryParam("name") final String name,
-            @QueryParam("underHierarchy") final String hierarchy, @QueryParam("paged") final Boolean paged,
-            @QueryParam("offset") final Integer offset, @QueryParam("limit") final Integer limit,
-            @QueryParam("orderBy") final String orderBy, @QueryParam("sortOrder") final String sortOrder, 
-            @QueryParam("orphansOnly") final Boolean orphansOnly) {
+    @ApiOperation(value = "List Groups", httpMethod = "GET", notes = "The default implementation of listing Groups returns 200 entries with support for pagination and sorting. Using the parameter limit with value -1 returns all entries.\n\n" + "Example Requests:\n\n" + "\n\n" + "groups\n\n" + "\n\n" + "groups?fields=name,officeName,joinedDate\n\n" + "\n\n" + "groups?offset=10&limit=50\n\n" + "\n\n" + "groups?orderBy=name&sortOrder=DESC")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = GroupsApiResourceSwagger.GetGroupsResponse.class)})
+    public String retrieveAll(@Context final UriInfo uriInfo, @QueryParam("sqlSearch") @ApiParam(value = "sqlSearch") final String sqlSearch,
+            @QueryParam("officeId") @ApiParam(value = "officeId") final Long officeId, @QueryParam("staffId") @ApiParam(value = "staffId") final Long staffId,
+            @QueryParam("externalId") @ApiParam(value = "externalId") final String externalId, @QueryParam("name") @ApiParam(value = "name") final String name,
+            @QueryParam("underHierarchy") @ApiParam(value = "underHierarchy") final String hierarchy, @QueryParam("paged") @ApiParam(value = "paged") final Boolean paged,
+            @QueryParam("offset")@ApiParam(value = "offset") final Integer offset, @QueryParam("limit") @ApiParam(value = "limit") final Integer limit,
+            @QueryParam("orderBy") @ApiParam(value = "orderBy") final String orderBy, @QueryParam("sortOrder") @ApiParam(value = "sortOrder") final String sortOrder,
+            @QueryParam("orphansOnly") @ApiParam(value = "orphansOnly") final Boolean orphansOnly) {
 
         this.context.authenticatedUser().validateHasReadPermission(GroupingTypesApiConstants.GROUP_RESOURCE_NAME);
         final PaginationParameters parameters = PaginationParameters.instance(paged, offset, limit, orderBy, sortOrder);
@@ -218,9 +224,11 @@ public String retrieveAll(@Context final UriInfo uriInfo, @QueryParam("sqlSearch
     @Path("{groupId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveOne(@Context final UriInfo uriInfo, @PathParam("groupId") final Long groupId,
-            @DefaultValue("false") @QueryParam("staffInSelectedOfficeOnly") final boolean staffInSelectedOfficeOnly,
-            @QueryParam("roleId") final Long roleId) {
+    @ApiOperation(value = "Retrieve a Group", httpMethod = "GET", notes = "Retrieve group information.\n\n" + "Example Requests:\n\n" + "\n\n" + "groups/1\n\n" + "\n\n" + "groups/1?associations=clientMembers")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = GroupsApiResourceSwagger.GetGroupsGroupIdResponse.class)})
+    public String retrieveOne(@Context final UriInfo uriInfo, @PathParam("groupId") @ApiParam(value = "groupId") final Long groupId,
+            @DefaultValue("false") @QueryParam("staffInSelectedOfficeOnly") @ApiParam(value = "staffInSelectedOfficeOnly") final boolean staffInSelectedOfficeOnly,
+            @QueryParam("roleId") @ApiParam(value = "roleId") final Long roleId) {
 
         this.context.authenticatedUser().validateHasReadPermission(GroupingTypesApiConstants.GROUP_RESOURCE_NAME);
         final Set<String> associationParameters = ApiParameterHelper.extractAssociationsForResponseIfProvided(uriInfo.getQueryParameters());
@@ -315,7 +323,10 @@ public String retrieveOne(@Context final UriInfo uriInfo, @PathParam("groupId")
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String create(final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Create a Group", httpMethod = "POST", notes = "Creates a Group\n\n" + "Mandatory Fields: name, officeId, active, activationDate (if active=true)\n\n" + "Optional Fields: externalId, staffId, clientMembers")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = GroupsApiResourceSwagger.PostGroupsRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = GroupsApiResourceSwagger.PostGroupsResponse.class)})
+    public String create(@ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder() //
                 .createGroup() //
@@ -329,7 +340,10 @@ public String create(final String apiRequestBodyAsJson) {
     @Path("{groupId}/command/unassign_staff")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String unassignLoanOfficer(@PathParam("groupId") final Long groupId, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Unassign a Staff", httpMethod = "POST", notes = "Allows you to unassign the Staff.\n\n" + "Mandatory Fields: staffId")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = GroupsApiResourceSwagger.PostGroupsGroupIdCommandUnassignStaffRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = GroupsApiResourceSwagger.PostGroupsGroupIdCommandUnassignStaffResponse.class )})
+    public String unassignLoanOfficer(@PathParam("groupId") @ApiParam(value = "groupId") final Long groupId,@ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder() //
                 .unassignGroupStaff(groupId) //
@@ -344,7 +358,10 @@ public String unassignLoanOfficer(@PathParam("groupId") final Long groupId, fina
     @Path("{groupId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String update(@PathParam("groupId") final Long groupId, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Update a Group", httpMethod = "PUT", notes = "Updates a Group")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = GroupsApiResourceSwagger.PutGroupsGroupIdRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = GroupsApiResourceSwagger.PutGroupsGroupIdResponse.class)})
+    public String update(@PathParam("groupId")@ApiParam(value = "groupId") final Long groupId, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder() //
                 .updateGroup(groupId) //
@@ -358,7 +375,9 @@ public String update(@PathParam("groupId") final Long groupId, final String apiR
     @Path("{groupId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String delete(@PathParam("groupId") final Long groupId) {
+    @ApiOperation(value = "Delete a Group", httpMethod = "DELETE", notes = "A group can be deleted if it is in pending state and has no associations - clients, loans or savings")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = GroupsApiResourceSwagger.DeleteGroupsGroupIdResponse.class)})
+    public String delete(@PathParam("groupId") @ApiParam(value = "groupId") final Long groupId) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder() //
                 .deleteGroup(groupId) //
@@ -371,8 +390,11 @@ public String delete(@PathParam("groupId") final Long groupId) {
     @Path("{groupId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String activateOrGenerateCollectionSheet(@PathParam("groupId") final Long groupId,
-            @QueryParam("command") final String commandParam, @QueryParam("roleId") final Long roleId, final String apiRequestBodyAsJson,
+    @ApiOperation(value = "Activate a Group | Associate Clients | Disassociate Clients | Transfer Clients across groups | Generate Collection Sheet | Save Collection Sheet | Unassign a Staff | Assign a Staff | Close a Group | Unassign a Role | Update a Role", httpMethod = "POST", notes = "Activate a Group:\n\n" + "Groups can be created in a Pending state. This API exists to enable group activation.\n\n" + "\n\n" + "If the group happens to be already active this API will result in an error.\n\n" + "Mandatory Fields: activationDate\n\n" + "Associate Clients:\n\n" + "This API allows to associate existing clients to a group.\n\n" + "\n\n" + "The clients are listed from the office to which the group is associated.\n\n" + "\n\n" + "If client(s) is already associated with group then API will result in an error.\n\n" + "Mandatory Fields: clientMembers\n\n" + "Disassociate Clients:\n\n" + "This API allows to disassociate clients from a group.\n\n" + "\n\n" + "Disassociating a client with active joint liability group loans results in an error.\n\n" + "Mandatory Fields: clientMembers\n\n" + "Transfer Clients across groups:\n\n" + "This API allows to transfer clients from one group to another\n\n" + "Mandatory Fields: destinationGroupId and clients\n\n" + "Optional Fields: inheritDestinationGroupLoanOfficer (defaults to true) and transferActiveLoans (defaults to true)\n\n" + "Generate Collection Sheet:\n\n" + "This API retrieves repayment details of all jlg loans of all members of a group on a specified meeting date.\n\n" + "Mandatory Fields: calendarId and transactionDate\n\n" + "Save Collection Sheet:\n\n" + "This api allows the loan officer to perform bulk repayments of JLG loans for a group on its meeting date.\n\n" + "Mandatory Fields: calendarId, transactionDate, actualDisbursementDate\n\n" + "Optional Fields: clientsAttendance, bulkRepaymentTransaction, bulkDisbursementTransactions\n\n" + "Unassign a Staff:\n\n" + "Allows you to unassign the Staff.\n\n" + "Mandatory Fields: staffId\n\n" + "Assign a Staff:\n\n" + "Allows you to assign Staff to an existing Group.\n\n" + "\n\n" + "The selected Staff should be belong to the same office (or an office higher up in the hierarchy) as this group" + "Mandatory Fields: staffId\n\n" + "Optional Fields: inheritStaffForClientAccounts (Optional: Boolean if true all members of the group (i.e all clients with active loans and savings ) will inherit the staffId)\n\n" + "Close a Group:\n\n" + "This API exists to close a group. Groups can be closed if they don't have any non-closed clients/loans/savingsAccounts.\n\n" + "\n\n" + "If the group has any active clients/loans/savingsAccount, this API will result in an error." + "Assign a Role:\n\n" + "Allows you to assign a Role to an existing member of a group.\n\n" + "\n\n" + "We can define the different roles applicable to group members by adding code values to the pre-defined system code GROUPROLE. Example:Group leader etc.\n\n" + "Mandatory Fields: clientId, role\n\n" + "Unassign a Role:\n\n" + "Allows you to unassign Roles associated tp Group members.\n\n" + "Update a Role:\n\n" + "Allows you to update the member Role.\n\n" + "Mandatory Fields: role\n\n" + "Showing request/response for Transfer Clients across groups")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = GroupsApiResourceSwagger.PostGroupsGroupIdRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = GroupsApiResourceSwagger.PostGroupsGroupIdResponse.class)})
+    public String activateOrGenerateCollectionSheet(@PathParam("groupId") @ApiParam(value = "groupId") final Long groupId,
+            @QueryParam("command") @ApiParam(value = "command") final String commandParam, @QueryParam("roleId") @ApiParam(value = "roleId") final Long roleId, @ApiParam(hidden = true) final String apiRequestBodyAsJson,
             @Context final UriInfo uriInfo) {
         final CommandWrapperBuilder builder = new CommandWrapperBuilder().withJson(apiRequestBodyAsJson);
 
@@ -443,7 +465,9 @@ private boolean is(final String commandParam, final String commandValue) {
     @Path("{groupId}/accounts")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveAccounts(@PathParam("groupId") final Long groupId, @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Retrieve Group accounts overview", httpMethod = "GET", notes = "Retrieves details of all Loan and Savings accounts associated with this group.\n\n" + "\n\n" + "Example Requests:\n\n" + "\n\n" + "groups/1/accounts\n\n" + "\n\n" + "\n\n" + "groups/1/accounts?fields=loanAccounts,savingsAccounts,memberLoanAccounts,\n\n" + "memberSavingsAccounts")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = GroupsApiResourceSwagger.GetGroupsGroupIdAccountsResponse.class)})
+    public String retrieveAccounts(@PathParam("groupId") @ApiParam(value = "groupId") final Long groupId, @Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission("GROUP");
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/api/GroupsApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/api/GroupsApiResourceSwagger.java
new file mode 100644
index 000000000..23d0911ac
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/group/api/GroupsApiResourceSwagger.java
@@ -0,0 +1,529 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.portfolio.group.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.time.LocalDate;
+import java.util.Set;
+
+/**
+ * Created by Chirag Gupta on 12/10/17.
+ */
+final class GroupsApiResourceSwagger {
+    private GroupsApiResourceSwagger() {
+    }
+
+    @ApiModel(value = "GetGroupsTemplateResponse")
+    public final static class GetGroupsTemplateResponse {
+        private GetGroupsTemplateResponse() {
+        }
+
+        final class GetGroupsTemplateOfficeOptions {
+            private GetGroupsTemplateOfficeOptions() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "Head Office")
+            public String name;
+            @ApiModelProperty(example = "Head Office")
+            public String nameDecorated;
+        }
+
+        final class GetGroupsTemplateStaffOptions {
+            private GetGroupsTemplateStaffOptions() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "C, Mike")
+            public String displayName;
+        }
+
+        final class GetGroupsTemplateClientOptions {
+            private GetGroupsTemplateClientOptions() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "Petra Yton")
+            public String displayName;
+            @ApiModelProperty(example = "1")
+            public Integer officeId;
+            @ApiModelProperty(example = "Head Office")
+            public String officeName;
+        }
+
+        final class GetGroupsTemplateDatatables {
+            private GetGroupsTemplateDatatables() {
+            }
+
+            final class GetGroupsTemplateColumnHeaderData {
+                private GetGroupsTemplateColumnHeaderData() {
+                }
+
+                final class GetGroupsTemplateColumnValues {
+                    private GetGroupsTemplateColumnValues() {
+                    }
+                }
+
+                @ApiModelProperty(example = "group_id")
+                public String columnName;
+                @ApiModelProperty(example = "bigint")
+                public String columnType;
+                @ApiModelProperty(example = "0")
+                public Integer columnLength;
+                @ApiModelProperty(example = "INTEGER")
+                public String columnDisplayType;
+                @ApiModelProperty(example = "false")
+                public Boolean isColumnNullable;
+                @ApiModelProperty(example = "true")
+                public Boolean isColumnPrimaryKey;
+                public Set<GetGroupsTemplateColumnValues> columnValues;
+            }
+
+            @ApiModelProperty(example = "m_group")
+            public String applicationTableName;
+            @ApiModelProperty(example = "Group Activation Data")
+            public String registeredTableName;
+            public Set<GetGroupsTemplateColumnHeaderData> columnHeaderData;
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer officeId;
+        public Set<GetGroupsTemplateOfficeOptions> officeOptions;
+        public Set<GetGroupsTemplateStaffOptions> staffOptions;
+        public Set<GetGroupsTemplateClientOptions> clientOptions;
+        public Set<GetGroupsTemplateDatatables> datatables;
+    }
+
+    @ApiModel(value = "GetGroupsResponse")
+    public static final class GetGroupsResponse {
+        private GetGroupsResponse() {
+        }
+
+        final class GetGroupsPageItems {
+            private GetGroupsPageItems() {
+            }
+
+            final class GetGroupsStatus {
+                private GetGroupsStatus() {
+                }
+
+                @ApiModelProperty(example = "100")
+                public Integer id;
+                @ApiModelProperty(example = "clientStatusType.pending")
+                public String code;
+                @ApiModelProperty(example = "Pending")
+                public String value;
+            }
+
+            @ApiModelProperty(example = "4")
+            public Integer id;
+            @ApiModelProperty(example = "AnotherGroup")
+            public String name;
+            public GetGroupsStatus status;
+            @ApiModelProperty(example = "false")
+            public Boolean active;
+            @ApiModelProperty(example = "1")
+            public Integer officeId;
+            @ApiModelProperty(example = "Head Office")
+            public String officeName;
+            @ApiModelProperty(example = ".4.")
+            public String hierarchy;
+        }
+
+        @ApiModelProperty(example = "2")
+        public Integer totalFilteredRecords;
+        public Set<GetGroupsPageItems> pageItems;
+    }
+
+    @ApiModel(value = "GetGroupsGroupIdResponse")
+    public final static class GetGroupsGroupIdResponse {
+        private GetGroupsGroupIdResponse() {
+        }
+
+        final class GetGroupsGroupIdTimeline {
+            private GetGroupsGroupIdTimeline() {
+            }
+
+            @ApiModelProperty(example = "[2013, 11, 14]")
+            public LocalDate activatedOnDate;
+            @ApiModelProperty(example = "mifos")
+            public String activatedByUsername;
+            @ApiModelProperty(example = "App")
+            public String activatedByFirstname;
+            @ApiModelProperty(example = "Administrator")
+            public String activatedByLastname;
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer id;
+        @ApiModelProperty(example = "First Group")
+        public String name;
+        @ApiModelProperty(example = "000-1A")
+        public String externalId;
+        @ApiModelProperty(example = "1")
+        public Integer officeId;
+        @ApiModelProperty(example = "Head Office")
+        public String officeName;
+        @ApiModelProperty(example = ".1.")
+        public String hierarchy;
+        public GetGroupsGroupIdTimeline timeline;
+    }
+
+    @ApiModel(value = "PostGroupsRequest")
+    public final static class PostGroupsRequest {
+        private PostGroupsRequest() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer officeId;
+        @ApiModelProperty(example = "Pending Group")
+        public String name;
+        @ApiModelProperty(example = "false")
+        public Boolean active;
+    }
+
+    @ApiModel(value = "PostGroupsResponse")
+    public final static class PostGroupsResponse {
+        private PostGroupsResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer officeId;
+        @ApiModelProperty(example = "2")
+        public Integer groupId;
+        @ApiModelProperty(example = "2")
+        public Integer resourceId;
+    }
+
+    @ApiModel(value = "DeleteGroupsGroupIdResponse")
+    public final static class DeleteGroupsGroupIdResponse {
+        private DeleteGroupsGroupIdResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer officeId;
+        @ApiModelProperty(example = "2")
+        public Integer groupId;
+        @ApiModelProperty(example = "2")
+        public Integer resourceId;
+    }
+
+    @ApiModel(value = "PostGroupsGroupIdCommandUnassignStaffRequest")
+    public final static class PostGroupsGroupIdCommandUnassignStaffRequest {
+        private PostGroupsGroupIdCommandUnassignStaffRequest() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer staffId;
+    }
+
+    @ApiModel(value = "PostGroupsGroupIdCommandUnassignStaffResponse")
+    public final static class PostGroupsGroupIdCommandUnassignStaffResponse {
+        private PostGroupsGroupIdCommandUnassignStaffResponse() {
+        }
+
+        final class PostGroupsGroupIdCommandUnassignStaffChanges {
+            private PostGroupsGroupIdCommandUnassignStaffChanges() {
+            }
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer officeId;
+        @ApiModelProperty(example = "1")
+        public Integer groupId;
+        @ApiModelProperty(example = "1")
+        public Integer resourceId;
+        public PostGroupsGroupIdCommandUnassignStaffChanges changes;
+    }
+
+    @ApiModel(value = "PutGroupsGroupIdRequest")
+    public final static class PutGroupsGroupIdRequest {
+        private PutGroupsGroupIdRequest() {
+        }
+
+        @ApiModelProperty(example = "First Group (changed)")
+        public String name;
+    }
+
+    @ApiModel(value = "PutGroupsGroupIdResponse")
+    public final static class PutGroupsGroupIdResponse {
+        private PutGroupsGroupIdResponse() {
+        }
+
+        final class PutGroupsGroupIdChanges {
+            private PutGroupsGroupIdChanges() {
+            }
+
+            @ApiModelProperty(example = "First Group (changed)")
+            public String name;
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer officeId;
+        @ApiModelProperty(example = "1")
+        public Integer groupId;
+        @ApiModelProperty(example = "1")
+        public Integer resourceId;
+        public PutGroupsGroupIdChanges changes;
+    }
+
+    @ApiModel(value = "GetGroupsGroupIdAccountsResponse")
+    public final static class GetGroupsGroupIdAccountsResponse {
+        private GetGroupsGroupIdAccountsResponse() {
+        }
+
+        final class GetGroupsGroupIdAccountsLoanAccounts {
+            private GetGroupsGroupIdAccountsLoanAccounts() {
+            }
+
+            final class GetGroupsGroupIdAccountsStatus {
+                private GetGroupsGroupIdAccountsStatus() {
+                }
+
+                @ApiModelProperty(example = "100")
+                public Integer id;
+                @ApiModelProperty(example = "loanStatusType.submitted.and.pending.approval")
+                public String code;
+                @ApiModelProperty(example = "Submitted and pending approval")
+                public String value;
+                @ApiModelProperty(example = "true")
+                public Boolean pendingApproval;
+                @ApiModelProperty(example = "false")
+                public Boolean waitingForDisbursal;
+                @ApiModelProperty(example = "false")
+                public Boolean active;
+                @ApiModelProperty(example = "false")
+                public Boolean closedObligationsMet;
+                @ApiModelProperty(example = "false")
+                public Boolean closedWrittenOff;
+                @ApiModelProperty(example = "false")
+                public Boolean closedRescheduled;
+                @ApiModelProperty(example = "false")
+                public Boolean closed;
+                @ApiModelProperty(example = "false")
+                public Boolean overpaid;
+            }
+
+            final class GetGroupsGroupIdAccountsLoanType {
+                private GetGroupsGroupIdAccountsLoanType() {
+                }
+
+                @ApiModelProperty(example = "2")
+                public Integer id;
+                @ApiModelProperty(example = "accountType.group")
+                public String code;
+                @ApiModelProperty(example = "Group")
+                public String value;
+            }
+
+            @ApiModelProperty(example = "3")
+            public Integer id;
+            @ApiModelProperty(example = "000000003")
+            public Long accountNo;
+            @ApiModelProperty(example = "3")
+            public Integer productId;
+            @ApiModelProperty(example = "daily product")
+            public String productName;
+            public GetGroupsGroupIdAccountsStatus status;
+            public GetGroupsGroupIdAccountsLoanType loanType;
+        }
+
+        final class GetGroupsGroupIdAccountsSavingAccounts {
+            private GetGroupsGroupIdAccountsSavingAccounts() {
+            }
+
+            final class GetGroupsGroupIdAccountsSavingStatus {
+                private GetGroupsGroupIdAccountsSavingStatus() {
+                }
+
+                @ApiModelProperty(example = "100")
+                public Integer id;
+                @ApiModelProperty(example = "savingsAccountStatusType.submitted.and.pending.approval")
+                public String code;
+                @ApiModelProperty(example = "Submitted and pending approval")
+                public String value;
+                @ApiModelProperty(example = "true")
+                public Boolean submittedAndPendingApproval;
+                @ApiModelProperty(example = "false")
+                public Boolean approved;
+                @ApiModelProperty(example = "false")
+                public Boolean rejected;
+                @ApiModelProperty(example = "false")
+                public Boolean withdrawnByApplicant;
+                @ApiModelProperty(example = "false")
+                public Boolean active;
+                @ApiModelProperty(example = "false")
+                public Boolean closed;
+            }
+
+            final class GetGroupsGroupIdAccountsSavingCurrency {
+                private GetGroupsGroupIdAccountsSavingCurrency() {
+                }
+
+                @ApiModelProperty(example = "USD")
+                public String code;
+                @ApiModelProperty(example = "US Dollar")
+                public String name;
+                @ApiModelProperty(example = "2")
+                public Integer decimalPlaces;
+                @ApiModelProperty(example = "$")
+                public String displaySymbol;
+                @ApiModelProperty(example = "currency.USD")
+                public String nameCode;
+                @ApiModelProperty(example = "US Dollar ($)")
+                public String displayLabel;
+            }
+
+            final class GetGroupsGroupIdAccountsSavingAccountType {
+                private GetGroupsGroupIdAccountsSavingAccountType() {
+                }
+
+                @ApiModelProperty(example = "2")
+                public Integer id;
+                @ApiModelProperty(example = "accountType.group")
+                public String code;
+                @ApiModelProperty(example = "Group")
+                public String value;
+            }
+
+            @ApiModelProperty(example = "9")
+            public Integer id;
+            @ApiModelProperty(example = "000000009")
+            public Long accountNo;
+            @ApiModelProperty(example = "1")
+            public Integer productId;
+            @ApiModelProperty(example = "p_sav")
+            public String productName;
+            public GetGroupsGroupIdAccountsSavingStatus status;
+            public GetGroupsGroupIdAccountsSavingCurrency currency;
+            public GetGroupsGroupIdAccountsSavingAccountType accountType;
+        }
+
+        final class GetGroupsGroupIdAccountsMemberLoanAccounts {
+            private GetGroupsGroupIdAccountsMemberLoanAccounts() {
+            }
+
+            final class GetGroupsGroupIdAccountsMemberLoanStatus {
+                private GetGroupsGroupIdAccountsMemberLoanStatus() {
+                }
+
+                @ApiModelProperty(example = "200")
+                public Integer id;
+                @ApiModelProperty(example = "loanStatusType.approved")
+                public String code;
+                @ApiModelProperty(example = "Approved")
+                public String value;
+                @ApiModelProperty(example = "false")
+                public Boolean pendingApproval;
+                @ApiModelProperty(example = "true")
+                public Boolean waitingForDisbursal;
+                @ApiModelProperty(example = "false")
+                public Boolean active;
+                @ApiModelProperty(example = "false")
+                public Boolean closedObligationsMet;
+                @ApiModelProperty(example = "false")
+                public Boolean closedWrittenOff;
+                @ApiModelProperty(example = "false")
+                public Boolean closedRescheduled;
+                @ApiModelProperty(example = "false")
+                public Boolean closed;
+                @ApiModelProperty(example = "false")
+                public Boolean overpaid;
+            }
+
+            final class GetGroupsGroupIdAccountsMemberLoanType {
+                private GetGroupsGroupIdAccountsMemberLoanType() {
+                }
+
+                @ApiModelProperty(example = "3")
+                public Integer id;
+                @ApiModelProperty(example = "accountType.jlg")
+                public String code;
+                @ApiModelProperty(example = "JLG")
+                public String value;
+            }
+
+            @ApiModelProperty(example = "4")
+            public Integer id;
+            @ApiModelProperty(example = "000000004")
+            public Long accountNo;
+            @ApiModelProperty(example = "1")
+            public Integer productId;
+            @ApiModelProperty(example = "testLoan")
+            public String productName;
+            public GetGroupsGroupIdAccountsMemberLoanStatus status;
+            public GetGroupsGroupIdAccountsMemberLoanType loanType;
+        }
+
+        final class GetGroupsGroupIdAccountsMemberSavingsAccounts {
+            private GetGroupsGroupIdAccountsMemberSavingsAccounts() {
+            }
+
+
+            @ApiModelProperty(example = "3")
+            public Integer id;
+            @ApiModelProperty(example = "000000003")
+            public Long accountNo;
+            @ApiModelProperty(example = "1")
+            public Integer productId;
+            @ApiModelProperty(example = "p_sav")
+            public String productName;
+            public GetGroupsGroupIdAccountsSavingAccounts.GetGroupsGroupIdAccountsSavingStatus status;
+            public GetGroupsGroupIdAccountsSavingAccounts.GetGroupsGroupIdAccountsSavingCurrency currency;
+            public GetGroupsGroupIdAccountsMemberLoanAccounts.GetGroupsGroupIdAccountsMemberLoanType accountType;
+        }
+
+        public Set<GetGroupsGroupIdAccountsLoanAccounts> loanAccounts;
+        public Set<GetGroupsGroupIdAccountsSavingAccounts> savingsAccounts;
+        public Set<GetGroupsGroupIdAccountsMemberLoanAccounts> memberLoanAccounts;
+        public Set<GetGroupsGroupIdAccountsMemberSavingsAccounts> memberSavingsAccounts;
+    }
+
+    @ApiModel(value = "PostGroupsGroupIdRequest")
+    public final static class PostGroupsGroupIdRequest {
+        private PostGroupsGroupIdRequest() {
+        }
+
+        final class PostGroupsGroupIdClients {
+            private PostGroupsGroupIdClients() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+        }
+
+        @ApiModelProperty(example = "2")
+        public Integer destinationGroupId;
+        public Set<PostGroupsGroupIdClients> clients;
+    }
+
+    @ApiModel(value = "PostGroupsGroupIdResponse")
+    public final static class PostGroupsGroupIdResponse {
+        private PostGroupsGroupIdResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer resourceId;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/interestratechart/api/InterestRateChartSlabsApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/interestratechart/api/InterestRateChartSlabsApiResource.java
index d62878dfc..364be3d2a 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/interestratechart/api/InterestRateChartSlabsApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/interestratechart/api/InterestRateChartSlabsApiResource.java
@@ -18,36 +18,7 @@
  */
 package org.apache.fineract.portfolio.interestratechart.api;
 
-import static org.apache.fineract.portfolio.interestratechart.InterestRateChartSlabApiConstants.INTERESTRATE_CHART_SLAB_RESOURCE_NAME;
-
-
-import static org.apache.fineract.portfolio.interestratechart.InterestRateChartSlabApiConstants.amountRangeFromParamName;
-import static org.apache.fineract.portfolio.interestratechart.InterestRateChartSlabApiConstants.amountRangeToParamName;
-import static org.apache.fineract.portfolio.interestratechart.InterestRateChartSlabApiConstants.annualInterestRateParamName;
-import static org.apache.fineract.portfolio.interestratechart.InterestRateChartSlabApiConstants.currencyCodeParamName;
-import static org.apache.fineract.portfolio.interestratechart.InterestRateChartSlabApiConstants.descriptionParamName;
-import static org.apache.fineract.portfolio.interestratechart.InterestRateChartSlabApiConstants.fromPeriodParamName;
-import static org.apache.fineract.portfolio.interestratechart.InterestRateChartSlabApiConstants.incentivesParamName;
-import static org.apache.fineract.portfolio.interestratechart.InterestRateChartSlabApiConstants.periodTypeParamName;
-import static org.apache.fineract.portfolio.interestratechart.InterestRateChartSlabApiConstants.toPeriodParamName;
-
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.UriInfo;
-
+import io.swagger.annotations.*;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
 import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
@@ -63,9 +34,21 @@
 import org.springframework.context.annotation.Scope;
 import org.springframework.stereotype.Component;
 
+import javax.ws.rs.*;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.UriInfo;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+import static org.apache.fineract.portfolio.interestratechart.InterestRateChartSlabApiConstants.*;
+
 @Path("/interestratecharts/{chartId}/chartslabs")
 @Component
 @Scope("singleton")
+@Api(value = "Interest Rate Slab (A.K.A interest bands)", description = "The slabs a.k.a interest bands are associated with Interest Rate Chart. These bands allow to define different interest rates for different deposit term periods.")
 public class InterestRateChartSlabsApiResource {
 
     private final InterestRateChartSlabReadPlatformService interestRateChartSlabReadPlatformService;
@@ -105,7 +88,9 @@ public String template(@Context final UriInfo uriInfo) {
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveAll(@PathParam("chartId") final Long chartId, @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Retrieve all Slabs", httpMethod = "GET", notes = "Retrieve list of slabs associated with a chart\n" + "\n" + "Example Requests:\n" + "\n" + "interestratecharts/1/chartslabs")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = InterestRateChartSlabsApiResourceSwagger.GetInterestRateChartsChartIdChartSlabsResponse.class, responseContainer = "List")})
+    public String retrieveAll(@PathParam("chartId") @ApiParam(value = "chartId") final Long chartId, @Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(INTERESTRATE_CHART_SLAB_RESOURCE_NAME);
         Collection<InterestRateChartSlabData> chartSlabs = this.interestRateChartSlabReadPlatformService.retrieveAll(chartId);
@@ -118,7 +103,9 @@ public String retrieveAll(@PathParam("chartId") final Long chartId, @Context fin
     @Path("{chartSlabId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveOne(@PathParam("chartId") final Long chartId, @PathParam("chartSlabId") final Long chartSlabId,
+    @ApiOperation(value = "Retrieve a Slab", httpMethod = "GET", notes = "Retrieve a slab associated with an Interest rate chart\n" + "\n" + "Example Requests:\n" + "\n" + "interestratecharts/1/chartslabs/1\n")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = InterestRateChartSlabsApiResourceSwagger.GetInterestRateChartsChartIdChartSlabsResponse.class)})
+    public String retrieveOne(@PathParam("chartId") @ApiParam(value = "chartId") final Long chartId, @PathParam("chartSlabId") @ApiParam(value = "chartSlabId") final Long chartSlabId,
             @Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(INTERESTRATE_CHART_SLAB_RESOURCE_NAME);
@@ -135,7 +122,10 @@ public String retrieveOne(@PathParam("chartId") final Long chartId, @PathParam("
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String create(@PathParam("chartId") final Long chartId, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Create a Slab", httpMethod = "POST", notes = "Creates a new interest rate slab for an interest rate chart.\n" + "Mandatory Fields\n" + "periodType, fromPeriod, annualInterestRate\n" + "Optional Fields\n" + "toPeriod and description\n" +"Example Requests:\n" + "\n" + "interestratecharts/1/chartslabs")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = InterestRateChartSlabsApiResourceSwagger.PostInterestRateChartsChartIdChartSlabsRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = InterestRateChartSlabsApiResourceSwagger.PostInterestRateChartsChartIdChartSlabsResponse.class)})
+    public String create(@PathParam("chartId") @ApiParam(value = "chartId") final Long chartId, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().createInterestRateChartSlab(chartId)
                 .withJson(apiRequestBodyAsJson).build();
@@ -149,8 +139,11 @@ public String create(@PathParam("chartId") final Long chartId, final String apiR
     @Path("{chartSlabId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String update(@PathParam("chartId") final Long chartId, @PathParam("chartSlabId") final Long chartSlabId,
-            final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Update a Slab", httpMethod = "PUT", notes = "It updates the Slab from chart")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = InterestRateChartSlabsApiResourceSwagger.PutInterestRateChartsChartIdChartSlabsChartSlabIdRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = InterestRateChartSlabsApiResourceSwagger.PutInterestRateChartsChartIdChartSlabsChartSlabIdResponse.class)})
+    public String update(@PathParam("chartId") @ApiParam(value = "chartId") final Long chartId, @PathParam("chartSlabId") @ApiParam(value = "chartSlabId") final Long chartSlabId,
+            @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().updateInterestRateChartSlab(chartId, chartSlabId)
                 .withJson(apiRequestBodyAsJson).build();
@@ -164,7 +157,9 @@ public String update(@PathParam("chartId") final Long chartId, @PathParam("chart
     @Path("{chartSlabId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String delete(@PathParam("chartId") final Long chartId, @PathParam("chartSlabId") final Long chartSlabId) {
+    @ApiOperation(value = "Delete a Slab", httpMethod = "DELETE", notes = "Delete a Slab from a chart")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = InterestRateChartSlabsApiResourceSwagger.DeleteInterestRateChartsChartIdChartSlabsResponse.class)})
+    public String delete(@PathParam("chartId") @ApiParam(value = "chartId") final Long chartId, @PathParam("chartSlabId") @ApiParam(value = "chartSlabId") final Long chartSlabId) {
         final CommandWrapper commandRequest = new CommandWrapperBuilder().deleteInterestRateChartSlab(chartId, chartSlabId).build();
         final CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
         return this.toApiJsonSerializer.serialize(result);
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/interestratechart/api/InterestRateChartSlabsApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/interestratechart/api/InterestRateChartSlabsApiResourceSwagger.java
new file mode 100644
index 000000000..2d18cbf7b
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/interestratechart/api/InterestRateChartSlabsApiResourceSwagger.java
@@ -0,0 +1,195 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.portfolio.interestratechart.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Set;
+
+/**
+ * Created by Chirag Gupta on 08/12/17.
+ */
+final class InterestRateChartSlabsApiResourceSwagger {
+    private InterestRateChartSlabsApiResourceSwagger() {
+    }
+
+    @ApiModel(value = "GetInterestRateChartsChartIdChartSlabsResponse")
+    public final static class GetInterestRateChartsChartIdChartSlabsResponse {
+        private GetInterestRateChartsChartIdChartSlabsResponse() {
+        }
+
+        final class GetInterestRateChartsChartIdChartSlabsIncentives {
+            private GetInterestRateChartsChartIdChartSlabsIncentives() {
+            }
+
+            final class GetInterestRateChartsChartIdChartSlabsEntityType {
+                private GetInterestRateChartsChartIdChartSlabsEntityType() {
+                }
+
+                @ApiModelProperty(example = "2")
+                public Integer id;
+                @ApiModelProperty(example = "InterestIncentiveEntityType.customer")
+                public Integer code;
+                @ApiModelProperty(example = "Customer")
+                public Integer value;
+            }
+
+            final class GetInterestRateChartsChartIdChartSlabsAttributeName {
+                private GetInterestRateChartsChartIdChartSlabsAttributeName() {
+                }
+
+                @ApiModelProperty(example = "2")
+                public Integer id;
+                @ApiModelProperty(example = "InterestIncentiveAttributeName.gender")
+                public Integer code;
+                @ApiModelProperty(example = "Gender")
+                public Integer value;
+            }
+
+            final class GetInterestRateChartsChartIdChartSlabsConditionType {
+                private GetInterestRateChartsChartIdChartSlabsConditionType() {
+                }
+
+                @ApiModelProperty(example = "2")
+                public Integer id;
+                @ApiModelProperty(example = "incentiveConditionType.equal")
+                public Integer code;
+                @ApiModelProperty(example = "equal")
+                public Integer value;
+            }
+
+            final class GetInterestRateChartsChartIdChartSlabsIncentiveType {
+                private GetInterestRateChartsChartIdChartSlabsIncentiveType() {
+                }
+
+                @ApiModelProperty(example = "3")
+                public Integer id;
+                @ApiModelProperty(example = "InterestIncentiveType.incentive")
+                public Integer code;
+                @ApiModelProperty(example = "Incentive")
+                public Integer value;
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            public GetInterestRateChartsChartIdChartSlabsEntityType entityType;
+            public GetInterestRateChartsChartIdChartSlabsAttributeName attributeName;
+            public GetInterestRateChartsChartIdChartSlabsConditionType conditionType;
+            @ApiModelProperty(example = "11")
+            public Integer attributeValue;
+            @ApiModelProperty(example = "FEMALE")
+            public String attributeValueDesc;
+            public GetInterestRateChartsChartIdChartSlabsIncentiveType incentiveType;
+            @ApiModelProperty(example = "-1.000000")
+            public Float amount;
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer id;
+        @ApiModelProperty(example = "5% interest from 1 day till 180 days of deposit")
+        public String description;
+        public InterestRateChartsApiResourceSwagger.GetInterestRateChartsTemplateResponse.GetInterestRateChartsTemplatePeriodTypes periodTypes;
+        @ApiModelProperty(example = "1")
+        public Integer fromPeriod;
+        @ApiModelProperty(example = "180")
+        public Integer toPeriod;
+        @ApiModelProperty(example = "5")
+        public Double annualInterestRate;
+        public InterestRateChartsApiResourceSwagger.GetInterestRateChartsResponse.GetInterestRateChartsCurrency currency;
+        public Set<GetInterestRateChartsChartIdChartSlabsIncentives> incentives;
+    }
+
+    @ApiModel(value = "PostInterestRateChartsChartIdChartSlabsRequest")
+    public static final class PostInterestRateChartsChartIdChartSlabsRequest {
+        private PostInterestRateChartsChartIdChartSlabsRequest() {
+        }
+
+        final class PostInterestRateChartsChartIdChartSlabsIncentives {
+            private PostInterestRateChartsChartIdChartSlabsIncentives() {
+            }
+
+            @ApiModelProperty(example = "2")
+            public Integer entityType;
+            @ApiModelProperty(example = "2")
+            public Integer attributeName;
+            @ApiModelProperty(example = "2")
+            public Integer conditionType;
+            @ApiModelProperty(example = "11")
+            public Integer attributeValue;
+            @ApiModelProperty(example = "2")
+            public Integer incentiveType;
+            @ApiModelProperty(example = "-1")
+            public Float amount;
+        }
+
+        @ApiModelProperty(example = "0")
+        public Integer periodType;
+        @ApiModelProperty(example = "1")
+        public Integer fromPeriod;
+        @ApiModelProperty(example = "180")
+        public Integer toPeriod;
+        @ApiModelProperty(example = "5")
+        public Double annualInterestRate;
+        @ApiModelProperty(example = "5% interest from 1 day till 180 days of deposit")
+        public String description;
+        @ApiModelProperty(example = "en")
+        public String locale;
+        public Set<PostInterestRateChartsChartIdChartSlabsIncentives> incentives;
+    }
+
+    @ApiModel(value = "PostInterestRateChartsChartIdChartSlabsResponse")
+    public final static class PostInterestRateChartsChartIdChartSlabsResponse {
+        private PostInterestRateChartsChartIdChartSlabsResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer resourceId;
+    }
+
+    @ApiModel(value = "PutInterestRateChartsChartIdChartSlabsChartSlabIdRequest")
+    public static final class PutInterestRateChartsChartIdChartSlabsChartSlabIdRequest {
+        private PutInterestRateChartsChartIdChartSlabsChartSlabIdRequest() {
+        }
+
+        @ApiModelProperty(example = "6")
+        public Double annualInterestRate;
+        @ApiModelProperty(example = "Interest rate changed to 6%")
+        public String description;
+    }
+
+    @ApiModel(value = "PutInterestRateChartsChartIdChartSlabsChartSlabIdResponse")
+    public static final class PutInterestRateChartsChartIdChartSlabsChartSlabIdResponse {
+        private PutInterestRateChartsChartIdChartSlabsChartSlabIdResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer resourceId;
+        public PutInterestRateChartsChartIdChartSlabsChartSlabIdRequest changes;
+    }
+
+    @ApiModel(value = "DeleteInterestRateChartsChartIdChartSlabsResponse")
+    public final static class DeleteInterestRateChartsChartIdChartSlabsResponse {
+        private DeleteInterestRateChartsChartIdChartSlabsResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer resourceId;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/interestratechart/api/InterestRateChartsApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/interestratechart/api/InterestRateChartsApiResource.java
index cf54a3aa3..ae19c3b11 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/interestratechart/api/InterestRateChartsApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/interestratechart/api/InterestRateChartsApiResource.java
@@ -18,24 +18,7 @@
  */
 package org.apache.fineract.portfolio.interestratechart.api;
 
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.UriInfo;
-
+import io.swagger.annotations.*;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
 import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
@@ -52,17 +35,21 @@
 import org.springframework.context.annotation.Scope;
 import org.springframework.stereotype.Component;
 
-import static org.apache.fineract.portfolio.interestratechart.InterestRateChartApiConstants.chartSlabs;
-import static org.apache.fineract.portfolio.interestratechart.InterestRateChartApiConstants.descriptionParamName;
-import static org.apache.fineract.portfolio.interestratechart.InterestRateChartApiConstants.endDateParamName;
-import static org.apache.fineract.portfolio.interestratechart.InterestRateChartApiConstants.fromDateParamName;
-import static org.apache.fineract.portfolio.interestratechart.InterestRateChartApiConstants.idParamName;
-import static org.apache.fineract.portfolio.interestratechart.InterestRateChartApiConstants.isPrimaryGroupingByAmountParamName;
-import static org.apache.fineract.portfolio.interestratechart.InterestRateChartApiConstants.nameParamName;
+import javax.ws.rs.*;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.UriInfo;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
+import static org.apache.fineract.portfolio.interestratechart.InterestRateChartApiConstants.*;
 
 @Path("/interestratecharts")
 @Component
 @Scope("singleton")
+@Api(value = "Interest Rate Chart", description = "This defines an interest rate scheme that can be associated to a term deposit product. This will have a slab (band or range) of deposit periods and the associated interest rates applicable along with incentives for each band.")
 public class InterestRateChartsApiResource {
 
     private final InterestRateChartReadPlatformService chartReadPlatformService;
@@ -92,6 +79,8 @@ public InterestRateChartsApiResource(final InterestRateChartReadPlatformService
     @Path("template")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
+    @ApiOperation(value = "Retrieve Chart Details Template", httpMethod = "GET", notes = "This is a convenience resource. It can be useful when building maintenance user interface screens for creating a chart. The template data returned consists of any or all of:\n" + "\n" + "Field Defaults\n" + "Allowed Value Lists\n" + "Example Request:\n" + "\n" + "interestratecharts/template")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = InterestRateChartsApiResourceSwagger.GetInterestRateChartsTemplateResponse.class)})
     public String template(@Context final UriInfo uriInfo) {
         this.context.authenticatedUser().validateHasReadPermission(InterestRateChartApiConstants.INTERESTRATE_CHART_RESOURCE_NAME);
 
@@ -104,7 +93,9 @@ public String template(@Context final UriInfo uriInfo) {
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveAll(@Context final UriInfo uriInfo, @QueryParam("productId") final Long productId) {
+    @ApiOperation(value = "Retrieve all Charts", httpMethod = "GET", notes = "Retrieve list of charts associated with a term deposit product(FD or RD).\n" + "Example Requests:\n" + "\n" + "interestratecharts?productId=1")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", responseContainer = "List", response = InterestRateChartsApiResourceSwagger.GetInterestRateChartsResponse.class)})
+    public String retrieveAll(@Context final UriInfo uriInfo, @QueryParam("productId") @ApiParam(value = "productId") final Long productId) {
 
         this.context.authenticatedUser().validateHasReadPermission(InterestRateChartApiConstants.INTERESTRATE_CHART_RESOURCE_NAME);
 
@@ -118,10 +109,12 @@ public String retrieveAll(@Context final UriInfo uriInfo, @QueryParam("productId
     @Path("{chartId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveOne(@PathParam("chartId") final Long chartId, @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Retrieve a Chart", httpMethod = "GET", notes = "It retrieves the Interest Rate Chart\n" + "Example Requests:\n" + "\n" + "interestratecharts/1")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = InterestRateChartsApiResourceSwagger.GetInterestRateChartsResponse.class)})
+    public String retrieveOne(@PathParam("chartId") @ApiParam(value = "chartId") final Long chartId, @Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(InterestRateChartApiConstants.INTERESTRATE_CHART_RESOURCE_NAME);
-        
+
         InterestRateChartData chartData = null;
         final Set<String> associationParameters = ApiParameterHelper.extractAssociationsForResponseIfProvided(uriInfo.getQueryParameters());
         if (!associationParameters.isEmpty() && associationParameters.contains(InterestRateChartApiConstants.chartSlabs)) {
@@ -129,7 +122,7 @@ public String retrieveOne(@PathParam("chartId") final Long chartId, @Context fin
         }else {
             chartData = this.chartReadPlatformService.retrieveOne(chartId);
         }
-        
+
         final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
         if (settings.isTemplate()) {
             chartData = this.chartReadPlatformService.retrieveWithTemplate(chartData);
@@ -141,7 +134,10 @@ public String retrieveOne(@PathParam("chartId") final Long chartId, @Context fin
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String create(final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Create a Chart", httpMethod = "POST", notes = "Creates a new chart which can be attached to a term deposit products (FD or RD).")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = InterestRateChartsApiResourceSwagger.PostInterestRateChartsRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = InterestRateChartsApiResourceSwagger.PostInterestRateChartsResponse.class)})
+    public String create(@ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().createInterestRateChart().withJson(apiRequestBodyAsJson).build();
 
@@ -154,7 +150,10 @@ public String create(final String apiRequestBodyAsJson) {
     @Path("{chartId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String update(@PathParam("chartId") final Long chartId, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Update a Chart", notes = "It updates the Chart.", httpMethod = "PUT")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = InterestRateChartsApiResourceSwagger.PutInterestRateChartsChartIdRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = InterestRateChartsApiResourceSwagger.PutInterestRateChartsChartIdResponse.class)})
+    public String update(@PathParam("chartId") @ApiParam(value = "chartId") final Long chartId, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().updateInterestRateChart(chartId)
                 .withJson(apiRequestBodyAsJson).build();
@@ -168,7 +167,9 @@ public String update(@PathParam("chartId") final Long chartId, final String apiR
     @Path("{chartId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String delete(@PathParam("chartId") final Long chartId) {
+    @ApiOperation(value = "Delete a Chart", notes = "It deletes the chart", httpMethod = "DELETE")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = InterestRateChartsApiResourceSwagger.DeleteInterestRateChartsChartIdResponse.class)})
+    public String delete(@PathParam("chartId") @ApiParam(value = "chartId") final Long chartId) {
         final CommandWrapper commandRequest = new CommandWrapperBuilder().deleteInterestRateChart(chartId).build();
         final CommandProcessingResult result = this.commandsSourceWritePlatformService.logCommandSource(commandRequest);
         return this.toApiJsonSerializer.serialize(result);
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/interestratechart/api/InterestRateChartsApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/interestratechart/api/InterestRateChartsApiResourceSwagger.java
new file mode 100644
index 000000000..9da338d16
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/interestratechart/api/InterestRateChartsApiResourceSwagger.java
@@ -0,0 +1,157 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.portfolio.interestratechart.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.time.LocalDate;
+import java.util.Set;
+
+/**
+ * Created by Chirag Gupta on 12/04/17.
+ */
+final class InterestRateChartsApiResourceSwagger {
+    private InterestRateChartsApiResourceSwagger() {
+    }
+
+    @ApiModel(value = "GetInterestRateChartsTemplateResponse")
+    public final static class GetInterestRateChartsTemplateResponse {
+        private GetInterestRateChartsTemplateResponse() {
+        }
+
+        final class GetInterestRateChartsTemplatePeriodTypes {
+            private GetInterestRateChartsTemplatePeriodTypes() {
+            }
+
+            @ApiModelProperty(example = "0")
+            public Integer id;
+            @ApiModelProperty(example = "interestChartPeriodType.days")
+            public String code;
+            @ApiModelProperty(example = "Days")
+            public String value;
+        }
+
+        public Set<GetInterestRateChartsTemplatePeriodTypes> periodTypes;
+    }
+
+    @ApiModel(value = "GetInterestRateChartsResponse")
+    public static final class GetInterestRateChartsResponse {
+        private GetInterestRateChartsResponse() {
+        }
+
+        final class GetInterestRateChartsChartSlabs {
+            private GetInterestRateChartsChartSlabs() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            public GetInterestRateChartsTemplateResponse.GetInterestRateChartsTemplatePeriodTypes periodTypes;
+            @ApiModelProperty(example = "1")
+            public Integer fromPeriod;
+            @ApiModelProperty(example = "6")
+            public Integer annualInterestRate;
+            public GetInterestRateChartsCurrency currency;
+        }
+
+        final class GetInterestRateChartsCurrency {
+            private GetInterestRateChartsCurrency() {
+            }
+
+            @ApiModelProperty(example = "USD")
+            public String code;
+            @ApiModelProperty(example = "US Dollar")
+            public String name;
+            @ApiModelProperty(example = "2")
+            public Integer decimalPlaces;
+            @ApiModelProperty(example = "$")
+            public String displaySymbol;
+            @ApiModelProperty(example = "currency.USD")
+            public String nameCode;
+            @ApiModelProperty(example = "US Dollar ($)")
+            public String displayLabel;
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer id;
+        @ApiModelProperty(example = "[2014, 1, 1]")
+        public LocalDate fromDate;
+        @ApiModelProperty(example = "1")
+        public Integer savingsProductId;
+        @ApiModelProperty(example = "Fixed Deposit Product 001")
+        public String savingsProductName;
+        public Set<GetInterestRateChartsChartSlabs> chartSlabs;
+    }
+
+    @ApiModel(value = "PostInterestRateChartsRequest")
+    public static final class PostInterestRateChartsRequest {
+        private PostInterestRateChartsRequest() {
+        }
+
+        @ApiModelProperty(example = "Chart - 2014")
+        public String name;
+        @ApiModelProperty(example = "This chart is applicable for year 2014")
+        public String description;
+        @ApiModelProperty(example = "Document")
+        public String type;
+        @ApiModelProperty(example = "en")
+        public String locale;
+        @ApiModelProperty(example = "dd MMMM yyyy")
+        public String dateFormat;
+        @ApiModelProperty(example = "01 Jan 2014")
+        public String fromDate;
+    }
+
+    @ApiModel(value = "PostInterestRateChartsResponse")
+    public static final class PostInterestRateChartsResponse {
+        private PostInterestRateChartsResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer resourceId;
+    }
+
+    @ApiModel(value = "PutInterestRateChartsChartIdRequest")
+    public static final class PutInterestRateChartsChartIdRequest {
+        private PutInterestRateChartsChartIdRequest() {
+        }
+        @ApiModelProperty(example = "Interest rate chart for 2014")
+        public String name;
+        @ApiModelProperty(example = "Interest rate chart for 2014")
+        public String description;
+    }
+
+    @ApiModel(value = "PutInterestRateChartsChartIdResponse")
+    public static final class PutInterestRateChartsChartIdResponse {
+        private PutInterestRateChartsChartIdResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer resourceId;
+    }
+
+    @ApiModel(value = "DeleteInterestRateChartsChartIdResponse")
+    public static final class DeleteInterestRateChartsChartIdResponse {
+        private DeleteInterestRateChartsChartIdResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer resourceId;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanChargesApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanChargesApiResource.java
index b5ebd3d07..dce33108a 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanChargesApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanChargesApiResource.java
@@ -18,24 +18,7 @@
  */
 package org.apache.fineract.portfolio.loanaccount.api;
 
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.UriInfo;
-
+import io.swagger.annotations.*;
 import org.apache.commons.lang.StringUtils;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
@@ -56,9 +39,19 @@
 import org.springframework.context.annotation.Scope;
 import org.springframework.stereotype.Component;
 
+import javax.ws.rs.*;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.UriInfo;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
 @Path("/loans/{loanId}/charges")
 @Component
 @Scope("singleton")
+@Api(value = "Loan Charges", description = "Its typical for MFIs to add extra costs for their loan products. They can be either Fees or Penalties.\n" + "\n" + "Loan Charges are instances of Charges and represent either fees and penalties for loan products. Refer Charges for documentation of the various properties of a charge, Only additional properties ( specific to the context of a Charge being associated with a Loan) are described here")
 public class LoanChargesApiResource {
 
     private final Set<String> RESPONSE_DATA_PARAMETERS = new HashSet<>(
@@ -96,7 +89,9 @@ private boolean is(final String commandParam, final String commandValue) {
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveAllLoanCharges(@PathParam("loanId") final Long loanId, @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "List Loan Charges", httpMethod = "GET", notes = "It lists all the Loan Charges specific to a Loan \n\n" + "Example Requests:\n" + "\n" + "loans/1/charges\n" + "\n" + "\n" + "loans/1/charges?fields=name,amountOrPercentage")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", responseContainer = "List", response = LoanChargesApiResourceSwagger.GetLoansLoanIdChargesChargeIdResponse.class)})
+    public String retrieveAllLoanCharges(@PathParam("loanId") @ApiParam(value = "loanId") final Long loanId, @Context final UriInfo uriInfo){
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
 
@@ -108,9 +103,11 @@ public String retrieveAllLoanCharges(@PathParam("loanId") final Long loanId, @Co
 
     @GET
     @Path("template")
-    @Consumes({ MediaType.APPLICATION_JSON })
-    @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveTemplate(@PathParam("loanId") final Long loanId, @Context final UriInfo uriInfo) {
+    @Consumes({MediaType.APPLICATION_JSON})
+    @Produces({MediaType.APPLICATION_JSON})
+    @ApiOperation(value = "Retrieve Loan Charges Template", httpMethod = "GET", notes = "This is a convenience resource. It can be useful when building maintenance user interface screens for client applications. The template data returned consists of any or all of:\n" + "\n" + "Field Defaults\n" + "Allowed Value Lists\n" + "Example Request:\n" + "\n" + "loans/1/charges/template\n" + "\n")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = LoanChargesApiResourceSwagger.GetLoansLoanIdChargesTemplateResponse.class)})
+    public String retrieveTemplate(@PathParam("loanId") @ApiParam(value = "loanId") final Long loanId, @Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
 
@@ -124,10 +121,12 @@ public String retrieveTemplate(@PathParam("loanId") final Long loanId, @Context
 
     @GET
     @Path("{chargeId}")
-    @Consumes({ MediaType.APPLICATION_JSON })
-    @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveLoanCharge(@PathParam("loanId") final Long loanId, @PathParam("chargeId") final Long loanChargeId,
-            @Context final UriInfo uriInfo) {
+    @Consumes({MediaType.APPLICATION_JSON})
+    @Produces({MediaType.APPLICATION_JSON})
+    @ApiOperation(value = "Retrieve a Loan Charge", httpMethod = "GET", notes = "Retrieves Loan Charge according to the Loan ID and Charge ID" + "Example Requests:\n" + "\n" + "/loans/1/charges/1\n" + "\n" + "\n" + "/loans/1/charges/1?fields=name,amountOrPercentage")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = LoanChargesApiResourceSwagger.GetLoansLoanIdChargesChargeIdResponse.class)})
+    public String retrieveLoanCharge(@PathParam("loanId") @ApiParam(value = "loanId") final Long loanId, @PathParam("chargeId") @ApiParam(value = "chargeId") final Long loanChargeId,
+                                     @Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
 
@@ -143,10 +142,13 @@ public String retrieveLoanCharge(@PathParam("loanId") final Long loanId, @PathPa
     }
 
     @POST
-    @Consumes({ MediaType.APPLICATION_JSON })
-    @Produces({ MediaType.APPLICATION_JSON })
-    public String executeLoanCharge(@PathParam("loanId") final Long loanId, @QueryParam("command") final String commandParam,
-            final String apiRequestBodyAsJson) {
+    @Consumes({MediaType.APPLICATION_JSON})
+    @Produces({MediaType.APPLICATION_JSON})
+    @ApiOperation(value = "Create a Loan Charge", httpMethod = "POST", notes = "It Creates a Loan Charge")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = LoanChargesApiResourceSwagger.PostLoansLoanIdChargesRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = LoanChargesApiResourceSwagger.PostLoansLoanIdChargesResponse.class)})
+    public String executeLoanCharge(@PathParam("loanId") @ApiParam(value = "loanId") final Long loanId, @QueryParam("command") @ApiParam(value = "command") final String commandParam,
+                                    @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         CommandProcessingResult result = null;
         if (is(commandParam, "pay")) {
@@ -164,10 +166,13 @@ public String executeLoanCharge(@PathParam("loanId") final Long loanId, @QueryPa
 
     @PUT
     @Path("{chargeId}")
-    @Consumes({ MediaType.APPLICATION_JSON })
-    @Produces({ MediaType.APPLICATION_JSON })
-    public String updateLoanCharge(@PathParam("loanId") final Long loanId, @PathParam("chargeId") final Long loanChargeId,
-            final String apiRequestBodyAsJson) {
+    @Consumes({MediaType.APPLICATION_JSON})
+    @Produces({MediaType.APPLICATION_JSON})
+    @ApiOperation(value = "Update a Loan Charge", httpMethod = "PUT", notes = "Currently Loan Charges may be updated only if the Loan is not yet approved")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = LoanChargesApiResourceSwagger.PutLoansLoanIdChargesChargeIdRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = LoanChargesApiResourceSwagger.PutLoansLoanIdChargesChargeIdResponse.class)})
+    public String updateLoanCharge(@PathParam("loanId") @ApiParam(value = "loanId") final Long loanId, @PathParam("chargeId") @ApiParam(value = "chargeId") final Long loanChargeId,
+                                   @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().updateLoanCharge(loanId, loanChargeId)
                 .withJson(apiRequestBodyAsJson).build();
@@ -179,10 +184,13 @@ public String updateLoanCharge(@PathParam("loanId") final Long loanId, @PathPara
 
     @POST
     @Path("{chargeId}")
-    @Consumes({ MediaType.APPLICATION_JSON })
-    @Produces({ MediaType.APPLICATION_JSON })
-    public String executeLoanCharge(@PathParam("loanId") final Long loanId, @PathParam("chargeId") final Long loanChargeId,
-            @QueryParam("command") final String commandParam, final String apiRequestBodyAsJson) {
+    @Consumes({MediaType.APPLICATION_JSON})
+    @Produces({MediaType.APPLICATION_JSON})
+    @ApiOperation(value = "Pay Loan Charge", httpMethod = "POST", notes = "Loan Charge will be paid if the loan is linked with a savings account")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = LoanChargesApiResourceSwagger.PostLoansLoanIdChargesChargeIdRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = LoanChargesApiResourceSwagger.PostLoansLoanIdChargesChargeIdResponse.class)})
+    public String executeLoanCharge(@PathParam("loanId") @ApiParam(value = "loanId") final Long loanId, @PathParam("chargeId") @ApiParam(value = "chargeId") final Long loanChargeId,
+                                    @QueryParam("command") @ApiParam(value = "command") final String commandParam, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapperBuilder builder = new CommandWrapperBuilder().withJson(apiRequestBodyAsJson);
         CommandProcessingResult result = null;
@@ -201,9 +209,11 @@ public String executeLoanCharge(@PathParam("loanId") final Long loanId, @PathPar
 
     @DELETE
     @Path("{chargeId}")
-    @Consumes({ MediaType.APPLICATION_JSON })
-    @Produces({ MediaType.APPLICATION_JSON })
-    public String deleteLoanCharge(@PathParam("loanId") final Long loanId, @PathParam("chargeId") final Long loanChargeId) {
+    @Consumes({MediaType.APPLICATION_JSON})
+    @Produces({MediaType.APPLICATION_JSON})
+    @ApiOperation(value = "Delete a Loan Charge", httpMethod = "DELETE", notes = "Note: Currently, A Loan Charge may only be removed from Loans that are not yet approved.")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = LoanChargesApiResourceSwagger.DeleteLoansLoanIdChargesChargeIdResponse.class)})
+    public String deleteLoanCharge(@PathParam("loanId") @ApiParam(value = "loanId") final Long loanId, @PathParam("chargeId") @ApiParam(value = "chargeId") final Long loanChargeId) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().deleteLoanCharge(loanId, loanChargeId).build();
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanChargesApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanChargesApiResourceSwagger.java
new file mode 100644
index 000000000..e839359d0
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanChargesApiResourceSwagger.java
@@ -0,0 +1,277 @@
+
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.portfolio.loanaccount.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Set;
+
+/**
+ * Created by Chirag Gupta on 12/02/17.
+ */
+final class LoanChargesApiResourceSwagger {
+    private LoanChargesApiResourceSwagger() {
+    }
+
+    @ApiModel(value = "GetLoansLoanIdChargesChargeIdResponse")
+    public static final class GetLoansLoanIdChargesChargeIdResponse {
+        private GetLoansLoanIdChargesChargeIdResponse() {
+        }
+
+        final class GetLoanChargeTimeType {
+            private GetLoanChargeTimeType() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "chargeTimeType.disbursement")
+            public String code;
+            @ApiModelProperty(example = "Disbursement")
+            public String value;
+        }
+
+        final class GetLoanChargeCalculationType {
+            private GetLoanChargeCalculationType() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "chargeCalculationType.flat")
+            public String code;
+            @ApiModelProperty(example = "Flat")
+            public String value;
+        }
+
+        final class GetLoanChargeCurrency {
+            private GetLoanChargeCurrency() {
+            }
+
+            @ApiModelProperty(example = "USD")
+            public String code;
+            @ApiModelProperty(example = "US Dollar")
+            public String name;
+            @ApiModelProperty(example = "2")
+            public Integer decimalPlaces;
+            @ApiModelProperty(example = "$")
+            public String displaySymbol;
+            @ApiModelProperty(example = "currency.USD")
+            public String nameCode;
+            @ApiModelProperty(example = "US Dollar ($)")
+            public String displayLabel;
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer id;
+        @ApiModelProperty(example = "1")
+        public Integer chargeId;
+        @ApiModelProperty(example = "Loan Processing fee")
+        public String name;
+        public GetLoanChargeTimeType chargeTimeType;
+        public GetLoanChargeCalculationType chargeCalculationType;
+        @ApiModelProperty(example = "0")
+        public Double percentage;
+        @ApiModelProperty(example = "0")
+        public Double amountPercentageAppliedTo;
+        public GetLoanChargeCurrency currency;
+        @ApiModelProperty(example = "100")
+        public Float amount;
+        @ApiModelProperty(example = "0")
+        public Float amountPaid;
+        @ApiModelProperty(example = "0")
+        public Float amountWaived;
+        @ApiModelProperty(example = "0")
+        public Float amountWrittenOff;
+        @ApiModelProperty(example = "100")
+        public Float amountOutstanding;
+        @ApiModelProperty(example = "100")
+        public Float amountOrPercentage;
+        @ApiModelProperty(example = "false")
+        public Boolean penalty;
+    }
+
+    @ApiModel(value = "GetLoansLoanIdChargesTemplateResponse")
+    public static final class GetLoansLoanIdChargesTemplateResponse {
+        private GetLoansLoanIdChargesTemplateResponse() {
+        }
+
+        final class GetLoanChargeTemplateChargeOptions {
+            private GetLoanChargeTemplateChargeOptions() {
+            }
+
+            final class GetLoanChargeTemplateChargeTimeType {
+                private GetLoanChargeTemplateChargeTimeType() {
+                }
+
+                @ApiModelProperty(example = "2")
+                public Integer id;
+                @ApiModelProperty(example = "chargeTimeType.specifiedDueDate")
+                public String code;
+                @ApiModelProperty(example = "Specified due date")
+                public String value;
+            }
+
+            final class GetLoanChargeTemplateChargeAppliesTo {
+                private GetLoanChargeTemplateChargeAppliesTo() {
+                }
+
+                @ApiModelProperty(example = "1  ")
+                public Integer id;
+                @ApiModelProperty(example = "chargeAppliesTo.loan")
+                public String code;
+                @ApiModelProperty(example = "Loan")
+                public String value;
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "Collection fee")
+            public String name;
+            @ApiModelProperty(example = "true")
+            public Boolean active;
+            @ApiModelProperty(example = "false")
+            public Boolean penalty;
+            public GetLoansLoanIdChargesChargeIdResponse.GetLoanChargeCurrency currency;
+            @ApiModelProperty(example = "100")
+            public Float amount;
+            public GetLoanChargeTemplateChargeTimeType chargeTimeType;
+            public GetLoanChargeTemplateChargeAppliesTo chargeAppliesTo;
+            public GetLoansLoanIdChargesChargeIdResponse.GetLoanChargeCalculationType chargeCalculationType;
+        }
+
+        @ApiModelProperty(example = "0")
+        public Float amountPaid;
+        @ApiModelProperty(example = "0")
+        public Float amountWaived;
+        @ApiModelProperty(example = "0")
+        public Float amountWrittenOff;
+        public Set<GetLoanChargeTemplateChargeOptions> chargeOptions;
+        @ApiModelProperty(example = "false")
+        public Boolean penalty;
+    }
+
+    @ApiModel(value = " PostLoansLoanIdChargesRequest")
+    public static final class PostLoansLoanIdChargesRequest {
+        private PostLoansLoanIdChargesRequest() {
+        }
+
+        @ApiModelProperty(example = "2")
+        public Integer chargeId;
+        @ApiModelProperty(example = "en")
+        public String locale;
+        @ApiModelProperty(example = "100")
+        public Float amount;
+        @ApiModelProperty(example = "dd MMMM yyyy")
+        public String dateFormat;
+        @ApiModelProperty(example = "29 April 2013")
+        public String dueDate;
+    }
+
+    @ApiModel(value = " PostLoansLoanIdChargesResponse")
+    public static final class PostLoansLoanIdChargesResponse {
+        private PostLoansLoanIdChargesResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Long officeId;
+        @ApiModelProperty(example = "1")
+        public Long clientId;
+        @ApiModelProperty(example = "1")
+        public Long loanId;
+        @ApiModelProperty(example = "31")
+        public Integer resourceId;
+    }
+
+    @ApiModel(value = " PutLoansLoanIdChargesChargeIdRequest")
+    public static final class PutLoansLoanIdChargesChargeIdRequest {
+        private PutLoansLoanIdChargesChargeIdRequest() {
+        }
+
+        @ApiModelProperty(example = "dd MMMM yyyy")
+        public String dateFormat;
+        @ApiModelProperty(example = "en")
+        public String locale;
+        @ApiModelProperty(example = "60")
+        public Float amount;
+        @ApiModelProperty(example = "27 March 2013")
+        public String dueDate;
+    }
+
+    @ApiModel(value = "PutLoansLoanIdChargesChargeIdResponse")
+    public static final class PutLoansLoanIdChargesChargeIdResponse {
+        private PutLoansLoanIdChargesChargeIdResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Long officeId;
+        @ApiModelProperty(example = "1")
+        public Long clientId;
+        @ApiModelProperty(example = "1")
+        public Long loanId;
+        @ApiModelProperty(example = "6")
+        public Integer resourceId;
+        public PutLoansLoanIdChargesChargeIdRequest changes;
+    }
+
+    @ApiModel(value = "PostLoansLoanIdChargesChargeIdRequest")
+    public static final class PostLoansLoanIdChargesChargeIdRequest {
+        private PostLoansLoanIdChargesChargeIdRequest() {
+        }
+
+        @ApiModelProperty(example = "dd MMMM yyyy")
+        public String dateFormat;
+        @ApiModelProperty(example = "en")
+        public String locale;
+        @ApiModelProperty(example = "19 September 2013")
+        public String transactionDate;
+    }
+
+    @ApiModel(value = "PostLoansLoanIdChargesChargeIdResponse")
+    public static final class PostLoansLoanIdChargesChargeIdResponse {
+        private PostLoansLoanIdChargesChargeIdResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Long officeId;
+        @ApiModelProperty(example = "1")
+        public Long clientId;
+        @ApiModelProperty(example = "6")
+        public Long loanId;
+        @ApiModelProperty(example = "1")
+        public Long savingsId;
+        @ApiModelProperty(example = "12")
+        public Integer resourceId;
+    }
+
+    @ApiModel(value = "DeleteLoansLoanIdChargesChargeIdResponse")
+    public static final class DeleteLoansLoanIdChargesChargeIdResponse {
+        private DeleteLoansLoanIdChargesChargeIdResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Long officeId;
+        @ApiModelProperty(example = "1")
+        public Long clientId;
+        @ApiModelProperty(example = "1")
+        public Long loanId;
+        @ApiModelProperty(example = "2")
+        public Integer resourceId;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanScheduleApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanScheduleApiResource.java
index 3d107f1c6..207381265 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanScheduleApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanScheduleApiResource.java
@@ -18,18 +18,7 @@
  */
 package org.apache.fineract.portfolio.loanaccount.api;
 
-import java.util.HashSet;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.UriInfo;
-
+import io.swagger.annotations.*;
 import org.apache.commons.lang.StringUtils;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
@@ -45,9 +34,16 @@
 import org.springframework.context.annotation.Scope;
 import org.springframework.stereotype.Component;
 
+import javax.ws.rs.*;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.UriInfo;
+import java.util.HashSet;
+
 @Path("/loans/{loanId}/schedule")
 @Component
 @Scope("singleton")
+@Api(value = "Loan Rescheduling", description = "Loan Term Variations provides the ability to change due dates, amounts and number of instalments before loan approval.")
 public class LoanScheduleApiResource {
 
     private final String resourceNameForPermissions = "LOAN";
@@ -73,8 +69,11 @@ public LoanScheduleApiResource(final PlatformSecurityContext context,
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String calculateLoanScheduleOrSubmitVariableSchedule(@PathParam("loanId") final Long loanId,
-            @QueryParam("command") final String commandParam, @Context final UriInfo uriInfo, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Calculate loan repayment schedule based on Loan term variations | Updates loan repayment schedule based on Loan term variations | Updates loan repayment schedule by removing Loan term variations", httpMethod = "POST", notes = "Calculate loan repayment schedule based on Loan term variations:\n\n" + "Mandatory Fields: exceptions,locale,dateFormat\n\n" + "Updates loan repayment schedule based on Loan term variations:\n\n" + "Mandatory Fields: exceptions,locale,dateFormat\n\n" + "Updates loan repayment schedule by removing Loan term variations:\n\n" + "It updates the loan repayment schedule by removing Loan term variations\n\n" + "Showing request/response for 'Updates loan repayment schedule by removing Loan term variations'")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = LoanScheduleApiResourceSwagger.PostLoansLoanIdScheduleRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = LoanScheduleApiResourceSwagger.PostLoansLoanIdScheduleResponse.class)})
+    public String calculateLoanScheduleOrSubmitVariableSchedule(@PathParam("loanId") @ApiParam(value = "loanId") final Long loanId,
+            @QueryParam("command") @ApiParam(value = "command") final String commandParam, @Context final UriInfo uriInfo, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         CommandWrapper commandRequest = null;
         if (is(commandParam, "calculateLoanSchedule")) {
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanScheduleApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanScheduleApiResourceSwagger.java
new file mode 100644
index 000000000..fbd10b753
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanScheduleApiResourceSwagger.java
@@ -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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.portfolio.loanaccount.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.List;
+
+/**
+ * Created by Chirag Gupta on 12/30/17.
+ */
+final class LoanScheduleApiResourceSwagger {
+    private LoanScheduleApiResourceSwagger() {
+    }
+
+    @ApiModel(value = "PostLoansLoanIdScheduleRequest")
+    public final static class PostLoansLoanIdScheduleRequest {
+        private PostLoansLoanIdScheduleRequest() {
+        }
+    }
+
+    @ApiModel(value = "PostLoansLoanIdScheduleResponse")
+    public final static class PostLoansLoanIdScheduleResponse {
+        private PostLoansLoanIdScheduleResponse() {
+        }
+
+        final class PostLoanChanges {
+            private PostLoanChanges() {
+            }
+
+            @ApiModelProperty(example = "[21, 22]")
+            public List<Integer> removedEntityIds;
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer loanId;
+        public PostLoanChanges changes;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanTransactionsApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanTransactionsApiResource.java
index e4b30362b..6e45fd463 100755
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanTransactionsApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanTransactionsApiResource.java
@@ -18,22 +18,7 @@
  */
 package org.apache.fineract.portfolio.loanaccount.api;
 
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.UriInfo;
-
+import io.swagger.annotations.*;
 import org.apache.commons.lang.StringUtils;
 import org.apache.fineract.accounting.journalentry.api.DateParam;
 import org.apache.fineract.commands.domain.CommandWrapper;
@@ -55,9 +40,19 @@
 import org.springframework.context.annotation.Scope;
 import org.springframework.stereotype.Component;
 
+import javax.ws.rs.*;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.UriInfo;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
 @Path("/loans/{loanId}/transactions")
 @Component
 @Scope("singleton")
+@Api(value = "Loan Transactions", description = "Capabilities include loan repayment's, interest waivers and the ability to 'adjust' an existing transaction. An 'adjustment' of a transaction is really a 'reversal' of existing transaction followed by creation of a new transaction with the provided details.")
 public class LoanTransactionsApiResource {
 
     private final Set<String> RESPONSE_DATA_PARAMETERS = new HashSet<>(Arrays.asList("id", "type", "date", "currency", "amount",
@@ -94,9 +89,11 @@ private boolean is(final String commandParam, final String commandValue) {
     @Path("template")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveTransactionTemplate(@PathParam("loanId") final Long loanId, @QueryParam("command") final String commandParam,
-            @Context final UriInfo uriInfo, @QueryParam("dateFormat") final String dateFormat,
-            @QueryParam("transactionDate") final DateParam transactionDateParam, @QueryParam("locale") final String locale) {
+    @ApiOperation(value = "Retrieve Loan Transaction Template", httpMethod = "GET", notes = "This is a convenience resource. It can be useful when building maintenance user interface screens for client applications. The template data returned consists of any or all of:\n" + "\n" + "Field Defaults\n" + "Allowed Value Lists\n\n" + "Example Request:\n" + "\n" + "loans/1/transactions/template?command=repayment")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = LoanTransactionsApiResourceSwagger.GetLoansLoanIdTransactionsTemplateResponse.class)})
+    public String retrieveTransactionTemplate(@PathParam("loanId") @ApiParam(value = "loanId") final Long loanId, @QueryParam("command") @ApiParam(value = "command") final String commandParam,
+                                              @Context final UriInfo uriInfo, @QueryParam("dateFormat") @ApiParam(value = "dateFormat") final String dateFormat,
+                                              @QueryParam("transactionDate") @ApiParam(value = "transactionDate") final DateParam transactionDateParam, @QueryParam("locale") @ApiParam(value = "locale") final String locale) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
 
@@ -149,7 +146,9 @@ public String retrieveTransactionTemplate(@PathParam("loanId") final Long loanId
     @Path("{transactionId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveTransaction(@PathParam("loanId") final Long loanId, @PathParam("transactionId") final Long transactionId,
+    @ApiOperation(value = "Retrieve a Transaction Details", httpMethod = "GET", notes = "Retrieves a Transaction Details\n\n" + "Example Request:\n" + "\n" + "loans/5/transactions/3")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = LoanTransactionsApiResourceSwagger.GetLoansLoanIdTransactionsTransactionIdResponse.class)})
+    public String retrieveTransaction(@PathParam("loanId") @ApiParam(value = "loanId") final Long loanId, @PathParam("transactionId") @ApiParam(value = "transactionId") final Long transactionId,
             @Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
@@ -167,8 +166,11 @@ public String retrieveTransaction(@PathParam("loanId") final Long loanId, @PathP
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String executeLoanTransaction(@PathParam("loanId") final Long loanId, @QueryParam("command") final String commandParam,
-            final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Make a Repayment | Make a Refund of an Active Loan by Cash | Foreclosure of an Active Loan | Waive Interest | Write-off Loan | Make Recovery Payment | Undo Loan Write-off Transaction", httpMethod = "POST", notes = "Make Recovery Payment:\n\n" + "This API allows collecting recovery payments for written-off loans")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = LoanTransactionsApiResourceSwagger.PostLoansLoanIdTransactionsRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = LoanTransactionsApiResourceSwagger.PostLoansLoanIdTransactionsResponse.class)})
+    public String executeLoanTransaction(@PathParam("loanId") @ApiParam(value = "loanId") final Long loanId, @QueryParam("command") @ApiParam(value = "command") final String commandParam,
+            @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapperBuilder builder = new CommandWrapperBuilder().withJson(apiRequestBodyAsJson);
 
@@ -211,8 +213,11 @@ public String executeLoanTransaction(@PathParam("loanId") final Long loanId, @Qu
     @Path("{transactionId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String adjustLoanTransaction(@PathParam("loanId") final Long loanId, @PathParam("transactionId") final Long transactionId,
-            final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Adjust a Transaction", httpMethod = "POST", notes = "Note: there is no need to specify command={transactionType} parameter.\n\n" + "Mandatory Fields: transactionDate, transactionAmount")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = LoanTransactionsApiResourceSwagger.PostLoansLoanIdTransactionsTransactionIdRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = LoanTransactionsApiResourceSwagger.PostLoansLoanIdTransactionsTransactionIdResponse.class)})
+    public String adjustLoanTransaction(@PathParam("loanId") @ApiParam(value = "loanId") final Long loanId, @PathParam("transactionId") @ApiParam(value = "transactionId") final Long transactionId,
+            @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapperBuilder builder = new CommandWrapperBuilder().withJson(apiRequestBodyAsJson);
         final CommandWrapper commandRequest = builder.adjustTransaction(loanId, transactionId).build();
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanTransactionsApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanTransactionsApiResourceSwagger.java
new file mode 100644
index 000000000..aaef19ed5
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoanTransactionsApiResourceSwagger.java
@@ -0,0 +1,191 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.portfolio.loanaccount.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.time.LocalDate;
+
+/**
+ * Created by Chirag Gupta on 12/30/17.
+ */
+final class LoanTransactionsApiResourceSwagger {
+    private LoanTransactionsApiResourceSwagger() {
+    }
+
+    @ApiModel(value = "GetLoansLoanIdTransactionsTemplateResponse")
+    public final static class GetLoansLoanIdTransactionsTemplateResponse {
+        private GetLoansLoanIdTransactionsTemplateResponse() {
+        }
+
+        final class GetLoansTransactionType {
+            private GetLoansTransactionType() {
+            }
+
+            @ApiModelProperty(example = "2")
+            public Integer id;
+            @ApiModelProperty(example = "loanTransactionType.repayment")
+            public String code;
+            @ApiModelProperty(example = "Repayment")
+            public String value;
+        }
+
+        final class GetLoansTotal {
+            private GetLoansTotal() {
+            }
+
+            @ApiModelProperty(example = "XOF")
+            public String currencyCode;
+            @ApiModelProperty(example = "0")
+            public Integer digitsAfterDecimal;
+            @ApiModelProperty(example = "0")
+            public Integer inMultiplesOf;
+            @ApiModelProperty(example = "471")
+            public Float amount;
+            @ApiModelProperty(example = "CFA Franc BCEAO")
+            public String defaultName;
+            @ApiModelProperty(example = "currency.XOF")
+            public String nameCode;
+            @ApiModelProperty(example = "CFA")
+            public String displaySymbol;
+            @ApiModelProperty(example = "false")
+            public Boolean zero;
+            @ApiModelProperty(example = "true")
+            public Boolean greaterThanZero;
+            @ApiModelProperty(example = "471 CFA")
+            public String displaySymbolValue;
+        }
+
+        public GetLoansTransactionType transactionType;
+        @ApiModelProperty(example = "[2009, 8, 1]")
+        public LocalDate date;
+        public GetLoansTotal total;
+    }
+
+    @ApiModel(value = "GetLoansLoanIdTransactionsTransactionIdResponse")
+    public final static class GetLoansLoanIdTransactionsTransactionIdResponse {
+        private GetLoansLoanIdTransactionsTransactionIdResponse() {
+        }
+
+        final class GetLoansType {
+            private GetLoansType() {
+            }
+
+            @ApiModelProperty(example = "2")
+            public Integer id;
+            @ApiModelProperty(example = "loanTransactionType.repayment")
+            public String code;
+            @ApiModelProperty(example = "Repayment")
+            public String value;
+            @ApiModelProperty(example = "false")
+            public Boolean disbursement;
+            @ApiModelProperty(example = "false")
+            public Boolean repaymentAtDisbursement;
+            @ApiModelProperty(example = "true")
+            public Boolean repayment;
+            @ApiModelProperty(example = "false")
+            public Boolean contra;
+            @ApiModelProperty(example = "false")
+            public Boolean waiveInterest;
+            @ApiModelProperty(example = "false")
+            public Boolean waiveCharges;
+            @ApiModelProperty(example = "false")
+            public Boolean writeOff;
+            @ApiModelProperty(example = "false")
+            public Boolean recoveryRepayment;
+        }
+
+        final class GetLoansCurrency {
+            private GetLoansCurrency() {
+            }
+
+            @ApiModelProperty(example = "USD")
+            public String code;
+            @ApiModelProperty(example = "US Dollar")
+            public String name;
+            @ApiModelProperty(example = "2")
+            public Integer decimalPlaces;
+            @ApiModelProperty(example = "$")
+            public String displaySymbol;
+            @ApiModelProperty(example = "currency.USD")
+            public String nameCode;
+            @ApiModelProperty(example = "US Dollar ($)")
+            public String displayLabel;
+        }
+
+        @ApiModelProperty(example = "3")
+        public Integer id;
+        public GetLoansType type;
+        @ApiModelProperty(example = "[2012, 5, 14]")
+        public LocalDate date;
+        @ApiModelProperty(example = "false")
+        public Boolean manuallyReversed;
+        public GetLoansCurrency currency;
+        @ApiModelProperty(example = "559.88")
+        public Double amount;
+        @ApiModelProperty(example = "559.88")
+        public Double interestPortion;
+    }
+
+    @ApiModel(value = "PostLoansLoanIdTransactionsRequest")
+    public final static class PostLoansLoanIdTransactionsRequest {
+        private PostLoansLoanIdTransactionsRequest() {
+        }
+    }
+
+    @ApiModel(value = "PostLoansLoanIdTransactionsResponse")
+    public final static class PostLoansLoanIdTransactionsResponse {
+        private PostLoansLoanIdTransactionsResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer officeId;
+        @ApiModelProperty(example = "1")
+        public Integer clientId;
+        @ApiModelProperty(example = "22")
+        public Integer resourceId;
+    }
+
+    @ApiModel(value = "PostLoansLoanIdTransactionsTransactionIdRequest")
+    public final static class PostLoansLoanIdTransactionsTransactionIdRequest {
+        private PostLoansLoanIdTransactionsTransactionIdRequest() {
+        }
+
+        @ApiModelProperty(example = "en_GB")
+        public String locale;
+        @ApiModelProperty(example = "dd MMMM yyyy")
+        public String dateFormat;
+        @ApiModelProperty(example = "25 May 2012")
+        public String transactionDate;
+        @ApiModelProperty(example = "50,000.00")
+        public Double transactionAmount;
+        @ApiModelProperty(example = "An optional note about why your adjusting or changing the transaction.")
+        public String note;
+    }
+
+    @ApiModel(value = "PostLoansLoanIdTransactionsTransactionIdResponse")
+    public final static class PostLoansLoanIdTransactionsTransactionIdResponse {
+        private PostLoansLoanIdTransactionsTransactionIdResponse() {
+        }
+
+        @ApiModelProperty(example = "16")
+        public Integer resourceId;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoansApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoansApiResource.java
index 22eca702a..2849b9a1a 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoansApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoansApiResource.java
@@ -18,6 +18,9 @@
  */
 package org.apache.fineract.portfolio.loanaccount.api;
 
+import com.google.gson.JsonElement;
+import io.swagger.annotations.*;
+
 import static org.apache.fineract.portfolio.loanproduct.service.LoanEnumerations.interestType;
 
 import java.io.InputStream;
@@ -88,14 +91,7 @@
 import org.apache.fineract.portfolio.fund.service.FundReadPlatformService;
 import org.apache.fineract.portfolio.group.data.GroupGeneralData;
 import org.apache.fineract.portfolio.group.service.GroupReadPlatformService;
-import org.apache.fineract.portfolio.loanaccount.data.DisbursementData;
-import org.apache.fineract.portfolio.loanaccount.data.LoanAccountData;
-import org.apache.fineract.portfolio.loanaccount.data.LoanApprovalData;
-import org.apache.fineract.portfolio.loanaccount.data.LoanChargeData;
-import org.apache.fineract.portfolio.loanaccount.data.LoanTermVariationsData;
-import org.apache.fineract.portfolio.loanaccount.data.LoanTransactionData;
-import org.apache.fineract.portfolio.loanaccount.data.PaidInAdvanceData;
-import org.apache.fineract.portfolio.loanaccount.data.RepaymentScheduleRelatedLoanData;
+import org.apache.fineract.portfolio.loanaccount.data.*;
 import org.apache.fineract.portfolio.loanaccount.domain.LoanTermVariationType;
 import org.apache.fineract.portfolio.loanaccount.exception.LoanTemplateTypeRequiredException;
 import org.apache.fineract.portfolio.loanaccount.exception.NotSupportedLoanTemplateTypeException;
@@ -123,11 +119,11 @@
 import org.springframework.stereotype.Component;
 import org.springframework.util.CollectionUtils;
 
-import com.google.gson.JsonElement;
 
 @Path("/loans")
 @Component
 @Scope("singleton")
+@Api(value = "Loans", description = "The API concept of loans models the loan application process and the loan contract/monitoring process.")
 public class LoansApiResource {
 
     private final Set<String> LOAN_DATA_PARAMETERS = new HashSet<>(Arrays.asList("id", "accountNo", "status", "externalId", "clientId",
@@ -242,8 +238,8 @@ public LoansApiResource(final PlatformSecurityContext context, final LoanReadPla
     @Path("{loanId}/template")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveApprovalTemplate(@PathParam("loanId") final Long loanId, @QueryParam("templateType") final String templateType,
-            @Context final UriInfo uriInfo) {
+    public String retrieveApprovalTemplate(@PathParam("loanId") @ApiParam(value = "loanId") final Long loanId, @QueryParam("templateType") @ApiParam(value = "templateType") final String templateType,
+                                           @Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
 
@@ -265,10 +261,12 @@ public String retrieveApprovalTemplate(@PathParam("loanId") final Long loanId, @
     @Path("template")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String template(@QueryParam("clientId") final Long clientId, @QueryParam("groupId") final Long groupId,
-            @QueryParam("productId") final Long productId, @QueryParam("templateType") final String templateType,
-            @DefaultValue("false") @QueryParam("staffInSelectedOfficeOnly") final boolean staffInSelectedOfficeOnly,
-            @DefaultValue("false") @QueryParam("activeOnly") final boolean onlyActive, @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Retrieve Loan Details Template", httpMethod = "GET", notes = "This is a convenience resource. It can be useful when building maintenance user interface screens for client applications. The template data returned consists of any or all of:\n" + "\n" + "Field Defaults\n" + "Allowed Value Lists\n" + "Example Requests:\n" + "\n" + "loans/template?templateType=individual&clientId=1\n" + "\n" + "\n" + "loans/template?templateType=individual&clientId=1&productId=1")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = LoansApiResourceSwagger.GetLoansTemplateResponse.class)})
+    public String template(@QueryParam("clientId") @ApiParam(value = "clientId") final Long clientId, @QueryParam("groupId") @ApiParam(value = "groupId") final Long groupId,
+            @QueryParam("productId")@ApiParam(value = "productId") final Long productId, @QueryParam("templateType") @ApiParam(value = "templateType") final String templateType,
+            @DefaultValue("false") @QueryParam("staffInSelectedOfficeOnly") @ApiParam(value = "staffInSelectedOfficeOnly") final boolean staffInSelectedOfficeOnly,
+            @DefaultValue("false") @QueryParam("activeOnly") @ApiParam(value = "activeOnly") final boolean onlyActive, @Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
 
@@ -389,8 +387,10 @@ public String template(@QueryParam("clientId") final Long clientId, @QueryParam(
     @Path("{loanId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveLoan(@PathParam("loanId") final Long loanId,
-            @DefaultValue("false") @QueryParam("staffInSelectedOfficeOnly") final boolean staffInSelectedOfficeOnly,
+    @ApiOperation(value = "Retrieve a Loan", httpMethod = "GET", notes = "Note: template=true parameter doesn't apply to this resource." + "Example Requests:\n" + "\n" + "loans/1\n" + "\n" + "\n" + "loans/1?fields=id,principal,annualInterestRate\n" + "\n" + "\n" + "loans/1?associations=all\n" + "\n" + "loans/1?associations=all&exclude=guarantors\n" + "\n" + "\n" + "loans/1?fields=id,principal,annualInterestRate&associations=repaymentSchedule,transactions")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = LoansApiResourceSwagger.GetLoansLoanIdResponse.class)})
+    public String retrieveLoan(@PathParam("loanId") @ApiParam(value = "loanId") final Long loanId,
+            @DefaultValue("false") @QueryParam("staffInSelectedOfficeOnly") @ApiParam(value = "staffInSelectedOfficeOnly") final boolean staffInSelectedOfficeOnly,
             @Context final UriInfo uriInfo) {
         long start = System.currentTimeMillis() ;
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
@@ -636,13 +636,15 @@ public String retrieveLoan(@PathParam("loanId") final Long loanId,
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
+    @ApiOperation(value = "List Loans", httpMethod = "GET", notes = "The list capability of loans can support pagination and sorting.\n" + "Example Requests:\n" + "\n" + "loans\n" + "\n" + "loans?fields=accountNo\n" + "\n" + "loans?offset=10&limit=50\n" + "\n" + "loans?orderBy=accountNo&sortOrder=DESC")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = LoansApiResourceSwagger.GetLoansResponse.class)})
     public String retrieveAll(@Context final UriInfo uriInfo,
-            @QueryParam("sqlSearch") final String sqlSearch,
-            @QueryParam("externalId") final String externalId,
+            @QueryParam("sqlSearch") @ApiParam(value = "sqlSearch") final String sqlSearch,
+            @QueryParam("externalId") @ApiParam(value = "externalId") final String externalId,
             // @QueryParam("underHierarchy") final String hierarchy,
-            @QueryParam("offset") final Integer offset, @QueryParam("limit") final Integer limit,
-            @QueryParam("orderBy") final String orderBy, @QueryParam("sortOrder") final String sortOrder,
-            @QueryParam("accountNo") final String accountNo) {
+            @QueryParam("offset") @ApiParam(value = "offset") final Integer offset, @QueryParam("limit") @ApiParam(value = "limit") final Integer limit,
+            @QueryParam("orderBy") @ApiParam(value = "orderBy") final String orderBy, @QueryParam("sortOrder") @ApiParam(value = "sortOrder")final String sortOrder,
+            @QueryParam("accountNo") @ApiParam(value = "accountNo") final String accountNo) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
 
@@ -658,8 +660,11 @@ public String retrieveAll(@Context final UriInfo uriInfo,
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String calculateLoanScheduleOrSubmitLoanApplication(@QueryParam("command") final String commandParam,
-            @Context final UriInfo uriInfo, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Calculate loan repayment schedule | Submit a new Loan Application", httpMethod = "POST", notes = "It calculates the loan repayment Schedule\n" + "Submits a new loan application\n" + "Mandatory Fields: clientId, productId, principal, loanTermFrequency, loanTermFrequencyType, loanType, numberOfRepayments, repaymentEvery, repaymentFrequencyType, interestRatePerPeriod, amortizationType, interestType, interestCalculationPeriodType, transactionProcessingStrategyId, expectedDisbursementDate, submittedOnDate, loanType\n" + "Optional Fields: graceOnPrincipalPayment, graceOnInterestPayment, graceOnInterestCharged, linkAccountId, allowPartialPeriodInterestCalcualtion, fixedEmiAmount, maxOutstandingLoanBalance, disbursementData, graceOnArrearsAgeing, createStandingInstructionAtDisbursement (requires linkedAccountId if set to true)\n" + "Additional Mandatory Fields if interest recalculation is enabled for product and Rest frequency not same as repayment period: recalculationRestFrequencyDate\n" + "Additional Mandatory Fields if interest recalculation with interest/fee compounding is enabled for product and compounding frequency not same as repayment period: recalculationCompoundingFrequencyDate\n" + "Additional Mandatory Field if Entity-Datatable Check is enabled for the entity of type loan: datatables")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = LoansApiResourceSwagger.PostLoansRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = LoansApiResourceSwagger.PostLoansResponse.class)})
+    public String calculateLoanScheduleOrSubmitLoanApplication(@QueryParam("command") @ApiParam(value = "command") final String commandParam,
+            @Context final UriInfo uriInfo, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         if (is(commandParam, "calculateLoanSchedule")) {
 
@@ -683,7 +688,10 @@ public String calculateLoanScheduleOrSubmitLoanApplication(@QueryParam("command"
     @Path("{loanId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String modifyLoanApplication(@PathParam("loanId") final Long loanId, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Modify a loan application", httpMethod = "PUT", notes = "Loan application can only be modified when in 'Submitted and pending approval' state. Once the application is approved, the details cannot be changed using this method.")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = LoansApiResourceSwagger.PutLoansLoanIdRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = LoansApiResourceSwagger.PutLoansLoanIdResponse.class)})
+    public String modifyLoanApplication(@PathParam("loanId") @ApiParam(value = "loanId") final Long loanId, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().updateLoanApplication(loanId).withJson(apiRequestBodyAsJson)
                 .build();
@@ -697,7 +705,9 @@ public String modifyLoanApplication(@PathParam("loanId") final Long loanId, fina
     @Path("{loanId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String deleteLoanApplication(@PathParam("loanId") final Long loanId) {
+    @ApiOperation(value = "Delete a Loan Application", httpMethod = "DELETE", notes = "Note: Only loans in \"Submitted and awaiting approval\" status can be deleted.")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = LoansApiResourceSwagger.DeleteLoansLoanIdResponse.class)})
+    public String deleteLoanApplication(@PathParam("loanId") @ApiParam(value = "loanId") final Long loanId) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().deleteLoanApplication(loanId).build();
 
@@ -710,8 +720,11 @@ public String deleteLoanApplication(@PathParam("loanId") final Long loanId) {
     @Path("{loanId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String stateTransitions(@PathParam("loanId") final Long loanId, @QueryParam("command") final String commandParam,
-            final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Approve Loan Application | Recover Loan Guarantee | Undo Loan Application Approval | Assign a Loan Officer | Unassign a Loan Officer | Reject Loan Application | Applicant Withdraws from Loan Application | Disburse Loan Disburse Loan To Savings Account | Undo Loan Disbursal", httpMethod = "POST", notes = "Approve Loan Application:\n" + "Mandatory Fields: approvedOnDate\n" + "Optional Fields: approvedLoanAmount and expectedDisbursementDate\n" + "Approves the loan application\n\n" + "Recover Loan Guarantee:\n" + "Recovers the loan guarantee\n\n" + "Undo Loan Application Approval:\n" + "Undoes the Loan Application Approval\n\n" + "Assign a Loan Officer:\n" + "Allows you to assign Loan Officer for existing Loan.\n\n" + "Unassign a Loan Officer:\n" + "Allows you to unassign the Loan Officer.\n\n" + "Reject Loan Application:\n" + "Mandatory Fields: rejectedOnDate\n" + "Allows you to reject the loan application\n\n" + "Applicant Withdraws from Loan Application:\n" + "Mandatory Fields: withdrawnOnDate\n" + "Allows the applicant to withdraw the loan application\n\n" + "Disburse Loan:\n" + "Mandatory Fields: actualDisbursementDate\n" + "Optional Fields: transactionAmount and fixedEmiAmount\n" + "Disburses the Loan\n\n" + "Disburse Loan To Savings Account:\n" + "Mandatory Fields: actualDisbursementDate\n" + "Optional Fields: transactionAmount and fixedEmiAmount\n" + "Disburses the loan to Saving Account\n\n" + "Undo Loan Disbursal:\n" + "Undoes the Loan Disbursal\n" + "Showing request and response for Assign a Loan Officer")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = LoansApiResourceSwagger.PostLoansLoanIdRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = LoansApiResourceSwagger.PostLoansLoanIdResponse.class)})
+    public String stateTransitions(@PathParam("loanId") @ApiParam(value = "loanId") final Long loanId, @QueryParam("command") @ApiParam(value = "command") final String commandParam,
+           @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapperBuilder builder = new CommandWrapperBuilder().withJson(apiRequestBodyAsJson);
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoansApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoansApiResourceSwagger.java
new file mode 100644
index 000000000..df7c602c4
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanaccount/api/LoansApiResourceSwagger.java
@@ -0,0 +1,692 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.portfolio.loanaccount.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.time.LocalDate;
+import java.util.Set;
+
+/**
+ * Created by Chirag Gupta on 12/09/17.
+ */
+final class LoansApiResourceSwagger {
+    private LoansApiResourceSwagger() {
+    }
+
+    @ApiModel(value = "GetLoansTemplateResponse")
+    public final static class GetLoansTemplateResponse {
+        private GetLoansTemplateResponse() {
+        }
+
+        final class GetLoansTemplateTimeline {
+            private GetLoansTemplateTimeline() {
+            }
+
+            @ApiModelProperty(example = "[2013, 3, 8]")
+            public LocalDate expectedDisbursementDate;
+        }
+
+        final class GetLoansTemplateProductOptions {
+            private GetLoansTemplateProductOptions() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "Kampala Product (with cash accounting)")
+            public String name;
+        }
+
+        @ApiModelProperty(example = "1")
+        public Long clientId;
+        @ApiModelProperty(example = "Kampala first Client")
+        public String clientName;
+        @ApiModelProperty(example = "2")
+        public Integer clientOfficeId;
+        public GetLoansTemplateTimeline timeline;
+        public Set<GetLoansTemplateProductOptions> productOptions;
+    }
+
+    @ApiModel(value = "GetLoansLoanIdResponse")
+    public final static class GetLoansLoanIdResponse {
+        private GetLoansLoanIdResponse() {
+        }
+
+        final class GetLoansLoanIdStatus {
+            private GetLoansLoanIdStatus() {
+            }
+
+            @ApiModelProperty(example = "300")
+            public Integer id;
+            @ApiModelProperty(example = "loanStatusType.active")
+            public String code;
+            @ApiModelProperty(example = "Active")
+            public String value;
+            @ApiModelProperty(example = "false")
+            public Boolean pendingApproval;
+            @ApiModelProperty(example = "false")
+            public Boolean waitingForDisbursal;
+            @ApiModelProperty(example = "true")
+            public Boolean active;
+            @ApiModelProperty(example = "false")
+            public Boolean closedObligationsMet;
+            @ApiModelProperty(example = "false")
+            public Boolean closedWrittenOff;
+            @ApiModelProperty(example = "false")
+            public Boolean closedRescheduled;
+            @ApiModelProperty(example = "false")
+            public Boolean closed;
+            @ApiModelProperty(example = "false")
+            public Boolean overpaid;
+        }
+
+        final class GetLoansLoanIdLoanType {
+            private GetLoansLoanIdLoanType() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "loanType.individual")
+            public String code;
+            @ApiModelProperty(example = "Individual")
+            public String value;
+        }
+
+        final class GetLoansLoanIdCurrency {
+            private GetLoansLoanIdCurrency() {
+            }
+
+            @ApiModelProperty(example = "UGX")
+            public String code;
+            @ApiModelProperty(example = "Uganda Shilling")
+            public String name;
+            @ApiModelProperty(example = "2")
+            public Integer decimalPlaces;
+            @ApiModelProperty(example = "USh")
+            public String displaySymbol;
+            @ApiModelProperty(example = "currency.UGX")
+            public String nameCode;
+            @ApiModelProperty(example = "Uganda Shilling (USh)")
+            public String displayLabel;
+        }
+
+        final class GetLoansLoanIdTermPeriodFrequencyType {
+            private GetLoansLoanIdTermPeriodFrequencyType() {
+            }
+
+            @ApiModelProperty(example = "2")
+            public Integer id;
+            @ApiModelProperty(example = "termFrequency.periodFrequencyType.months")
+            public String code;
+            @ApiModelProperty(example = "Months")
+            public String value;
+        }
+
+        final class GetLoansLoanIdRepaymentFrequencyType {
+            private GetLoansLoanIdRepaymentFrequencyType() {
+            }
+
+            @ApiModelProperty(example = "2")
+            public Integer id;
+            @ApiModelProperty(example = "repaymentFrequency.periodFrequencyType.months")
+            public String code;
+            @ApiModelProperty(example = "Months")
+            public String value;
+        }
+
+        final class GetLoansLoanIdInterestRateFrequencyType {
+            private GetLoansLoanIdInterestRateFrequencyType() {
+            }
+
+            @ApiModelProperty(example = "3")
+            public Integer id;
+            @ApiModelProperty(example = "interestRateFrequency.periodFrequencyType.years")
+            public String code;
+            @ApiModelProperty(example = "Per year")
+            public String value;
+        }
+
+        final class GetLoansLoanIdAmortizationType {
+            private GetLoansLoanIdAmortizationType() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "amortizationType.equal.installments")
+            public String code;
+            @ApiModelProperty(example = "Equal installments")
+            public String value;
+        }
+
+        final class GetLoansLoanIdInterestType {
+            private GetLoansLoanIdInterestType() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "interestType.flat")
+            public String code;
+            @ApiModelProperty(example = "Flat")
+            public String value;
+        }
+
+        final class GetLoansLoanIdInterestCalculationPeriodType {
+            private GetLoansLoanIdInterestCalculationPeriodType() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "interestCalculationPeriodType.same.as.repayment.period")
+            public String code;
+            @ApiModelProperty(example = "Same as repayment period")
+            public String value;
+        }
+
+        final class GetLoansLoanIdTimeline {
+            private GetLoansLoanIdTimeline() {
+            }
+
+            @ApiModelProperty(example = "[2012, 4, 3]")
+            public LocalDate submittedOnDate;
+            @ApiModelProperty(example = "admin")
+            public String submittedByUsername;
+            @ApiModelProperty(example = "App")
+            public String submittedByFirstname;
+            @ApiModelProperty(example = "Administrator")
+            public String submittedByLastname;
+            @ApiModelProperty(example = "[2012, 4, 3]")
+            public LocalDate approvedOnDate;
+            @ApiModelProperty(example = "admin")
+            public String approvedByUsername;
+            @ApiModelProperty(example = "App")
+            public String approvedByFirstname;
+            @ApiModelProperty(example = "Administrator")
+            public String approvedByLastname;
+            @ApiModelProperty(example = "[2012, 4, 10]")
+            public LocalDate expectedDisbursementDate;
+            @ApiModelProperty(example = "[2012, 4, 10]")
+            public LocalDate actualDisbursementDate;
+            @ApiModelProperty(example = "admin")
+            public String disbursedByUsername;
+            @ApiModelProperty(example = "App")
+            public String disbursedByFirstname;
+            @ApiModelProperty(example = "Administrator")
+            public String disbursedByLastname;
+            @ApiModelProperty(example = "[2012, 4, 10]")
+            public LocalDate expectedMaturityDate;
+        }
+
+        final class GetLoansLoanIdSummary {
+            private GetLoansLoanIdSummary() {
+            }
+
+            final class GetLoansLoanIdEmiVariations {
+                private GetLoansLoanIdEmiVariations() {
+                }
+            }
+
+            final class GetLoansLoanIdLinkedAccount {
+                private GetLoansLoanIdLinkedAccount() {
+                }
+
+                @ApiModelProperty(example = "1")
+                public Integer id;
+                @ApiModelProperty(example = "000000001")
+                public Long accountNo;
+            }
+
+            final class GetLoansLoanIdDisbursementDetails {
+                private GetLoansLoanIdDisbursementDetails() {
+                }
+
+                @ApiModelProperty(example = "71")
+                public Integer id;
+                @ApiModelProperty(example = "[2013, 11, 1]")
+                public LocalDate expectedDisbursementDate;
+                @ApiModelProperty(example = "22000.000000")
+                public Float principal;
+                @ApiModelProperty(example = "22000.000000")
+                public Float approvedPrincipal;
+            }
+
+            final class GetLoansLoanIdOverdueCharges {
+                private GetLoansLoanIdOverdueCharges() {
+                }
+
+                final class GetLoansLoanIdChargeTimeType {
+                    private GetLoansLoanIdChargeTimeType() {
+                    }
+
+                    @ApiModelProperty(example = "9")
+                    public Integer id;
+                    @ApiModelProperty(example = "chargeTimeType.overdueInstallment")
+                    public String code;
+                    @ApiModelProperty(example = "overdue fees")
+                    public String value;
+                }
+
+                final class GetLoansLoanIdChargeCalculationType {
+                    private GetLoansLoanIdChargeCalculationType() {
+                    }
+
+                    @ApiModelProperty(example = "2")
+                    public Integer id;
+                    @ApiModelProperty(example = "chargeCalculationType.percent.of.amount")
+                    public String code;
+                    @ApiModelProperty(example = "% Amount")
+                    public String value;
+                }
+
+                final class GetLoansLoanIdChargePaymentMode {
+                    private GetLoansLoanIdChargePaymentMode() {
+                    }
+
+                    @ApiModelProperty(example = "0")
+                    public Integer id;
+                    @ApiModelProperty(example = "chargepaymentmode.regular")
+                    public String code;
+                    @ApiModelProperty(example = "Regular")
+                    public String value;
+                }
+
+                final class GetLoansLoanIdFeeFrequency {
+                    private GetLoansLoanIdFeeFrequency() {
+                    }
+
+                    @ApiModelProperty(example = "1")
+                    public Integer id;
+                    @ApiModelProperty(example = "feeFrequencyperiodFrequencyType.weeks")
+                    public String code;
+                    @ApiModelProperty(example = "Weeks")
+                    public String value;
+                }
+
+                @ApiModelProperty(example = "20")
+                public Integer id;
+                @ApiModelProperty(example = "overdraft penality")
+                public String name;
+                @ApiModelProperty(example = "true")
+                public Boolean active;
+                @ApiModelProperty(example = "true")
+                public Boolean penalty;
+                public LoanChargesApiResourceSwagger.GetLoansLoanIdChargesChargeIdResponse.GetLoanChargeCurrency currency;
+                @ApiModelProperty(example = "3.000000")
+                public Float amount;
+                public GetLoansLoanIdChargeTimeType chargeTimeType;
+                public LoanChargesApiResourceSwagger.GetLoansLoanIdChargesTemplateResponse.GetLoanChargeTemplateChargeOptions.GetLoanChargeTemplateChargeAppliesTo chargeAppliesTo;
+                public GetLoansLoanIdChargeCalculationType chargeCalculationType;
+                public GetLoansLoanIdChargePaymentMode chargePaymentMode;
+                @ApiModelProperty(example = "2")
+                public Integer feeInterval;
+                public GetLoansLoanIdFeeFrequency feeFrequency;
+            }
+
+            public GetLoansLoanIdCurrency currency;
+            @ApiModelProperty(example = "1000000")
+            public Long principalDisbursed;
+            @ApiModelProperty(example = "0")
+            public Long principalPaid;
+            @ApiModelProperty(example = "0")
+            public Long principalWrittenOff;
+            @ApiModelProperty(example = "1000000")
+            public Long principalOutstanding;
+            @ApiModelProperty(example = "833333.3")
+            public Double principalOverdue;
+            @ApiModelProperty(example = "240000")
+            public Long interestCharged;
+            @ApiModelProperty(example = "0")
+            public Long interestPaid;
+            @ApiModelProperty(example = "0")
+            public Long interestWaived;
+            @ApiModelProperty(example = "0")
+            public Long interestWrittenOff;
+            @ApiModelProperty(example = "240000")
+            public Long interestOutstanding;
+            @ApiModelProperty(example = "200000")
+            public Long interestOverdue;
+            @ApiModelProperty(example = "18000")
+            public Long feeChargesCharged;
+            @ApiModelProperty(example = "0")
+            public Long feeChargesDueAtDisbursementCharged;
+            @ApiModelProperty(example = "0")
+            public Long feeChargesPaid;
+            @ApiModelProperty(example = "0")
+            public Long feeChargesWaived;
+            @ApiModelProperty(example = "0")
+            public Long feeChargesWrittenOff;
+            @ApiModelProperty(example = "18000")
+            public Long feeChargesOutstanding;
+            @ApiModelProperty(example = "15000")
+            public Long feeChargesOverdue;
+            @ApiModelProperty(example = "0")
+            public Long penaltyChargesCharged;
+            @ApiModelProperty(example = "0")
+            public Long penaltyChargesPaid;
+            @ApiModelProperty(example = "0")
+            public Long penaltyChargesWaived;
+            @ApiModelProperty(example = "0")
+            public Long penaltyChargesWrittenOff;
+            @ApiModelProperty(example = "0")
+            public Long penaltyChargesOutstanding;
+            @ApiModelProperty(example = "0")
+            public Long penaltyChargesOverdue;
+            @ApiModelProperty(example = "1258000")
+            public Long totalExpectedRepayment;
+            @ApiModelProperty(example = "0")
+            public Long totalRepayment;
+            @ApiModelProperty(example = "258000")
+            public Long totalExpectedCostOfLoan;
+            @ApiModelProperty(example = "0")
+            public Long totalCostOfLoan;
+            @ApiModelProperty(example = "0")
+            public Long totalWaived;
+            @ApiModelProperty(example = "0")
+            public Long totalWrittenOff;
+            @ApiModelProperty(example = "1258000")
+            public Long totalOutstanding;
+            @ApiModelProperty(example = "1048333.3")
+            public Double totalOverdue;
+            @ApiModelProperty(example = "[2012, 5, 10]")
+            public LocalDate overdueSinceDate;
+            public GetLoansLoanIdLinkedAccount linkedAccount;
+            public Set<GetLoansLoanIdDisbursementDetails> disbursementDetails;
+            @ApiModelProperty(example = "1100.000000")
+            public Float fixedEmiAmount;
+            @ApiModelProperty(example = "35000")
+            public Long maxOutstandingLoanBalance;
+            @ApiModelProperty(example = "false")
+            public Boolean canDisburse;
+            public Set<GetLoansLoanIdEmiVariations> emiAmountVariations;
+            @ApiModelProperty(example = "true")
+            public Boolean inArrears;
+            @ApiModelProperty(example = "false")
+            public Boolean isNPA;
+            public Set<GetLoansLoanIdOverdueCharges> overdueCharges;
+        }
+
+        @ApiModelProperty(example = "1")
+        public Long id;
+        @ApiModelProperty(example = "000000001")
+        public Long accountNo;
+        public GetLoansLoanIdStatus status;
+        @ApiModelProperty(example = "1")
+        public Integer clientId;
+        @ApiModelProperty(example = "Kampala first Client")
+        public String clientName;
+        @ApiModelProperty(example = "2")
+        public Integer clientOfficeId;
+        @ApiModelProperty(example = "1")
+        public Integer loanProductId;
+        @ApiModelProperty(example = "Kampala Product (with cash accounting)")
+        public String loanProductName;
+        @ApiModelProperty(example = "Typical Kampala loan product with cash accounting enabled for testing.")
+        public String loanProductDescription;
+        @ApiModelProperty(example = "22")
+        public Integer loanPurposeId;
+        @ApiModelProperty(example = "option.HousingImprovement")
+        public String loanPurposeName;
+        @ApiModelProperty(example = "2")
+        public Integer loanOfficerId;
+        @ApiModelProperty(example = "LoanOfficer, Kampala")
+        public String loanOfficerName;
+        public GetLoansLoanIdLoanType loanType;
+        public GetLoansLoanIdCurrency currency;
+        @ApiModelProperty(example = "1000000")
+        public Long principal;
+        @ApiModelProperty(example = "12")
+        public Integer termFrequency;
+        public GetLoansLoanIdTermPeriodFrequencyType termPeriodFrequencyType;
+        @ApiModelProperty(example = "12")
+        public Integer numberOfRepayments;
+        @ApiModelProperty(example = "1")
+        public Integer repaymentEvery;
+        public GetLoansLoanIdRepaymentFrequencyType repaymentFrequencyType;
+        @ApiModelProperty(example = "24")
+        public Integer interestRatePerPeriod;
+        public GetLoansLoanIdInterestRateFrequencyType interestRateFrequencyType;
+        @ApiModelProperty(example = "24")
+        public Integer annualInterestRate;
+        public GetLoansLoanIdAmortizationType amortizationType;
+        public GetLoansLoanIdInterestType interestType;
+        public GetLoansLoanIdInterestCalculationPeriodType interestCalculationPeriodType;
+        @ApiModelProperty(example = "2")
+        public Integer transactionProcessingStrategyId;
+        public GetLoansLoanIdTimeline timeline;
+        public GetLoansLoanIdSummary summary;
+    }
+
+    @ApiModel(value = "GetLoansResponse")
+    public final static class GetLoansResponse {
+        private GetLoansResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer totalFilteredRecords;
+        public Set<GetLoansLoanIdResponse> pageItems;
+    }
+
+    @ApiModel(value = "PostLoansRequest")
+    public static final class PostLoansRequest {
+        private PostLoansRequest() {
+        }
+
+        @ApiModelProperty(example = "dd MMMM yyyy")
+        public String dateFormat;
+        @ApiModelProperty(example = "en_GB")
+        public String locale;
+        @ApiModelProperty(example = "1")
+        public Integer productId;
+        @ApiModelProperty(example = "100,000.00")
+        public Double principal;
+        @ApiModelProperty(example = "12")
+        public Integer loanTermFrequency;
+        @ApiModelProperty(example = "2")
+        public Integer loanTermFrequencyType;
+        @ApiModelProperty(example = "12")
+        public Integer numberOfRepayments;
+        @ApiModelProperty(example = "1")
+        public Integer repaymentEvery;
+        @ApiModelProperty(example = "2")
+        public Integer repaymentFrequencyType;
+        @ApiModelProperty(example = "2")
+        public Integer interestRatePerPeriod;
+        @ApiModelProperty(example = "1")
+        public Integer amortizationType;
+        @ApiModelProperty(example = "0")
+        public Integer interestType;
+        @ApiModelProperty(example = "1")
+        public Integer interestCalculationPeriodType;
+        @ApiModelProperty(example = "20 September 2011")
+        public String expectedDisbursementDate;
+        @ApiModelProperty(example = "2")
+        public Integer transactionProcessingStrategyId;
+    }
+
+    @ApiModel(value = "PostLoansResponse")
+    public static final class PostLoansResponse {
+        private PostLoansResponse() {
+        }
+
+        final class PostLoansRepaymentSchedulePeriods {
+            private PostLoansRepaymentSchedulePeriods() {
+            }
+
+            @ApiModelProperty(example = "0")
+            public Integer period;
+            @ApiModelProperty(example = "[2011, 9, 20]")
+            public LocalDate dueDate;
+            @ApiModelProperty(example = "100000")
+            public Long principalDisbursed;
+            @ApiModelProperty(example = "100000")
+            public Long principalLoanBalanceOutstanding;
+            @ApiModelProperty(example = "0")
+            public Long feeChargesDue;
+            @ApiModelProperty(example = "0")
+            public Long feeChargesOutstanding;
+            @ApiModelProperty(example = "0")
+            public Long totalOriginalDueForPeriod;
+            @ApiModelProperty(example = "0")
+            public Long totalDueForPeriod;
+            @ApiModelProperty(example = "0")
+            public Long totalOutstandingForPeriod;
+            @ApiModelProperty(example = "0")
+            public Long totalOverdue;
+            @ApiModelProperty(example = "0")
+            public Long totalActualCostOfLoanForPeriod;
+        }
+
+        public GetLoansLoanIdResponse.GetLoansLoanIdCurrency currency;
+        @ApiModelProperty(example = "366")
+        public Integer loanTermInDays;
+        @ApiModelProperty(example = "100000")
+        public Long totalPrincipalDisbursed;
+        @ApiModelProperty(example = "100000")
+        public Long totalPrincipalExpected;
+        @ApiModelProperty(example = "0")
+        public Long totalPrincipalPaid;
+        @ApiModelProperty(example = "13471.52")
+        public Double totalInterestCharged;
+        @ApiModelProperty(example = "0")
+        public Long totalFeeChargesCharged;
+        @ApiModelProperty(example = "0")
+        public Long totalPenaltyChargesCharged;
+        @ApiModelProperty(example = "0")
+        public Long totalWaived;
+        @ApiModelProperty(example = "0")
+        public Long totalWrittenOff;
+        @ApiModelProperty(example = "113471.52")
+        public Double totalRepaymentExpected;
+        @ApiModelProperty(example = "0")
+        public Long totalRepayment;
+        @ApiModelProperty(example = "0")
+        public Long totalOutstanding;
+        public Set<PostLoansRepaymentSchedulePeriods> periods;
+    }
+
+    @ApiModel(value = "PutLoansLoanIdRequest")
+    public final static class PutLoansLoanIdRequest {
+        private PutLoansLoanIdRequest() {
+        }
+
+        @ApiModelProperty(example = "en")
+        public String locale;
+        @ApiModelProperty(example = "dd MMMM yyyy")
+        public String dateFormat;
+        @ApiModelProperty(example = "1")
+        public Integer productId;
+        @ApiModelProperty(example = "5000")
+        public Long principal;
+        @ApiModelProperty(example = "10")
+        public Integer loanTermFrequency;
+        @ApiModelProperty(example = "0")
+        public Integer loanTermFrequencyType;
+        @ApiModelProperty(example = "10")
+        public Integer numberOfRepayments;
+        @ApiModelProperty(example = "1")
+        public Integer repaymentEvery;
+        @ApiModelProperty(example = "0")
+        public Integer repaymentFrequencyType;
+        @ApiModelProperty(example = "2")
+        public Integer interestRatePerPeriod;
+        @ApiModelProperty(example = "0")
+        public Integer interestType;
+        @ApiModelProperty(example = "0")
+        public Integer interestCalculationPeriodType;
+        @ApiModelProperty(example = "1")
+        public Integer amortizationType;
+        @ApiModelProperty(example = "04 March 2014")
+        public String expectedDisbursementDate;
+        @ApiModelProperty(example = "1")
+        public Integer transactionProcessingStrategyId;
+    }
+
+    @ApiModel(value = "PutLoansLoanIdResponse")
+    public final static class PutLoansLoanIdResponse {
+        private PutLoansLoanIdResponse() {
+        }
+
+        final class PutLoansLoanIdChanges {
+            private PutLoansLoanIdChanges() {
+            }
+
+            @ApiModelProperty(example = "5000")
+            public Long principal;
+            @ApiModelProperty(example = "en")
+            public String locale;
+        }
+
+        @ApiModelProperty(example = "2")
+        public Integer officeId;
+        @ApiModelProperty(example = "1")
+        public Integer clientId;
+        @ApiModelProperty(example = "1")
+        public Integer loanId;
+        @ApiModelProperty(example = "1")
+        public Integer resourceId;
+        public PutLoansLoanIdChanges changes;
+    }
+
+    @ApiModel(value = "DeleteLoansLoanIdResponse")
+    public static final class DeleteLoansLoanIdResponse {
+        private DeleteLoansLoanIdResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer officeId;
+        @ApiModelProperty(example = "1")
+        public Integer clientId;
+        @ApiModelProperty(example = "1")
+        public Integer loanId;
+        @ApiModelProperty(example = "1")
+        public Integer resourceId;
+    }
+
+    @ApiModel(value = "PostLoansLoanIdRequest")
+    public final static class PostLoansLoanIdRequest {
+        private PostLoansLoanIdRequest() {
+        }
+
+        @ApiModelProperty(example = "2")
+        public Integer toLoanOfficerId;
+        @ApiModelProperty(example = "02 September 2014")
+        public String assignmentDate;
+        @ApiModelProperty(example = "en")
+        public String locale;
+        @ApiModelProperty(example = "dd MMMM yyyy")
+        public String dateFormat;
+        @ApiModelProperty(example = "")
+        public Integer fromLoanOfficerId;
+    }
+
+    @ApiModel(value = "PostLoansLoanIdResponse")
+    public static final class PostLoansLoanIdResponse {
+        private PostLoansLoanIdResponse() {
+        }
+
+        @ApiModelProperty(example = "2")
+        public Integer officeId;
+        @ApiModelProperty(example = "6")
+        public Integer clientId;
+        @ApiModelProperty(example = "3")
+        public Integer loanId;
+        @ApiModelProperty(example = "3")
+        public Integer resourceId;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/api/LoanProductsApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/api/LoanProductsApiResource.java
index 5a56c5a18..9c68524f7 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/api/LoanProductsApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/api/LoanProductsApiResource.java
@@ -18,25 +18,7 @@
  */
 package org.apache.fineract.portfolio.loanproduct.api;
 
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.UriInfo;
-
+import io.swagger.annotations.*;
 import org.apache.fineract.accounting.common.AccountingDropdownReadPlatformService;
 import org.apache.fineract.accounting.glaccount.data.GLAccountData;
 import org.apache.fineract.accounting.producttoaccountmapping.data.ChargeToGLAccountMapper;
@@ -74,9 +56,16 @@
 import org.springframework.context.annotation.Scope;
 import org.springframework.stereotype.Component;
 
+import javax.ws.rs.*;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.UriInfo;
+import java.util.*;
+
 @Path("/loanproducts")
 @Component
 @Scope("singleton")
+@Api(value = "Loan Products", description = "A Loan product is a template that is used when creating a loan. Much of the template definition can be overridden during loan creation.")
 public class LoanProductsApiResource {
 
     private final Set<String> LOAN_PRODUCT_DATA_PARAMETERS = new HashSet<>(Arrays.asList("id", "name", "shortName", "description",
@@ -150,7 +139,10 @@ public LoanProductsApiResource(final PlatformSecurityContext context, final Loan
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String createLoanProduct(final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Create a Loan Product", httpMethod = "POST", notes = "Depending of the Accounting Rule (accountingRule) selected, additional fields with details of the appropriate Ledger Account identifiers would need to be passed in.\n" + "\n" + "Refer MifosX Accounting Specs Draft for more details regarding the significance of the selected accounting rule\n\n" + "Mandatory Fields: name, shortName, currencyCode, digitsAfterDecimal, inMultiplesOf, principal, numberOfRepayments, repaymentEvery, repaymentFrequencyType, interestRatePerPeriod, interestRateFrequencyType, amortizationType, interestType, interestCalculationPeriodType, transactionProcessingStrategyId, accountingRule, isInterestRecalculationEnabled, daysInYearType, daysInMonthType\n\n" + "Optional Fields: inArrearsTolerance, graceOnPrincipalPayment, graceOnInterestPayment, graceOnInterestCharged, graceOnArrearsAgeing, charges, paymentChannelToFundSourceMappings, feeToIncomeAccountMappings, penaltyToIncomeAccountMappings, includeInBorrowerCycle, useBorrowerCycle,principalVariationsForBorrowerCycle, numberOfRepaymentVariationsForBorrowerCycle, interestRateVariationsForBorrowerCycle, multiDisburseLoan,maxTrancheCount, outstandingLoanBalance,overdueDaysForNPA,holdGuaranteeFunds, principalThresholdForLastInstalment, accountMovesOutOfNPAOnlyOnArrearsCompletion, canDefineInstallmentAmount, installmentAmountInMultiplesOf, allowAttributeOverrides, allowPartialPeriodInterestCalcualtion\n\n" + "Additional Mandatory Fields for Cash(2) based accounting: fundSourceAccountId, loanPortfolioAccountId, interestOnLoanAccountId, incomeFromFeeAccountId, incomeFromPenaltyAccountId, writeOffAccountId, transfersInSuspenseAccountId, overpaymentLiabilityAccountId\n\n" + "Additional Mandatory Fields for periodic (3) and upfront (4)accrual accounting: fundSourceAccountId, loanPortfolioAccountId, interestOnLoanAccountId, incomeFromFeeAccountId, incomeFromPenaltyAccountId, writeOffAccountId, receivableInterestAccountId, receivableFeeAccountId, receivablePenaltyAccountId, transfersInSuspenseAccountId, overpaymentLiabilityAccountId\n\n" + "Additional Mandatory Fields if interest recalculation is enabled(true): interestRecalculationCompoundingMethod, rescheduleStrategyMethod, recalculationRestFrequencyType\n\n" + "Additional Optional Fields if interest recalculation is enabled(true): isArrearsBasedOnOriginalSchedule, preClosureInterestCalculationStrategy\n\n" + "Additional Optional Fields if interest recalculation is enabled(true) and recalculationRestFrequencyType is not same as repayment period: recalculationRestFrequencyInterval, recalculationRestFrequencyDate\n\n" + "Additional Optional Fields if interest recalculation is enabled(true) and interestRecalculationCompoundingMethod is enabled: recalculationCompoundingFrequencyType\n\n" + "Additional Optional Fields if interest recalculation is enabled(true) and interestRecalculationCompoundingMethod is enabled and recalculationCompoundingFrequencyType is not same as repayment period: recalculationCompoundingFrequencyInterval, recalculationCompoundingFrequencyDate\n\n" + "Additional Mandatory Fields if Hold Guarantee funds is enabled(true): mandatoryGuarantee\n\n" + "Additional Optional Fields if Hold Guarantee funds is enabled(true): minimumGuaranteeFromOwnFunds,minimumGuaranteeFromGuarantor")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = LoanProductsApiResourceSwagger.PostLoanProductsRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200,message = "OK", response = LoanProductsApiResourceSwagger.PostLoanProductsResponse.class)})
+    public String createLoanProduct(@ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().createLoanProduct().withJson(apiRequestBodyAsJson).build();
 
@@ -162,6 +154,8 @@ public String createLoanProduct(final String apiRequestBodyAsJson) {
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
+    @ApiOperation(value = "List Loan Products", httpMethod = "GET", notes = "Lists Loan Products\n\n" + "Example Requests:\n" + "\n" + "loanproducts\n" + "\n" + "\n" + "loanproducts?fields=name,description,interestRateFrequencyType,amortizationType")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", responseContainer = "List", response = LoanProductsApiResourceSwagger.GetLoanProductsResponse.class)})
     public String retrieveAllLoanProducts(@Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
@@ -185,7 +179,9 @@ public String retrieveAllLoanProducts(@Context final UriInfo uriInfo) {
     @Path("template")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveTemplate(@Context final UriInfo uriInfo, @QueryParam("isProductMixTemplate") final boolean isProductMixTemplate) {
+    @ApiOperation(value = "Retrieve Loan Product Details Template", httpMethod = "GET", notes = "This is a convenience resource. It can be useful when building maintenance user interface screens for client applications. The template data returned consists of any or all of:\n" + "\n" + "Field Defaults\n" + "Allowed Value Lists\n" + "Example Request:\n" + "\n" + "loanproducts/template")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = LoanProductsApiResourceSwagger.GetLoanProductsTemplateResponse.class)})
+    public String retrieveTemplate(@Context final UriInfo uriInfo, @QueryParam("isProductMixTemplate") @ApiParam(value = "isProductMixTemplate") final boolean isProductMixTemplate) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
         final ApiRequestJsonSerializationSettings settings = this.apiRequestParameterHelper.process(uriInfo.getQueryParameters());
@@ -208,7 +204,9 @@ public String retrieveTemplate(@Context final UriInfo uriInfo, @QueryParam("isPr
     @Path("{productId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveLoanProductDetails(@PathParam("productId") final Long productId, @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Retrieve a Loan Product", httpMethod = "GET", notes = "Retrieves a Loan Product\n\n" + "Example Requests:\n" + "\n" + "loanproducts/1\n" + "\n" + "\n" + "loanproducts/1?template=true\n" + "\n" + "\n" + "loanproducts/1?fields=name,description,numberOfRepayments")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = LoanProductsApiResourceSwagger.GetLoanProductsProductIdResponse.class)})
+    public String retrieveLoanProductDetails(@PathParam("productId") @ApiParam(value = "productId") final Long productId, @Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(this.resourceNameForPermissions);
 
@@ -243,7 +241,10 @@ public String retrieveLoanProductDetails(@PathParam("productId") final Long prod
     @Path("{productId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String updateLoanProduct(@PathParam("productId") final Long productId, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Update a Loan Product", httpMethod = "PUT", notes = "Updates a Loan Product")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = LoanProductsApiResourceSwagger.PutLoanProductsProductIdRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = LoanProductsApiResourceSwagger.PutLoanProductsProductIdResponse.class)})
+    public String updateLoanProduct(@PathParam("productId") @ApiParam(value = "productId") final Long productId, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().updateLoanProduct(productId).withJson(apiRequestBodyAsJson)
                 .build();
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/api/LoanProductsApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/api/LoanProductsApiResourceSwagger.java
new file mode 100644
index 000000000..cd09968ba
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/loanproduct/api/LoanProductsApiResourceSwagger.java
@@ -0,0 +1,1109 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.portfolio.loanproduct.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.time.LocalDate;
+import java.util.List;
+import java.util.Set;
+
+/**
+ * Created by Chirag Gupta on 12/27/17.
+ */
+final class LoanProductsApiResourceSwagger {
+    private LoanProductsApiResourceSwagger() {
+    }
+
+    @ApiModel(value = "PostLoanProductsRequest")
+    public final static class PostLoanProductsRequest {
+        private PostLoanProductsRequest() {
+        }
+
+        @ApiModelProperty(example = "LP Accrual Accounting")
+        public String name;
+        @ApiModelProperty(example = "LPAA")
+        public String shortName;
+        @ApiModelProperty(example = "USD")
+        public String currencyCode;
+        @ApiModelProperty(example = "en_GB")
+        public String locale;
+        @ApiModelProperty(example = "2")
+        public Integer digitsAfterDecimal;
+        @ApiModelProperty(example = "0")
+        public Integer inMultiplesOf;
+        @ApiModelProperty(example = "100,000.00")
+        public Double principal;
+        @ApiModelProperty(example = "12")
+        public Integer numberOfRepayments;
+        @ApiModelProperty(example = "1")
+        public Integer repaymentEvery;
+        @ApiModelProperty(example = "2")
+        public Integer repaymentFrequencyType;
+        @ApiModelProperty(example = "1")
+        public Integer transactionProcessingStrategyId;
+        @ApiModelProperty(example = "1.75")
+        public Double interestRatePerPeriod;
+        @ApiModelProperty(example = "2")
+        public Integer interestRateFrequencyType;
+        @ApiModelProperty(example = "1")
+        public Integer amortizationType;
+        @ApiModelProperty(example = "0")
+        public Integer interestType;
+        @ApiModelProperty(example = "1")
+        public Integer interestCalculationPeriodType;
+        @ApiModelProperty(example = "1")
+        public Integer daysInMonthType;
+        @ApiModelProperty(example = "1")
+        public Integer daysInYearType;
+        @ApiModelProperty(example = "false")
+        public Boolean isInterestRecalculationEnabled;
+        @ApiModelProperty(example = "3")
+        public Integer accountingRule;
+        @ApiModelProperty(example = "4")
+        public Integer fundSourceAccountId;
+        @ApiModelProperty(example = "8")
+        public Integer loanPortfolioAccountId;
+        @ApiModelProperty(example = "9")
+        public Integer receivableInterestAccountId;
+        @ApiModelProperty(example = "11")
+        public Integer receivableFeeAccountId;
+        @ApiModelProperty(example = "10")
+        public Integer receivablePenaltyAccountId;
+        @ApiModelProperty(example = "34")
+        public Integer interestOnLoanAccountId;
+        @ApiModelProperty(example = "37")
+        public Integer incomeFromFeeAccountId;
+        @ApiModelProperty(example = "35")
+        public Integer incomeFromPenaltyAccountId;
+        @ApiModelProperty(example = "2")
+        public Integer overpaymentLiabilityAccountId;
+        @ApiModelProperty(example = "41")
+        public Integer writeOffAccountId;
+    }
+
+    @ApiModel(value = "PostLoanProductsResponse")
+    public final static class PostLoanProductsResponse {
+        private PostLoanProductsResponse() {
+        }
+
+        @ApiModelProperty(example = "3")
+        public Integer resourceId;
+    }
+
+    @ApiModel(value = "GetLoanProductsResponse")
+    public final static class GetLoanProductsResponse {
+        private GetLoanProductsResponse() {
+        }
+
+        final class GetLoanProductsCurrency {
+            private GetLoanProductsCurrency() {
+            }
+
+            @ApiModelProperty(example = "USD")
+            public String code;
+            @ApiModelProperty(example = "US Dollar")
+            public String name;
+            @ApiModelProperty(example = "2")
+            public Integer decimalPlaces;
+            @ApiModelProperty(example = "0")
+            public Integer inMultiplesOf;
+            @ApiModelProperty(example = "$")
+            public String displaySymbol;
+            @ApiModelProperty(example = "currency.USD")
+            public String nameCode;
+            @ApiModelProperty(example = "US Dollar ($)")
+            public String displayLabel;
+        }
+
+        final class GetLoanProductsRepaymentFrequencyType {
+            private GetLoanProductsRepaymentFrequencyType() {
+            }
+
+            @ApiModelProperty(example = "0")
+            public Integer id;
+            @ApiModelProperty(example = "repaymentFrequency.periodFrequencyType.days")
+            public String code;
+            @ApiModelProperty(example = "Days")
+            public String value;
+        }
+
+        final class GetLoanProductsInterestRateFrequencyType {
+            private GetLoanProductsInterestRateFrequencyType() {
+            }
+
+            @ApiModelProperty(example = "3")
+            public Integer id;
+            @ApiModelProperty(example = "interestRateFrequency.periodFrequencyType.years")
+            public String code;
+            @ApiModelProperty(example = "Per year")
+            public String value;
+        }
+
+        final class GetLoanProductsAmortizationType {
+            private GetLoanProductsAmortizationType() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "amortizationType.equal.installments")
+            public String code;
+            @ApiModelProperty(example = "Equal installments")
+            public String value;
+        }
+
+        final class GetLoanProductsInterestType {
+            private GetLoanProductsInterestType() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "interestType.flat")
+            public String code;
+            @ApiModelProperty(example = "Flat")
+            public String value;
+        }
+
+        final class GetLoansProductsInterestCalculationPeriodType {
+            private GetLoansProductsInterestCalculationPeriodType() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "interestCalculationPeriodType.same.as.repayment.period")
+            public String code;
+            @ApiModelProperty(example = "Same as repayment period")
+            public String value;
+        }
+
+        final class GetLoansProductsDaysInMonthType {
+            private GetLoansProductsDaysInMonthType() {
+            }
+
+            @ApiModelProperty(example = "30")
+            public Integer id;
+            @ApiModelProperty(example = "DaysInMonthType.days360")
+            public String code;
+            @ApiModelProperty(example = "30 Days")
+            public String value;
+        }
+
+        final class GetLoansProductsDaysInYearType {
+            private GetLoansProductsDaysInYearType() {
+            }
+
+            @ApiModelProperty(example = "360")
+            public Integer id;
+            @ApiModelProperty(example = "DaysInYearType.days360")
+            public String code;
+            @ApiModelProperty(example = "360 Days")
+            public String value;
+        }
+
+        final class GetLoanProductsInterestRecalculationData {
+            private GetLoanProductsInterestRecalculationData() {
+            }
+
+            final class GetLoanProductsInterestRecalculationCompoundingType {
+                private GetLoanProductsInterestRecalculationCompoundingType() {
+                }
+
+                @ApiModelProperty(example = "2")
+                public Integer id;
+                @ApiModelProperty(example = "interestRecalculationCompoundingMethod.fee")
+                public String code;
+                @ApiModelProperty(example = "Fee")
+                public String value;
+            }
+
+            final class GetLoanProductsInterestRecalculationCompoundingFrequencyType {
+                private GetLoanProductsInterestRecalculationCompoundingFrequencyType() {
+                }
+
+                @ApiModelProperty(example = "1")
+                public Integer id;
+                @ApiModelProperty(example = "interestRecalculationFrequencyType.same.as.repayment.period")
+                public String code;
+                @ApiModelProperty(example = "Same as repayment period")
+                public String value;
+            }
+
+            final class GetLoanProductsRescheduleStrategyType {
+                private GetLoanProductsRescheduleStrategyType() {
+                }
+
+                @ApiModelProperty(example = "2")
+                public Integer id;
+                @ApiModelProperty(example = "loanRescheduleStrategyMethod.reduce.number.of.installments")
+                public String code;
+                @ApiModelProperty(example = "Reduce number of installments")
+                public String value;
+            }
+
+            final class GetLoanProductsPreClosureInterestCalculationStrategy {
+                private GetLoanProductsPreClosureInterestCalculationStrategy() {
+                }
+
+                @ApiModelProperty(example = "1")
+                public Integer id;
+                @ApiModelProperty(example = "loanPreClosureInterestCalculationStrategy.tillPreClosureDate")
+                public String code;
+                @ApiModelProperty(example = "Till preclose Date")
+                public String value;
+            }
+
+            @ApiModelProperty(example = "3")
+            public Integer id;
+            @ApiModelProperty(example = "1")
+            public Integer productId;
+            public GetLoanProductsInterestRecalculationCompoundingType interestRecalculationCompoundingType;
+            public GetLoanProductsInterestRecalculationCompoundingFrequencyType interestRecalculationCompoundingFrequencyType;
+            public GetLoanProductsRescheduleStrategyType rescheduleStrategyType;
+            public GetLoanProductsInterestRecalculationCompoundingFrequencyType recalculationRestFrequencyType;
+            public GetLoanProductsPreClosureInterestCalculationStrategy preClosureInterestCalculationStrategy;
+            @ApiModelProperty(example = "true")
+            public Boolean isArrearsBasedOnOriginalSchedule;
+        }
+
+        final class GetLoanProductsAccountingRule {
+            private GetLoanProductsAccountingRule() {
+            }
+
+            @ApiModelProperty(example = "2")
+            public Integer id;
+            @ApiModelProperty(example = "accountingRuleType.cash")
+            public String code;
+            @ApiModelProperty(example = "CASH BASED")
+            public String value;
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer id;
+        @ApiModelProperty(example = "personal loan product")
+        public String name;
+        @ApiModelProperty(example = "pe1")
+        public String shortName;
+        @ApiModelProperty(example = "false")
+        public Boolean includeInBorrowerCycle;
+        @ApiModelProperty(example = "false")
+        public Boolean useBorrowerCycle;
+        @ApiModelProperty(example = "[2013, 9, 2]")
+        public LocalDate startDate;
+        @ApiModelProperty(example = "[2014, 2, 7]")
+        public LocalDate endDate;
+        @ApiModelProperty(example = "loanProduct.active")
+        public String status;
+        public GetLoanProductsCurrency currency;
+        @ApiModelProperty(example = "10000.000000")
+        public Float principal;
+        @ApiModelProperty(example = "5000.000000")
+        public Float minPrincipal;
+        @ApiModelProperty(example = "15000.000000")
+        public Float maxPrincipal;
+        @ApiModelProperty(example = "10")
+        public Integer numberOfRepayments;
+        @ApiModelProperty(example = "5")
+        public Integer minNumberOfRepayments;
+        @ApiModelProperty(example = "15")
+        public Integer maxNumberOfRepayments;
+        @ApiModelProperty(example = "7")
+        public Integer repaymentEvery;
+        public GetLoanProductsRepaymentFrequencyType repaymentFrequencyType;
+        @ApiModelProperty(example = "15.000000")
+        public Float interestRatePerPeriod;
+        public GetLoanProductsInterestRateFrequencyType interestRateFrequencyType;
+        @ApiModelProperty(example = "15.000000")
+        public Float annualInterestRate;
+        public GetLoanProductsAmortizationType amortizationType;
+        public GetLoanProductsInterestType interestType;
+        public GetLoansProductsInterestCalculationPeriodType interestCalculationPeriodType;
+        @ApiModelProperty(example = "1")
+        public Integer transactionProcessingStrategyId;
+        @ApiModelProperty(example = "Mifos style")
+        public String transactionProcessingStrategyName;
+        @ApiModelProperty(example = "[]")
+        public List<Integer> principalVariationsForBorrowerCycle;
+        @ApiModelProperty(example = "[]")
+        public List<Integer> interestRateVariationsForBorrowerCycle;
+        @ApiModelProperty(example = "[]")
+        public List<Integer> numberOfRepaymentVariationsForBorrowerCycle;
+        public GetLoansProductsDaysInMonthType daysInMonthType;
+        public GetLoansProductsDaysInYearType daysInYearType;
+        @ApiModelProperty(example = "true")
+        public Boolean isInterestRecalculationEnabled;
+        public GetLoanProductsInterestRecalculationData interestRecalculationData;
+        public GetLoanProductsAccountingRule accountingRule;
+        @ApiModelProperty(example = "0")
+        public Integer principalThresholdForLastInstalment;
+    }
+
+    @ApiModel(value = "GetLoanProductsTemplateResponse")
+    public final static class GetLoanProductsTemplateResponse {
+        private GetLoanProductsTemplateResponse() {
+        }
+
+        final class GetLoanProductsTemplateCurrency {
+            private GetLoanProductsTemplateCurrency() {
+            }
+
+            @ApiModelProperty(example = "")
+            public String code;
+            @ApiModelProperty(example = "")
+            public String name;
+            @ApiModelProperty(example = "0")
+            public Integer decimalPlaces;
+            @ApiModelProperty(example = "0")
+            public Integer inMultiplesOf;
+            @ApiModelProperty(example = "")
+            public String displaySymbol;
+            @ApiModelProperty(example = "")
+            public String nameCode;
+            @ApiModelProperty(example = "[]")
+            public String displayLabel;
+        }
+
+        final class GetLoanProductsRepaymentTemplateFrequencyType {
+            private GetLoanProductsRepaymentTemplateFrequencyType() {
+            }
+
+            @ApiModelProperty(example = "2")
+            public Integer id;
+            @ApiModelProperty(example = "repaymentFrequency.periodFrequencyType.months")
+            public String code;
+            @ApiModelProperty(example = "Months")
+            public String value;
+        }
+
+        final class GetLoanProductsInterestRateTemplateFrequencyType {
+            private GetLoanProductsInterestRateTemplateFrequencyType() {
+            }
+
+            @ApiModelProperty(example = "2")
+            public Integer id;
+            @ApiModelProperty(example = "interestRateFrequency.periodFrequencyType.months")
+            public String code;
+            @ApiModelProperty(example = "Per month")
+            public String value;
+        }
+
+        final class GetLoanProductsInterestTemplateType {
+            private GetLoanProductsInterestTemplateType() {
+            }
+
+            @ApiModelProperty(example = "0")
+            public Integer id;
+            @ApiModelProperty(example = "interestType.declining.balance")
+            public String code;
+            @ApiModelProperty(example = "Declining Balance")
+            public String value;
+        }
+
+        final class GetLoanProductsAccountingRule {
+            private GetLoanProductsAccountingRule() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "accountingRuleType.none")
+            public String code;
+            @ApiModelProperty(example = "NONE")
+            public String value;
+        }
+
+        final class GetLoansProductsDaysInMonthTemplateType {
+            private GetLoansProductsDaysInMonthTemplateType() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "DaysInMonthType.actual")
+            public String code;
+            @ApiModelProperty(example = "Actual")
+            public String value;
+        }
+
+        final class GetLoanProductsDaysInYearTemplateType {
+            private GetLoanProductsDaysInYearTemplateType() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "DaysInYearType.actual")
+            public String code;
+            @ApiModelProperty(example = "Actual")
+            public String value;
+        }
+
+        final class GetLoanProductsInterestRecalculationTemplateData {
+            private GetLoanProductsInterestRecalculationTemplateData() {
+            }
+
+            final class GetLoanProductsInterestRecalculationCompoundingType {
+                private GetLoanProductsInterestRecalculationCompoundingType() {
+                }
+
+                @ApiModelProperty(example = "0")
+                public Integer id;
+                @ApiModelProperty(example = "interestRecalculationCompoundingMethod.none")
+                public String code;
+                @ApiModelProperty(example = "None")
+                public String value;
+            }
+
+            final class GetLoanProductsRescheduleStrategyType {
+                private GetLoanProductsRescheduleStrategyType() {
+                }
+
+                @ApiModelProperty(example = "3")
+                public Integer id;
+                @ApiModelProperty(example = "loanRescheduleStrategyMethod.reduce.emi.amount")
+                public String code;
+                @ApiModelProperty(example = "Reduce EMI amount")
+                public String value;
+            }
+
+            public GetLoanProductsInterestRecalculationCompoundingType interestRecalculationCompoundingType;
+            public GetLoanProductsRescheduleStrategyType rescheduleStrategyType;
+            public GetLoanProductsResponse.GetLoanProductsInterestRecalculationData.GetLoanProductsPreClosureInterestCalculationStrategy preClosureInterestCalculationStrategy;
+        }
+
+        final class GetLoanProductsPaymentTypeOptions {
+            private GetLoanProductsPaymentTypeOptions() {
+            }
+
+            @ApiModelProperty(example = "10")
+            public Integer id;
+            @ApiModelProperty(example = "check")
+            public String name;
+            @ApiModelProperty(example = "1")
+            public Integer position;
+        }
+
+        final class GetLoanProductsCurrencyOptions {
+            private GetLoanProductsCurrencyOptions() {
+            }
+
+            @ApiModelProperty(example = "USD")
+            public String code;
+            @ApiModelProperty(example = "US Dollar")
+            public String name;
+            @ApiModelProperty(example = "2")
+            public Integer decimalPlaces;
+            @ApiModelProperty(example = "$")
+            public String displaySymbol;
+            @ApiModelProperty(example = "currency.USD")
+            public String nameCode;
+            @ApiModelProperty(example = "US Dollar ($)")
+            public String displayLabel;
+        }
+
+        final class GetLoanProductsTransactionProcessingStrategyOptions {
+            private GetLoanProductsTransactionProcessingStrategyOptions() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "mifos-standard-strategy")
+            public String code;
+            @ApiModelProperty(example = "Penalties, Fees, Interest, Principal order")
+            public String name;
+        }
+
+        final class GetLoanProductsChargeOptions {
+            private GetLoanProductsChargeOptions() {
+            }
+
+            final class GetLoanChargeTimeType {
+                private GetLoanChargeTimeType() {
+                }
+
+                @ApiModelProperty(example = "1")
+                public Integer id;
+                @ApiModelProperty(example = "chargeTimeType.disbursement")
+                public String code;
+                @ApiModelProperty(example = "Disbursement")
+                public String value;
+            }
+
+            final class GetLoanProductsChargeAppliesTo {
+                private GetLoanProductsChargeAppliesTo() {
+                }
+
+                @ApiModelProperty(example = "1  ")
+                public Integer id;
+                @ApiModelProperty(example = "chargeAppliesTo.loan")
+                public String code;
+                @ApiModelProperty(example = "Loan")
+                public String value;
+            }
+
+            final class GetLoanChargeCalculationType {
+                private GetLoanChargeCalculationType() {
+                }
+
+                @ApiModelProperty(example = "1")
+                public Integer id;
+                @ApiModelProperty(example = "chargeCalculationType.flat")
+                public String code;
+                @ApiModelProperty(example = "Flat")
+                public String value;
+            }
+
+            final class GetLoansChargePaymentMode {
+                private GetLoansChargePaymentMode() {
+                }
+
+                @ApiModelProperty(example = "0")
+                public Integer id;
+                @ApiModelProperty(example = "chargepaymentmode.regular")
+                public String code;
+                @ApiModelProperty(example = "Regular")
+                public String value;
+            }
+
+            @ApiModelProperty(example = "5")
+            public Integer id;
+            @ApiModelProperty(example = "des charges")
+            public String name;
+            @ApiModelProperty(example = "true")
+            public Boolean active;
+            @ApiModelProperty(example = "false")
+            public Boolean penalty;
+            public GetLoanProductsCurrencyOptions currency;
+            @ApiModelProperty(example = "100")
+            public Long amount;
+            public GetLoanChargeTimeType chargeTimeType;
+            public GetLoanProductsChargeAppliesTo chargeAppliesTo;
+            public GetLoanChargeCalculationType chargeCalculationType;
+            public GetLoansChargePaymentMode chargePaymentMode;
+        }
+
+        final class GetLoanProductsAccountingMappingOptions {
+            private GetLoanProductsAccountingMappingOptions() {
+            }
+
+            final class GetLoanProductsLiabilityAccountOptions {
+                private GetLoanProductsLiabilityAccountOptions() {
+                }
+
+                final class GetLoanProductsLiabilityType {
+                    private GetLoanProductsLiabilityType() {
+                    }
+
+                    @ApiModelProperty(example = "2")
+                    public Integer id;
+                    @ApiModelProperty(example = "accountType.liability")
+                    public String code;
+                    @ApiModelProperty(example = "LIABILITY")
+                    public String value;
+                }
+
+                final class GetLoanProductsLiabilityUsage {
+                    private GetLoanProductsLiabilityUsage() {
+                    }
+
+                    @ApiModelProperty(example = "1")
+                    public Integer id;
+                    @ApiModelProperty(example = "accountUsage.detail")
+                    public String code;
+                    @ApiModelProperty(example = "DETAIL")
+                    public String value;
+                }
+
+                final class GetLoanProductsLiabilityTagId {
+                    private GetLoanProductsLiabilityTagId() {
+                    }
+
+                    @ApiModelProperty(example = "0")
+                    public Integer id;
+                }
+
+                @ApiModelProperty(example = "11")
+                public Integer id;
+                @ApiModelProperty(example = "over payment")
+                public String name;
+                @ApiModelProperty(example = "13")
+                public Integer glCode;
+                @ApiModelProperty(example = "false")
+                public Boolean disabled;
+                @ApiModelProperty(example = "true")
+                public Boolean manualEntriesAllowed;
+                public GetLoanProductsLiabilityType type;
+                public GetLoanProductsLiabilityUsage usage;
+                @ApiModelProperty(example = "over payment")
+                public String nameDecorated;
+                public GetLoanProductsLiabilityTagId tagId;
+                @ApiModelProperty(example = "0")
+                public Integer organizationRunningBalance;
+            }
+
+            final class GetLoanProductsAssetAccountOptions {
+                private GetLoanProductsAssetAccountOptions() {
+                }
+
+                @ApiModelProperty(example = "2")
+                public Integer id;
+                @ApiModelProperty(example = "Loan portfolio")
+                public String name;
+                @ApiModelProperty(example = "02")
+                public Integer glCode;
+                @ApiModelProperty(example = "false")
+                public Boolean disabled;
+                @ApiModelProperty(example = "true")
+                public Boolean manualEntriesAllowed;
+                public GetLoanProductsLiabilityAccountOptions.GetLoanProductsLiabilityType type;
+                public GetLoanProductsLiabilityAccountOptions.GetLoanProductsLiabilityUsage usage;
+                @ApiModelProperty(example = "Loan portfolio")
+                public String nameDecorated;
+                public GetLoanProductsLiabilityAccountOptions.GetLoanProductsLiabilityTagId tagId;
+                @ApiModelProperty(example = "60000")
+                public Integer organizationRunningBalance;
+            }
+
+            final class GetLoanProductsExpenseAccountOptions {
+                private GetLoanProductsExpenseAccountOptions() {
+                }
+
+                final class GetLoanProductsExpenseType {
+                    private GetLoanProductsExpenseType() {
+                    }
+
+                    @ApiModelProperty(example = "5")
+                    public Integer id;
+                    @ApiModelProperty(example = "accountType.expense")
+                    public String code;
+                    @ApiModelProperty(example = "EXPENSE")
+                    public String value;
+                }
+
+                @ApiModelProperty(example = "10")
+                public Integer id;
+                @ApiModelProperty(example = "loans written off 2")
+                public String name;
+                @ApiModelProperty(example = "12")
+                public Integer glCode;
+                @ApiModelProperty(example = "false")
+                public Boolean disabled;
+                @ApiModelProperty(example = "true")
+                public Boolean manualEntriesAllowed;
+                public GetLoanProductsExpenseType type;
+                public GetLoanProductsLiabilityAccountOptions.GetLoanProductsLiabilityUsage usage;
+                @ApiModelProperty(example = "loans written off 2")
+                public String nameDecorated;
+                public GetLoanProductsLiabilityAccountOptions.GetLoanProductsLiabilityTagId tagId;
+                @ApiModelProperty(example = "0")
+                public Integer organizationRunningBalance;
+            }
+
+            final class GetLoanProductsIncomeAccountOptions {
+                private GetLoanProductsIncomeAccountOptions() {
+                }
+
+                final class GetLoanProductsIncomeType {
+                    private GetLoanProductsIncomeType() {
+                    }
+
+                    @ApiModelProperty(example = "4")
+                    public Integer id;
+                    @ApiModelProperty(example = "accountType.income")
+                    public String code;
+                    @ApiModelProperty(example = "INCOME")
+                    public String value;
+                }
+
+                @ApiModelProperty(example = "4")
+                public Integer id;
+                @ApiModelProperty(example = "income from interest")
+                public String name;
+                @ApiModelProperty(example = "04")
+                public Integer glCode;
+                @ApiModelProperty(example = "false")
+                public Boolean disabled;
+                @ApiModelProperty(example = "true")
+                public Boolean manualEntriesAllowed;
+                public GetLoanProductsIncomeType type;
+                public GetLoanProductsLiabilityAccountOptions.GetLoanProductsLiabilityUsage usage;
+                @ApiModelProperty(example = "income from interest")
+                public String nameDecorated;
+                public GetLoanProductsLiabilityAccountOptions.GetLoanProductsLiabilityTagId tagId;
+                @ApiModelProperty(example = "19")
+                public Integer organizationRunningBalance;
+            }
+
+            public Set<GetLoanProductsLiabilityAccountOptions> liabilityAccountOptions;
+            public Set<GetLoanProductsAssetAccountOptions> assetAccountOptions;
+            public Set<GetLoanProductsExpenseAccountOptions> expenseAccountOptions;
+            public Set<GetLoanProductsIncomeAccountOptions> incomeAccountOptions;
+        }
+
+        final class GetLoanProductsValueConditionTypeOptions {
+            private GetLoanProductsValueConditionTypeOptions() {
+            }
+
+            @ApiModelProperty(example = "2")
+            public Integer id;
+            @ApiModelProperty(example = "mifos-standard-strategyLoanProductValueConditionType.equal")
+            public String code;
+            @ApiModelProperty(example = "equals")
+            public String value;
+        }
+
+        @ApiModelProperty(example = "false")
+        public Boolean includeInBorrowerCycle;
+        @ApiModelProperty(example = "false")
+        public Boolean useBorrowerCycle;
+        public GetLoanProductsTemplateCurrency currency;
+        public GetLoanProductsRepaymentTemplateFrequencyType repaymentFrequencyType;
+        public GetLoanProductsInterestRateTemplateFrequencyType interestRateFrequencyType;
+        public GetLoanProductsResponse.GetLoanProductsAmortizationType amortizationType;
+        public GetLoanProductsInterestTemplateType interestType;
+        public GetLoanProductsResponse.GetLoansProductsInterestCalculationPeriodType interestCalculationPeriodType;
+        @ApiModelProperty(example = "[]")
+        public List<Integer> principalVariationsForBorrowerCycle;
+        @ApiModelProperty(example = "[]")
+        public List<Integer> interestRateVariationsForBorrowerCycle;
+        @ApiModelProperty(example = "[]")
+        public List<Integer> numberOfRepaymentVariationsForBorrowerCycle;
+        public GetLoanProductsAccountingRule accountingRule;
+        public GetLoansProductsDaysInMonthTemplateType daysInMonthType;
+        public GetLoanProductsDaysInYearTemplateType daysInYearType;
+        @ApiModelProperty(example = "false")
+        public Boolean isInterestRecalculationEnabled;
+        public GetLoanProductsInterestRecalculationTemplateData interestRecalculationData;
+        public Set<GetLoanProductsPaymentTypeOptions> paymentTypeOptions;
+        public Set<GetLoanProductsCurrencyOptions> currencyOptions;
+        public Set<GetLoanProductsRepaymentTemplateFrequencyType> repaymentFrequencyTypeOptions;
+        public Set<GetLoanProductsResponse.GetLoanProductsInterestRecalculationData.GetLoanProductsPreClosureInterestCalculationStrategy> preClosureInterestCalculationStrategyOptions;
+        public Set<GetLoanProductsInterestRateTemplateFrequencyType> interestRateFrequencyTypeOptions;
+        public Set<GetLoanProductsResponse.GetLoanProductsAmortizationType> amortizationTypeOptions;
+        public Set<GetLoanProductsInterestTemplateType> interestTypeOptions;
+        public Set<GetLoanProductsResponse.GetLoansProductsInterestCalculationPeriodType> interestCalculationPeriodTypeOptions;
+        public Set<GetLoanProductsTransactionProcessingStrategyOptions> transactionProcessingStrategyOptions;
+        public Set<GetLoanProductsChargeOptions> chargeOptions;
+        public Set<GetLoanProductsResponse.GetLoanProductsAccountingRule> accountingRuleOptions;
+        public GetLoanProductsAccountingMappingOptions accountingMappingOptions;
+        public Set<GetLoanProductsValueConditionTypeOptions> valueConditionTypeOptions;
+        public Set<GetLoansProductsDaysInMonthTemplateType> daysInMonthTypeOptions;
+        public Set<GetLoanProductsInterestTemplateType> daysInYearTypeOptions;
+        public Set<GetLoanProductsResponse.GetLoanProductsInterestRecalculationData.GetLoanProductsInterestRecalculationCompoundingType> interestRecalculationCompoundingTypeOptions;
+        public Set<GetLoanProductsResponse.GetLoanProductsInterestRecalculationData.GetLoanProductsRescheduleStrategyType> rescheduleStrategyTypeOptions;
+        public Set<GetLoanProductsResponse.GetLoanProductsInterestRecalculationData.GetLoanProductsInterestRecalculationCompoundingFrequencyType> interestRecalculationFrequencyTypeOptions;
+    }
+
+    @ApiModel(value = "GetLoanProductsProductIdResponse")
+    public final static class GetLoanProductsProductIdResponse {
+        private GetLoanProductsProductIdResponse() {
+        }
+
+        final class GetLoanProductsInterestRateFrequencyType {
+            private GetLoanProductsInterestRateFrequencyType() {
+            }
+
+            @ApiModelProperty(example = "2")
+            public Integer id;
+            @ApiModelProperty(example = "interestRateFrequency.periodFrequencyType.months")
+            public String code;
+            @ApiModelProperty(example = "Per month")
+            public String value;
+        }
+
+        final class GetLoanProductsPrincipalVariationsForBorrowerCycle {
+            private GetLoanProductsPrincipalVariationsForBorrowerCycle() {
+            }
+
+            final class GetLoanProductsParamType {
+                private GetLoanProductsParamType() {
+                }
+
+                @ApiModelProperty(example = "1")
+                public Integer id;
+                @ApiModelProperty(example = "LoanProductParamType.principal")
+                public String code;
+                @ApiModelProperty(example = "principal")
+                public String value;
+            }
+
+            final class GetLoanProductsValueConditionType {
+                private GetLoanProductsValueConditionType() {
+                }
+
+                @ApiModelProperty(example = "2")
+                public Integer id;
+                @ApiModelProperty(example = "LoanProductValueConditionType.equal")
+                public String code;
+                @ApiModelProperty(example = "equals")
+                public String value;
+            }
+
+            @ApiModelProperty(example = "21")
+            public Integer id;
+            @ApiModelProperty(example = "1")
+            public Integer borrowerCycleNumber;
+            public GetLoanProductsParamType paramType;
+            public GetLoanProductsValueConditionType valueConditionType;
+            @ApiModelProperty(example = "2000.000000")
+            public Float minValue;
+            @ApiModelProperty(example = "20000.000000")
+            public Float maxValue;
+            @ApiModelProperty(example = "15000.000000")
+            public Float defaultValue;
+        }
+
+        final class GetLoanAccountingMappings {
+            private GetLoanAccountingMappings() {
+            }
+
+            final class GetLoanFundSourceAccount {
+                private GetLoanFundSourceAccount() {
+                }
+
+                @ApiModelProperty(example = "1")
+                public Integer id;
+                @ApiModelProperty(example = "fund source")
+                public String name;
+                @ApiModelProperty(example = "01")
+                public Integer glCode;
+            }
+
+            final class GetLoanPortfolioAccount {
+                private GetLoanPortfolioAccount() {
+                }
+
+                @ApiModelProperty(example = "2")
+                public Integer id;
+                @ApiModelProperty(example = "Loan portfolio")
+                public String name;
+                @ApiModelProperty(example = "02")
+                public Integer glCode;
+            }
+
+            final class GetLoanTransfersInSuspenseAccount {
+                private GetLoanTransfersInSuspenseAccount() {
+                }
+
+                @ApiModelProperty(example = "3")
+                public Integer id;
+                @ApiModelProperty(example = "transfers")
+                public String name;
+                @ApiModelProperty(example = "03")
+                public Integer glCode;
+            }
+
+            final class GetLoanInterestOnLoanAccount {
+                private GetLoanInterestOnLoanAccount() {
+                }
+
+                @ApiModelProperty(example = "4")
+                public Integer id;
+                @ApiModelProperty(example = "income from interest")
+                public String name;
+                @ApiModelProperty(example = "04")
+                public Integer glCode;
+            }
+
+            final class GetLoanIncomeFromFeeAccount {
+                private GetLoanIncomeFromFeeAccount() {
+                }
+
+                @ApiModelProperty(example = "8")
+                public Integer id;
+                @ApiModelProperty(example = "income from fees 2")
+                public String name;
+                @ApiModelProperty(example = "10")
+                public Integer glCode;
+            }
+
+            final class GetLoanIncomeFromPenaltyAccount {
+                private GetLoanIncomeFromPenaltyAccount() {
+                }
+
+                @ApiModelProperty(example = "9")
+                public Integer id;
+                @ApiModelProperty(example = "income from penalities 2")
+                public String name;
+                @ApiModelProperty(example = "11")
+                public Integer glCode;
+            }
+
+            final class GetLoanWriteOffAccount {
+                private GetLoanWriteOffAccount() {
+                }
+
+                @ApiModelProperty(example = "10")
+                public Integer id;
+                @ApiModelProperty(example = "loans written off 2")
+                public String name;
+                @ApiModelProperty(example = "12")
+                public Integer glCode;
+            }
+
+            final class GetLoanOverpaymentLiabilityAccount {
+                private GetLoanOverpaymentLiabilityAccount() {
+                }
+
+                @ApiModelProperty(example = "11")
+                public Integer id;
+                @ApiModelProperty(example = "over payment")
+                public String name;
+                @ApiModelProperty(example = "13")
+                public Integer glCode;
+            }
+
+            public GetLoanFundSourceAccount fundSourceAccount;
+            public GetLoanPortfolioAccount loanPortfolioAccount;
+            public GetLoanTransfersInSuspenseAccount transfersInSuspenseAccount;
+            public GetLoanInterestOnLoanAccount interestOnLoanAccount;
+            public GetLoanIncomeFromFeeAccount incomeFromFeeAccount;
+            public GetLoanIncomeFromPenaltyAccount incomeFromPenaltyAccount;
+            public GetLoanWriteOffAccount writeOffAccount;
+            public GetLoanOverpaymentLiabilityAccount overpaymentLiabilityAccount;
+        }
+
+        final class GetLoanPaymentChannelToFundSourceMappings {
+            private GetLoanPaymentChannelToFundSourceMappings() {
+            }
+
+            final class GetLoanPaymentType {
+                private GetLoanPaymentType() {
+                }
+
+                @ApiModelProperty(example = "10")
+                public Integer id;
+                @ApiModelProperty(example = "check")
+                public String name;
+            }
+
+            public GetLoanPaymentType paymentType;
+            public GetLoanAccountingMappings.GetLoanFundSourceAccount fundSourceAccount;
+        }
+
+        final class GetLoanFeeToIncomeAccountMappings {
+            private GetLoanFeeToIncomeAccountMappings() {
+            }
+
+            final class GetLoanCharge {
+                private GetLoanCharge() {
+                }
+
+                @ApiModelProperty(example = "1")
+                public Integer id;
+                @ApiModelProperty(example = "flat install")
+                public String name;
+                @ApiModelProperty(example = "false")
+                public Boolean active;
+                @ApiModelProperty(example = "false")
+                public Boolean penalty;
+            }
+
+            public GetLoanCharge charge;
+            public GetLoanAccountingMappings.GetLoanIncomeFromFeeAccount incomeAccount;
+        }
+
+        @ApiModelProperty(example = "11")
+        public Integer id;
+        @ApiModelProperty(example = "advanced accounting")
+        public String name;
+        @ApiModelProperty(example = "ad11")
+        public String shortName;
+        @ApiModelProperty(example = "true")
+        public Boolean includeInBorrowerCycle;
+        @ApiModelProperty(example = "true")
+        public Boolean useBorrowerCycle;
+        @ApiModelProperty(example = "loanProduct.active")
+        public String status;
+        public GetLoanProductsResponse.GetLoanProductsCurrency currency;
+        @ApiModelProperty(example = "10000.000000")
+        public Float principal;
+        @ApiModelProperty(example = "2000.000000")
+        public Float minPrincipal;
+        @ApiModelProperty(example = "15000.000000")
+        public Float maxPrincipal;
+        @ApiModelProperty(example = "7")
+        public Integer numberOfRepayments;
+        @ApiModelProperty(example = "7")
+        public Integer repaymentEvery;
+        public GetLoanProductsResponse.GetLoanProductsRepaymentFrequencyType repaymentFrequencyType;
+        @ApiModelProperty(example = "5.000000")
+        public Float interestRatePerPeriod;
+        public GetLoanProductsInterestRateFrequencyType interestRateFrequencyType;
+        @ApiModelProperty(example = "60.000000")
+        public Float annualInterestRate;
+        public GetLoanProductsResponse.GetLoanProductsAmortizationType amortizationType;
+        public GetLoanProductsTemplateResponse.GetLoanProductsInterestTemplateType interestType;
+        public GetLoanProductsResponse.GetLoansProductsInterestCalculationPeriodType interestCalculationPeriodType;
+        @ApiModelProperty(example = "1")
+        public Integer transactionProcessingStrategyId;
+        @ApiModelProperty(example = "Mifos style")
+        public String transactionProcessingStrategyName;
+        @ApiModelProperty(example = "[]")
+        public List<Integer> charges;
+        public Set<GetLoanProductsPrincipalVariationsForBorrowerCycle> productsPrincipalVariationsForBorrowerCycle;
+        @ApiModelProperty(example = "[]")
+        public List<Integer> interestRateVariationsForBorrowerCycle;
+        @ApiModelProperty(example = "[]")
+        public List<Integer> numberOfRepaymentVariationsForBorrowerCycle;
+        public GetLoanProductsResponse.GetLoanProductsAccountingRule accountingRule;
+        public GetLoanAccountingMappings accountingMappings;
+        public Set<GetLoanPaymentChannelToFundSourceMappings> paymentChannelToFundSourceMappings;
+        public Set<GetLoanFeeToIncomeAccountMappings> feeToIncomeAccountMappings;
+        @ApiModelProperty(example = "true")
+        public Boolean multiDisburseLoan;
+        @ApiModelProperty(example = "3")
+        public Integer maxTrancheCount;
+        @ApiModelProperty(example = "36000.000000")
+        public Float outstandingLoanBalance;
+        @ApiModelProperty(example = "2")
+        public Integer overdueDaysForNPA;
+        @ApiModelProperty(example = "50")
+        public Integer principalThresholdForLastInstalment;
+    }
+
+    @ApiModel(value = "PutLoanProductsProductIdRequest")
+    public final static class PutLoanProductsProductIdRequest {
+        private PutLoanProductsProductIdRequest() {
+        }
+
+        @ApiModelProperty(example = "en_GB")
+        public String locale;
+        @ApiModelProperty(example = "70,000.00")
+        public Double principal;
+    }
+
+    @ApiModel(value = "PutLoanProductsProductIdResponse")
+    public final static class PutLoanProductsProductIdResponse {
+        private PutLoanProductsProductIdResponse() {
+        }
+
+        final class PutLoanChanges {
+            private PutLoanChanges() {
+            }
+
+            @ApiModelProperty(example = "70,000.00")
+            public Double principal;
+            @ApiModelProperty(example = "en_GB")
+            public String locale;
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer resourceId;
+        public PutLoanChanges changes;
+    }
+}
+
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/api/NotesApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/api/NotesApiResource.java
index 217968921..f1b4a8128 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/api/NotesApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/api/NotesApiResource.java
@@ -18,23 +18,7 @@
  */
 package org.apache.fineract.portfolio.note.api;
 
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Set;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.UriInfo;
-
+import io.swagger.annotations.*;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
 import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
@@ -51,9 +35,19 @@
 import org.springframework.context.annotation.Scope;
 import org.springframework.stereotype.Component;
 
+import javax.ws.rs.*;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.UriInfo;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.HashSet;
+import java.util.Set;
+
 @Path("/{resourceType}/{resourceId}/notes")
 @Component
 @Scope("singleton")
+@Api(value = "Notes", description = "Notes API allows to enter notes for supported resources.")
 public class NotesApiResource {
 
     private final Set<String> NOTE_DATA_PARAMETERS = new HashSet<>(Arrays.asList("id", "clientId", "groupId", "loanId",
@@ -80,8 +74,10 @@ public NotesApiResource(final PlatformSecurityContext context, final NoteReadPla
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveNotesByResource(@PathParam("resourceType") final String resourceType,
-            @PathParam("resourceId") final Long resourceId, @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Retrieve a Resource's Notes", httpMethod = "GET", notes = "Retrieves a Resource's Notes\n\n" + "Note: Notes are returned in descending createOn order.\n" + "\n" + "Example Requests:\n" + "\n" + "clients/2/notes\n" + "\n" + "\n" + "groups/2/notes?fields=note,createdOn,createdByUsername")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", responseContainer = "List", response = NotesApiResourceSwagger.GetResourceTypeResourceIdNotesResponse.class)})
+    public String retrieveNotesByResource(@PathParam("resourceType") @ApiParam(value = "resourceType") final String resourceType,
+            @PathParam("resourceId") @ApiParam(value = "resourceId") final Long resourceId, @Context final UriInfo uriInfo) {
 
         final NoteType noteType = NoteType.fromApiUrl(resourceType);
 
@@ -101,8 +97,10 @@ public String retrieveNotesByResource(@PathParam("resourceType") final String re
     @Path("{noteId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveNote(@PathParam("resourceType") final String resourceType, @PathParam("resourceId") final Long resourceId,
-            @PathParam("noteId") final Long noteId, @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Retrieve a Resource Note", httpMethod = "GET", notes = "Retrieves a Resource Note\n\n" + "Example Requests:\n" + "\n" + "clients/1/notes/76\n" + "\n" + "\n" + "groups/1/notes/20\n" + "\n" + "\n" + "clients/1/notes/76?fields=note,createdOn,createdByUsername\n" + "\n" + "\n" + "groups/1/notes/20?fields=note,createdOn,createdByUsername")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = NotesApiResourceSwagger.GetResourceTypeResourceIdNotesNoteIdResponse.class)})
+    public String retrieveNote(@PathParam("resourceType") @ApiParam(value = "resourceType")final String resourceType, @PathParam("resourceId") @ApiParam(value = "resourceId")final Long resourceId,
+            @PathParam("noteId") @ApiParam(value = "noteId") final Long noteId, @Context final UriInfo uriInfo) {
 
         final NoteType noteType = NoteType.fromApiUrl(resourceType);
 
@@ -121,8 +119,11 @@ public String retrieveNote(@PathParam("resourceType") final String resourceType,
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String addNewNote(@PathParam("resourceType") final String resourceType, @PathParam("resourceId") final Long resourceId,
-            final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Add a Resource Note", httpMethod = "POST", notes = "Adds a new note to a supported resource.\n\n" + "Example Requests:\n" + "\n" + "clients/1/notes\n" + "\n" + "\n" + "groups/1/notes")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = NotesApiResourceSwagger.PostResourceTypeResourceIdNotesRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = NotesApiResourceSwagger.PostResourceTypeResourceIdNotesResponse.class)})
+    public String addNewNote(@PathParam("resourceType") @ApiParam(value = "resourceType")final String resourceType, @PathParam("resourceId") @ApiParam(value = "resourceId")final Long resourceId,
+            @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final NoteType noteType = NoteType.fromApiUrl(resourceType);
 
@@ -141,8 +142,11 @@ public String addNewNote(@PathParam("resourceType") final String resourceType, @
     @Path("{noteId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String updateNote(@PathParam("resourceType") final String resourceType, @PathParam("resourceId") final Long resourceId,
-            @PathParam("noteId") final Long noteId, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Update a Resource Note", httpMethod = "PUT", notes = "Updates a Resource Note")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = NotesApiResourceSwagger.PutResourceTypeResourceIdNotesNoteIdRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = NotesApiResourceSwagger.PutResourceTypeResourceIdNotesNoteIdResponse.class)})
+    public String updateNote(@PathParam("resourceType") @ApiParam(value = "resourceType") final String resourceType, @PathParam("resourceId") @ApiParam(value = "resourceId") final Long resourceId,
+            @PathParam("noteId") @ApiParam(value = "noteId") final Long noteId, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final NoteType noteType = NoteType.fromApiUrl(resourceType);
 
@@ -162,8 +166,10 @@ public String updateNote(@PathParam("resourceType") final String resourceType, @
     @Path("{noteId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String deleteNote(@PathParam("resourceType") final String resourceType, @PathParam("resourceId") final Long resourceId,
-            @PathParam("noteId") final Long noteId) {
+    @ApiOperation(value = "Delete a Resource Note", httpMethod = "DELETE", notes = "Deletes a Resource Note")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = NotesApiResourceSwagger.DeleteResourceTypeResourceIdNotesNoteIdResponse.class)})
+    public String deleteNote(@PathParam("resourceType") @ApiParam(value = "resourceType")final String resourceType, @PathParam("resourceId") @ApiParam(value = "resourceId")final Long resourceId,
+            @PathParam("noteId") @ApiParam(value = "noteId")final Long noteId) {
 
         final NoteType noteType = NoteType.fromApiUrl(resourceType);
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/api/NotesApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/api/NotesApiResourceSwagger.java
new file mode 100644
index 000000000..ddc880f67
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/note/api/NotesApiResourceSwagger.java
@@ -0,0 +1,157 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.portfolio.note.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import org.joda.time.DateTime;
+
+/**
+ * Created by Chirag Gupta on 12/29/17.
+ */
+final class NotesApiResourceSwagger {
+    private NotesApiResourceSwagger() {
+    }
+
+    @ApiModel(value = "GetResourceTypeResourceIdNotesResponse")
+    public final static class GetResourceTypeResourceIdNotesResponse {
+        private GetResourceTypeResourceIdNotesResponse() {
+        }
+
+        final class GetNotesNoteType {
+            private GetNotesNoteType() {
+            }
+
+            @ApiModelProperty(example = "100")
+            public Integer id;
+            @ApiModelProperty(example = "noteType.client")
+            public String code;
+            @ApiModelProperty(example = "Client note")
+            public String value;
+        }
+
+        @ApiModelProperty(example = "2")
+        public Integer id;
+        @ApiModelProperty(example = "1")
+        public Integer clientId;
+        public GetNotesNoteType noteType;
+        @ApiModelProperty(example = "First note edited")
+        public String note;
+        @ApiModelProperty(example = "1")
+        public Integer createdById;
+        @ApiModelProperty(example = "mifos")
+        public String createdByUsername;
+        @ApiModelProperty(example = "1342498505000")
+        public DateTime createdOn;
+        @ApiModelProperty(example = "1")
+        public Integer updatedById;
+        @ApiModelProperty(example = "mifos")
+        public String updatedByUsername;
+        @ApiModelProperty(example = "1342498517000")
+        public DateTime updatedOn;
+    }
+
+    @ApiModel(value = "GetResourceTypeResourceIdNotesNoteIdResponse")
+    public final static class GetResourceTypeResourceIdNotesNoteIdResponse {
+        private GetResourceTypeResourceIdNotesNoteIdResponse() {
+        }
+
+        @ApiModelProperty(example = "76")
+        public Integer id;
+        @ApiModelProperty(example = "1")
+        public Integer clientId;
+        public GetResourceTypeResourceIdNotesResponse.GetNotesNoteType noteType;
+        @ApiModelProperty(example = "a note about the client")
+        public String note;
+        @ApiModelProperty(example = "1")
+        public Integer createdById;
+        @ApiModelProperty(example = "mifos")
+        public String createdByUsername;
+        @ApiModelProperty(example = "1359463135000")
+        public DateTime createdOn;
+        @ApiModelProperty(example = "1")
+        public Integer updatedById;
+        @ApiModelProperty(example = "mifos")
+        public String updatedByUsername;
+        @ApiModelProperty(example = "1359463135000")
+        public DateTime updatedOn;
+    }
+
+    @ApiModel(value = "PostResourceTypeResourceIdNotesRequest")
+    public final static class PostResourceTypeResourceIdNotesRequest {
+        private PostResourceTypeResourceIdNotesRequest() {
+        }
+
+        @ApiModelProperty(example = "a note about the client")
+        public String note;
+    }
+
+    @ApiModel(value = "PostResourceTypeResourceIdNotesResponse")
+    public final static class PostResourceTypeResourceIdNotesResponse {
+        private PostResourceTypeResourceIdNotesResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer officeId;
+        @ApiModelProperty(example = "1")
+        public Integer clientId;
+        @ApiModelProperty(example = "76")
+        public Integer resourceId;
+    }
+
+    @ApiModel(value = "PutResourceTypeResourceIdNotesNoteIdRequest")
+    public final static class PutResourceTypeResourceIdNotesNoteIdRequest {
+        private PutResourceTypeResourceIdNotesNoteIdRequest() {
+        }
+
+        @ApiModelProperty(example = "a note about the client")
+        public String note;
+    }
+
+    @ApiModel(value = "PutResourceTypeResourceIdNotesNoteIdResponse")
+    public final static class PutResourceTypeResourceIdNotesNoteIdResponse {
+        private PutResourceTypeResourceIdNotesNoteIdResponse() {
+        }
+
+        final class PutNotesChanges {
+            private PutNotesChanges() {
+            }
+
+            @ApiModelProperty(example = "a note about the client")
+            public String note;
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer officeId;
+        @ApiModelProperty(example = "1")
+        public Integer clientId;
+        @ApiModelProperty(example = "76")
+        public Integer resourceId;
+        public PutNotesChanges changes;
+    }
+
+    @ApiModel(value = "DeleteResourceTypeResourceIdNotesNoteIdResponse")
+    public final static class DeleteResourceTypeResourceIdNotesNoteIdResponse {
+        private DeleteResourceTypeResourceIdNotesNoteIdResponse() {
+        }
+
+        @ApiModelProperty(example = "76")
+        public Integer resourceId;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/paymenttype/api/PaymentTypeApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/paymenttype/api/PaymentTypeApiResource.java
index ccdcd705b..af5e76446 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/paymenttype/api/PaymentTypeApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/paymenttype/api/PaymentTypeApiResource.java
@@ -18,20 +18,7 @@
  */
 package org.apache.fineract.portfolio.paymenttype.api;
 
-import java.util.Collection;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.UriInfo;
-
+import io.swagger.annotations.*;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
 import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
@@ -46,8 +33,15 @@
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Component;
 
+import javax.ws.rs.*;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.UriInfo;
+import java.util.Collection;
+
 @Path("/paymenttypes")
 @Component
+@Api(value = "Payment Type", description = "This defines the payment type")
 public class PaymentTypeApiResource {
 
     private final PlatformSecurityContext securityContext;
@@ -77,6 +71,8 @@ public PaymentTypeApiResource(PlatformSecurityContext securityContext, DefaultTo
     @GET
     @Consumes({ MediaType.TEXT_HTML, MediaType.APPLICATION_JSON })
     @Produces(MediaType.APPLICATION_JSON)
+    @ApiOperation(value = "Retrieve all Payment Types", httpMethod = "GET", notes = "Retrieve list of payment types")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", responseContainer = "List", response = PaymentTypeApiResourceSwagger.GetPaymentTypesResponse.class)})
     public String getAllPaymentTypes(@Context final UriInfo uriInfo) {
         this.securityContext.authenticatedUser().validateHasReadPermission(PaymentTypeApiResourceConstants.resourceNameForPermissions);
         final Collection<PaymentTypeData> paymentTypes = this.readPlatformService.retrieveAllPaymentTypes();
@@ -88,7 +84,9 @@ public String getAllPaymentTypes(@Context final UriInfo uriInfo) {
     @Path("{paymentTypeId}")
     @Consumes({ MediaType.TEXT_HTML, MediaType.APPLICATION_JSON })
     @Produces(MediaType.APPLICATION_JSON)
-    public String retrieveOnePaymentType(@PathParam("paymentTypeId") final Long paymentTypeId, @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Retrieve a Payment Type", httpMethod = "GET", notes = "Retrieves a payment type")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = PaymentTypeApiResourceSwagger.GetPaymentTypesPaymentTypeIdResponse.class)})
+    public String retrieveOnePaymentType(@PathParam("paymentTypeId") @ApiParam(value = "paymentTypeId") final Long paymentTypeId, @Context final UriInfo uriInfo) {
         this.securityContext.authenticatedUser().validateHasReadPermission(PaymentTypeApiResourceConstants.resourceNameForPermissions);
         this.paymentTypeRepositoryWrapper.findOneWithNotFoundDetection(paymentTypeId);
         final PaymentTypeData paymentTypes = this.readPlatformService.retrieveOne(paymentTypeId);
@@ -99,7 +97,10 @@ public String retrieveOnePaymentType(@PathParam("paymentTypeId") final Long paym
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String createPaymentType(final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Create a Payment Type", httpMethod = "POST", notes = "Creates a new Payment type\n\n" + "Mandatory Fields: name\n\n" + "Optional Fields: Description, isCashPayment,Position")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = PaymentTypeApiResourceSwagger.PostPaymentTypesRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = PaymentTypeApiResourceSwagger.PostPaymentTypesResponse.class)})
+    public String createPaymentType(@ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().createPaymentType().withJson(apiRequestBodyAsJson).build();
 
@@ -112,7 +113,10 @@ public String createPaymentType(final String apiRequestBodyAsJson) {
     @Path("{paymentTypeId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String updatePaymentType(@PathParam("paymentTypeId") final Long paymentTypeId, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Update a Payment Type", httpMethod = "PUT", notes = "Updates a Payment Type")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = PaymentTypeApiResourceSwagger.PutPaymentTypesPaymentTypeIdRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = PaymentTypeApiResourceSwagger.PutPaymentTypesPaymentTypeIdResponse.class)})
+    public String updatePaymentType(@PathParam("paymentTypeId") @ApiParam(value = "paymentTypeId") final Long paymentTypeId, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().updatePaymentType(paymentTypeId).withJson(apiRequestBodyAsJson)
                 .build();
@@ -126,7 +130,9 @@ public String updatePaymentType(@PathParam("paymentTypeId") final Long paymentTy
     @Path("{paymentTypeId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String deleteCode(@PathParam("paymentTypeId") final Long paymentTypeId) {
+    @ApiOperation(value = "Delete a Payment Type", httpMethod = "DELETE", notes = "Deletes payment type")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = PaymentTypeApiResourceSwagger.DeletePaymentTypesPaymentTypeIdResponse.class)})
+    public String deleteCode(@PathParam("paymentTypeId") @ApiParam(value = "paymentTypeId") final Long paymentTypeId) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().deletePaymentType(paymentTypeId).build();
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/paymenttype/api/PaymentTypeApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/paymenttype/api/PaymentTypeApiResourceSwagger.java
new file mode 100644
index 000000000..71ba65345
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/paymenttype/api/PaymentTypeApiResourceSwagger.java
@@ -0,0 +1,121 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.portfolio.paymenttype.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+/**
+ * Created by Chirag Gupta on 01/01/18.
+ */
+final class PaymentTypeApiResourceSwagger {
+    private PaymentTypeApiResourceSwagger() {
+    }
+
+    @ApiModel(value = "GetPaymentTypesResponse")
+    public final static class GetPaymentTypesResponse {
+        private GetPaymentTypesResponse() {
+        }
+
+        @ApiModelProperty(example = "24")
+        public Integer id;
+        @ApiModelProperty(example = "PTC")
+        public String name;
+        @ApiModelProperty(example = "Cash")
+        public String description;
+        @ApiModelProperty(example = "true")
+        public Boolean isCashPayment;
+        @ApiModelProperty(example = "0")
+        public Integer position;
+    }
+
+    @ApiModel(value = "GetPaymentTypesPaymentTypeIdResponse")
+    public final static class GetPaymentTypesPaymentTypeIdResponse {
+        private GetPaymentTypesPaymentTypeIdResponse() {
+        }
+
+        @ApiModelProperty(example = "13")
+        public Integer id;
+        @ApiModelProperty(example = "cash")
+        public String name;
+        @ApiModelProperty(example = "cash Payment")
+        public String description;
+        @ApiModelProperty(example = "true")
+        public Boolean isCashPayment;
+        @ApiModelProperty(example = "1")
+        public Integer position;
+    }
+
+    @ApiModel(value = "PostPaymentTypesRequest")
+    public final static class PostPaymentTypesRequest {
+        private PostPaymentTypesRequest() {
+        }
+
+        @ApiModelProperty(example = "cash")
+        public String name;
+        @ApiModelProperty(example = "cash payment type")
+        public String description;
+        @ApiModelProperty(example = "true")
+        public Boolean isCashPayment;
+        @ApiModelProperty(example = "1")
+        public Integer position;
+    }
+
+    @ApiModel(value = "PostPaymentTypesResponse")
+    public final static class PostPaymentTypesResponse {
+        private PostPaymentTypesResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer resourceId;
+    }
+
+    @ApiModel(value = "PutPaymentTypesPaymentTypeIdRequest")
+    public final static class PutPaymentTypesPaymentTypeIdRequest {
+        private PutPaymentTypesPaymentTypeIdRequest() {
+        }
+
+        @ApiModelProperty(example = "mPay")
+        public String name;
+        @ApiModelProperty(example = "not a cash payment type")
+        public String description;
+        @ApiModelProperty(example = "false")
+        public Boolean isCashPayment;
+        @ApiModelProperty(example = "3")
+        public Integer position;
+    }
+
+    @ApiModel(value = "PutPaymentTypesPaymentTypeIdResponse")
+    public final static class PutPaymentTypesPaymentTypeIdResponse {
+        private PutPaymentTypesPaymentTypeIdResponse() {
+        }
+
+        @ApiModelProperty(example = "13")
+        public Integer resourceId;
+    }
+
+    @ApiModel(value = "DeletePaymentTypesPaymentTypeIdResponse")
+    public final static class DeletePaymentTypesPaymentTypeIdResponse {
+        private DeletePaymentTypesPaymentTypeIdResponse() {
+        }
+
+        @ApiModelProperty(example = "13")
+        public Integer resourceId;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/products/api/ProductsApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/products/api/ProductsApiResource.java
index a94a1467b..62804507e 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/products/api/ProductsApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/products/api/ProductsApiResource.java
@@ -18,18 +18,7 @@
  */
 package org.apache.fineract.portfolio.products.api;
 
-import javax.ws.rs.Consumes;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.QueryParam;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.UriInfo;
-
+import io.swagger.annotations.*;
 import org.apache.fineract.commands.domain.CommandWrapper;
 import org.apache.fineract.commands.service.CommandWrapperBuilder;
 import org.apache.fineract.commands.service.PortfolioCommandSourceWritePlatformService;
@@ -49,9 +38,15 @@
 import org.springframework.context.annotation.Scope;
 import org.springframework.stereotype.Component;
 
+import javax.ws.rs.*;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.UriInfo;
+
 @Path("/products/{type}")
 @Component
 @Scope("singleton")
+@Api(value = "Products", description = "")
 public class ProductsApiResource {
 
     private final ApplicationContext applicationContext;
@@ -75,7 +70,7 @@ public ProductsApiResource(final ApplicationContext applicationContext, final Ap
     @Path("template")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveTemplate(@PathParam("type") final String productType, @Context final UriInfo uriInfo) {
+    public String retrieveTemplate(@PathParam("type") @ApiParam(value = "type") final String productType, @Context final UriInfo uriInfo) {
         String serviceName = productType + ProductsApiConstants.READPLATFORM_NAME;
         try {
             ProductReadPlatformService service = (ProductReadPlatformService) this.applicationContext.getBean(serviceName);
@@ -91,7 +86,9 @@ public String retrieveTemplate(@PathParam("type") final String productType, @Con
     @Path("{productId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveProduct(@PathParam("productId") final Long productId, @PathParam("type") final String productType,
+    @ApiOperation(value = "Retrieve a Share Product", httpMethod = "GET", notes = "Retrieves a Share Product\n\n" + "Example Requests:\n" + "\n" + "products/share/1\n" + "\n" + "\n" + "products/share/1?template=true")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = ProductsApiResourceSwagger.GetProductsTypeProductIdResponse.class)})
+    public String retrieveProduct(@PathParam("productId") @ApiParam(value = "productId") final Long productId, @PathParam("type") @ApiParam(value = "type") final String productType,
             @Context final UriInfo uriInfo) {
         try {
             String serviceName = productType + ProductsApiConstants.READPLATFORM_NAME;
@@ -107,7 +104,9 @@ public String retrieveProduct(@PathParam("productId") final Long productId, @Pat
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveAllProducts(@PathParam("type") final String productType, @QueryParam("offset") final Integer offset, @QueryParam("limit") final Integer limit,
+    @ApiOperation(value = "List Share Products", httpMethod = "GET", notes = "Lists Share Products\n\n" + "Mandatory Fields: limit, offset\n\n" + "Example Requests:\n" + "\n" + "shareproducts")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = ProductsApiResourceSwagger.GetProductsTypeResponse.class)})
+    public String retrieveAllProducts(@PathParam("type") @ApiParam(value = "type") final String productType, @QueryParam("offset") @ApiParam(value = "offset") final Integer offset, @QueryParam("limit") @ApiParam(value = "limit") final Integer limit,
             @Context final UriInfo uriInfo) {
         try {
             String serviceName = productType + ProductsApiConstants.READPLATFORM_NAME;
@@ -123,7 +122,10 @@ public String retrieveAllProducts(@PathParam("type") final String productType, @
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String createProduct(@PathParam("type") final String productType, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Create a Share Product", httpMethod = "POST", notes = "Creates a Share Product\n\n" + "Mandatory Fields: name, shortName, description, currencyCode, digitsAfterDecimal,inMultiplesOf, locale, totalShares, unitPrice, nominalShares,allowDividendCalculationForInactiveClients,accountingRule\n\n" + "Mandatory Fields for Cash based accounting (accountingRule = 2): shareReferenceId, shareSuspenseId, shareEquityId, incomeFromFeeAccountId\n\n" + "Optional Fields: sharesIssued, minimumShares, maximumShares, minimumActivePeriodForDividends, minimumactiveperiodFrequencyType, lockinPeriodFrequency, lockinPeriodFrequencyType, marketPricePeriods, chargesSelected")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = ProductsApiResourceSwagger.PostProductsTypeRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = ProductsApiResourceSwagger.PostProductsTypeResponse.class)})
+    public String createProduct(@PathParam("type") @ApiParam(value = "type") final String productType, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
         CommandWrapper commandWrapper = null;
         this.platformSecurityContext.authenticatedUser();
         commandWrapper = new CommandWrapperBuilder().createProduct(productType).withJson(apiRequestBodyAsJson).build();
@@ -135,8 +137,8 @@ public String createProduct(@PathParam("type") final String productType, final S
     @Path("{productId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String handleCommands(@PathParam("type") final String productType, @PathParam("productId") final Long productId,
-            @QueryParam("command") final String commandParam, @SuppressWarnings("unused") @Context final UriInfo uriInfo, final String apiRequestBodyAsJson) {
+    public String handleCommands(@PathParam("type") @ApiParam(value = "type") final String productType, @PathParam("productId") @ApiParam(value = "productId") final Long productId,
+            @QueryParam("command") @ApiParam(value = "command") final String commandParam, @SuppressWarnings("unused") @Context final UriInfo uriInfo, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
         CommandWrapper commandWrapper = new CommandWrapperBuilder().createProductCommand(productType, commandParam, productId)
                 .withJson(apiRequestBodyAsJson).build();
         final CommandProcessingResult commandProcessingResult = this.commandsSourceWritePlatformService.logCommandSource(commandWrapper);
@@ -147,8 +149,11 @@ public String handleCommands(@PathParam("type") final String productType, @PathP
     @Path("{productId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String updateProduct(@PathParam("type") final String productType, @PathParam("productId") final Long productId,
-            final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Update a Share Product", httpMethod = "PUT", notes = "Updates a Share Product")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = ProductsApiResourceSwagger.PutProductsTypeProductIdRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = ProductsApiResourceSwagger.PutProductsTypeProductIdResponse.class)})
+    public String updateProduct(@PathParam("type") @ApiParam(value = "type")final String productType, @PathParam("productId") @ApiParam(value = "productId")final Long productId,
+            @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
         this.platformSecurityContext.authenticatedUser();
         final CommandWrapper commandRequest = new CommandWrapperBuilder().updateProduct(productType, productId)
                 .withJson(apiRequestBodyAsJson).build();
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/products/api/ProductsApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/products/api/ProductsApiResourceSwagger.java
new file mode 100644
index 000000000..6d833a3a4
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/products/api/ProductsApiResourceSwagger.java
@@ -0,0 +1,597 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.portfolio.products.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Set;
+
+/**
+ * Created by Chirag Gupta on 01/01/18.
+ */
+final class ProductsApiResourceSwagger {
+    private ProductsApiResourceSwagger() {
+    }
+
+    @ApiModel(value = "GetProductsTypeProductIdResponse")
+    public final static class GetProductsTypeProductIdResponse {
+        private GetProductsTypeProductIdResponse() {
+        }
+
+        final class GetProductsCurrency {
+            private GetProductsCurrency() {
+            }
+
+            @ApiModelProperty(example = "USD")
+            public String code;
+            @ApiModelProperty(example = "US Dollar")
+            public String name;
+            @ApiModelProperty(example = "2")
+            public Integer decimalPlaces;
+            @ApiModelProperty(example = "100")
+            public Integer inMultiplesOf;
+            @ApiModelProperty(example = "$")
+            public String displaySymbol;
+            @ApiModelProperty(example = "currency.USD")
+            public String nameCode;
+            @ApiModelProperty(example = "US Dollar ($)")
+            public String displayLabel;
+        }
+
+        final class GetProductsMarketPrice {
+            private GetProductsMarketPrice() {
+            }
+
+            @ApiModelProperty(example = "4")
+            public Integer id;
+            @ApiModelProperty(example = "Feb 1, 2016")
+            public String fromDate;
+            @ApiModelProperty(example = "1")
+            public Integer shareValue;
+        }
+
+        final class GetProductsCharges {
+            private GetProductsCharges() {
+            }
+
+            final class GetChargesCurrency {
+                private GetChargesCurrency() {
+                }
+
+                @ApiModelProperty(example = "USD")
+                public String code;
+                @ApiModelProperty(example = "US Dollar")
+                public String name;
+                @ApiModelProperty(example = "2")
+                public Integer decimalPlaces;
+                @ApiModelProperty(example = "$")
+                public String displaySymbol;
+                @ApiModelProperty(example = "currency.USD")
+                public String nameCode;
+                @ApiModelProperty(example = "US Dollar ($)")
+                public String displayLabel;
+            }
+
+            final class GetChargeTimeType {
+                private GetChargeTimeType() {
+                }
+
+                @ApiModelProperty(example = "13")
+                public Integer id;
+                @ApiModelProperty(example = "chargeTimeType.activation")
+                public String code;
+                @ApiModelProperty(example = "Share Account Activate")
+                public String value;
+            }
+
+            final class GetChargeAppliesTo {
+                private GetChargeAppliesTo() {
+                }
+
+                @ApiModelProperty(example = "4")
+                public Integer id;
+                @ApiModelProperty(example = "chargeAppliesTo.shares")
+                public String code;
+                @ApiModelProperty(example = "Shares")
+                public String value;
+            }
+
+            final class GetChargeCalculationType {
+                private GetChargeCalculationType() {
+                }
+
+                @ApiModelProperty(example = "1")
+                public Integer id;
+                @ApiModelProperty(example = "chargeCalculationType.flat")
+                public String code;
+                @ApiModelProperty(example = "Flat")
+                public String value;
+            }
+
+            final class GetChargePaymentMode {
+                private GetChargePaymentMode() {
+                }
+
+                @ApiModelProperty(example = "0")
+                public Integer id;
+                @ApiModelProperty(example = "chargepaymentmode.regular")
+                public String code;
+                @ApiModelProperty(example = "Regular")
+                public String value;
+            }
+
+            @ApiModelProperty(example = "20")
+            public Integer id;
+            @ApiModelProperty(example = "Share Account Activation Flat")
+            public String name;
+            @ApiModelProperty(example = "true")
+            public Boolean active;
+            @ApiModelProperty(example = "false")
+            public Boolean penalty;
+            public GetChargesCurrency currency;
+            @ApiModelProperty(example = "1")
+            public Integer amount;
+            public GetChargeTimeType chargeTimeType;
+            public GetChargeAppliesTo chargeAppliesTo;
+            public GetChargeCalculationType chargeCalculationType;
+            public GetChargePaymentMode chargePaymentMode;
+        }
+
+        final class GetLockPeriodTypeEnum {
+            private GetLockPeriodTypeEnum() {
+            }
+
+            @ApiModelProperty(example = "0")
+            public Integer id;
+            @ApiModelProperty(example = "Days")
+            public String value;
+        }
+
+        final class GetProductsAccountingRule {
+            private GetProductsAccountingRule() {
+            }
+
+            @ApiModelProperty(example = "2")
+            public Integer id;
+            @ApiModelProperty(example = "accountingRuleType.cash")
+            public String code;
+            @ApiModelProperty(example = "CASH BASED")
+            public String value;
+        }
+
+        final class GetProductsAccountingMappings {
+            private GetProductsAccountingMappings() {
+            }
+
+            final class GetShareReferenceId {
+                private GetShareReferenceId() {
+                }
+
+                @ApiModelProperty(example = "1")
+                public Integer id;
+                @ApiModelProperty(example = "ACCOUNT_NAME_1FJBQ")
+                public String name;
+                @ApiModelProperty(example = "ASSET_ED1461237837829")
+                public String glCode;
+            }
+
+            final class GetIncomeFromFeeAccountId {
+                private GetIncomeFromFeeAccountId() {
+                }
+
+                @ApiModelProperty(example = "14")
+                public Integer id;
+                @ApiModelProperty(example = "ACCOUNT_NAME_1FJBQ")
+                public String name;
+                @ApiModelProperty(example = "INCOME_OY1461237869836")
+                public String glCode;
+            }
+
+            final class GetShareEquityId {
+                private GetShareEquityId() {
+                }
+
+                @ApiModelProperty(example = "66")
+                public Integer id;
+                @ApiModelProperty(example = "Equity Account")
+                public String name;
+                @ApiModelProperty(example = "EQUITY1")
+                public String glCode;
+            }
+
+            final class GetShareSuspenseId {
+                private GetShareSuspenseId() {
+                }
+
+                @ApiModelProperty(example = "8")
+                public Integer id;
+                @ApiModelProperty(example = "ACCOUNT_NAME_1FJBQ")
+                public String name;
+                @ApiModelProperty(example = "LIABILITY_MA1461237860198")
+                public String glCode;
+            }
+
+            public GetShareReferenceId shareReferenceId;
+            public GetIncomeFromFeeAccountId incomeFromFeeAccountId;
+            public GetShareEquityId shareEquityId;
+            public GetShareSuspenseId shareSuspenseId;
+        }
+
+        final class GetProductsMinimumActivePeriodFrequencyTypeOptions {
+            private GetProductsMinimumActivePeriodFrequencyTypeOptions() {
+            }
+
+            @ApiModelProperty(example = "0")
+            public Integer id;
+            @ApiModelProperty(example = "savings.lockin.sharePeriodFrequencyType.days")
+            public String code;
+            @ApiModelProperty(example = "Days")
+            public String value;
+        }
+
+        final class GetProductsAccountingMappingOptions {
+            private GetProductsAccountingMappingOptions() {
+            }
+
+            final class GetProductsLiabilityAccountOptions {
+                private GetProductsLiabilityAccountOptions() {
+                }
+
+                final class GetProductsLiabilityType {
+                    private GetProductsLiabilityType() {
+                    }
+
+                    @ApiModelProperty(example = "2")
+                    public Integer id;
+                    @ApiModelProperty(example = "accountType.liability")
+                    public String code;
+                    @ApiModelProperty(example = "LIABILITY")
+                    public String value;
+                }
+
+                final class GetProductsLiabilityUsage {
+                    private GetProductsLiabilityUsage() {
+                    }
+
+                    @ApiModelProperty(example = "1")
+                    public Integer id;
+                    @ApiModelProperty(example = "accountUsage.detail")
+                    public String code;
+                    @ApiModelProperty(example = "DETAIL")
+                    public String value;
+                }
+
+                final class GetProductsTagId {
+                    private GetProductsTagId() {
+                    }
+
+                    @ApiModelProperty(example = "0")
+                    public Integer id;
+                    @ApiModelProperty(example = "false")
+                    public Boolean isActive;
+                }
+
+                @ApiModelProperty(example = "4")
+                public Integer id;
+                @ApiModelProperty(example = "ACCOUNT_NAME_1FJBQ")
+                public String name;
+                @ApiModelProperty(example = "LIABILITY_2T1461237838897")
+                public String glCode;
+                @ApiModelProperty(example = "false")
+                public Boolean disabled;
+                @ApiModelProperty(example = "true")
+                public Boolean manualEntriesAllowed;
+                public GetProductsLiabilityType type;
+                public GetProductsLiabilityUsage usage;
+                @ApiModelProperty(example = "DEFAULT_DESCRIPTION")
+                public String description;
+                @ApiModelProperty(example = "ACCOUNT_NAME_1FJBQ")
+                public String nameDecorated;
+                public GetProductsTagId tagId;
+            }
+
+            final class GetProductsAssetAccountOptions {
+                private GetProductsAssetAccountOptions() {
+                }
+
+                final class GetAssetType {
+                    private GetAssetType() {
+                    }
+
+                    @ApiModelProperty(example = "1")
+                    public Integer id;
+                    @ApiModelProperty(example = "accountType.asset")
+                    public String code;
+                    @ApiModelProperty(example = "ASSET")
+                    public String value;
+                }
+
+                @ApiModelProperty(example = "1")
+                public Integer id;
+                @ApiModelProperty(example = "ACCOUNT_NAME_1FJBQ")
+                public String name;
+                @ApiModelProperty(example = "ASSET_ED1461237837829")
+                public String glCode;
+                @ApiModelProperty(example = "false")
+                public Boolean disabled;
+                @ApiModelProperty(example = "true")
+                public Boolean manualEntriesAllowed;
+                public GetAssetType type;
+                public GetProductsLiabilityAccountOptions.GetProductsLiabilityUsage usage;
+                @ApiModelProperty(example = "DEFAULT_DESCRIPTION")
+                public String description;
+                @ApiModelProperty(example = "ACCOUNT_NAME_1FJBQ")
+                public String nameDecorated;
+                public GetProductsLiabilityAccountOptions.GetProductsTagId tagId;
+            }
+
+            final class GetProductsIncomeAccountOptions {
+                private GetProductsIncomeAccountOptions() {
+                }
+
+                final class GetIncomeType {
+                    private GetIncomeType() {
+                    }
+
+                    @ApiModelProperty(example = "1")
+                    public Integer id;
+                    @ApiModelProperty(example = "accountType.income")
+                    public String code;
+                    @ApiModelProperty(example = "INCOME")
+                    public String value;
+                }
+
+                @ApiModelProperty(example = "2")
+                public Integer id;
+                @ApiModelProperty(example = "ACCOUNT_NAME_1FJBQ")
+                public String name;
+                @ApiModelProperty(example = "INCOME_9O1461237838422")
+                public String glCode;
+                @ApiModelProperty(example = "false")
+                public Boolean disabled;
+                @ApiModelProperty(example = "true")
+                public Boolean manualEntriesAllowed;
+                public GetIncomeType type;
+                public GetProductsLiabilityAccountOptions.GetProductsLiabilityUsage usage;
+                @ApiModelProperty(example = "DEFAULT_DESCRIPTION")
+                public String description;
+                @ApiModelProperty(example = "ACCOUNT_NAME_1FJBQ")
+                public String nameDecorated;
+                public GetProductsLiabilityAccountOptions.GetProductsTagId tagId;
+            }
+
+            final class GetProductsEquityAccountOptions {
+                private GetProductsEquityAccountOptions() {
+                }
+
+                final class GetEquityType {
+                    private GetEquityType() {
+                    }
+
+                    @ApiModelProperty(example = "3")
+                    public Integer id;
+                    @ApiModelProperty(example = "accountType.equity")
+                    public String code;
+                    @ApiModelProperty(example = "EQUITY")
+                    public String value;
+                }
+
+                @ApiModelProperty(example = "66")
+                public Integer id;
+                @ApiModelProperty(example = "Equity Account")
+                public String name;
+                @ApiModelProperty(example = "EQUITY1")
+                public String glCode;
+                @ApiModelProperty(example = "false")
+                public Boolean disabled;
+                @ApiModelProperty(example = "true")
+                public Boolean manualEntriesAllowed;
+                public GetEquityType type;
+                public GetProductsLiabilityAccountOptions.GetProductsLiabilityUsage usage;
+                @ApiModelProperty(example = "Equity Account")
+                public String nameDecorated;
+                public GetProductsLiabilityAccountOptions.GetProductsTagId tagId;
+            }
+
+            public Set<GetProductsLiabilityAccountOptions> liabilityAccountOptions;
+            public Set<GetProductsAssetAccountOptions> assetAccountOptions;
+            public Set<GetProductsIncomeAccountOptions> incomeAccountOptions;
+            public Set<GetProductsEquityAccountOptions> equityAccountOptions;
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer id;
+        @ApiModelProperty(example = "Share Product")
+        public String name;
+        @ApiModelProperty(example = "SP")
+        public String shortName;
+        @ApiModelProperty(example = "SP")
+        public String description;
+        public GetProductsCurrency currency;
+        @ApiModelProperty(example = "100")
+        public Integer totalShares;
+        @ApiModelProperty(example = "50")
+        public Integer totalSharesIssued;
+        @ApiModelProperty(example = "1")
+        public Integer unitPrice;
+        @ApiModelProperty(example = "50")
+        public Integer shareCapital;
+        @ApiModelProperty(example = "1")
+        public Integer minimumShares;
+        @ApiModelProperty(example = "10")
+        public Integer nominalShares;
+        @ApiModelProperty(example = "50")
+        public Integer maximumShares;
+        public Set<GetProductsMarketPrice> marketPrice;
+        public Set<GetProductsCharges> charges;
+        @ApiModelProperty(example = "true")
+        public Boolean allowDividendCalculationForInactiveClients;
+        @ApiModelProperty(example = "1")
+        public Integer lockinPeriod;
+        public GetLockPeriodTypeEnum lockPeriodTypeEnum;
+        @ApiModelProperty(example = "1")
+        public Integer minimumActivePeriod;
+        public GetLockPeriodTypeEnum minimumActivePeriodForDividendsTypeEnum;
+        public GetProductsAccountingRule accountingRule;
+        public GetProductsAccountingMappings accountingMappings;
+        public Set<GetProductsCharges.GetChargesCurrency> currencyOptions;
+        public Set<GetProductsCharges> chargeOptions;
+        public Set<GetProductsMinimumActivePeriodFrequencyTypeOptions> minimumActivePeriodFrequencyTypeOptions;
+        public Set<GetProductsMinimumActivePeriodFrequencyTypeOptions> lockinPeriodFrequencyTypeOptions;
+        public GetProductsAccountingMappingOptions accountingMappingOptions;
+    }
+
+    @ApiModel(value = "GetProductsTypeResponse")
+    public static final class GetProductsTypeResponse {
+        private GetProductsTypeResponse() {
+        }
+
+        final class GetProductsPageItems {
+            private GetProductsPageItems() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "Share Product")
+            public String name;
+            @ApiModelProperty(example = "Share Product Description")
+            public String shortName;
+            @ApiModelProperty(example = "100")
+            public Integer totalShares;
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer totalFilteredRecords;
+        public Set<GetProductsPageItems> pageItems;
+    }
+
+    @ApiModel(value = "PostProductsTypeRequest")
+    public final static class PostProductsTypeRequest {
+        private PostProductsTypeRequest() {
+        }
+
+        final class PostProductsMarketPricePeriods {
+            private PostProductsMarketPricePeriods() {
+            }
+
+            @ApiModelProperty(example = "en")
+            public String locale;
+            @ApiModelProperty(example = "dd MMMM yyyy")
+            public String dateFormat;
+            @ApiModelProperty(example = "04 May 2016")
+            public String fromDate;
+            @ApiModelProperty(example = "2")
+            public Integer shareValue;
+        }
+
+        final class PostProductsChargesSelected {
+            private PostProductsChargesSelected() {
+            }
+
+            @ApiModelProperty(example = "20")
+            public Integer id;
+        }
+
+        @ApiModelProperty(example = "Share Product")
+        public String name;
+        @ApiModelProperty(example = "SP")
+        public String shortName;
+        @ApiModelProperty(example = "Description")
+        public String description;
+        @ApiModelProperty(example = "USD")
+        public String currencyCode;
+        @ApiModelProperty(example = "2")
+        public Integer digitsAfterDecimal;
+        @ApiModelProperty(example = "1")
+        public Integer inMultiplesOf;
+        @ApiModelProperty(example = "en")
+        public String locale;
+        @ApiModelProperty(example = "1000")
+        public Integer totalShares;
+        @ApiModelProperty(example = "1000")
+        public Integer sharesIssued;
+        @ApiModelProperty(example = "1")
+        public Integer unitPrice;
+        @ApiModelProperty(example = "10")
+        public Integer minimumShares;
+        @ApiModelProperty(example = "20")
+        public Integer nominalShares;
+        @ApiModelProperty(example = "30")
+        public Integer maximumShares;
+        @ApiModelProperty(example = "1")
+        public Integer minimumActivePeriodForDividends;
+        @ApiModelProperty(example = "0")
+        public Integer minimumactiveperiodFrequencyType;
+        @ApiModelProperty(example = "1")
+        public Integer lockinPeriodFrequency;
+        @ApiModelProperty(example = "1")
+        public Integer lockinPeriodFrequencyType;
+        @ApiModelProperty(example = "true")
+        public Boolean allowDividendCalculationForInactiveClients;
+        public Set<PostProductsMarketPricePeriods> marketPricePeriods;
+        public Set<PostProductsChargesSelected> chargesSelected;
+        @ApiModelProperty(example = "1")
+        public Integer accountingRule;
+    }
+
+    @ApiModel(value = "PostProductsTypeResponse")
+    public final static class PostProductsTypeResponse {
+        private PostProductsTypeResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer resourceId;
+    }
+
+    @ApiModel(value = "PutProductsTypeProductIdRequest")
+    public final static class PutProductsTypeProductIdRequest {
+        private PutProductsTypeProductIdRequest() {
+        }
+
+        @ApiModelProperty(example = "Share Product Description.")
+        public String description;
+        @ApiModelProperty(example = "en")
+        public String locale;
+        @ApiModelProperty(example = "5.0")
+        public Double unitPrice;
+    }
+
+    @ApiModel(value = "PutProductsTypeProductIdResponse")
+    public final static class PutProductsTypeProductIdResponse {
+        private PutProductsTypeProductIdResponse() {
+        }
+
+        final class PutProductsChanges {
+            private PutProductsChanges() {
+            }
+
+            @ApiModelProperty(example = "Share Product Description.")
+            public String description;
+            @ApiModelProperty(example = "5.0")
+            public Double unitPrice;
+            @ApiModelProperty(example = "en")
+            public String locale;
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer resourceId;
+        public PutProductsChanges changes;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/api/FixedDepositAccountsApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/api/FixedDepositAccountsApiResource.java
index a3a91717e..8406c3f3e 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/api/FixedDepositAccountsApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/api/FixedDepositAccountsApiResource.java
@@ -18,6 +18,8 @@
  */
 package org.apache.fineract.portfolio.savings.api;
 
+import com.google.gson.JsonElement;
+import io.swagger.annotations.*;
 import java.io.InputStream;
 import java.math.BigDecimal;
 import java.util.Arrays;
@@ -77,11 +79,11 @@
 import org.springframework.stereotype.Component;
 import org.springframework.util.CollectionUtils;
 
-import com.google.gson.JsonElement;
 
 @Path("/fixeddepositaccounts")
 @Component
 @Scope("singleton")
+@Api(value = "Fixed Deposit Account", description = "Fixed Deposit accounts are instances of a praticular fixed deposit product created. An application process around the creation of accounts is also supported.")
 public class FixedDepositAccountsApiResource {
 
     private final DepositAccountReadPlatformService depositAccountReadPlatformService;
@@ -124,10 +126,12 @@ public FixedDepositAccountsApiResource(final DepositAccountReadPlatformService d
     @Path("template")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String template(@QueryParam("clientId") final Long clientId, @QueryParam("groupId") final Long groupId,
-            @QueryParam("productId") final Long productId,
-            @DefaultValue("false") @QueryParam("staffInSelectedOfficeOnly") final boolean staffInSelectedOfficeOnly,
-            @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Retrieve Fixed Deposit Account Template", httpMethod = "GET", notes = "This is a convenience resource. It can be useful when building maintenance user interface screens for fixed deposit applications. The template data returned consists of any or all of:\n\n" + "\n\n" + "Field Defaults\n\n" + "Allowed Value Lists" + "Example Requests:\n\n" + "\n\n" + "fixeddepositaccounts/template?clientId=1")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = FixedDepositAccountsApiResourceSwagger.GetFixedDepositAccountsTemplateResponse.class)})
+    public String template(@QueryParam("clientId") @ApiParam(value = "clientId") final Long clientId, @QueryParam("groupId") @ApiParam(value = "groupId") final Long groupId,
+                           @QueryParam("productId")@ApiParam(value = "productId") final Long productId,
+                           @DefaultValue("false") @QueryParam("staffInSelectedOfficeOnly") @ApiParam(value = "staffInSelectedOfficeOnly") final boolean staffInSelectedOfficeOnly,
+                           @Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(DepositsApiConstants.FIXED_DEPOSIT_ACCOUNT_RESOURCE_NAME);
 
@@ -141,9 +145,11 @@ public String template(@QueryParam("clientId") final Long clientId, @QueryParam(
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveAll(@Context final UriInfo uriInfo, @QueryParam("paged") final Boolean paged,
-            @QueryParam("offset") final Integer offset, @QueryParam("limit") final Integer limit,
-            @QueryParam("orderBy") final String orderBy, @QueryParam("sortOrder") final String sortOrder) {
+    @ApiOperation(value = "List Fixed deposit applications/accounts", httpMethod = "GET", notes = "Lists Fixed Deposit Accounts\n\n" + "Example Requests:\n\n" + "\n\n" + "fixeddepositaccounts\n\n" + "\n\n" + "fixeddepositaccounts?fields=name")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = FixedDepositAccountsApiResourceSwagger.GetFixedDepositAccountsResponse.class, responseContainer = "List")})
+    public String retrieveAll(@Context final UriInfo uriInfo, @QueryParam("paged") @ApiParam(value = "paged") final Boolean paged,
+            @QueryParam("offset") @ApiParam(value = "offset") final Integer offset, @QueryParam("limit") @ApiParam(value = "limit") final Integer limit,
+            @QueryParam("orderBy") @ApiParam(value = "orderBy") final String orderBy, @QueryParam("sortOrder") @ApiParam(value = "sortOrder") final String sortOrder) {
 
         this.context.authenticatedUser().validateHasReadPermission(DepositsApiConstants.FIXED_DEPOSIT_ACCOUNT_RESOURCE_NAME);
         final PaginationParameters paginationParameters = PaginationParameters.instance(paged, offset, limit, orderBy, sortOrder);
@@ -165,7 +171,10 @@ public String retrieveAll(@Context final UriInfo uriInfo, @QueryParam("paged") f
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String submitApplication(final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Submit new fixed deposit application", httpMethod = "POST", notes = "Submits a new fixed deposit application"+"Mandatory Fields: clientId or groupId, productId, submittedOnDate, depositAmount, depositPeriod, depositPeriodFrequencyId\n\n" + "Optional Fields: accountNo, externalId, fieldOfficerId,linkAccountId(if provided initial deposit amount will be collected from this account),transferInterestToSavings(By enabling this flag all interest postings will be transferred to linked saving account )")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = FixedDepositAccountsApiResourceSwagger.PostFixedDepositAccountsRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = FixedDepositAccountsApiResourceSwagger.PostFixedDepositAccountsResponse.class)})
+    public String submitApplication(@ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().createFixedDepositAccount().withJson(apiRequestBodyAsJson)
                 .build();
@@ -179,9 +188,11 @@ public String submitApplication(final String apiRequestBodyAsJson) {
     @Path("{accountId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveOne(@PathParam("accountId") final Long accountId,
-            @DefaultValue("false") @QueryParam("staffInSelectedOfficeOnly") final boolean staffInSelectedOfficeOnly,
-            @DefaultValue("all") @QueryParam("chargeStatus") final String chargeStatus, @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Retrieve a fixed deposit application/account", httpMethod = "GET", notes = "Retrieves a fixed deposit application/account\n\n" + "Example Requests :\n\n" + "\n\n" + "fixeddepositaccounts/1" + "\n\n" + "fixeddepositaccounts/1?associations=all" )
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = FixedDepositAccountsApiResourceSwagger.GetFixedDepositAccountsAccountIdResponse.class)})
+    public String retrieveOne(@PathParam("accountId") @ApiParam(value = "accountId") final Long accountId,
+            @DefaultValue("false") @QueryParam("staffInSelectedOfficeOnly") @ApiParam(value = "staffInSelectedOfficeOnly") final boolean staffInSelectedOfficeOnly,
+            @DefaultValue("all") @QueryParam("chargeStatus")@ApiParam(value = "chargeStatus") final String chargeStatus, @Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(DepositsApiConstants.FIXED_DEPOSIT_ACCOUNT_RESOURCE_NAME);
 
@@ -268,7 +279,10 @@ private FixedDepositAccountData populateTemplateAndAssociations(final Long accou
     @Path("{accountId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String update(@PathParam("accountId") final Long accountId, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Modify a fixed deposit application", httpMethod = "PUT", notes = "Fixed deposit application can only be modified when in 'Submitted and pending approval' state. Once the application is approved, the details cannot be changed using this method. Specific api endpoints will be created to allow change of interest detail such as rate, compounding period, posting period etc")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = FixedDepositAccountsApiResourceSwagger.PutFixedDepositAccountsAccountIdRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = FixedDepositAccountsApiResourceSwagger.PutFixedDepositAccountsAccountIdResponse.class)})
+    public String update(@PathParam("accountId") @ApiParam(value = "accountId") final Long accountId, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().updateFixedDepositAccount(accountId)
                 .withJson(apiRequestBodyAsJson).build();
@@ -282,8 +296,11 @@ public String update(@PathParam("accountId") final Long accountId, final String
     @Path("{accountId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String handleCommands(@PathParam("accountId") final Long accountId, @QueryParam("command") final String commandParam,
-            @Context final UriInfo uriInfo, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Approve fixed deposit application | Undo approval fixed deposit application | Reject fixed deposit application | Withdraw fixed deposit application | Activate a fixed deposit account | Close a fixed deposit account | Premature Close a fixed deposit account | Calculate Premature amount on Fixed deposit account | Calculate Interest on Fixed Deposit Account | Post Interest on Fixed Deposit Account", httpMethod = "POST", notes = "Approve fixed deposit application:\n\n" + "Approves fixed deposit application so long as its in 'Submitted and pending approval' state.\n\n" + "Undo approval fixed deposit application:\n\n" + "Will move 'approved' fixed deposit application back to 'Submitted and pending approval' state.\n\n" + "Reject fixed deposit application:\n\n" + "Rejects fixed deposit application so long as its in 'Submitted and pending approval' state.\n\n" + "Withdraw fixed deposit application:\n\n" + "Used when an applicant withdraws from the fixed deposit application. It must be in 'Submitted and pending approval' state.\n\n" + "Close a fixed deposit account:\n\n" + "Results in a Matured fixed deposit account being converted into a 'closed' fixed deposit account.\n\n" + "Premature Close a fixed deposit account:\n\n" + "Results in an Active fixed deposit account being converted into a 'Premature Closed' fixed deposit account with options to withdraw prematured amount. (premature amount is calculated using interest rate chart applicable along with penal interest if any.)\n\n" + "Calculate Premature amount on Fixed deposit account:\n\n" + "Calculate premature amount on fixed deposit account till premature close date. Premature amount is calculated based on interest chart and penal interest applicable.\n\n" + "Calculate Interest on Fixed Deposit Account:\n\n" + "Calculates interest earned on a fixed deposit account based on todays date. It does not attempt to post or credit the interest on the account. That is responsibility of the Post Interest API that will likely be called by overnight process.\n\n" + "Post Interest on Fixed Deposit Account:\n\n" + "Calculates and Posts interest earned on a fixed deposit account based on today's date and whether an interest posting or crediting event is due.\n\n" + "Showing request/response for Calculate Interest on Fixed Deposit Account")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = FixedDepositAccountsApiResourceSwagger.PostFixedDepositAccountsAccountIdRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = FixedDepositAccountsApiResourceSwagger.PostFixedDepositAccountsAccountIdResponse.class)})
+    public String handleCommands(@PathParam("accountId") @ApiParam(value = "accountId") final Long accountId, @QueryParam("command") @ApiParam(value = "command") final String commandParam,
+            @Context final UriInfo uriInfo, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         String jsonApiRequest = apiRequestBodyAsJson;
         if (StringUtils.isBlank(jsonApiRequest)) {
@@ -345,7 +362,9 @@ private boolean is(final String commandParam, final String commandValue) {
     @Path("{accountId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String delete(@PathParam("accountId") final Long accountId) {
+    @ApiOperation(value = "Delete a fixed deposit application", httpMethod = "DELETE", notes = "At present we support hard delete of fixed deposit application so long as its in 'Submitted and pending approval' state. One the application is moves past this state, it is not possible to do a 'hard' delete of the application or the account. An API endpoint will be added to close/de-activate the fixed deposit account.")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = FixedDepositAccountsApiResourceSwagger.DeleteFixedDepositAccountsAccountIdResponse.class)})
+    public String delete(@PathParam("accountId") @ApiParam(value = "accountId") final Long accountId) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().deleteFixedDepositAccount(accountId).build();
 
@@ -358,7 +377,7 @@ public String delete(@PathParam("accountId") final Long accountId) {
     @Path("{accountId}/template")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String accountClosureTemplate(@PathParam("accountId") final Long accountId, @QueryParam("command") final String commandParam,
+    public String accountClosureTemplate(@PathParam("accountId") @ApiParam(value = "accountId") final Long accountId, @QueryParam("command") @ApiParam(value = "command") final String commandParam,
             @Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(DepositsApiConstants.FIXED_DEPOSIT_ACCOUNT_RESOURCE_NAME);
@@ -407,4 +426,4 @@ public String postFixedDepositTransactionTemplate(@FormDataParam("file") InputSt
                 uploadedInputStream,fileDetail,locale,dateFormat);
         return this.toApiJsonSerializer.serialize(importDocumentId);
     }
-}
\ No newline at end of file
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/api/FixedDepositAccountsApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/api/FixedDepositAccountsApiResourceSwagger.java
new file mode 100644
index 000000000..41567ca82
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/api/FixedDepositAccountsApiResourceSwagger.java
@@ -0,0 +1,523 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.portfolio.savings.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.time.LocalDate;
+import java.util.Set;
+
+/**
+ * Created by Chirag Gupta on 12/15/17.
+ */
+final class FixedDepositAccountsApiResourceSwagger {
+    private FixedDepositAccountsApiResourceSwagger() {
+    }
+
+    @ApiModel(value = "GetFixedDepositAccountsTemplateResponse")
+    public final static class GetFixedDepositAccountsTemplateResponse {
+        private GetFixedDepositAccountsTemplateResponse() {
+        }
+
+        final class GetFixedDepositAccountsProductOptions {
+            private GetFixedDepositAccountsProductOptions() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "Passbook Savings")
+            public String name;
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer clientId;
+        @ApiModelProperty(example = "small business")
+        public String clientName;
+        public Set<GetFixedDepositAccountsProductOptions> productOptions;
+    }
+
+    @ApiModel(value = "GetFixedDepositAccountsResponse")
+    public final static class GetFixedDepositAccountsResponse {
+        private GetFixedDepositAccountsResponse() {
+        }
+
+        final class GetFixedDepositAccountsStatus {
+            private GetFixedDepositAccountsStatus() {
+            }
+
+            @ApiModelProperty(example = "100")
+            public Integer id;
+            @ApiModelProperty(example = "savingsAccountStatusType.submitted.and.pending.approval")
+            public String code;
+            @ApiModelProperty(example = "Submitted and pending approval")
+            public String value;
+            @ApiModelProperty(example = "true")
+            public Boolean submittedAndPendingApproval;
+            @ApiModelProperty(example = "false")
+            public Boolean approved;
+            @ApiModelProperty(example = "false")
+            public Boolean rejected;
+            @ApiModelProperty(example = "false")
+            public Boolean withdrawnByApplicant;
+            @ApiModelProperty(example = "false")
+            public Boolean active;
+            @ApiModelProperty(example = "false")
+            public Boolean closed;
+            @ApiModelProperty(example = "false")
+            public Boolean prematureClosed;
+            @ApiModelProperty(example = "false")
+            public Boolean transferInProgress;
+            @ApiModelProperty(example = "false")
+            public Boolean transferOnHold;
+        }
+
+        final class GetFixedDepositAccountsTimeline {
+            private GetFixedDepositAccountsTimeline() {
+            }
+
+            @ApiModelProperty(example = "[2014, 3, 1]")
+            public LocalDate submittedOnDate;
+            @ApiModelProperty(example = "mifos")
+            public String submittedByUsername;
+            @ApiModelProperty(example = "App")
+            public String submittedByFirstname;
+            @ApiModelProperty(example = "Administrator")
+            public String submittedByLastname;
+        }
+
+        final class GetFixedDepositAccountsCurrency {
+            private GetFixedDepositAccountsCurrency() {
+            }
+
+            @ApiModelProperty(example = "USD")
+            public String code;
+            @ApiModelProperty(example = "US Dollar")
+            public String name;
+            @ApiModelProperty(example = "2")
+            public Integer decimalPlaces;
+            @ApiModelProperty(example = "1")
+            public Integer inMultiplesOf;
+            @ApiModelProperty(example = "$")
+            public String displaySymbol;
+            @ApiModelProperty(example = "currency.USD")
+            public String nameCode;
+            @ApiModelProperty(example = "US Dollar ($)")
+            public String displayLabel;
+        }
+
+        final class GetFixedDepositAccountsInterestCompoundingPeriodType {
+            private GetFixedDepositAccountsInterestCompoundingPeriodType() {
+            }
+
+            @ApiModelProperty(example = "4")
+            public Integer id;
+            @ApiModelProperty(example = "savings.interest.period.savingsCompoundingInterestPeriodType.monthly")
+            public String code;
+            @ApiModelProperty(example = "Monthly")
+            public String value;
+        }
+
+        final class GetFixedDepositAccountsInterestPostingPeriodType {
+            private GetFixedDepositAccountsInterestPostingPeriodType() {
+            }
+
+            @ApiModelProperty(example = "4")
+            public Integer id;
+            @ApiModelProperty(example = "savings.interest.posting.period.savingsPostingInterestPeriodType.monthly")
+            public String code;
+            @ApiModelProperty(example = "Monthly")
+            public String value;
+        }
+
+        final class GetFixedDepositAccountsInterestCalculationType {
+            private GetFixedDepositAccountsInterestCalculationType() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "savingsInterestCalculationType.dailybalance")
+            public String code;
+            @ApiModelProperty(example = "Daily Balance")
+            public String value;
+        }
+
+        final class GetFixedDepositAccountsInterestCalculationDaysInYearType {
+            private GetFixedDepositAccountsInterestCalculationDaysInYearType() {
+            }
+
+            @ApiModelProperty(example = "365")
+            public Integer id;
+            @ApiModelProperty(example = "savingsInterestCalculationDaysInYearType.days365")
+            public String code;
+            @ApiModelProperty(example = "365 Days")
+            public String value;
+        }
+
+        final class GetFixedDepositAccountsSummary {
+            private GetFixedDepositAccountsSummary() {
+            }
+
+            public GetFixedDepositAccountsCurrency currency;
+            @ApiModelProperty(example = "0")
+            public Float accountBalance;
+        }
+
+        final class GetFixedDepositAccountsMinDepositTermType {
+            private GetFixedDepositAccountsMinDepositTermType() {
+            }
+
+            @ApiModelProperty(example = "2")
+            public Integer id;
+            @ApiModelProperty(example = "deposit.term.savingsPeriodFrequencyType.months")
+            public String code;
+            @ApiModelProperty(example = "Months")
+            public String value;
+        }
+
+        final class GetFixedDepositAccountsMaxDepositTermType {
+            private GetFixedDepositAccountsMaxDepositTermType() {
+            }
+
+            @ApiModelProperty(example = "3")
+            public Integer id;
+            @ApiModelProperty(example = "deposit.term.savingsPeriodFrequencyType.years")
+            public String code;
+            @ApiModelProperty(example = "Years")
+            public String value;
+        }
+
+        final class GetFixedDepositAccountsDepositPeriodFrequency {
+            private GetFixedDepositAccountsDepositPeriodFrequency() {
+            }
+
+            @ApiModelProperty(example = "2")
+            public Integer id;
+            @ApiModelProperty(example = "deposit.period.savingsPeriodFrequencyType.months")
+            public String code;
+            @ApiModelProperty(example = "Months")
+            public String value;
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer id;
+        @ApiModelProperty(example = "000000001")
+        public Long accountNo;
+        @ApiModelProperty(example = "1")
+        public Integer clientId;
+        @ApiModelProperty(example = "Sangamesh N")
+        public String clientName;
+        @ApiModelProperty(example = "3")
+        public Integer savingsProductId;
+        @ApiModelProperty(example = "FD01")
+        public String savingsProductName;
+        @ApiModelProperty(example = "0")
+        public Integer fieldOfficerId;
+        public GetFixedDepositAccountsStatus status;
+        public GetFixedDepositAccountsTimeline timeline;
+        public GetFixedDepositAccountsCurrency currency;
+        public GetFixedDepositAccountsInterestCompoundingPeriodType interestCompoundingPeriodType;
+        public GetFixedDepositAccountsInterestPostingPeriodType interestPostingPeriodType;
+        public GetFixedDepositAccountsInterestCalculationType interestCalculationType;
+        public GetFixedDepositAccountsInterestCalculationDaysInYearType interestCalculationDaysInYearType;
+        public GetFixedDepositAccountsSummary summary;
+        @ApiModelProperty(example = "false")
+        public Boolean interestFreePeriodApplicable;
+        @ApiModelProperty(example = "false")
+        public Boolean preClosurePenalApplicable;
+        @ApiModelProperty(example = "3")
+        public Integer minDepositTerm;
+        @ApiModelProperty(example = "4")
+        public Integer maxDepositTerm;
+        public GetFixedDepositAccountsMinDepositTermType minDepositTermType;
+        public GetFixedDepositAccountsMaxDepositTermType maxDepositTermType;
+        @ApiModelProperty(example = "5000")
+        public Float depositAmount;
+        @ApiModelProperty(example = "5140.25")
+        public Float maturityAmount;
+        @ApiModelProperty(example = "[2014, 9, 1]")
+        public LocalDate maturityDate;
+        @ApiModelProperty(example = "6")
+        public Integer depositPeriod;
+        public GetFixedDepositAccountsDepositPeriodFrequency depositPeriodFrequency;
+    }
+
+    @ApiModel(value = "PostFixedDepositAccountsRequest")
+    public final static class PostFixedDepositAccountsRequest {
+        private PostFixedDepositAccountsRequest() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer clientId;
+        @ApiModelProperty(example = "1")
+        public Integer productId;
+        @ApiModelProperty(example = "en")
+        public String locale;
+        @ApiModelProperty(example = "dd MMMM yyyy")
+        public String dateFormat;
+        @ApiModelProperty(example = "01 March 2014")
+        public String submittedOnDate;
+        @ApiModelProperty(example = "5000")
+        public Float depositAmount;
+        @ApiModelProperty(example = "6")
+        public Integer depositPeriod;
+        @ApiModelProperty(example = "2")
+        public Integer depositPeriodFrequencyId;
+    }
+
+    @ApiModel(value = "PostFixedDepositAccountsResponse")
+    public final static class PostFixedDepositAccountsResponse {
+        private PostFixedDepositAccountsResponse() {
+        }
+
+        @ApiModelProperty(example = "2")
+        public Integer officeId;
+        @ApiModelProperty(example = "1")
+        public Integer clientId;
+        @ApiModelProperty(example = "1")
+        public Integer savingsId;
+        @ApiModelProperty(example = "1")
+        public Integer resourceId;
+    }
+
+    @ApiModel(value = "GetFixedDepositAccountsAccountIdResponse")
+    public final static class GetFixedDepositAccountsAccountIdResponse {
+        private GetFixedDepositAccountsAccountIdResponse() {
+        }
+
+        final class GetFixedDepositAccountsAccountChart {
+            private GetFixedDepositAccountsAccountChart() {
+            }
+
+            final class GetFixedDepositAccountsChartSlabs {
+                private GetFixedDepositAccountsChartSlabs() {
+                }
+
+                final class GetFixedDepositAccountsPeriodType {
+                    private GetFixedDepositAccountsPeriodType() {
+                    }
+
+                    @ApiModelProperty(example = "0")
+                    public Integer id;
+                    @ApiModelProperty(example = "interestChartPeriodType.days")
+                    public String code;
+                    @ApiModelProperty(example = "Days")
+                    public String value;
+                }
+
+                final class GetFixedDepositAccountsAccountChartCurrency {
+                    private GetFixedDepositAccountsAccountChartCurrency() {
+                    }
+
+                    @ApiModelProperty(example = "USD")
+                    public String code;
+                    @ApiModelProperty(example = "US Dollar")
+                    public String name;
+                    @ApiModelProperty(example = "2")
+                    public Integer decimalPlaces;
+                    @ApiModelProperty(example = "$")
+                    public String displaySymbol;
+                    @ApiModelProperty(example = "currency.USD")
+                    public String nameCode;
+                    @ApiModelProperty(example = "US Dollar ($)")
+                    public String displayLabel;
+                }
+
+                @ApiModelProperty(example = "13")
+                public Integer id;
+                public GetFixedDepositAccountsPeriodType periodType;
+                @ApiModelProperty(example = "181")
+                public Integer fromPeriod;
+                @ApiModelProperty(example = "365")
+                public Integer toPeriod;
+                @ApiModelProperty(example = "5.5")
+                public Double annualInterestRate;
+                public GetFixedDepositAccountsAccountChartCurrency currency;
+            }
+
+            final class GetFixedDepositAccountsPeriodTypes {
+                private GetFixedDepositAccountsPeriodTypes() {
+                }
+
+                @ApiModelProperty(example = "0")
+                public Integer id;
+                @ApiModelProperty(example = "interestChartPeriodType.days")
+                public String code;
+                @ApiModelProperty(example = "Days")
+                public String value;
+            }
+
+            @ApiModelProperty(example = "4")
+            public Integer id;
+            @ApiModelProperty(example = "[2013, 10, 2]")
+            public LocalDate fromDate;
+            @ApiModelProperty(example = "5")
+            public Integer accountId;
+            @ApiModelProperty(example = "FD000023")
+            public Long accountNumber;
+            public Set<GetFixedDepositAccountsChartSlabs> chartSlabs;
+            public Set<GetFixedDepositAccountsPeriodTypes> periodTypes;
+        }
+
+        final class GetFixedDepositAccountsAccountIdCurrency {
+            private GetFixedDepositAccountsAccountIdCurrency() {
+            }
+
+            @ApiModelProperty(example = "USD")
+            public String code;
+            @ApiModelProperty(example = "US Dollar")
+            public String name;
+            @ApiModelProperty(example = "2")
+            public Integer decimalPlaces;
+            @ApiModelProperty(example = "1")
+            public Integer inMultiplesOf;
+            @ApiModelProperty(example = "$")
+            public String displaySymbol;
+            @ApiModelProperty(example = "currency.USD")
+            public String nameCode;
+            @ApiModelProperty(example = "US Dollar ($)")
+            public String displayLabel;
+        }
+
+        final class GetFixedDepositAccountsAccountIdSummary {
+            private GetFixedDepositAccountsAccountIdSummary() {
+            }
+
+            public GetFixedDepositAccountsAccountIdCurrency currency;
+            @ApiModelProperty(example = "0")
+            public Float accountBalance;
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer id;
+        @ApiModelProperty(example = "FD000023")
+        public Long accountNo;
+        @ApiModelProperty(example = "FD-23")
+        public String externalId;
+        @ApiModelProperty(example = "1")
+        public Integer clientId;
+        @ApiModelProperty(example = "Sangamesh N")
+        public String clientName;
+        @ApiModelProperty(example = "3")
+        public Integer savingsProductId;
+        @ApiModelProperty(example = "FD01")
+        public String savingsProductName;
+        @ApiModelProperty(example = "0")
+        public Integer fieldOfficerId;
+        public GetFixedDepositAccountsResponse.GetFixedDepositAccountsStatus status;
+        public GetFixedDepositAccountsResponse.GetFixedDepositAccountsTimeline timeline;
+        public GetFixedDepositAccountsAccountIdCurrency currency;
+        public GetFixedDepositAccountsResponse.GetFixedDepositAccountsInterestCompoundingPeriodType interestCompoundingPeriodType;
+        public GetFixedDepositAccountsResponse.GetFixedDepositAccountsInterestPostingPeriodType interestPostingPeriodType;
+        public GetFixedDepositAccountsResponse.GetFixedDepositAccountsInterestCalculationType interestCalculationType;
+        public GetFixedDepositAccountsResponse.GetFixedDepositAccountsInterestCalculationDaysInYearType interestCalculationDaysInYearType;
+        @ApiModelProperty(example = "false")
+        public Boolean interestFreePeriodApplicable;
+        @ApiModelProperty(example = "false")
+        public Boolean preClosurePenalApplicable;
+        @ApiModelProperty(example = "3")
+        public Integer minDepositTerm;
+        @ApiModelProperty(example = "4")
+        public Integer maxDepositTerm;
+        public GetFixedDepositAccountsResponse.GetFixedDepositAccountsMinDepositTermType minDepositTermType;
+        public GetFixedDepositAccountsResponse.GetFixedDepositAccountsMaxDepositTermType maxDepositTermType;
+        @ApiModelProperty(example = "5000")
+        public Float depositAmount;
+        @ApiModelProperty(example = "5140.25")
+        public Float maturityAmount;
+        @ApiModelProperty(example = "[2014, 9, 1]")
+        public LocalDate maturityDate;
+        @ApiModelProperty(example = "6")
+        public Integer depositPeriod;
+        public GetFixedDepositAccountsResponse.GetFixedDepositAccountsDepositPeriodFrequency depositPeriodFrequency;
+        public GetFixedDepositAccountsAccountIdSummary summary;
+        public GetFixedDepositAccountsAccountChart accountChart;
+    }
+
+    @ApiModel(value = "PutFixedDepositAccountsAccountIdRequest")
+    public final static class PutFixedDepositAccountsAccountIdRequest {
+        private PutFixedDepositAccountsAccountIdRequest() {
+        }
+
+        @ApiModelProperty(example = "en")
+        public String locale;
+        @ApiModelProperty(example = "6000")
+        public Float depositAmount;
+    }
+
+    @ApiModel(value = "PutFixedDepositAccountsAccountIdResponse")
+    public final static class PutFixedDepositAccountsAccountIdResponse {
+        private PutFixedDepositAccountsAccountIdResponse() {
+        }
+
+        final class PutFixedDepositAccountsChanges {
+            private PutFixedDepositAccountsChanges() {
+            }
+
+            @ApiModelProperty(example = "6000")
+            public Float depositAmount;
+            @ApiModelProperty(example = "en")
+            public String locale;
+        }
+
+        @ApiModelProperty(example = "2")
+        public Integer officeId;
+        @ApiModelProperty(example = "1")
+        public Integer clientId;
+        @ApiModelProperty(example = "1")
+        public Integer savingsId;
+        @ApiModelProperty(example = "1")
+        public Integer resourceId;
+        public PutFixedDepositAccountsChanges changes;
+    }
+
+    @ApiModel(value = "PostFixedDepositAccountsAccountIdRequest")
+    public final static class PostFixedDepositAccountsAccountIdRequest {
+        private PostFixedDepositAccountsAccountIdRequest() {
+        }
+    }
+
+    @ApiModel(value = "PostFixedDepositAccountsAccountIdResponse")
+    public final static class PostFixedDepositAccountsAccountIdResponse {
+        private PostFixedDepositAccountsAccountIdResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer officeId;
+        @ApiModelProperty(example = "1")
+        public Integer clientId;
+        @ApiModelProperty(example = "1")
+        public Integer savingsId;
+        @ApiModelProperty(example = "1")
+        public Integer resourceId;
+    }
+
+    @ApiModel(value = "DeleteFixedDepositAccountsAccountIdResponse")
+    public final static class DeleteFixedDepositAccountsAccountIdResponse {
+        private DeleteFixedDepositAccountsAccountIdResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer officeId;
+        @ApiModelProperty(example = "1")
+        public Integer clientId;
+        @ApiModelProperty(example = "1")
+        public Integer resourceId;
+    }
+}
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/api/FixedDepositProductsApiResource.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/api/FixedDepositProductsApiResource.java
index 0648a13bc..cfd89e1d3 100644
--- a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/api/FixedDepositProductsApiResource.java
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/api/FixedDepositProductsApiResource.java
@@ -18,23 +18,7 @@
  */
 package org.apache.fineract.portfolio.savings.api;
 
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Map;
-
-import javax.ws.rs.Consumes;
-import javax.ws.rs.DELETE;
-import javax.ws.rs.GET;
-import javax.ws.rs.POST;
-import javax.ws.rs.PUT;
-import javax.ws.rs.Path;
-import javax.ws.rs.PathParam;
-import javax.ws.rs.Produces;
-import javax.ws.rs.core.Context;
-import javax.ws.rs.core.MediaType;
-import javax.ws.rs.core.UriInfo;
-
+import io.swagger.annotations.*;
 import org.apache.fineract.accounting.common.AccountingDropdownReadPlatformService;
 import org.apache.fineract.accounting.common.AccountingEnumerations;
 import org.apache.fineract.accounting.common.AccountingRuleType;
@@ -60,12 +44,7 @@
 import org.apache.fineract.portfolio.interestratechart.service.InterestRateChartReadPlatformService;
 import org.apache.fineract.portfolio.paymenttype.data.PaymentTypeData;
 import org.apache.fineract.portfolio.paymenttype.service.PaymentTypeReadPlatformService;
-import org.apache.fineract.portfolio.savings.DepositAccountType;
-import org.apache.fineract.portfolio.savings.DepositsApiConstants;
-import org.apache.fineract.portfolio.savings.SavingsCompoundingInterestPeriodType;
-import org.apache.fineract.portfolio.savings.SavingsInterestCalculationDaysInYearType;
-import org.apache.fineract.portfolio.savings.SavingsInterestCalculationType;
-import org.apache.fineract.portfolio.savings.SavingsPostingInterestPeriodType;
+import org.apache.fineract.portfolio.savings.*;
 import org.apache.fineract.portfolio.savings.data.FixedDepositProductData;
 import org.apache.fineract.portfolio.savings.service.DepositProductReadPlatformService;
 import org.apache.fineract.portfolio.savings.service.DepositsDropdownReadPlatformService;
@@ -78,9 +57,19 @@
 import org.springframework.stereotype.Component;
 import org.springframework.util.CollectionUtils;
 
+import javax.ws.rs.*;
+import javax.ws.rs.core.Context;
+import javax.ws.rs.core.MediaType;
+import javax.ws.rs.core.UriInfo;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+
 @Path("/fixeddepositproducts")
 @Component
 @Scope("singleton")
+@Api(value = "Fixed Deposit Product", description = "This is one of the advanced term deposit product offered by MFI's. The Fixed Deposit Products (aka FD) product offerings are modeled using this API.\n" + "\n" + "The FD products are deposit accounts which are held for a fixed term – like 1 year, 2 years etc.\n" + "\n" + "When creating fixed deposit accounts, the details from the fixed deposit product are used to auto fill details of the fixed deposit account application process.")
 public class FixedDepositProductsApiResource {
 
     private final DepositProductReadPlatformService depositProductReadPlatformService;
@@ -135,7 +124,10 @@ public FixedDepositProductsApiResource(final DepositProductReadPlatformService d
     @POST
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String create(final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Create a Fixed Deposit Product", httpMethod = "POST", notes = "Creates a Fixed Deposit Product\n\n" + "Mandatory Fields: name, shortName, description, currencyCode, digitsAfterDecimal,inMultiplesOf, interestCompoundingPeriodType, interestCalculationType, interestCalculationDaysInYearType, minDepositTerm, minDepositTermTypeId, accountingRule\n\n" + "Optional Fields: lockinPeriodFrequency, lockinPeriodFrequencyType, maxDepositTerm, maxDepositTermTypeId, inMultiplesOfDepositTerm, inMultiplesOfDepositTermTypeId, preClosurePenalApplicable, preClosurePenalInterest, preClosurePenalInterestOnTypeId, feeToIncomeAccountMappings, penaltyToIncomeAccountMappings, charges, charts, , withHoldTax, taxGroupId\n\n" + "\n" + "Mandatory Fields for Cash based accounting (accountingRule = 2): savingsReferenceAccountId, savingsControlAccountId, interestOnSavingsAccountId, incomeFromFeeAccountId, transfersInSuspenseAccountId, incomeFromPenaltyAccountId")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = FixedDepositProductsApiResourceSwagger.PostFixedDepositProductsRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = FixedDepositProductsApiResourceSwagger.PostFixedDepositProductsResponse.class)})
+    public String create(@ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().createFixedDepositProduct().withJson(apiRequestBodyAsJson)
                 .build();
@@ -149,7 +141,10 @@ public String create(final String apiRequestBodyAsJson) {
     @Path("{productId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String update(@PathParam("productId") final Long productId, final String apiRequestBodyAsJson) {
+    @ApiOperation(value = "Update a Fixed Deposit Product", httpMethod = "PUT", notes = "Updates a Fixed Deposit Product")
+    @ApiImplicitParams({@ApiImplicitParam(value = "body", required = true, paramType = "body", dataType = "body", format = "body", dataTypeClass = FixedDepositProductsApiResourceSwagger.PutFixedDepositProductsProductIdRequest.class)})
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = FixedDepositProductsApiResourceSwagger.PutFixedDepositProductsProductIdResponse.class)})
+    public String update(@PathParam("productId") @ApiParam(value = "productId") final Long productId, @ApiParam(hidden = true) final String apiRequestBodyAsJson) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().updateFixedDepositProduct(productId)
                 .withJson(apiRequestBodyAsJson).build();
@@ -163,6 +158,8 @@ public String update(@PathParam("productId") final Long productId, final String
     @GET
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
+    @ApiOperation(value = "List Fixed Deposit Products", httpMethod = "GET", notes = "Lists Fixed Deposit Products\n\n" + "Example Requests:\n" + "\n" +"fixeddepositproducts\n" + "\n" + "\n" + "fixeddepositproducts?fields=name")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = FixedDepositProductsApiResourceSwagger.GetFixedDepositProductsResponse.class, responseContainer = "List")})
     public String retrieveAll(@Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(DepositsApiConstants.FIXED_DEPOSIT_PRODUCT_RESOURCE_NAME);
@@ -179,7 +176,9 @@ public String retrieveAll(@Context final UriInfo uriInfo) {
     @Path("{productId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String retrieveOne(@PathParam("productId") final Long productId, @Context final UriInfo uriInfo) {
+    @ApiOperation(value = "Retrieve a Fixed Deposit Product", httpMethod = "GET", notes = "Retrieves a Fixed Deposit Product\n\n" + "Example Requests:\n" + "\n" + "fixeddepositproducts/1\n" + "\n" + "\n" + "fixeddepositproducts/1?template=true\n" + "\n" + "\n" + "fixeddepositproducts/1?fields=name,description")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = FixedDepositProductsApiResourceSwagger.GetFixedDepositProductsProductIdResponse.class)})
+    public String retrieveOne(@PathParam("productId") @ApiParam(value = "productId") final Long productId, @Context final UriInfo uriInfo) {
 
         this.context.authenticatedUser().validateHasReadPermission(DepositsApiConstants.FIXED_DEPOSIT_PRODUCT_RESOURCE_NAME);
 
@@ -319,7 +318,9 @@ private FixedDepositProductData handleTemplateRelatedData(final FixedDepositProd
     @Path("{productId}")
     @Consumes({ MediaType.APPLICATION_JSON })
     @Produces({ MediaType.APPLICATION_JSON })
-    public String delete(@PathParam("productId") final Long productId) {
+    @ApiOperation(value = "Delete a Fixed Deposit Product", httpMethod = "DELETE", notes = "Deletes a Fixed Deposit Product")
+    @ApiResponses({@ApiResponse(code = 200, message = "OK", response = FixedDepositProductsApiResourceSwagger.DeleteFixedDepositProductsProductIdResponse.class)})
+    public String delete(@PathParam("productId") @ApiParam(value = "productId") final Long productId) {
 
         final CommandWrapper commandRequest = new CommandWrapperBuilder().deleteFixedDepositProduct(productId).build();
 
diff --git a/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/api/FixedDepositProductsApiResourceSwagger.java b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/api/FixedDepositProductsApiResourceSwagger.java
new file mode 100644
index 000000000..3b01f7343
--- /dev/null
+++ b/fineract-provider/src/main/java/org/apache/fineract/portfolio/savings/api/FixedDepositProductsApiResourceSwagger.java
@@ -0,0 +1,583 @@
+/**
+ * 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
+ * <p>
+ * http://www.apache.org/licenses/LICENSE-2.0
+ * <p>
+ * 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.portfolio.savings.api;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.time.LocalDate;
+import java.util.Set;
+
+/**
+ * Created by Chirag Gupta on 12/23/17.
+ */
+final class FixedDepositProductsApiResourceSwagger {
+    private FixedDepositProductsApiResourceSwagger() {
+    }
+
+    @ApiModel(value = "PostFixedDepositProductsRequest")
+    public final static class PostFixedDepositProductsRequest {
+        private PostFixedDepositProductsRequest() {
+        }
+
+        final class PostFixedDepositProductsCharts {
+            private PostFixedDepositProductsCharts() {
+            }
+
+            final class PostFixedDepositProductsChartSlabs {
+                private PostFixedDepositProductsChartSlabs() {
+                }
+
+                @ApiModelProperty(example = "from 0 to 90 days")
+                public String description;
+                @ApiModelProperty(example = "1")
+                public Integer periodType;
+                @ApiModelProperty(example = "0")
+                public Integer fromPeriod;
+                @ApiModelProperty(example = "90")
+                public Integer toPeriod;
+                @ApiModelProperty(example = "4.5")
+                public Double annualInterestRate;
+            }
+
+            @ApiModelProperty(example = "01 Jan 2014")
+            public String fromDate;
+            @ApiModelProperty(example = "en")
+            public String locale;
+            @ApiModelProperty(example = "dd MMMM yyyy")
+            public String dateFormat;
+            public Set<PostFixedDepositProductsChartSlabs> chartSlabs;
+        }
+
+        @ApiModelProperty(example = "Fixed deposit product")
+        public String name;
+        @ApiModelProperty(example = "FD01")
+        public String shortName;
+        @ApiModelProperty(example = "Daily compounding using Daily Balance, 5% per year, 365 days in year")
+        public String description;
+        @ApiModelProperty(example = "USD")
+        public String currencyCode;
+        @ApiModelProperty(example = "2")
+        public Integer digitsAfterDecimal;
+        @ApiModelProperty(example = "0")
+        public Integer inMultiplesOf;
+        @ApiModelProperty(example = "en")
+        public String locale;
+        @ApiModelProperty(example = "1")
+        public Integer interestCompoundingPeriodType;
+        @ApiModelProperty(example = "4")
+        public Integer interestPostingPeriodType;
+        @ApiModelProperty(example = "1")
+        public Integer interestCalculationType;
+        @ApiModelProperty(example = "365")
+        public Integer interestCalculationDaysInYearType;
+        @ApiModelProperty(example = "1")
+        public Integer accountingRule;
+        @ApiModelProperty(example = "true")
+        public Boolean preClosurePenalApplicable;
+        @ApiModelProperty(example = "1.75")
+        public Double preClosurePenalInterest;
+        @ApiModelProperty(example = "1")
+        public Integer preClosurePenalInterestOnTypeId;
+        @ApiModelProperty(example = "1")
+        public Integer minDepositTerm;
+        @ApiModelProperty(example = "1")
+        public Integer minDepositTermTypeId;
+        @ApiModelProperty(example = "5")
+        public Integer maxDepositTerm;
+        @ApiModelProperty(example = "3")
+        public Integer maxDepositTermTypeId;
+        public Set<PostFixedDepositProductsCharts> charts;
+    }
+
+    @ApiModel(value = "PostFixedDepositProductsResponse")
+    public final static class PostFixedDepositProductsResponse {
+        private PostFixedDepositProductsResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer resourceId;
+    }
+
+    @ApiModel(value = "PutFixedDepositProductsProductIdRequest")
+    public final static class PutFixedDepositProductsProductIdRequest {
+        private PutFixedDepositProductsProductIdRequest() {
+        }
+
+        @ApiModelProperty(example = "Fixed deposit product new offerings")
+        public String description;
+        @ApiModelProperty(example = "en")
+        public String locale;
+        @ApiModelProperty(example = "5")
+        public Integer minDepositTerm;
+        @ApiModelProperty(example = "1")
+        public Integer minDepositTermTypeId;
+    }
+
+    @ApiModel(value = "PutFixedDepositProductsProductIdResponse")
+    public final static class PutFixedDepositProductsProductIdResponse {
+        private PutFixedDepositProductsProductIdResponse() {
+        }
+
+        final class PutFixedDepositProductsChanges {
+            private PutFixedDepositProductsChanges() {
+            }
+
+            @ApiModelProperty(example = "Fixed deposit product new offerings")
+            public String description;
+            @ApiModelProperty(example = "5")
+            public Integer minDepositTerm;
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer resourceId;
+        public PutFixedDepositProductsChanges changes;
+    }
+
+    @ApiModel(value = "GetFixedDepositProductsResponse")
+    public final static class GetFixedDepositProductsResponse {
+        private GetFixedDepositProductsResponse() {
+        }
+
+        final class GetFixedDepositProductsCurrency {
+            private GetFixedDepositProductsCurrency() {
+            }
+
+            @ApiModelProperty(example = "USD")
+            public String code;
+            @ApiModelProperty(example = "US Dollar")
+            public String name;
+            @ApiModelProperty(example = "2")
+            public Integer decimalPlaces;
+            @ApiModelProperty(example = "1")
+            public Integer inMultiplesOf;
+            @ApiModelProperty(example = "$")
+            public String displaySymbol;
+            @ApiModelProperty(example = "currency.USD")
+            public String nameCode;
+            @ApiModelProperty(example = "US Dollar ($)")
+            public String displayLabel;
+        }
+
+        final class GetFixedDepositProductsMinDepositTermType {
+            private GetFixedDepositProductsMinDepositTermType() {
+            }
+
+            @ApiModelProperty(example = "2")
+            public Integer id;
+            @ApiModelProperty(example = "deposit.term.savingsPeriodFrequencyType.months")
+            public String code;
+            @ApiModelProperty(example = "Months")
+            public String value;
+        }
+
+        final class GetFixedDepositProductsMaxDepositTermType {
+            private GetFixedDepositProductsMaxDepositTermType() {
+            }
+
+            @ApiModelProperty(example = "3")
+            public Integer id;
+            @ApiModelProperty(example = "deposit.term.savingsPeriodFrequencyType.years")
+            public String code;
+            @ApiModelProperty(example = "Years")
+            public String value;
+        }
+
+        final class GetFixedDepositProductsInterestCompoundingPeriodType {
+            private GetFixedDepositProductsInterestCompoundingPeriodType() {
+            }
+
+            @ApiModelProperty(example = "4")
+            public Integer id;
+            @ApiModelProperty(example = "savings.interest.period.savingsCompoundingInterestPeriodType.monthly")
+            public String code;
+            @ApiModelProperty(example = "Monthly")
+            public String value;
+        }
+
+        final class GetFixedDepositProductsInterestPostingPeriodType {
+            private GetFixedDepositProductsInterestPostingPeriodType() {
+            }
+
+            @ApiModelProperty(example = "4")
+            public Integer id;
+            @ApiModelProperty(example = "savings.interest.posting.period.savingsPostingInterestPeriodType.monthly")
+            public String code;
+            @ApiModelProperty(example = "Monthly")
+            public String value;
+        }
+
+        final class GetFixedDepositProductsInterestCalculationType {
+            private GetFixedDepositProductsInterestCalculationType() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "savingsInterestCalculationType.dailybalance")
+            public String code;
+            @ApiModelProperty(example = "Daily Balance")
+            public String value;
+        }
+
+        final class GetFixedDepositProductsInterestCalculationDaysInYearType {
+            private GetFixedDepositProductsInterestCalculationDaysInYearType() {
+            }
+
+            @ApiModelProperty(example = "365")
+            public Integer id;
+            @ApiModelProperty(example = "savingsInterestCalculationDaysInYearType.days365")
+            public String code;
+            @ApiModelProperty(example = "365 Days")
+            public String value;
+        }
+
+        final class GetFixedDepositProductsAccountingRule {
+            private GetFixedDepositProductsAccountingRule() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "accountingRuleType.none")
+            public String code;
+            @ApiModelProperty(example = "NONE")
+            public String value;
+        }
+
+        @ApiModelProperty(example = "3")
+        public Integer id;
+        @ApiModelProperty(example = "FD01")
+        public String name;
+        @ApiModelProperty(example = "FD01")
+        public String shortName;
+        @ApiModelProperty(example = "FD01")
+        public String description;
+        public GetFixedDepositProductsCurrency currency;
+        @ApiModelProperty(example = "false")
+        public Boolean preClosurePenalApplicable;
+        @ApiModelProperty(example = "3")
+        public Integer minDepositTerm;
+        @ApiModelProperty(example = "4")
+        public Integer maxDepositTerm;
+        public GetFixedDepositProductsMinDepositTermType minDepositTermType;
+        public GetFixedDepositProductsMaxDepositTermType maxDepositTermType;
+        @ApiModelProperty(example = "0")
+        public Double nominalAnnualInterestRate;
+        public GetFixedDepositProductsInterestCompoundingPeriodType interestCompoundingPeriodType;
+        public GetFixedDepositProductsInterestPostingPeriodType interestPostingPeriodType;
+        public GetFixedDepositProductsInterestCalculationType interestCalculationType;
+        public GetFixedDepositProductsInterestCalculationDaysInYearType interestCalculationDaysInYearType;
+        public GetFixedDepositProductsAccountingRule accountingRule;
+    }
+
+    @ApiModel(value = "GetFixedDepositProductsProductIdResponse")
+    public final static class GetFixedDepositProductsProductIdResponse {
+        private GetFixedDepositProductsProductIdResponse() {
+        }
+
+        final class GetFixedDepositProductsProductIdCurrency {
+            private GetFixedDepositProductsProductIdCurrency() {
+            }
+
+            @ApiModelProperty(example = "USD")
+            public String code;
+            @ApiModelProperty(example = "US Dollar")
+            public String name;
+            @ApiModelProperty(example = "2")
+            public Integer decimalPlaces;
+            @ApiModelProperty(example = "$")
+            public String displaySymbol;
+            @ApiModelProperty(example = "currency.USD")
+            public String nameCode;
+            @ApiModelProperty(example = "US Dollar ($)")
+            public String displayLabel;
+        }
+
+        final class GetFixedDepositProductsProductIdInterestCompoundingPeriodType {
+            private GetFixedDepositProductsProductIdInterestCompoundingPeriodType() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "savings.interest.period.savingsCompoundingInterestPeriodType.daily")
+            public String code;
+            @ApiModelProperty(example = "Daily")
+            public String value;
+        }
+
+        final class GetFixedDepositProductsProductIdAccountingMappings {
+            private GetFixedDepositProductsProductIdAccountingMappings() {
+            }
+
+            final class GetFixedDepositProductsProductIdSavingsReferenceAccount {
+                private GetFixedDepositProductsProductIdSavingsReferenceAccount() {
+                }
+
+                @ApiModelProperty(example = "12")
+                public Integer id;
+                @ApiModelProperty(example = "savings ref")
+                public String name;
+                @ApiModelProperty(example = "20")
+                public Integer glCode;
+            }
+
+            final class GetFixedDepositProductsProductIdIncomeFromFeeAccount {
+                private GetFixedDepositProductsProductIdIncomeFromFeeAccount() {
+                }
+
+                @ApiModelProperty(example = "16")
+                public Integer id;
+                @ApiModelProperty(example = "income from savings fee")
+                public String name;
+                @ApiModelProperty(example = "24")
+                public Integer glCode;
+            }
+
+            final class GetFixedDepositProductsProductIdIncomeFromPenaltyAccount {
+                private GetFixedDepositProductsProductIdIncomeFromPenaltyAccount() {
+                }
+
+                @ApiModelProperty(example = "17")
+                public Integer id;
+                @ApiModelProperty(example = "income from sav penalties")
+                public String name;
+                @ApiModelProperty(example = "25")
+                public Integer glCode;
+            }
+
+            final class GetFixedDepositProductsProductIdInterestOnSavingsAccount {
+                private GetFixedDepositProductsProductIdInterestOnSavingsAccount() {
+                }
+
+                @ApiModelProperty(example = "15")
+                public Integer id;
+                @ApiModelProperty(example = "interest on savings")
+                public String name;
+                @ApiModelProperty(example = "23")
+                public Integer glCode;
+            }
+
+            final class GetFixedDepositProductsProductIdSavingsControlAccount {
+                private GetFixedDepositProductsProductIdSavingsControlAccount() {
+                }
+
+                @ApiModelProperty(example = "13")
+                public Integer id;
+                @ApiModelProperty(example = "savings ref tool kit")
+                public String name;
+                @ApiModelProperty(example = "21")
+                public Integer glCode;
+            }
+
+            final class GetFixedDepositProductsProductIdTransfersInSuspenseAccount {
+                private GetFixedDepositProductsProductIdTransfersInSuspenseAccount() {
+                }
+
+                @ApiModelProperty(example = "14")
+                public Integer id;
+                @ApiModelProperty(example = "saving transfers")
+                public String name;
+                @ApiModelProperty(example = "22")
+                public Integer glCode;
+            }
+
+            public GetFixedDepositProductsProductIdSavingsReferenceAccount savingsReferenceAccount;
+            public GetFixedDepositProductsProductIdIncomeFromFeeAccount incomeFromFeeAccount;
+            public GetFixedDepositProductsProductIdIncomeFromPenaltyAccount incomeFromPenaltyAccount;
+            public GetFixedDepositProductsProductIdInterestOnSavingsAccount interestOnSavingsAccount;
+            public GetFixedDepositProductsProductIdSavingsControlAccount savingsControlAccount;
+            public GetFixedDepositProductsProductIdTransfersInSuspenseAccount transfersInSuspenseAccount;
+        }
+
+        final class GetFixedDepositProductsProductIdFeeToIncomeAccountMappings {
+            private GetFixedDepositProductsProductIdFeeToIncomeAccountMappings() {
+            }
+
+            final class GetFixedDepositProductsProductIdFeeToIncomeAccountMappingsCharge {
+                private GetFixedDepositProductsProductIdFeeToIncomeAccountMappingsCharge() {
+                }
+
+                @ApiModelProperty(example = "11")
+                public Integer id;
+                @ApiModelProperty(example = "sav charge")
+                public String name;
+                @ApiModelProperty(example = "false")
+                public Boolean active;
+                @ApiModelProperty(example = "false")
+                public Boolean penalty;
+            }
+
+            final class GetFixedDepositProductsProductIdFeeToIncomeAccountMappingsIncomeAccount {
+                private GetFixedDepositProductsProductIdFeeToIncomeAccountMappingsIncomeAccount() {
+                }
+
+                @ApiModelProperty(example = "16")
+                public Integer id;
+                @ApiModelProperty(example = "income from savings fee")
+                public String name;
+                @ApiModelProperty(example = "24")
+                public Integer glCode;
+            }
+
+            public GetFixedDepositProductsProductIdFeeToIncomeAccountMappingsCharge charge;
+            public GetFixedDepositProductsProductIdFeeToIncomeAccountMappingsIncomeAccount incomeAccount;
+        }
+
+        final class GetFixedDepositProductsProductIdPenaltyToIncomeAccountMappings {
+            private GetFixedDepositProductsProductIdPenaltyToIncomeAccountMappings() {
+            }
+
+            final class GetFixedDepositProductsProductIdPenaltyToIncomeAccountMappingsCharge {
+                private GetFixedDepositProductsProductIdPenaltyToIncomeAccountMappingsCharge() {
+                }
+
+                @ApiModelProperty(example = "12")
+                public Integer id;
+                @ApiModelProperty(example = "sav 2")
+                public String name;
+                @ApiModelProperty(example = "false")
+                public Boolean active;
+                @ApiModelProperty(example = "true")
+                public Boolean penalty;
+            }
+
+            public GetFixedDepositProductsProductIdPenaltyToIncomeAccountMappingsCharge charge;
+            public GetFixedDepositProductsProductIdAccountingMappings.GetFixedDepositProductsProductIdIncomeFromPenaltyAccount incomeAccount;
+        }
+
+        final class GetFixedDepositProductsProductIdPreClosurePenalInterestOnType {
+            private GetFixedDepositProductsProductIdPreClosurePenalInterestOnType() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "preClosurePenalInterestOnType.wholeTerm")
+            public String code;
+            @ApiModelProperty(example = "Whole term")
+            public String value;
+        }
+
+        final class GetFixedDepositProductsProductIdMinDepositTermType {
+            private GetFixedDepositProductsProductIdMinDepositTermType() {
+            }
+
+            @ApiModelProperty(example = "1")
+            public Integer id;
+            @ApiModelProperty(example = "deposit.term.savingsPeriodFrequencyType.weeks")
+            public String code;
+            @ApiModelProperty(example = "Weeks")
+            public String value;
+        }
+
+        final class GetFixedDepositProductsProductIdMaxDepositTermType {
+            private GetFixedDepositProductsProductIdMaxDepositTermType() {
+            }
+
+            @ApiModelProperty(example = "3")
+            public Integer id;
+            @ApiModelProperty(example = "deposit.term.savingsPeriodFrequencyType.years")
+            public String code;
+            @ApiModelProperty(example = "Years")
+            public String value;
+        }
+
+        final class GetFixedDepositProductsProductIdActiveChart {
+            private GetFixedDepositProductsProductIdActiveChart() {
+            }
+
+            final class GetFixedDepositProductsProductIdChartSlabs {
+                private GetFixedDepositProductsProductIdChartSlabs() {
+                }
+
+                final class GetFixedDepositProductsProductIdPeriodType {
+                    private GetFixedDepositProductsProductIdPeriodType() {
+                    }
+
+                    @ApiModelProperty(example = "1")
+                    public Integer id;
+                    @ApiModelProperty(example = "interestChartPeriodType.weeks")
+                    public String code;
+                    @ApiModelProperty(example = "Weeks")
+                    public String value;
+                }
+
+                @ApiModelProperty(example = "18")
+                public Integer id;
+                @ApiModelProperty(example = "from 0 to 90 days")
+                public String description;
+                public GetFixedDepositProductsProductIdPeriodType periodType;
+                @ApiModelProperty(example = "0")
+                public Integer fromPeriod;
+                @ApiModelProperty(example = "90")
+                public Integer toPeriod;
+                @ApiModelProperty(example = "4.5")
+                public Double annualInterestRate;
+                public GetFixedDepositProductsProductIdCurrency currency;
+            }
+
+            @ApiModelProperty(example = "8")
+            public Integer id;
+            @ApiModelProperty(example = "[2014, 1, 1]")
+            public LocalDate fromDate;
+            @ApiModelProperty(example = "8")
+            public Integer savingsProductId;
+            @ApiModelProperty(example = "Fixed deposit product")
+            public String savingsProductName;
+            public Set<GetFixedDepositProductsProductIdChartSlabs> chartSlabs;
+            public Set<GetFixedDepositProductsProductIdChartSlabs.GetFixedDepositProductsProductIdPeriodType> periodTypes;
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer id;
+        @ApiModelProperty(example = "Fixed deposit product")
+        public String name;
+        @ApiModelProperty(example = "FD01")
+        public String shortName;
+        @ApiModelProperty(example = "Daily compounding using Daily Balance, 5% per year, 365 days in year")
+        public String description;
+        public GetFixedDepositProductsProductIdCurrency currency;
+        public GetFixedDepositProductsProductIdInterestCompoundingPeriodType interestCompoundingPeriodType;
+        public GetFixedDepositProductsResponse.GetFixedDepositProductsInterestPostingPeriodType interestPostingPeriodType;
+        public GetFixedDepositProductsResponse.GetFixedDepositProductsInterestCalculationType interestCalculationType;
+        public GetFixedDepositProductsResponse.GetFixedDepositProductsInterestCalculationDaysInYearType interestCalculationDaysInYearType;
+        public GetFixedDepositProductsProductIdAccountingMappings accountingMappings;
+        public Set<GetFixedDepositProductsProductIdFeeToIncomeAccountMappings> feeToIncomeAccountMappings;
+        public Set<GetFixedDepositProductsProductIdPenaltyToIncomeAccountMappings> penaltyToIncomeAccountMappings;
+        @ApiModelProperty(example = "true")
+        public Boolean preClosurePenalApplicable;
+        @ApiModelProperty(example = "1.75")
+        public Double preClosurePenalInterest;
+        public GetFixedDepositProductsProductIdPreClosurePenalInterestOnType preClosurePenalInterestOnType;
+        @ApiModelProperty(example = "1")
+        public Integer minDepositTerm;
+        public GetFixedDepositProductsProductIdMinDepositTermType minDepositTermType;
+        @ApiModelProperty(example = "5")
+        public Integer maxDepositTerm;
+        public GetFixedDepositProductsProductIdMaxDepositTermType maxDepositTermType;
+        public GetFixedDepositProductsProductIdActiveChart activeChart;
+    }
+
+    @ApiModel(value = "DeleteFixedDepositProductsProductIdResponse")
+    public final static class DeleteFixedDepositProductsProductIdResponse {
+        private DeleteFixedDepositProductsProductIdResponse() {
+        }
+
+        @ApiModelProperty(example = "1")
+        public Integer resourceId;
+    }
+}

  (This diff was longer than 20,000 lines, and has been truncated...)


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services