diff --git a/react-components/oodt_opsui_sample_app/src/App.js b/react-components/oodt_opsui_sample_app/src/App.js
index 2e34f02..0522ea9 100644
--- a/react-components/oodt_opsui_sample_app/src/App.js
+++ b/react-components/oodt_opsui_sample_app/src/App.js
@@ -12,6 +12,7 @@
       <BrowserRouter>
         <SnackbarProvider
           maxSnack={3}
+          autoHideDuration={3000}
           anchorOrigin={{
             vertical: "top",
             horizontal: "center",
diff --git a/react-components/oodt_opsui_sample_app/src/components/fileManager/Product/Product.js b/react-components/oodt_opsui_sample_app/src/components/fileManager/Product/Product.js
index 8b52ddf..3e62d6b 100644
--- a/react-components/oodt_opsui_sample_app/src/components/fileManager/Product/Product.js
+++ b/react-components/oodt_opsui_sample_app/src/components/fileManager/Product/Product.js
@@ -70,7 +70,6 @@
 class Product extends Component {
   constructor(props) {
     super(props);
-    this.snackBarRef = React.createRef();
     this.loadProduct = this.loadProduct.bind(this);
     this.removeProduct = this.removeProduct.bind(this);
   }
@@ -95,21 +94,21 @@
   }
 
   removeProduct() {
-    let result = window.confirm("Are you Sure to Remove the Product " +this.state.selectedProductId + "?")
+    let result = window.confirm("Are you Sure to Remove the Product " +this.props.productId + "?")
     if (result) {
       fmservice
-        .removeProductById(this.state.selectedProductId)
+        .removeProductById(this.props.productId)
         .then((isDeleted) => {
-          this.props.enqueueSnackbar("Sucessfully removed productID: " + this.state.selectedProductId,{
+          this.props.enqueueSnackbar("Sucessfully removed productID: " + this.props.productId,{
             variant: "success"
           })
-          this.props.history.push("/product")
           this.setState({
-            selectedProductId: "",
             productData: {},
             productMetaData: {},
             productRefData: {},
           });
+          this.props.onClose()
+          this.props.history.push("/products")
         })
         .catch((err) => {
           console.error(err);
diff --git a/react-components/oodt_opsui_sample_app/src/components/fileManager/ProductList/ProductList.js b/react-components/oodt_opsui_sample_app/src/components/fileManager/ProductList/ProductList.js
index a45e26b..599ec4c 100644
--- a/react-components/oodt_opsui_sample_app/src/components/fileManager/ProductList/ProductList.js
+++ b/react-components/oodt_opsui_sample_app/src/components/fileManager/ProductList/ProductList.js
@@ -104,6 +104,7 @@
     totalProductCount: 0,
     productTypeArray: [],
     isQueryTimedOut: true,
+    noProductsText: "Loading..."
   };
 
   componentDidMount() {
@@ -121,14 +122,18 @@
 
   onProductDrawerClose = () => {
     this.props.history.push("/products")
+    this.loadNextProducts()
   }
 
-  // TODO
   onProductSearch = (productName) => {
     fmservice.getProductPage({
       productName: productName
     }).then(productPage => {
         let productsArr = productPage.products.product
+        if (typeof(productsArr) === "undefined"){
+          this.setState({noProductsText: "No products"})
+          return;
+        }
         if (!Array.isArray(productsArr)) {
           productsArr = [productsArr]
         }
@@ -164,6 +169,10 @@
         // and returns an array of products when the object count is more than 1.
         // This check converts object to array to avoid this problem
         // Need to fix this in the backend
+        if (typeof(productsArr) === "undefined"){
+          this.setState({noProductsText: "No products"})
+          return;
+        }
         if (!Array.isArray(productsArr)) {
           productsArr = [productsArr]
         }
@@ -239,7 +248,7 @@
                    <TableCell></TableCell>
                    <TableCell>
                    <div className={classes.progress}>
-                    <CircularProgress />
+                   <p>{this.state.noProductsText}</p>
                   </div>
                    </TableCell>
                    <TableCell></TableCell>
@@ -262,7 +271,7 @@
                 count={this.state.totalProductCount}
                 page={this.state.currentProductPage}
                 onChangePage={this.handleChangePage}
-                rowsPerPage={this.state.productDetailsArray.length}
+                rowsPerPage={20}
                 rowsPerPageOptions={[]}
               />
             </Grid>
diff --git a/react-components/oodt_opsui_sample_app/src/components/workflowManager/NewWorkflow/NewWorkflow.js b/react-components/oodt_opsui_sample_app/src/components/workflowManager/NewWorkflow/NewWorkflow.js
new file mode 100644
index 0000000..7b06dd6
--- /dev/null
+++ b/react-components/oodt_opsui_sample_app/src/components/workflowManager/NewWorkflow/NewWorkflow.js
@@ -0,0 +1,125 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import React, { Component } from "react";
+import {
+  MenuItem,
+  InputLabel,
+  Button,
+  FormControl,
+  withStyles,
+  Select,
+} from "@material-ui/core";
+import * as wmservice from "services/wmservice";
+import {withSnackbar} from "notistack"
+
+const styles = (theme) => ({
+  root: {
+    paddingBottom: "2%",
+    paddingTop: "1%",
+    minHeight: "10vh",
+    display: "flex",
+    alignItems: "center",
+  },
+  formControl: {
+    minWidth: "30%",
+  },
+  selectEmpty: {
+    marginTop: theme.spacing(2),
+  },
+  button: {
+    marginLeft: theme.spacing(1),
+    padding: theme.spacing(1),
+  },
+});
+
+class NewWorkflow extends Component {
+  state = {
+    selectedEvent: "",
+    workflowEvents: [],
+    isSubmitted: false,
+  };
+
+  componentDidMount() {
+    wmservice
+      .getRegisteredEvents()
+      .then((eventsArr) => {
+        this.setState({
+          selectedEvent: eventsArr[0],
+          workflowEvents: eventsArr || [],
+        });
+      })
+      .catch((err) => console.error(err));
+  }
+
+  handleEventChange = (e) => {
+    this.setState({ selectedEvent: e.target.value });
+  };
+
+  triggerWorkflow = () => {
+    this.setState({isSubmitted: true})
+    wmservice
+      .handleEvent(this.state.selectedEvent)
+      .then((isOk) => {
+        this.setState({isSubmitted: false})
+        this.props.enqueueSnackbar("Event " + this.state.selectedEvent +" triggered successfully",{
+          variant: "success"
+        })
+        this.setState({isSubmitted: false})
+      })
+      .catch((err) => {
+        console.error(err)
+        this.props.enqueueSnackbar("Error occured when triggering event "+this.state.selectedEvent,{
+          variant: "error"
+        })
+        this.setState({isSubmitted: false})
+      });
+  };
+
+  render() {
+    const { classes } = this.props;
+
+    return (
+      <div className={classes.root}>
+        <FormControl variant="outlined" className={classes.formControl}>
+          <InputLabel>Event name</InputLabel>
+          <Select
+            value={this.state.selectedEvent}
+            onChange={this.handleEventChange}
+            label="Workflow event"
+          >
+            {this.state.workflowEvents.map((event) => {
+              return <MenuItem value={event}>{event}</MenuItem>;
+            })}
+          </Select>
+        </FormControl>
+
+        <Button
+          variant="contained"
+          onClick={this.triggerWorkflow}
+          color="primary"
+          disabled={this.state.isSubmitted}
+          className={classes.button}
+        >
+          Trigger workflow
+        </Button>
+      </div>
+    );
+  }
+}
+
+export default withStyles(styles)(withSnackbar(NewWorkflow));
\ No newline at end of file
diff --git a/react-components/oodt_opsui_sample_app/src/components/workflowManager/NewWorkflow/index.js b/react-components/oodt_opsui_sample_app/src/components/workflowManager/NewWorkflow/index.js
new file mode 100644
index 0000000..5c85fba
--- /dev/null
+++ b/react-components/oodt_opsui_sample_app/src/components/workflowManager/NewWorkflow/index.js
@@ -0,0 +1,21 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+// Import the WorkflowList component from this folder and send it down to ./components/index.js
+import NewWorkflow from "./NewWorkflow";
+
+export {NewWorkflow};
\ No newline at end of file
diff --git a/react-components/oodt_opsui_sample_app/src/components/workflowManager/WorkflowList/WorkflowList.js b/react-components/oodt_opsui_sample_app/src/components/workflowManager/WorkflowList/WorkflowList.js
index 49af77a..5b1dd2f 100644
--- a/react-components/oodt_opsui_sample_app/src/components/workflowManager/WorkflowList/WorkflowList.js
+++ b/react-components/oodt_opsui_sample_app/src/components/workflowManager/WorkflowList/WorkflowList.js
@@ -16,7 +16,7 @@
  */
 
 import React, { Component } from "react";
-import { Button, withStyles } from "@material-ui/core";
+import { Button, withStyles, TablePagination, Typography, Grid } from "@material-ui/core";
 import Table from "@material-ui/core/Table";
 import TableBody from "@material-ui/core/TableBody";
 import TableCell from "@material-ui/core/TableCell";
@@ -24,14 +24,15 @@
 import TableRow from "@material-ui/core/TableRow";
 import Paper from "@material-ui/core/Paper";
 import PropTypes from "prop-types";
-import { wmconnection } from "constants/connection";
+import * as wmservice from "services/wmservice"
+import {NewWorkflow} from "components/workflowManager/NewWorkflow"
 import CircularProgress from "@material-ui/core/CircularProgress";
 
 const styles = theme => ({
   root: {
     width: "100%",
     marginTop: 0,
-    overflowX: "auto"
+    padding: 20
   },
   table: {
     minWidth: 650
@@ -40,98 +41,94 @@
     margin: 2
   },
   loading: {
-    textAlign: "center",
-    display: "block",
-    position: "relative"
+    display: "flex",
+    width: "100%",
+    justifyContent: "center"
   }
 });
 
 class WorkflowList extends Component {
-  constructor(props) {
-    super(props);
-    this.updateWorkflowStatus = this.updateWorkflowStatus.bind(this);
-    this.reloadWorkflow = this.reloadWorkflow.bind(this);
+  state = {
+    rows: [],
+    currentPage: 1,
+    totalPages: 0,
+    totalCount: 0,
+    workflowState: [],
+    noWorkflowsText: "Loading..."
+  };
+
+  componentDidMount() {
+    this.loadNextWorkflows()
   }
 
-  componentWillMount() {
-    wmconnection
-      .get("/workflow/firstpage")
-      .then(result => {
+  loadNextWorkflows = () => {
+    wmservice.getWorkflowList(this.state.currentPage).then(
+      workflowData => {
+        let workflowArr = workflowData.pageWorkflows
+        if (typeof(workflowArr) === "undefined"){
+          this.setState({noWorkflowsText: "No workflows found"})
+          return;
+        }
+        // Backend returns a product object when the object count is 1
+        // and returns an array of products when the object count is more than 1.
+        // This check converts object to array to avoid this problem
+        // Need to fix this in the backend
+        if (!Array.isArray(workflowArr)) {
+          workflowArr = [workflowArr]
+        }
         this.setState({
-          rows: result.data.workflowPageInstance.pageWorkflows
-        });
-        // console.log(this.state.rows)
-        console.log(this.state.rows[0].sharedContext.keyval[0].val);
-      })
-      .catch(error => {
-        console.log(error);
-      });
+          rows: workflowArr || [],
+          totalPages: workflowData.totalPages,
+          totalCount: workflowData.totalCount
+        })
+      }
+    ).catch(err => {
+      console.error(err)
+    })
   }
 
-  updateWorkflowStatus(workflowInstanceId, state) {
-    let result = window.confirm(
-      "Are you sure to change workflow " +
-        workflowInstanceId +
-        " state to " +
-        state
-    );
-    if (result) {
-      wmconnection
-        .post(
-          "/updatestatus/workflow?workflowInstanceId=" +
-            workflowInstanceId +
-            "&status=" +
-            state
-        )
-        .then(result => {
-          console.log("Success");
-          this.reloadWorkflow();
+  updateWorkflowStatus = (workflowInstanceId, state) => {
+    let result = window.confirm("Are you sure to change workflow " + workflowInstanceId + " state to " + state);
+    if(result){
+      wmservice.updateWorkflowStatus(workflowInstanceId, state)
+      .then((result) => {
+        wmservice.getWorkflowList().then(
+          workflows => {
+            this.setState({rows: workflows})
+          }
+        ).catch(err => {
+          console.error(err)
         })
-        .catch(error => {
-          console.log(error);
-        });
-    } else {
+      })
+      .catch((err) => console.error(err));
     }
   }
 
-  reloadWorkflow() {
-    wmconnection
-      .get("/workflow/firstpage")
-      .then(result => {
-        this.setState({
-          rows: result.data.workflowPageInstance.pageWorkflows
-        });
-        // console.log(this.state.rows)
-        console.log(this.state.rows[0].sharedContext.keyval[0].val);
-      })
-      .catch(error => {
-        console.log(error);
-      });
+  handleChangePage = (event,newPageNo) => {
+    this.setState({currentPage: newPageNo+1},() => this.loadNextWorkflows())
   }
 
-  state = {
-    rows: [],
-    workflowState: []
-  };
-
   render() {
     const { classes } = this.props;
     return (
       <Paper className={classes.root}>
+        <Typography variant="h6">New workflow</Typography>
+        <NewWorkflow />
+        
+        <Typography variant="h6">Past workflows</Typography>
         <Table className={classes.table}>
           <TableHead>
             <TableRow>
-              <TableCell>Workflow Instance Id</TableCell>
-              <TableCell align="center">Workflow Name</TableCell>
-              <TableCell align="center">Task Id</TableCell>
-              <TableCell align="center">Workflow State</TableCell>
-              <TableCell align="center">Actions</TableCell>
+              <TableCell><strong>Workflow Instance Id</strong></TableCell>
+              <TableCell align="center"><strong>Workflow Name</strong></TableCell>
+              <TableCell align="center"><strong>Task Id</strong></TableCell>
+              <TableCell align="center"><strong>Workflow State</strong></TableCell>
+              <TableCell align="center"><strong>Actions</strong></TableCell>
             </TableRow>
           </TableHead>
 
-          {this.state.rows.length > 0 && (
             <TableBody>
-              {this.state.rows.map(row => (
+              {this.state.rows.length > 0 && this.state.rows.map(row => (
                 <TableRow key={row.workflowInstanceId}>
                   <TableCell component="th" scope="row">
                     {row.workflowInstanceId}
@@ -189,13 +186,30 @@
                 </TableRow>
               ))}
             </TableBody>
-          )}
-          {this.state.rows.length === 0 && (
-            <TableBody className={classes.loading}>
-              <CircularProgress className={classes.progress} />
-            </TableBody>
-          )}
         </Table>
+        {this.state.rows.length === 0 && (
+                <div className={classes.loading}>
+                  <CircularProgress className={classes.progress} />
+                </div>                  
+          )}
+                  <Grid
+            style={{ width: "100%" }}
+            container
+            spacing={1}
+            direction="column"
+            alignItems="center"
+          >
+            <Grid item>
+              <TablePagination
+                component="div"
+                count={this.state.totalCount }
+                page={this.state.currentPage - 1}
+                onChangePage={this.handleChangePage}
+                rowsPerPage={20}
+                rowsPerPageOptions={[]}
+              />
+            </Grid>
+          </Grid>
       </Paper>
     );
   }
diff --git a/react-components/oodt_opsui_sample_app/src/services/wmservice.js b/react-components/oodt_opsui_sample_app/src/services/wmservice.js
new file mode 100644
index 0000000..a3a66c4
--- /dev/null
+++ b/react-components/oodt_opsui_sample_app/src/services/wmservice.js
@@ -0,0 +1,66 @@
+import { wmconnection } from "constants/connection";
+
+export const updateWorkflowStatus = (workflowInstanceId, state) => {
+  return new Promise((resolve, reject) => {
+    wmconnection
+      .post(
+        "/workflow/updatestatus?workflowInstanceId=" +
+          workflowInstanceId +
+          "&status=" +
+          state
+      )
+      .then((result) => {
+        resolve(result);
+      })
+      .catch((error) => {
+        reject(error);
+      });
+  });
+};
+
+export const getWorkflowList = (pageNo) => {
+  return new Promise((resolve, reject) => {
+    wmconnection
+      .get("/workflow/page",{
+        params: {
+          workflowPage: pageNo
+        }
+      })
+      .then((result) => {
+        resolve(result.data.workflowPageInstance);
+      })
+      .catch((error) => {
+        reject(error);
+      });
+  });
+};
+
+export const getRegisteredEvents = () => {
+  return new Promise((resolve, reject) => {
+    wmconnection
+      .get("/workflow/events")
+      .then((result) => {
+        resolve(result.data.workflowEvents.events);
+      })
+      .catch((error) => {
+        reject(error);
+      });
+  });
+}
+
+export const handleEvent = (eventName) => {
+  return new Promise((resolve, reject) => {
+    wmconnection
+      .post("/workflow/event",null,{
+        params: {
+          eventName: eventName
+        }
+      })
+      .then((result) => {
+        resolve(result);
+      })
+      .catch((error) => {
+        reject(error);
+      });
+  });
+}
\ No newline at end of file
diff --git a/react-components/swagger-implementations/workflow_manager.yaml b/react-components/swagger-implementations/workflow_manager.yaml
index 4f7c1b1..2c0345b 100644
--- a/react-components/swagger-implementations/workflow_manager.yaml
+++ b/react-components/swagger-implementations/workflow_manager.yaml
@@ -76,6 +76,65 @@
         404:
           description: workflows not Found
 
+  /workflow/page:
+    get:
+      tags:
+        - Workflows
+      summary: get workflow instance page
+      description: Retrieve the specified page of running/finished/paused Workflow Instances
+      operationId: findWorkflows
+      produces:
+        - application/json
+        - application/xml
+      parameters:
+        - in: query
+          name: workflowPage
+          schema:
+            type: integer
+          description: The page number of the desired workflow list page
+      responses:
+        200:
+          description: successful operation
+        404:
+          description: workflows not Found
+
+  /workflow/event:
+    post:
+      tags:
+        - Workflows
+      summary: Trigger workflow by event
+      description: Trigger the tasks in a configured workflow by a registered event 
+      operationId: triggerEvent
+      produces:
+        - application/json
+        - application/xml
+      parameters:
+        - in: query
+          name: eventName
+          schema:
+            type: string
+          description: The workflow event name to trigger workflow
+      responses:
+        200:
+          description: successful operation
+        404:
+          description: Error triggering the event
+
+  /workflow/events:
+    get:
+      tags:
+        - Workflows
+      summary: get events
+      description: Get all registered workflow events
+      operationId: findAllEvents
+      produces:
+        - application/json
+        - application/xml
+      responses:
+        200:
+          description: successful operation
+        404:
+          description: getting events failed
 
   /stop/workflow:
     post:
diff --git a/webapp/wmservices/src/main/java/org/apache/oodt/cas/wmservices/resources/WorkflowEventListResource.java b/webapp/wmservices/src/main/java/org/apache/oodt/cas/wmservices/resources/WorkflowEventListResource.java
new file mode 100644
index 0000000..9c24dff
--- /dev/null
+++ b/webapp/wmservices/src/main/java/org/apache/oodt/cas/wmservices/resources/WorkflowEventListResource.java
@@ -0,0 +1,31 @@
+package org.apache.oodt.cas.wmservices.resources;
+
+import org.apache.oodt.cas.workflow.structs.WorkflowInstancePage;
+
+import javax.xml.bind.annotation.*;
+import java.util.List;
+
+/**
+ * A JAX-RS resource representing a list of workflow events {@link List <String>}.
+ *
+ * @author pavinduLakshan (Pavindu Lakshan)
+ */
+@XmlRootElement(name = "workflowEvents")
+@XmlType(propOrder = {"eventList"})
+@XmlAccessorType(XmlAccessType.NONE)
+public class WorkflowEventListResource {
+    private List<String> eventList;
+
+    public WorkflowEventListResource(){
+
+    }
+
+    public WorkflowEventListResource(List<String> regEvents){
+        this.eventList = regEvents;
+    }
+
+    @XmlElement(name = "events")
+    public List<String> getEventList() {
+        return this.eventList;
+    }
+}
diff --git a/webapp/wmservices/src/main/java/org/apache/oodt/cas/wmservices/resources/WorkflowInstancePageResource.java b/webapp/wmservices/src/main/java/org/apache/oodt/cas/wmservices/resources/WorkflowInstancePageResource.java
index f47bac3..32a91fe 100644
--- a/webapp/wmservices/src/main/java/org/apache/oodt/cas/wmservices/resources/WorkflowInstancePageResource.java
+++ b/webapp/wmservices/src/main/java/org/apache/oodt/cas/wmservices/resources/WorkflowInstancePageResource.java
@@ -16,7 +16,7 @@
  * @author ngimhana (Nadeeshan Gimhana)
  */
 @XmlRootElement(name = "workflowPageInstance")
-@XmlType(propOrder = {"pageNum", "totalPages", "pageSize", "pageWorkflows"})
+@XmlType(propOrder = {"pageNum", "totalPages","totalWorkflowCount", "pageSize", "pageWorkflows"})
 @XmlAccessorType(XmlAccessType.NONE)
 public class WorkflowInstancePageResource {
 
@@ -24,6 +24,7 @@
   private int totalPages;
   private int pageSize;
   private List pageWorkflows;
+  private int totalWorkflowCount;
 
   /** Default constructor required by JAXB. */
   public WorkflowInstancePageResource() {}
@@ -33,11 +34,12 @@
    *
    * @param workflowInstancePage the workflowInstancePage associated with the resource
    */
-  public WorkflowInstancePageResource(WorkflowInstancePage workflowInstancePage) {
+  public WorkflowInstancePageResource(WorkflowInstancePage workflowInstancePage,int totalWorkflowCount) {
     this.pageNum = workflowInstancePage.getPageNum();
     this.totalPages = workflowInstancePage.getTotalPages();
     this.pageSize = workflowInstancePage.getPageSize();
     this.pageWorkflows = workflowInstancePage.getPageWorkflows();
+    this.totalWorkflowCount = totalWorkflowCount;
   }
 
   @XmlElement(name = "pageNum")
@@ -50,6 +52,11 @@
     return totalPages;
   }
 
+  @XmlElement(name = "totalCount")
+  public int getTotalWorkflowCount() {
+    return totalWorkflowCount;
+  }
+
   @XmlElement(name = "pageSize")
   public int getPageSize() {
     return pageSize;
diff --git a/webapp/wmservices/src/main/java/org/apache/oodt/cas/wmservices/resources/WorkflowInstanceResource.java b/webapp/wmservices/src/main/java/org/apache/oodt/cas/wmservices/resources/WorkflowInstanceResource.java
index 8d3e1b6..b6882a2 100755
--- a/webapp/wmservices/src/main/java/org/apache/oodt/cas/wmservices/resources/WorkflowInstanceResource.java
+++ b/webapp/wmservices/src/main/java/org/apache/oodt/cas/wmservices/resources/WorkflowInstanceResource.java
@@ -56,10 +56,12 @@
     this.workflowInstanceId = workflowInstance.getId();
     this.currentTaskId = workflowInstance.getCurrentTaskId();
     this.startDate = workflowInstance.getStartDate().toString();
-    this.endDate = workflowInstance.getEndDate().toString();
     this.timesBlocked = workflowInstance.getTimesBlocked();
     this.sharedContext = new MetadataResource(workflowInstance.getSharedContext());
     this.workflowState = new WorkflowStateResource(workflowInstance.getState());
+    if (workflowInstance.getEndDate() != null){
+      this.endDate = workflowInstance.getEndDate().toString();
+    }
   }
 
   @XmlElement(name = "workflowInstanceId")
diff --git a/webapp/wmservices/src/main/java/org/apache/oodt/cas/wmservices/services/WMJaxrsServiceV2.java b/webapp/wmservices/src/main/java/org/apache/oodt/cas/wmservices/services/WMJaxrsServiceV2.java
index 8fc78b5..400fbae 100644
--- a/webapp/wmservices/src/main/java/org/apache/oodt/cas/wmservices/services/WMJaxrsServiceV2.java
+++ b/webapp/wmservices/src/main/java/org/apache/oodt/cas/wmservices/services/WMJaxrsServiceV2.java
@@ -12,19 +12,20 @@
 import javax.ws.rs.core.MediaType;
 import javax.ws.rs.core.Response;
 import javax.ws.rs.core.Response.Status;
+import org.apache.oodt.cas.metadata.Metadata;
 import org.apache.oodt.cas.wmservices.enums.ErrorType;
 import org.apache.oodt.cas.wmservices.exceptions.InternalServerErrorException;
 import org.apache.oodt.cas.wmservices.exceptions.NotFoundException;
-import org.apache.oodt.cas.wmservices.resources.WMRequestStatusResource;
-import org.apache.oodt.cas.wmservices.resources.WorkflowInstancePageResource;
-import org.apache.oodt.cas.wmservices.resources.WorkflowInstanceResource;
-import org.apache.oodt.cas.wmservices.resources.WorkflowManagerStatus;
+import org.apache.oodt.cas.wmservices.resources.*;
 import org.apache.oodt.cas.workflow.exceptions.WorkflowException;
 import org.apache.oodt.cas.workflow.structs.WorkflowInstance;
 import org.apache.oodt.cas.workflow.structs.WorkflowInstancePage;
 import org.apache.oodt.cas.workflow.system.WorkflowManagerClient;
 import org.slf4j.LoggerFactory;
 
+import java.util.Collections;
+import java.util.List;
+
 /**
  * Service class for Proposing Apache OODT-2.0 WorkflowManager REST-APIs This handles HTTP requests
  * and returns workflow manager entities JAX-RS resources converted to different formats.
@@ -79,6 +80,47 @@
   }
 
   /**
+   * returns all registered events
+   *
+   * @return events
+   */
+  @GET
+  @Path("events")
+  @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
+  public WorkflowEventListResource getRegisteredEvents() {
+    try {
+      WorkflowManagerClient wmclient = getContextClient();
+      List events = wmclient.getRegisteredEvents();
+      WorkflowEventListResource eventResource = new WorkflowEventListResource(events);
+      return eventResource;
+    } catch (Exception e) {
+      logger.error("Error occurred when getting WM client", e);
+      throw new InternalServerErrorException("Unable to get WM client");
+    } 
+  }
+
+  /**
+   * trigger workflow by event
+   *
+   * @return isOk
+   */
+  @POST
+  @Path("event")
+  @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
+  public Response handleEvent(
+          @QueryParam("eventName") String eventName
+  ) throws Exception {
+    try {
+      WorkflowManagerClient wmclient = getContextClient();
+      wmclient.sendEvent(eventName, new Metadata());
+      return Response.ok(true,MediaType.TEXT_PLAIN).build();
+    } catch (WorkflowException e) {
+      logger.error("Error occurred when getting WM client", e);
+      throw new InternalServerErrorException("Unable to get WM client");
+    }
+  }
+
+  /**
    * Gets an HTTP response that represents a {@link WorkflowInstance} from the workflow manager.
    *
    * @param workflowInstId the ID of the workflow Instance
@@ -116,7 +158,8 @@
     try {
       WorkflowManagerClient wmclient = getContextClient();
       WorkflowInstancePage firstPage = wmclient.getFirstPage();
-      WorkflowInstancePageResource firstPageResource = new WorkflowInstancePageResource(firstPage);
+      int totalWorkflowCount = wmclient.getNumWorkflowInstances();
+      WorkflowInstancePageResource firstPageResource = new WorkflowInstancePageResource(firstPage,totalWorkflowCount);
       return firstPageResource;
     } catch (Exception e) {
       throw new NotFoundException(e.getMessage());
@@ -124,6 +167,30 @@
   }
 
   /**
+   * Gets an HTTP response that represents a {@link WorkflowInstancePage} from the workflow manager.
+   * Gives the specified Page of WorkFlow Instances
+   *
+   * @return an HTTP response that represents a {@link WorkflowInstancePage} from the workflow
+   *     manager
+   */
+  @GET
+  @Path("page")
+  @Produces({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON})
+  public WorkflowInstancePageResource getWorkflowPage(
+    @QueryParam("workflowPage") int pageNo
+  ) throws WebApplicationException {
+    try {
+      WorkflowManagerClient wmclient = getContextClient();
+      WorkflowInstancePage workflowPage = wmclient.paginateWorkflowInstances(pageNo);
+      int totalWorkflowCount = wmclient.getNumWorkflowInstances();
+      WorkflowInstancePageResource workflowPageResource = new WorkflowInstancePageResource(workflowPage,totalWorkflowCount);
+      return workflowPageResource;
+    } catch (Exception e) {
+      throw new NotFoundException(e.getMessage());
+    }
+  }
+
+  /**
    * This REST API stops a running {@link WorkflowInstance}.
    *
    * @param workflowInstanceId the ID of the workflow Instance
